苍穹外卖-day04剩余套餐相关接口

一,分页查询接口

controll层

前端地址栏参数会自动封装到类中

使用PageResult封装集合以及总数

 /**
     * 分页查询
     * @param setmealPageQueryDTO
     * @return
     */
    @GetMapping("/page")
    @ApiOperation("分页查询接口")
    public Result<PageResult> PageQuery(SetmealPageQueryDTO setmealPageQueryDTO){
        log.info("分页查询:{}",setmealPageQueryDTO);
        PageResult pageResult = setmealService.pageQuery(setmealPageQueryDTO);
        return Result.success(pageResult);
    }

Service层

使用了PageHelper工具类

步骤:

1.直接调用类.方法

2.然后使用Page<>类接收mapper层返回的数据

/**
     * 分页查询
     * @param setmealPageQueryDTO
     * @return
     */
    @Override
    public PageResult pageQuery(SetmealPageQueryDTO setmealPageQueryDTO) {
        //使用工具开始分页查询
        PageHelper.startPage(setmealPageQueryDTO.getPage(), setmealPageQueryDTO.getPageSize());
        //得到Page封装类,
        Page<Setmeal> page = setmealMapper.pageQuery(setmealPageQueryDTO);
        //获取数据数目
        long total = page.getTotal();
        //获取数据
        List<Setmeal> result = page.getResult();
        PageResult pageResult  = new PageResult(total,result);
        return pageResult;
    }

mapper层

like模糊匹配 %任意  _一个单词


    <select id="pageQuery" resultType="Setmeal">
        select * from setmeal
        <where>
            <if test="name != null">
                and name like concat('%',#{name},'%')
            </if>
            <if test="categoryId != null">
                and category_id = #{categoryId}
            </if>
            <if test="status != null">
                and status = #{status}
            </if>
        </where>
        order by create_time desc
    </select>

看完标准答案后:在返回套餐时应该返回SetmealVO对象,而不是Setmeal,所以,要联合查询,将种类名称也显示

二,修改套餐接口

controll层


    /**
     * 修改套餐
     */
    @PutMapping
    @ApiOperation("修改套餐接口")
    public Result update(@RequestBody SetmealDTO setmealDTO){
        log.info("开始修改套餐:{}",setmealDTO);
        setmealService.update(setmealDTO);
        return null;
    }

Service层

细节:

  1. DTO对象要转为实体对象再穿给mapper层,因为在配置文件中Mybatis只配置了实体类对象
  2. 更新中间表不知道流程(感觉是先把之前的关系先删了,然后再新增)

    @Override
    public void update(SetmealDTO setmealDTO) {
        //更新套餐
        Setmeal setmeal = new Setmeal();
        BeanUtils.copyProperties(setmealDTO,setmeal);
        setmealMapper.update(setmealDTO);
        // TODO 更新中间表

    }

Mapper层

细节:记得添加自动填充注解


    @AutoFill(value = OperationType.UPDATE)
    void update(Setmeal setmeal);

xml

 <update id="update" parameterType="Setmeal">
        update setmeal
        <set>
            <if test="categoryId != null">category_id = #{categoryId},</if>
            <if test="name != null">name = #{name},</if>
            <if test="price != null">price = #{price},</if>
            <if test="status != null">status = #{status},</if>
            <if test="description != null">description = #{description},</if>
            <if test="image != null">image = #{image},</if>
            <if test="updateTime != null">update_time = #{updateTime},</if>
            <if test="updateUser != null">update_user = #{updateUser},</if>
        </set>
        <where>
            id = #{id}
        </where>
    </update>

三,批量删除套餐接口

controller层


    /**
     * 删除套餐
     * @param ids
     * @return
     */
    @DeleteMapping
    @ApiOperation("批量删除套餐接口")
    public Result delete(@RequestParam List<Integer> ids){
        log.info("删除套餐:{}",ids);
        setmealService.delete(ids);
        return Result.success();
    }

sevice层


    /**
     * 批量删除套餐
     * @param ids
     */
    @Override
    public void delete(List<Integer> ids) {
        //删除套餐
        setmealMapper.deleteSetmeal(ids);
        //删除套餐与菜品的关系
        setmealMapper.deleteSetmealDish(ids);
    }

mapper层


    <delete id="deleteSetmeal" parameterType="integer">
        delete from setmeal where id in
        <foreach collection="ids" item="id" separator="," open="(" close=")">
            #{id}
        </foreach>
    </delete>
    <delete id="deleteSetmealDish" parameterType="integer">
        delete from setmeal_dish where setmeal_id in
        <foreach collection="ids" item="id" separator="," open="(" close=")">
            #{id}
        </foreach>
    </delete>

四,套餐起销售,停售套餐

 controller层


    /**
     * 启用禁用
     */
    @PostMapping("/status/{status}")
    @ApiOperation("启用禁用套餐账号")
    public Result startOrStop(@PathVariable Integer status,Long id){
        log.info("启用禁用套餐账号: {},{}",status,id);
        setmealService.startOrStop(status,id);
        return Result.success();
    }

sevice层

 @Override
    public void startOrStop(Integer status, Long id) {
        //让套餐停售
        if (status == StatusConstant.DISABLE) {
            setmealMapper.startSetmeal(status, id);
        } else {
            //让套餐起售,那么得判断其中菜品都在出售中
            //1.先得到所有菜品
            List<SetmealDish> setmealDishList = setmealMapper.idQuerySetmealDish(id);
            for (SetmealDish sd:setmealDishList) {
                //2.得到每个菜品的状态
                Integer queryStatus = dishMapper.queryDishStatus(id);
                //如果存在菜品停售则抛出异常信息
                if(queryStatus==StatusConstant.DISABLE){
                    throw new BaseException(MessageConstant.SETMEAL_ENABLE_FAILED);
                }
            }
            //3.没抛异常说明菜品都在起售中,让套餐也起售
            setmealMapper.startSetmeal(status, id);
        }

    }

mapper层


    /**
     * 启用禁用套餐
     * @param status
     * @param id
     */
    @Update("update setmeal set status = #{status} where id = #{id}")
    void startSetmeal(Integer status, Long id);

五. 自己做后总结

  1. 起别名,尽量具体,比如查询操作,查询套餐就写querySetmeal,查询套餐菜品表就querySetmealDish
  2. id数据类型尽量long类型
  3. 抛异常: throw new BaseException(SETMEAL_ENABLE_FAILED);
  4. 在想增加套餐样例里面增加菜品,发现没有相应接口,且数据库没有菜品种类表,等我看完标准回答再回来

六,看完标准答案后

        1.根据分类id查询菜品

        应征了我的想法,缺少这个接口,但是菜品与种类是一对多的关系,不需要中间表

        2.解决了在xml让主键返回

        3.在删除套餐中,需要使用中间表,所以应该再写一个操作中间表的Mapper类

         而且在Service中循环套出每个id,,在mapper层中写单个删除,因为在其他接口也会用到单个删除菜品的Mapper接口

        4.更新套餐中需要将套餐关系表全部删除,然后重新增加关系,并且使用的是xml遍历,

        原因可能是在其他接口中,不会用到只删除一条菜品与套餐之间的信息.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值