苍穹外卖开发日志Day04——公共字段填充与菜品管理
苍穹外卖开发日志Day04——公共字段填充与菜品管理
- 公共字段填充
- 菜品管理包含以下功能:
- 新增菜品
- 菜品分页查询
- 删除菜品
- 修改菜品
- 菜品起售停售
2025.06.05
一、公共字段自动填充
1.1 问题分析与实现思路
- 问题分析
- 业务表中存在公共字段
- create_time
- create_user
- update_time
- update_user
- 业务表中存在公共字段
- 实现思路
- 自定义注解AutoFill,用于标识需要进行公共字段自动填充的方法
- 自定义切面类AutoFillAspect,统一拦截标注了@AutoFill注解的方法,通过反射为公共字段赋值
- 在Mapper的方法上加入@AutoFill注解
- 技术点:枚举、注解、AOP、反射
1.2 代码实现
- AutoFill注解
1 | /** |
- AutoFillAspect切面类
1 | /** |
1.3 功能测试
- 以修改员工为例
- 修改前:

- 修改后:

二、新增菜品
2.1 新增菜品——功能开发
- 产品原型

- 业务规则
- 菜品名称必须唯一
- 菜品必须属于某个分类下,不能单独存在
- 新增菜品时可以根据情况选择菜品口味
- 每个菜品必须对应一张图片
- 接口设计




- 数据库设计

- 注意点
- 在添加口味时需要使用主键返回获取对应菜品的ID
- 在Service层需要添加@Transactional用于事务控制,保证菜品和口味的添加要么同时成功,要么同时失败
- Mapper层的方法需要添加@AutoFill注解,用于公共字段的自动填充
2.2 文件上传——代码实现
2.2.1 CommonController
1 | /** |
2.2.2 AliOssUtil
1 |
|
2.2.3 AliOssConfig
1 | /** |
2.3 新增菜品
2.3.1 DishDTO
1 |
|
2.3.2 DishController
1 |
|
2.3.3 DishServiceImpl
1 |
|
2.3.4 DishMapper
1 |
|
2.3.5 DishMapper.xml
1 |
|
2.3.6 DishFlavorMapper
1 |
|
2.3.7 DishFlavorMapper.xml
1 |
|
2.4 新增菜品——功能测试
- 文件上传

- 前后端联调测试:

三、菜品分页查询
3.1 菜品分页查询——功能开发
- 产品原型

- 业务规则
- 根据页码展示菜品信息
- 每页展示10条数据
- 分页查询时可以根据需要输入菜品名称、菜品分类、菜品状态进行查询
- 接口设计

- 注意点
- 使用VO作为返回值,VO中包含了菜品口味信息
3.2 菜品分页查询——代码实现
3.2.1 DishPageQueryDTO
1 |
|
3.2.2 DishVO
1 |
|
3.2.3 DishController
1 | /** |
3.2.4 DishServiceImpl
1 | /** |
3.2.5 DishMapper
1 | /** |
3.2.6 DishMapper.xml
1 | <select id="pageQuery" resultType="com.sky.vo.DishVO"> |
3.3 菜品分页查询——功能测试
- 功能测试:

- 前后端联调测试:

四、删除菜品
4.1 删除菜品——功能开发
- 产品原型

- 业务规则
- 可以一次删除一个菜品,也可以批量删除菜品
- 起售中的菜品不能删除
- 被套餐关联的菜品不能删除
- 删除菜品后,关联的口味数据也需要删除
- 接口设计

- 数据库设计

- 注意点
- 在删除菜品前需要先判断菜品是否起售,如果起售则不能删除
- 在删除菜品前需要先判断菜品是否被套餐关联,如果被套餐关联则不能删除
4.2 删除菜品——代码实现
4.2.1 DishController
1 | /** |
4.2.2 DishServiceImpl
1 | /** |
4.2.3 DishMapper
1 | /** |
4.2.4 DishMapper.xml
1 | <select id="pageQuery" resultType="com.sky.vo.DishVO"> |
4.2.5 DishFlavorMapper
1 | /** |
4.2.6 SetmealDishMapper
1 |
|
4.2.7 SetmealDishMapper.xml
1 |
|
4.3 删除菜品——功能测试
- 功能测试:



4.4 删除菜品——代码优化
- 由于在Service层中遍历删除会产生多条sql语句,性能较差,所以优化为一条sql语句
4.4.1 DishServiceImpl
1 | /** |
4.4.2 DishMapper
1 | /** |
4.4.3 DishMapper.xml
1 | <delete id="deleteByIds"> |
4.4.4 DishFlavorMapper
1 | /** |
4.4.5 DishFlavorMapper.xml
1 | <delete id="deleteByDishIds"> |
五、修改菜品
5.1 修改菜品——功能开发
- 产品原型

- 接口设计



- 注意点
- 在修改口味时,可以先将原来的口味全部删除再重新添加
5.2 修改菜品——代码实现
5.2.1 DishController
1 | /** |
5.2.2 DishServiceImpl
1 | /** |
5.2.3 DishMapper
1 | /** |
5.2.4 DishMapper.xml
1 | <update id="update"> |
5.3 修改菜品——功能测试
- 前后端联调测试

六、菜品起售停售
6.1 菜品起售停售——功能开发
- 产品原型

- 业务规则:
- 可以对状态为起售的套餐进行停售操作,可以对状态为停售的套餐进行起售操作
- 起售的套餐可以展示在用户端,停售的套餐不能展示在用户端
- 起售套餐时,如果套餐内包含停售的菜品,则不能起售
- 接口设计:

6.2 菜品起售停售——代码实现
3.1 DishController
1 | /** |
3.2 DishService
1 | /** |
3.3 DishServiceImpl
1 | /** |
3.4 SetmealMapper
1 | /** |
3.5 SetmealMapper.xml
1 |
|
6.3 菜品起售停售——功能测试
- 前后端联调测试

