畢設(shè)源碼分析與部署實(shí)戰(zhàn))
1. 項(xiàng)目定位與整體思路1.1 為什么裝飾工程管理系統(tǒng)適合當(dāng)畢設(shè)很多同學(xué)做Java Web畢設(shè)第一反應(yīng)是圖書館管理系統(tǒng)、學(xué)生信息管理這類老掉牙題目。不是說(shuō)不行而是答辯時(shí)老師聽(tīng)了一百遍很難挑出亮點(diǎn)。裝飾工程管理系統(tǒng)這個(gè)方向不一樣它自帶業(yè)務(wù)場(chǎng)景裝飾公司要接項(xiàng)目、管客戶、排工期、盯材料、算預(yù)算、做驗(yàn)收每一個(gè)環(huán)節(jié)都能對(duì)應(yīng)一張表、一個(gè)頁(yè)面、一組接口。這種“從業(yè)務(wù)里長(zhǎng)出來(lái)”的項(xiàng)目天然適配SpringBootVue的技術(shù)棧也更容易在答辯時(shí)講清楚“你做了什么、為什么這么做”。另外裝飾工程管理的表結(jié)構(gòu)不會(huì)像電商那么復(fù)雜沒(méi)有秒殺、沒(méi)有分布式訂單但又不是簡(jiǎn)單的單表CRUD。它踩在“恰到好處”的位置有用戶權(quán)限、有多表關(guān)聯(lián)、有狀態(tài)流轉(zhuǎn)、有統(tǒng)計(jì)匯總難度曲線對(duì)本科畢設(shè)非常友好。更重要的是這種項(xiàng)目通常配套的源碼、SQL腳本、接口文檔都比較完整所以你可以先跑通再讀懂最后改成自己的東西而不是從零開始硬憋。1.2 技術(shù)選型SpringBoot Vue 為什么是主流答案后端用SpringBoot幾乎不需要解釋。它內(nèi)置Tomcat簡(jiǎn)化了配置啟動(dòng)就是main方法配合Maven管理依賴天然適合獨(dú)立部署。而且SpringBoot的生態(tài)非常成熟接MySQL、接Redis、做權(quán)限攔截都是一套標(biāo)準(zhǔn)寫法網(wǎng)上資料多到看不完。前端選Vue核心原因是學(xué)習(xí)曲線比React平緩組件化思路又足夠支撐中型后臺(tái)管理系統(tǒng)。配合Element UI表格、表單、彈窗、分頁(yè)這些管理后臺(tái)的常見(jiàn)需求都有現(xiàn)成組件抄起來(lái)很快。前后端通過(guò)JSON交互SpringBoot提供RESTful接口Vue這邊用Axios發(fā)請(qǐng)求整個(gè)鏈路清晰答辯時(shí)也容易自圓其說(shuō)。這套組合最舒服的地方在于它同時(shí)覆蓋了Java Web開發(fā)中最重要的幾個(gè)點(diǎn)——后端框架、前端框架、數(shù)據(jù)庫(kù)設(shè)計(jì)、接口文檔、部署流程。一個(gè)項(xiàng)目做完相當(dāng)于把整個(gè)Web開發(fā)的閉環(huán)走了一遍這也是為什么它成了畢設(shè)項(xiàng)目的“版本答案”。1.3 功能模塊與業(yè)務(wù)流程拆解裝飾工程管理系統(tǒng)核心是“項(xiàng)目”這條線。我梳理一下常見(jiàn)的模塊劃分項(xiàng)目管理創(chuàng)建裝飾項(xiàng)目記錄項(xiàng)目名稱、客戶信息、施工地址、開工日期、預(yù)計(jì)完工日期、項(xiàng)目狀態(tài)待開工/施工中/已完工/已驗(yàn)收??蛻艄芾砭S護(hù)客戶姓名、電話、地址、需求備注客戶可以和項(xiàng)目一對(duì)一或一對(duì)多關(guān)聯(lián)。合同管理合同編號(hào)、合同金額、簽訂日期、付款節(jié)點(diǎn)記錄回款情況。材料管理材料名稱、規(guī)格、單位、供應(yīng)商、采購(gòu)價(jià)格以及項(xiàng)目用料清單。施工進(jìn)度管理按施工階段記錄進(jìn)度比如水電改造、泥瓦工程、木工、油漆、安裝每階段有完成百分比和備注。人員管理施工隊(duì)長(zhǎng)、工人信息以及項(xiàng)目上的人員安排。預(yù)算與結(jié)算可以簡(jiǎn)化為預(yù)算表記錄各項(xiàng)目的預(yù)算金額、實(shí)際花費(fèi)做一個(gè)簡(jiǎn)單的統(tǒng)計(jì)。從業(yè)務(wù)流程來(lái)看典型場(chǎng)景是銷售拿到客戶之后創(chuàng)建客戶信息再為客戶創(chuàng)建裝飾項(xiàng)目項(xiàng)目確定后簽訂合同關(guān)聯(lián)材料清單安排施工人員施工過(guò)程中更新進(jìn)度完工后做驗(yàn)收和結(jié)算。這個(gè)流程里的每一步都可以映射到后端接口和前端頁(yè)面模塊劃分清楚開發(fā)工作量也不會(huì)失控。2. 源碼結(jié)構(gòu)解析2.1 后端工程結(jié)構(gòu)與分層拿到源碼第一件事不是急著跑而是先看目錄結(jié)構(gòu)。一個(gè)規(guī)范的SpringBoot后端工程通常會(huì)這樣分包c(diǎn)om.example.decoration ├── controller ├── service │ ├── impl ├── mapper ├── entity ├── dto ├── config └── commoncontroller只負(fù)責(zé)接收參數(shù)、調(diào)用service、返回結(jié)果service層寫業(yè)務(wù)邏輯mapper層對(duì)接數(shù)據(jù)庫(kù)。entity對(duì)應(yīng)數(shù)據(jù)庫(kù)表dto用于接口入?yún)⒑头祷匕b。這種分層的價(jià)值是答辯時(shí)你只要說(shuō)一句“我按照MVC模式做了分層controller不寫業(yè)務(wù)邏輯”老師心里就會(huì)先給你加幾分。很多完整項(xiàng)目還會(huì)帶上common包里面放的是統(tǒng)一返回結(jié)果類比如ResultT、全局異常處理器、JWT工具類、常量類。統(tǒng)一返回結(jié)果非常重要前端不用每次判斷不同格式后端也方便統(tǒng)一處理成功、失敗、未登錄等狀態(tài)。常見(jiàn)格式是{ code: 200, message: 操作成功, data: {} }如果你拿到的源碼里沒(méi)有這個(gè)類自己補(bǔ)一個(gè)也不難而且補(bǔ)完之后項(xiàng)目會(huì)顯得更專業(yè)。2.2 前端工程結(jié)構(gòu)與頁(yè)面組織Vue工程一般是用Vue CLI或Vite創(chuàng)建的目錄結(jié)構(gòu)大概是這樣src ├── api // 接口請(qǐng)求封裝 ├── assets // 靜態(tài)資源 ├── components // 公共組件 ├── router // 路由配置 ├── store // 全局狀態(tài)管理 ├── views // 頁(yè)面 ├── App.vue └── main.js其中api目錄按模塊拆文件比如project.js、customer.js、user.js每個(gè)文件導(dǎo)出對(duì)應(yīng)的請(qǐng)求方法頁(yè)面里直接調(diào)用。這樣做的好處是后端接口地址全部集中管理以后改接口路徑只需要?jiǎng)右粋€(gè)文件。路由配置里要注意權(quán)限控制通常用meta字段標(biāo)記是否需要登錄再用路由守衛(wèi)做攔截。頁(yè)面組織上后臺(tái)管理系統(tǒng)常見(jiàn)的布局是左側(cè)菜單、右側(cè)內(nèi)容區(qū)。裝飾工程管理系統(tǒng)的頁(yè)面一般包括登錄頁(yè)、首頁(yè)儀表盤、項(xiàng)目管理列表、項(xiàng)目詳情包含進(jìn)度、材料、合同等子頁(yè)面、客戶管理、材料管理、合同管理、人員管理、統(tǒng)計(jì)分析。如果你拿到的源碼里登錄頁(yè)之后直接是主布局說(shuō)明路由做了嵌套這部分在答辯時(shí)也是可以聊一聊的亮點(diǎn)。2.3 核心實(shí)體與表關(guān)系設(shè)計(jì)數(shù)據(jù)庫(kù)設(shè)計(jì)是畢設(shè)答辯的必問(wèn)點(diǎn)所以我建議你把表關(guān)系徹底吃透。裝飾工程管理系統(tǒng)里最核心的表關(guān)系是user用戶表存儲(chǔ)管理員、員工賬號(hào)字段包括id、username、password、real_name、role。customer客戶表id、name、phone、address、remark。project項(xiàng)目表id、project_name、customer_id、status、start_date、end_date、budget、actual_cost、create_time。這里的customer_id外鍵關(guān)聯(lián)客戶表一個(gè)客戶可以有多個(gè)項(xiàng)目。contract合同表id、contract_no、project_id、amount、sign_date、pay_status。material材料表id、material_name、spec、unit、price、supplier。project_material項(xiàng)目材料關(guān)聯(lián)表id、project_id、material_id、quantity、total_price。progress進(jìn)度表id、project_id、stage_name、percent、record_date、remark。employee員工表id、name、position、phone。這些表不是孤立的而是通過(guò)外鍵或中間表互相連接。答辯時(shí)如果老師問(wèn)“為什么加一張中間表”你可以回答項(xiàng)目與材料是多對(duì)多關(guān)系一張項(xiàng)目材料關(guān)聯(lián)表可以把每次采購(gòu)數(shù)量、單價(jià)都記錄在案方便后續(xù)統(tǒng)計(jì)項(xiàng)目成本。這一句話就能體現(xiàn)出你對(duì)關(guān)系型數(shù)據(jù)庫(kù)的理解。3. SQL腳本與數(shù)據(jù)庫(kù)初始化3.1 SQL腳本包含哪些內(nèi)容完整項(xiàng)目里的SQL腳本通常不是只有建表語(yǔ)句一般包括三部分建庫(kù)建表語(yǔ)句CREATE DATABASECREATE TABLE含字段類型、主鍵、索引、外鍵。初始數(shù)據(jù)管理員賬號(hào)、默認(rèn)密碼、測(cè)試用的客戶和項(xiàng)目數(shù)據(jù)??蛇x視圖或存儲(chǔ)過(guò)程有些項(xiàng)目會(huì)寫統(tǒng)計(jì)用的視圖比如按月統(tǒng)計(jì)合同金額。拿到SQL腳本后建議從第一行看到最后一行不要直接全部執(zhí)行就完事。重點(diǎn)看三處字符集是否統(tǒng)一、外鍵約束是否存在、初始數(shù)據(jù)的密碼是不是密文。很多學(xué)生項(xiàng)目為了省事密碼直接明文存儲(chǔ)答辯時(shí)老師一問(wèn)就露怯。穩(wěn)妥的做法是如果源碼里沒(méi)有加密邏輯你自己加一個(gè)MD5或BCrypt處理哪怕麻煩一點(diǎn)至少架構(gòu)上是合理的。3.2 執(zhí)行SQL腳本的兩種方式第一種方式是通過(guò)Navicat或DataGrip等圖形化工具打開SQL文件直接運(yùn)行。操作很簡(jiǎn)單但要注意提前選擇好目標(biāo)數(shù)據(jù)庫(kù)否則表可能建到默認(rèn)庫(kù)里面連接時(shí)找不到表。第二種方式是命令行執(zhí)行。在MySQL命令行下用source命令適合服務(wù)器上部署或者沒(méi)有圖形化工具的場(chǎng)景mysql -uroot -p source /path/to/decoration.sql;無(wú)論哪種方式跑完腳本之后一定要驗(yàn)證一下USE數(shù)據(jù)庫(kù)名然后SHOW TABLES;看看表數(shù)量是否和預(yù)期一致。如果腳本里有初始數(shù)據(jù)再SELECT幾條數(shù)據(jù)確認(rèn)沒(méi)亂碼。排查數(shù)據(jù)庫(kù)連接問(wèn)題是很多人卡住的第一關(guān)。常見(jiàn)的報(bào)錯(cuò)“Access denied for user”要么是賬號(hào)密碼不對(duì)要么是權(quán)限不足。還有一種情況是MySQL版本太高密碼加密方式不兼容連接字符串里需要加allowPublicKeyRetrievaltrueuseSSLfalse。這類細(xì)節(jié)跑項(xiàng)目的時(shí)候會(huì)反復(fù)踩提前知道能省很多時(shí)間。3.3 測(cè)試數(shù)據(jù)的設(shè)計(jì)邏輯好的SQL腳本會(huì)準(zhǔn)備一批能直接演示的測(cè)試數(shù)據(jù)而不是空表。比如一個(gè)待施工項(xiàng)目、兩個(gè)施工中項(xiàng)目、一個(gè)已完工項(xiàng)目客戶和合同都對(duì)應(yīng)齊全驗(yàn)收時(shí)一登錄就能看到列表有數(shù)據(jù)圖表有統(tǒng)計(jì)。要是表里全空前端頁(yè)面再好看展示效果也大打折扣。我在實(shí)際用這種畢設(shè)源碼時(shí)會(huì)習(xí)慣再往測(cè)試數(shù)據(jù)里加幾條“邊界數(shù)據(jù)”比如一個(gè)金額特別大的合同、一個(gè)進(jìn)度為100%但狀態(tài)還沒(méi)更新的項(xiàng)目目的就是測(cè)試頁(yè)面的狀態(tài)展示和列表篩選是否健壯。這個(gè)習(xí)慣你可以保留寫進(jìn)論文的測(cè)試章節(jié)也是一個(gè)加分點(diǎn)。4. 接口文檔與核心接口實(shí)現(xiàn)4.1 接口設(shè)計(jì)規(guī)范接口文檔是這類完整項(xiàng)目的重要加分項(xiàng)它通常以Markdown或Swagger形式提供。接口設(shè)計(jì)有一個(gè)基本原則RESTful風(fēng)格資源用名詞動(dòng)作交給HTTP方法。比如GET /api/project查詢項(xiàng)目列表POST /api/project新增項(xiàng)目PUT /api/project/{id}修改項(xiàng)目DELETE /api/project/{id}刪除項(xiàng)目接口返回格式統(tǒng)一使用ResultT包裝業(yè)務(wù)狀態(tài)碼區(qū)分自己定義。比如200代表成功400參數(shù)錯(cuò)誤401未認(rèn)證500服務(wù)器異常。前端Axios攔截器里統(tǒng)一處理這些狀態(tài)碼彈錯(cuò)誤提示而不是每個(gè)頁(yè)面重復(fù)寫異常處理邏輯。接口路徑前綴不要省略版本號(hào)至少用/api/開頭后面再接模塊名。這樣以后做權(quán)限攔截直接攔截/api/**即可。4.2 典型接口實(shí)例登錄與鑒權(quán)登錄接口是所有系統(tǒng)都繞不開的。裝飾工程管理系統(tǒng)的登錄流程一般是前端把用戶名和密碼傳給POST /api/login后端校驗(yàn)后返回一個(gè)令牌通常是JWT前端把令牌存到localStorage里后續(xù)請(qǐng)求在請(qǐng)求頭帶Authorization: Bearer token后端通過(guò)攔截器統(tǒng)一驗(yàn)證。在源碼里你大概率會(huì)看到類似這樣的一段代碼PostMapping(/login) public Result login(RequestBody LoginDTO dto) { User user userService.login(dto.getUsername(), dto.getPassword()); String token JwtUtil.generateToken(user.getId(), user.getRole()); return Result.success(Map.of(token, token, user, user)); }JWT這個(gè)點(diǎn)在答辯時(shí)非常值得重點(diǎn)講。你可以說(shuō)“Session方案需要服務(wù)端存儲(chǔ)會(huì)話JWT是無(wú)狀態(tài)的更適合前后端分離項(xiàng)目”這一句話就足夠顯示出你懂技術(shù)選型。但也要注意純粹的無(wú)狀態(tài)JWT存在無(wú)法主動(dòng)過(guò)期的問(wèn)題如果你在攔截器里做了一層用戶狀態(tài)校驗(yàn)或者在Redis里維護(hù)黑名單那就是實(shí)打?qū)嵉募臃猪?xiàng)。4.3 前后端聯(lián)調(diào)Axios封裝與跨域處理前端拿到的接口文檔最終要落實(shí)到Axios請(qǐng)求封裝上。規(guī)范的Vue項(xiàng)目里api文件夾下通常會(huì)封裝一個(gè)request.js統(tǒng)一配置baseURL、超時(shí)時(shí)間、請(qǐng)求攔截器和響應(yīng)攔截器。import axios from axios const request axios.create({ baseURL: /api, timeout: 10000 }) request.interceptors.request.use(config { const token localStorage.getItem(token) if (token) { config.headers.Authorization Bearer token } return config }) request.interceptors.response.use(response { return response.data }, error { // 統(tǒng)一處理401跳登錄、500彈提示等 })這樣封裝完之后業(yè)務(wù)頁(yè)面里只需寫list() { return request.get(/project) }就行了。不過(guò)很多新手在聯(lián)調(diào)時(shí)都會(huì)卡在同一處跨域。原因是前端的開發(fā)服務(wù)器跑在8080端口后端跑在8081端口瀏覽器會(huì)攔截跨域請(qǐng)求。解決跨域有幾套方案。最省事的是在SpringBoot里加一個(gè)WebMvcConfigurer配置允許的源、方法、請(qǐng)求頭Configuration public class CorsConfig implements WebMvcConfigurer { Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping(/**) .allowedOrigins(http://localhost:8080) .allowedMethods(*) .allowedHeaders(*) .allowCredentials(true); } }還可以利用Vue CLI的代理在vue.config.js里配置devServer.proxy把/api代理到后端地址。兩種方案各有優(yōu)缺點(diǎn)我建議把CORS后端配置和前端代理都了解一遍答辯時(shí)老師隨便問(wèn)哪邊都能接得上。5. 從源碼到可運(yùn)行完整部署步驟5.1 環(huán)境準(zhǔn)備跑通這個(gè)項(xiàng)目需要本地安裝這些環(huán)境JDK 1.8或更高版本有些源碼在JDK17下會(huì)報(bào)錯(cuò)建議先用1.8跑穩(wěn)定第一Maven 3.6后端依賴管理MySQL 5.7或8.0注意字符集和大小寫配置Node.js 14和npm前端構(gòu)建IDE后端用IntelliJ IDEA前端可以用VS Code或IDEA均可很多同學(xué)卡在環(huán)境版本上。比如系統(tǒng)裝了JDK17而SpringBoot版本是2.3.x可能會(huì)出現(xiàn)IllegalArgumentException之類的兼容問(wèn)題。我個(gè)人的經(jīng)驗(yàn)是畢設(shè)項(xiàng)目不追求新版本穩(wěn)定跑通比版本新鮮更重要??梢栽贗DE里多裝幾個(gè)JDK版本按項(xiàng)目需求切換。5.2 導(dǎo)入項(xiàng)目與配置修改后端導(dǎo)入時(shí)用IDEA直接打開backend目錄或者項(xiàng)目根目錄等待Maven下載依賴。如果下載速度慢可以換阿里云鏡像在settings.xml里配置mirror。依賴下載完成后修改application.yml里的數(shù)據(jù)庫(kù)連接信息spring: datasource: url: jdbc:mysql://localhost:3306/decoration?useSSLfalseserverTimezoneAsia/ShanghaicharacterEncodingutf8 username: root password: 123456注意serverTimezone不要漏掉很多時(shí)區(qū)報(bào)錯(cuò)都是因?yàn)檫@個(gè)參數(shù)。然后修改端口如果你不想用默認(rèn)的8080可以在server.port改成8081。前端導(dǎo)入相對(duì)簡(jiǎn)單打開終端進(jìn)入frontend目錄執(zhí)行npm install如果npm install報(bào)錯(cuò)八成是依賴版本沖突。可以先刪掉package-lock.json和node_modules再重新安裝?;蛘哂脃arn代替npm很多時(shí)候能避坑。5.3 啟動(dòng)后端與前端完成本地調(diào)試后端啟動(dòng)很簡(jiǎn)單直接運(yùn)行主類上的main方法??吹絊pringBoot的啟動(dòng)日志里出現(xiàn)Tomcat started on port(s): 8081就說(shuō)明后端起來(lái)了。前端啟動(dòng)前確認(rèn)vue.config.js里代理配置正確然后執(zhí)行npm run serve看到App running at: http://localhost:8080打開瀏覽器訪問(wèn)就能看到登錄頁(yè)。我這兩次啟動(dòng)通常都會(huì)遇到一個(gè)經(jīng)典問(wèn)題前端登錄后請(qǐng)求接口報(bào)401或404。401是攔截器校驗(yàn)失敗檢查token是否傳到后端404是路徑不對(duì)檢查baseURL和application.yml里的context-path有沒(méi)有拼對(duì)。還有一種更隱蔽的情況是vue打包放進(jìn)springboot中——如果源碼里前端構(gòu)建產(chǎn)物被放進(jìn)后端static目錄那么只啟動(dòng)后端就能訪問(wèn)頁(yè)面但此時(shí)前端請(qǐng)求接口的路徑要變成相對(duì)路徑不能再用/api這種前綴這一點(diǎn)要特別留意。6. 畢設(shè)答辯亮點(diǎn)與常見(jiàn)問(wèn)題避坑6.1 如何給答辯老師講解這個(gè)項(xiàng)目項(xiàng)目能跑起來(lái)只是第一步答辯時(shí)的表達(dá)往往決定最終成績(jī)。我建議你按這個(gè)順序講先講項(xiàng)目背景裝飾公司日常管理需要一套系統(tǒng)來(lái)跟蹤客戶、項(xiàng)目、合同、材料和進(jìn)度。再講技術(shù)架構(gòu)后端SpringBoot分層、前端Vue組件化、數(shù)據(jù)庫(kù)MySQL整個(gè)系統(tǒng)是前后端分離架構(gòu)。接著講一個(gè)完整業(yè)務(wù)鏈路從新建客戶、創(chuàng)建項(xiàng)目、維護(hù)合同、分配材料、更新進(jìn)度到項(xiàng)目驗(yàn)收串起來(lái)演示一遍。最后講難點(diǎn)和解決方案比如多表關(guān)聯(lián)查詢、權(quán)限控制、狀態(tài)流轉(zhuǎn)、統(tǒng)計(jì)報(bào)表的實(shí)現(xiàn)思路。講的時(shí)候不要背課文要像在給人介紹自己做的產(chǎn)品一樣。老師問(wèn)到細(xì)節(jié)哪怕答不上來(lái)也要說(shuō)“這部分我是參考了xxx目前的理解還不夠深”態(tài)度比硬編要強(qiáng)得多。6.2 高頻問(wèn)題與排查技巧我把實(shí)際運(yùn)行這類項(xiàng)目時(shí)見(jiàn)過(guò)的高頻問(wèn)題整理成了一張表遇到問(wèn)題先對(duì)號(hào)入座不要瞎猜。問(wèn)題現(xiàn)象可能原因解決方案啟動(dòng)報(bào)Unable to open JDBC Connection數(shù)據(jù)庫(kù)沒(méi)啟動(dòng) / 地址密碼錯(cuò)誤檢查MySQL服務(wù)和application.yml配置啟動(dòng)報(bào)Port 8080 was already in use端口被占用殺掉占用進(jìn)程或改后端server.port前端登錄后一直轉(zhuǎn)圈瀏覽器F12看到ERR_CONNECTION_REFUSED后端沒(méi)啟動(dòng)或代理失效先確認(rèn)后端能訪問(wèn)接口地址再檢查代理配置請(qǐng)求返回413 Request Entity Too LargeNginx或Tomcat上傳限制修改max-file-size配置前端頁(yè)面白屏控制臺(tái)報(bào)Cannot read properties of null接口數(shù)據(jù)字段對(duì)不上對(duì)照接口文檔檢查字段名特別是userName和username這類大小寫差異Maven依賴下載慢或失敗默認(rèn)中央倉(cāng)庫(kù)不穩(wěn)換成阿里云鏡像數(shù)據(jù)庫(kù)中文亂碼連接URL沒(méi)指定characterEncoding在JDBC URL中加characterEncodingutf8這些坑看起來(lái)每個(gè)都很小但在畢設(shè)沖刺階段任何一個(gè)都可能導(dǎo)致半天時(shí)間浪費(fèi)掉。我建議你在答辯前至少完整執(zhí)行三遍“從零到能跑”的過(guò)程把每一步記成筆記。6.3 常見(jiàn)避坑心得如何把源碼變成自己的很多同學(xué)拿到完整項(xiàng)目后喜歡直接改個(gè)標(biāo)題和作者就交上去這是最危險(xiǎn)的做法。且不說(shuō)查重和學(xué)術(shù)誠(chéng)信的問(wèn)題單是答辯環(huán)節(jié)老師隨便問(wèn)一個(gè)模塊的實(shí)現(xiàn)細(xì)節(jié)你支支吾吾答不上來(lái)現(xiàn)場(chǎng)就會(huì)非常尷尬。我的建議是拿到源碼后先做這幾件事把項(xiàng)目跑起來(lái)全面操作一遍記錄每個(gè)頁(yè)面、每個(gè)按鈕對(duì)應(yīng)的數(shù)據(jù)和邏輯。找一個(gè)核心模塊重構(gòu)它的部分代碼。比如把原本寫在controller里的業(yè)務(wù)邏輯拆到service層或者把原來(lái)的SQL查詢改成MyBatis-Plus的LambdaQueryWrapper。自己新增一個(gè)小功能比如項(xiàng)目列表的價(jià)格篩選、進(jìn)度看板的月度統(tǒng)計(jì)哪怕功能很小也能證明你有獨(dú)立開發(fā)能力。重新畫一遍數(shù)據(jù)庫(kù)ER圖和業(yè)務(wù)流程圖放進(jìn)論文做到心里有數(shù)。最后再替換項(xiàng)目名稱、LOGO、管理員賬號(hào)這些表面信息保證系統(tǒng)和文檔一致。這些工作做完之后你在答辯會(huì)上就會(huì)非常硬氣因?yàn)轫?xiàng)目里每個(gè)細(xì)節(jié)你都有印象遇到追問(wèn)也答得出來(lái)。6.4 擴(kuò)展方向讓你的項(xiàng)目從70分到90分如果你時(shí)間充裕可以在基礎(chǔ)版本上選一兩個(gè)方向做增強(qiáng)統(tǒng)計(jì)可視化用Chart.js或ECharts把合同金額、材料成本、項(xiàng)目狀態(tài)分布做成圖表放在首頁(yè)儀表盤。文件上傳增加合同附件上傳功能用本地存儲(chǔ)或Oss存儲(chǔ)前端用Element UI的上傳組件。通知提醒項(xiàng)目進(jìn)度超過(guò)約定時(shí)間自動(dòng)提醒可以用SpringBoot整合定時(shí)任務(wù)定時(shí)掃描項(xiàng)目表。權(quán)限細(xì)化目前多半只有管理員和普通員工可以擴(kuò)展角色菜單分配做成RBAC模型。這些擴(kuò)展不需要把項(xiàng)目推到重來(lái)都是在現(xiàn)有結(jié)構(gòu)上做加法。只要完成一個(gè)你的畢設(shè)就有明顯的個(gè)人痕跡答辯時(shí)也更敢說(shuō)“這部分是我自己加的”。我個(gè)人在實(shí)際操作中的體會(huì)是這類SpringBootVue的完整項(xiàng)目最重要的價(jià)值不是直接交付而是作為一塊“跳板”。你把別人的代碼吃透、改掉其中的問(wèn)題、加上自己的設(shè)計(jì)這個(gè)過(guò)程本身就是Java Web學(xué)習(xí)里最有收獲的一段路。跑通只是開始真正消化掉才能讓你在答辯臺(tái)上站得穩(wěn)。