尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Boss招聘平台--求职者登录
一、分析实现功能需要实现以下功能账号密码登录手机号验证码登录发送验证码第三方登录-钉钉登录,绑定手机号, 识别同一个用户注册查询个人信息二、数据库设计t_job_seeker求职者表#字段名类型备注或者约束IDInt主键ID,自增手机号字符串唯一密码字符串头像字符串昵称字符串邮箱字符串微信号字符串创建时间日期时间修改时间日期时间from tortoise.models import Model from tortoise import fields class JobSeeker(Model): 求职者表 t_job_seeker # 主键ID自增 id fields.IntField(pkTrue, description主键ID,自增) # 手机号唯一 mobile fields.CharField(max_length20, uniqueTrue, description手机号) # 密码 password fields.CharField(max_length255,nullTrue, description密码) # 头像存储图片url avatar fields.CharField(max_length500, nullTrue, description头像地址) # 昵称 nickname fields.CharField(max_length100, nullTrue, description昵称) # 邮箱 email fields.CharField(max_length100, nullTrue, description邮箱) # 微信号 wechat fields.CharField(max_length100, nullTrue, description微信号) # 创建时间 create_time fields.DatetimeField(auto_now_addTrue, description创建时间) # 修改时间 update_time fields.DatetimeField(auto_nowTrue, description修改时间) class Meta: table t_job_seeker # 指定数据库表名 table_description 求职者表三、接口设计与开发下载依赖pip install python-jose创建工具类:app/utils/jwt_util.py。用于使用FastAPI生成Tokenfrom jose import jwt, JWTError from datetime import datetime, timedelta from typing import Optional, Tuple from app.config.settings import settings SECRET_KEY settings.secret_key ALGORITHM settings.ALGORITHM # 配置不同令牌的过期时间建议在settings中配置 ACCESS_TOKEN_EXPIRE_MINUTES settings.token_expire_minutes # 如30分钟 REFRESH_TOKEN_EXPIRE_DAYS settings.REFRESH_TOKEN_EXPIRE_DAYS # 如7天 # 1. 生成access_token和refresh_token def create_tokens(user_id: str, username: str) - Tuple[str, str]: 生成访问令牌和刷新令牌 :param user_id: 用户ID :param username: 用户名 :return: (access_token, refresh_token) # 构建公共载荷可根据需求扩展 common_payload { user_id: user_id, username: username, type: access # 标记令牌类型 } # 1. 生成access_token短期 access_payload common_payload.copy() access_payload[exp] datetime.utcnow() timedelta(minutesACCESS_TOKEN_EXPIRE_MINUTES) access_token jwt.encode(access_payload, SECRET_KEY, algorithmALGORITHM) # 2. 生成refresh_token长期 refresh_payload common_payload.copy() refresh_payload[type] refresh # 标记为刷新令牌 refresh_payload[exp] datetime.utcnow() timedelta(daysREFRESH_TOKEN_EXPIRE_DAYS) refresh_token jwt.encode(refresh_payload, SECRET_KEY, algorithmALGORITHM) return access_token, refresh_token # 2. 通用令牌验证区分令牌类型 def verify_token(token: str, token_type: str access) - Optional[dict]: 验证令牌并解析载荷 :param token: 令牌字符串 :param token_type: 期望的令牌类型access/refresh :return: 解析后的载荷验证失败返回None try: payload jwt.decode( token, SECRET_KEY, algorithms[ALGORITHM], options{verify_exp: True} # 强制校验过期时间 ) # 校验令牌类型 if payload.get(type) ! token_type: print(f验证失败令牌类型不是{token_type}) return None # 校验必要字段 if not all(key in payload for key in [user_id, username]): print(验证失败载荷缺少必要字段) return None return payload except JWTError as e: print(f验证失败{e}) return None # 3. 使用refresh_token刷新access_token def refresh_access_token(refresh_token: str) - Optional[str]: 通过有效的refresh_token生成新的access_token :param refresh_token: 刷新令牌 :return: 新的access_token刷新失败返回None # 先验证refresh_token的有效性 payload verify_token(refresh_token, token_typerefresh) if not payload: return None # 从refresh_token的载荷中提取用户信息生成新的access_token user_id payload[user_id] username payload[username] # 构建新的access_token载荷 access_payload { user_id: user_id, username: username, type: access, exp: datetime.utcnow() timedelta(minutesACCESS_TOKEN_EXPIRE_MINUTES) } new_access_token jwt.encode(access_payload, SECRET_KEY, algorithmALGORITHM) return new_access_token在service 调用一下:# 生成token access_token, refresh_token create_tokens(str(jobseeker.id), jobseeker.mobile) logger.info(f生成 access_token:{access_token}) logger.info(f生成 refresh_token:{refresh_token})创建工具类:app/utils/generate_code_util.生成手机号验证码 生成随机数的验证码,可以自定义位数 import random def get_random_code(length: int 4): code .join(random.choices(1324567890, klength)) return code创建app/apis/job_seeker_api.py。书写接口from fastapi import APIRouter, Header, Depends, UploadFile, File from app.core.depends import get_server_info from app.schemas.job_seeker import ( LoginMobileRequest, LoginSmsCodeRequest, RegisterRequest, ForgotPasswordRequest, ) from app.services.job_seeker import LoginMobileService, JobSeekerService from app.core.logging import logger job_seeker_router APIRouter(prefix/job_seeker, tags[用户管理]) job_seeker_router.post(/login, summary手机号登录) async def login_mobile(mobiles: LoginMobileRequest): res await LoginMobileService.login_mobile(mobiles) return {code: 1, msg: 登陆成功, data: res}创建app/services/job_seek.py。用于书写逻辑import redis from fastapi import UploadFile from app.core.depends import get_server_info from app.models import JobSeeker from app.schemas.job_seeker import ( LoginMobileRequest, LoginSmsCodeRequest, RegisterRequest, ForgotPasswordRequest, ) from app.utils.generate_code_util import get_random_code from app.utils.jwt_util import create_tokens from app.core.logging import logger from app.utils.oss_util import AliyunOSSTool redis_client redis.Redis(host127.0.0.1, port6379, db9, decode_responsesTrue) class LoginMobileService: staticmethod async def login_mobile(mobiles: LoginMobileRequest): jobseeker await JobSeeker.get_or_none(mobilemobiles.mobile) if jobseeker is None: raise Exception(用户不存在) if jobseeker.password ! mobiles.password: raise Exception(密码错误) # 生成token access_token, refresh_token create_tokens(str(jobseeker.id), jobseeker.mobile) logger.info(faccess_token: {access_token}) logger.info(frefresh_token: {refresh_token}) return {jobseeker: jobseeker, access_token: access_token, refresh_token: refresh_token}创建app/schemas.py.。 创建请求体。from pydantic import BaseModel, Field class LoginMobileRequest(BaseModel): mobile: str Field(..., description手机号) password: str Field(..., description密码)四、总结这套 FastAPI TortoiseORM 技术栈上手简单。实现简单的手机号登录。
RELATED

