Java项目实战——瑞吉外卖day05

目录

套餐管理业务开发

17、新增套餐

17.1、需求分析

17.2、代码开发

18、套餐分页查询

18.1、需求分析

18.2、代码开发

19、删除、起售、停售、修改套餐

19.1、需求分析

19.2、代码开发


套餐管理业务开发

17、新增套餐

17.1、需求分析

--后台系统中可以管理套餐信息,通过新增套餐功能来添加一个新的套餐,在添加套餐时需要选择当前套餐所属的套餐分类包含的菜品,并且需要上传套餐对应的图片,在移动端会按照套餐分类来展示对应的套餐。

--套餐管理,其实就是菜品的集合。

 --数据模型:涉及到两个表:套餐信息插入到setmeal表,插入套餐和菜品关联数据到setmeal_dish

--从资料中导入套餐表和套餐菜品关系表,创建相关接口和类以及控制器方法

17.2、代码开发

  • 实体类SetmealDish(直接从课程资料中导入即可,Setmeal实体前面+ 课程中已经导入过了)
  • DTO SetmealDto(直接从课程资料中导入即可)
  • Mapper接口SetmealDishMapper
  • 业务层接口SetmealDishService
  • 业务层实现类SetmealDishServicelmpl
  • 控制层SetmealController

--因涉及多表操作,需导入Dto

--从前端页面得知:

  • 请求服务端获取套餐分类数据并展示到下拉框中----页面回显

之前已做过此功能

  • 请求服务端获取菜品分类和菜品详情数据并展示到添加菜品窗口中----页面回显(禁售不能回显)

 

    /**
     * 根据分类id查询对应的菜品,并回显数据
     * @param dish
     * @return
     */
    @GetMapping("/list")
    public R<List<Dish>> list(Dish dish){
        //构造查询条件
        LambdaQueryWrapper<Dish> lambdaQueryWrapper=new LambdaQueryWrapper<>();
        //添加条件,查询状态为1的(起售状态)
        lambdaQueryWrapper.eq(Dish::getStatus,1);
        lambdaQueryWrapper.eq(dish.getCategoryId()!=null,Dish::getCategoryId,dish.getCategoryId());
        //条件排序条件
        lambdaQueryWrapper.orderByAsc(Dish::getSort).orderByDesc(Dish::getUpdateTime);

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

        return R.success(list);
    }
  • 点击保存,提交数据

 --设计多表操作:基本信息添加到套餐表setmeal表,关联的菜品信息添加到套餐菜品关系表setmeal_dish表

--在controller中自定义方法:saveWithDish

 @PostMapping
    public R<String>saveMealDto(@RequestBody SetmealDto setmealDto){
        setmealService.saveWithDish(setmealDto);
        return R.success("添加套餐成功");
    }

--在对应的实现类中编写具体实现操作:

    /**
     * 添加套餐数据到setmeal表和setmeal_dish表中
     * @param setmealDto
     */
    @Override
    public void saveWithDish(SetmealDto setmealDto){
        //添加基本信息到setmeal表
        this.save(setmealDto);
        //从前端返回提交的参数中获取关联的菜品信息
        List<SetmealDish> setmealDishes = setmealDto.getSetmealDishes();
        setmealDishes.stream().map((item) -> {
            Long id = setmealDto.getId();
            item.setSetmealId(id);
            return item;
        }).collect(Collectors.toList());
        //保存套餐和菜品的关联信息
        setmealDishService.saveBatch(setmealDishes);
    }

18、套餐分页查询

18.1、需求分析

--将套餐信息进行分页展示,需要注意的是其中个别信息需要手动转换,分类id---->分类名称

18.2、代码开发

--页面发送ajax请求,将分页查询参数(page、pageSize、name)提交到服务端,获取分页数据

操作如下:

   @GetMapping("/page")
    public R<Page>getMealDto(int page,int pageSize,String name){
        //此页面展示的信息为套餐信息,信息里面的套餐分类为分类名称,实体类里面的为id,需转换
        Page<Setmeal> pageInfo = new Page<>(page,pageSize);
        Page<SetmealDto> dtoPageInfo = new Page<>();
        LambdaQueryWrapper<Setmeal> qw = new LambdaQueryWrapper<>();
        qw.eq(StringUtils.isNotEmpty(name),Setmeal::getName,name);
        qw.orderByDesc(Setmeal::getCode);
        setmealService.page(pageInfo,qw);
        //页面信息拷贝---其中records为页面集合数据因缺少categoryName并且泛型类型不一致不需要复制
        BeanUtils.copyProperties(pageInfo,dtoPageInfo,"records");
        //对原records进行改造----改泛型类型,加categoryName
        //1、获取原records
        List<Setmeal> records = pageInfo.getRecords();
        //用List<SetmealDto>接收改泛型类型
        List<SetmealDto> nowRecores = records.stream().map((item) -> {
            SetmealDto setmealDto = new SetmealDto();
            BeanUtils.copyProperties(item,setmealDto);
            Long categoryId = item.getCategoryId();
            Category category = categoryService.getById(categoryId);
            if (category!=null) {
                String categoryName = category.getName();
                //2、加categoryName
                setmealDto.setCategoryName(categoryName);
            }
            return setmealDto;
        }).collect(Collectors.toList());
        dtoPageInfo.setRecords(nowRecores);
        return R.success(dtoPageInfo);
    }

