瑞吉外卖项目学习笔记(九)套餐列表分页查询、新增套餐、图片上传和下载

发布于:2025-02-11 ⋅ 阅读:(27) ⋅ 点赞:(0)

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

10 套餐管理

10.1 需求分析

在“套餐管理”页面,实现以下功能:

  • 套餐列表分页查询
  • 新增套餐
  • 修改套餐
  • (批量)启售/停售套餐
  • (批量)删除套餐

10.2 数据准备

10.2.1 套餐表t_setmeal

在数据库新建套餐表t_setmeal

DROP TABLE IF EXISTS `t_setmeal`;
CREATE TABLE `t_setmeal` (
     `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
     `category_id` bigint(20) NOT NULL COMMENT '菜品分类id',
     `name` varchar(64) COLLATE utf8_bin NOT NULL COMMENT '套餐名称',
     `price` decimal(10,2) NOT NULL COMMENT '套餐价格',
     `status` int(11) DEFAULT NULL COMMENT '状态 0:停用 1:启用',
     `code` varchar(32) COLLATE utf8_bin DEFAULT NULL COMMENT '编码',
     `description` varchar(512) COLLATE utf8_bin DEFAULT NULL COMMENT '描述信息',
     `image` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '图片',
     `create_time` datetime NOT NULL COMMENT '创建时间',
     `update_time` datetime NOT NULL COMMENT '更新时间',
     `create_user` bigint(20) NOT NULL COMMENT '创建人',
     `update_user` bigint(20) NOT NULL COMMENT '修改人',
     `is_deleted` int(11) NOT NULL DEFAULT '0' COMMENT '是否删除',
     PRIMARY KEY (`id`) USING BTREE,
     UNIQUE KEY `idx_setmeal_name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='套餐';

INSERT INTO `t_setmeal` VALUES ('1415580119015145474', '1413386191767674881', '儿童套餐A计划', '4000.00', '1', '', '', '61d20592-b37f-4d72-a864-07ad5bb8f3bb.jpg', '2021-07-15 15:52:55', '2021-07-15 15:52:55', '1415576781934608386', '1415576781934608386', '0');

使用MyBatisPlus插件生成代码:

Setmeal实体类的公共字段添加注解,其余字段保持默认:

// com.itweid.takeout.entity.Setmeal

@ApiModelProperty(value = "主键")
@TableId(value = "id", type = IdType.AUTO)
@JsonSerialize(using = ToStringSerializer.class)
private Long id;

@ApiModelProperty(value = "菜品分类id")
@JsonSerialize(using = ToStringSerializer.class)
private Long categoryId;

@ApiModelProperty(value = "创建时间")
@TableField(fill = FieldFill.INSERT)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;

@ApiModelProperty(value = "更新时间")
@TableField(fill = FieldFill.INSERT_UPDATE)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime updateTime;

@ApiModelProperty(value = "创建人")
@TableField(fill = FieldFill.INSERT)
@JsonSerialize(using = ToStringSerializer.class)
private Long createUser;

@ApiModelProperty(value = "修改人")
@TableField(fill = FieldFill.INSERT_UPDATE)
@JsonSerialize(using = ToStringSerializer.class)
private Long updateUser;

创建查询对象SetmealQuery

@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ApiModel(value="SetmealQuery对象", description="套餐查询对象")
public class SetmealQuery extends BaseQuery {
    
    @ApiModelProperty("套餐名称")
    private String name;
}

10.2.2 套餐菜品关系表t_setmeal_dish

在数据库新建套餐菜品关系表t_setmeal_dish

DROP TABLE IF EXISTS `t_setmeal_dish`;
CREATE TABLE `t_setmeal_dish` (
      `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
      `setmeal_id` varchar(32) COLLATE utf8_bin NOT NULL COMMENT '套餐id ',
      `dish_id` varchar(32) COLLATE utf8_bin NOT NULL COMMENT '菜品id',
      `name` varchar(32) COLLATE utf8_bin DEFAULT NULL COMMENT '菜品名称 (冗余字段)',
      `price` decimal(10,2) DEFAULT NULL COMMENT '菜品原价(冗余字段)',
      `copies` int(11) NOT NULL COMMENT '份数',
      `sort` int(11) NOT NULL DEFAULT '0' COMMENT '排序',
      `create_time` datetime NOT NULL COMMENT '创建时间',
      `update_time` datetime NOT NULL COMMENT '更新时间',
      `create_user` bigint(20) NOT NULL COMMENT '创建人',
      `update_user` bigint(20) NOT NULL COMMENT '修改人',
      `is_deleted` int(11) NOT NULL DEFAULT '0' COMMENT '是否删除',
      PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='套餐菜品关系';

INSERT INTO `t_setmeal_dish` VALUES ('1415580119052894209', '1415580119015145474', '1397862198033297410', '老火靓汤', '49800.00', '1', '0', '2021-07-15 15:52:55', '2021-07-15 15:52:55', '1415576781934608386', '1415576781934608386', '0');
INSERT INTO `t_setmeal_dish` VALUES ('1415580119061282817', '1415580119015145474', '1413342036832100354', '北冰洋', '500.00', '1', '0', '2021-07-15 15:52:55', '2021-07-15 15:52:55', '1415576781934608386', '1415576781934608386', '0');
INSERT INTO `t_setmeal_dish` VALUES ('1415580119069671426', '1415580119015145474', '1413385247889891330', '米饭', '200.00', '1', '0', '2021-07-15 15:52:55', '2021-07-15 15:52:55', '1415576781934608386', '1415576781934608386', '0');

使用MyBatisPlus插件生成代码:

SetmealDish实体类的公共字段添加注解,其余字段保持默认:

// com.itweid.takeout.entity.SetmealDish

@ApiModelProperty(value = "主键")
@TableId(value = "id", type = IdType.AUTO)
@JsonSerialize(using = ToStringSerializer.class)
private Long id;

@ApiModelProperty(value = "套餐id ")
@JsonSerialize(using = ToStringSerializer.class)
private String setmealId;

@ApiModelProperty(value = "菜品id")
@JsonSerialize(using = ToStringSerializer.class)
private String dishId;

@ApiModelProperty(value = "创建时间")
@TableField(fill = FieldFill.INSERT)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;

@ApiModelProperty(value = "更新时间")
@TableField(fill = FieldFill.INSERT_UPDATE)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime updateTime;

@ApiModelProperty(value = "创建人")
@TableField(fill = FieldFill.INSERT)
@JsonSerialize(using = ToStringSerializer.class)
private Long createUser;

@ApiModelProperty(value = "修改人")
@TableField(fill = FieldFill.INSERT_UPDATE)
@JsonSerialize(using = ToStringSerializer.class)
private Long updateUser;

10.3 套餐列表分页查询

10.3.1 需求分析

支持根据根据套餐名称进行模糊查询;支持分页查询。

功能 请求方法 请求路径 请求参数
套餐列表分页查询 GET /setmeal/page ?page=1&pageSize=10&name=“3人套餐”

10.3.2 具体实现

  • 1)在Setmeal实体类中添加categoryName字段
// com.itweid.takeout.entity.Setmeal

@ApiModelProperty(value = "套餐分类名称")
@TableField(exist = false)
private String categoryName;
  • 2)在SetmealController类中添加page方法
// com.itweid.takeout.controller.SetmealController

@ApiOperation("套餐列表分页查询")
@GetMapping("/page")
public BaseResult<Page<Setmeal>> page(SetmealQuery setmealQuery) {
    return setmealService.pageQuerySetmeal(setmealQuery);
}
  • 3)在``类中具体实现pageQuerySetmeal方法
// com.itweid.takeout.service.impl.SetmealServiceImpl

@Override
public BaseResult<Page<Setmeal>> pageQuerySetmeal(SetmealQuery setmealQuery) {
    Page<Setmeal> page = new Page<>(setmealQuery.getPage(), setmealQuery.getPageSize());
    lambdaQuery()
            // 只查询删除标记为0的记录
            .eq(Setmeal::getIsDeleted, StatusCode.NOT_DEL.getCode())
            // 套餐名称模糊查询
            .like(StringUtils.isNoneBlank(setmealQuery.getName()), Setmeal::getName, setmealQuery.getName())
            .page(page);
    if(page.getTotal() > 0) {
        // 处理套餐名称
        for (Setmeal setmeal : page.getRecords()) {
            Category category = Db.getById(setmeal.getCategoryId(), Category.class);
            if(category != null) {
                setmeal.setCategoryName(category.getName());
            }
        }
    }
    return BaseResult.success(page);
}
  • 4)功能测试

10.4 新增套餐

10.4.1 需求分析

  • 用户点击“新增套餐”按钮,进入新增页面;
  • 自动加载“套餐分类”下拉框,用户可以选择套餐分类,直接使用已经开发好的分页查询分类列表/category/page接口:

  • 自动加载“菜品”列表,用户可将菜品添加到当前套餐中,直接使用已经开发好的菜品列表分页查询接口/dish/page:

  • 用户可以上传套餐图片,直接使用已经开发好的文件上传/common/upload接口:

  • 用户可以查看套餐图片,直接使用已经开发好的文件下载/common/download接口:

  • 用户在输入完所有信息后,点击“保存”按钮新增一个套餐:
功能 请求方法 请求路径
新增套餐 POST /setmeal/add

该接口的入参如下:

{
    "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.4.2 具体实现

  • 1)在SetmealQuery查询类中添加参数,并添加表单校验规则
// com.itweid.takeout.entity.SetmealQuery

@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ApiModel(value="SetmealQuery对象", description="套餐查询对象")
public class SetmealQuery extends BaseQuery {

    @ApiModelProperty("套餐名称")
    @NotBlank(groups = Add.class, message = "套餐名称不能为空")
    private String name;

    @ApiModelProperty("套餐分类ID")
    @NotBlank(groups = Add.class, message = "套餐分类不能为空")
    private String categoryId;

    @ApiModelProperty("套餐价格")
    @NotNull(groups = Add.class, message = "套餐价格不能为空")
    private BigDecimal price;

    @ApiModelProperty("套餐图片")
    @NotBlank(groups = Add.class, message = "套餐图片不能为空")
    private String image;

    @ApiModelProperty("套餐描述")
    private String description;

    @ApiModelProperty("套餐状态")
    private Integer status;

    @ApiModelProperty("套餐菜品")
    private SetmealDish[] setmealDishes;
}
  • 2)在SetmealController类中添加add方法,并添加表单校验规则
// com.itweid.takeout.controller.SetmealController

@ApiOperation("套餐列表分页查询")
@PostMapping("/add")
public BaseResult add(@RequestBody @Validated(Add.class) SetmealQuery setmealQuery) {
    return setmealService.addSetmeal(setmealQuery);
}
  • 3)在SetmealServiceImpl类中具体实现addSetmeal方法
// com.itweid.takeout.service.impl.SetmealServiceImpl

@Override
public BaseResult addSetmeal(SetmealQuery setmealQuery) {
    // 1 套餐名称不能重复
    if(lambdaQuery().eq(Setmeal::getName, setmealQuery.getName()).exists()) {
        return BaseResult.error(ErrorCode.SETMEAL_EXIST);
    }
    // 2 新增套餐
    Setmeal setmeal = new Setmeal();
    setmeal.setName(setmealQuery.getName());
    setmeal.setCategoryId(Long.valueOf(setmealQuery.getCategoryId()));
    setmeal.setPrice(setmealQuery.getPrice());
    setmeal.setStatus(setmealQuery.getStatus());
    setmeal.setDescription(setmealQuery.getDescription());
    setmeal.setImage(setmealQuery.getImage());
    save(setmeal);
    // 3 新增套餐菜品关系
    SetmealDish[] setmealDishes = setmealQuery.getSetmealDishes();
    if (setmealDishes != null && setmealDishes.length > 0) {
        for (SetmealDish setmealDish : setmealDishes) {
            setmealDish.setSetmealId(setmeal.getId().toString());
            Db.save(setmealDish);
        }
    }
    return BaseResult.success();
}
  • 4)功能测试

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


网站公告

今日签到

点亮在社区的每一天
去签到