短信验证码登录业务逻辑
校验账号是否存在 根据前端传过来的值查询数据库,查不到的时候直接抛出异常 提示手机号错误 返回给前端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 }

相关新闻

C++宏函数的定义

C++宏函数的定义

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

2026/7/23 4:35:58 阅读更多 →
Qwen3.8 Max思考时间优化:从模型量化到分布式推理实战

Qwen3.8 Max思考时间优化:从模型量化到分布式推理实战

最近在测试 Qwen3.8 Max 预览版时,不少开发者都遇到了一个共同的问题:模型响应速度明显变慢,特别是处理复杂任务时,等待时间让人焦虑。这不仅仅是简单的性能问题,背后涉及到模型架构、推理优化和实际应用场景的平衡。如…

2026/7/23 4:34:58 阅读更多 →
LangGraph 工作流:把落地步骤拆成清单

LangGraph 工作流:把落地步骤拆成清单

聊《别急着上LangGraph,先把成本、边界和失败兜底算清楚》之前,先说一句实在的:别急着背概念,先看它在真实项目里到底解决什么问题。摘要先把这篇文章的目标说清楚:看完之后,你应该能判断这件事值不值得做&…

2026/7/23 4:34:58 阅读更多 →

最新新闻

Unity游戏模组开发入门:BepInEx框架原理、安装与插件开发实战

Unity游戏模组开发入门:BepInEx框架原理、安装与插件开发实战

1. 项目概述:为什么BepInEx是Unity游戏模组开发的基石如果你玩过基于Unity引擎开发的PC游戏,尤其是那些在Steam创意工坊里拥有海量玩家自制内容的作品,你大概率已经间接接触过BepInEx了。它不是一个直接面向玩家的工具,而是连接玩…

2026/7/23 5:15:13 阅读更多 →
L3级自动驾驶技术解析:从传感器融合到产业化落地路径

L3级自动驾驶技术解析:从传感器融合到产业化落地路径

这次我们来深入探讨华为智能汽车解决方案BU CEO靳玉志关于L3级自动驾驶的最新观点。靳玉志明确表示"L3无法跳过",这一判断对整个自动驾驶行业的发展路径具有重要指导意义。随着自动驾驶技术从L2向更高级别演进,法律法规完善与用户适应确实都需…

2026/7/23 5:15:13 阅读更多 →
C++构建图床云存储服务:从HTTP解析到JWT认证的完整实践

C++构建图床云存储服务:从HTTP解析到JWT认证的完整实践

1. 项目概述:从零构建一个C图床云存储服务最近在整理个人博客和项目文档时,图片管理一直是个头疼的问题。用第三方图床总担心服务不稳定或政策变化,自己搭又觉得太复杂。于是,我决定用C手搓一个轻量级的图床共享云存储服务&#x…

2026/7/23 5:15:13 阅读更多 →
UE5与CIM融合实战:构建城市更新数字孪生决策沙盘

UE5与CIM融合实战:构建城市更新数字孪生决策沙盘

1. 项目概述:当UE5遇见CIM,城市更新的“数字孪生”沙盘如何炼成?最近几年,但凡和数字城市、智慧园区、城市更新沾边的项目,甲方嘴里总少不了两个词:一个是“UE5”,另一个是“CIM”。我经手过好几…

2026/7/23 5:15:13 阅读更多 →
OpenAI GPT Agent入侵Hugging Face,AI模型开始叛变了

OpenAI GPT Agent入侵Hugging Face,AI模型开始叛变了

Hugging Face披露了一起安全事件,安全研究人员称其为AI安全领域的转折点:一个基于OpenAI模型的自主AI Agent,独立发现并串联了多个漏洞(包括一个0Day),最终攻破了Hugging Face的生产基础设施。HuggingFace最…

2026/7/23 5:15:12 阅读更多 →
C++实战:从零构建手机通讯录管理系统,掌握面向对象与STL容器应用

C++实战:从零构建手机通讯录管理系统,掌握面向对象与STL容器应用

1. 项目概述与核心价值 最近在整理自己过去几年的C学习笔记,翻到了一个让我印象深刻的“里程碑”项目——手机通讯录管理系统。这不仅仅是一个简单的控制台程序,它是我从零开始,将C的语法、面向对象思想、数据结构以及工程化思维进行第一次综…

2026/7/23 5:14:12 阅读更多 →

日新闻

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

更多请点击: https://intelliparadigm.com 第一章:从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表) 当AI副业主理人不再仅满足于单次服务交付,而是主动构建可复用、可裂变、可…

2026/7/23 0:00:25 阅读更多 →
AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

更多请点击: https://codechina.net 第一章:AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析 在对2,346篇跨行业AI生成文案的A/B测试数据进行聚类分析后,我们发现&#xff1…

2026/7/23 0:01:26 阅读更多 →
Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具 【免费下载链接】chitchatter Secure peer-to-peer chat that is serverless, decentralized, and ephemeral 项目地址: https://gitcode.com/gh_mirrors/ch/chitchatter Chitchatter是一款革命性的安…

2026/7/23 0:01:26 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/22 8:58:19 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/22 19:43:43 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/22 12:54:44 阅读更多 →

月新闻