FastAPI + TortoiseORM 轻量化注册功能实战
完整注册业务链路注册功能采用标准的手机号验证码流程验证码获取阶段前端传入手机号后端校验手机号未注册生成 6 位数字验证码存入 Redis 并设置 2 分钟有效期验证码校验阶段前端提交手机号与验证码后端读取 Redis 缓存完成验证码有效性校验账号创建阶段校验通过后接收用户设置的密码通过 Tortoise-ORM 完成用户数据入库生成 JWT 登录令牌返回前端核心功能轻量化实现本项目聚焦手机号验证码注册核心流程仅保留必需字段与逻辑✅ 手机号验证码注册✅ JWT 令牌生成✅ Redis 缓存验证码❌ 去除头像、邮箱等非核心字段❌ 去除第三方登录等复杂业务fromcontextlibimportasynccontextmanagerfromfastapiimportFastAPI,QueryfrompydanticimportBaseModelfromtortoiseimportTortoise,fieldsfromtortoise.modelsimportModelimportredisimportrandomfromdatetimeimportdatetime,timedeltafromjoseimportjwt# 全局基础配置 # MySQL数据库连接地址根据本地数据库账号密码自行修改MYSQL_URLmysql://root:root127.0.0.1:3306/simple_boss# Redis客户端初始化用于存储短信验证码redis_clientredis.Redis(host127.0.0.1,port6379,db0,decode_responsesTrue)# JWT加密密钥线上项目需更换为复杂随机字符串SECRET_KEYregister-system-secret-key-2026# Tortoise-ORM 数据库模型 classJobUser(Model):求职者用户数据表存储注册账号基础信息idfields.IntField(pkTrue,description用户唯一主键ID)mobilefields.CharField(max_length11,uniqueTrue,description11位手机号全局唯一不可重复)passwordfields.CharField(max_length20,description账号登录密码)create_timefields.DatetimeField(auto_now_addTrue,description账号注册创建时间)classMeta:tablejob_usertable_description求职者注册账号表# Pydantic 请求参数校验模型 # 验证码校验入参模型classCheckCodeReq(BaseModel):mobile:strcode:str# 账号注册提交入参模型classRegisterReq(BaseModel):mobile:strcode:strpassword:str# 通用工具函数 defcreate_sms_code()-str:生成6位纯数字短信验证码return.join(random.choices(0123456789,k6))defcreate_login_token(user_id:int,mobile:str):根据用户ID、手机号生成有效期2小时的JWT登录令牌expire_timedatetime.utcnow()timedelta(hours2)payload{sub:user_id,mobile:mobile,exp:expire_time}tokenjwt.encode(payload,SECRET_KEY,algorithmHS256)returntoken# 业务服务层注册核心业务逻辑 classRegisterService:staticmethodasyncdefsend_register_code(mobile:str): 下发注册场景短信验证码 业务逻辑校验手机号未注册 → 生成验证码 → Redis缓存存储2分钟 # 查询数据库校验手机号是否已完成注册exist_userawaitJobUser.get_or_none(mobilemobile)ifexist_user:raiseException(该手机号已注册账号请直接登录)# 生成6位验证码并存入Rediscodecreate_sms_code()redis_cache_keyfregister_code:{mobile}redis_client.set(redis_cache_key,code,ex120)# 本地调试打印验证码线上项目替换为真实短信服务商接口print(f【注册验证码】手机号{mobile}验证码{code})returnTruestaticmethodasyncdefverify_sms_code(mobile:str,code:str):校验注册场景短信验证码有效性redis_cache_keyfregister_code:{mobile}real_cache_coderedis_client.get(redis_cache_key)ifnotreal_cache_code:raiseException(验证码已过期请重新获取)ifreal_cache_code!code:raiseException(输入的验证码与下发验证码不一致)returnTruestaticmethodasyncdefregister_account(mobile:str,code:str,password:str): 完成账号注册全流程 1. 二次校验验证码有效性 2. 校验手机号不存在防止并发重复注册 3. ORM写入数据库创建用户 4. 清除Redis缓存验证码生成登录令牌 # 第一步校验验证码有效awaitRegisterService.verify_sms_code(mobile,code)# 第二步二次校验手机号规避并发重复注册问题exist_userawaitJobUser.get_or_none(mobilemobile)ifexist_user:raiseException(该手机号已注册账号无法重复注册)# 第三步Tortoise-ORM完成用户数据入库new_userawaitJobUser.create(mobilemobile,passwordpassword)# 第四步清除Redis中已使用的验证码避免复用redis_client.delete(fregister_code:{mobile})# 第五步生成登录令牌返回前端login_tokencreate_login_token(new_user.id,mobile)return{login_token:login_token,user_id:new_user.id,mobile:mobile}# 项目生命周期管理数据库初始化与释放 asynccontextmanagerasyncdeflifespan(app:FastAPI):# 项目启动时初始化数据库连接自动生成数据表awaitTortoise.init(db_urlMYSQL_URL,modules{models:[__main__]})awaitTortoise.generate_schemas()yield# 项目关闭时断开数据库连接释放资源awaitTortoise.close_connections()# 接口路由层对外暴露HTTP接口 appFastAPI(title轻量化注册系统,lifespanlifespan)app.get(/)asyncdefroot():return{message:轻量化注册系统已启动}app.get(/api/register/send-code)asyncdefsend_register_code(mobile:strQuery(...,min_length11,max_length11)): 发送注册验证码接口 - 参数mobile (11位手机号) - 返回发送结果 try:awaitRegisterService.send_register_code(mobile)return{code:200,message:验证码发送成功,data:None}exceptExceptionase:return{code:400,message:str(e),data:None}app.post(/api/register/verify-code)asyncdefverify_register_code(req:CheckCodeReq): 验证码校验接口 - 参数mobile, code - 返回校验结果 try:awaitRegisterService.verify_sms_code(req.mobile,req.code)return{code:200,message:验证码校验成功,data:None}exceptExceptionase:return{code:400,message:str(e),data:None}app.post(/api/register/submit)asyncdefsubmit_register(req:RegisterReq): 提交注册信息接口 - 参数mobile, code, password - 返回注册结果及登录令牌 try:resultawaitRegisterService.register_account(req.mobile,req.code,req.password)return{code:200,message:注册成功,data:result}exceptExceptionase:return{code:400,message:str(e),data:None}

