黑马苍穹外卖项目补充代码04_套餐管理&菜品起售停售


一.介绍

套餐管理为项目实战,大部分的代码和菜品管理如出一辙,这里主要是对黑马给出的答案文档作出补充.

二.对修改套餐补充

在对照答案文档的时候发现了以下方面需要做出补充:

1.对List< SetmealDish >条件判断补充

在编写代码时候发现没有对集合进行非空判断,故做出补充
补充代码:

/**
     * 修改套餐
     *
     * @param setmealDTO
     * @return
     */
    @Transactional
    public void update(SetmealDTO setmealDTO) {
        Setmeal setmeal = new Setmeal();
        BeanUtils.copyProperties(setmealDTO, setmeal);

        setmealMapper.update(setmeal);

        Long setmealId = setmealDTO.getId();

        setmealDishMapper.deleteBySetmealId(setmealId);

        //设置SetmealDish中的套餐id
        List<SetmealDish> setmealDishes = setmealDTO.getSetmealDishes();
        if (setmealDishes != null && setmealDishes.size() > 0) {
            setmealDishes.forEach(setmealDish -> {
                setmealDish.setSetmealId(setmealId);
            });
            setmealDishMapper.insertBatch(setmealDishes);
        }
    }

2.对setmealMapper.update方法补充

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

3.对SetmealMapper.xml映射文件补充update语句

<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}
    </update>

三.对起售停售套餐其他实现方法

在写完起售停售套餐后发现答案和实现的不一致,在前后端联调测试后发现想要达到的效果一致

/**
     * 套餐起售停售
     *
     * @param status
     * @param id
     */
    public void startOrStop(Integer status, Long id) {

        //起售套餐时,如果套餐内包含停售的菜品,则不能起售
        if (status == StatusConstant.ENABLE) {
            List<SetmealDish> setmealDishes = setmealDishMapper.getBySetmealId(id);
            if (setmealDishes != null && setmealDishes.size() > 0) {
                setmealDishes.forEach(setmealDish -> {
                    Long dishId = setmealDish.getDishId();
                    Dish dish = dishMapper.getById(dishId);
                    if (dish.getStatus() == StatusConstant.DISABLE) {
                        throw new SetmealEnableFailedException(MessageConstant.SETMEAL_ENABLE_FAILED);
                    }
                });
            }
        }
        Setmeal setmeal = Setmeal.builder()
                .id(id)
                .status(status)
                .build();
        setmealMapper.update(setmeal);
    }

代码实现了功能,免去了sql语句


黑马原代码:

/**
     * 套餐起售、停售
     * @param status
     * @param id
*/
public void startOrStop(Integer status, Long id) {
    //起售套餐时,判断套餐内是否有停售菜品,有停售菜品提示"套餐内包含未启售菜品,无法启售"
    if(status == StatusConstant.ENABLE){
        //select a.* from dish a left join setmeal_dish b on a.id = b.dish_id where b.setmeal_id = ?
        List<Dish> dishList = dishMapper.getBySetmealId(id);
        if(dishList != null && dishList.size() > 0){
            dishList.forEach(dish -> {
                if(StatusConstant.DISABLE == dish.getStatus()){
                    throw new SetmealEnableFailedException(MessageConstant.SETMEAL_ENABLE_FAILED);
                }
            });
        }
    }

    Setmeal setmeal = Setmeal.builder()
        .id(id)
        .status(status)
        .build();
    setmealMapper.update(setmeal);
}

DishMapper类:

/**
     * 根据套餐id查询菜品
     * @param setmealId
     * @return
*/
@Select("select a.* from dish a left join setmeal_dish b on a.id = b.dish_id where b.setmeal_id = #{setmealId}")
List<Dish> getBySetmealId(Long setmealId);

四.对起售停售菜品代码实现

写完套餐管理发现黑马没有对起售停售菜品进行实现,故做出补充

补充代码

1.DishController类

/**
     * 菜品的起售和停售
     * @param status
     * @param id
     * @return
     */
    @PostMapping("status/{status}")
    @ApiOperation("菜品的起售和停售")
    public Result<String> startOrStop(@PathVariable Integer status,Long id){
        dishService.startOrStop(status,id);

        return Result.success();
    }

