瑞吉外卖项目学习笔记(十)修改套餐、删除套餐、起售和停售套餐

瑞吉外卖项目学习笔记(一)准备工作、员工登录功能实现
瑞吉外卖项目学习笔记(二)Swagger、logback、表单校验和参数打印功能的实现
瑞吉外卖项目学习笔记(三)过滤器实现登录校验、添加员工、分页查询员工信息
瑞吉外卖项目学习笔记(四)@TableField(fill = FieldFill.INSERT)公共字段填充、启用/禁用/修改员工信息
瑞吉外卖项目学习笔记(五)菜品/套餐分类的增删改查
瑞吉外卖项目学习笔记(六)分页查询菜品列表、实现图片上传和下载
瑞吉外卖项目学习笔记(七)新增菜品、(批量)删除菜品
瑞吉外卖项目学习笔记(八)修改菜品信息、批量启售/停售菜品
瑞吉外卖项目学习笔记(九)套餐列表分页查询、新增套餐、图片上传和下载

文章目录

  • [10 套餐管理](#10 套餐管理)
    • [10.5 修改套餐](#10.5 修改套餐)
      • [10.5.1 需求分析](#10.5.1 需求分析)
      • [10.5.2 具体实现](#10.5.2 具体实现)
    • [10.6 (批量)删除套餐](#10.6 (批量)删除套餐)
      • [10.6.1 需求分析](#10.6.1 需求分析)
      • [10.6.2 具体实现](#10.6.2 具体实现)
    • [10.7 (批量)起售/停售套餐](#10.7 (批量)起售/停售套餐)
      • [10.7.1 需求分析](#10.7.1 需求分析)
      • [10.7.2 具体实现](#10.7.2 具体实现)
    • [10.8 完善删除套餐分类功能](#10.8 完善删除套餐分类功能)

10 套餐管理

10.5 修改套餐

10.5.1 需求分析

  • 用户点击"修改套餐"按钮,进入修改页面;

  • 自动加载"套餐分类"下拉框,用户可以选择套餐分类,直接使用已经开发好的分页查询分类列表/category/page接口:

  • 自动加载"菜品"列表,用户可将菜品添加到当前套餐中,直接使用已经开发好的菜品列表分页查询接口/dish/page:
  • 用户可以上传套餐图片,直接使用已经开发好的文件上传/common/upload接口:
  • 用户可以查看套餐图片,直接使用已经开发好的文件下载/common/download接口:
  • 根据套餐ID查询套餐,回显当前套餐的信息:
功能 请求方法 请求路径 请求参数
根据ID查询套餐信息 GET /setmeal/get ?id=1
  • 用户在修改完所有信息后,点击"保存"按钮修改套餐信息:
功能 请求方法 请求路径
修改套餐 PUT /setmeal/edit

该接口的入参如下:

json 复制代码
{
    "id": "1", //套餐ID
    "name":"3人套餐", //套餐名称
    "categoryId":"1413342269393674242", //套餐分类ID
    "price":3300, //套餐价格
    "image":"876ea3ae-4f70-4cba-bd76-e7c2daa29c2f.jpg", //套餐图片
    "description":"3人套餐真好吃!", //套餐描述
    "status":1, //套餐状态,默认1启售
    "setmealDishes":[ //套餐菜品
        {
            "copies":3, //菜品份数
            "dishId":"1397851668262465537", //菜品分类ID
            "name":"口味蛇", //菜品名称
            "price":16800 //菜品单价
            
        },{
            "copies":3,
            "dishId":"1397852391150759938",
            "name":"辣子鸡丁",
            "price":8800
            
        },{
            "copies":3,
            "dishId":"1397853183287013378",
            "name":"麻辣兔头",
            "price":19800
            
        }
    ]
}

10.5.2 具体实现

  • 1)在Setmeal类添加套餐菜品关系setmealDishes属性
java 复制代码
// com.itweid.takeout.entity.Setmeal

@ApiModelProperty(value = "套餐菜品关系")
@TableField(exist = false)
private SetmealDish[] setmealDishes;
  • 2)在SetmealController类添加根据ID查询套餐的get方法
java 复制代码
// com.itweid.takeout.controller.SetmealController

@ApiOperation("根据ID查询套餐")
@GetMapping("/get")
public BaseResult<Setmeal> get(Long id) {
    return setmealService.getSetmealById(id);
}
  • 3)在SetmealServiceImpl类中具体实现getSetmealById方法
java 复制代码
// com.itweid.takeout.service.impl.SetmealServiceImpl

@Override
public BaseResult<Setmeal> getSetmealById(Long id) {
    // 查询套餐信息
    Setmeal setmeal = getById(id);
    // 查询套餐菜品信息
    if(setmeal != null) {
        List<SetmealDish> setmealDishList = Db.lambdaQuery(SetmealDish.class)
                .eq(SetmealDish::getSetmealId, setmeal.getId())
                .list();
        if(setmealDishList != null && !setmealDishList.isEmpty()) {
            setmeal.setSetmealDishes(setmealDishList.toArray(new SetmealDish[0]));
        }
    }
    return BaseResult.success(setmeal);
}
  • 4)回显数据功能测试
  • 5)在SetmealQuery类添加修改套餐的参数,并设置表单校验规则
  • 6)在SetmealController类添加修改套餐的edit方法
java 复制代码
// com.itweid.takeout.controller.SetmealController

@ApiOperation("修改套餐")
@PutMapping("/edit")
public BaseResult edit(@RequestBody @Validated(Edit.class) SetmealQuery setmealQuery) {
    return setmealService.editSetmeal(setmealQuery);
}
  • 7)在SetmealServiceImpl类中具体实现editSetmeal方法
java 复制代码
// com.itweid.takeout.service.impl.SetmealServiceImpl

@Value("${dir.upload}")
private String uploadDir;

@Override
@Transactional(rollbackFor = Exception.class)
public BaseResult editSetmeal(SetmealQuery setmealQuery) {
    // 1 查询原套餐信息
    Setmeal exSetmeal = getById(setmealQuery.getId());
    if(exSetmeal == null) {
        return BaseResult.error(ErrorCode.SETMEAL_NOT_EXIST);
    }
    // 2 修改套餐信息
    Setmeal newSetmeal = new Setmeal();
    newSetmeal.setId(exSetmeal.getId());
    if(!exSetmeal.getName().equals(setmealQuery.getName())) {
        // 校验新套餐名是否已存在
        if(lambdaQuery().eq(Setmeal::getName, setmealQuery.getName()).exists()) {
            return BaseResult.error(ErrorCode.SETMEAL_EXIST);
        }
        newSetmeal.setName(setmealQuery.getName());
    }
    if(!exSetmeal.getCategoryId().toString().equals(setmealQuery.getCategoryId())) {
        newSetmeal.setCategoryId(Long.valueOf(setmealQuery.getCategoryId()));
    }
    if(!exSetmeal.getPrice().equals(setmealQuery.getPrice())) {
        newSetmeal.setPrice(setmealQuery.getPrice());
    }
    if(!exSetmeal.getImage().equals(setmealQuery.getImage())) {
        newSetmeal.setImage(setmealQuery.getImage());
    }
    if(!exSetmeal.getDescription().equals(setmealQuery.getDescription())) {
        newSetmeal.setDescription(setmealQuery.getDescription());
    }
    updateById(newSetmeal);
    // 3 修改套餐菜品信息
    SetmealDish[] setmealDishes = setmealQuery.getSetmealDishes();
    if(setmealDishes != null && setmealDishes.length > 0) {
        // 删除原有菜品
        Db.lambdaUpdate(SetmealDish.class)
                .eq(SetmealDish::getSetmealId, exSetmeal.getId())
                .remove();
        // 增加新菜品
        for(SetmealDish setmealDish : setmealDishes) {
            setmealDish.setSetmealId(exSetmeal.getId().toString());
            Db.save(setmealDish);
        }
    }
    // 4 删除旧的套餐图片
    if(!exSetmeal.getImage().equals(setmealQuery.getImage())) {
        File file = new File(uploadDir + exSetmeal.getImage());
        if(file.exists()) {
            log.info("delete file = {} => {}", file.getAbsolutePath(), file.delete());
        }
    }
    return BaseResult.success();
}
  • 8)测试修改套餐功能

10.6 (批量)删除套餐

10.6.1 需求分析

用户点击套餐记录操作栏的"删除"按钮,即可删除该套餐;或者用户勾选需要删除的套餐后,点击右上角的"批量删除"按钮,即可同时删除多个套餐。

后端只需要根据前端传递的套餐IDs删除对应的套餐即可:

功能 请求方法 请求路径 请求参数
根据IDs删除/批量删除套餐信息 DELETE /setmeal/delete ?ids=1,2,3

10.6.2 具体实现

  • 1)在SetmealController类添加根据IDs删除套餐的delete方法
java 复制代码
// com.itweid.takeout.controller.SetmealController

@ApiOperation("(批量)删除套餐")
@DeleteMapping("/delete")
public BaseResult delete(@NotBlank(message = "套餐ID不能为空") String ids) {
    return setmealService.deleteSetmeals(ids);
}
  • 2)在SetmealServiceImpl类中具体实现deleteSetmeals方法
java 复制代码
// com.itweid.takeout.service.impl.SetmealServiceImpl

@Override
public BaseResult deleteSetmeals(String ids) {
    for (String id : ids.split(",")) {
        // 根据ID修改套餐删除状态
        Setmeal setmeal = new Setmeal();
        setmeal.setId(Long.valueOf(id));
        setmeal.setIsDeleted(StatusCode.HAD_DEL.getCode());
        updateById(setmeal);
    }
    return BaseResult.success();
}
  • 3)测试删除套餐功能
  • 4)测试批量删除套餐功能