相关新闻

TMS320C672x DSP I2C总线驱动开发:从寄存器配置到硬件设计实践

TMS320C672x DSP I2C总线驱动开发:从寄存器配置到硬件设计实践

1. 项目概述与I2C总线核心价值在嵌入式系统开发,尤其是像TMS320C672x这类高性能浮点DSP的应用中,如何高效、可靠地连接和管理外围芯片是一个永恒的课题。你可能需要连接一个EEPROM来存储配置参数,或者驱动一个音频编解码器(CODEC&…

2026/7/27 4:58:20 阅读更多 →
机器学习损失函数的局限性与工程实践应对策略

机器学习损失函数的局限性与工程实践应对策略

1. 损失函数的本质与局限性 损失函数(Loss Function)是机器学习模型训练过程中最核心的组件之一,它的主要作用是量化模型预测值与真实值之间的差异,并通过优化算法(如梯度下降)来调整模型参数。在传统机器学…

2026/7/27 4:58:20 阅读更多 →
FinBERT金融情感分析实战:从模型部署到交易策略

FinBERT金融情感分析实战:从模型部署到交易策略

1. 项目概述:当金融遇上自然语言处理三年前我在量化基金实习时,基金经理每天开盘前总要花两小时阅读上百条财经新闻。有天他突然问我:"能不能让AI帮我们判断这些新闻是利好还是利空?"这个问题直接催生了这个实战项目——…

2026/7/27 4:57:19 阅读更多 →

最新新闻

TMS320C54x DSP时钟配置实战:PLL原理、CLKMD寄存器详解与避坑指南

TMS320C54x DSP时钟配置实战:PLL原理、CLKMD寄存器详解与避坑指南

1. 项目概述与核心价值在嵌入式DSP系统开发中,时钟配置往往是项目启动的第一步,也是最容易踩坑的一步。我接触TMS320C54x系列DSP已经超过十年,从早期的C541到后来的VC549都用过,可以说,一个稳定、高效的时钟系统是整个…

2026/7/27 5:06:23 阅读更多 →
生命涌现的小龙虾技能之【Outdoor Sports Event Risk Analysis Tool | 户外体育赛事风险分析工具】简介

生命涌现的小龙虾技能之【Outdoor Sports Event Risk Analysis Tool | 户外体育赛事风险分析工具】简介

🏃 Outdoor Sports Event Risk Analysis Tool | 户外体育赛事风险分析工具 智能分析中枢 图片/视频智能分析 结构化报告 历史报告云端查询 🧭 技能概览 | Overview 模块内容🏷️ 技能名称户外体育赛事风险分析工具🎯 核心目标…

2026/7/27 5:06:23 阅读更多 →
专业场景下AI提示词设计与工程化实践

专业场景下AI提示词设计与工程化实践

1. 专业场景下AI应用的本质思考作为一名长期与AI打交道的技术从业者,我越来越清晰地认识到:在专业工作场景中,我们需要的不是能陪你闲聊的AI伙伴,而是一个能精准执行任务的"工具人"。这就像在软件开发中,我们…

2026/7/27 5:06:23 阅读更多 →
Sitara AM2x嵌入式调试实战:从多核协同到Data Abort异常深度解析

Sitara AM2x嵌入式调试实战:从多核协同到Data Abort异常深度解析

1. 项目概述在嵌入式开发的深水区,尤其是面对像德州仪器Sitara AM2x这类集成了高性能Arm Cortex-R5F和Cortex-M4F核心的复杂微控制器时,调试不再是简单的“printf大法”就能应付的。当你的代码在实时控制循环中跑飞,或者多核之间出现诡异的同…

2026/7/27 5:06:23 阅读更多 →
flutter使用getx实现主题色切换

flutter使用getx实现主题色切换

第一步实现 我们先封装好 themeController进行控制import package:flutter/material.dart; import package:get/get.dart;class ThemeController extends GetxController {// 主题模式:system / light / darkfinal _themeMode ThemeMode.system.obs;ThemeMode get …

2026/7/27 5:06:23 阅读更多 →
专科生AI写作工具实测:千笔写作与学术猹对比

专科生AI写作工具实测:千笔写作与学术猹对比

1. 项目背景与工具定位作为一名长期关注AI辅助写作工具的教育科技从业者,最近在职业教育领域发现了个有趣现象:专科层次的学生群体对AI论文写作工具存在强烈需求,但市面上主流产品往往面向硕博群体设计。这次我选取了两款宣称"专科生友好…

2026/7/27 5:05:23 阅读更多 →

日新闻

【JAVA毕设源码分享】基于SpringBoot的社区智能垃圾管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

【JAVA毕设源码分享】基于SpringBoot的社区智能垃圾管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/27 0:00:54 阅读更多 →
SPI实战指南:从时钟模式到寄存器配置,解决嵌入式通信难题

SPI实战指南:从时钟模式到寄存器配置,解决嵌入式通信难题

1. 项目概述:从寄存器手册到实战指南 如果你手头有一份类似德州仪器(TI)TMS320x240xA系列DSP的SPI模块技术手册,看着里面密密麻麻的寄存器位定义、时序图和公式,是不是感觉头大?这份资料虽然权威&#xff0…

2026/7/27 0:00:54 阅读更多 →
【JAVA毕设源码分享】基于springboot的水果购物管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

【JAVA毕设源码分享】基于springboot的水果购物管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/27 0:00:54 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/27 4:33:59 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/26 0:00:31 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/27 4:01:12 阅读更多 →

月新闻