設(shè)計(jì)全解析:從數(shù)據(jù)庫(kù)設(shè)計(jì)到部署避坑)
做畢業(yè)設(shè)計(jì)選“基于SSM的蛋糕私人訂制網(wǎng)站”這個(gè)題目的同學(xué)十有八九會(huì)經(jīng)歷這樣一個(gè)過程看標(biāo)題覺得簡(jiǎn)單就是一個(gè)網(wǎng)上賣蛋糕的商城嘛真動(dòng)手的時(shí)候才發(fā)現(xiàn)光一個(gè)“私人訂制”需求就能讓訂單表、購(gòu)物車邏輯和后臺(tái)審核全鏈路都跟著變復(fù)雜。更別提SSM三件套的整合、前端頁(yè)面的交互、部署到服務(wù)器之后的配置問題。這個(gè)項(xiàng)目我前前后后帶人做過不止五六個(gè)版本源碼和LW文檔也整理過完整的一套今天就把整個(gè)項(xiàng)目的設(shè)計(jì)思路、核心代碼、數(shù)據(jù)庫(kù)表關(guān)系、以及最容易踩的坑一次說(shuō)清楚。這篇內(nèi)容既適合正在選畢業(yè)設(shè)計(jì)題目的同學(xué)用來(lái)評(píng)估工作量也適合已經(jīng)拿到這個(gè)題目、正卡在SSM整合或定制訂單流程上的朋友照著落地。1. 整體設(shè)計(jì)思路先搞清楚“蛋糕私人訂制”和“普通商城”的差別1.1 核心需求解析私人訂制到底定制了哪些東西很多同學(xué)拿到題目就急著建表、寫登錄注冊(cè)結(jié)果做到一半發(fā)現(xiàn)“私人訂制”四個(gè)字沒落地答辯的時(shí)候被老師一問就露餡。所以第一步必須先把“訂制”兩個(gè)字拆清楚。普通蛋糕商城和私人訂制網(wǎng)站表面上看都是“用戶選蛋糕、下單、付款、商家發(fā)貨”但實(shí)際的需求深度完全不同。普通商城是“我有什么你買什么”蛋糕的尺寸、口味、款式全部是預(yù)設(shè)好的SKU私人訂制是“你想要什么我按需求給你做”用戶傳一張喜歡的蛋糕圖片上來(lái)或者勾選奶油類型、蛋糕尺寸、裱花文字、配送時(shí)間商家在后臺(tái)看到訂單后還要進(jìn)行人工確認(rèn)和報(bào)價(jià)溝通。這個(gè)過程意味著系統(tǒng)里至少要多出三個(gè)非常關(guān)鍵的模塊定制信息的收集模塊表單要能錄入尺寸、口味、奶油、水果、文字內(nèi)容、參考圖等個(gè)性化字段并且這些字段不能寫死因?yàn)橛脩舻男枨笪寤ò碎T。訂單審核和狀態(tài)機(jī)定制訂單不能像普通訂單那樣直接“付款—發(fā)貨”必須增加“待確認(rèn)”“已確認(rèn)”“制作中”“配送中”“已完成”這樣的狀態(tài)流轉(zhuǎn)后臺(tái)要有審核操作入口價(jià)格也可能需要后臺(tái)修改。圖片上傳與展示用戶定制時(shí)上傳參考圖后臺(tái)管理端要能查看和審核項(xiàng)目里必須處理MultipartFile文件上傳。所以在寫需求分析的時(shí)候這三塊內(nèi)容就是你文檔里最值錢的部分。你不需要把系統(tǒng)功能寫得天花亂墜但必須把“私人訂制”這條業(yè)務(wù)主線從頭串到尾用戶能定制什么、定制信息怎么流轉(zhuǎn)、商家怎么處理定制請(qǐng)求、最終訂單怎么完成閉環(huán)。1.2 技術(shù)選型為什么用SSM而不是Spring Boot每次有同學(xué)問我“老師現(xiàn)在外面公司都在用Spring Boot為什么畢業(yè)設(shè)計(jì)還要用SSM”我的回答都是一樣的這個(gè)題目的訓(xùn)練重點(diǎn)恰恰在SSM上。Spring Boot自動(dòng)配置把很多底層細(xì)節(jié)藏起來(lái)了你寫完一個(gè)接口根本不知道DispatcherServlet怎么初始化、MyBatis的SqlSessionFactory怎么注入、事務(wù)代理什么時(shí)候生效而SSM讓你必須自己手寫applicationContext.xml、spring-mvc.xml、mybatis-config.xml把這些配置全部理順之后你對(duì)框架的理解深度完全不在一個(gè)級(jí)別。當(dāng)然純粹從開發(fā)效率角度講SSM確實(shí)比Spring Boot繁瑣依賴版本容易沖突、配置文件多、環(huán)境變量處理麻煩。但作為畢業(yè)設(shè)計(jì)SSM方案有一個(gè)很現(xiàn)實(shí)的優(yōu)勢(shì)參考資料極多網(wǎng)上“SSM框架整合”“SSM畢設(shè)源碼”這類資源一搜一大把項(xiàng)目卡住了容易查而且Spring、SpringMVC、MyBatis三者使用范圍極廣面試被問到的概率也遠(yuǎn)高于Spring Boot某個(gè)自動(dòng)配置類。所以這個(gè)題目用SSM與其說(shuō)是技術(shù)選型不如說(shuō)是訓(xùn)練價(jià)值、參考資料、答辯友好度三者權(quán)衡之后的最優(yōu)解。技術(shù)棧版本方案我建議直接用最經(jīng)典的一版Spring 5.1.x SpringMVC 5.1.x MyBatis 3.4.x MySQL 5.7 Maven構(gòu)建 JSP/Bootstrap前端。JDK用1.8Tomcat用8.5或9.0。這套組合在所有教學(xué)資料里出鏡率最高遇到報(bào)錯(cuò)最容易搜到解決方案。2. 數(shù)據(jù)庫(kù)設(shè)計(jì)蛋糕訂制系統(tǒng)的表結(jié)構(gòu)如何拆2.1 核心表與字段設(shè)計(jì)詳解數(shù)據(jù)庫(kù)設(shè)計(jì)是整個(gè)蛋糕私人訂制網(wǎng)站的重中之重。我習(xí)慣先畫ER圖再建表因?yàn)榇疝q老師第一眼看的就是你的ER圖和外鍵關(guān)系。建議把表拆成八張用戶表、蛋糕分類表、蛋糕信息表、購(gòu)物車表、定制訂單表、訂單明細(xì)表、評(píng)論表、輪播圖表。如果還想要管理端后臺(tái)就加一張管理員表。用戶表t_user核心字段包含用戶ID、用戶名、密碼MD5加密存儲(chǔ)、手機(jī)號(hào)、郵箱、頭像、注冊(cè)時(shí)間、狀態(tài)。密碼加密這一點(diǎn)在文檔里要寫清楚不要明文存密碼至少用MD5有能力可以加鹽。蛋糕分類表t_category很簡(jiǎn)單就是分類ID、分類名稱、排序字段比如生日蛋糕、婚禮蛋糕、節(jié)慶蛋糕。蛋糕信息表t_cake才是重點(diǎn)除了蛋糕ID、分類ID外要包含蛋糕名稱、價(jià)格、主圖路徑、多圖路徑、蛋糕描述、標(biāo)簽如“適合2-5人”、推薦狀態(tài)、上架狀態(tài)、銷量。定制訂單表t_order是整個(gè)數(shù)據(jù)庫(kù)的核心表。字段不能少訂單編號(hào)、用戶ID、蛋糕ID、定制尺寸6寸/8寸/10寸、口味奶油/水果/巧克力、奶油類型、裱花文字、配送時(shí)間、參考圖片路徑、定制備注、訂單金額、實(shí)付金額、訂單狀態(tài)、下單時(shí)間、支付時(shí)間、發(fā)貨時(shí)間、完成時(shí)間。這里要注意定制信息字段很多同學(xué)喜歡全塞在“備注”字段里這樣做數(shù)據(jù)庫(kù)設(shè)計(jì)檔次一下就矮了文檔答辯都吃虧。所有定制項(xiàng)都應(yīng)該單獨(dú)設(shè)字段這樣才能寫清楚“用戶定制了什么”。訂單明細(xì)表t_order_item用于記錄訂單中具體購(gòu)買的商品快照信息商品名稱、商品價(jià)格、數(shù)量、小計(jì)。為什么要有快照因?yàn)榈案鈨r(jià)格或名稱后期會(huì)改訂單記錄要保留下單那一刻的信息不能關(guān)聯(lián)到最新數(shù)據(jù)。這一點(diǎn)寫進(jìn)設(shè)計(jì)說(shuō)明里老師會(huì)覺得你是真懂業(yè)務(wù)的。評(píng)論表t_comment關(guān)聯(lián)用戶和蛋糕字段有內(nèi)容、評(píng)分、評(píng)論時(shí)間、是否匿名。輪播圖表t_banner則放圖片路徑、跳轉(zhuǎn)鏈接、排序、狀態(tài)。2.2 表關(guān)系與業(yè)務(wù)閉環(huán)怎么畫表關(guān)系是ER圖的核心表達(dá)內(nèi)容用戶和訂單是1對(duì)N蛋糕分類和蛋糕是1對(duì)N蛋糕和訂單明細(xì)是1對(duì)N訂單和訂單明細(xì)是1對(duì)N用戶和評(píng)論是1對(duì)N蛋糕和評(píng)論是1對(duì)N。購(gòu)物車表可以做成獨(dú)立表cart_id、user_id、cake_id、quantity、selected也可以做成臨時(shí)存儲(chǔ)不用表來(lái)存但建議做成表因?yàn)椤暗卿浐蠹尤胭?gòu)物車”這個(gè)功能在演示和答辯時(shí)最能出效果。訂單狀態(tài)是業(yè)務(wù)閉環(huán)的主鏈路。我建議用整數(shù)狀態(tài)碼0待確認(rèn)、1已確認(rèn)待付款、2配送中、3已完成、4已取消。簡(jiǎn)單解釋一下流程用戶在定制頁(yè)填寫完信息→生成待確認(rèn)狀態(tài)的訂單→管理員后臺(tái)看到新訂單認(rèn)為可以接單修改價(jià)格并確認(rèn)→用戶支付畢業(yè)設(shè)計(jì)一般不用真實(shí)支付可以做成余額支付或“模擬支付”按鈕→后臺(tái)設(shè)置配送中→用戶確認(rèn)收貨或后臺(tái)點(diǎn)擊完成→整條鏈路結(jié)束。這個(gè)狀態(tài)機(jī)設(shè)計(jì)好之后前后臺(tái)幾乎所有功能都是圍繞它展開的所以數(shù)據(jù)庫(kù)設(shè)計(jì)階段一定要把狀態(tài)字段想明白。最后補(bǔ)充一個(gè)設(shè)計(jì)技巧所有表都要加上創(chuàng)建時(shí)間字段create_time和更新時(shí)間字段update_time一方面業(yè)務(wù)上需要另一方面讓答辯老師看到你的表設(shè)計(jì)有工程意識(shí)。輪播圖模塊不要忽略網(wǎng)站上首頁(yè)大圖輪播是拍視頻和截圖時(shí)的加分項(xiàng)代碼量不大但效果直觀。3. 核心業(yè)務(wù)實(shí)現(xiàn)從登錄到定制下單的全流程3.1 基礎(chǔ)設(shè)施搭建SSM最常見整合套路SSM整合說(shuō)難也難說(shuō)簡(jiǎn)單也簡(jiǎn)單關(guān)鍵是記住一條主線Spring管理業(yè)務(wù)對(duì)象Service、SpringMVC負(fù)責(zé)Web請(qǐng)求分發(fā)Controller、MyBatis負(fù)責(zé)數(shù)據(jù)庫(kù)讀寫Mapper。配置上就是三件事spring配置文件把所有Service和Mapper交給Spring容器spring-mvc配置文件把Controller交給SpringMVC容器mybatis配置文件把SQL和實(shí)體映射做好。我用Maven管理依賴關(guān)鍵依賴如下spring-webmvc、spring-jdbc、mybatis、mybatis-spring、mysql-connector-java、druid連接池、jackson-databind、jstl、commons-fileupload、lombok如果不想寫getter/setter。依賴版本建議直接用maven倉(cāng)庫(kù)里兼容性最穩(wěn)的版本不要追求最新。web.xml需要配置三件事Spring容器監(jiān)聽器ContextLoaderListenerSpringMVC前端控制器DispatcherServlet并指定加載spring-mvc.xml以及一個(gè)字符編碼過濾器CharacterEncodingFilter解決中文亂碼。核心過濾器和DispatcherServlet的url-pattern用“/”這樣REST風(fēng)格接口和JSP頁(yè)面才能正確路由。spring-mvc.xml的配置里記得開注解驅(qū)動(dòng)配置視圖解析器InternalResourceViewResolver的前綴后綴配置資源映射放行static目錄下的CSS/JS/圖片配置multipartResolver處理文件上傳。spring配置文件里開component-scan掃描service包配置DataSource、SqlSessionFactoryBean掃描mapper.xml和別名包、MapperScannerConfigurer掃描mapper接口以及很重要的事務(wù)管理器并用tx:annotation-driven驅(qū)動(dòng)注解事務(wù)。這一套配置配好并跑通一個(gè)最簡(jiǎn)單的“查數(shù)據(jù)庫(kù)輸出列表”功能整個(gè)項(xiàng)目的地基就算打完了。很多同學(xué)整合失敗的原因通常是包掃描路徑寫錯(cuò)、依賴缺失、maven編譯沒刷新這類問題多看控制臺(tái)報(bào)錯(cuò)基本都能定位。我建議第一步不要急著寫業(yè)務(wù)代碼先把一個(gè)“查詢分類列表”的接口跑通鏈路通了再往上蓋樓就快了。3.2 用戶登錄注冊(cè)與權(quán)限控制蛋糕私人訂制網(wǎng)站有用戶端和管理員端兩個(gè)角色所以登錄注冊(cè)模塊要做兩套用戶登錄入口在首頁(yè)頂部管理員登錄入口建議放在單獨(dú)的管理端路徑下不要混在一起。用戶注冊(cè)時(shí)密碼用MD5加密然后存入數(shù)據(jù)庫(kù)登錄成功后將用戶信息封裝到Session里后續(xù)通過攔截器判斷是否登錄。在SSM里實(shí)現(xiàn)登錄攔截建議用HandlerInterceptorpreHandle方法先放行l(wèi)ogin、register、靜態(tài)資源、首頁(yè)、蛋糕列表這些公開URL其他用戶中心、購(gòu)物車、訂單管理相關(guān)路徑統(tǒng)統(tǒng)攔截未登錄就重定向到登錄頁(yè)。管理員端單獨(dú)配一個(gè)攔截器判斷session里管理員對(duì)象是否存在。權(quán)限控制這塊是答辯必問點(diǎn)為什么不直接用Filter老師的意圖不是非要你解釋攔截器和過濾器的全部區(qū)別而是考察你有沒有現(xiàn)成的權(quán)限控制方案。能在答辯時(shí)清楚說(shuō)“用戶端用攔截器校驗(yàn)用戶登錄管理端單獨(dú)校驗(yàn)管理員身份兩個(gè)攔截器分離”就足夠了。這里要提醒一句攔截器注冊(cè)時(shí)excludePathPatterns放行的路徑必須寫全尤其是靜態(tài)資源很多同學(xué)沒配置好導(dǎo)致CSS全丟了。文件上傳也是私人訂制網(wǎng)站的標(biāo)配功能。在SpringMVC里配置CommonsMultipartResolvermaxUploadSize限制大小例如10MBController方法接收MultipartFile參數(shù)保存時(shí)用UUID生成新文件名防止重名和亂碼存到指定上傳目錄再把相對(duì)路徑存到數(shù)據(jù)庫(kù)。圖片存儲(chǔ)路徑建議直接存在項(xiàng)目的webapp/upload目錄下這樣瀏覽器訪問時(shí)路徑簡(jiǎn)單部署到服務(wù)器也方便遷移。上傳后前端用img標(biāo)簽回顯后臺(tái)管理端也要能預(yù)覽用戶定制時(shí)上傳的參考圖。3.3 定制下單核心流程購(gòu)物車到訂單的實(shí)現(xiàn)細(xì)節(jié)蛋糕私人訂制網(wǎng)站最核心的流程是這樣的用戶瀏覽蛋糕列表→點(diǎn)擊某個(gè)蛋糕進(jìn)入詳情頁(yè)→詳情頁(yè)底部有“立即定制”按鈕→進(jìn)入定制表單頁(yè)→填寫定制信息和數(shù)量→加入購(gòu)物車或者直接提交訂單→購(gòu)物車中可批量提交→生成等待確認(rèn)的訂單。兩種方式建議都做購(gòu)物車功能在演示和答辯時(shí)非常出彩我強(qiáng)烈建議不要只做“立即定制下單”把購(gòu)物車做成獨(dú)立頁(yè)面會(huì)更有體系感。購(gòu)物車實(shí)現(xiàn)有兩種方案一種是把購(gòu)物車數(shù)據(jù)結(jié)構(gòu)存Session里另一種持久化到t_cart表。我推薦存數(shù)據(jù)庫(kù)原因有兩個(gè)用戶清瀏覽器Session后購(gòu)物車數(shù)據(jù)不丟演示更穩(wěn)定表結(jié)構(gòu)能寫進(jìn)數(shù)據(jù)庫(kù)設(shè)計(jì)文檔內(nèi)容更豐富。購(gòu)物車表關(guān)聯(lián)用戶、蛋糕、數(shù)量、選中狀態(tài)。加入購(gòu)物車時(shí)先判斷該用戶是否已經(jīng)有這個(gè)蛋糕的記錄有就加數(shù)量沒有就新增一條記錄。提交訂單的時(shí)候要注意事務(wù)管理。一個(gè)訂單至少操作兩張表插入t_order主表包含全部定制信息同時(shí)把購(gòu)物車?yán)镞x中的商品逐條寫入t_order_item。兩件事必須放在同一個(gè)事務(wù)里用Transactional注解否則會(huì)出現(xiàn)訂單主表有記錄、明細(xì)表空掉的數(shù)據(jù)不一致問題。生成訂單號(hào)可以直接用時(shí)間戳加隨機(jī)數(shù)格式類似“202506181545321234”保證唯一即可。定制訂單提交后用戶端的訂單列表顯示成“待確認(rèn)”狀態(tài)。為什么不是“待付款”因?yàn)槎ㄖ频案馍碳乙_認(rèn)能不能做、價(jià)格是否有調(diào)整狀態(tài)機(jī)設(shè)計(jì)成“待確認(rèn)→已確認(rèn)→配送中→已完成”更符合真實(shí)業(yè)務(wù)。后臺(tái)管理端在訂單管理列表里能看到所有待確認(rèn)訂單點(diǎn)詳情查看定制字段和參考圖后可以修改訂單價(jià)格并點(diǎn)擊“確認(rèn)接單”此時(shí)用戶端訂單狀態(tài)變?yōu)椤按犊睢痹冱c(diǎn)“模擬支付”變?yōu)椤耙阎Ц洞谱鳌薄:笈_(tái)制作完成后點(diǎn)“配送中”用戶確認(rèn)收貨后訂單完成。這一套狀態(tài)流轉(zhuǎn)邏輯把所有功能模塊串起來(lái)配合訂單狀態(tài)流轉(zhuǎn)圖代碼里可以用狀態(tài)字段控制來(lái)寫文檔和做演示整個(gè)系統(tǒng)一體性非常強(qiáng)。3.4 后臺(tái)管理蛋糕上下架與訂單審核頁(yè)面管理員端的核心頁(yè)面建議做成獨(dú)立iframe風(fēng)格后臺(tái)左側(cè)菜單樹右側(cè)內(nèi)容區(qū)。菜單包括分類管理、蛋糕管理、訂單管理、用戶管理、評(píng)論管理、輪播圖管理。蛋糕管理里要支持新增、編輯、上架、下架、上傳多張圖片分類管理支撐蛋糕分類的增刪改查訂單管理是最重要的頁(yè)面列表里展示訂單狀態(tài)點(diǎn)擊詳情能看到用戶填寫的全部定制信息還能處理“確認(rèn)訂單”“修改價(jià)格”操作評(píng)論管理可以做一個(gè)審核刪除輪播圖管理就是維護(hù)首頁(yè)大圖。后臺(tái)的表格展示建議用分頁(yè)插件PageHelper這個(gè)插件在SSM項(xiàng)目里幾乎是標(biāo)配引入依賴后在MyBatis配置xml里加上分頁(yè)插件配置調(diào)用PageHelper.startPage(pageNum, pageSize)返回的列表再用PageInfo包裝就能輕松實(shí)現(xiàn)分頁(yè)。后臺(tái)適配Bootstrap自帶的表格樣式顏色不要花哨一深一淺配一個(gè)高亮按鈕色就夠了。管理端登錄入口我建議放在“/admin/login”和數(shù)據(jù)頁(yè)面在同一套SpringMVC中分離路徑攔截器也好配。整個(gè)管理端設(shè)計(jì)不需要炫技但工作量和功能完整度一定要在演示時(shí)讓老師看得見。4. 常見問題排查與避坑經(jīng)驗(yàn)4.1 高頻報(bào)錯(cuò)速查表SSM項(xiàng)目開發(fā)中你會(huì)反復(fù)遇到一些固定報(bào)錯(cuò)這里直接把最容易遇到的整理成一個(gè)排查表遇到問題對(duì)著查就行問題現(xiàn)場(chǎng)根本原因解決方案頁(yè)面全亂碼、中文變問號(hào)JSP頁(yè)面編碼、請(qǐng)求編碼、數(shù)據(jù)庫(kù)連接URL至少有一處不是UTF-8統(tǒng)一設(shè)置pageEncodingUTF-8web.xml加CharacterEncodingFilter數(shù)據(jù)源URL加characterEncodingutf8項(xiàng)目啟動(dòng)直接404DispatcherServlet的url-pattern配置錯(cuò)誤或SpringMVC掃描的包路徑不對(duì)檢查web.xml確認(rèn)spring-mvc.xml里component-scan能掃到controller包MyBatis報(bào)BindingExceptionMapper接口沒有掃描到或者namespace和接口全限定名不一致檢查applicationContext.xml的MapperScannerConfigurer包路徑確認(rèn)xml的namespace和接口路徑完全一致Service事務(wù)不生效數(shù)據(jù)一半成功一半失敗spring配置里沒有配事務(wù)管理器或者Service方法被內(nèi)部類調(diào)用繞過了代理添加DataSourceTransactionManager配置tx:annotation-driven確保Transactional加在public方法上圖片上傳不成功秒報(bào)400form表單缺少enctypemultipart/form-data或multipartResolver沒配置給form加enctype在spring-mvc.xml配CommonsMultipartResolver并設(shè)置大小上限JSP頁(yè)面EL表達(dá)式原樣輸出web.xml是Servlet 2.5版本導(dǎo)致EL默認(rèn)關(guān)閉升級(jí)web.xml頭文件版本到3.1或4.0或檢查isELIgnored配置項(xiàng)目能跑但CSS/JS全無(wú)樣式靜態(tài)資源被DispatcherServlet攔截在spring-mvc.xml配置mvc:resources映射把/static/**等路徑放行Maven依賴沖突tomcat啟動(dòng)NoClassDefFoundError多個(gè)版本的jar同時(shí)存在或依賴重復(fù)使用mvn dependency:tree檢查沖突統(tǒng)一版本號(hào)4.2 真正值得留意的三個(gè)工程級(jí)細(xì)節(jié)普通的報(bào)錯(cuò)按表排查基本都能解決但有幾個(gè)坑是新手反復(fù)踩、還要在答辯時(shí)被追問的我重點(diǎn)說(shuō)一下。第一個(gè)是數(shù)據(jù)庫(kù)連接池配置問題。很多同學(xué)直接用一個(gè)簡(jiǎn)單的DriverManager連接后臺(tái)一刷新并發(fā)一大頁(yè)面就卡死。建議直接用Druid連接池配置初始化連接數(shù)、最大連接數(shù)SQL監(jiān)控頁(yè)面還能在答辯時(shí)演示“如何查看SQL執(zhí)行耗時(shí)”這比CV四個(gè)框架配置話術(shù)要有說(shuō)服力得多。第二個(gè)是文件上傳的路徑問題。本地開發(fā)時(shí)你把圖片存到D:盤某個(gè)路徑一旦部署到服務(wù)器或者換電腦就訪問不到。穩(wěn)妥的做法是把上傳目錄配置成項(xiàng)目下webapp/upload用相對(duì)當(dāng)前項(xiàng)目的路徑保存同時(shí)數(shù)據(jù)庫(kù)只存相對(duì)路徑而不是絕對(duì)路徑。這樣整個(gè)項(xiàng)目哪怕打包成war再部署圖片也不會(huì)丟。第三個(gè)是訂單編號(hào)生成和并發(fā)問題。有些同學(xué)直接用一個(gè)時(shí)間戳當(dāng)訂單號(hào)看似沒問題但答辯老師如果問到“兩個(gè)用戶同一毫秒下單怎么辦”答不上來(lái)就很尷尬。改進(jìn)方案是用時(shí)間戳加自增序列或者UUID雖然畢業(yè)設(shè)計(jì)場(chǎng)景下不會(huì)真的并行下單但你的方案要有并發(fā)意識(shí)。類似的還有庫(kù)存扣減問題做蛋糕項(xiàng)目庫(kù)存概念不強(qiáng)但如果后面擴(kuò)展了普通商品SKU就要考慮超賣問題至少提一句“用數(shù)據(jù)庫(kù)樂觀鎖或行鎖控制并發(fā)扣減”這是加分項(xiàng)。5. 配套LW文檔寫作除了代碼文檔才是畢業(yè)設(shè)計(jì)的半壁江山5.1 文檔結(jié)構(gòu)怎么安排最合理LW文檔畢業(yè)論文/設(shè)計(jì)說(shuō)明書是畢業(yè)設(shè)計(jì)的重要組成部分很多同學(xué)代碼寫得不錯(cuò)文檔卻東拼西湊、沒有邏輯。結(jié)合這個(gè)題目的特點(diǎn)我建議文檔按以下結(jié)構(gòu)組織緒論背景意義、國(guó)內(nèi)外研究現(xiàn)狀、論文結(jié)構(gòu)需求分析功能性需求、非功能性需求、用例圖系統(tǒng)設(shè)計(jì)總體架構(gòu)、功能模塊、數(shù)據(jù)庫(kù)設(shè)計(jì)、ER圖系統(tǒng)實(shí)現(xiàn)各模塊核心功能實(shí)現(xiàn)截圖與描述、核心代碼展示系統(tǒng)測(cè)試測(cè)試方法、測(cè)試用例表、測(cè)試結(jié)論總結(jié)與展望。數(shù)據(jù)庫(kù)設(shè)計(jì)部分重點(diǎn)寫你的ER圖和數(shù)據(jù)字典。數(shù)據(jù)字典不要把所有表的每個(gè)字段都長(zhǎng)篇大論地羅列挑關(guān)鍵表定制訂單表、蛋糕信息表、用戶表做一個(gè)詳細(xì)字段說(shuō)明即可其他表做個(gè)匯總表格。需求分析部分的用例圖可以用工具畫也可以手畫但要清晰。系統(tǒng)實(shí)現(xiàn)部分要配合截圖每個(gè)核心功能一張圖截圖下加一段說(shuō)明文字格式統(tǒng)一。最容易暴露“文檔是抄的”的一個(gè)地方就是系統(tǒng)實(shí)現(xiàn)部分。很多人的代碼功能和截圖對(duì)不上老師看得多了就能看出來(lái)。正確做法是每個(gè)功能模塊的說(shuō)明都嚴(yán)格按照你項(xiàng)目的實(shí)際路徑和頁(yè)面截圖去寫。比如實(shí)現(xiàn)定制訂單這個(gè)功能先貼定制表單頁(yè)面的截圖再貼Controller代碼截一小段關(guān)鍵代碼就行再貼生成訂單后的列表頁(yè)截圖說(shuō)明文字寫清楚“該模塊通過URL xxx進(jìn)入前端表單將定制參數(shù)封裝到Order對(duì)象Controller調(diào)用OrderService.insertOrder方法完成訂單插入與明細(xì)插入使用事務(wù)保證一致性”。邏輯能自洽文檔就不會(huì)被挑刺。5.2 答辯準(zhǔn)備把系統(tǒng)實(shí)現(xiàn)講成一個(gè)完整故事答辯是在驗(yàn)收你的“業(yè)務(wù)理解”不是聽你念代碼。準(zhǔn)備5到8分鐘的演示流程就夠了不用把所有頁(yè)面都點(diǎn)一遍。我的建議是開場(chǎng)先講系統(tǒng)整體功能然后馬上切到定制流程的演示——從用戶登錄、搜索蛋糕、點(diǎn)進(jìn)詳情、進(jìn)入定制頁(yè)、填寫定制信息、上傳參考圖、加入購(gòu)物車、提交訂單這時(shí)翻到后臺(tái)把訂單確認(rèn)狀態(tài)推進(jìn)再回到用戶端看到訂單狀態(tài)變化。這樣一整個(gè)閉環(huán)演示下來(lái)老師對(duì)你系統(tǒng)的完整度印象會(huì)非常深刻。老師大概率會(huì)追問的問題有SSM為什么比單體JSPServlet更清晰數(shù)據(jù)庫(kù)哪些表的關(guān)系是一對(duì)多的訂單狀態(tài)是怎么設(shè)計(jì)的上傳的圖片存在哪事務(wù)在哪個(gè)方法上生效權(quán)限控制怎么做的這些問題在本文前面的設(shè)計(jì)里基本都講到了你只要把狀態(tài)機(jī)的整數(shù)定義、文件上傳路徑、Transactional的落點(diǎn)這幾點(diǎn)背熟基本都能答上來(lái)。最忌諱的是項(xiàng)目做完不知道自己的核心類叫什么、配置文件有幾個(gè)這種低級(jí)問題答不上來(lái)才是真正的硬傷。6. 部署上線與演示環(huán)境準(zhǔn)備6.1 本地打包部署全流程很多同學(xué)項(xiàng)目寫完了最后在部署環(huán)節(jié)翻車。最穩(wěn)妥的做法是用Maven打成war包丟到Tomcat的webapps目錄下啟動(dòng)。項(xiàng)目開發(fā)階段你在IDEA里右鍵Run Tomcat沒問題但最終演示建議用獨(dú)立Tomcat war包的方式出了環(huán)境問題方便排查。步驟建議照著做第一步在pom.xml里設(shè)置打包方式為war并配置maven-war-plugin避免web.xml找不到第二步修改數(shù)據(jù)庫(kù)連接配置確保是5.7版本能用的驅(qū)動(dòng)、URL、賬號(hào)密碼第三步Maven執(zhí)行clean package觀察構(gòu)建是否成功如果報(bào)缺依賴或者Java編譯錯(cuò)誤先修復(fù)第四步把生成的war包復(fù)制到Tomcat的webapps目錄啟動(dòng)bin/startup.batWindows或startup.sh看日志有沒有Deploy成功的輸出第五步瀏覽器訪問http://localhost:8080/項(xiàng)目名/測(cè)試登錄、定制下單、后臺(tái)審核全流程。部署階段有個(gè)高頻坑數(shù)據(jù)庫(kù)賬號(hào)密碼忘了改本地IDEA能跑是因?yàn)槟阍贗DEA里連的是本地?cái)?shù)據(jù)庫(kù)但Tomcat啟動(dòng)的war包默認(rèn)讀取的也是同一個(gè)配置文件理論上沒問題但如果你把war發(fā)給別人測(cè)試一定要把SQL文件一并給出去并寫清楚MySQL版本、需要導(dǎo)入的數(shù)據(jù)庫(kù)名。演示前最好把自己電腦上的服務(wù)全部啟動(dòng)好瀏覽器清理緩存SQL文件重新導(dǎo)入一遍到干凈的庫(kù)避免歷史臟數(shù)據(jù)干擾演示效果。6.2 演示前的數(shù)據(jù)準(zhǔn)備與話術(shù)準(zhǔn)備演示時(shí)的數(shù)據(jù)很重要。數(shù)據(jù)庫(kù)里不要只有兩條測(cè)試數(shù)據(jù)至少準(zhǔn)備12個(gè)以上的蛋糕商品覆蓋三個(gè)分類每個(gè)蛋糕都要配上圖片評(píng)論至少準(zhǔn)備五六條最好還有一個(gè)狀態(tài)正在流轉(zhuǎn)中的定制訂單。首頁(yè)輪播圖放三張尺寸合適的蛋糕大圖這會(huì)大大提升系統(tǒng)的視覺效果。定制訂單數(shù)據(jù)準(zhǔn)備時(shí)要覆蓋多個(gè)狀態(tài)待確認(rèn)的、已確認(rèn)的、配送中的、已完成的這樣演示時(shí)可以快速切換狀態(tài)不用現(xiàn)場(chǎng)在生產(chǎn)環(huán)境里新增。另外演示前一定要預(yù)先設(shè)計(jì)演示腳本。寫清楚每一步點(diǎn)什么、引導(dǎo)語(yǔ)怎么說(shuō)然后彩排兩遍。演示的時(shí)候不要邊想邊點(diǎn)容易卡殼。常見操作順序我已經(jīng)在5.2里講過了你可以直接拿來(lái)編排。最后再準(zhǔn)備一個(gè)小技巧演示的時(shí)候把瀏覽器縮放比例調(diào)成90%或80%這樣頁(yè)面顯示完整屏幕錄制或者截屏都會(huì)更好看別問我怎么知道的都是踩過的坑。