10.7 (批量)起售/停售套餐

10.7.1 需求分析

用户点击套餐记录操作栏的"起售"或"停售"按钮,即可起售或停售该套餐;或者用户勾选需要起售/停售的套餐后,点击右上角的"批量起售"或"批量停售"按钮,即可同时起售或停售多个套餐。

对后端来说,起售和停售都只是修改套餐的状态而已,后端只需要根据前端传递的套餐ID修改对应的套餐的状态即可:

功能 请求方法 请求路径 请求参数
根据ID(批量)起售/停售套餐信息 POST /setmeal/status {"id":1, "status":1}

10.7.2 具体实现

  • 1)在SetmealQuery类添加修改套餐状态的参数,并设置表单校验规则
java 复制代码
// com.itweid.takeout.entity.SetmealQuery

@ApiModelProperty("套餐ID")
@NotBlank(groups = {Edit.class, EditStatus.class}, message = "套餐ID不能为空")
private String id;

@ApiModelProperty("套餐状态")
@NotNull(groups = {EditStatus.class}, message = "套餐状态不能为空")
private Integer status;
  • 2)在SetmealController类添加根据ID修改套餐状态的ststus方法
java 复制代码
// com.itweid.takeout.controller.SetmealController

@ApiOperation("(批量)启售/停售套餐")
@PostMapping("/status")
public BaseResult status(@RequestBody @Validated(EditStatus.class) SetmealQuery setmealQuery) {
    return setmealService.editSetmealStatus(setmealQuery);
}
  • 3)在SetmealServiceImpl类中具体实现editSetmealStatus方法
