Java 项目实战: 交友项目 - 开工任务书
概述我们开工前要准备 “继续往下写代码的资格”把一个空目录变成能跑起来的多模块微服务工程并在上面跑通手机号加验证码登录。纲要本章目标从空工程到可运行的微服务骨架与登录闭环五个板块的任务书认识项目 / 工程准备 / 接入第三方能力 / 实现登录 / 代码优化五件事的依赖关系图为什么顺序不能调换第一章结束时的工程形态预告模块树环境自检清单开工前必须就绪的七项以及哪些可以后补学习建议与常见误解本章第一篇实质内容指向本章要抵达的终点一句话讲清楚这一章的交付从一个空工程开始搭出项目的微服务骨架并跑通手机号 验证码登录包含首次登录自动注册。跑通的标准不看写了多少行代码而是看这条链路能不能从头走到尾手机端请求验证码 →mf-app-server生成验证码并写入 Redis → 手机端提交验证码 → app-server 校验 → 通过 Dubbo 调mf-dubbo-db查库 → 用户不存在就建号 → 签发 JWT 返回。五个板块的任务书板块要做什么产出物验收标准① 认识项目搞清产品是什么、用什么架构、模块怎么划一张留在脑子里的图不是代码能说清 app-server 与 dubbo-db 各自职责以及为什么 Dubbo 要拆接口模块和服务模块② 工程准备装工具、建模块、配依赖能编译通过的多模块 Maven 聚合工程mvn clean install全绿根工程下层级与模块名和讲义 3.2.2 模块表一致③ 接入第三方能力打通阿里云短信并封装成自动装配组件mf-autoconfig中的SmsTemplate、SmsProperties、mfAutoConfiguration、META-INF/spring.factories业务模块里不写任何配置类、不 new 任何 SDK 对象直接Autowired SmsTemplate就能发短信④ 实现登录验证码 JWT 自动注册POST /user/login、POST /user/loginVerification两个接口JwtUtils工具类用 Postman 走完两段请求先拿验证码再带着验证码登录返回体里同时有token和isNew新手机号登录后库里多出一条tb_user记录⑤ 代码优化下沉公共字段交给 MyBatis-Plus 自动填充BasePojo抽象类、MyMetaObjectHandlerUser不再自己声明created/updated插入数据时不手动赋值两列也有值③ 的验收标准值得单独强调一遍它是组件封装得对不对的唯一判据。只要业务代码里还出现一次DefaultProfile或IAcsClient就说明抽象漏了。依赖关系顺序不是课表排的这五件事的先后是被依赖逼出来的不是随便编的顺序。决定技术选型的理由决定分层与封装边界模块没分好组件没地方放组件没封装业务就直连 SDK能跑通了才谈得上优化① 认识项目无代码产出② 工程准备多模块骨架③ 接入第三方能力④ 实现登录⑤ 代码优化BasePojo 自动填充四条边各有一句话的理由② → ③mf-autoconfig是从一开始就规划好的模块。模块没分出来短信组件只能塞进mf-app-server以后第二个服务要用就得复制一份。③ → ④先有SmsTemplateUserService.sendMsg()才可能只写一行调用。反过来先写登录业务里就会直接依赖阿里云 SDK后面再想抽就得到处改。④ → ⑤BasePojo是在User落库时才暴露出每个实体都要手写两个时间字段这个重复的。没写过一遍抽象就没有依据。① → 全部认知类板块不产出代码但它决定后面所有的为什么这么选。先看导学再动手不是形式主义。第一章结束时的工程形态讲义 3.2.2 的模块表是要建什么这一章的代码快照是建成了什么样。对着下面这棵树开工就知道终点在哪。mf ├── pom.xml ├── mf-autoconfig # 自动装配组件本章交付 SmsTemplate 与 spring.factories │ └── src/main/resources/META-INF/spring.factories ├── mf-model # 实体类本章交付 User 与 BasePojo ├── mf-commons # 工具类本章交付 JwtUtils ├── mf-dubbo # 只作父工程不写代码 │ ├── mf-dubbo-interface # 服务接口本章交付 UserApi │ ├── mf-dubbo-db # 数据库服务提供者本章交付 UserMapper / UserApiImpl / MyMetaObjectHandler │ └── mf-dubbo-mongo # MongoDB 服务提供者本章只建骨架没有业务 └── mf-app-server # 与手机端交互的入口本章交付 LoginController / UserService两个容易忽略的点mf-dubbo本身只是文件夹不写一行 Javamf-dubbo-mongo这一章是空壳它的用处在后面的附近的人与动态模块。环境自检清单开工前把这张表从上到下过一遍能省掉后面一大半跑不起来又不报明显错的时间。项要求怎么验必须 / 可后补JDK8java -version输出1.8.0_xxx必须Maven3.6配国内镜像mvn -v改settings.xml的mirrors指向阿里云否则拉依赖慢到怀疑网络必须IDEA装好 Lombok 插件并开启注解处理打开工程后Data能点进去、无红色波浪线必须Nacos启动并注册可用访问http://192.168.136.160:8848/nacos默认nacos/nacos能进控制台必须Redis6379 可连redis-cli -h 192.168.136.160 ping回PONG必须MySQL建库mf导入 SQLmysql -uroot -proot -e use mf; show tables;能看到tb_user必须短信账号阿里云 AccessKey 签名 模板先跑通再说可后补端口规划app-server 18080 / dubbo-db 18081 / Dubbo 协议 20881 / Nacos 8848lsof -i:18080启动后应被占用必须Postman调POST /user/login返回 200必须Android 模拟器网易 MuMu装 APK能连上 app-server可后补短信账号为什么可以后补UserService.sendMsg()里真正的发送与写 Redis 是两件事先把验证码固定成123456写进 Redis、把template.sendSms(...)注释掉整条登录链路照样能调通。等账号下来了再把那行注释放开业务代码一行都不用改——这正是第 ③ 步封装组件的收益。学习建议先跑通再求甚解。这一章的目标是看到东西动起来不是把spring.factories的加载时机、Dubbo 的泛化调用都抠透。跑通之后再回头读实现理解成本低得多。跟着敲不要复制。多模块工程的依赖传递、parent指向、spring.factories的路径这些地方复制粘贴非常容易漏一层。漏了之后症状还不是报错是注解不生效。报错先看日志定位模块。多模块工程的报错十有八九是第一句ClassNotFoundException或找不到com.mf.model.domain.User真实原因往往是被依赖的模块没install到本地仓库。先mvn clean install -DskipTests再谈别的。用 Git 分阶段提交。每完成一个板块提交一次出问题好回退。这是真实工程习惯也是这一章最便宜的保险。几个容易踩的误解误解实际情况先把讲义通读一遍再开工讲义里大量内容是做完之后才看得懂的。边做边翻效率高得多模块划分可以边写边改中期改模块划分要动全部 pom 的parent和dependency成本远高于开工前花十分钟想清楚这一章就是照抄代码抄出来的东西只有这一章能用。重点是理解分层的边界和封装的套路比如为什么SmsTemplate要放在 autoconfig 而不是 app-server登录功能很简单这里串了四类技术Redis 缓存、Dubbo RPC、第三方服务、JWT。任何一环配错都表现为登录失败下一篇这一章的第一篇实质内容就是《项目介绍》——先把这个平台是干什么的、面向谁、后端用什么技术栈讲清楚再去建工程。认知在前动手在后顺序和上面那张依赖图是一致的。官方文档Spring Boot 2.3.9 Release NotesMyBatis-Plus 自动填充Nacos 快速开始阿里云短信服务文档总结这一章的定位是开工前的任务书五个板块、各自的产出物、可验证的验收标准以及一条由依赖推出来的执行顺序。验收不看代码量看链路——短信能发、验证码能存、登录能返回 token、新号能自动入库。环境清单里唯一可以后补的是短信账号用调试模式先把流程跑通即可。