黑马-苍穹外卖-Day4

1 新增套餐

接口设计(共涉及到4个接口):

  • 根据类型查询分类(已完成)

    • /admin/category/list
    • select * from category where status = 1 and type = 2;
    • category(分类表)type = 1返回菜品分类,type = 2返回套餐分类
    • 返回的是个列表,可以获取到分类的id
      在这里插入图片描述
  • 根据分类id查询菜品

  • 图片上传(已完成)

  • 新增套餐

1.1 根据分类id查询菜品表中该分类下的菜品

1.1.1 DishController
    /**
     * 根据分类id查询菜品
     * @param categoryId
     * @return
     */
    @GetMapping("/list")
    @ApiOperation("根据分类id查询菜品")
    public Result<List<Dish>> list(long categoryId) {
        List<Dish> list = DishService.list(categoryId);  // 返回某一分类的所有菜品
        return Result.success(list);
    }
1.1.2 DishService
    /**
     * 根据分类id查询菜品
     * @param categoryId
     * @return
     */
     List<Dish> list(long categoryId);

1.1.3 DishServiceImpl

    /**
     * 根据分类id查询菜品
     * @param categoryId
     * @return
     */
    public List<Dish> list(long categoryId) {
        Dish dish = Dish.builder()
                .categoryId((categoryId))
                .status(StatusConstant.ENABLE)
                .build();
        
        return dishMapper.list(dish);
    }
1.1.4 DishMapper
    /**
     * 根据分类id查询菜品
     * @param dish
     * @return
     */
    List<Dish> list(Dish dish);
1.1.5 DishMapper.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>

1.2 新增菜品

1.2.1 SetmealController
@RestController
@RequestMapping
@Api("套餐相关接口")
@Slf4j
public class SetmealController {

    @Autowired
    private SetmealService setmealService;

    /**
     * 新增套餐
     * @param setmealDTO
     * @return
     */
    @PostMapping
    @ApiOperation("新增套餐")
    public Result save(@RequestBody SetmealDTO setmealDTO) {
        log.info("新增套餐:", setmealDTO);
        setmealService.save(setmealDTO);
        return Result.success();
    }
}
1.2.2 SetmealService
public interface SetmealService {
    /**
     * 新增套餐
     * @param setmealDTO
     */
    void save(SetmealDTO setmealDTO);
}
1.2.3 SetmealServiceImpl
    /**
     * 新增套餐,同时保存套餐和菜品的关联关系
     * @param setmealDTO
     */
    @Transactional
    public void save(SetmealDTO setmealDTO) {
        Setmeal setmeal = new Setmeal();  // 创建一个新的套餐实体类
        BeanUtils.copyProperties(setmealDTO, setmeal);  // 属性拷贝

        // 向套餐表插入数据
        setmealMapper.insert(setmeal);

        // 获取生成的套餐id
        Long setmealId = setmeal.getId();

        List<SetmealDish> setmealDishes = setmealDTO.getSetmealDishes();
        setmealDishes.forEach(setmealDish -> {
            setmealDish.setSetmealId(setmealId);
        });

        // 套餐-菜品表中保存套餐和菜品的关联关系
        setmealDishMapper.insertBatch(setmealDishes);
    }
1.2.4 SetmealMapper
    /**
     * 新增套餐
     * @param setmeal
     */
    @AutoFill(value = OperationType.INSERT)
    void insert(Setmeal setmeal);
