銷售網(wǎng)站畢設(shè)項(xiàng)目實(shí)戰(zhàn):從數(shù)據(jù)庫(kù)設(shè)計(jì)到部署上線全解析)
SpringBootVue做手機(jī)銷售網(wǎng)站屬于Java Web畢設(shè)里非常經(jīng)典的前后端分離項(xiàng)目。說句實(shí)在話這類項(xiàng)目在GitHub和碼云上一抓一大把但大多數(shù)學(xué)生下載下來(lái)之后根本跑不起來(lái)——不是缺這個(gè)配置就是少那個(gè)依賴更別提把數(shù)據(jù)庫(kù)腳本導(dǎo)進(jìn)去之后一堆外鍵報(bào)錯(cuò)。我前前后后幫人排查過幾十個(gè)這種項(xiàng)目今天就把一個(gè)能真正跑通的完整方案拆開揉碎了講清楚。這個(gè)項(xiàng)目涉及的核心內(nèi)容有這么幾塊SpringBoot后端接口、Vue前端頁(yè)面、MySQL數(shù)據(jù)庫(kù)腳本、接口文檔。對(duì)于做畢設(shè)的學(xué)生來(lái)說你需要的不只是一個(gè)能點(diǎn)來(lái)點(diǎn)去的Demo而是一套能講清楚為什么這么設(shè)計(jì)的完整邏輯。我這篇文章就按照實(shí)際開發(fā)順序來(lái)拆解包含技術(shù)選型、數(shù)據(jù)庫(kù)設(shè)計(jì)、接口實(shí)現(xiàn)、前后端聯(lián)調(diào)、部署上線以及那些最容易讓你在答辯時(shí)翻車的隱藏坑。1. 先搞清楚手機(jī)銷售網(wǎng)站到底需要哪些功能模塊很多同學(xué)拿到題目就懵了手機(jī)銷售網(wǎng)站那不就是個(gè)商品列表加購(gòu)物車嗎真這么做下去到答辯的時(shí)候你會(huì)發(fā)現(xiàn)根本沒東西可講。一個(gè)合格的手機(jī)銷售網(wǎng)站在畢設(shè)層面至少要覆蓋前臺(tái)展示和后臺(tái)管理兩個(gè)大方向功能拆解下來(lái)大概是這樣的。前臺(tái)用戶端主要面向普通消費(fèi)者。用戶注冊(cè)登錄是基礎(chǔ)然后就是手機(jī)商品的瀏覽和篩選。這里有個(gè)關(guān)鍵點(diǎn)手機(jī)和普通商品不一樣它有品牌、操作系統(tǒng)Android還是iOS、運(yùn)行內(nèi)存、存儲(chǔ)容量、屏幕尺寸、電池容量這些細(xì)分屬性。所以搜索篩選功能不能只做一個(gè)簡(jiǎn)單的關(guān)鍵字匹配而是要支持多維度的組合篩選比如同時(shí)按華為和8GB運(yùn)存來(lái)過濾。購(gòu)物車和訂單系統(tǒng)是交易閉環(huán)的核心。用戶把手機(jī)加入購(gòu)物車之后要能修改數(shù)量、刪除商品、計(jì)算總價(jià)提交訂單時(shí)還得填寫收貨地址。這里牽扯出一個(gè)畢設(shè)里很關(guān)鍵的考察點(diǎn)庫(kù)存扣減。很多同學(xué)用的是先下單再減庫(kù)存甚至干脆不處理這在高并發(fā)場(chǎng)景下會(huì)有超賣風(fēng)險(xiǎn)。畢設(shè)做單體應(yīng)用可以用數(shù)據(jù)庫(kù)的行級(jí)鎖或者樂觀鎖來(lái)處理但關(guān)鍵是你得能把這個(gè)邏輯講清楚。后臺(tái)管理端則是給管理員用的。商品的增刪改查是必須的包括手機(jī)的名稱、價(jià)格、庫(kù)存、圖片、詳細(xì)介紹這些字段。另外品牌管理和分類管理可以單獨(dú)做一張表方便前臺(tái)按品牌篩選。訂單管理要能查看所有訂單列表、修改訂單狀態(tài)待付款、待發(fā)貨、已發(fā)貨、已完成、已取消。用戶管理一般就是查看用戶列表和啟用禁用賬號(hào)。這里我建議加一個(gè)數(shù)據(jù)可視化看板雖然會(huì)增加工作量但這是答辯時(shí)的加分項(xiàng)。用ECharts做幾個(gè)圖表放在首頁(yè)——比如按月統(tǒng)計(jì)銷售額的折線圖、各品牌手機(jī)銷量占比的餅圖、庫(kù)存不足預(yù)警的列表。這能直接證明你對(duì)業(yè)務(wù)數(shù)據(jù)的理解而且實(shí)現(xiàn)起來(lái)也不復(fù)雜就是查幾張表做聚合統(tǒng)計(jì)。需要注意的是功能模塊的劃分最好在文檔和數(shù)據(jù)庫(kù)設(shè)計(jì)階段就定下來(lái)不要邊寫代碼邊加功能。我見過太多同學(xué)后面改表結(jié)構(gòu)改到崩潰因?yàn)榍岸隧?yè)面、后端接口、數(shù)據(jù)庫(kù)字段三處是關(guān)聯(lián)的牽一發(fā)而動(dòng)全身。2. 技術(shù)選型不是越新越好關(guān)鍵看穩(wěn)定和匹配先說說后端。SpringBoot的版本這里有個(gè)容易踩的坑。很多學(xué)生下載項(xiàng)目的時(shí)候習(xí)慣去Maven倉(cāng)庫(kù)拉最新版比如SpringBoot 3.x結(jié)果發(fā)現(xiàn)JDK版本要17以上之前寫的代碼里很多寫法要調(diào)整還有一些老版本的依賴不兼容直接原地爆炸。畢設(shè)項(xiàng)目我強(qiáng)烈建議用SpringBoot 2.7.x系列。這個(gè)版本非常成熟網(wǎng)上資料最多遇到問題搜一下基本都能找到解決方案。它默認(rèn)兼容JDK 8而大多數(shù)學(xué)校機(jī)房和企業(yè)里用的還是JDK 8你在答辯演示的時(shí)候環(huán)境不會(huì)出問題。如果已經(jīng)下載的Demo是SpringBoot 3.x優(yōu)先考慮整體替換回2.7.x而不是去適配新版本。持久層框架推薦MyBatis-Plus而不是原生MyBatis。我們做畢設(shè)主要是把精力放在業(yè)務(wù)邏輯上MyBatis-Plus的通用Mapper能自動(dòng)幫我們生成單表的增刪改查SQL避免寫大量重復(fù)的XML文件。它提供的分頁(yè)插件也比較好用Web層配合前端的分頁(yè)組件代碼量少一大截。前端這塊Vue版本選擇也講究。Vue 2和Element UI的搭配是最成熟穩(wěn)妥的組件全坑少網(wǎng)上的案例也多。Vue 3搭配Element Plus也可以API更現(xiàn)代但如果你對(duì)Vue還不熟建議用Vue 2。另外前端構(gòu)建工具、狀態(tài)管理這些如果時(shí)間緊張可以選輕量方案用Vuex組件通信傳參處理簡(jiǎn)單需求就夠了。前端UI框架Element UI算是最常用的。表格、表單、彈窗、分頁(yè)這些核心組件都有而且美觀度在后臺(tái)管理系統(tǒng)中足夠用了。如果是自己做前臺(tái)用戶界面手機(jī)銷售這類面向消費(fèi)者的頁(yè)面Element UI風(fēng)格會(huì)顯得稍微偏后臺(tái)但畢設(shè)階段完全可以接受。你可以在確認(rèn)功能完整的前提下想著把視覺優(yōu)化一下比如設(shè)計(jì)和交互做得更有質(zhì)感一些。最后說數(shù)據(jù)庫(kù)。MySQL 5.7或者8.0都可以如果你是學(xué)習(xí)用途建議8.0反正市面上絕大多數(shù)項(xiàng)目都支持。有一點(diǎn)要提醒MySQL 8.0默認(rèn)的認(rèn)證插件是caching_sha2_password有些舊版本的數(shù)據(jù)庫(kù)連接工具連接不上但我們?cè)赟pringBoot里用的mysql-connector-java驅(qū)動(dòng)8.0以上的版本已經(jīng)兼容了所以問題不大。連接數(shù)據(jù)庫(kù)的時(shí)候注意時(shí)區(qū)配置在JDBC連接地址后面加上serverTimezoneAsia/Shanghai不然會(huì)有8小時(shí)時(shí)差問題。3. 數(shù)據(jù)庫(kù)表設(shè)計(jì)直接決定開發(fā)效率和答辯分?jǐn)?shù)手機(jī)銷售網(wǎng)站的數(shù)據(jù)庫(kù)表說復(fù)雜也復(fù)雜說簡(jiǎn)單也簡(jiǎn)單但有幾個(gè)設(shè)計(jì)原則你最好遵守這決定了后面寫代碼的時(shí)候是順手還是別扭。核心表就這些用戶表sys_user、手機(jī)商品表phone、品牌表brand、購(gòu)物車表cart、訂單表orders、訂單明細(xì)表order_item、輪播圖表banner、收貨地址表address。先看用戶表核心字段是用戶名、密碼、昵稱、手機(jī)號(hào)、頭像、角色標(biāo)識(shí)。角色這里需要多說一句雖然我們不搞復(fù)雜的權(quán)限框架但管理員和普通用戶肯定要區(qū)分??梢杂胷ole字段值為1表示管理員值為0表示普通用戶。這樣前端登錄后可以根據(jù)角色決定顯示哪些菜單后端也可以在攔截器里根據(jù)角色做接口訪問限制。還有密碼存儲(chǔ)千萬(wàn)不要明文存放。比較簡(jiǎn)單的做法是用MD5加鹽或者用Spring Security的BCryptPasswordEncoder。如果項(xiàng)目里沒接Security自己寫MD5加鹽工具類也行但答辯的時(shí)候要能說出這樣做的理由。手機(jī)商品表是業(yè)務(wù)的重心。字段包括手機(jī)名稱、品牌ID、價(jià)格、原價(jià)、庫(kù)存、銷量、主圖URL、詳情圖URL列表、操作系統(tǒng)、運(yùn)行內(nèi)存、存儲(chǔ)容量、屏幕尺寸、電池容量、處理器型號(hào)、上市時(shí)間、上下架狀態(tài)。注意品牌ID是外鍵關(guān)聯(lián)品牌表的這樣你按品牌篩選的時(shí)候直接查這個(gè)字段就行。價(jià)格字段推薦用DECIMAL(10, 2)類型不要用FLOAT或DOUBLE不然會(huì)出現(xiàn)浮點(diǎn)數(shù)精度問題。訂單表要設(shè)計(jì)好狀態(tài)字段。用一個(gè)status字段存儲(chǔ)訂單狀態(tài)后臺(tái)管理系統(tǒng)里常見的狀態(tài)機(jī)是0待付款1待發(fā)貨2待收貨3已完成4已取消。前端根據(jù)狀態(tài)碼顯示對(duì)應(yīng)的按鈕。訂單表和訂單明細(xì)表是一對(duì)多的關(guān)系一個(gè)訂單里有多個(gè)商品條目。設(shè)計(jì)訂單明細(xì)表時(shí)除了商品名稱和數(shù)量最好把下單那一刻的商品快照價(jià)格也存下來(lái)因?yàn)樯唐穬r(jià)格后來(lái)可能會(huì)改歷史訂單要保留下單時(shí)的價(jià)格。購(gòu)物車表比較簡(jiǎn)單字段是用戶ID、商品ID、商品數(shù)量加上創(chuàng)建和更新時(shí)間就行了。一個(gè)用戶往購(gòu)物車添加商品時(shí)如果這個(gè)商品已經(jīng)在購(gòu)物車?yán)锪司椭苯影褦?shù)量加一而不是新增一條記錄。輪播圖表主要記錄圖片URL、跳轉(zhuǎn)鏈接、排序權(quán)重前臺(tái)首頁(yè)展示時(shí)按權(quán)重排序。還有一個(gè)常見問題需要提醒到底要不要設(shè)置外鍵約束。很多教程項(xiàng)目為了演示方便都加外鍵但實(shí)際開發(fā)中大型項(xiàng)目基本都取消物理外鍵只在邏輯上保持關(guān)聯(lián)。畢設(shè)的話建表腳本里保留外鍵是可以的答辯時(shí)說是為了數(shù)據(jù)一致性但如果你應(yīng)用層代碼寫得不好很容易因?yàn)橥怄I約束導(dǎo)致刪除操作失敗。穩(wěn)妥的方案是建議你放棄物理外鍵在SQL層面通過索引和關(guān)聯(lián)查詢來(lái)保證邏輯正確。MySQL執(zhí)行腳本時(shí)記得把DROP TABLE IF EXISTS放在每個(gè)建表語(yǔ)句前面這樣腳本重復(fù)執(zhí)行不會(huì)報(bào)錯(cuò)。4. 后端接口不是寫完就行你要懂這幾個(gè)核心設(shè)計(jì)接口設(shè)計(jì)這塊我不想把所有接口名單列一遍那沒意義。我只講幾個(gè)最容易出問題、也最能在答辯時(shí)體現(xiàn)出你水平的地方。先說接口規(guī)范。既然是前后端分離統(tǒng)一返回格式是必須的。建議定義一個(gè)Result類包含code、message、data三個(gè)字段。接口成功時(shí)code為200失敗時(shí)code為500未登錄時(shí)code為401無(wú)權(quán)限時(shí)code為403。前端拿到響應(yīng)后只要判斷code是否為200為200就正常渲染數(shù)據(jù)否則彈出message提示。這個(gè)規(guī)范從始至終要保持一致否則前后端聯(lián)調(diào)的時(shí)候會(huì)非常痛苦。用戶登錄鑒權(quán)是重點(diǎn)。畢設(shè)項(xiàng)目可以做基于Token的認(rèn)證簡(jiǎn)單方案是登錄成功后生成一個(gè)UUID作為Token存到Redis里設(shè)置過期時(shí)間返回給前端。前端每次請(qǐng)求都在Header里帶上token字段后端寫一個(gè)攔截器在業(yè)務(wù)代碼執(zhí)行前校驗(yàn)Token校驗(yàn)通過就放行不通過就返回401。這么做的好處是能夠橫向擴(kuò)展Session存在服務(wù)器內(nèi)存里的話會(huì)有很多麻煩。當(dāng)然如果你不想引入Redis用JWT也可以把用戶信息加密放到Token里后端用密鑰解密驗(yàn)證。商品列表接口的設(shè)計(jì)要講究一點(diǎn)。手機(jī)銷售網(wǎng)站的前臺(tái)頁(yè)面一般有兩種展示模式一種是搜索加分類篩選另一種是上下拉無(wú)限加載。接口其實(shí)可以統(tǒng)一成一個(gè)通過請(qǐng)求參數(shù)來(lái)控制。建議參數(shù)有page頁(yè)碼、limit每頁(yè)條數(shù)、keyword關(guān)鍵字搜索、brandId品牌篩選、osType操作系統(tǒng)篩選、minPrice和maxPrice價(jià)格區(qū)間、sortBy排序字段可以是價(jià)格、銷量、上架時(shí)間。后端用MyBatis-Plus的分頁(yè)插件處理?xiàng)l件構(gòu)造器動(dòng)態(tài)拼接SQL條件。這個(gè)接口寫明白之后前臺(tái)的搜索、篩選功能基本就全通了。訂單提交這塊一定要處理事務(wù)。一個(gè)完整的下單流程要往訂單表插記錄往訂單明細(xì)表批量插記錄要扣減商品庫(kù)存要清空購(gòu)物車?yán)飳?duì)應(yīng)的商品。任何一步失敗那么整體的操作就應(yīng)該回滾這叫要么全部成功要么全部失敗。在SpringBoot里只需要在Service層方法上加Transactional注解就行。還有一個(gè)小問題下單時(shí)要鎖定庫(kù)存減少并發(fā)超賣可以在事務(wù)里對(duì)商品行加SELECT ... FOR UPDATE鎖前提是事務(wù)里要包含查詢庫(kù)存和更新庫(kù)存兩步驟。支付功能要看你的時(shí)間預(yù)算。如果只是想順利畢業(yè)做一個(gè)模擬支付接口就夠了。用戶在付款頁(yè)面點(diǎn)確認(rèn)支付后端直接把訂單狀態(tài)從待付款改成待發(fā)貨在前端提示支付成功。如果你想做得精致點(diǎn)可以在訂單表加一個(gè)支付時(shí)間字段模擬一下回調(diào)邏輯。千萬(wàn)不要為了追求真實(shí)支付功能去對(duì)接支付寶、微信支付的沙箱環(huán)境那會(huì)占用你大量時(shí)間而且答辯考察的重點(diǎn)也不在支付對(duì)接上。這里分享一個(gè)我?guī)蛯W(xué)生改代碼時(shí)常見的低級(jí)錯(cuò)誤很多同學(xué)在寫查詢列表接口時(shí)沒有處理參數(shù)為空的情況。比如brandId沒傳你可以對(duì)條件構(gòu)造器的條件進(jìn)行非空判斷讓它加到查詢條件里去。MyBatis-Plus條件構(gòu)造器里用StringUtils.hasText()或者判斷對(duì)象不為空后再eq關(guān)聯(lián)。5. 前后端聯(lián)調(diào)時(shí)那些讓你懷疑人生的細(xì)節(jié)前后端分離的項(xiàng)目聯(lián)調(diào)階段是最折磨人的。前端在本地跑dev服務(wù)器后端跑在8080端口跨域問題第一個(gè)跳出來(lái)。解決跨域有幾種辦法推薦用SpringBoot的全局CORS配置。寫一個(gè)配置類實(shí)現(xiàn)WebMvcConfigurer接口重寫addCorsMappings方法設(shè)置允許的跨域來(lái)源、請(qǐng)求頭和方法。要注意的是如果前端請(qǐng)求帶了Token之類自定義HeaderallowedHeaders里要寫上。設(shè)置SpringBoot應(yīng)用啟動(dòng)的端口和上下文路徑需要在前端代理配置文件里同步改vue.config.js里配置devServer的代理轉(zhuǎn)發(fā)這樣前端請(qǐng)求/api開頭的地址就會(huì)被代理到后端的localhost:8080/api上。前后端接口字段對(duì)不上也是聯(lián)調(diào)時(shí)的一大坑。前端要的是createTime你后端返回的卻是create_time。這個(gè)問題在MyBatis里尤其容易出現(xiàn)。使用MyBatis-Plus時(shí)全局配置里開啟駝峰命名映射那么數(shù)據(jù)庫(kù)的create_time字段就能自動(dòng)映射為實(shí)體的createTime屬性。前端拿到的是規(guī)范的駝峰字段就不會(huì)對(duì)不上了。調(diào)試接口時(shí)我推薦兩個(gè)工具。一個(gè)是Postman后端自己測(cè)接口的時(shí)候用另一個(gè)是瀏覽器的開發(fā)者工具Network面板前端聯(lián)調(diào)時(shí)看請(qǐng)求和響應(yīng)數(shù)據(jù)。學(xué)會(huì)看請(qǐng)求的URL、Header、Request Payload和響應(yīng)體大部分接口問題能定位到原因。分頁(yè)這塊在前后端聯(lián)調(diào)時(shí)也容易出差錯(cuò)。前端組件傳的pageNum和pageSize后端接口的參數(shù)名必須一致才能接收到。干脆統(tǒng)一一下前端傳page和limit后端就按page和limit來(lái)接收。返回的數(shù)據(jù)結(jié)構(gòu)也要約定好建議是{records: [...], total: 100, current: 1, size: 10}前端拿到records渲染列表拿到total算總頁(yè)數(shù)。6. 我的建議從下載源碼到成功跑通的完整步驟如果你手里已經(jīng)有一套SpringBootVue的手機(jī)銷售網(wǎng)站源碼但就是跑不起來(lái)我建議你按順序做不要亂試。第一步檢查JDK版本。項(xiàng)目和你的本地環(huán)境版本匹配否則編譯報(bào)一堆奇怪的錯(cuò)誤。使用Maven的項(xiàng)目導(dǎo)入IDE后更新一下Maven配置把依賴下載完整。第二步配置數(shù)據(jù)庫(kù)。打開application.yml或properties文件檢查數(shù)據(jù)源配置。確認(rèn)MySQL的賬號(hào)密碼、端口號(hào)對(duì)不對(duì)。然后用Navicat或命令行執(zhí)行SQL腳本執(zhí)行完確認(rèn)核心表已經(jīng)創(chuàng)建出來(lái)了。第三步改Redis配置。如果項(xiàng)目用了Redis確認(rèn)本地裝了Redis服務(wù)啟動(dòng)了。SpringBoot連接Redis的配置在配置文件里默認(rèn)是localhost:6379密碼為空。如果你本地沒裝Redis而項(xiàng)目里又必須用可以臨時(shí)修改代碼把緩存相關(guān)功能去掉但不建議這么做因?yàn)闀?huì)牽連登錄鑒權(quán)邏輯。第四步啟動(dòng)SpringBoot后端。查看控制臺(tái)有沒有報(bào)錯(cuò)信息是否出現(xiàn)Started Application in x.xxx seconds說明啟動(dòng)成功。此時(shí)打開瀏覽器訪問localhost:8080效果看情況如果接口路徑配置合理可以測(cè)試接口。第五步啟動(dòng)Vue前端。進(jìn)入前端目錄執(zhí)行npm install安裝依賴這個(gè)過程可能比較久耐心等待。安裝完成后再執(zhí)行npm run serve。這里有個(gè)比較常見的坑是npm install過程中報(bào)node-sass安裝失敗。新版項(xiàng)目一般用dart-sass問題不大。如果你遇到的是node-sass上網(wǎng)搜一下對(duì)應(yīng)版本的兼容性或者讓Node版本降級(jí)。第六步登錄驗(yàn)證。前端啟動(dòng)后打開瀏覽器看到登錄頁(yè)就對(duì)了。用管理員的賬號(hào)密碼登錄進(jìn)去看看能不能打開后臺(tái)管理頁(yè)面商品管理能否正常增刪改查數(shù)據(jù)能渲染出來(lái)就說明整個(gè)鏈路是通的。7. 部署上線的正確姿勢(shì)和那些隱藏的系統(tǒng)配置很多學(xué)校畢設(shè)要求最后要能演示本地跑通可能還不夠有的老師會(huì)要求部署到服務(wù)器上。這里介紹一個(gè)最穩(wěn)妥、最省事的方式用寶塔面板部署。買一臺(tái)云服務(wù)器裝好寶塔面板之后我們需要做這些事安裝MySQL和Redis如果項(xiàng)目用了安裝Nginx安裝JDK和Maven。然后借助寶塔面板上傳項(xiàng)目代碼或者直接在服務(wù)器上用Git拉取代碼。后端的部署使用Maven打包成可執(zhí)行的JAR文件。在項(xiàng)目根目錄執(zhí)行mvn clean package -DskipTests它會(huì)在target目錄下生成一個(gè)JAR包。在寶塔的網(wǎng)站管理里添加一個(gè)Java項(xiàng)目上傳JAR包把啟動(dòng)命令配好。啟動(dòng)命令里也可以指定端口或者直接用配置文件里的server.port。后端部署成功之后服務(wù)器的防火墻或安全組要把對(duì)應(yīng)的端口放行否則外部訪問不到。前端的部署需要先構(gòu)建靜態(tài)文件。在Vue項(xiàng)目目錄執(zhí)行npm run build生成dist目錄。把dist目錄里的文件上傳到Nginx的站點(diǎn)根目錄。然后在Nginx的配置里設(shè)置反向代理當(dāng)用戶訪問/api路徑時(shí)將請(qǐng)求轉(zhuǎn)發(fā)到后端服務(wù)器的地址。記住前端部署在80端口后端跑在8080如果不配置反向代理前端頁(yè)面里所有請(qǐng)求都會(huì)404但這不影響本地的8080端口訪問所以本地與部署是有差異的。數(shù)據(jù)庫(kù)的初始化與遷移生產(chǎn)環(huán)境執(zhí)行一遍SQL腳本腳本是能重復(fù)執(zhí)行的但要注意初始化數(shù)據(jù)的冪等性。如果有用到Redis注意給Redis設(shè)置密碼或用訪問控制否則會(huì)有安全風(fēng)險(xiǎn)。部署過程確實(shí)繁瑣但完成后把訪問地址發(fā)給老師打開就能看到我們的項(xiàng)目這會(huì)給老師留下好的印象。很多同學(xué)到了答辯前才開始部署結(jié)果手忙腳亂。我建議至少提前一周把服務(wù)器環(huán)境搭好先本地跑通再試著部署一遍時(shí)間充裕很多。8. 接口文檔怎么寫才能加分接口文檔這也是畢設(shè)的驗(yàn)收材料之一很多同學(xué)隨便列個(gè)表格就交了其實(shí)這塊做得好很能加分。我的建議是用Swagger生成在線接口文檔。SpringBoot集成Swagger非常簡(jiǎn)單加幾個(gè)依賴在啟動(dòng)類上加EnableOpenApi注解再在Controller的接口上加上Api和ApiOperation注解描述方法和參數(shù)。啟動(dòng)項(xiàng)目之后訪問localhost:8080/swagger-ui/index.html就能看到清晰的接口列表。每個(gè)接口的請(qǐng)求方式、請(qǐng)求參數(shù)、響應(yīng)結(jié)構(gòu)都能實(shí)時(shí)調(diào)試。這比手寫一份幾十頁(yè)的Word文檔要直觀得多而且改動(dòng)代碼后文檔會(huì)自動(dòng)同步更新。如果你不想引入Swagger那至少要做一個(gè)規(guī)范的Markdown文檔。按照模塊來(lái)劃分用戶模塊、商品模塊、購(gòu)物車模塊、訂單模塊、統(tǒng)計(jì)分析模塊。每個(gè)接口列清楚URL、請(qǐng)求方式、請(qǐng)求參數(shù)表格名字、類型、是否必填、說明、返回結(jié)果示例。注意寫清楚返回結(jié)果的JSON示例前端同事照著寫代碼。這里分享一個(gè)我常見的文檔坑接口文檔里所有參數(shù)都寫了必填但實(shí)際后端代碼里有些參數(shù)允許為空。前端嚴(yán)格按照文檔傳參時(shí)發(fā)現(xiàn)有些篩選條件不需要或者可選容易產(chǎn)生誤解。寫文檔的時(shí)候要把每個(gè)參數(shù)的校驗(yàn)邏輯寫清楚比如該參數(shù)可選不傳則查詢?nèi)科放啤_@樣前后端溝通起來(lái)省很多事。9. 最終檢查和答辯前的準(zhǔn)備別在最后一步翻車檢查代碼規(guī)范。Controller層的接口參數(shù)統(tǒng)一用自定義的請(qǐng)求對(duì)象去接收不要直接散落一堆RequestParam參數(shù)在方法簽名上。Service層負(fù)責(zé)業(yè)務(wù)邏輯Controller層盡量只做參數(shù)接收和結(jié)果返回。Repository層承接ORM操作。這樣的三層架構(gòu)答辯的時(shí)候畫一張架構(gòu)圖基本就清晰展示了項(xiàng)目的設(shè)計(jì)能力。重新梳理項(xiàng)目的核心流程和關(guān)鍵點(diǎn)。答辯前準(zhǔn)備一個(gè)項(xiàng)目技術(shù)亮點(diǎn)清單重點(diǎn)能講清楚項(xiàng)目采用前后端分離架構(gòu)后端使用SpringBoot數(shù)據(jù)庫(kù)采用MySQL登錄鑒權(quán)使用Token機(jī)制保證接口安全訂單模塊用事務(wù)機(jī)制保證數(shù)據(jù)一致性商品查詢支持多維度篩選和分頁(yè)使用數(shù)據(jù)可視化圖表展示銷售數(shù)據(jù)。每一點(diǎn)都能展開講一兩分鐘已經(jīng)非常充足了比背代碼更能展示你的思考。再檢查一遍項(xiàng)目里有沒有硬編碼的問題。數(shù)據(jù)庫(kù)連接密碼、Redis密碼不要明文出現(xiàn)在代碼里最好放到配置文件里甚至可以考慮用環(huán)境變量。如果你用的是從網(wǎng)上下載的Demo注意修改包名和項(xiàng)目名不要直接拿別人的包名去答辯老師一查就露餡。最后建議把項(xiàng)目從零搭建過程中踩過的坑整理成一份簡(jiǎn)短的開發(fā)日志。這不需要給老師看但答辯時(shí)如果被追問項(xiàng)目里遇到過什么問題你就能從自己的經(jīng)歷里挑出來(lái)。這種真實(shí)經(jīng)驗(yàn)比背出來(lái)的答案更打動(dòng)老師也是我當(dāng)年通過答辯的重要心得。手機(jī)銷售網(wǎng)站這個(gè)題目本身不算難難的是你有沒有把一個(gè)完整項(xiàng)目做深做透。技術(shù)不在多在于你能否把每個(gè)環(huán)節(jié)的邏輯講清楚。你把這個(gè)項(xiàng)目的數(shù)據(jù)庫(kù)設(shè)計(jì)、接口規(guī)范、權(quán)限方案、事務(wù)一致性這幾個(gè)問題搞明白了答辯的時(shí)候就能掌握主動(dòng)權(quán)。