手机网站页面布局,网站标题一样,杭州做网站的好公司,备案 网站建设方案书怎么写瑞吉外卖项目学习笔记(一)准备工作、员工登录功能实现 瑞吉外卖项目学习笔记(二)Swagger、logback、表单校验和参数打印功能的实现 瑞吉外卖项目学习笔记(三)过滤器实现登录校验、添加员工、分页查询员工信息 瑞吉外卖项目学习笔记(四)TableField(fill FieldFill.INSERT)公共字…瑞吉外卖项目学习笔记(一)准备工作、员工登录功能实现 瑞吉外卖项目学习笔记(二)Swagger、logback、表单校验和参数打印功能的实现 瑞吉外卖项目学习笔记(三)过滤器实现登录校验、添加员工、分页查询员工信息 瑞吉外卖项目学习笔记(四)TableField(fill FieldFill.INSERT)公共字段填充、启用/禁用/修改员工信息 瑞吉外卖项目学习笔记(五)菜品/套餐分类的增删改查 瑞吉外卖项目学习笔记(六)分页查询菜品列表、实现图片上传和下载 文章目录 9 菜品管理9.5 新增菜品9.5.1 加载菜品分类9.5.2 保存口味做法配置9.5.3 新增菜品具体实现 9.6 (批量)删除菜品9.6.1 需求分析9.6.2 具体实现 9 菜品管理
9.5 新增菜品
9.5.1 加载菜品分类
在“新增菜品”页面菜品分类是一个下拉框因此进入该页面后需要向后端发起查询请求。
这里可以直接调用菜品/套餐分类的分页查询接口参数要设置成?page1pageSize999999type1表示查询第1页该页显示999999条记录相当于查出全部type1表示查询的是菜品分类。 9.5.2 保存口味做法配置
由t_dish的表结构可知“新增菜品”页面的口味做法配置并不保存在t_dish表。所以我们新建一个菜品口味关系表t_dish_flavor表来单独保存。
1在数据库新建菜品口味关系表t_dish_flavor
DROP TABLE IF EXISTS t_dish_flavor;
CREATE TABLE t_dish_flavor (id bigint(20) NOT NULL AUTO_INCREMENT COMMENT ID,dish_id bigint(20) NOT NULL COMMENT 菜品,name varchar(64) COLLATE utf8_bin NOT NULL COMMENT 口味名称,value varchar(500) COLLATE utf8_bin DEFAULT NULL COMMENT 口味数据list,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
) ENGINEInnoDB DEFAULT CHARSETutf8 COLLATEutf8_bin COMMENT菜品口味关系表;2使用MyBatisPlus插件生成代码 3给DishFlavor实体类的公共字段添加注解
// com.itweid.takeout.entity.DishFlavorApiModelProperty(value 创建时间)
TableField(fill FieldFill.INSERT)
private LocalDateTime createTime;ApiModelProperty(value 更新时间)
TableField(fill FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;ApiModelProperty(value 创建人)
TableField(fill FieldFill.INSERT)
private Long createUser;ApiModelProperty(value 修改人)
TableField(fill FieldFill.INSERT_UPDATE)
private Long updateUser;9.5.3 新增菜品具体实现
功能请求方法请求路径新增菜品POST/dish/add
该接口的入参较为复杂下面是一个示例
{name:辣子鸡, //菜品名称price:14.99, //菜品价格image:e7cff7e7-4f63-4e3a-8001-6866e27f82d6.png, //菜品图片description:辣子鸡真的好吃, //菜品描述categoryId:1397844263642378242, //菜品分类IDflavors:[ //口味做法配置{name:甜味,value:[\无糖\,\少糖\,\半糖\\多糖\,\全糖\],showOption:false},{name:温度,value:[\热饮\,\常温\,\去冰\,\少冰\,\多冰\],showOption:false},{name:忌口,value:[\不要葱\,\不要蒜\,\不要香菜\,\不要辣\],showOption:false},{name:辣度,value:[\不辣\,\微辣\,\中辣\,\重辣\],showOption:false}]
}1改造DishQuery类添加以上参数并做参数校验
Data
EqualsAndHashCode(callSuperfalse)
NoArgsConstructor
AllArgsConstructor
ApiModel(value DishQuery对象, description 菜品查询对象)
public class DishQuery extends BaseQuery {ApiModelProperty(value 菜品名称)NotBlank(groups Add.class, message 菜品名称不能为空)private String name;ApiModelProperty(value 菜品分类ID)NotBlank(groups Add.class, message 菜品分类不能为空)private String categoryId;ApiModelProperty(value 菜品价格)NotNull(groups Add.class, message 菜品价格不能为空)private BigDecimal price;ApiModelProperty(value 菜品图片)NotNull(groups Add.class, message 菜品图片不能为空)private String image;ApiModelProperty(value 菜品描述)private String description;ApiModelProperty(value 口味做法配置)private DishFlavor[] flavors;}2在DishController类创建add方法并添加参数校验
ApiOperation(新增菜品)
PostMapping(/add)
public BaseResult add(RequestBody Validated(Add.class) DishQuery dishQuery) {return dishService.addDish(dishQuery);
}3在DishServiceImpl类具体实现addDish方法
// com.itweid.takeout.service.impl.DishServiceImplOverride
public BaseResult addDish(DishQuery dishQuery) {// 1 菜品名称不能重复if(lambdaQuery().eq(Dish::getName, dishQuery.getName()).exists()) {return BaseResult.error(ErrorCode.DISH_EXIST);}// 2 新增菜品Dish dish new Dish();dish.setName(dishQuery.getName());dish.setCategoryId(Long.valueOf(dishQuery.getCategoryId()));dish.setPrice(dishQuery.getPrice());dish.setImage(dishQuery.getImage());dish.setDescription(dishQuery.getDescription());// 随机指定商品码dish.setCode(UUID.randomUUID().toString());save(dish);// 3 新增菜品口味配置DishFlavor[] flavors dishQuery.getFlavors();if(flavors ! null flavors.length 0) {for(DishFlavor f : flavors) {f.setDishId(dish.getId());Db.save(f);}}return BaseResult.success();
}4重启服务测试新增菜品功能 5完善“菜品分类”的显示
在Dish实体类中增加categoryName字段
// com.itweid.takeout.entity.DishApiModelProperty(value 菜品分类名称)
TableField(exist false)
private String categoryName;改造DishServiceImpl类的pageQueryDish方法处理菜品分类名称字段
// com.itweid.takeout.service.impl.DishServiceImplOverride
public BaseResultPageDish pageQueryDish(DishQuery dishQuery) {PageDish page new Page(dishQuery.getPage(), dishQuery.getPageSize());lambdaQuery().like(StringUtils.isNoneBlank(dishQuery.getName()), Dish::getName, dishQuery.getName()).page(page);if(page.getTotal() 0){for (Dish record : page.getRecords()) {// 处理菜品分类Category category Db.getById(record.getCategoryId(), Category.class);if(category ! null){record.setCategoryName(category.getName());}}}return BaseResult.success(page);
}重启服务测试菜品分类是否显示 9.6 (批量)删除菜品
9.6.1 需求分析
在“菜品管理”页面可以直接删除一个菜品也可以选择多个菜品后批量删除 功能请求方法请求路径请求参数新增菜品DELETE/dish/delete{“ids”:“1,2,3”}
9.6.2 具体实现
1在DishController类中添加delete方法并添加参数校验
// com.itweid.takeout.controller.DishControllerApiOperation((批量)删除菜品)
DeleteMapping(/delete)
public BaseResult delete(NotBlank(message 待删除菜品ID不能为空) String ids) {return dishService.deleteDish(ids);
}2在DishServiceImpl中具体实现deleteDish方法
// com.itweid.takeout.service.impl.DishServiceImplValue(${dir.upload})
private String uploadDir;Override
public BaseResult deleteDish(String ids) {String[] idArray ids.split(,);for (String id : idArray) {log.info(delete id {}, id);// 先查询出菜品Dish dish getById(id);if(dish ! null) {// 删除菜品removeById(dish.getId());// 删除菜品口味配置Db.lambdaUpdate(DishFlavor.class).eq(DishFlavor::getDishId, dish.getId()).remove();// 删除菜品图片File file new File(uploadDir dish.getImage());if(file.exists()) {log.info(delete file {} {}, file.getAbsolutePath(), file.delete());}}}return BaseResult.success();
}3重启服务测试删除菜品功能 同样由于精度问题导致删除失败。我们只需要给Dish实体类的id字段添加一个JsonSerialize注解
// com.itweid.takeout.entity.DishApiModelProperty(value ID)
TableId(value id, type IdType.AUTO)
JsonSerialize(using ToStringSerializer.class)
private Long id;4重启服务再次测试删除菜品功能 …
本节完更多内容查阅瑞吉外卖项目实战