1. 新增套餐
1.1 需求分析
套餐就是菜品的集合。
后台系统中可以管理套餐信息,通过新增套餐功能来添加一个新的套餐,在添加套餐时需要选择当前套餐所属的套餐分类和包含的菜品,并且需要上传套餐对应的图片,在移动端会按照套餐分类来展示对应的套餐。
1.2 数据模型
新增套餐,其实就是将新增页面录入的套餐信息插入到setmeal表,还需要向setmeal_dish表插入套餐和菜品关联数据。所以在新增套餐时,涉及到两个表:
表 | 说明 | 备注 |
setmeal | 套餐表 | 存储套餐的基本信息 |
setmeal_dish | 套餐菜品关系表 | 存储套餐关联的菜品的信息(一个套餐可以关联多个菜品) |
两张表具体的表结构如下:
1). 套餐表setmeal
在该表中,套餐名称name字段是不允许重复的,在建表时,已经创建了唯一索引。
2). 套餐菜品关系表setmeal_dish
在该表中,菜品的名称name,菜品的原价price 实际上都是冗余字段,因为我们在这张表中存储了菜品的ID(dish_id),根据该ID我们就可以查询出name,price的数据信息,而这里我们又存储了name,price,这样的话,我们在后续的查询展示操作中,就不需要再去查询数据库获取菜品名称和原价了,这样可以简化我们的操作。
1.3 准备工作
在开发业务功能前,先将需要用到的类和接口基本结构创建好,在做这一块儿的准备工作时,我们无需准备Setmeal的相关实体类、Mapper接口、Service接口及实现,因为之前在做分类管理的时候,我们已经引入了Setmeal的相关基础代码。 接下来,我们就来完成以下的几步准备工作:
1). 实体类 SetmealDish
ps.直接从课程资料中导入即可,Setmeal实体前面课程中已经导入过了。
所属包: com.itheima.reggie.entity
importcom.baomidou.mybatisplus.annotation.FieldFill; importcom.baomidou.mybatisplus.annotation.TableField; importlombok.Data; importjava.io.Serializable; importjava.math.BigDecimal; importjava.time.LocalDateTime; /*** 套餐菜品关系*/publicclassSetmealDishimplementsSerializable { privatestaticfinallongserialVersionUID=1L; privateLongid; //套餐idprivateLongsetmealId; //菜品idprivateLongdishId; //菜品名称 (冗余字段)privateStringname; //菜品原价privateBigDecimalprice; //份数privateIntegercopies; //排序privateIntegersort; fill=FieldFill.INSERT) (privateLocalDateTimecreateTime; fill=FieldFill.INSERT_UPDATE) (privateLocalDateTimeupdateTime; fill=FieldFill.INSERT) (privateLongcreateUser; fill=FieldFill.INSERT_UPDATE) (privateLongupdateUser; //是否删除privateIntegerisDeleted; }
2). DTO SetmealDto
该数据传输对象DTO,主要用于封装页面在新增套餐时传递过来的json格式的数据,其中包含套餐的基本信息,还包含套餐关联的菜品集合。直接从课程资料中导入即可。
所属包: com.itheima.reggie.dto
importcom.itheima.reggie.entity.Setmeal; importcom.itheima.reggie.entity.SetmealDish; importlombok.Data; importjava.util.List; publicclassSetmealDtoextendsSetmeal { privateList<SetmealDish>setmealDishes;//套餐关联的菜品集合privateStringcategoryName;//分类名称}
3). Mapper接口 SetmealDishMapper
所属包: com.itheima.reggie.mapper
importcom.baomidou.mybatisplus.core.mapper.BaseMapper; importcom.itheima.reggie.entity.SetmealDish; importorg.apache.ibatis.annotations.Mapper; publicinterfaceSetmealDishMapperextendsBaseMapper<SetmealDish> { }
4). 业务层接口 SetmealDishService
所属包: com.itheima.reggie.service
importcom.baomidou.mybatisplus.extension.service.IService; importcom.itheima.reggie.entity.SetmealDish; publicinterfaceSetmealDishServiceextendsIService<SetmealDish> { }
5). 业务层实现类 SetmealDishServiceImpl
所属包: com.itheima.reggie.service.impl
importcom.baomidou.mybatisplus.extension.service.impl.ServiceImpl; importcom.itheima.reggie.entity.SetmealDish; importcom.itheima.reggie.mapper.SetmealDishMapper; importcom.itheima.reggie.service.SetmealDishService; importlombok.extern.slf4j.Slf4j; importorg.springframework.stereotype.Service; publicclassSetmealDishServiceImplextendsServiceImpl<SetmealDishMapper,SetmealDish>implementsSetmealDishService { }
6). 控制层 SetmealController
套餐管理的相关业务,我们都统一在 SetmealController 中进行统一处理操作。
所属包: com.itheima.reggie.service.impl
importcom.itheima.reggie.service.SetmealDishService; importcom.itheima.reggie.service.SetmealService; importlombok.extern.slf4j.Slf4j; importorg.springframework.beans.factory.annotation.Autowired; importorg.springframework.web.bind.annotation.*; /*** 套餐管理*/"/setmeal") (publicclassSetmealController { privateSetmealServicesetmealService; privateSetmealDishServicesetmealDishService; }
1.4 前端页面分析
服务端的基础准备工作我们准备完毕之后,在进行代码开发之前,需要梳理一下新增套餐时前端页面和服务端的交互过程:
1). 点击新建套餐按钮,访问页面(backend/page/combo/add.html),页面加载发送ajax请求,请求服务端获取套餐分类数据并展示到下拉框中(==已实现==)
获取套餐分类列表的功能我们不用开发,之前已经开发完成了,之前查询时type传递的是1,查询菜品分类; 本次查询时,传递的type为2,查询套餐分类列表。
2). 访问页面(backend/page/combo/add.html),页面加载时发送ajax请求,请求服务端获取菜品分类数据并展示到添加菜品窗口中(==已实现==)
本次查询分类列表,传递的type为1,表示需要查询的是菜品的分类。查询菜品分类的目的,是添加套餐关联的菜品时,我们需要根据菜品分类,来过滤查询菜品信息。查询菜品分类列表的代码已经实现, 具体展示效果如下:
3). 当点击添加菜品窗口左侧菜单的某一个分类, 页面发送ajax请求,请求服务端,根据菜品分类查询对应的菜品数据并展示到添加菜品窗口中
4). 页面发送请求进行图片上传,请求服务端将图片保存到服务器(==已实现==)
5). 页面发送请求进行图片下载,将上传的图片进行回显(==已实现==)
6). 点击保存按钮,发送ajax请求,将套餐相关数据以json形式提交到服务端
经过上述的页面解析及流程分析,我们发送这里需要发送的请求有5个,分别是 :
A. 根据传递的参数,查询套餐分类列表
B. 根据传递的参数,查询菜品分类列表
C. 图片上传
D. 图片下载展示
E. 根据菜品分类ID,查询菜品列表
F. 保存套餐信息