套餐管理
- 1 任務
- 2 新增套餐
- 2.1 需求分析和設計
- 接口設計
- setmeal和setmeal_dish表設計
- 2.2 代碼開發
- 2.2.1 根據分類id查詢菜品
- DishController
- DishService
- DishServiceImpl
- DishMapper
- DishMapper.xml
- 2.2.2 新增套餐接口
- SetmealController
- SetmealService
- SetmealServiceImpl
- SetmealMapper 新增套餐
- SetmealMapper.xml
- SetmealDishMapper 保存套餐和菜品的關聯關系
- SetmealDishMapper.xml
- 2.3 功能測試
- 3 套餐分頁查詢
- 3.1 需求分許和設計
- 3.2 代碼實現
- SetmealController
- SetmealService
- SetmealServiceImpl
- SetmealMapper
- SetmealMapper.xml
- 3.3 測試
- 4 刪除套餐
- 4.1 需求分析和設計
- 4.2 代碼實現
- SetmealController
- SetmealService
- SetmealServiceImpl
- SetmealMapper
- SetmealDishMapper
- 4.3 功能測試
- 5 修改套餐
- 5.1 需求分析和設計
- 5.2 代碼實現
- 5.3 功能測試
1 任務
完成套餐管理模塊所有業務功能,包括:
- 新增套餐
- 套餐分頁查詢
- 刪除套餐
- 修改套餐
- 起售停售套餐
要求:
- 根據產品原型進行需求分析,分析出業務規則
- 設計接口
- 梳理表之間的關系(分類表、菜品表、套餐表、口味表、套餐菜品關系表)
- 根據接口設計進行代碼實現
- 分別通過swagger接口文檔和前后端聯調進行功能測試
2 新增套餐
2.1 需求分析和設計
以下是根據分類id查詢菜品
1 字段:
1.1 排序:創建時間的倒序排列,單頁最多顯示10條
2 添加菜品
2.1點擊添加菜品按鈕,彈出添加菜品彈窗,菜品可以多選
2.2已選菜品數量超過7個顯示滾動條,已選菜品列表根據添加時間倒序排列
3 字段限制
3.1 字段限制
3.2 套餐圖片上傳
點擊上傳圖片,上傳本地圖片。再次點擊,修改圖片。
1 圖片限制
圖片大小不超過2M
僅能上傳PNG JPG JPEG類型圖片
建議上傳200200或300300尺寸的圖片
2 異常提示
圖片過大,上傳失敗
格式錯誤,上傳失敗
3.3 套餐描述,選填,限制輸入最大不超過200個漢字、字母大小寫、阿拉伯數字。不符合限制提示,“套餐描述輸入不符,請輸入少于200個字”;
接口設計
需要用的接口:
- 根據分類id查詢菜品
- 套餐管理中新增菜單接口
- 上傳圖片(完成)
- 根據類型查詢分類(完成)
根據分類id查詢菜品
套餐管理中新增菜單接口
setmeal和setmeal_dish表設計
setmeal表為套餐表,用于存儲套餐的信息。
字段名 | 數據類型 | 說明 | 備注 |
---|---|---|---|
id | bigint | 主鍵 | 自增 |
name | varchar(32) | 套餐名稱 | 唯一 |
category_id | bigint | 分類id | 邏輯外鍵 |
price | decimal(10,2) | 套餐價格 | |
image | varchar(255) | 圖片路徑 | |
description | varchar(255) | 套餐描述 | |
status | int | 售賣狀態 | 1起售 0停售 |
create_time | datetime | 創建時間 | |
update_time | datetime | 最后修改時間 | |
create_user | bigint | 創建人id | |
update_user | bigint | 最后修改人id |
setmeal_dish表為套餐菜品關系表,用于存儲套餐和菜品的關聯關系。
字段名 | 數據類型 | 說明 | 備注 |
---|---|---|---|
id | bigint | 主鍵 | 自增 |
setmeal_id | bigint | 套餐id | 邏輯外鍵 |
dish_id | bigint | 菜品id | 邏輯外鍵 |
name | varchar(32) | 菜品名稱 | 冗余字段 |
price | decimal(10,2) | 菜品單價 | 冗余字段 |
copies | int | 菜品份數 |
2.2 代碼開發
- 根據分類id查詢菜品
- 新增套餐接口
2.2.1 根據分類id查詢菜品
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);
}
DishService
/*** 根據分類id查詢菜品* @param categoryId* @return
*/
List<Dish> list(Long categoryId);
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);
}
DishMapper
/*** 動態條件查詢菜品* @param dish* @return
*/
List<Dish> list(Dish dish);
DishMapper.xml
<select id="list" resultType="Dish" parameterType="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>
2.2.2 新增套餐接口
SetmealController
/*** 套餐管理*/
@RestController
@RequestMapping("/admin/setmeal")
@Api(tags = "套餐相關接口")
@Slf4j
public class SetmealController {@Autowiredprivate SetmealService setmealService;/*** 新增套餐* @param setmealDTO* @return*/@PostMapping@ApiOperation("新增套餐")public Result save(@RequestBody SetmealDTO setmealDTO) {setmealService.saveWithDish(setmealDTO);return Result.success();}
}
SetmealService
public interface SetmealService {/*** 新增套餐,同時需要保存套餐和菜品的關聯關系* @param setmealDTO*/void saveWithDish(SetmealDTO setmealDTO);
}
SetmealServiceImpl
/*** 套餐業務實現*/
@Service
@Slf4j
public class SetmealServiceImpl implements SetmealService {@Autowiredprivate SetmealMapper setmealMapper;@Autowiredprivate SetmealDishMapper setmealDishMapper;@Autowiredprivate DishMapper dishMapper;/*** 新增套餐,同時需要保存套餐和菜品的關聯關系* @param setmealDTO*/@Transactionalpublic void saveWithDish(SetmealDTO setmealDTO) {Setmeal setmeal = new Setmeal();BeanUtils.copyProperties(setmealDTO, setmeal);//向套餐表插入數據setmealMapper.insert(setmeal);//獲取生成的套餐idLong setmealId = setmeal.getId();List<SetmealDish> setmealDishes = setmealDTO.getSetmealDishes();setmealDishes.forEach(setmealDish -> {setmealDish.setSetmealId(setmealId);});//保存套餐和菜品的關聯關系setmealDishMapper.insertBatch(setmealDishes);}
}
SetmealMapper 新增套餐
/*** 新增套餐* @param setmeal
*/
@AutoFill(OperationType.INSERT)
void insert(Setmeal setmeal);
SetmealMapper.xml
<insert id="insert" parameterType="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>
SetmealDishMapper 保存套餐和菜品的關聯關系
/*** 批量保存套餐和菜品的關聯關系* @param setmealDishes
*/
void insertBatch(List<SetmealDish> setmealDishes);
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.3 功能測試
3 套餐分頁查詢
3.1 需求分許和設計
產品原型和業務規則
- 根據頁碼進行分頁展示
- 每頁展示10條數據
- 可以根據需要,按照套餐名稱、分類、售賣狀態進行查詢
接口設計
查看Apifox
3.2 代碼實現
這個建議參考之前實現的分頁功能
SetmealController
/*** 分頁查詢* @param setmealPageQueryDTO* @return
*/
@GetMapping("/page")
@ApiOperation("分頁查詢")
public Result<PageResult> page(SetmealPageQueryDTO setmealPageQueryDTO) {PageResult pageResult = setmealService.pageQuery(setmealPageQueryDTO);return Result.success(pageResult);
}
SetmealService
/*** 分頁查詢* @param setmealPageQueryDTO* @return
*/
PageResult pageQuery(SetmealPageQueryDTO setmealPageQueryDTO);
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());
}
SetmealMapper
/*** 分頁查詢* @param setmealPageQueryDTO* @return
*/
Page<SetmealVO> pageQuery(SetmealPageQueryDTO setmealPageQueryDTO);
SetmealMapper.xml
<select id="pageQuery" resultType="com.sky.vo.SetmealVO">selects.*,c.name categoryNamefromsetmeal sleft joincategory cons.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 測試
4 刪除套餐
4.1 需求分析和設計
產品原型和
見資料
業務規則
- 可以一次刪除一個套餐,也可以批量刪除套餐
- 起售中的套餐不能刪除
接口設計
4.2 代碼實現
SetmealController
/*** 批量刪除套餐* @param ids* @return
*/
@DeleteMapping
@ApiOperation("批量刪除套餐")
public Result delete(@RequestParam List<Long> ids){setmealService.deleteBatch(ids);return Result.success();
}
SetmealService
/*** 批量刪除套餐* @param ids
*/
void deleteBatch(List<Long> ids);
SetmealServiceImpl
/*** 批量刪除套餐* @param ids
*/
@Transactional
public void deleteBatch(List<Long> ids) {ids.forEach(id -> {Setmeal setmeal = setmealMapper.getById(id);if(StatusConstant.ENABLE == setmeal.getStatus()){//起售中的套餐不能刪除throw new DeletionNotAllowedException(MessageConstant.SETMEAL_ON_SALE);}});ids.forEach(setmealId -> {//刪除套餐表中的數據setmealMapper.deleteById(setmealId);//刪除套餐菜品關系表中的數據setmealDishMapper.deleteBySetmealId(setmealId);});
}
SetmealMapper
/*** 根據id查詢套餐* @param id* @return
*/
@Select("select * from setmeal where id = #{id}")
Setmeal getById(Long id);/*** 根據id刪除套餐* @param setmealId
*/
@Delete("delete from setmeal where id = #{id}")
void deleteById(Long setmealId);
SetmealDishMapper
/*** 根據套餐id刪除套餐和菜品的關聯關系* @param setmealId
*/
@Delete("delete from setmeal_dish where setmeal_id = #{setmealId}")
void deleteBySetmealId(Long setmealId);
4.3 功能測試
5 修改套餐
5.1 需求分析和設計
頁面原型和業務規則
-
套餐名稱唯一
-
套餐必須屬于某個分類
-
套餐必須包含菜品
-
名稱、分類、價格、圖片為必填項
-
添加菜品窗口需要根據分類類型來展示菜品
-
新增的套餐默認為停售狀態
接口設計 -
根據id查詢套餐
-
修改套餐
-
根據類型查詢分類(已完成)
-
根據分類id查詢菜品(已完成)
-
圖片上傳(已完成)