Part04 ☀️

YangeIT大约 14 分钟瑞吉外卖菜品模块剩余的禁用和删除套餐模块和移动端代码导入Swaager人工智能插件RedisNginx

Part04 ☀️

课程内容

  • 菜品模块剩余的禁用和删除 ✏️
  • 套餐模块和移动端代码导入 ✏️
  • 优化 🍐
    • Swaager人工智能插件 🍐
    • Redis 🍐
    • Nginx 🍐

1. 菜品启用禁用和删除(1-2) ✏️

1.1 菜品启用禁用 ✏️

菜品启用禁用

1. 点击菜品列表的中的禁用或者启用 按钮,弹出对话框进行禁用或者启用

image
image

2. 点击停售或者批量停售,观察 Network 中的请求

image
image
  1. 其中0表示停售,1表示起售
  2. ids后面接受的是菜品id

代码操作

步鄹

  1. 依据分析 Network 中的请求,在 DishController 中定义 updateStatus 方法
  2. 通过菜品 Id 获得所有的菜品(有可能是批量禁用和启用)
  3. 通过 for循环遍历,设置状态值
  4. 调用 updateBatchById 批量进行修改
  5. 观察控制台 sql 语句的输出
  6. 重启服务器,登陆,进行测试

从上述的Network图可以得出: 👇

  1. 使用路径参数接收status状态
  2. 使用List<Long>接收ids

DishController类

@PostMapping("/status/{status}")
public R<String> updateStatus(@PathVariable("status") Integer status,
                                @RequestParam("ids") List<Long> ids){
    log.info("status:{},停售起售的ids:{}",status,ids);
    //通过ids批量获取dish 菜品
    List<Dish> dishes = dishService.listByIds(ids);
    //遍历菜品,修改其状态
    for (Dish dish : dishes) {
        dish.setStatus(status);
    }
    //批量修改
    boolean b = dishService.updateBatchById(dishes);
    //返回结果
    return b ?R.success("操作成功"):R.error("操作失败");
}

1.2 菜品删除 ✏️

删除

1. 点击菜品列表的中的删除 按钮,弹出对话框进行删除或者批量删除

image
image

2. 点击删除或者批量删除,观察 Network 中的请求

image
image
  1. ids后面接受的是菜品id

代码操作

步鄹

  1. 依据分析 Network 中的请求,在 DishController 中定义 delete 方法
  2. 通过菜品 Id 删除菜品(有可能是批量禁用和启用)
  3. 重启服务器,登陆,进行测试
  4. 观察控制台 sql 语句的输出

DishController

@DeleteMapping
public R<String> deleteByIds(@RequestParam("ids") List<Long> ids){

    log.info("deleteByIds:ids:{}",ids);

    boolean b = dishService.removeByIdsWithFlavors(ids);


    return b?R.success("删除成功"):R.error("删除失败");
}

总结

课堂作业

  1. 根据上述提示,完成菜品启用禁用和菜品删除🎤

2. 套餐模块和移动端代码导入(3-4)

套餐模块和移动端代码导入

1. 菜品和套餐业务基本一样,同学们可以用自行书写,本节课直接导入

image
image

代码操作

需要提前在DishController增加如下方法,新增套餐需要用到

 @GetMapping("/list")
    public R<List<DishDto>> list(Dish dish){
        //构造查询条件
        LambdaQueryWrapper<Dish> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(dish.getCategoryId() != null ,Dish::getCategoryId,dish.getCategoryId());
        //添加条件,查询状态为1(起售状态)的菜品
        queryWrapper.eq(Dish::getStatus,1);

        //添加排序条件
        queryWrapper.orderByAsc(Dish::getSort).orderByDesc(Dish::getUpdateTime);

        List<Dish> list = dishService.list(queryWrapper);

        List<DishDto> dishDtoList = list.stream().map((item) -> {
            DishDto dishDto = new DishDto();

            BeanUtils.copyProperties(item,dishDto);

            Long categoryId = item.getCategoryId();//分类id
            //根据id查询分类对象
            Category category = categoryService.getById(categoryId);

            if(category != null){
                String categoryName = category.getName();
                dishDto.setCategoryName(categoryName);
            }

            //当前菜品的id
            Long dishId = item.getId();
            LambdaQueryWrapper<DishFlavor> lambdaQueryWrapper = new LambdaQueryWrapper<>();
            lambdaQueryWrapper.eq(DishFlavor::getDishId,dishId);
            //SQL:select * from dish_flavor where dish_id = ?
            List<DishFlavor> dishFlavorList = dishFlavorService.list(lambdaQueryWrapper);
            dishDto.setFlavors(dishFlavorList);
            return dishDto;
        }).collect(Collectors.toList());

        return R.success(dishDtoList);
    }

