蒼穹外賣筆記-08-套餐管理-增加,刪除,修改,查詢和起售停售套餐

套餐管理

  • 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 任務

完成套餐管理模塊所有業務功能,包括:

  • 新增套餐
  • 套餐分頁查詢
  • 刪除套餐
  • 修改套餐
  • 起售停售套餐

要求:

  1. 根據產品原型進行需求分析,分析出業務規則
  2. 設計接口
  3. 梳理表之間的關系(分類表、菜品表、套餐表、口味表、套餐菜品關系表)
  4. 根據接口設計進行代碼實現
  5. 分別通過swagger接口文檔和前后端聯調進行功能測試
    在這里插入圖片描述

2 新增套餐

2.1 需求分析和設計

在這里插入圖片描述

以下是根據分類id查詢菜品
根據分類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表為套餐表,用于存儲套餐的信息。

字段名數據類型說明備注
idbigint主鍵自增
namevarchar(32)套餐名稱唯一
category_idbigint分類id邏輯外鍵
pricedecimal(10,2)套餐價格
imagevarchar(255)圖片路徑
descriptionvarchar(255)套餐描述
statusint售賣狀態1起售 0停售
create_timedatetime創建時間
update_timedatetime最后修改時間
create_userbigint創建人id
update_userbigint最后修改人id

setmeal_dish表為套餐菜品關系表,用于存儲套餐和菜品的關聯關系。

字段名數據類型說明備注
idbigint主鍵自增
setmeal_idbigint套餐id邏輯外鍵
dish_idbigint菜品id邏輯外鍵
namevarchar(32)菜品名稱冗余字段
pricedecimal(10,2)菜品單價冗余字段
copiesint菜品份數

在這里插入圖片描述

在這里插入圖片描述

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查詢菜品(已完成)

  • 圖片上傳(已完成)

5.2 代碼實現

5.3 功能測試

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/24175.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/24175.shtml
英文地址,請注明出處:http://en.pswp.cn/web/24175.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

c++替換字符或字符串函數

在C中&#xff0c;有多種方法可以替換字符串或字符。下面是一些常用的方法&#xff1a; 使用replace函數&#xff1a; replace函數可以替換字符串中的指定字符或子字符串。它的用法如下&#xff1a; string str "Hello World"; str.replace(str.find("World&qu…

Nginx03-動態資源和LNMP介紹與實驗、自動索引模塊、基礎認證模塊、狀態模塊

目錄 寫在前面Nginx03案例1 模擬視頻下載網站自動索引autoindex基礎認證auth_basic模塊狀態stub_status模塊模塊小結 案例2 動態網站&#xff08;部署php代碼&#xff09;概述常見的動態網站的架構LNMP架構流程數據庫Mariadb安裝安全配置基本操作 PHP安裝php修改配置文件 Nginx…

AI做的2024年高考數學試卷,答案對嗎?

2024年高考數學考試已經結束&#xff0c;現在呈上數學真題及AI給出的解答。供各位看官欣賞。 總的來說&#xff0c;人工做題兩小時&#xff0c;AI解答兩分鐘。 但是&#xff0c;AI做的答案是否正確&#xff0c;那就要各位看官來評判了&#xff01; 注&#xff1a;試卷來源于…

【Linux】另一種基于rpm安裝yum的方式

之前的163的鏡像源504網關異常了&#xff0c;網上找到的方法基本都是基于apt&#xff0c;或是基于apt-get。找到了大佬幫忙裝了一下&#xff0c;記錄如下&#xff1a; wget https://vault.centos.org/7.9.2009/os/x86_64/Packages/yum-metadata-parser-1.1.4-10.el7.x86_64.rpm…

2024年5大制作AI電子手冊工具推薦

AI電子手冊作為一種結合了人工智能技術和傳統電子手冊功能的新型工具&#xff0c;逐漸成為了企業進行知識管理和信息傳遞的重要工具&#xff0c;為企業提高效率、優化用戶體驗。在本文中&#xff0c;LookLook同學將簡單介紹一下什么是AI電子手冊、對企業有什么好處&#xff0c;…

JAVA面試中,面試官最愛問的問題。

Optional類是什么&#xff1f;它在Java中的用途是什么&#xff1f; Java中的Optional類是一個容器類&#xff0c;它用于封裝可能為空的對象。在Java 8之前&#xff0c;空值檢查是Java編程中一個常見的問題&#xff0c;尤其是在處理返回單個值的方法時。Optional類提供了一種更…

電源變壓器的作用和性能

電源變壓器的主要作用是改變輸入電壓的大小&#xff0c;通常用于降低電壓或升高電壓&#xff0c;以便適應不同設備的需求。它們還可以提供隔離&#xff0c;使得輸出電路與輸入電路之間電氣隔離&#xff0c;從而提高安全性。性能方面&#xff0c;電源變壓器需要具有高效率、低溫…

Unity3D測量距離實現方法(一)

系列文章目錄 unity工具 文章目錄 系列文章目錄&#x1f449;前言&#x1f449;一、Unity距離測量1-1 制作預制體1-2 編寫測量的腳本 &#x1f449;二、鼠標點擊模型進行測量&#x1f449;二、字體面向攝像機的方法&#x1f449;二、最短距離測量方法&#x1f449;三、壁紙分享…

