1. 项目背景与核心目标
"苍穹外卖"是一个典型的外卖配送系统开发项目,从项目日记的命名方式来看,这应该是一个记录开发过程的系列技术博客。第二天的开发日志通常意味着项目已经完成了基础框架搭建,开始进入核心功能模块的实现阶段。
作为外卖系统,其核心业务场景包括:
- 商家端:菜品管理、订单处理、营业统计
- 用户端:浏览商家、下单支付、订单追踪
- 配送端:接单系统、路线规划、状态更新
- 平台端:商户管理、营销活动、数据监控
2. 第二天可能的开发重点
2.1 数据库设计与实现
外卖系统的数据库设计是第二天最可能的工作重点。需要建立的核心数据表包括:
用户表(users)
- 用户ID、登录凭证、联系方式
- 收货地址(可能设计为关联表)
- 会员等级、优惠券信息
商家表(merchants)
- 商家基础信息、资质证明
- 营业状态、配送范围
- 评分统计字段
菜品表(dishes)
- 菜品分类(主菜/小吃/饮料等)
- 价格、库存、销量
- 规格选项(辣度、大小等)
订单表(orders)
- 订单状态流转设计
- 支付信息、配送信息
- 时间戳(创建/支付/完成)
设计要点:注意建立合理的索引,特别是订单状态、商家ID、用户ID等高频查询字段。外卖系统的订单状态变更频繁,需要考虑行锁问题。
2.2 基础API开发
第二天通常会开始基础接口的开发,主要包括:
用户服务
// 示例:用户登录接口 @PostMapping("/login") public Result login(@RequestBody LoginDTO loginDTO) { // 1. 参数校验 // 2. 密码加密比对 // 3. 生成token // 4. 返回用户基本信息(脱敏处理) }商家服务
// 获取商家列表(带分页和筛选) @GetMapping("/merchants") public PageResult listMerchants( @RequestParam(required = false) String keyword, @RequestParam(defaultValue = "1") Integer page, @RequestParam(defaultValue = "10") Integer size) { // 1. 构建查询条件 // 2. 分页查询 // 3. 结果封装 }菜品服务
// 根据商家获取菜品分类 @GetMapping("/categories/{merchantId}") public Result listCategories(@PathVariable Long merchantId) { // 注意缓存策略,菜品分类变更不频繁 }
2.3 技术难点与解决方案
2.3.1 高并发订单处理
外卖系统需要应对用餐高峰期的订单洪峰,第二天就需要考虑:
库存扣减方案
- 乐观锁 vs 悲观锁选择
- 预扣库存设计(支付超时回滚)
- 分布式锁实现(Redis + Lua)
订单号生成策略
- 避免使用自增ID(安全问题)
- 推荐:时间戳+随机数+业务标识
- 或者使用雪花算法
2.3.2 地理位置处理
配送系统需要处理地理位置数据:
GeoHash编码存储
- 将经纬度转换为字符串编码
- 支持范围查询优化
配送范围校验
-- 示例:查询3公里内的商家 SELECT * FROM merchants WHERE ST_Distance_Sphere( point(longitude, latitude), point(#{lng}, #{lat}) ) <= 3000
3. 开发日志典型内容结构
一个规范的第二天开发日志可能包含以下内容:
3.1 今日进展
- 完成了数据库12张核心表的设计与创建
- 实现了用户服务基础接口(登录/注册/信息获取)
- 搭建了商家微服务框架
- 配置了Swagger接口文档
3.2 遇到的问题
MyBatis关联查询N+1问题
- 现象:获取商家详情时发送过多SQL
- 解决:使用 标签优化
时间格式统一问题
- 前端需要yyyy-MM-dd HH:mm:ss
- 解决方案:全局配置Jackson日期格式
3.3 明日计划
- 开发订单创建流程
- 集成支付SDK
- 设计优惠券系统
- 搭建ELK日志系统
4. 项目开发经验分享
4.1 版本控制策略
第二天是建立良好开发习惯的关键时期:
Git分支规范
- master:生产环境代码
- develop:集成测试分支
- feature/xxx:功能开发分支
- hotfix/xxx:紧急修复分支
Commit message规范
- feat: 添加新功能
- fix: 修复bug
- docs: 文档变更
- style: 代码格式调整
4.2 接口设计原则
RESTful规范
- 资源使用名词复数形式
- 正确使用HTTP方法
- 状态码语义明确
参数校验
@Data public class LoginDTO { @NotBlank(message = "手机号不能为空") @Pattern(regexp = "^1[3-9]\\d{9}$", message = "手机号格式错误") private String phone; @Size(min = 6, max = 20, message = "密码长度6-20位") private String password; }
4.3 性能优化提前考量
即使在项目第二天,也需要考虑:
缓存策略
- 商家信息、菜品分类适合缓存
- 使用Redis String或Hash结构
- 设置合理的过期时间
SQL优化
- 避免SELECT *
- 复杂查询使用EXPLAIN分析
- 建立合适的复合索引
5. 开发环境配置建议
5.1 本地开发环境
依赖管理
- 使用Maven或Gradle管理依赖
- 统一SDK版本(如JDK11)
- 配置阿里云镜像加速
数据库工具
- 推荐使用Docker运行MySQL
- 图形化工具:DBeaver或Navicat
- 初始化脚本版本化管理
5.2 团队协作配置
代码风格统一
- 导入Google Java Style
- 配置Checkstyle插件
- 提交前自动格式化
API文档
- Swagger UI访问地址规划
- 接口注释规范
- 示例值配置
6. 典型问题排查记录
6.1 跨域问题处理
第二天常遇到的CORS问题解决方案:
@Configuration public class CorsConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("*") .allowedMethods("GET", "POST", "PUT", "DELETE") .allowedHeaders("*") .maxAge(3600); } }6.2 时区不一致问题
统一时区的几种方式:
数据库连接字符串添加参数:
jdbc:mysql://localhost:3306/db?useSSL=false&serverTimezone=Asia/Shanghai启动参数设置:
-Duser.timezone=GMT+08代码全局设置:
TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai"));
7. 测试相关准备
虽然第二天可能还未到正式测试阶段,但需要:
单元测试框架搭建
- JUnit5 + Mockito
- 测试覆盖率配置
- 持续集成流水线准备
接口测试工具
- Postman集合创建
- 环境变量配置
- 测试用例设计
压力测试准备
- JMeter测试计划草图
- 关键接口标识
- 性能基线设定
8. 项目质量保障措施
8.1 代码质量检查
静态代码分析
- SonarQube规则配置
- 严重问题零容忍
- 每日扫描报告
代码审查流程
- 至少一人审查方可合并
- 重点检查:
- 异常处理
- 安全风险
- 性能隐患
8.2 日志规范
第二天就应该建立日志规范:
日志级别使用
- ERROR:需要人工干预
- WARN:潜在问题
- INFO:业务流程
- DEBUG:调试信息
日志内容要求
- 包含traceId串联请求
- 敏感信息脱敏
- 关键参数打印
@Slf4j @RestController public class UserController { @PostMapping("/login") public Result login(@RequestBody LoginDTO dto) { log.info("登录请求,手机号:{}", hideMobile(dto.getPhone())); // ... } private String hideMobile(String mobile) { return mobile.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2"); } }9. 架构设计演进思考
虽然只是项目第二天,但需要考虑架构的演进性:
9.1 微服务拆分准备
领域划分
- 用户中心
- 商家服务
- 订单服务
- 配送服务
公共组件
- 认证中心
- 消息中心
- 文件服务
9.2 技术选型预留
分布式事务方案
- Seata
- 消息队列最终一致性
缓存策略
- 多级缓存设计
- 热点Key处理
监控系统
- Prometheus + Grafana
- 业务指标埋点
10. 实际开发中的经验之谈
文档同步重要性
- 数据库变更记录
- 接口变更日志
- 每日站立会议纪要
技术债务管理
- 明确标记TODO/FIXME
- 评估解决优先级
- 迭代计划中安排
开发效率技巧
- 代码片段模板
- 自动化脚本
- 快捷键精通
在项目第二天的开发中,最重要的是建立良好的工程结构和开发规范,这能为后续开发避免大量重复劳动。建议每天结束前进行代码提交和简短总结,保持持续集成的习惯