Java 项目实战: 交友项目:登录链路回顾与今日任务地图
概述之前搭好了工程骨架并跑通了验证码登录这条完整链路今天要做的是在这条链路之上把用户资料补齐——文件存储、人脸识别、资料保存与头像上传外加两项横切优化统一 token 处理、统一异常处理。本文以回顾之前为主线把第一天的登录链路完整串一遍说清每个环节沉淀了什么可复用的东西再看它们如何被今天的任务逐一复用。纲要之前做了什么五个必须掌握的知识点回顾登录链路时序短信验证码 → Redis 校验 → Dubbo 查库/自动注册 → JWT 颁发 token每个环节沉淀的可复用产出自动装配套路、Dubbo 服务三件套、JWT 工具、BasePojo 自动填充这些地基今天怎么被复用对照表现在要做什么五个板块一句话预告将来结束时工程新增了哪些类实际工程结构学习建议与常见误解澄清之前做了什么之前的知识点不算多但每一个都直接决定了今天怎么写代码。先把五个点摆出来知识点关键内容落地的代码前后端分离开发思想前后端只通过 API 接口约定交互接口传 JSON 数据接口文档YApi驱动开发工程结构与调用过程客户端请求进mf-app-server内部以 Dubbo 形式构建微服务7 个 Maven 模块的聚合工程公共组件抽取借助 SpringBoot 自动装配把发短信抽成公共组件跨模块复用mf-autoconfig模块 SmsTemplateJWT 鉴权思想登录成功颁发 token其余接口校验 tokenJwtUtils工具类用户登录两步走获取登录验证码、用验证码完成登录校验LoginControllerUserService光看表格还不够这些点在登录链路里是连成一条线的。登录链路时序MySQLUserApi (Dubbo)RedisSmsTemplateUserServiceLoginController客户端(APP)MySQLUserApi (Dubbo)RedisSmsTemplateUserServiceLoginController客户端(APP)alt[用户不存在首次登录]POST /user/login (mobile)sendCode(mobile)生成随机验证码sendSms(mobile, code)下发短信SET CHECK_CODE_{mobile} codePOST /user/loginVerification (mobile, code)login(mobile, code)GET CHECK_CODE_{mobile} 并比对DEL 验证码一次性使用findByMobile(mobile)select * from tb_usersave(user) 自动注册isNew trueJwtUtils.getToken(id, mobile)token isNew两个分支值得留意验证码校验失败直接抛异常结束校验通过后findByMobile返回null时走自动注册分支isNewtrue会传给前端客户端据此跳转完善信息页——这正是今天 day02 的入口场景。每个环节产出了什么可复用的东西回顾的目的不是背流程而是认出昨天留下的套路。之前真正值钱的是四套可复用的模式。自动装配套路SmsTemplate 四件套。发短信这种第三方能力被抽成公共组件靠的是 SpringBoot 自动装配的标准四件套spring.factories声明、自动装配类、属性配置类、模板对象。业务模块只注入SmsTemplate就能用不感知 AccessKey、签名、模板编号这些细节。packagecom.mf.autoconfig;importcom.mf.autoconfig.properties.SmsProperties;importcom.mf.autoconfig.template.SmsTemplate;importorg.springframework.boot.context.properties.EnableConfigurationProperties;importorg.springframework.context.annotation.Bean;EnableConfigurationProperties({SmsProperties.class})publicclassmfAutoConfiguration{BeanpublicSmsTemplatesmsTemplate(SmsPropertiessmsProperties){returnnewSmsTemplate(smsProperties);}}packagecom.mf.autoconfig.properties;importlombok.Data;importorg.springframework.boot.context.properties.ConfigurationProperties;DataConfigurationProperties(prefixmf.sms)publicclassSmsProperties{privateStringsignName;privateStringtemplateCode;privateStringaccessKey;privateStringsecret;}配套的/META-INF/spring.factories只有两行org.springframework.boot.autoconfigure.EnableAutoConfiguration\ com.mf.autoconfig.mfAutoConfigurationDubbo 服务三件套。任何一类数据要跨服务访问都是同一套动作mf-model里定义实体mf-dubbo-interface里定义 Api 接口mf-dubbo-db里用DubboService给出实现并注入 Mapper。昨天为User建了UserApi/UserApiImpl/UserMapper这三件UserApiImpl的实现短到只有几行——因为 MyBatis-Plus 的BaseMapper把 SQL 都包了。JWT 工具与 ErrorResult。JwtUtils提供三个静态方法getToken签发写入 id/mobile1 小时有效期、getClaims解析、verifyToken校验有效性异常一律返回 false。错误响应则统一走ErrorResult用静态工厂方法枚举各类错误loginError、faceError……错误码字符串约定成俗。BasePojo 与自动填充。所有实体的created/updated字段抽进BasePojo基类配合 MyBatis-Plus 的MetaObjectHandler在插入和更新时自动填充时间业务代码从此不用手动 setpackagecom.mf.dubbo.server.handler;importcom.baomidou.mybatisplus.core.handlers.MetaObjectHandler;importorg.apache.ibatis.reflection.MetaObject;importorg.springframework.stereotype.Component;importjava.util.Date;ComponentpublicclassMyMetaObjectHandlerimplementsMetaObjectHandler{OverridepublicvoidinsertFill(MetaObjectmetaObject){ObjectcreatedgetFieldValByName(created,metaObject);if(nullcreated){//字段为空可以进行填充setFieldValByName(created,newDate(),metaObject);}ObjectupdatedgetFieldValByName(updated,metaObject);if(nullupdated){//字段为空可以进行填充setFieldValByName(updated,newDate(),metaObject);}}OverridepublicvoidupdateFill(MetaObjectmetaObject){setFieldValByName(updated,newDate(),metaObject);}}这些地基今天怎么被复用这是本文最想让你带走的一张表。现在的每个板块都不是从零开始而是把昨天的套路原样再用一遍之前的产出现在怎么用自动装配套路spring.factories Properties Template 四件套照此封装OssTemplate阿里云 OSS 文件存储和AipFaceTemplate百度人脸识别mfAutoConfiguration里各加一个BeanDubbo 服务三件套Api 接口 / DubboService 实现 / Mapper为用户资料域新增UserInfoApi/UserInfoApiImpl/UserInfoMapper动作和昨天的UserApi一模一样拦截器 ThreadLocal 雏形JwtUtils.verifyToken 已能校验 token今天把它正式成型TokenInterceptor统一鉴权 UserHolder存取当前用户各控制器不再重复解析 tokenJWT 工具token 里存了 id、mobile查询/更新资料时直接从 token 取当前用户 id作为tb_user_info的主键来源BasePojo 自动填充UserInfo实体继承BasePojo创建/更新时间零代码维护ErrorResult 错误码约定今天升级为BusinessExceptionRestControllerAdvice的统一异常处理同一套自动装配模式一天之内会写两遍OSS、人脸这不是重复劳动而是在验证套路的通用性——这也是导引篇想强调的今天每一块都站在昨天的地基上。现在要做什么内容比昨天多五个板块各一句话板块一句话概括完善用户信息新用户首次登录后强制完善详细资料并上传头像涉及阿里云 OSS、百度人脸识别两个第三方组件的接入与模板抽取用户信息管理用户资料的查询与更新修改手机号、所在地等本质是对tb_user_info的增删改查统一 token 处理用拦截器 ThreadLocal 消灭每个接口里重复的 token 解析与校验代码统一异常处理用RestControllerAdvice把散落各处的 try-catch 收拢到一处这里只做导引不展开实现细节——每个板块的接口文档、执行流程、代码步骤与验收标准见同目录的《完善用户信息-业务概述》那里是 现在的开工任务书。将来结束时工程长什么样以实际工程快照为准相对 之前 新增的类如下标注新增mf ├── mf-app-server │ └── src/main/java/com/mf/server │ ├── AppServerApplication.java │ ├── controller │ │ ├── LoginController.java │ │ ├── UserController.java # 新增保存资料/上传头像 │ │ └── UsersControler.java # 新增资料查询/更新 │ ├── exception │ │ ├── BusinessException.java # 新增业务异常对象 │ │ └── ExceptionAdvice.java # 新增统一异常处理 │ ├── interceptor │ │ ├── TokenInterceptor.java # 新增统一鉴权拦截器 │ │ ├── UserHolder.java # 新增ThreadLocal 工具类 │ │ └── WebConfig.java # 新增注册拦截器 │ └── service │ ├── UserService.java │ └── UserInfoService.java # 新增 ├── mf-autoconfig │ └── src/main/java/com/mf/autoconfig │ ├── mfAutoConfiguration.java # 修改注册 Oss/AipFace 两个 Bean │ ├── properties │ │ ├── SmsProperties.java │ │ ├── OssProperties.java # 新增 │ │ └── AipFaceProperties.java # 新增 │ └── template │ ├── SmsTemplate.java │ ├── OssTemplate.java # 新增 │ └── AipFaceTemplate.java # 新增 ├── mf-commons │ └── .../utils/JwtUtils.java ├── mf-model │ └── src/main/java/com/mf/model │ ├── domain │ │ ├── BasePojo.java │ │ ├── User.java │ │ └── UserInfo.java # 新增用户资料实体 │ └── vo │ ├── ErrorResult.java │ └── UserInfoVo.java # 新增资料返回值对象 └── mf-dubbo ├── mf-dubbo-interface │ └── .../api │ ├── UserApi.java │ └── UserInfoApi.java # 新增 └── mf-dubbo-db └── src/main/java/com/mf/dubbo ├── api │ ├── UserApiImpl.java │ └── UserInfoApiImpl.java # 新增 ├── handler/MyMetaObjectHandler.java └── mappers ├── UserMapper.java └── UserInfoMapper.java # 新增一天下来新增约 15 个类但拆开看几乎没有新模式OssTemplate/AipFaceTemplate是 SmsTemplate 的翻版UserInfoApi三件套是UserApi的翻版真正的新东西只有拦截器 ThreadLocal 和RestControllerAdvice这两处。学习建议昨天的自动装配套路今天会原样复用两次OSS、人脸建议边写边对比同一套路在不同能力上的差异属性项不同OSS 是 endpoint/bucket/accessKey人脸是 appId/apiKey/secretKey、模板方法不同上传 vs 检测骨架却完全一致。能在差异中认出共性这套模式才算真正学会。今天有两个安全主题——统一鉴权与统一异常处理别急着抄代码先理解动机鉴权统一是为了消灭N 个接口各写一遍 token 解析的重复异常统一是为了让ErrorResult的约定不再依赖每个人自觉 try-catch。动机清楚了TokenInterceptor和ExceptionAdvice的写法都是自然推导。UserHolder用完要remove()。线程池里的线程是复用的ThreadLocal 不清理上一个请求的用户信息会串到下一个请求——这是这套方案最经典的坑。常见误解澄清误解实际情况JWT 是加密payload 看不懂JWT 只做签名防篡改payload 部分A.B.C 中的 BBase64 解码即可读。所以 token 里只放 id、mobile 这类非敏感字段绝不能放密码首次登录自动注册 用户点了注册按钮没有注册页。验证码校验通过后findByMobile查不到用户就落库一条passwordmd5(123456)的记录isNewtrue由前端引导去完善资料自动装配只是课上为了发短信做的特殊处理spring.factories ConfigurationProperties 模板对象是编写 starter 的标准做法今天接 OSS 和人脸识别时原样复用属于全项目通用的基础设施模式拦截器和过滤器是一回事两者都能前置/后置处理请求但拦截器是 SpringMVC 的机制能拿到 handler 信息、依赖 Spring 容器配合 ThreadLocal 做登录校验更顺手过滤器工作在 Servlet 层粒度更粗总结之前 表面只交付了一个登录功能实际沉淀了四套可复用模式自动装配四件套、Dubbo 服务三件套、JWT 工具、BasePojo 自动填充。现在 的五个板块全部建立在这些地基上——OSS 与人脸识别是装配套路的第二次、第三次落地UserInfoApi是 Dubbo 三件套的复制统一 token 处理则把昨天登录成功颁发 token的下半句其余接口校验 token补齐成型。带着昨天怎么做的去读今天每个板块代码会好懂很多实现层面的任务拆解与验收标准直接翻《完善用户信息-业务概述》。

相关新闻

Swift iOS语音识别实战:Speech框架实时转文字与文件转写指南

Swift iOS语音识别实战:Speech框架实时转文字与文件转写指南

语音识别在 iOS 上做起来,其实没有想象中那么玄乎。用 Swift 接系统自带的 Speech 框架,一个实时转文字的 Demo 快的话半天就能跑通。我最早接触这个需求,是给某内部工具加一个“语音口述记录”的入口。当时也纠结过要不要接第三方语音服务&a…

2026/10/18 6:46:54 阅读更多 →
哈工大计网实验1-6完整工程包:GBN/HTTP代理/Wireshark/Packet Tracer实战

哈工大计网实验1-6完整工程包:GBN/HTTP代理/Wireshark/Packet Tracer实战

简介:本资源是哈尔滨工业大学计算机网络课程配套的全套实验材料,面向高校计算机及相关专业本科生,覆盖网络协议原理理解、服务端开发与抓包分析等核心实践能力训练。内容完整包含6个经典实验:HTTP代理服务器设计、HTTP分组收发与转…

2026/10/18 6:45:54 阅读更多 →
NodeJS二手书籍交易平台:从数据模型到部署的完整毕设实战指南

NodeJS二手书籍交易平台:从数据模型到部署的完整毕设实战指南

二手书交易平台这种题目,算是计算机毕业设计里长盛不衰的经典款。每年都有大量同学选它,因为场景足够贴近生活,功能拆解起来也清楚,难易度刚好在一个“认真做完能学到东西,但不会做不出来”的位置上。如果你拿到的题名…

2026/10/18 6:45:54 阅读更多 →

最新新闻

三则AI新闻揭示应用临界点:轻量模型、免费旗舰与团队回迁

三则AI新闻揭示应用临界点:轻量模型、免费旗舰与团队回迁

10月8日早上,我的朋友圈和几个技术群几乎同时被三则AI新闻刷屏:一家主流模型厂商发布了新的轻量快速模型H 5.5,另一家巨头把第六代旗舰模型向普通用户免费开放,还有一个此前把部分团队搬到外地的智能体产品团队,宣布要…

2026/10/18 23:39:35 阅读更多 →
语言模型中的语法伪相关:模型为何学错教训?

语言模型中的语法伪相关:模型为何学错教训?

看到标题里的“Syntactic-Domain Spurious Correlations”,我第一反应是想起自己踩过的一个坑:训练文本蕴含模型时,验证集上“矛盾”标签的准确率一路飙升到95%以上,当时我还以为模型真的学会了推理。结果我把一个用规则改写出来的…

2026/10/18 23:39:35 阅读更多 →
恒星级AI时代:AI短剧生产管线与数字分身序章

恒星级AI时代:AI短剧生产管线与数字分身序章

1. 从“恒星级AI”说起:这个标题到底在讲什么“恒星级AI时代降临”这个说法,第一次看到的时候我愣了一下。恒星级的能量量级是什么概念?太阳每秒释放的能量大约是3.8乘以10的26次方瓦,人类目前全球总发电功率大概在3乘10的12次方瓦…

2026/10/18 23:39:35 阅读更多 →
OpenSpec:规范优先开发的工程实践与CI/npm落地指南

OpenSpec:规范优先开发的工程实践与CI/npm落地指南

1. OpenSpec 是什么:一个被低估的规范优先开发实践工具链OpenSpec 不是一个 npm 包名,也不是某个具体开源项目的代号——它是一套正在快速成型的、以机器可读规范(Spec)为唯一事实源(Single Source of Truth&#xff0…

2026/10/18 23:38:35 阅读更多 →
空间复用与数据对齐实战:内存池、缓存行与SIMD优化指南

空间复用与数据对齐实战:内存池、缓存行与SIMD优化指南

空间复用和数据对齐这两件事,很多人是在踩了坑之后才回头补课的。我刚开始接触算法实现时,习惯把所有临时数据都放在堆上现申请现释放,结构体字段怎么顺手怎么排,跑起来也没觉得有什么问题——直到有一次把数据规模抬到千万级&…

2026/10/18 23:38:35 阅读更多 →
Sakurairo WordPress 主题指南:从零到一搭出你的多彩博客

Sakurairo WordPress 主题指南:从零到一搭出你的多彩博客

Sakurairo WordPress 主题指南:从零到一搭出你的多彩博客 【免费下载链接】Sakurairo A WordPress theme that is built with AI-assisted reading features, colorful, user-friendly, well-rounded, and rich in functionalities. Support Chinese, English, Japa…

2026/10/18 23:38:35 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/18 12:16:16 阅读更多 →