Python中的裝飾器鏈(decorator chain)是什么

在Python中&#xff0c;裝飾器是一種高級功能&#xff0c;它允許你在不修改函數或類代碼的情況下&#xff0c;為它們添加額外的功能。裝飾器通常用于日志記錄、性能測量、權限檢查等場景。當多個裝飾器應用于同一個函數或類時&#xff0c;它們會形成一個裝飾器鏈&#xff08;de…

Go語言中,公司gitlab私有倉庫依賴拉取配置

為什么要考慮私有倉庫 Go語言目前都已經采用了官方統一的 go modules 來管理依賴&#xff0c;后續也不太可能出現比較亂的生態&#xff0c; 因此了解下如何讓這個依賴管理正常工作是非常必要的。 對于Github或者其他公有倉庫&#xff0c;依賴管理是非常直接和方便的,設置好GO…

C++ 依賴的C庫查看和下載

依賴庫查詢&#xff1a;ldd 指令 # ldd libcyber.solinux-vdso.so.1 (0x0000ffff86b52000)libopt_proto.so > /home/caros/cyberrt/lib/libopt_proto.so (0x0000ffff84c4a000)libboost_filesystem.so.1.73.0 > /opt/orin/usr/local/lib/libboost_filesystem.so.1.73.0 (…

Java版工程項目管理平臺:以源碼驅動,引領工程企業數字化轉型

在當今數字化時代&#xff0c;隨著企業的擴張和業務的增長&#xff0c;傳統的工程項目管理方法已顯不足。為了提升管理效率、減輕工作負擔、增強信息處理的快速性和精確度&#xff0c;工程企業亟需借助數字化技術進行轉型升級。本文將向您展示一款基于Spring Cloud、Spring Boo…

SS2D反向傳播問題記錄【未解決】

使用SS2D寫了一個簡單的神經網絡進行訓練&#xff0c;但是訓練報錯&#xff1a; NotImplementedError: You must implement either the backward or vjp method for your custom autograd.Function to use it with backward mode AD. 環境&#xff1a; CUDA11.8 torch2.0.0 mam…

AI大模型日報#0607:10家國產大模型、GPT-4o挑戰高考作文 | OpenAI公開破解GPT-4新方法

導讀&#xff1a;AI大模型日報&#xff0c;爬蟲LLM自動生成&#xff0c;一文覽盡每日AI大模型要點資訊&#xff01;目前采用“文心一言”&#xff08;ERNIE 4.0&#xff09;、“零一萬物”&#xff08;Yi-Large&#xff09;生成了今日要點以及每條資訊的摘要。歡迎閱讀&#xf…

TS 系列:使用元祖生成聯合類型

需求&#xff1a;有這么個需求&#xff0c;我們有兩個數組&#xff0c;一個記錄撲克牌花色&#xff0c;一個記錄撲克牌點數&#xff0c;需要有一個函數&#xff0c;傳遞兩個值&#xff0c;根據傳遞的值生成撲克牌&#xff0c;需要我們定義參數的類型檢查。 思路&#xff1a;肯…

2024速通python之python高階技巧

文章目錄 一、閉包1.什么是閉包2.優缺點3.nonlocal關鍵字 二、裝飾器1.什么是裝飾器2.舉例3.傳統方式4.裝飾器方式5.語法糖寫法 三、多線程1.線程參數2.多線程編程 四、網絡編程1.Socket服務端編程2.Socket客戶端編程 「章節總覽」 ??????【2024速通python之python基礎…

超過20W個高質量組件的開源PCB庫

項目介紹 Celestial Altium Library是由Altium行業專家Mark Harris創建的一個龐大的免費開源數據庫庫&#xff0c;專為Altium Designer而設計&#xff0c;庫中包含超過20萬個優質組件 . 特點 高質量數據&#xff1a;Celestial Altium Library注重數據的質量&#xff0c;用戶可…

Day14:響應式網頁

通過媒體查詢、Bootstrap 框架完成騰訊全端網頁響應式布局。 一、響應式布局方案 1、什么是響應式布局 它的主要特點是能夠使網頁根據不同的設備屏幕尺寸&#xff08;如桌面電腦、平板電腦、手機等&#xff09;和分辨率自動調整布局和顯示效果&#xff0c;以提供最佳的用戶體…

python的plt.axis()、plt.xlim() 和 plt.ylim()函數

坐標軸相關設置1、plt.axis():坐標軸設置 函數 plt.axis(*v, **kwargs) 主要用于設置坐標軸的屬性,返回值為當前的坐標軸范圍 [xmin, xmax, ymin, ymax],幾種調用方式如下: 調用方式 說明 axis() 返回當前的坐標軸范圍 [xmin, xmax, ymi…

pytorch構建模型訓練數據集

pytorch構建模型訓練數據集 pytorch構建模型訓練數據集1.AlexNet:1.1.導入必要的庫&#xff1a;1.2.數據預處理和增強&#xff1a;1.3.加載數據集&#xff1a;1.4.劃分測試集和訓練集&#xff1a;1.5.創建數據加載器&#xff1a;1.6.加載AlexNet模型&#xff1a;1.7.修改模型以…