2.DishService接口类

/**
     * 菜品的起售和停售
     * @param status
     * @param id
     */
    void startOrStop(Integer status, Long id);

3.DishServiceImpl类

/**
     * 菜品的起售和停售
     *
     * @param status
     * @param id
     */
    @Transactional
    public void startOrStop(Integer status, Long id) {

        List<Long> dishId = new ArrayList<Long>();
        dishId.add(id);

        //菜品停售,则包含菜品的套餐同时停售
        if (status == StatusConstant.DISABLE) {
            List<Long> setmealIds = setmealDishMapper.getSetmealIdsByDishIds(dishId);
            if (setmealIds != null && setmealIds.size() > 0) {
                setmealIds.forEach(Id -> {
                    Setmeal setmeal = Setmeal.builder()
                            .id(Id)
                            .status(status)
                            .build();
                    setmealMapper.update(setmeal);
                });
            }
        }

        Dish dish=Dish.builder()
                .id(id)
                .status(status)
                .build();
        dishMapper.update(dish);
    }

最后进行前后端联调测试,发现没有问题(别忘了提交代码到git仓库)

### 外卖应用菜品分页查询功能中的Flavors处理 在构建外卖应用程序时,为了实现带有口味(flavors)属性的菜品分页查询功能,需考虑如何有效地设计前后端交互逻辑和服务端的数据处理流程。具体来说,在接收到前端传来的分页查询参数`page`、`pageSize`和`name`的同时,还需能够支持针对特定口味条件下的筛选。 #### 前端AJAX请求配置 当访问页面`backend/page/food/list.html`时,通过JavaScript发起异步HTTP请求至服务器接口,携带必要的查询参数以获取指定范围内的菜品列表及其对应的口味信息[^1]。 ```javascript $.ajax({ url: &#39;/api/dish/page&#39;, type: &#39;GET&#39;, data: { page: currentPage, pageSize: itemsPerPage, name: searchName, flavor: selectedFlavor // 新增:用于传递用户选择的具体口味作为过滤条件之一 }, success: function(response){ console.log(&#39;成功接收到来自服务器的数据:&#39;, response); } }); ``` #### 后端API定义与业务逻辑实现 于`DishController.java`文件内声明响应上述请求的服务方法,并利用Spring框架特性简化开发过程。此部分不仅负责解析来自客户端的信息,还调用了相应的服务层函数完成实际操作并返回结果给前端显示[^4]。 ```java /** * 菜品分页查询 */ @GetMapping(&quot;/page&quot;) @ApiOperation(&quot;菜品分页查询&quot;) public Result&lt;PageResult&gt; page(@RequestParam Map&lt;String, Object&gt; params){ log.info(&quot;菜品分页查询参数:{}&quot;, params); DishPageQueryDTO dishPageQueryDTO = new DishPageQueryDTO(); BeanUtils.copyProperties(params, dishPageQueryDTO); PageResult pageResult = dishService.pageQuery(dishPageQueryDTO); List&lt;DishVO&gt; dishesWithFlavors = convertToVOS(pageResult.getRecords()); pageResult.setRecords(dishesWithFlavors); return Result.success(pageResult); } private List&lt;DishVO&gt; convertToVOS(List&lt;DishDO&gt; records) { List&lt;DishVO&gt; vos = new ArrayList&lt;&gt;(); for (DishDO record : records) { DishVO vo = new DishVO(); BeanUtils.copyProperties(record, vo); // 查询该菜品关联的所有口味记录 List&lt;FlavorDO&gt; flavors = flavorService.listByDishId(vo.getId()); vo.setFlavors(flavors.stream().map(FlavorConverter::convert).collect(Collectors.toList())); vos.add(vo); } return vos; } ``` 在此基础上,进一步优化数据库查询效率及用户体验显得尤为重要。例如可以引入缓存机制减少重复计算;或是改进UI界面让顾客更容易找到心仪的美食选项等措施来提升整体性能表现。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值