短信验证码登录业务逻辑

发布时间:2026/9/10 6:21:42

短信验证码登录业务逻辑 校验账号是否存在 根据前端传过来的值查询数据库,查不到的时候直接抛出异常 提示手机号错误 返回给前端Redis 校验短袖验证码 拼接手机号对应的Redis 验证码缓存key读取缓存里存的验证码 读取缓存key 当没读取缓存时提示验证码过期报错 缓存读取到的验证码需要和用户输入的验证码保持一致 不一致提示验证码错误 。登录通过时生成token令牌 用求职责ID、手机号生成access_token短期访问令牌 refresh_token 刷新令牌打印日志记录两个token清扫缓存并返回信息 删除 Redis 你已使用过验证码 防止重复使用staticmethod async def login_by_mobile_code(login_request: LoginSmsCodeRequest): 1:判断手机号是否存在 2:redis中是否存在验证码并且一样,登录成功,生成token,删除redis中的验证码 3:不一样,登录失败 :return: jobseeker await JobSeeker.get_or_none(mobilelogin_request.mobile) if jobseeker is None: raise Exception(手机号不存在) key fboss-api:login:sms:{login_request.mobile} redis_code redis_client.get(key) if redis_code is None: raise Exception(验证码已过期) if redis_code ! login_request.code: raise Exception(验证码错误) 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}) redis_client.delete(key) return { jobseeker: jobseeker, access_token: access_token, refresh_token: refresh_token, }将求职责的头像和前端传来的图片转换成二进制调用阿里云存入到求职责的文件夹里面上传成功后判断执行结果 上传成功打印日志 把oss返回的图片生成一个链接赋值给用户头像最终返回上传资源信息 文件上传失败则抛出异常传过前端头像上传失败async def update_avatar(job_seeker_id: str, file:UploadFile): file_content await file.read() filename file.filename oss AliyunOSSTool() is_success, success_res oss.upload_single_file( file_content, filename, oss_pathjob_seeker_avatar/#里面填写阿里云的文件名称 ) if is_success: logger.info(上传成功) jobseeker await JobSeeker.get_or_none(id job_seeker_id) jobseeker.avatar success_res[access_url] await jobseeker.save() return success_res else: raise Exception(上传失败)该静态异步方法实现求职者短信验证码注册功能接收手机号、验证码、密码注册参数。首先读取 Redis 中该手机号缓存的验证码无缓存则提示验证码过期缓存与输入不一致则返回验证码错误接着查询数据库判断手机号是否已注册存在账号则提示直接登录。校验全部通过后自动创建求职者账号默认昵称由手机号后四位生成同时清除 Redis 内已使用的验证码。最后根据新用户 ID 与手机号生成访问令牌和刷新令牌直接返回注册成功提示与双 token用户完成注册后无需再次登录简化注册登录流程。staticmethod async def register(register_req: RegisterRequest): mobile register_req.mobile code register_req.code password register_req.password # 1.校验验证码 key fboss-api:login:sms:{mobile} redis_code await redis_client.get(key) if not redis_code: raise Exception(验证码已过期请重新获取) if redis_code ! code: raise Exception(验证码错误) # 2.校验手机号是否已注册 exist_user await JobSeeker.get_or_none(mobilemobile) if exist_user: raise Exception(该手机号已经注册直接登录) # 3.创建用户 new_user await JobSeeker.create( mobilemobile, passwordpassword, nicknamef用户{mobile[-4:]} ) # 删除验证码 await redis_client.delete(key) # 4.登录直接返回token access_token, refresh_token create_tokens(str(new_user.id), new_user.mobile) return { msg: 注册成功, access_token: access_token, refresh_token: refresh_token }密码重置功能实现分析该代码片段实现了一个基于手机验证码的密码重置功能属于静态异步方法。以下是核心逻辑分解参数接收与验证方法接收ResetPwdRequest类型的参数包含三个关键字段mobile reset_req.mobile # 手机号 code reset_req.code # 短信验证码 new_pwd reset_req.new_password # 新密码验证码校验流程从Redis获取存储的验证码进行比对key fboss-api:login:sms:{mobile} redis_code await redis_client.get(key) if not redis_code: raise Exception(验证码已过期请重新获取) if redis_code ! code: raise Exception(验证码错误)使用get_or_none方法避免未注册用户修改密码。密码更新操作更新用户对象密码字段并持久化user.password new_pwd await user.save() await redis_client.delete(key) # 清除已使用的验证码采用明文存储密码实际生产环境应使用哈希加密如bcrypt。安全增强建议密码加密存储# 使用密码哈希示例 from passlib.hash import bcrypt user.password bcrypt.hash(new_pwd)验证码时效控制 建议在Redis设置时添加过期时间如300秒避免手动清理await redis_client.setex(key, 300, code)异常处理优化 使用自定义异常类代替通用Exception提高代码可读性和可维护性。class MobileNotExistError(Exception): pass class PasswordError(Exception): pass密码安全增强 建议使用哈希加密存储和验证密码而不是明文比较。from passlib.context import CryptContext pwd_context CryptContext(schemes[bcrypt], deprecatedauto) # 密码验证改为 if not pwd_context.verify(login_mobile_request.password, jobseeker.password): raise PasswordError(密码错误)日志记录改进 建议将敏感信息如token进行脱敏处理后再记录。logger.info(f生成 access_token:{access_token[:5]}...) logger.info(f生成 refresh_token:{refresh_token[:5]}...)返回数据结构可以考虑使用Pydantic模型规范返回数据结构。class LoginResponse(BaseModel): jobseeker: JobSeeker access_token: str refresh_token: str完整优化版本staticmethod async def login_by_mobile_password(login_mobile_request: LoginMobileRequest): jobseeker await JobSeeker.get_or_none(mobilelogin_mobile_request.mobile) if jobseeker is None: raise MobileNotExistError(手机号不存在) if not pwd_context.verify(login_mobile_request.password, jobseeker.password): raise PasswordError(密码错误) access_token, refresh_token create_tokens(str(jobseeker.id), jobseeker.mobile) logger.info(f生成 access_token:{access_token[:5]}...) logger.info(f生成 refresh_token:{refresh_token[:5]}...) return LoginResponse( jobseekerjobseeker, access_tokenaccess_token, refresh_tokenrefresh_token )使用fileupload_router.post装饰器定义了一个POST请求的路由路径为/upload添加了summary上传文件作为接口的简要描述上传成功时记录日志并返回JSON响应{ code: 1, message: 上传成功, data: success_res }
延伸阅读

更多相关文章

2026/9/10 3:07:33

C++宏函数的定义

C宏函数的定义与使用 在C中,宏函数是通过预处理器实现的文本替换机制,使用#define指令定义。它会在编译前将代码中的宏调用直接替换为定义的文本。 基本语法 #define 宏名(参数列表) 替换文本示例:加法宏函数 #define ADD(a, b) ((a) (b)) …

2026/9/8 17:18:46

建筑动画:从方案可视化到城市展示的数字基建

一、什么是建筑动画? 建筑动画是通过三维技术模拟建筑空间及周边环境的动画影片类型,属于计算机生成动画范畴,基于建筑设计图纸构建虚拟场景,广泛应用于房地产宣传、工程投标、古建筑修复及城市规划领域。其核心价值在于&#xf…

2026/9/6 11:45:38

CSharp: Greedy Algorithm

项目结构:/*# encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ # 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎 # 描述: Algorithms # Author : geovindu,Geovin Du 涂聚文. # IDE : vs2026 …

2026/9/10 6:21:36

研发驱动AI落地:制造业智能转型的四步炼金术

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/10 6:21:36

4.5小时攻克单片机原理考试:聚焦51系列核心考点

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/10 6:21:36

全离散扩散建模:Intern Lumina U2 的 token 级生成范式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/10 6:21:36

鸿蒙版Flutter天气应用:Staggered Grid多城市卡片墙实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/10 6:16:35

CANN/GE单算子执行接口

aclopExecuteV2 【免费下载链接】ge GE(Graph Engine)是面向昇腾的图编译器和执行器,提供了计算图优化、多流并行、内存复用和模型下沉等技术手段,加速模型执行效率,减少模型内存占用。 GE 提供对 PyTorch、TensorFlow…

2026/9/9 13:11:35

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/8 7:15:15

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/9 16:31:09

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/10 0:00:55

目录对比去重实战:用哈希算法精准清理重复文件

我电脑里现在还有一块换了三次机的“数据墓地”硬盘,里面存着2016年以前所有旧笔记本的完整备份。平时不觉得有什么,直到前阵子想把它整理归档,发现同一个安装包、同一批照片、同一份论文草稿,在几个不同的备份目录里反复出现。更…

2026/9/10 0:00:55

Leaflet离线地图完整Demo合集:内网部署与坐标纠偏实战

简介:这是一份面向Web GIS开发者的LeafLet离线地图示例合集,帮助开发者快速掌握离线地图从搭建到交互的完整流程。压缩包共723个文件,大小14.06MB,以319个js脚本、175个html页面和29个css样式文件为主体,配合png/svg图…

2026/9/10 0:00:55

MATLAB读取Rinex 3.02观测文件:多系统GNSS数据解析实战

简介:基于MATLAB开发的Rinex3.02版观测文件(o文件)读取代码包,面向卫星定位导航方向的学习者与研究人员,用于解决新版观测文件的数据解析、历元提取与时间转换问题。压缩包共4个文件,包含两个m脚本、一个19…

2026/9/7 16:23:03

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/7 22:46:00

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/9 10:21:54

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码