1.2.5 SetmealMapper.xml
  • parameterType=“com.sky.entity.Setmeal” useGeneratedKeys=“true” keyProperty=“id” ,加上后,setmeal中的id字段会自动更新
  • 如果不加,Long setmealId = setmeal.getId(); 获取到的仍是NULL,后面插入setmeal_dish表也会是NULL
    <insert id="insert" parameterType="com.sky.entity.Setmeal" useGeneratedKeys="true" keyProperty="id">
        insert into setmeal
        (category_id, name, price, status, description, image, create_time, update_time, create_user, update_user)
        values (#{categoryId}, #{name}, #{price}, #{status}, #{description}, #{image}, #{createTime}, #{updateTime},
        #{createUser}, #{updateUser})
    </insert>
1.2.6 SetmealDishMapper
    /**
     * 批量保存套餐和菜品的关联关系
     * @param setmealDishes
     */
    void insertBatch(List<SetmealDish> setmealDishes);
1.2.7 SetmealDishMapper.xml
  • 批量保存套餐和菜品的关联关系
    <insert id="insertBatch" parameterType="list">
        insert into setmeal_dish
        (setmeal_id,dish_id,name,price,copies)
        values
        <foreach collection="setmealDishes" item="sd" separator=",">
            (#{sd.setmealId},#{sd.dishId},#{sd.name},#{sd.price},#{sd.copies})
        </foreach>
    </insert>

2 套餐分页查询

2.1 SetmealController

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

2.2 SetmealService

    /**
     * 套餐分页查询
     * @param setmealPageQueryDTO
     * @return
     */
    PageResult pageQuery(SetmealPageQueryDTO setmealPageQueryDTO);

2.3 SetmealServiceImpl

    /**
     * 套餐分页查询
     * @param setmealPageQueryDTO
     * @return
     */
    public PageResult pageQuery(SetmealPageQueryDTO setmealPageQueryDTO) {
        int pageNum = setmealPageQueryDTO.getPage();
        int pageSize = setmealPageQueryDTO.getPageSize();

        PageHelper.startPage(pageNum, pageSize);
        Page<SetmealVO> page = setmealMapper.pageQuery(setmealPageQueryDTO);
        return new PageResult(page.getTotal(), page.getResult());
    }

2.4 SetmealMapper

    /**
     * 套餐分页查询
     * @param setmealPageQueryDTO
     * @return
     */
    Page<SetmealVO> pageQuery(SetmealPageQueryDTO setmealPageQueryDTO);

2.5 SetmealMapper.xml

    <select id="pageQuery" resultType="com.sky.vo.SetmealVO">
        select s.*,c.name categoryName
        from setmeal as s
        left join
        category as c
        on s.category_id = c.id
        <where>
            <if test="name != null">
                and s.name like concat('%',#{name},'%')
            </if>
            <if test="status != null">
                and s.status = #{status}
            </if>
            <if test="categoryId != null">
                and s.category_id = #{categoryId}
            </if>
        </where>
        order by s.create_time desc
    </select>

3 删除套餐

3.1 SetmealController

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

3.2 SetmealService

    /**
     * 批量删除套餐
     * @param ids
     */
    void delete(List<Long> ids);

3.3 SetmealServiceImpl

    /**
     * 批量删除套餐
     * @param ids
     */
    @Transactional
    public void delete(List<Long> ids) {
        // 判断是否有套餐处于启售状态
        ids.forEach(id -> {
            Setmeal setmeal = setmealMapper.getById(id);
            if(setmeal.getStatus() == StatusConstant.ENABLE) {
                // 有套餐处于启售状态,不能删除
                throw new DeletionNotAllowedException(MessageConstant.SETMEAL_ON_SALE);
            }
        });

        ids.forEach(setmealId -> {
            // 删除套餐表中的数据
            setmealMapper.deleteById(setmealId);
            // 删除套餐菜品关系表中的数据
            setmealDishMapper.deleteBySetmealId(setmealId);
        });
    }

3.4 SetmealMapper

  • 根据id查询套餐
    /**
     * 根据id查询套餐
     * @param id
     * @return
     */
    @Select("select * from setmeal where id = #{id}")
    Setmeal getById(Long id);
  • 根据id删除套餐
    /**
     * 根据id删除套餐
     * @param setmealId
     */
    @Delete("delete from setmeal where id = #{setmealId}")
    void deleteById(Long setmealId);

3.5 SetmealDishMapper

    /**
     * 根据id删除删除套餐菜品关系表中的数据
     * @param setmealId
     */
    @Delete("delete from setmeal_dish where setmeal_id = #{setmealId}")
    void deleteBySetmealId(Long setmealId);

4 修改套餐

4.1 根据id查询套餐

4.1.1 SetmealController
    /**
     * 根据id查询套餐,用于修改页面回显数据
     * @param id
     * @return
     */
    @GetMapping("/{id}")
    @ApiOperation("根据id查询套餐")
    public Result<SetmealVO> getById(@PathVariable Long id) {
        SetmealVO setmealVO = setmealService.getByIdWithDish(id);  // 套餐以及套餐下属菜品列表都返回了
        return Result.success(setmealVO);
    }
4.1.2 SetmealService
    /**
     * 根据id查询套餐和关联的菜品数据
     * @param id
     * @return
     */
    SetmealVO getByIdWithDish(Long id);
4.1.3 SetmealServiceImpl
    /**
     * 根据id查询套餐和关联的菜品数据
     * @param id
     * @return
     */
    public SetmealVO getByIdWithDish(Long id) {
        Setmeal setmeal = setmealMapper.getById(id);
        List<SetmealDish> setmealDishes = setmealDishMapper.getBySetmealId(id);
        
        SetmealVO setmealVO = new SetmealVO();
        BeanUtils.copyProperties(setmeal, setmealVO);
        setmealVO.setSetmealDishes(setmealDishes);
        return setmealVO;
    }
4.4 SetmealDishMapper
    /**
     * 根据套餐id查询套餐和菜品的关联关系
     * @param setmealId
     * @return
     */
    @Select("select * from setmeal_dish where setmeal_id = #{setmealId}")
    List<SetmealDish> getBySetmealId(Long setmealId);

4.2 修改套餐

4.2.1 SetmealController
    /**
     * 修改套餐
     * @param setmealDTO
     * @return
     */
    @PutMapping
    @ApiOperation("修改套餐")
    public Result update(@RequestBody SetmealDTO setmealDTO) {
        setmealService.update(setmealDTO);
        return Result.success();
    }
4.2.2 SetmealService
    /**
     * 修改套餐
     * @param setmealDTO
     */
    void update(SetmealDTO setmealDTO);
4.2.3 SetmealServiceImpl
   /**
     * 修改套餐
     * @param setmealDTO
     */
    @Transactional
    public void update(SetmealDTO setmealDTO) {
        Setmeal setmeal = new Setmeal();
        BeanUtils.copyProperties(setmealDTO, setmeal);

        // 修改套餐表 -- update
        setmealMapper.update(setmeal);

        // 套餐id
        Long setmealId = setmealDTO.getId();

        // 删除套餐和菜品的关联关系 -- 根据套餐id删除套餐-菜品表中的记录
        setmealDishMapper.deleteBySetmealId(setmealId);

        // 重新向套餐-菜品表中插入套餐-菜品的关联关系 -- insert
        List<SetmealDish> setmealDishes = setmealDTO.getSetmealDishes();
        setmealDishes.forEach(setmealDish -> {
            setmealDish.setSetmealId(setmealId);  // 加上套餐id
        });
        setmealDishMapper.insertBatch(setmealDishes);
    }
4.2.4 SetmealMapper
    /**
     * 更新套餐
     * @param setmeal
     */
    @AutoFill(value = OperationType.UPDATE)
    void update(Setmeal setmeal);
4.2.5 SetmealMapper.xml
  • 别忘了,
    <update id="update" parameterType="com.sky.entity.Setmeal">
        update setmeal
        <set>
            <if test="name != null">name = #{name} ,</if>
            <if test="categoryId != null">category_id = #{categoryId} ,</if>
            <if test="price != null">price = #{price} ,</if>
            <if test="image != null">image = #{image} ,</if>
            <if test="description != null">description = #{description} ,</if>
            <if test="status != null">status = #{status} ,</if>
            <if test="updateTime != null">update_time = #{updateTime} ,</if>
            <if test="updateUser != null">update_user = #{updateUser} ,</if>
        </set>
        where id = #{id}
    </update>

5 起售停售套餐

5.1 SetmealController

    /**
     * 套餐启售停售
     * @param status
     * @param id
     * @return
     */
    @PostMapping("/status/{status}")
    @ApiOperation("套餐启售停售")
    public Result startOrStop(@PathVariable Integer status, Long id) {
        log.info("启售停售套餐: {} -- {}", status, id);
        setmealService.startOrStop(status, id);
        return Result.success();
    }

5.2 SetmealService

    /**
     * 套餐启售停售
     * @param status
     * @param id
     */
    void startOrStop(Integer status, Long id);

5.3 SetmealServiceImpl

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

        // 启售套餐时,判断套餐内是否有停售菜品,有停售菜品提示"套餐内包含未启售菜品,无法启售"
        if(status == StatusConstant.ENABLE) { // 准备启售套餐
        // select a.* from dish as a left join setmeal_dish as b on a.id = b.dish_id where b.setmeal_id = ?
            List<Dish> dishList = dishMapper.getBySetmealId(id);  // 根据套餐id查询菜品,返回菜品列表
            if(dishList != null && dishList.size() > 0) {
                dishList.forEach(dish -> {
                    if(dish.getStatus() == StatusConstant.DISABLE) {  // 只有有一个菜品是停售的
                        throw new SetmealEnableFailedException(MessageConstant.SETMEAL_ENABLE_FAILED);
                    }
                });
            }
        }

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

5.4 DishMapper

    /**
     * 根据套餐id查询菜品
     * @param setmealId
     * @return
     */
    @Select("select a.* from dish as a left join setmeal_dish as b on a.id = b.dish_id where b.setmeal_id = #{setmealId}")
    List<Dish> getBySetmealId(Long setmealId);
  • 15
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
黑马程序员苍穹外卖项目中的Nginx配置文件可以根据具体需求进行配置。根据引用\[1\]中的描述,可以通过双击nginx.exe启动Nginx,并在http://localhost/访问前端页面。这意味着Nginx的配置文件应该包含有关前端页面的相关配置。另外,根据引用\[2\]中的描述,Nginx还可以用作反向代理和负载均衡,因此配置文件还应包含有关反向代理和负载均衡的相关配置。最后,根据引用\[3\]中的描述,苍穹外卖项目还需要与第三方配送公司进行对接和管理,因此配置文件还应包含有关与第三方配送公司对接的相关配置。综上所述,黑马程序员苍穹外卖项目的Nginx配置文件应包含前端页面的相关配置、反向代理和负载均衡的相关配置以及与第三方配送公司对接的相关配置。 #### 引用[.reference_title] - *1* [黑马程序员_Java项目实战《苍穹外卖》_Day01_开发环境搭建](https://blog.csdn.net/BallerWang9/article/details/131824385)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [最适合新手的SpringBoot+SSM项目《苍穹外卖》实战—(一)项目概述](https://blog.csdn.net/qq_20185737/article/details/131575898)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值