
1. 项目背景与核心目标苍穹外卖-day02是一个典型的外卖配送系统开发项目中的第二天任务模块。作为连续开发日志的一部分这个阶段通常聚焦在系统核心功能的实现与优化上。根据行业惯例外卖系统开发的第二天往往会涉及以下关键任务用户端功能完善如购物车逻辑、优惠券系统骑手端基础功能搭建接单/导航模块后台管理系统开发订单处理看板基础架构优化数据库索引、API响应速度实际开发中第二天往往是系统从原型转向可用版本的关键转折点需要处理好业务逻辑与技术实现的平衡。2. 技术架构解析2.1 主流技术选型方案现代外卖系统通常采用微服务架构day02阶段建议的技术栈组合技术层级推荐方案替代方案选择理由前端框架Vue3 VantReact Ant Design组件库成熟开发效率高后端语言Java17Go1.20生态完善人才储备充足微服务框架Spring Cloud AlibabaDubbo阿里系组件集成度高数据库MySQL8.0 Redis7PostgreSQL MongoDB事务支持完善缓存性能优异消息队列RocketMQKafka阿里云原生支持延迟更低2.2 核心服务拆分在day02阶段建议完成以下微服务的基础搭建订单服务(Order-Service)处理下单/支付/状态变更需实现本地事务消息表方案关键表结构CREATE TABLE orders ( id bigint NOT NULL AUTO_INCREMENT, user_id bigint NOT NULL COMMENT 用户ID, total_amount decimal(10,2) NOT NULL COMMENT 订单总额, status tinyint NOT NULL DEFAULT 0 COMMENT 0待支付 1已支付 2已接单..., create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), KEY idx_user_status (user_id,status) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;配送服务(Delivery-Service)骑手调度算法实时位置追踪集成高德/百度地图API商户服务(Merchant-Service)菜品管理营业统计接单处理3. 关键功能实现3.1 购物车模块开发核心逻辑流程图用户添加商品 → 2. 校验库存 → 3. 计算优惠 → 4. 持久化存储代码实现要点// 购物车项DTO Data public class CartItemDTO { private Long skuId; // 商品规格ID private Integer quantity; // 购买数量 private Boolean selected; // 是否选中结算 } // 购物车服务接口 public interface CartService { // 添加商品到购物车 ResultVoid addToCart(Long userId, CartItemDTO item); // 获取完整购物车 ResultCartVO getFullCart(Long userId); }性能优化技巧使用Redis Hash结构存储购物车数据本地缓存商品基本信息减少DB查询批量查询优惠信息避免多次RPC调用3.2 订单创建流程分布式事务方案对比方案适用场景day02推荐度原因本地消息表中等并发量★★★★★实现简单无需额外组件Seata AT复杂事务链★★★☆☆学习成本较高TCC高一致性要求★★☆☆☆开发工作量过大实操示例本地消息表方案Transactional public ResultOrderVO createOrder(OrderCreateDTO dto) { // 1. 校验商品库存 checkInventory(dto.getItems()); // 2. 生成订单主事务 Order order buildOrder(dto); orderMapper.insert(order); // 3. 扣减库存本地消息 InventoryMessage message new InventoryMessage(order.getId(), dto.getItems()); messageMapper.insert(message); // 4. 发送MQ消息异步任务处理 sendInventoryMessage(message); return Result.success(convertToVO(order)); }4. 典型问题排查指南4.1 订单重复创建问题现象 用户快速点击下单按钮时生成多个相同订单解决方案前端防抖处理300ms间隔后端幂等控制PostMapping(/create) public ResultOrderVO createOrder( RequestBody OrderCreateDTO dto, RequestHeader(X-Request-Id) String requestId) { // 基于requestId实现幂等 if (redisTemplate.opsForValue().setIfAbsent( order:req: requestId, 1, 5, TimeUnit.MINUTES)) { return orderService.createOrder(dto); } throw new BusinessException(请勿重复提交订单); }4.2 地理位置漂移问题原因分析 不同地图API的坐标系差异高德GCJ-02百度BD-09GPS设备WGS-84坐标转换工具类public class CoordinateUtils { private static final double X_PI Math.PI * 3000.0 / 180.0; // GCJ-02转BD-09 public static double[] gcjToBd(double lat, double lng) { double z Math.sqrt(lng * lng lat * lat) 0.00002 * Math.sin(lat * X_PI); double theta Math.atan2(lat, lng) 0.000003 * Math.cos(lng * X_PI); return new double[]{ z * Math.sin(theta) 0.006, z * Math.cos(theta) 0.0065 }; } }5. 性能优化实践5.1 数据库优化索引优化方案-- 订单表常用查询场景 ALTER TABLE orders ADD INDEX idx_user_time (user_id, create_time DESC); ALTER TABLE order_items ADD INDEX idx_order_sku (order_id, sku_id); -- 慢查询监控day02建议配置 SET GLOBAL slow_query_log ON; SET GLOBAL long_query_time 1;连接池配置建议# application.yml spring: datasource: hikari: maximum-pool-size: 20 minimum-idle: 5 idle-timeout: 30000 max-lifetime: 1800000 connection-timeout: 30005.2 缓存策略设计多级缓存架构本地缓存Caffeine高频访问的基础数据Bean public CacheManager cacheManager() { CaffeineCacheManager manager new CaffeineCacheManager(); manager.setCaffeine(Caffeine.newBuilder() .expireAfterWrite(10, TimeUnit.MINUTES) .maximumSize(1000)); return manager; }Redis缓存业务数据缓存Cacheable(value menu, key #shopId) public ListDishVO getShopMenu(Long shopId) { // DB查询逻辑 }CDN缓存静态资源加速6. 安全防护措施6.1 常见攻击防护XSS防护方案Configuration public class WebSecurityConfig extends WebSecurityConfigurerAdapter { Override protected void configure(HttpSecurity http) throws Exception { http.headers() .xssProtection() .and() .contentSecurityPolicy(script-src self); } }SQL注入防护强制使用MyBatis参数绑定禁止字符串拼接SQL定期执行SQL注入扫描6.2 敏感数据保护数据脱敏处理public class DataMaskUtil { // 手机号脱敏 public static String maskPhone(String phone) { if (StringUtils.isEmpty(phone)) return ; return phone.replaceAll((\\d{3})\\d{4}(\\d{4}), $1****$2); } // 地址脱敏 public static String maskAddress(String address) { if (StringUtils.isEmpty(address)) return ; return address.substring(0, 6) ******; } }7. 监控与报警体系7.1 基础监控配置Spring Boot Actuator集成management: endpoints: web: exposure: include: health,info,metrics,prometheus metrics: export: prometheus: enabled: true关键监控指标订单创建TPS平均响应时间错误率数据库连接池使用率7.2 业务监控设计自定义指标采集RestController public class OrderController { private final Counter orderCounter; public OrderController(MeterRegistry registry) { this.orderCounter registry.counter(order.create.count); } PostMapping(/order) public Result createOrder() { orderCounter.increment(); // 业务逻辑 } }报警规则示例- alert: HighErrorRate expr: rate(http_server_requests_errors_total[1m]) 0.05 for: 5m labels: severity: critical annotations: summary: High error rate on {{ $labels.instance }}8. 持续集成方案8.1 GitLab CI配置.gitlab-ci.yml示例stages: - build - test - deploy build-job: stage: build image: maven:3.8-jdk-11 script: - mvn clean package -DskipTests artifacts: paths: - target/*.jar test-job: stage: test image: maven:3.8-jdk-11 script: - mvn test needs: [build-job] deploy-job: stage: deploy image: alpine/k8s:1.22 script: - kubectl apply -f k8s/deployment.yaml only: - master8.2 代码质量门禁SonarQube配置# sonar-project.properties sonar.projectKeysky-takeaway sonar.projectName苍穹外卖系统 sonar.java.binariestarget/classes sonar.sourcessrc/main/java sonar.test.sourcessrc/test/java sonar.exclusions**/model/**,**/config/**9. 压测方案设计9.1 JMeter测试计划关键测试场景用户登录并发测试购物车添加压力测试订单创建峰值测试线程组配置建议阶梯式加压50 → 100 → 200线程持续时间每个阶梯维持5分钟思考时间300-500ms随机9.2 性能瓶颈分析Arthas诊断命令# 查看方法调用耗时 watch com.example.service.OrderService createOrder {params,returnObj} -x 3 -b # 监控JVM内存 dashboard -i 5000 # 追踪慢SQL trace javax.sql.DataSource * #cost10010. 移动端适配要点10.1 响应式布局方案CSS媒体查询示例/* 小屏设备 */ media (max-width: 576px) { .dish-card { width: 100%; margin-bottom: 10px; } .cart-panel { position: fixed; bottom: 0; } }10.2 手势操作优化触摸事件处理// 滑动删除购物车项 let startX 0; cartItem.addEventListener(touchstart, (e) { startX e.touches[0].clientX; }); cartItem.addEventListener(touchmove, (e) { const diff e.touches[0].clientX - startX; if (diff -50) { this.showDeleteButton(); } });11. 项目进度管理11.1 每日站会要点day02重点检查项[ ] 订单创建流程联调完成[ ] 购物车Redis缓存实现[ ] 基础监控系统搭建[ ] 数据库索引优化验证11.2 风险控制表风险项可能性影响程度应对措施第三方支付接口延迟中高添加异步回调轮询补偿机制地图API配额不足低中申请提高配额添加备用服务商数据库连接泄漏高严重引入Druid监控定期连接检查12. 团队协作规范12.1 Git分支策略day02推荐流程从master拉取feature/day02基础分支开发人员基于feature/day02创建个人分支git checkout -b feature/day02-order-module每日下班前合并到feature/day02分支day02结束时发起MR到master12.2 代码审查清单重点检查项是否使用魔法数字有无完善的单元测试敏感信息是否硬编码日志输出是否规范异常处理是否完备13. 技术债务管理13.1 已知待优化项day02技术债务登记订单状态机需要重构当前if-else实现地理围栏查询性能待优化优惠券计算未做缓存13.2 债务跟踪方案JIRA看板配置新建Technical Debt项目设置优先级Blocker/Critical/Major每周专项会议讨论解决方案14. 用户反馈收集14.1 埋点设计方案关键埋点事件// 购物车添加事件 trackEvent(cart_add, { sku_id: 123, quantity: 2, price: 38.00 }); // 订单创建成功事件 trackEvent(order_create, { order_id: ORD202308011234, amount: 89.00, payment_method: alipay });14.2 反馈分析维度day02重点关注数据购物车放弃率订单创建平均时长支付成功率错误集中页面15. 后续演进规划15.1 day03重点任务支付系统集成微信/支付宝订单状态机重构智能调度算法原型压力测试报告分析15.2 技术预研方向地理围栏优化R树索引推荐系统协同过滤算法流量治理Sentinel降级规则数据同步CanalES方案在实际开发中day02的顺利完成对整个项目进度至关重要。我们团队在实施过程中发现尽早建立完善的监控体系特别是业务指标监控能大幅降低后期运维成本。另外建议在day02结束时进行一次完整的API文档同步更新这对后续前端联调工作会有很大帮助。