實(shí)戰(zhàn):生鮮超市銷售系統(tǒng)全鏈路拆解)
每年到這個時間點(diǎn)都有不少做畢業(yè)設(shè)計的同學(xué)來問我生鮮類小程序怎么搞。需求文檔、原型圖、后端接口、管理后臺一整套下來工作量確實(shí)不小。這個基于微信小程序的新鮮到家生鮮超市銷售系統(tǒng)的選題看起來簡單真要做得完整、能答辯、能跑通全流程里面的細(xì)節(jié)其實(shí)比你想象的多。這篇內(nèi)容我不打算貼幾千行代碼糊弄你而是把這個項(xiàng)目從頭到尾拆開講清楚系統(tǒng)該有什么功能、數(shù)據(jù)怎么設(shè)計、業(yè)務(wù)上哪些環(huán)節(jié)最容易出問題、論文和演示怎么準(zhǔn)備。不管你拿到的是一份現(xiàn)成源碼還是打算自己動手寫按照這套思路走至少能幫你少踩一半的坑。1. 項(xiàng)目全貌拆解這個系統(tǒng)到底在解決什么問題1.1 選題定位為什么生鮮超市微信小程序是畢設(shè)高頻組合生鮮超市銷售系統(tǒng)讀起來像是個電商小程序但它和普通的圖書、數(shù)碼產(chǎn)品電商有個很核心的差異生鮮商品有保質(zhì)期、有儲存條件、配送時效要求高而且用戶購買決策里本地化新鮮度權(quán)重很大。所以你做的不只是一個商城而是一個帶有本地生活服務(wù)屬性的交易系統(tǒng)。從畢設(shè)角度來說這個選題天然適合做成前后端分離小程序端管理端的完整結(jié)構(gòu)。學(xué)生代碼量夠展示數(shù)據(jù)邏輯能體現(xiàn)基本功設(shè)計文檔也好寫功能需求而且演示的時候效果直觀。某高校里一個做類似題目的同學(xué)把就近配送門店這個點(diǎn)做進(jìn)系統(tǒng)答辯時老師對業(yè)務(wù)理解這塊明顯更滿意這個細(xì)節(jié)后面細(xì)說。1.2 功能模塊全景小程序端、后臺管理端、數(shù)據(jù)服務(wù)三塊各干什么一套完整的生鮮超市銷售系統(tǒng)按角色劃分至少要有三層。我把常見的功能匯總成一張表你核對一下自己手里的源碼或待開發(fā)的需求分析里有沒有遺漏模塊功能點(diǎn)說明用戶端小程序微信登錄、新人優(yōu)惠、商品分類瀏覽、關(guān)鍵詞搜索生鮮用戶習(xí)慣按品類找菜分類要細(xì)用戶端小程序商品詳情、多規(guī)格選擇、加入購物車、下單結(jié)算蔬菜水果常見份/斤/盒三種售賣單位用戶端小程序收貨地址管理、配送時間選擇生鮮配送講究時段預(yù)約配送是剛需用戶端小程序優(yōu)惠券中心、滿減活動、會員開卡生鮮復(fù)購率高營銷模塊值得做用戶端小程序訂單列表、訂單詳情、取消訂單、確認(rèn)收貨要有完善的訂單狀態(tài)流轉(zhuǎn)管理后臺商品管理新增、上下架、改價、庫存、分類管理后臺要能維護(hù)每件生鮮的庫存余量管理后臺訂單處理發(fā)貨、完成、退款處理生鮮退款處理邏輯要寫清楚管理后臺用戶管理、優(yōu)惠券管理、數(shù)據(jù)統(tǒng)計看板統(tǒng)計功能可以簡單但不能沒有管理后臺首頁輪播圖、公告維護(hù)體現(xiàn)系統(tǒng)可運(yùn)營性以上這些不一定全部實(shí)現(xiàn)但需求文檔和系統(tǒng)結(jié)構(gòu)里必須能對應(yīng)上。老師的普遍評價標(biāo)準(zhǔn)是功能閉環(huán)完整、數(shù)據(jù)表之間有清晰關(guān)聯(lián)、用戶-下單-支付-履約的鏈路能跑通。1.3 適合誰來參考這套方案準(zhǔn)備校招的項(xiàng)目復(fù)盤、畢業(yè)設(shè)計選題、想自己練手做一個小程序全棧作品的人。如果你只是對小程序開發(fā)好奇但沒系統(tǒng)學(xué)過前后端這套技術(shù)路線也比較友好因?yàn)椴恍枰阕约赫垓v服務(wù)器部署門檻能低不少。2. 技術(shù)選型云開發(fā)模式如何降低畢設(shè)落地難度2.1 小程序的三種常規(guī)技術(shù)方案對比做小程序后端這件事市面上通常有三條路線。傳統(tǒng)的方案是自己買一臺服務(wù)器裝數(shù)據(jù)庫、寫后端接口再打包部署。小程序端通過wx.request請求后端域名。優(yōu)點(diǎn)是靈活、像正規(guī)軍缺點(diǎn)是學(xué)生需要同時掌握后端語言、數(shù)據(jù)庫運(yùn)維、服務(wù)器部署、域名備案和 HTTPS 配置。一套流程走下來很多人的時間都耗在和環(huán)境搏斗上反而沒精力打磨業(yè)務(wù)代碼。第二種是后端用云服務(wù)商的函數(shù)計算配合托管數(shù)據(jù)庫??梢允〉舴?wù)器運(yùn)維但還是要維護(hù)鑒權(quán)邏輯和 API 網(wǎng)關(guān)。第三種就是各平臺的小程序云開發(fā)方案把數(shù)據(jù)庫、云函數(shù)、云存儲直接集成在小程序框架里前端不寫后端代碼也能完成全棧業(yè)務(wù)。這種模式很適合畢設(shè)階段主要體現(xiàn)在不需要租服務(wù)器、不用備案、數(shù)據(jù)庫權(quán)限規(guī)則可視化配置、云函數(shù)天然支持 Node.js。你只需要一個賬號就可以完成從開發(fā)到演示的全部環(huán)節(jié)。我實(shí)際體驗(yàn)下來對多數(shù)畢設(shè)場景而言第三種是最合適的。假想一個項(xiàng)目叫模擬項(xiàng)目X它的商品數(shù)據(jù)存在云數(shù)據(jù)庫里訂單也是用云函數(shù)處理前端頁面直接調(diào)用開發(fā)周期能比傳統(tǒng)前后端分離短兩周左右。2.2 云開發(fā)的四件套怎么分工云開發(fā)提供四個核心能力云數(shù)據(jù)庫用來存商品、訂單、用戶、優(yōu)惠券這些結(jié)構(gòu)化數(shù)據(jù)云存儲用來傳商品圖片、頭像等文件云函數(shù)用來跑后端邏輯比如下單時扣庫存、支付回調(diào)后改訂單狀態(tài)云調(diào)用用來調(diào)用小程序開放服務(wù)比如發(fā)送訂閱消息通知用戶訂單狀態(tài)變化。這四個能力的組合邏輯是這樣的小程序端只負(fù)責(zé)頁面展示和普通查詢涉及數(shù)據(jù)一致性或金額計算的敏感操作都放到云函數(shù)里執(zhí)行。比如下單前端不要把整個訂單直接插入數(shù)據(jù)庫而是調(diào)用云函數(shù)下單在云函數(shù)里先查庫存、算價格、預(yù)扣庫存、再生成訂單記錄最后返回訂單編號。這樣的設(shè)計能在答辯時講出安全性和數(shù)據(jù)一致性的設(shè)計思路比簡單的增刪改查高一個檔次。2.3 數(shù)據(jù)庫表設(shè)計是整套系統(tǒng)的地基我見過不少同學(xué)先寫頁面再補(bǔ)數(shù)據(jù)庫結(jié)果表結(jié)構(gòu)一改再改代碼里到處是兼容代碼。正確做法是一開始就把核心集合設(shè)計好。生鮮系統(tǒng)的云數(shù)據(jù)庫集合通常包括這些// 商品分類集合 categories 示例 { _id: cate_001, name: 時令蔬菜, icon: /images/veg.png, sort: 1 } // 商品集合 goods 示例 { _id: goods_001, name: 云南沃柑, categoryId: cate_fruit, price: 6.8, unit: 斤, specs: [中果, 大果], stock: 200, sales: 15, onSale: true, images: [cloud://env-id.xxx/wogan.jpg], detail: 產(chǎn)地直采約500g/份, createTime: 2025-01-01 10:00:00 }用戶集合、購物車集合、訂單集合、優(yōu)惠券集合、地址集合這幾張表我建議字段這樣設(shè)計集合名核心字段關(guān)鍵說明usersopenid, 昵稱, 頭像, 手機(jī)號, 積分, 會員等級用 openid 做唯一標(biāo)識addressuserId, 聯(lián)系人, 電話, 省市區(qū), 詳細(xì)地址, 默認(rèn)標(biāo)記下單時讀取默認(rèn)地址cartuserId, goodsId, spec, quantity, checked規(guī)格不同就算是不同購物車項(xiàng)orderorderNo, userId, goodsList, totalPrice, freight, status, address, createTime訂單號要唯一且可讀coupontitle, type, amount, threshold, expireTime滿減券滿 threshold 減 amount排列好之后你會發(fā)現(xiàn)商品表和訂單表一關(guān)聯(lián)整個系統(tǒng)的業(yè)務(wù)脈絡(luò)就清晰了。這里有一個容易被忽略的點(diǎn)訂單里的商品快照。下單完成時要把商品名稱、價格、規(guī)格、圖片直接復(fù)制一份存進(jìn)訂單里而不是只存商品ID。等用戶查看歷史訂單時即使商品已經(jīng)下架訂單里的數(shù)據(jù)依然完整。這個小設(shè)計在答辯時能證明你想過業(yè)務(wù)數(shù)據(jù)的穩(wěn)定性。3. 核心業(yè)務(wù)流程實(shí)現(xiàn)從下單到配送的完整鏈路3.1 商品瀏覽與搜索讓用戶像逛菜市場一樣逛商城生鮮小程序首頁和普通電商最大的區(qū)別是場景化入口。首頁除了輪播圖、金剛區(qū)還要有時令推薦今日特價本地鮮這類入口。背后的實(shí)現(xiàn)不復(fù)雜給商品加一個tags數(shù)組字段比如 [時令, 特價, 本地]首頁查詢時就按 tag 過濾。搜索功能如果做簡單的正則匹配體驗(yàn)會比較差。常見做法是用數(shù)據(jù)庫的db.RegExp在商品名稱和詳情描述里做模糊匹配再結(jié)合分類篩選和價格排序。云開發(fā)數(shù)據(jù)庫是支持正則的但要注意涉及正則的查詢在數(shù)據(jù)量大時會比較慢畢設(shè)數(shù)據(jù)量通常只有幾百條實(shí)測下來速度沒問題。3.2 商品詳情和購物車規(guī)格選擇、庫存校驗(yàn)一個都不能少生鮮商品的規(guī)格選擇要注意單位問題。一個土豆可以按份賣也可以按斤賣。商品表里的unit字段就是用來解決這個的。用戶在詳情頁切換規(guī)格時前端要根據(jù)規(guī)格對應(yīng)的price和stock刷新展示。購物車這里有一個很常見的邏輯 bug用戶加購時不校驗(yàn)庫存等到結(jié)算了才發(fā)現(xiàn)庫存不夠容易造成體驗(yàn)落差。建議加購時就檢查庫存并提示用戶當(dāng)前庫存不足這個邏輯雖然多寫幾行但稍微想一下就知道是后端檢查在前、寫入操作在后并發(fā)時也不會扣成負(fù)數(shù)。3.3 下單與庫存扣減并發(fā)情況下防超賣的兩個方案幾乎所有電商類項(xiàng)目都會被問到如何防止超賣。生鮮系統(tǒng)也不例外。云開發(fā)場景下有兩種方案。簡單方案是數(shù)據(jù)庫更新指令配合查詢條件在云函數(shù)里用where(_id, goodsId).where(stock 1).update({ stock: _.inc(-1) })如果更新結(jié)果為updated 0說明庫存不夠直接返回庫存不足。這種無鎖方案在小并發(fā)下足夠用。另一種方案是把商品庫存存在獨(dú)立的庫存表里用事務(wù)控制。在云函數(shù)里用db.startTransaction()開啟事務(wù)先讀庫存加寫鎖再扣減提交事務(wù)。這樣可以嚴(yán)格保證一致性但代碼復(fù)雜度高一些。我給多數(shù)同學(xué)的建議是畢設(shè)用第一種就夠了但要在論文里寫清楚技術(shù)上有更嚴(yán)謹(jǐn)?shù)姆桨副卷?xiàng)目采用原子更新保證基本一致性顯得你思考過。3.4 訂單狀態(tài)機(jī)從待支付到完成每一步都要有跡可循訂單狀態(tài)是整個銷售系統(tǒng)的核心數(shù)據(jù)流。生鮮訂單我建議設(shè)計成這樣狀態(tài)含義可執(zhí)行操作pending待支付用戶取消、支付paid已支付待發(fā)貨后臺發(fā)貨操作shipped已發(fā)貨配送中用戶確認(rèn)收貨completed已完成可申請售后cancelled已取消無refunding退款中后臺同意退款/拒絕在小程序端不同的狀態(tài)對應(yīng)不同的操作按鈕比如待支付顯示去支付取消訂單配送中顯示確認(rèn)收貨。云函數(shù)返回訂單狀態(tài)碼前端用wx.switchTab跳到訂單列表頁并定位到對應(yīng) tab這樣交互邏輯和狀態(tài)流轉(zhuǎn)就閉環(huán)了。在管理后臺里訂單列表也要按狀態(tài)做標(biāo)簽過濾方便模擬履約操作。3.5 支付環(huán)節(jié)的坑說明與演示方案各位注意微信支付并不是個人小程序能隨便接的。它需要企業(yè)主體商戶號而且審核資料一整套流程對在校學(xué)生來說并不友好很多畢設(shè)項(xiàng)目根本沒有條件對接真實(shí)支付。這里有一個常規(guī)的替代方案模擬支付。所謂模擬支付就是用戶在提交訂單后云函數(shù)自動調(diào)用內(nèi)部邏輯把訂單狀態(tài)從待支付改成已支付相當(dāng)于程序幫你點(diǎn)了一下確認(rèn)支付。然后系統(tǒng)生成模擬支付流水號MOCK20240301001存在訂單記錄的 payInfo 字段里用于演示和管理員查看支付憑證。這樣做的好處是整個訂單鏈路完整可跑通不涉及真實(shí)資金演示時也不會有卡住的環(huán)節(jié)。在開題或者答辯時把這個作為擴(kuò)展功能如實(shí)說明老師通常都理解。如果你實(shí)在有企業(yè)資質(zhì)能接真實(shí)支付也只是把模擬支付那段替換為 wx.requestPayment 的調(diào)用其余流程完全不用動。3.6 配送履約邏輯生鮮系統(tǒng)獨(dú)有的業(yè)務(wù)設(shè)計生鮮配送有幾個電商通用系統(tǒng)不具備的特點(diǎn)配送時段選擇、配送費(fèi)用計算和訂單揀貨狀態(tài)。配送時段可以放在門店表里用timeSlots數(shù)組存09:00-11:0017:00-19:00這類時間窗。用戶在下單頁選擇時段訂單里存deliveryTime。后臺發(fā)貨時可以按時間段聚合訂單這樣就能在演示時說出門店根據(jù)時段批量揀貨的業(yè)務(wù)含義。配送費(fèi)用計算建議做一張運(yùn)費(fèi)規(guī)則表滿免運(yùn)費(fèi)門檻和基礎(chǔ)運(yùn)費(fèi)。規(guī)則放到后臺配置前端下單時通過云函數(shù)獲取運(yùn)費(fèi)信息并在結(jié)算頁展示顯示出系統(tǒng)具備動態(tài)規(guī)則配置能力。4. 管理后臺的實(shí)現(xiàn)思路給運(yùn)營人員一套趁手工具4.1 不用單獨(dú)做網(wǎng)頁后臺也能完成管理的方案組合很多畢設(shè)想做管理后臺又不想再寫一個 Web 項(xiàng)目云開發(fā)模式里有一個非常省力的組合方案小程序內(nèi)嵌管理頁 云開發(fā)控制臺。在小程序端做一套商家工作臺頁面用賬號判斷角色如果是管理員可以通過一個隱藏入口進(jìn)入管理界面。商品管理、訂單處理、優(yōu)惠券發(fā)放都在小程序里完成既能演示又減少了開發(fā)量。這個方案的邊際成本非常低。你只需要在 users 表里給管理員賬號打一個isAdmin: true的標(biāo)記然后在小程序端做條件渲染。配合云開發(fā)控制臺本身的數(shù)據(jù)庫管理頁面你甚至可以不用可視化地改庫存、查訂單數(shù)據(jù)這在你演示數(shù)據(jù)管理能力時同樣有效。4.2 數(shù)據(jù)統(tǒng)計看板用簡單聚合函數(shù)生成關(guān)鍵指標(biāo)管理端里最容易被忽視的是統(tǒng)計看板。建議最少包含三個指標(biāo)今日銷售額、今日訂單數(shù)、待發(fā)貨訂單數(shù)。云開發(fā)數(shù)據(jù)庫聚合能力足夠?qū)崿F(xiàn)不需要額外引入圖表庫用_.sum和db.collection(order).where().count()就能拿到數(shù)據(jù)。如果你想把圖表做得好看一點(diǎn)可以在前端用 Canvas 畫一個簡易的七日銷量柱狀圖這樣的視覺成本很低但演示效果非常好因?yàn)檫@能體現(xiàn)數(shù)據(jù)分析的素質(zhì)。商品庫存預(yù)警也值得一提。當(dāng)某商品庫存低于閾值不要等著人去看用云開發(fā)定時觸發(fā)器每天早上九點(diǎn)跑一個云函數(shù)篩選出低庫存商品通過訂閱消息推送給管理員。這個功能在系統(tǒng)演示里屬于錦上添花級別但做出來后答辯時老師會認(rèn)為你理解了系統(tǒng)而不只是會調(diào)用 API。5. 論文結(jié)構(gòu)、演示腳本和答辯話術(shù)的準(zhǔn)備策略5.1 畢設(shè)論文的章節(jié)安排與重點(diǎn)篇幅分配很多人寫畢設(shè)論文喜歡從頭到尾拽理論基礎(chǔ)實(shí)際上老師更看重你對自己系統(tǒng)流程的復(fù)述和思考。建議結(jié)構(gòu)是引言與背景占 10%需求分析占 20%系統(tǒng)設(shè)計占 25%系統(tǒng)實(shí)現(xiàn)占 30%系統(tǒng)測試占 10%總結(jié)與展望占 5%。需求分析部分切忌空談。你要寫清楚每個角色的用例比如用戶用例有注冊登錄、瀏覽商品、創(chuàng)建訂單管理員用例有商品管理、訂單發(fā)貨、發(fā)放優(yōu)惠券。每個用例配上文字描述和小學(xué)生也能看懂的時序圖即可。系統(tǒng)設(shè)計部分重點(diǎn)放數(shù)據(jù)庫表結(jié)構(gòu)設(shè)計至少給六張以上的表設(shè)計以及字段說明。記得在系統(tǒng)實(shí)現(xiàn)里配合典型界面截圖來介紹核心代碼邏輯不要大段貼代碼而是貼關(guān)鍵云函數(shù)片段加文字解釋老師看的就是這部分。5.2 五分鐘演示腳本如何把系統(tǒng)講成完整故事演示翻車大多是因?yàn)楝F(xiàn)場卡殼或邏輯混亂。我給你一條演示主線從用戶登錄和首頁瀏覽開始展示分類商品與搜索選一個云南沃柑加購下單。此時打開管理端后臺把該訂單狀態(tài)變更為已發(fā)貨切回用戶端刷新訂單展示訂單狀態(tài)同步和一鍵確認(rèn)收貨。這套腳本的關(guān)鍵是從用戶視角到商家視角的切換真實(shí)還原了整個交易履約閉環(huán)。注意提前清空購物車保證數(shù)據(jù)整潔網(wǎng)絡(luò)環(huán)境不好的話要提前緩存圖片避免演示時圖片加載不出來。還有務(wù)必準(zhǔn)備一兩組好看的測試賬號數(shù)據(jù)比如訂單列表里有多個不同狀態(tài)的歷史訂單這樣展示訂單 tab 切換時不會寒酸。5.3 答辯常見提問與現(xiàn)場應(yīng)對思路生鮮系統(tǒng)答辯時高頻出現(xiàn)的問題就是那幾類我把思路整理出來你提前準(zhǔn)備老師常問應(yīng)對思路關(guān)鍵表述你這個系統(tǒng)相比普通電商有什么差異突出生鮮時效性和本地化運(yùn)營從配送時段、本地門店、庫存批次三方面說明如何防止庫存超賣講云函數(shù)原子更新扣減庫存庫存檢查與扣減在同一事務(wù)內(nèi)完成為什么不直接對接真實(shí)微信支付如實(shí)說明主體限制展示模擬支付流程設(shè)計狀態(tài)機(jī)與真實(shí)支付一致可無縫替換云開發(fā)相對傳統(tǒng)后端有什么優(yōu)缺點(diǎn)客觀分析成本和生態(tài)也要提及學(xué)習(xí)價值和局限性開發(fā)效率高但算力受限生產(chǎn)環(huán)境需評估一定要提前弄懂自己的項(xiàng)目代碼邏輯。答辯時最尷尬的不是答不全而是被追問到代碼細(xì)節(jié)時支支吾吾。建議自己把云函數(shù)里的下單邏輯完整敲一遍并讀懂每行的作用。我在和學(xué)生溝通時發(fā)現(xiàn)很多拿到源碼的同學(xué)第一反應(yīng)是先跑起來結(jié)果環(huán)境配置一堆報錯配完已經(jīng)沒心力了。建議順序反過來先讀論文理清系統(tǒng)有哪些模塊、數(shù)據(jù)如何流轉(zhuǎn)再打開代碼對照看。流程跑通后試著把某個云函數(shù)刪掉重寫一遍這個過程遠(yuǎn)比改十次樣式更能讓你把項(xiàng)目吃透。生鮮小程序這類題目與其說是技術(shù)項(xiàng)目不如說是一次完整的業(yè)務(wù)建模訓(xùn)練。你搭建商品庫、處理訂單狀態(tài)、設(shè)計營銷規(guī)則的過程就是一個產(chǎn)銷流程的抽象過程。認(rèn)真走過一遍后面無論是找工作面試還是自己接項(xiàng)目這套從需求到交付的方法論都能復(fù)用得上。