D4
本文记录「苍穹外卖」项目开发中的关键技术实践与踩坑思考,包含个人在实际开发中的具体过程 与遇到的问题 以及知识点总结
希望可以给一起学习的大家带来帮助
文章目录
1.新增套餐
1.1根据分类id查询菜品
1.DishController
java
//根据分类id查询菜品
@GetMapping("/list")
public Result<List<Dish>> list(Long categoryId){
log.info("根据分类id查询菜品:{}",categoryId);
List<Dish> dishList = dishService.list(categoryId);
return Result.success();
}
2.DishServiceImpl
java
//根据种类id查询菜品
@Override
public List<Dish> list(Long categoryId) {
Dish dish = Dish.builder()
.categoryId(categoryId)
.build();
List<Dish> dishList = dishMapper.list(dish);
return dishList;
}
3.DishMapper
直接使用动态查询,以后相关查询都可以调用这个list方法
java
//动态条件查询菜品
List<Dish> list(Dish dish);
4.DishMapper.xml
xml
<select id="list" resultType="com.sky.entity.Dish">
select * from dish
<where>
<if test="name != null">and name like concat('%',#{name},'%')</if>
<if test="categoryId != null">and category_id = #{categoryId}</if>
<if test="status != null">and status = #{status}</if>
</where>
order by create_time desc
</select>
1.2新增套餐
1.SetmealController
java
//新增套餐
@PostMapping
public Result save(@RequestBody SetmealDTO setmealDTO){
log.info("新增套餐:{}",setmealDTO);
setmealService.save(setmealDTO);
return Result.success();
}
2.SetmealServiceImpl
java
//新增套餐
@Transactional
@Override
public void save(SetmealDTO setmealDTO) {
//插入套餐数据
Setmeal setmeal = new Setmeal();
BeanUtils.copyProperties(setmealDTO,setmeal);
setmealMapper.insert(setmeal);
Long setmealId = setmeal.getId();
List<SetmealDish> setmealDishes = setmealDTO.getSetmealDishes();
setmealDishes.forEach(setmealDish -> {
//给套餐里的每个菜品设置套餐id
setmealDish.setSetmealId(setmealId);
});
//插入套餐和菜品的关联关系
setmealDishMapper.insertBatch(setmealDishes);
}
3.SetmealMapper
java
/**
* 新增套餐
* @param setmeal
*/
@AutoFill(OperationType.INSERT)
void insert(Setmeal setmeal);
4.SetmealMapper.xml
xml
<insert id="insert" parameterType="Setmeal" useGeneratedKeys="true" keyProperty="id">
insert into setmeal
(category_id, name, price, status, description, image, create_time, update_time, create_user, update_user)
values (#{categoryId}, #{name}, #{price}, #{status}, #{description}, #{image}, #{createTime}, #{updateTime},
#{createUser}, #{updateUser})
</insert>
5.SetmealDishMapper
java
/**
* 批量保存套餐和菜品的关联关系
* @param setmealDishes
*/
void insertBatch(List<SetmealDish> setmealDishes);
6.SetmealDishMapper.xml
xml
<insert id="insertBatch" parameterType="list">
insert into setmeal_dish
(setmeal_id,dish_id,name,price,copies)
values
<foreach collection="setmealDishes" item="sd" separator=",">
(#{sd.setmealId},#{sd.dishId},#{sd.name},#{sd.price},#{sd.copies})
</foreach>
</insert>
2.分页查询
1. SetmealController
java
/**
* 分页查询
* @param setmealPageQueryDTO
* @return
*/
@GetMapping("/page")
@ApiOperation("分页查询")
public Result<PageResult> page(SetmealPageQueryDTO setmealPageQueryDTO) {
PageResult pageResult = setmealService.pageQuery(setmealPageQueryDTO);
return Result.success(pageResult);
}
SetmealServiceImpl
java
//分页查询
public PageResult pageQuery(SetmealPageQueryDTO setmealPageQueryDTO) {
int pageNum = setmealPageQueryDTO.getPage();
int pageSize = setmealPageQueryDTO.getPageSize();
PageHelper.startPage(pageNum, pageSize);
Page<SetmealVO> page = setmealMapper.pageQuery(setmealPageQueryDTO);
return new PageResult(page.getTotal(), page.getResult());
}
SetmealMapper
java
//分页查询
Page<SetmealVO> pageQuery(SetmealPageQueryDTO setmealPageQueryDTO);
4.SetmealMapper.xml
xml
<select id="pageQuery" resultType="com.sky.vo.SetmealVO">
select
s.*,c.name categoryName
from
setmeal s
left join
category c
on
s.category_id = c.id
<where>
<if test="name != null">
and s.name like concat('%',#{name},'%')
</if>
<if test="status != null">
and s.status = #{status}
</if>
<if test="categoryId != null">
and s.category_id = #{categoryId}
</if>
</where>
order by s.create_time desc
</select>
3.删除套餐
业务规则:
- 可以一次删除一个套餐,也可以批量删除套餐
- 起售中的套餐不能删除
SetmealController
java
/**
* 批量删除套餐
* @param ids
* @return
*/
@DeleteMapping
@ApiOperation("批量删除套餐")
public Result delete(@RequestParam List<Long> ids){
setmealService.deleteBatch(ids);
return Result.success();
}
SetmealService
java
/**
* 批量删除套餐
* @param ids
*/
void deleteBatch(List<Long> ids);
SetmealServiceImpl
java
/**
* 批量删除套餐
* @param ids
*/
@Transactional
public void deleteBatch(List<Long> ids) {
ids.forEach(id -> {
Setmeal setmeal = setmealMapper.getById(id);
if(StatusConstant.ENABLE == setmeal.getStatus()){
//起售中的套餐不能删除
throw new DeletionNotAllowedException(MessageConstant.SETMEAL_ON_SALE);
}
});
ids.forEach(setmealId -> {
//删除套餐表中的数据
setmealMapper.deleteById(setmealId);
//删除套餐菜品关系表中的数据
setmealDishMapper.deleteBySetmealId(setmealId);
});
}
4. SetmealMapper
java
/**
* 根据id查询套餐
* @param id
* @return
*/
@Select("select * from setmeal where id = #{id}")
Setmeal getById(Long id);
/**
* 根据id删除套餐
* @param setmealId
*/
@Delete("delete from setmeal where id = #{id}")
void deleteById(Long setmealId);
SetmealDishMapper
java
/**
* 根据套餐id删除套餐和菜品的关联关系
* @param setmealId
*/
@Delete("delete from setmeal_dish where setmeal_id = #{setmealId}")
void deleteBySetmealId(Long setmealId);
4.修改套餐
接口设计(共涉及到5个接口):
- 根据id查询套餐
- 根据类型查询分类(已完成)
- 根据分类id查询菜品(已完成)
- 图片上传(已完成)
- 修改套餐
4.1根据id查询套餐及其菜品信息
controller层
java
//根据id查询套餐以及相关菜品
@GetMapping("/{id}")
public Result<SetmealVO> getById(@PathVariable Long id){
log.info("根据id查询套餐:{}",id);
SetmealVO setmealVO = setmealService.getByIdWithDish(id);
return Result.success(setmealVO);
}
ServiceImpl
java
//根据id查询套餐及其菜品信息
@Override
public SetmealVO getByIdWithDish(Long id) {
//获取套餐信息
Setmeal setmeal = setmealMapper.getById(id);
//获取相关菜品信息
List<SetmealDish> setmealDishes = setmealDishMapper.getBySetmealId(id);
SetmealVO setmealVO = new SetmealVO();
BeanUtils.copyProperties(setmeal,setmealVO);
setmealVO.setSetmealDishes(setmealDishes);
return setmealVO;
}
Mapper层
java
//根据套餐id查询菜品
@Select("select * from setmeal_dish where setmeal_id = #{setmealId}")
List<SetmealDish> getBySetmealId(Long setmealId);
4.2修改套餐
Controller层
java
//修改套餐
@PutMapping
public Result update(@RequestBody SetmealDTO setmealDTO){
log.info("修改套餐:{}",setmealDTO);
setmealService.update(setmealDTO);
return Result.success();
}
ServiceImpl
java
//修改套餐
@Transactional
@Override
public void update(SetmealDTO setmealDTO) {
//修改套餐信息
Setmeal setmeal = new Setmeal();
BeanUtils.copyProperties(setmealDTO,setmeal);
setmealMapper.update(setmeal);
//修改关联菜品信息-先删除再添加
Long setmealId = setmeal.getId();
setmealDishMapper.deleteBySetmealId(setmealId);
List<SetmealDish> setmealDishes = setmealDTO.getSetmealDishes();
setmealDishes.forEach(setmealDish -> {
setmealDish.setSetmealId(setmealId);
});
setmealDishMapper.insertBatch(setmealDishes);
}
Mapper层
java
//根据id修改套餐
@AutoFill(OperationType.UPDATE)
void update(Setmeal setmeal);
xml
java
<update id="update">
update setmeal
<set>
<if test="name != null">name = #{name},</if>
<if test="categoryId != null">
category_id = #{categoryId},
</if>
<if test="price != null">
price = #{price},
</if>
<if test="status != null">
status = #{status},
</if>
<if test="description != null">
description = #{description},
</if>
<if test="image != null">
image = #{image},
</if>
<if test="updateTime != null">
update_time = #{updateTime},
</if>
<if test="updateUser != null">
update_user = #{updateUser}
</if>
</set>
where id = #{id}
</update>
5.起售停售套餐
Controller层
java
//起售停售
@PostMapping("/status/{status}")
public Result setStatus(@PathVariable Integer status,Long id){
log.info("修改状态,套餐id为:{}",id);
setmealService.setStatus(status,id);
return Result.success();
}
ServiceImpl
java
//起售停售
@Override
public void setStatus(Integer status, Long id) {
//起售时,先判断套餐内是否有停售菜品
if(status == StatusConstant.ENABLE){
List<Dish> dishList = dishMapper.getBySetmealId(id);
if(dishList != null && dishList.size() > 0){
dishList.forEach(dish -> {
if(StatusConstant.DISABLE == dish.getStatus()){
throw new SetmealEnableFailedException(MessageConstant.SETMEAL_ENABLE_FAILED);
}
});
}
}
Setmeal setmeal = Setmeal.builder()
.id(id)
.status(status)
.build();
setmealMapper.update(setmeal);
}
