瑞吉外賣專案覆盤

2023-03-20 18:06:45

建立專案:建立boot專案,選中web和Mysql。匯入專案需要的相關依賴Mybatis-plus:baomidou、druid等。

一、後臺管理

1、後臺員工登入退出

建立Filter過濾器檢查使用者是否已經完成登入(session中是否有id)才允許放行本次請求:若使用者員工已經登入,則將員工的id存在session中,放行。否則向前端響應NOTLOGIN欄位,前端進行處理跳回登入頁面。判斷使用者登入時要進行密碼和status校驗。

點選退出登入:刪除session中的id。

2、頁面進行分頁查詢(MP攔截器完成分頁查詢):設定MP的分頁外掛分頁攔截器。建立分頁構造器和條件構造器完成滿足條件的分頁查詢。

3、對後臺員工資訊進行新增(新增)、修改(編輯資訊或改變啟用禁用狀態)、刪除、(前端傳送ajax請求、Controller伺服器端呼叫Service方法,Service呼叫Mapper對資料庫進行操作完成該次請求,返回處理結果相關資料)

【套餐/餐品的分類管理、菜品管理、套餐管理、訂單明細的分頁查詢、修改、刪除、批次修改和刪除操作都可歸結為:前端傳送ajax請求,以json或鍵值對、路徑拼接的方式傳遞引數,伺服器端Controller呼叫相應的Service方法、Service呼叫Mapper對資料庫進行操作完成該次請求,最終返回處理結果資料】

例外處理機制:首先建立全域性例外處理類,新增註解攔截所有Controller和RestController中的異常進行處理,在該類中定義不同的例外處理方法,方法上新增註解表示該方法具體處理哪一種異常。自定義業務異常也可再全域性例外處理類中定義方法來捕捉。

菜品和套餐的啟售和停售需注意:當停售某個菜品後,包含該菜品的所有套餐也應該停售,涉及到兩張表的更新要在方法上開啟事務管理保證對資料庫的多次操作同成功同失敗。當啟售套餐時,應先保證該套餐裡包含的所有菜品都在啟售狀態中才可以啟售,否則向前端返回結果【套餐記憶體在商品停售中不能啟售】等提示資訊。

由於一個菜品dish可以包含多個口味,為了方便進行處理,建立DishDto類繼承dish並加入口味dishFlavor列表資訊。如在進行菜品修改時,要通過菜品id查詢該菜品的口味資訊後封裝成dishDto返回到前端進行菜品資訊的詳細展示。新增/刪除菜品時還要根據菜品id新增/刪除關聯的口味資訊。

在進行套餐setmeal管理時,同樣一個套餐包含多個dish,因此建立SetmealDto進行setmeal並加入dish菜品列表資訊。在套餐更新修改時,同樣要通過套餐id查詢該套餐的資訊和對應的菜品List<dish>資訊,封裝成setmealDto返回到前端進行套餐資訊的詳細展示。新增/刪除套餐時同樣要新增/刪除對應包含的菜品資訊。

4、靜態資源對映:【WebMvcConfigurationSupport】重寫方法,由於預設情況下,只能存取到templates和static下的靜態資源,因此需要設定靜態資源對映

5、訊息轉換器:【WebMvcConfigurationSupport】重寫方法,擴充套件訊息轉換器。由於js對long型資料進行處理時丟失精度,因此在伺服器端給頁面響應json資料時進行處理,將long型資料統一轉為String字串。基於jackson進行java到json資料的轉換。

6、公共欄位填充:Mybatis Plus公共欄位自動填充,也就是在插入或更新的時候為指定欄位賦予指定的值,使用它的好處就是可以統一對這些欄位進行處理,避免了重複程式碼。首先在實體類的屬性上加入了@TableField註解,指定自動填充的策略,編寫後設資料物件處理器,新建一個類,在此類中統一為公共欄位賦值,此類需要實現MetaObjectHandler介面並重寫方法:在進行插入和更新操作時為哪些欄位賦值如updateTime。

7、ThreadLocal:由於MyMetaObjectHandler類中是不能獲得HttpSession物件的,所以需要通過其它方式來獲取登入使用者id。

ThreadLocal並不是一個Thread,而是Thread的區域性變數。當使用ThreadLocal維護變數時,ThreadLocal為每個使用該變數的執行緒提供獨立的變數副本,所以每一個執行緒都可以獨立地改變自己的副本,而不會影響其它執行緒所對應的副本。

ThreadLocal為每個執行緒提供單獨一份儲存空間,具有執行緒隔離的效果,只有線上程內才能獲取到對應的值,執行緒外則不能存取。

因此編寫一個基於ThreadLocal封裝的工具類使用ThreadLocal的set和get方法來儲存和獲取使用者id。在檢查使用者登入的Filter就可以呼叫ThreadLocal中的set方法儲存id,在公共欄位填充類中呼叫ThreadLocal的get方法獲取id賦值。

 二、行動端管理

1、行動端使用者進行存取頁面同樣要經過過濾器盤Filter判斷登入狀態,通過session驗證使用者是否登入,若登入則放行操作,若未登入則向前端響應對應資料。

在使用者進行登入時傳送ajax請求,伺服器端Controller經過手機號和驗證碼比對若成功則將id寫入session,使用者退出則移除對應session。

2、使用者地址管理:查詢所有地址、獲取預設地址、設定預設地址、新增地址、刪除地址都是前端傳送相應的ajax請求,伺服器端Controller呼叫Service方法,Service呼叫Mapper對資料庫進行操作,最終向前端響應結果。

3、購物車管理:新增購入車要先查詢購物車中是否已經存在該菜品,若存在則將數量加一,否則插入該條資料。同理刪除購物車也要判斷菜品資料是否為1,若為了則刪除資料否則只將菜品數量減一。

4、使用者下單後會對兩張表進行操作:orders訂單表和orderDetail訂單明細表。訂單表中的訂單包含下單使用者等基本資訊,訂單明細表包含具體的菜品資訊。前端傳送ajax請求下單,伺服器端Controllerr呼叫Service方法,service呼叫Mapper對資料庫表操作向訂單表中插入一條資料,然後通過使用者id查詢購物車進而將具體菜品資料插入訂單明細表,最後清空購物車完成使用者下單操作。

5、使用者查詢歷史訂單時,一個訂單對應多條訂單明細,因此將order和orderDetail封裝成orderDto。分頁查詢完成後向前端返回分頁orderDto詳細訂單資料。

6、當用戶點選再來一單時,前端傳送ajax請求,引數為訂單id,伺服器端Controller呼叫service,service呼叫mapper對資料庫進行操作,最終向前端返回操作結果:

通過訂單id獲取原訂單以及原訂單明細。建立新的訂單表,根據原訂單設定新訂單的id和number、時間等資訊後插入訂單表。建立新的訂單明細表,更改新訂單明細表中的orderId為新訂單的id後插入響應的資料庫表。