7--苍穹外卖-SpringBoot项目中套餐管理 详解(一)
前言
目录
新增套餐
需求分析和设计
代码开发
根据分类id查询菜品
Controller层
Service层
ServiceImpl层
Mapper层
DishMapper.xml
新增套餐
实体类
mapper层
Service层
ServiceImpl层
Mapper层
SetmealMapper.xml
setmealDishMapper.xml
套餐分页查询
需求分析和设计
代码开发
设计DTO类
Controller层
Service层
ServiceImpl
Mapper
SetmealMapper.xml
功能测试
1--苍穹外卖-SpringBoot项目介绍及环境搭建 详解-CSDN博客
2--苍穹外卖-SpringBoot项目中员工管理 详解(一)-CSDN博客
3--苍穹外卖-SpringBoot项目中员工管理 详解(二)-CSDN博客
4--苍穹外码-SpringBoot项目中分类管理 详解-CSDN博客
5--苍穹外卖-SpringBoot项目中菜品管理 详解(一)-CSDN博客
6--苍穹外卖-SpringBoot项目中菜品管理 详解(二)-CSDN博客
7--苍穹外卖-SpringBoot项目中套餐管理 详解(一)-CSDN博客
8--苍穹外卖-SpringBoot项目中套餐管理 详解(二)-CSDN博客
9--苍穹外卖-SpringBoot项目中Redis的介绍及其使用实例 详解-CSDN博客
10--苍穹外卖-SpringBoot项目中微信登录 详解-CSDN博客
新增套餐
需求分析和设计
在页面原型中看到
业务规则:
-
套餐名称必须是唯一的
-
新增套餐时可以根据情况选择需要添加的菜品
-
每个套餐必须对应一张图片
接口设计:
-
根据类型查询分类(已完成)
-
文件上传(已完成)
-
新增套餐
-
根据分类id查询菜品
代码开发
根据分类id查询菜品
Controller层
//根据分类id查询菜品
@GetMapping("/list")
@ApiOperation("根据分类id查询菜品")
public Result<List<Dish>> getByCategoryId(Long categoryId){
log.info("根据分类id查询菜品;{}",categoryId);
List<Dish> list=dishService.getByCategoryId(categoryId);
return Result.success(list);
}
Service层
//根据分类id查询菜品
List<Dish> getByCategoryId(Long categoryId);
ServiceImpl层
//根据分类id查询菜品
@Override
public List<Dish> getByCategoryId(Long categoryId) {
return dishMapper.getByCategoryId(categoryId);
}
Mapper层
//根据分类id查询菜品
List<Dish> getByCategoryId(Long categoryId);
DishMapper.xml
<select id="getByCategoryId" resultType="com.sky.entity.Dish">
select *from dish
where status=1
<if test="categoryId!=null">
and category_id=#{categoryId}
</if>
order by create_time desc
</select>
新增套餐
实体类
在sky-pojo的DTO中新建SetmealDTO
package com.sky.dto;
import com.sky.entity.SetmealDish;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
@Data
public class SetmealDTO implements Serializable {
private Long id;
//分类id
private Long categoryId;
//套餐名称
private String name;
//套餐价格
private BigDecimal price;
//状态 0:停用 1:启用
private Integer status;
//描述信息
private String description;
//图片
private String image;
//套餐菜品关系
private List<SetmealDish> setmealDishes = new ArrayList<>();
}
mapper层
在sky-server中
//新增套餐
@PostMapping
@ApiOperation("新增套餐")
public Result<String> save(@RequestBody SetmealDTO setmealDTO){
log.info("新增套餐:{}",setmealDTO);
setmealService.saveWithDish(setmealDTO);
return Result.success();
}
Service层
在sky-server中
//新增套餐
void saveWithDish(SetmealDTO setmealDTO);
ServiceImpl层
//新增套餐
@Override
public void saveWithDish(SetmealDTO setmealDTO) {
Setmeal setmeal = new Setmeal();
BeanUtils.copyProperties(setmealDTO,setmeal);
//向套餐表中插入1条数据
setmealMapper.insert(setmeal);
//获取insert语句生成的主键值
Long setmealId = setmeal.getId();
List<SetmealDish> setmealDishes = setmealDTO.getSetmealDishes();
/* setmealDishes.forEach(setmealDish -> {
setmealDish.setDishId(setmealId);*/
setmealDishes.forEach(setmealDish -> {
setmealDish.setDishId(setmealId);
});
//向套餐关联的菜品表中插入n条数据
SetmealDishMapper.insertBatch(setmealDishes);
}
Mapper层
//插入套餐数据
@AutoFill(value = OperationType.INSERT)
void insert(Setmeal setmeal);
SetmealMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.sky.mapper.SetmealMapper">
<insert id="insert" useGeneratedKeys="true" keyProperty="id">
insert into setmeal(category_id, name, price, description, image,
create_time, update_time, create_user, update_user)
VALUES (#{categoryId},#{name},#{price},#{description},#{image},
#{createTime},#{updateTime},#{createUser},#{updateUser})
</insert>
</mapper>
setmealDishMapper.xml
<insert id="insertBatch">
insert into setmeal_dish(setmeal_id, dish_id, name, price, copies)
VALUES
<foreach collection="setmealDishs" item="sd" separator=",">
(#{sd.setmealId},#{sd.dishId},#{sd.name},#{sd.price},#{sd.copies})
</foreach>
</insert>
套餐分页查询
需求分析和设计
业务规则:
-
根据页码展示菜品信息
-
每页展示10条数据
-
分页查询时可以根据需要输入套餐名称、套餐分类、套餐状态进行查询
代码开发
设计DTO类
根据菜品分页查询接口定义设计对应的DTO:
在sky-pojo模块中
package com.sky.dto;
import lombok.Data;
import java.io.Serializable;
@Data
public class SetmealPageQueryDTO implements Serializable {
private int page;
private int pageSize;
private String name;
//分类id
private Integer categoryId;
//状态 0表示禁用 1表示启用
private Integer status;
}
Controller层
//套餐分页查询
@GetMapping("/page")
@ApiOperation("套餐分页查询")
public Result<PageResult> page(SetmealPageQueryDTO setmealPageQueryDTO){
log.info("套餐分页查询:{}",setmealPageQueryDTO);
PageResult pageResult=setmealService.pageQuery(setmealPageQueryDTO);
return Result.success(pageResult);
}
Service层
//套餐分页查询
PageResult pageQuery(SetmealPageQueryDTO setmealPageQueryDTO);
ServiceImpl
//套餐分页查询
@Override
public PageResult pageQuery(SetmealPageQueryDTO setmealPageQueryDTO) {
PageHelper.startPage(setmealPageQueryDTO.getPage(),setmealPageQueryDTO.getPageSize());
Page<SetmealVO> page=setmealMapper.pageQuery(setmealPageQueryDTO);
return new PageResult(page.getTotal(),page.getResult());
}
Mapper
//套餐分页查询
Page<SetmealVO> pageQuery(SetmealPageQueryDTO setmealPageQueryDTO);
SetmealMapper.xml
<select id="pageQuery" resultType="com.sky.vo.SetmealVO">
select s.*,c.name as categoryName from setmeal s left join category c on s.category_id=c.id
<where>
<if test="name!=null and name!=''">
and s.name like concat('%',#{name},'%')
</if>
<if test="categoryId!=null">
and s.category_id=#{categoryId}
</if>
<if test="status!=null ">
and s.status=#{status}
</if>
</where>
order by s.create_time desc
</select>