1. 苍穹外卖项目订单提交功能实现解析
作为一名长期从事Java后端开发的工程师,最近在实现苍穹外卖系统的订单提交功能时,遇到了一些值得分享的技术细节和设计思考。特别是地址簿管理和订单创建的完整流程,涉及到多个业务模块的协同工作。下面我将从实际开发角度,详细解析这个功能的实现过程。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 地址簿管理模块实现
2.1 地址簿数据结构设计
在苍穹外卖系统中,地址簿管理采用了经典的关系型数据库设计模式。我们使用MySQL作为存储引擎,表结构设计如下:
sql复制CREATE TABLE `address_book` (
`id` bigint NOT NULL COMMENT '主键',
`user_id` bigint NOT NULL COMMENT '用户id',
`consignee` varchar(50) NOT NULL COMMENT '收货人',
`sex` tinyint NOT NULL COMMENT '性别 0 女 1 男',
`phone` varchar(11) NOT NULL COMMENT '手机号',
`province_code` varchar(12) DEFAULT NULL COMMENT '省级区划编号',
`province_name` varchar(32) DEFAULT NULL COMMENT '省级名称',
`city_code` varchar(12) DEFAULT NULL COMMENT '市级区划编号',
`city_name` varchar(32) DEFAULT NULL COMMENT '市级名称',
`district_code` varchar(12) DEFAULT NULL COMMENT '区级区划编号',
`district_name` varchar(32) DEFAULT NULL COMMENT '区级名称',
`detail` varchar(200) DEFAULT NULL COMMENT '详细地址',
`label` varchar(100) DEFAULT NULL COMMENT '标签',
`is_default` tinyint(1) NOT NULL DEFAULT '0' COMMENT '默认 0 否 1是',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COMMENT='地址簿';
这种设计考虑了外卖业务的特点:
- 包含了三级行政区划编码和名称,便于后续数据分析
- 使用is_default字段标记默认地址,而不是单独建表
- 添加了标签字段,方便用户管理多个地址
2.2 默认地址设置实现
关于默认地址的设置,项目采用了在同一个表中使用is_default字段的方案,而不是单独建立默认地址表。这种设计有以下优势:
- 查询效率高:获取用户默认地址只需简单查询
sql复制SELECT * FROM address_book
WHERE user_id = ? AND is_default = 1
- 事务处理简单:设置新默认地址时,只需先取消原有默认地址,再设置新的
java复制@Transactional
public void setDefault(Long id) {
// 1. 先将该用户所有地址设为非默认
addressBookMapper.updateIsDefaultByUserId(getCurrentUserId(), 0);
// 2. 再将指定地址设为默认
AddressBook addressBook = new AddressBook();
addressBook.setId(id);
addressBook.setIsDefault(1);
addressBookMapper.updateById(addressBook);
}
注意:这里必须使用事务注解@Transactional,确保两步操作要么都成功,要么都失败,避免出现多个默认地址的情况。
2.3 地址簿API设计
系统提供了完整的地址簿CRUD接口:
- POST /addressBook - 新增地址
- GET /addressBook/list - 查询当前用户所有地址
- GET /addressBook/default - 获取默认地址
- PUT /addressBook/default - 设置默认地址
- GET /addressBook/{id} - 根据id查询地址
- PUT /addressBook - 修改地址
- DELETE /addressBook - 删除地址
每个接口都进行了严格的参数校验和权限控制,确保用户只能