19、删除、起售、停售、修改套餐

19.1、需求分析

在套餐管理列表页面点击删除按钮,可以删除对应的套餐信息。也可以通过复选框选择多个套餐,点击批量删除按钮一次删除多个套餐。注意,对于状态为售卖中的套餐不能删除,需要先停售,然后才能删除。

19.2、代码开发

操作如下:

删除:直接看实现类中自定义的方法

/**
     * 删除套餐,起售状态不可删除
     * @param ids
     */
    @Transactional
    @Override
    public void removeWithDish(List<Long> ids) {
        //判断是否可删除 起售不可
        LambdaQueryWrapper<Setmeal> qw = new LambdaQueryWrapper<>();
        qw.in(Setmeal::getId,ids);
        qw.eq(Setmeal::getStatus,1);
        int count = this.count(qw);
        if (count > 0) {
            throw new CustomExpection("商品正在起售,不能删除");
        }
        //停售,可删除
        this.removeByIds(ids);
        //删除关系表中信息SetmealDto
        LambdaQueryWrapper<SetmealDish> qwDish = new LambdaQueryWrapper<>();
        qwDish.in(SetmealDish::getSetmealId,ids);
        setmealDishService.remove(qwDish);
    }

起售,停售:

操作如下:

 /**
     * 更改成功套餐状态status
     * @param status
     * @param ids
     * @return
     */
    @PostMapping("/status/{status}")
    public R<String>stop(@PathVariable int status,String[] ids){
        for (String id:ids){
            Setmeal setmeal = setmealService.getById(id);
            setmeal.setStatus(status);
            setmealService.updateById(setmeal);
        }
        return R.success("套餐状态更改成功");
    }

修改套餐:

操作如下:

controller中

    /**
     * 修改套餐:1、回显数据
     * @param ids
     * @return
     */
    @GetMapping("/{ids}")
    public R<SetmealDto>update1(@PathVariable Long ids){
        //回显数据
        SetmealDto setmealDto = setmealService.getByIdWithDish(ids);
        return R.success(setmealDto);
    }

    /**
     * 修改套餐:2、更改数据提交保存
     * @param setmealDto
     * @return
     */
    @PutMapping
    public R<String>update2(@RequestBody SetmealDto setmealDto){
        setmealService.updateWithDish(setmealDto);
        return R.success("套餐内容修改成功");
    }

Impl中


    @Override
    public SetmealDto getByIdWithDish(Long ids) {
        //回显基本信息
        Setmeal setmeal = this.getById(ids);
        SetmealDto setmealDto = new SetmealDto();
        BeanUtils.copyProperties(setmeal,setmealDto);
        //回显添加的菜品信息
        LambdaQueryWrapper<SetmealDish> qw = new LambdaQueryWrapper<>();
        qw.eq(SetmealDish::getSetmealId,ids);
        //此时qw信息应该用list集合接收,可能含有多个
        List<SetmealDish> setmealDishes = setmealDishService.list(qw);
        setmealDto.setSetmealDishes(setmealDishes);
        return setmealDto;

    }

    /**
     * 修改信息------1删除之前关系表中信息 2、添加修改后的信息
     * @param setmealDto
     */
    @Override
    public void updateWithDish(SetmealDto setmealDto) {
        //修改基本信息Setmeal
        this.updateById(setmealDto);
        //修改关系表信息SetmealDish:1、删除之前信息
        LambdaQueryWrapper<SetmealDish> qwDish = new LambdaQueryWrapper<>();
        qwDish.eq(SetmealDish::getSetmealId,setmealDto.getId());
        setmealDishService.remove(qwDish);
        //修改关系表信息SetmealDish:2、更新修改之后的信息
        List<SetmealDish> setmealDishes = setmealDto.getSetmealDishes();
        //缺少sermealId
        setmealDishes = setmealDishes.stream().map((item) -> {
            item.setSetmealId(setmealDto.getId());
            return item;
        }).collect(Collectors.toList());
        setmealDishService.saveBatch(setmealDishes);
    }

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值