相关推荐

AI写作工具如何提升学术论文创作效率

AI写作工具如何提升学术论文创作效率

1. 为什么AI写作工具能减轻创作压力?作为一名在学术圈摸爬滚打十年的研究者,我深刻理解论文写作过程中的痛苦。从开题报告到期刊投稿,每个环节都伴随着巨大的心理压力。直到去年接触了千笔这款AI写作工具,我的写作效率提升了近三倍…

📅 2026/8/23 9:19:21
GPT-5.6为什么更适合先做分析?直接写代码反而容易返工

GPT-5.6为什么更适合先做分析?直接写代码反而容易返工

摘要: GPT-5.6具备较强的复杂推理和代码处理能力,但项目任务并不是越快生成代码越好。本文从需求理解、修改范围、技术方案、任务拆分和验收检查5个方面,讲清为什么先分析再实现更稳。使用GPT-5.6或Codex写代码时,很多人的第一句话…

📅 2026/8/23 9:19:22
Kimi K3模型思维链95.5%为英文:跨语言推理机制解析

Kimi K3模型思维链95.5%为英文:跨语言推理机制解析

这次我们来看一个关于 Kimi K3 模型的有趣发现:在中文请求下,其思维链(Chain of Thought, CoT)有 95.5% 的内容是英文。这个现象不仅揭示了当前大语言模型(LLMs)在处理跨语言推理任务时的内部工作机制&…

📅 2026/8/23 9:19:22
MORE NEWS

更多资讯

📰

react-admin 表单数据防丢失:`<AutoPersistInStoreBase>` 自动保存组件原理与实战指南

前端UI组件 【免费下载链接】react-admin A frontend Framework for single-page applications on top of REST/GraphQL APIs, using TypeScript, React and Material Design 项目地址: https://gitcode.com/gh_mirrors/re/react-admin 点击查看 免费下载 是 react…

📰

在 VSCode 上如何修改 json 配置文件,从而构建调试 C/C++ 项目

本文介绍如何通过更改配置文件,从而在 VSCode 上构建调试 C/C 项目。 能够解决的一些问题:头文件未包含而导致的未定义;头文件未能被识别而显示的提示错误等问题。 一、基本设置 vscode 上调试构建 c/cpp 项目都是基于这个拓展包,…

📰

Flet v0.24.0 版本发布详解:新控件、破坏性变更与迁移指南

Flet v0.24.0 版本发布详解:新控件、破坏性变更与迁移指南 【免费下载链接】flet Build realtime web, mobile and desktop apps in Python only. No frontend experience required. 项目地址: https://gitcode.com/gh_mirrors/fl/flet Flet 0.24.0 是一次功…

📰

5个APM飞控避坑指南:解决配置卡半天的最佳实践

5个APM飞控避坑指南:解决配置卡半天的最佳实践 配环境配了三天,报错日志翻了几十页,APM飞控的部署依然卡在初始化阶段。这种“配置环境就卡半天”的折磨,是无数无人机开发者噩梦的开始。其实,问题往往不出在代码逻辑,而藏在那些被忽略的依赖关系…

📰

Sanic Extensions 后台日志记录器(Background Logger)实战指南:配置、原理与性能优化

Sanic Extensions 后台日志记录器(Background Logger)实战指南:配置、原理与性能优化 【免费下载链接】sanic Accelerate your web app development | Build fast. Run fast. 项目地址: https://gitcode.com/gh_mirrors/sa/sanic San…

📰

手写实现电脑屏幕密码怎么设置:从卡顿到丝滑的底层优化实战

手写实现电脑屏幕密码怎么设置:从卡顿到丝滑的底层优化实战 报错一堆看不懂 StackTrace,调试器一打开全是红色,屏幕密码设置界面卡得跟PPT一样。别急着骂系统,这往往是底层锁机制或内存分配在作祟。今天咱们不聊虚的,直接上手 手写实现…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