實(shí)戰(zhàn):從數(shù)據(jù)庫設(shè)計(jì)到部署答辯全攻略)
每年到這個時間點(diǎn)我總能在后臺看到一堆類似的留言“博主有沒有SpringBoot的管理系統(tǒng)源碼”“寵物店管理系統(tǒng)能不能出一期”“畢設(shè)選題選了寵物店但代碼跑不起來怎么辦”其實(shí)這類基于SpringBoot的寵物店管理系統(tǒng)已經(jīng)不算什么新鮮選題了但它能一直穩(wěn)坐熱門畢設(shè)榜前三背后是有充分理由的業(yè)務(wù)場景貼近生活、功能邊界清晰、技術(shù)棧剛好覆蓋Java后端的主流要求而且數(shù)據(jù)模型不復(fù)雜特別適合用來作為SpringBoot的綜合實(shí)戰(zhàn)項(xiàng)目。今天我就以一個過來人的身份把這套系統(tǒng)的完整思路、技術(shù)選型、數(shù)據(jù)庫設(shè)計(jì)、核心實(shí)現(xiàn)、部署過程、論文撰寫以及我踩過的坑一次性說清楚。不管你是正在準(zhǔn)備畢設(shè)的學(xué)生還是想通過一個完整項(xiàng)目來鞏固SpringBoot技能的開發(fā)者這篇文章都值得你花二十分鐘靜下心來看完。我會按我自己做這類項(xiàng)目的習(xí)慣來拆解選題怎么定、表怎么建、功能怎么寫、部署怎么跑、論文怎么湊以及哪些地方的坑是老師最愛問、哪些地方最容易翻車。1. 項(xiàng)目定位與整體設(shè)計(jì)思路1.1 為什么“寵物店管理系統(tǒng)”會是經(jīng)久不衰的畢設(shè)選題每次看到有人問“畢設(shè)選什么題比較好”我的答案從來都是選你最熟悉、數(shù)據(jù)關(guān)系不繞、且能體現(xiàn)完整CRUD閉環(huán)的業(yè)務(wù)。寵物店管理系統(tǒng)完美符合這三個條件。先說業(yè)務(wù)熟悉感。寵物店的核心經(jīng)營范圍無非就幾件事把寵物賣出去、把寵物用品賣出去、給寵物做美容寄養(yǎng)、管理客戶和會員信息。這些都是日常能接觸到的場景不需要額外去補(bǔ)習(xí)行業(yè)黑話需求分析寫起來一氣呵成。其次是數(shù)據(jù)關(guān)系。寵物店天然存在“一對多”“多對多”的關(guān)系一個客戶可以買多只寵物一個訂單包含多種商品一種寵物類別下有多只寵物。這些關(guān)系是教科書級別的關(guān)聯(lián)查詢素材用來體現(xiàn)數(shù)據(jù)庫設(shè)計(jì)能力再合適不過了。最關(guān)鍵的是這類系統(tǒng)能覆蓋SpringBoot項(xiàng)目最標(biāo)準(zhǔn)的能力矩陣。登錄注冊、角色權(quán)限、增刪改查、文件上傳、分頁搜索、報(bào)表統(tǒng)計(jì)全都能塞進(jìn)去。你面面試的時候可以說“我做過一個完整的前后端管理系統(tǒng)涵蓋訂單、庫存、會員等模塊”這比“我寫過很多接口”有說服力得多。1.2 技術(shù)選型的核心原則穩(wěn)定壓倒一切技術(shù)選型是這類項(xiàng)目第一步但很多同學(xué)喜歡在這一步就開始折騰。我今天明確告訴你如果你是為了畢業(yè)、為了過答辯技術(shù)棧越主流越保守越好。我推薦的組合如下后端框架SpringBoot 2.7.x千萬別上SpringBoot 3.x原因后面詳述持久層框架MyBatis或MyBatis-Plus國內(nèi)項(xiàng)目占有率最高的組合數(shù)據(jù)庫MySQL 5.7或8.0哪個順手用哪個但8.0注意時區(qū)問題前端方案Thymeleaf服務(wù)端渲染 Bootstrap JQuery或者Vue前后端分離二選一構(gòu)建工具M(jìn)avenJDK版本1.8為什么強(qiáng)調(diào)SpringBoot 2.7.x而不是最新版因?yàn)槭忻嫔辖^大多數(shù)SpringBoot畢業(yè)設(shè)計(jì)項(xiàng)目的資料、源碼、講解視頻都基于2.x遇到問題你能搜到的解決方案最多。SpringBoot 3.0起強(qiáng)制要求JDK17很多老版本的MyBatis、PageHelper等工具在適配上有各種小問題咱們把這個變量直接砍掉。當(dāng)然如果你是為了面試加分那就另說。選MyBatis而非JPA不只是因?yàn)槠髽I(yè)用得多更核心的原因是MyBatis的SQL你可控性更高。比如寵物訂單的多表查詢你可以手寫SQL精準(zhǔn)控制查詢范圍和效率而不是讓框架自動生成你也不知道是什么的SQL。更重要的是畢業(yè)論文寫“系統(tǒng)實(shí)現(xiàn)”這一章時MyBatis的Mapper接口和XML能貼出很漂亮的核心代碼答辯老師一眼就能看懂——這一點(diǎn)在答辯現(xiàn)場很加分。2. 系統(tǒng)功能模塊與數(shù)據(jù)庫設(shè)計(jì)2.1 功能模塊怎么拆才合理寵物店管理系統(tǒng)的功能模塊拆法直接決定你的開發(fā)效率和論文篇幅。我的習(xí)慣是“按角色拆菜單按業(yè)務(wù)閉環(huán)拆模塊”。這系統(tǒng)通常有三種角色管理員、店員操作員、普通客戶或者不設(shè)客戶角色客戶信息僅作為數(shù)據(jù)記錄。在功能邊界上建議做成下面這張表模塊核心功能說明系統(tǒng)管理登錄、退出、重置密碼基于攔截器做登錄校驗(yàn)員工管理員工信息增刪改查對應(yīng)系統(tǒng)使用者信息客戶管理客戶信息與會員等級管理會員可設(shè)折扣價寵物管理寵物類別、寵物信息管理核心模塊含圖片上傳商品管理商品類別、商品信息管理與供應(yīng)商、庫存關(guān)聯(lián)寄養(yǎng)管理寄養(yǎng)登記、取走結(jié)算按天計(jì)費(fèi)狀態(tài)流轉(zhuǎn)預(yù)約管理美容、看病等預(yù)約登記簡單的時間沖突校驗(yàn)訂單管理寵物/商品購買下單訂單主表訂單明細(xì)表庫存管理商品出入庫記錄低庫存預(yù)警不建議再往上堆什么數(shù)據(jù)分析大屏、物聯(lián)網(wǎng)喂食、微信小程序聯(lián)動之類的東西。做出來確實(shí)炫但工作量成倍增加而且答辯老師一旦深入問實(shí)現(xiàn)細(xì)節(jié)容易把自己繞進(jìn)去。有一個說得通的“亮點(diǎn)”就夠不要七個八個亮點(diǎn)一起上。2.2 數(shù)據(jù)庫表怎么設(shè)計(jì)六張核心表必須字段齊全數(shù)據(jù)庫設(shè)計(jì)是論文里最容易被追問的部分所以我單獨(dú)拿出來重點(diǎn)說。完整的寵物店管理系統(tǒng)建議設(shè)計(jì)10到12張表但核心表至少下面這六張寵物表pet字段類型說明idbigint主鍵pet_namevarchar(50)寵物名稱category_idbigint所屬類別外鍵關(guān)聯(lián)寵物類別表pricedecimal(10,2)售價ageint年齡photovarchar(255)圖片路徑statustinyint狀態(tài)0未售出、1已售出create_timedatetime創(chuàng)建時間這里的status字段很有講究。寵物在店里的狀態(tài)不是簡單的“有/無”而是包含“在店、已預(yù)約、已售出、寄養(yǎng)中”等建議用int類型存狀態(tài)碼而不是用varchar存中文。這一點(diǎn)在答辯時被問到“你的狀態(tài)流轉(zhuǎn)怎么設(shè)計(jì)”能直接答上來是個加分點(diǎn)??蛻舯韈ustomer客戶字段里除了基本聯(lián)系方式一定要有l(wèi)evel字段普通會員、黃金會員、鉆石會員為的是和訂單表關(guān)聯(lián)時計(jì)算會員折扣價格。這一個字段就能讓論文里的“業(yè)務(wù)規(guī)則分析”多出兩段話來。訂單表orders和訂單明細(xì)表order_item訂單表存的是訂單主信息訂單號、客戶id、訂單總金額、下單時間、狀態(tài)。訂單明細(xì)表存的是具體的商品id、商品名稱、商品單價、購買數(shù)量、小計(jì)。注意商品名稱和單價必須冗余進(jìn)明細(xì)表而不是下單后通過商品表實(shí)時關(guān)聯(lián)查詢。原因是商品表里的價格后續(xù)會變動而歷史訂單必須保留下單時的快照。庫存表stock字段核心是product_id、庫存數(shù)量、安全庫存數(shù)、最后更新時間。安全庫存數(shù)用于實(shí)現(xiàn)“庫存預(yù)警”這是系統(tǒng)里比較容易出彩的小功能。寄養(yǎng)表boarding包含寵物id、寄養(yǎng)開始時間、結(jié)束時間、每日費(fèi)用、總費(fèi)用、狀態(tài)。按天計(jì)費(fèi)的計(jì)算邏輯很清晰是論文中“核心算法”的好素材哪怕邏輯很簡單也要描述得正規(guī)一點(diǎn)。除了這六張表加上員工表、寵物類別表、商品類別表、供應(yīng)商表、預(yù)約表、公告表整體12張表左右這在畢設(shè)里是“數(shù)據(jù)量充足但不臃腫”的合理范圍。每張表都要包含create_time和update_time字段命名統(tǒng)一用下劃線風(fēng)格這樣寫出來的Mapper和實(shí)體類都很規(guī)整。2.3 表關(guān)系的三種類型在項(xiàng)目里如何呈現(xiàn)說到表關(guān)系很多同學(xué)論文里寫了一大堆ER圖但代碼里根本沒體現(xiàn)出來。實(shí)際上最穩(wěn)妥的做法就是把這三種關(guān)系老老實(shí)實(shí)做出來。一對多關(guān)系典型寵物類別和寵物類別表是一方寵物表是多方多對多關(guān)系典型訂單和商品必須通過訂單明細(xì)表拆成兩個一對多一對一關(guān)系比較牽強(qiáng)但你可以說員工表和用戶表是邏輯上的一對一或者干脆不體現(xiàn)。在MyBatis中實(shí)現(xiàn)時我用得最多的組合是resultMap做關(guān)聯(lián)映射 association標(biāo)簽做一對一 collection標(biāo)簽做一對多。舉一個寵物商詳?shù)牟樵兝幽悴樵兡硞€寵物時要同時顯示出類別名你自己定義VO類去接收數(shù)據(jù)而不是硬把category塞進(jìn)pet實(shí)體里。select idselectPetDetail resultTypecom.example.vo.PetVO SELECT p.*, c.category_name FROM pet p LEFT JOIN pet_category c ON p.category_id c.id WHERE p.id #{id} /select這種寫法的好處是數(shù)據(jù)庫層面一次查詢搞定避免了N1問題。我在教學(xué)里見過太多同學(xué)在循環(huán)里查數(shù)據(jù)庫數(shù)據(jù)量一大頁面直接卡死這個習(xí)慣一定要改過來。3. 核心功能模塊的實(shí)現(xiàn)要點(diǎn)3.1 登錄鑒權(quán)用攔截器而非Shiro或Spring Security很多系統(tǒng)一上來就整Spring Security JWT看起來高大上但實(shí)際上對于“管理系統(tǒng)”這類單體項(xiàng)目來說殺雞用牛刀。我的建議登錄功能用Session 攔截器這是SpringBoot最基礎(chǔ)也最好講解的方案。具體做法是寫一個WebConfigurer實(shí)現(xiàn)WebMvcConfigurer注冊自定義的LoginInterceptor攔截器。攔截器里判斷Session中是否有登錄用戶沒有就重定向到登錄頁。同時配置放行路徑比如/login、/css/**、/js/**等靜態(tài)資源。所有Controller的基類里通過SessionAttribute(loginUser)注解或者直接從Session取值來獲取當(dāng)前登錄用戶用于記錄操作日志等用途。這套方案代碼量不大但在答辯時可以講清楚“你如何控制未授權(quán)訪問”比甩一臉Spring Security配置文件效果好得多。3.2 寵物管理模塊圖片上傳是隱藏考點(diǎn)寵物管理模塊是系統(tǒng)的門面基本功能大家都會做。真正拉開差距的是圖片上傳這個不起眼的功能。我的做法是在配置文件里設(shè)置自定義的上傳路徑比如D:/pet-photos/或Linux上的/data/pet-photos/通過Value注解讀取上傳目錄保存文件的時候用UUID重命名防止文件名沖突然后把相對路徑存到數(shù)據(jù)庫的photo字段里頁面展示時通過虛擬路徑映射到物理存儲目錄。public String upload(RequestParam(file) MultipartFile file, HttpServletRequest request) { String originalFilename file.getOriginalFilename(); String suffix originalFilename.substring(originalFilename.lastIndexOf(.)); String fileName UUID.randomUUID().toString().replace(-, ) suffix; String filePath uploadPath File.separator fileName; file.transferTo(new File(filePath)); // 拼接數(shù)據(jù)庫要存的訪問路徑 return /uploads/ fileName; }這里有個特別容易踩的坑圖片上傳后刷新頁面就404。原因是SpringBoot默認(rèn)不會把本地磁盤目錄映射為靜態(tài)資源。你需要寫一個配置類添加資源映射Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler(/uploads/**) .addResourceHandler(file: uploadPath File.separator); }這一步?jīng)]做你的上傳功能等于白做。很多同學(xué)的源碼在這個位置“缺胳膊少腿”上面這段代碼在網(wǎng)上答疑中被我貼出來過不下二十次。3.3 訂單與庫存的業(yè)務(wù)閉環(huán)訂單模塊是整個系統(tǒng)邏輯最密集的地方也是答辯老師最喜歡深挖的地方。下訂單的業(yè)務(wù)邏輯可以分為一個完整的事務(wù)處理校驗(yàn)庫存是否充足扣減商品庫存數(shù)量判斷會員等級計(jì)算折扣價生成訂單主記錄生成訂單明細(xì)記錄更新商品銷量。這里必須使用Transactional注解進(jìn)行事務(wù)管理否則一旦某一步失敗就會出現(xiàn)庫存扣了但訂單沒生成的嚴(yán)重?cái)?shù)據(jù)問題。這種低級錯誤對系統(tǒng)是毀滅性的卻是很多初學(xué)者最容易忽略的。在庫存模塊我額外做一個“低于安全庫存自動標(biāo)識”的功能。每次扣減庫存后判斷一次如果當(dāng)前庫存小于安全庫存值就在頁面上打個醒目的“補(bǔ)貨”標(biāo)簽。這個功能很好實(shí)現(xiàn)但在論文和演示中特別有畫面感屬于性價比極高的小亮點(diǎn)。還有一個常見需求是銷量統(tǒng)計(jì)用ECharts展示最近的訂單金額趨勢。前端模板里引入ECharts后端提供一個按天統(tǒng)計(jì)訂單金額的接口SQL里用DATE_FORMAT(create_time, %Y-%m-%d)分組統(tǒng)計(jì)即可。要注意查詢時必須考慮跨表關(guān)聯(lián)訂單和訂單明細(xì)的關(guān)系別搞混亂了。4. 部署文檔的正確打開方式4.1 拿到源碼后的第一步不要急著雙擊跑我見過太多同學(xué)拿到源碼后第一步就用IDEA直接打開然后瘋狂報(bào)錯心態(tài)直接爆炸。正確的操作順序應(yīng)該是這樣的第一步檢查JDK版本。IDEA里File→Project Structure→Project SDK選1.8。如果這里沒注意出現(xiàn)了版本不對的編譯錯誤后面全亂套。第二步用Navicat新建數(shù)據(jù)庫。數(shù)據(jù)庫名建議和application.yml里配置的名稱保持一致字符集選utf8mb4排序規(guī)則選utf8mb4_general_ci。然后導(dǎo)入項(xiàng)目自帶的sql文件注意檢查sql文件中是否有CREATE DATABASE語句如果有直接用命令行導(dǎo)入更方便。第三步修改配置文件。打開application.yml重點(diǎn)檢查下面幾個參數(shù)數(shù)據(jù)庫連接地址、數(shù)據(jù)庫用戶名、數(shù)據(jù)庫密碼。如果你的MySQL密碼是root密碼改成自己的本機(jī)密碼服務(wù)器地址默認(rèn)localhost:3306就行。第四步等Maven把依賴下載完。這一步極其考驗(yàn)?zāi)托牡谝淮螁訒rMaven倉庫是空的要下載幾十個jar包耗時取決于網(wǎng)速。如果一直失敗檢查是不是鏡像源的問題把阿里云鏡像寫進(jìn)settings.xml能解決95%的下載失敗問題。第五步啟動PetStoreApplication.java看到Started日志出現(xiàn)打開瀏覽器輸入localhost:8080如果出現(xiàn)登錄頁說明項(xiàng)目成功跑起來了。4.2 部署到云服務(wù)器時這些端口和路徑必須改如果你需要把項(xiàng)目部署到云服務(wù)器給別人演示或者這就是老師要求的交付形式有幾個細(xì)節(jié)必須處理。第一application.yml中的數(shù)據(jù)庫地址要從localhost改成云數(shù)據(jù)庫的公網(wǎng)地址或內(nèi)網(wǎng)地址。數(shù)據(jù)庫一定要用云數(shù)據(jù)庫而不是服務(wù)器本地?cái)?shù)據(jù)庫不然數(shù)據(jù)丟失了真的很麻煩。第二修改端口和訪問路徑在application.yml里加上server: port: 8080 servlet: context-path: /如果你的項(xiàng)目帶了context-path訪問首頁時記得帶上項(xiàng)目前綴。這個小問題在部署時特別容易讓人摸不著頭腦明明啟動成功了卻白屏其實(shí)就是路徑不對。第三打包命令。在項(xiàng)目根目錄執(zhí)行mvn clean package -DskipTests會打出一個jar包。上傳到服務(wù)器后用java -jar命令啟動并配合nohup指令讓程序在后臺運(yùn)行。如果你只需要在本機(jī)演示那IDEA里直接運(yùn)行就行云服務(wù)器部署不是必須項(xiàng)別給自己增加工作量。4.3 部署文檔怎么寫才不會被追問項(xiàng)目附帶的部署文檔建議包含這幾部分環(huán)境需求列表JDK版本、Maven版本、MySQL版本、開發(fā)工具版本部署前準(zhǔn)備下載安裝、配置環(huán)境變量、創(chuàng)建數(shù)據(jù)庫初始化數(shù)據(jù)庫的詳細(xì)步驟啟動MySQL、打開Navicat、執(zhí)行sql文件修改配置說明說明每行配置的含義而不是只扔一段代碼讓人自己看啟動步驟與驗(yàn)證啟動成功的日志長什么樣子、訪問地址和初始賬號密碼以及常見問題啟動失敗、端口占用、數(shù)據(jù)庫連接失敗怎么排查。寫部署文檔時有一個原則讓一個從沒看過這個項(xiàng)目代碼的陌生人按著你的文檔能獨(dú)立跑起來。如果達(dá)不到這個標(biāo)準(zhǔn)說明文檔寫得不夠細(xì)致就拿去給學(xué)生用來說會出問題。按照這個標(biāo)準(zhǔn)來寫論文里“系統(tǒng)測試”這一章也有素材了。5. 論文撰寫與答辯準(zhǔn)備的實(shí)戰(zhàn)經(jīng)驗(yàn)5.1 論文結(jié)構(gòu)不要照搬模板但大綱必須按標(biāo)準(zhǔn)來寵物店管理系統(tǒng)的論文我建議的結(jié)構(gòu)為緒論部分占兩章左右——第一張是背景與意義第二張是相關(guān)技術(shù)介紹內(nèi)容包括SpringBoot的特點(diǎn)、MyBatis與MyBatis-Plus的關(guān)系、Bootstrap框架、MySQL數(shù)據(jù)庫。技術(shù)介紹千萬別寫成教科書式的堆砌詞條要結(jié)合本項(xiàng)目說“為什么選它”比如哪怕你只選了最有把握的Thymeleaf也可以說“因?yàn)樗cSpringBoot集成度高、模板布局方便、學(xué)習(xí)成本低”。第三到五章才是論文的核心需求分析部分要畫出角色分析圖列出功能需求和非功能需求系統(tǒng)設(shè)計(jì)部分要畫系統(tǒng)架構(gòu)圖、功能模塊圖、數(shù)據(jù)庫ER圖列出核心表的字段說明系統(tǒng)實(shí)現(xiàn)部分按“環(huán)境搭建、登錄模塊實(shí)現(xiàn)、客戶模塊實(shí)現(xiàn)、寵物模塊實(shí)現(xiàn)、訂單模塊實(shí)現(xiàn)、庫存模塊實(shí)現(xiàn)”的順序逐一展示頁面截圖和核心代碼片段。最后是系統(tǒng)測試部分至少要寫功能測試、性能測試和兼容性測試三個維度。功能測試用表格來展示測試編號、測試功能、操作步驟、預(yù)期結(jié)果、實(shí)際結(jié)果、結(jié)論。這是最沒有技術(shù)含量但又最容易被老師認(rèn)可的部分因?yàn)楸砀穹浅V庇^建議至少寫十到十五個功能點(diǎn)的用例。論文的參考文獻(xiàn)一定要真實(shí)去知網(wǎng)或萬方搜幾篇真實(shí)的論文引用不要造假。很多同學(xué)論文被查出來參考文獻(xiàn)都是虛構(gòu)的這屬于很嚴(yán)重的學(xué)術(shù)不端比代碼寫不出來嚴(yán)重得多。5.2 答辯前把這三個問題練熟基本就穩(wěn)了答辯老師不會細(xì)看你項(xiàng)目的每一行代碼但他們一定會圍繞下面這三類問題做文章。第一類為什么選擇SpringBoot說清楚SpringBoot相對于傳統(tǒng)SSM框架的優(yōu)勢核心就是自動配置、無需大量配置文件、內(nèi)嵌Tomcat服務(wù)器、java -jar一鍵啟動、與微服務(wù)生態(tài)兼容。這幾點(diǎn)背熟再結(jié)合項(xiàng)目說一遍老師就不會繼續(xù)深挖。第二類你的系統(tǒng)有哪些表表之間的關(guān)系是什么這是最致命的一類問題。如果你連自己系統(tǒng)的核心表名都說不全老師一定會質(zhì)疑是你自己做的還是買來的。解決辦法是答辯前把12張表的名字、每張表的核心字段、之間的關(guān)系在紙上默寫三遍練到肌肉記憶的程度。第三類項(xiàng)目有什么不足或可以改進(jìn)的地方這題看似送分實(shí)則是陷阱。不能說“沒問題”也不能說“問題很多”。穩(wěn)妥的答案是系統(tǒng)在并發(fā)性能上還有優(yōu)化空間比如我們可以引入Redis做熱點(diǎn)數(shù)據(jù)的緩存通過緩存來降低數(shù)據(jù)庫的壓力在部署方式上將來可以容器化部署。這個答案展現(xiàn)了你對常見技術(shù)方案的理解又不會把自己套住。還有一個細(xì)節(jié)提前準(zhǔn)備好一個“特殊賬號”比如管理員賬號確?,F(xiàn)場演示時能順暢進(jìn)入系統(tǒng)并預(yù)先準(zhǔn)備好足夠的演示數(shù)據(jù)。我見過太多人在答辯現(xiàn)場臨場添加數(shù)據(jù)然后失敗的情況了場面非常尷尬大家一定要記住演示預(yù)案比代碼本身更影響答辯結(jié)果。6. 常見坑位與問題排查手冊這個清單是給你們的“避雷指南”每一行都是我基于各種案例總結(jié)出來的經(jīng)驗(yàn)按著挨個排查能解決絕大多數(shù)問題。問題現(xiàn)象可能原因解決方案應(yīng)用啟動失敗提示端口被占用8080被其他進(jìn)程占用命令行執(zhí)行netstat -ano查看PID在任務(wù)管理器中結(jié)束進(jìn)程或修改application.yml中的端口數(shù)據(jù)庫連接失敗數(shù)據(jù)庫地址、賬號、密碼錯誤MySQL服務(wù)未啟動檢查application.yml確認(rèn)本地MySQL服務(wù)正常運(yùn)行SQL語句執(zhí)行報(bào)錯提示表不存在數(shù)據(jù)庫沒導(dǎo)入SQL文件或?qū)уe庫確認(rèn)在Navicat中執(zhí)行過完整的sql腳本并核對數(shù)據(jù)庫名與配置一致IDEA編譯報(bào)錯jar包無法下載Maven鏡像源問題在Maven的settings.xml中配置阿里云鏡像下載依賴速度直接起飛前端頁面樣式丟失Thymeleaf模板路徑配置錯誤檢查靜態(tài)資源目錄是否在src/main/resources/static下檢查頁面引入CSS/JS的路徑是否正確圖片上傳后訪問404沒有配置靜態(tài)資源映射按上文配置addResourceHandlers映射到本地磁盤目錄時間字段顯示相差8小時MySQL連接沒有指定時區(qū)JDBC URL加上serverTimezoneAsia/Shanghai修改代碼后頁面無變化未重啟應(yīng)用開發(fā)階段使用spring-boot-devtools實(shí)現(xiàn)熱部署部署階段需重新打包這里邊最常見的是MySQL時區(qū)問題。用MySQL8.0時連接串如果不加serverTimezone大概率會報(bào)錯或者時間錯亂。畢設(shè)管理系統(tǒng)雖然不追求高并發(fā)性能但在數(shù)據(jù)庫配置上必須嚴(yán)謹(jǐn)這是面試官很容易問到的細(xì)節(jié)。另外再補(bǔ)充一個問題很多同學(xué)用了MyBatis-Plus故意在論文里只寫MyBatis結(jié)果答辯老師問“你的BaseMapper是哪來的”就露餡了。如果是自己寫的項(xiàng)目用清清楚楚的技術(shù)棧并誠實(shí)說明沒有必要遮遮掩掩MyBatis-Plus作為MyBatis的增強(qiáng)工具本身也是一種值得寫進(jìn)技術(shù)棧的能力。這套系統(tǒng)最大的好處就是它是個完整閉環(huán)從用戶登錄到后臺操作到數(shù)據(jù)落庫到報(bào)表展示每一步都是標(biāo)準(zhǔn)的企業(yè)級開發(fā)流程。你在做它的過程中能順帶把Maven依賴管理、SpringBoot自動配置、MyBatis映射、Session會話處理、文件上傳、事務(wù)管理這些高頻面試考點(diǎn)全過一遍。說句實(shí)在話把它吃透了之后哪怕你現(xiàn)在還不會微服務(wù)去應(yīng)聘初級Java開發(fā)崗的底氣也會完全不一樣。最后再給你一個建議拿到任何源碼都不要只滿足于跑起來挑一個你最感興趣的模塊比如訂單生成邏輯把它里面的每一行代碼都讀懂然后試著自己閉卷重寫一遍。這是我從帶過這么多做項(xiàng)目的學(xué)生身上總結(jié)出的最有效的學(xué)習(xí)路徑比一口氣刷十套題目有用多了。