苍穹外卖Day04-套餐管理

文章详细描述了如何使用JavaSpringBoot实现套餐管理的创建、查询、分页查询、删除和更新功能,包括DishController和服务层的实现,以及与数据库交互的MapperXML文件的编写。此外,还涉及到了状态管理,如套餐的起售和停售操作。

因为day-4属于作业部分,主要是完成套餐的CRUD,这里我就写下自己的思路以及代码

这里先实现新增功能,接口图如下:

 (视频里面的接口管理平台已经关闭了,这里是我自己搭建的一个Yapi平台,地址如下,大家可以免费使用YApi Pro-高效、易用、功能强大的可视化接口管理平台

首先在DishController添加一个根据分类id查询菜品的控制类:

 /**
     * 根据分类ID查询菜品
     * @param categoryId
     * @return
     */
   @GetMapping("/list")
   @ApiOperation("根据分类id查询菜品")
   public  Result<List<Dish>> list(Long categoryId){
       log.info("分类id查询菜品:{}",categoryId);
       List<Dish> list= dishService.getList(categoryId);
       return Result.success(list);
        
   }

在DishService写上方法

 /**
     * 根据分类id查询菜品
     * @param categoryId
     * @return
     */
    List<Dish> getList(Long categoryId);

在DishServiceImpl实现一下方法:
 

 /**
     * 根据分类ID查询菜品
     * @param categoryId
     * @return
     */
    @Override
    public List<Dish> getList(Long categoryId) {
        Dish dish= Dish.builder()
                .categoryId(categoryId)
                .status(StatusConstant.ENABLE)
                .build();
        return dishMapper.list(dish);
        return null;
    }

编写Dishmapper.xml,这里我们采用的是动态查询,所以我们使用xml编写,而不是注释,将查询出来的结果根据创建时间进行降序排序:

<select id="list" resultType="com.sky.entity.Dish">
        select * from dish
        <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>

接下来我们做套餐管理的新增,这里大家可以测试一下查询功能

”------------------------------------------------分割线-----------------------------------------------------------------“

新建一个SetmealController控制类,新建SetmealService和SetmealServiceimpl类,这里我就省略创建步骤了,大家自行创建:

 


/**
 * 套餐管理
 */

@RestController
@RequestMapping("/admin/setmeal")
@Api(tags = "套餐管理相关接口")
@Slf4j
public class SetmealController {
  
    @Autowired
    private SetmealService setmealService;


}

编写新增控制方法:
 


    @PostMapping
    @ApiOperation("新增套餐")
    public Result save(@RequestBody SetmealDTO setmealDTO){
        //根据前面老师的思路采用DTO作为对象
        log.info("新增菜品信息:{}",setmealDTO);
        setm
苍穹外卖项目中,套餐分类功能的实现通常涉及到数据库操作、业务逻辑处理以及异常管理等多个层面。以`SetmealServiceImpl`类中的`startOrStop`方法为例,该方法负责处理套餐的启用与停用操作,其中涉及到了分类逻辑的一部分[^1]。 ### 套餐分类功能实现 #### 数据库设计 - **表结构**:通常会有一个`setmeal`表来存储套餐的基本信息,包括但不限于套餐ID(`id`)、状态(`status`)等字段。 - **关联表**:为了支持套餐菜品之间的多对多关系,通常还会有一个`setmeal_dish`关联表,包含`setmeal_id`和`dish_id`等字段。 #### 业务逻辑 - **启用套餐**:当尝试启用一个套餐时,需要检查该套餐下的所有菜品是否都处于启用状态。如果存在任何未启用的菜品,则抛出异常,阻止套餐的启用操作。 - **停用套餐**:停用套餐相对简单,只需要更改套餐的状态即可,但可能也需要考虑是否要同步更改套餐菜品的状态,这取决于具体的业务需求。 #### 异常处理 - 在执行套餐启用或停用操作时,如果遇到任何异常情况,如数据库连接失败、SQL执行错误等,应该捕获这些异常并记录详细的错误信息,以便后续排查问题。 ### 示例代码 下面是一个简化版的`startOrStop`方法实现,用于演示如何处理套餐的启用与停用操作: ```java public Optional<Boolean> startOrStop(Integer status, Long id) { boolean updateSuccess = false; try { // 起售套餐时,判断套餐内是否有停售菜品 if (status == StatusConstant.ENABLE) { List<Dish> dishList = dishMapper.getBySetmealId(id); if (dishList != null && dishList.size() > 0) { dishList.forEach(dish -> { if (StatusConstant.DISABLE == dish.getStatus()) { throw new SetmealEnableFailedException("套餐内包含未启售菜品,无法启售"); } }); } } // 查询套餐完整信息 Setmeal setmeal = setmealMapper.getById(id); if (setmeal != null) { // 更新套餐状态 setmeal.setStatus(status); int rowsAffected = setmealMapper.update(setmeal); updateSuccess = rowsAffected > 0; } } catch (Exception e) { // 记录错误日志 log.error("套餐起售停售操作出错: ", e); } return Optional.of(updateSuccess); } ``` ### 相关问题 1. 如何在Java中处理数据库操作中的异常? 2. 在实现套餐启用功能时,如何确保所有关联菜品的状态正确无误? 3. 套餐停用操作是否需要同步更改套餐菜品的状态?为什么? 4. 如何优化套餐启用或停用操作的性能? 以上内容基于提供的引用和一般性的软件开发实践编写,具体实现细节可能会根据项目的实际需求有所不同。希望这些信息能够帮助理解苍穹外卖day04套餐分类功能的实现方式及其背后的逻辑。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值