1. 套餐禁用和启用操作image

2,套餐修改之回显

image
image

3,套餐修改之修改

imageimage

4,套餐修改之删除image

总结

课堂作业

  1. 根据上述提示,完成代码导入,并且观察效果,理解项目业务需求🎤

3. 优化项目(5-6)

3.1 Swagger 🍐

Swagger

1️⃣ 介绍

Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务(https://swagger.io/open in new window)。

image
image

它的主要作用是:

  1. 使得前后端分离开发更加方便,有利于团队协作
  2. 接口的文档在线自动生成,降低后端开发人员编写接口文档的负担
  3. 功能测试

Spring已经将Swagger纳入自身的标准,建立了Spring-swagger项目,现在叫Springfox。通过在项目中引入Springfox ,即可非常简单快捷的使用Swagger。

knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案,前身是swagger-bootstrap-ui,取名kni4j是希望它能像一把匕首一样小巧,轻量,并且功能强悍!

目前,一般都使用knife4j框架

2️⃣ 使用步骤 👇

  1. 导入 knife4j 的maven坐标

    在pom.xml中添加依赖

    <dependency>
       <groupId>com.github.xiaoymin</groupId>
       <artifactId>knife4j-spring-boot-starter</artifactId>
       <version>2.0.2</version>
    </dependency>
    
image
image

3️⃣ 常用注解 👇

通过注解可以控制生成的接口文档,使接口文档拥有更好的可读性,常用注解如下:

注解说明
@Api用在类上,例如Controller,表示对类的说明
@ApiModel用在类上,例如entity、DTO、VO
@ApiModelProperty用在属性上,描述属性信息
@ApiOperation用在方法上,例如Controller的方法,说明方法的用途、作用

接下来,使用上述注解,生成可读性更好的接口文档

@RestController
@RequestMapping("/category")
@Slf4j
@Api(tags = "分类管理")
public class CategoryController {
    @Autowired
    private CategoryService categoryService;

    /**
     * 新增分类
     * @param category
     * @return
     */
    @PostMapping
    @ApiOperation("新增分类")
    public R<String> save(@RequestBody Category category){
        log.info("category:{}",category);
        category.setCreateTime(LocalDateTime.now());
        category.setUpdateTime(LocalDateTime.now());
        category.setCreateUser(1L);
        category.setUpdateUser(1L);
        categoryService.save(category);
        return R.success("新增分类成功");
    }



 










 









启动服务:访问http://localhost:8080/doc.htmlopen in new window

image
image

书写这些是不是很繁琐呀!!,可以使用AI插件哦!!!

3.2 Redis操作

SpringCache和Redis操作

前面我们已经实现了移动端菜品查看功能,对应的服务端方法为 DishController 的 list 方法,此方法会根据前端提交的查询条件进行数据库查询操作。在高并发 的情况下,频繁查询数据库会导致系统性能下降 ,服务端响应时间增长。现在需要对此方法进行缓存优化,提高系统的性能。(如下图)

image
image

代码操作

由于 SpringCache 的基本功能是 Spring 核心(spring-context)中提供的,所以目前我们进行简单的 SpringCache 测试,是可以不用额外引入其他依赖的。 可以检查是否导入了下列依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-cache</artifactId>
</dependency>

1). 引导类上加@EnableCaching

在引导类上加该注解,就代表当前项目开启缓存注解功能。 image