当前位置: 首页 > article >正文

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

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

文章目录

  • 10 套餐管理
    • 10.5 修改套餐
      • 10.5.1 需求分析
      • 10.5.2 具体实现
    • 10.6 (批量)删除套餐
      • 10.6.1 需求分析
      • 10.6.2 具体实现
    • 10.7 (批量)起售/停售套餐
      • 10.7.1 需求分析
      • 10.7.2 具体实现
    • 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

该接口的入参如下:

{
    "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属性
// com.itweid.takeout.entity.Setmeal

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

@ApiOperation("根据ID查询套餐")
@GetMapping("/get")
public BaseResult<Setmeal> get(Long id) {
    return setmealService.getSetmealById(id);
}
  • 3)在SetmealServiceImpl类中具体实现getSetmealById方法
// 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方法
// com.itweid.takeout.controller.SetmealController

@ApiOperation("修改套餐")
@PutMapping("/edit")
public BaseResult edit(@RequestBody @Validated(Edit.class) SetmealQuery setmealQuery) {
    return setmealService.editSetmeal(setmealQuery);
}
  • 7)在SetmealServiceImpl类中具体实现editSetmeal方法
// 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方法
// com.itweid.takeout.controller.SetmealController

@ApiOperation("(批量)删除套餐")
@DeleteMapping("/delete")
public BaseResult delete(@NotBlank(message = "套餐ID不能为空") String ids) {
    return setmealService.deleteSetmeals(ids);
}
  • 2)在SetmealServiceImpl类中具体实现deleteSetmeals方法
// 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类添加修改套餐状态的参数,并设置表单校验规则
// 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方法
// com.itweid.takeout.controller.SetmealController

@ApiOperation("(批量)启售/停售套餐")
@PostMapping("/status")
public BaseResult status(@RequestBody @Validated(EditStatus.class) SetmealQuery setmealQuery) {
    return setmealService.editSetmealStatus(setmealQuery);
}
  • 3)在SetmealServiceImpl类中具体实现editSetmealStatus方法
// 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方法:

// 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);
}

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


http://www.kler.cn/a/469093.html

相关文章:

  • 行业商机信息付费小程序系统开发方案
  • HashMap总结使用+原理+面试
  • 机器人手眼标定
  • 力扣第137题:只出现一次的数字 II C语言解法
  • 华为设备的VRP系统详解
  • vue2项目报错You may need an appropriate loader to handle this file type
  • 云原生监控与日志管理:确保云原生应用的可靠性与性能
  • Spring MVC和servlet
  • 【2025最新计算机毕业设计】基于SSM的医院挂号住院系统(高质量源码,提供文档,免费部署到本地)【提供源码+答辩PPT+文档+项目部署】
  • 西安电子科技大学初/复试笔试、面试、机试成绩占比
  • 初学stm32 --- RTC实时时钟
  • Pytest钩子函数,测试框架动态切换测试环境
  • 《Rust权威指南》学习笔记(二)
  • Node.js中使用Joi 和 express-joi-validation进行数据验证和校验
  • Win32汇编学习笔记04.重定位与汇编引擎
  • ubuntu 创建服务、查看服务日志
  • Linux-Ubuntu之RTC实时时钟显示
  • 使用 ThinkPHP 和 Vue.js 开发现代 Web 应用的指南
  • Swift Protocols(协议)、Extensions(扩展)、Error Handling(错误处理)、Generics(泛型)
  • c++第13课
  • VisualRules规则引擎语法介绍
  • Structured-Streaming集成Kafka
  • vue3组件化开发优势劣势分析,及一个案例
  • spring mvc源码学习笔记之二
  • 在 C# 中合并和解析相对路径
  • 探索 INFINI Console:提升 Elasticsearch 管理效率的新利器