java 复制代码
// com.itweid.takeout.service.impl.SetmealServiceImpl

@Override
public BaseResult editSetmealStatus(SetmealQuery setmealQuery) {
    String ids = setmealQuery.getId();
    for (String id : ids.split(",")) {
        // 根据ID修改套餐状态
        Setmeal setmeal = new Setmeal();
        setmeal.setId(Long.valueOf(id));
        setmeal.setStatus(setmealQuery.getStatus());
        updateById(setmeal);
    }
    return BaseResult.success();
}
  • 4)测试功能

10.8 完善删除套餐分类功能

在"分类管理"菜单中,进行删除套餐分类时,需要先判断该套餐分类是否已被套餐使用。如果已被使用,则不能删除。

改造CategoryServiceImpl类的deleteCategory方法:

java 复制代码
// com.itweid.takeout.service.impl.CategoryServiceImpl

@Override
public BaseResult deleteCategory(Long id) {
    // 判断该分类是否已被菜品使用
    if(Db.lambdaQuery(Dish.class)
            .eq(Dish::getCategoryId, id)
            .exists()) {
        return BaseResult.error(ErrorCode.CATEGORY_IS_USED);
    }
    // 判断该分类是否已被套餐使用
    if(Db.lambdaQuery(Setmeal.class)
            .eq(Setmeal::getCategoryId, id)
            .exists()) {
        return BaseResult.error(ErrorCode.CATEGORY_IS_USED);
    }
    boolean remove = removeById(id);
    return remove ? BaseResult.success() : BaseResult.error(ErrorCode.CATEGORY_NOT_EXIST);
}

...

本节完,更多内容查阅:瑞吉外卖项目实战

相关推荐
JermeryBesian37 分钟前
Flink概念知识讲解之:Restart重启策略配置
java·flink·apache
天草二十六_简村人41 分钟前
微服务框架,Http异步编程中,如何保证数据的最终一致性
java·spring boot·后端·http·微服务·架构
小馋喵知识杂货铺42 分钟前
XPath语法详解及案例讲解
java·前端·javascript
一二小选手44 分钟前
【SpringBoot】日志处理-异常日志(Logback)
java·spring boot·后端·logback
来一杯龙舌兰1 小时前
【Jboss/Windows】Tomcat 8 + JDK 8 升级为 Jboss eap 7 + JDK8
java·windows·tomcat·jboss·jboss升级·tomcat迁移
夏壹-10分分享1 小时前
get和post有什么区别
java
龙之叶1 小时前
Android13实时刷新频率的实现代码
android·java·ui
上海拔俗网络1 小时前
“AI智慧语言训练系统:让语言学习变得更简单有趣
java·团队开发
HelloZheQ2 小时前
Spring MVC 介绍与实践
java·spring·mvc