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;
}
这样就完成了接口的分组