1. 菜品管理
新增菜品
接口设计
1. 根据类型查询分类(分类管理已完成)
查看接口文档即可
2. 文件上传
创建Bucket
采用的是阿里云的OSS对象存储服务
新增AccessKey
3. 菜品的新增逻辑
代码开发
1. 文件上传接口开发
为了提高代码的解耦性,在配置文件采用的是分离式的。
这个文件的数据在 sky-common 里的 properties 里的 AliOssProperties 类里进行了配置
在 sky-common 里的 utils 里配置了上传文件的工具,那么就需要将这个对象注入到 IOC
在 sky-service 里进行注入该工具类
开发文件上传接口:
2. 新增菜品接口开发
controller 层
serverImpl 层
Mapper 层
通过下图的方式,将得到的自增的主键值,再赋值给原对象
其他都属于比较常规的操作
菜品分页查询
常规的操作
删除菜品
规则:
起售中的菜品不能删除
套餐关联的菜品不能删除
删除菜品后,关联的口味数据也需要删除掉
常规方法解决
修改菜品
接口设计
根据id查询菜品
根据类型查询分类(已完成)
文件上传 (已完成)
修改菜品
代码开发
1. 查询菜品及其相关联的口味信息,比较简单;
2. 修改菜品接口
对于菜品修改是普通的 update 方法
对于关联的口味信息,采用的是先删除原有相关联的所有信息,然后添加来自前端的信息
菜品起售停售
注:如果执行停售操作,则包含此菜品的套餐也需要停售。
controller 层
ServerImpl
2. 套餐管理
新增套餐
业务规则
套餐名称唯一
套餐必须属于某个分类
套餐必须包含菜品
名称、分类、价格、图片为必填项
添加菜品窗口需要根据分类类型来展示菜品
新增的套餐默认为停售状态
接口设计
根据类型查询分类(已完成)
根据分类id查询菜品
图片上传(已完成)
新增套餐
代码开发
常规开发
注意点:新增套餐,同时需要保存套餐和菜品的关联关系
套餐分页查询
因为要返回对应的 种类名称,在表 setmeal 里记录的是对应的 种类id
所有需要去表 category 里根据 id 查询对应的 categoryName
删除套餐
业务规则
可以一次删除一个套餐,也可以批量删除套餐
起售中的套餐不能删除
代码开发
注:删除套餐表中的数据的时候,也需要删除套餐菜品关系表中的数据
属于常规开发
修改套餐
接口设计
代码开发
查询回显数据常规方案
修改套餐对应的菜品关联关系
采用的方案与 菜品与对应的口味 方案相同
先删除之前有的所有关联,然后新增套餐与菜品对应的关系
根据id查询套餐,用于修改页面回显数据
修改套餐
起售停售套餐
业务规则
可以对状态为起售的套餐进行停售操作,可以对状态为停售的套餐进行起售操作
起售的套餐可以展示在用户端,停售的套餐不能展示在用户端
起售套餐时,如果套餐内包含停售的菜品,则不能起售
代码开发
具体查看源码
3. Redis
在项目中使用 redis,本项目使用的是 Spring Data Redis
操作步骤
1. 导入Spring Data Redis
2. 配置Redis数据源
3. 写配置类,创建RedisTemplate对象
导入 IOC 容器里
4. 通过 RedisTemplate 对象操作 Redis
- ValueOperations:string数据操作
- SetOperations:set类型数据操作
- ZSetOperations:zset类型数据操作
- HashOperations:hash类型的数据操作
- ListOperations:list类型的数据操作
4. 店铺营业状态设置
管理端,用户端使用的 Controller 类的名称是一样的,所以要对 Controller 进行命名
管理端
查询店铺营业状态
设置店铺营业状态
这里要注意
如果在 redis 的配置文件里的配置 redis.conf
stop-writes-on-bgsave-error yes
这样是强制把 redis 快照关闭了,导致不能持久化,无法对 redis 的数据进行修改
设置为: stop-writes-on-bgsave-error no 即可
用户端
与管理端的获取方式一致
5. Swagger 修改
修改docker,使用户端的接口与管理端的接口分离
@Bean
public Docket docket1(){
log.info("准备生成接口文档...");
ApiInfo apiInfo = new ApiInfoBuilder()
.title("苍穹外卖项目接口文档")
.version("2.0")
.description("苍穹外卖项目接口文档")
.build();
Docket docket = new Docket(DocumentationType.SWAGGER_2)
.groupName("管理端接口")
.apiInfo(apiInfo)
.select()
//指定生成接口需要扫描的包
.apis(RequestHandlerSelectors.basePackage("com.sky.controller.admin"))
.paths(PathSelectors.any())
.build();
return docket;
}
@Bean
public Docket docket2(){
log.info("准备生成接口文档...");
ApiInfo apiInfo = new ApiInfoBuilder()
.title("苍穹外卖项目接口文档")
.version("2.0")
.description("苍穹外卖项目接口文档")
.build();
Docket docket = new Docket(DocumentationType.SWAGGER_2)
.groupName("用户端接口")
.apiInfo(apiInfo)
.select()
//指定生成接口需要扫描的包
.apis(RequestHandlerSelectors.basePackage("com.sky.controller.user"))
.paths(PathSelectors.any())
.build();
return docket;
}
这样就完成了接口的分组