管理系統(tǒng)畢設(shè)實(shí)戰(zhàn):解壓部署與二次開發(fā)要點(diǎn))
簡介一份面向計(jì)算機(jī)專業(yè)畢業(yè)設(shè)計(jì)或課程設(shè)計(jì)的智慧社區(qū)管理系統(tǒng)完整項(xiàng)目覆蓋居民信息管理、物業(yè)繳費(fèi)、社區(qū)公告、報(bào)修服務(wù)、智能安防、活動策劃與報(bào)名等核心模塊并內(nèi)置管理員、居民等多角色權(quán)限管理適合用于系統(tǒng)開發(fā)實(shí)踐、論文支撐或二次功能擴(kuò)展。壓縮包共2000個文件以JavaScript前端邏輯、HTML頁面、PHP后端接口、CSS樣式為主輔以SQL數(shù)據(jù)庫腳本、圖片素材和Markdown說明文檔整體約25.55MB目錄結(jié)構(gòu)清晰便于按模塊檢索。目前已吸引135人學(xué)習(xí)下載可獲得完整的B/S架構(gòu)項(xiàng)目代碼、基于Bootstrap/Layui的前端布局、后端服務(wù)邏輯以及數(shù)據(jù)庫設(shè)計(jì)腳本能幫助快速理解智慧社區(qū)管理系統(tǒng)的業(yè)務(wù)流轉(zhuǎn)、模塊劃分與權(quán)限設(shè)計(jì)。同時系統(tǒng)預(yù)留了智能安防和物聯(lián)網(wǎng)接口方便在門禁管理、監(jiān)控集成等方向繼續(xù)深化減少從零搭建的重復(fù)工作。1. 拿到手的「畢設(shè)-小康之家-智慧社區(qū)管理系統(tǒng).zip」先別急著雙擊解壓很多同學(xué)從網(wǎng)盤、學(xué)長或淘寶手里拿到這個 zip 時狀態(tài)基本都是同一個文件名長長一串大小從幾百 MB 到 1 個多 GB 不等心里沒底。這套系統(tǒng)說白了就是一個典型的前后端分離 Web 項(xiàng)目核心是物業(yè)對小區(qū)的人、房、車、設(shè)備做管理業(yè)主端處理報(bào)修、繳費(fèi)、訪客預(yù)約管理后臺看數(shù)據(jù)。你把它理解成一個「以普通住宅小區(qū)為場景、以家庭住戶為主角」的信息管理系統(tǒng)就行畢設(shè)題目里掛的「小康之家」是情景設(shè)定不是讓你去解釋什么宏大概念。這類 zip 十有八九是 Spring Boot Vue MySQL 的組合有的帶微信小程序業(yè)主端有的只有網(wǎng)頁后臺。適合三類人急著交初稿的、想二次開發(fā)當(dāng)自己作品的、以及想搞明白一套管理系統(tǒng)到底怎么拼起來的。但解壓這一步就能篩掉一半的翻車事故——亂解壓、解壓到一半報(bào)錯、解壓完缺文件后面全是坑。2. 解壓后先別急著啟動花三分鐘判斷這套代碼值不值得跑2.1 用 zip 解壓并校驗(yàn)完整性別雙擊拖拽就完事拿到 zip 的第一步不是解壓是先校驗(yàn)。畢設(shè)源碼包經(jīng)常在網(wǎng)盤傳了好幾手文件被截?cái)嗍浅B(tài)。我習(xí)慣先跑一條測試命令確認(rèn)這個包沒壞cd ~/Downloads unzip -t 畢設(shè)-小康之家-智慧社區(qū)管理系統(tǒng).zipunzip -t只測試壓縮包的完整性不解壓全部內(nèi)容。如果輸出里有invalid zip archive: could not find EOCD或者unexpected end of file說明這個包在傳輸過程中被截?cái)嗔嘶蛘咚静皇菢?biāo)準(zhǔn) zip 格式有人拿 7z 改后綴名騙人。這時候硬解壓輕則缺文件重則整個目錄結(jié)構(gòu)都是亂的。確認(rèn)沒問題再正式解壓unzip -q 畢設(shè)-小康之家-智慧社區(qū)管理系統(tǒng).zip -d kangxie-community cd kangxie-community如果解壓時彈密碼框先去找賣家或?qū)W長要密碼別急著下什么「zip 密碼移除」工具——畢設(shè)源碼包通常是整包加密移除工具面對這種全量加密的文件頭幾乎無能為力浪費(fèi)時間。解壓完先看根目錄長什么樣find . -maxdepth 2 \( -iname *.sql -o -iname README* -o -iname pom.xml -o -iname package.json \) | sort這條命令能把最有價(jià)值的四個文件一口氣找出來。SQL 是數(shù)據(jù)庫腳本pom.xml 說明是 Maven 管理的 Java 后端package.json 說明有前端工程README 是作者留下的啟動說明。四樣里有三樣以上這套代碼大概率能跑。趁原始包還完整把它備份到另一個目錄別動它這是你的后悔藥。2.2 一眼識別技術(shù)棧Java 系和 PHP 系的啟動方式完全不同畢設(shè)管理系統(tǒng)最長見的組合是 Spring Boot Vue但你也會碰到 PHP 系、.NET 系甚至純 JSP 的。識別方法很簡單看根目錄里有什么特征文件技術(shù)棧特征文件啟動入口Spring Boot 后端pom.xml 或 build.gradle帶SpringBootApplication的 Java 類Vue 前端package.json、vite.config.jsnpm run devPHP 系ThinkPHP 的 think 文件、public/index.phpPHP 內(nèi)置服務(wù)器或 Apache微信小程序端project.config.json、app.json微信開發(fā)者工具導(dǎo)入拿到包后第一件事就找這幾個特征文件。如果是 Spring Boot Vue 的前后端分離結(jié)構(gòu)你會發(fā)現(xiàn)根目錄下至少有兩個文件夾一個放后端代碼一個放前端代碼比如server和web或者backend和frontend。這種結(jié)構(gòu)下后端和前端要分別啟動中間靠接口連起來。如果是 PHP 寫的老項(xiàng)目就別往 Spring Boot 上套了——看有沒有composer.json或者think命令入口PHP 項(xiàng)目的啟動邏輯完全不同硬按 Java 的流程走只會卡死。2.3 先看 SQL 腳本和 README比看代碼重要得多代碼寫得再好沒有數(shù)據(jù)庫腳本也跑不起來。SQL 文件一般放在根目錄的sql、database或db文件夾里也可能直接扔在根目錄。打開看一眼重點(diǎn)確認(rèn)三件事建庫語句用的是CREATE DATABASE還是直接在表名前寫庫名表名和字段名是不是統(tǒng)一帶了t_或tb_前綴有沒有插入初始化數(shù)據(jù)管理員賬號、樓棟信息、業(yè)主示例數(shù)據(jù)。很多畢設(shè)項(xiàng)目的 README 寫得很隨意但至少會告訴你數(shù)據(jù)庫名、賬號密碼、端口號。如果連 README 都沒有就去后端配置文件里找Spring Boot 項(xiàng)目的數(shù)據(jù)源配置一定在src/main/resources/application.yml或application.properties里。這一眼能看到數(shù)據(jù)庫名、賬號、密碼、端口是判斷「能不能跑」最關(guān)鍵的信息。2.4 三個信號說明這套代碼大概率不能直接跑第一找不到任何 SQL 文件只有代碼沒有數(shù)據(jù)你連管理員賬號都不知道基本白搭。第二后端沒有主啟動類src/main/java下面沒有帶SpringBootApplication的類這項(xiàng)目不是 Maven 標(biāo)準(zhǔn)結(jié)構(gòu)跑起來會很折騰。第三前端沒有package.json或node_modules連帶鎖文件都沒有說明前端要么是純靜態(tài)頁面、要么作者就沒打算讓你跑起來。碰到這三種情況別急著刪項(xiàng)目先花半天時間做一件事根據(jù)配置文件里的表名反推數(shù)據(jù)庫結(jié)構(gòu)手寫建表 SQL。畢設(shè)項(xiàng)目表不會太多社區(qū)類系統(tǒng)十來張表撐死了你照著實(shí)體類把表補(bǔ)出來反而比硬啃別人殘缺的 SQL 更深入。3. 本地跑通最小閉環(huán)從數(shù)據(jù)庫導(dǎo)入到瀏覽器出頁面3.1 環(huán)境準(zhǔn)備JDK8、MySQL 和 Node 怎么選版本畢設(shè)項(xiàng)目的技術(shù)棧普遍保守Spring Boot 版本大概率在 2.x 左右對應(yīng)的 JDK 用 8 或 11 最穩(wěn)。如果你不想裝安裝版下載 JDK8 的 zip 包解壓后配好JAVA_HOME和PATH也能正常用不需要額外權(quán)限。MySQL 同樣可以用 zip 免安裝版比安裝版更好控制版本。Node 版本不挑18 或 20 都可以跑 Vue 2/3 的項(xiàng)目。# 以 MySQL 8.0 zip 包為例解壓后先初始化數(shù)據(jù)目錄 mysqld --initialize-insecure --basedirD:/mysql-8.0 --datadirD:/mysql-8.0/data mysqld --console--initialize-insecure的意思是不設(shè) root 密碼本地開發(fā)直接用 root 空密碼連。如果你用的是 MySQL 5.7初始化參數(shù)一樣。跑起來之后用mysql -u root試試能不能進(jìn)能進(jìn)就說明數(shù)據(jù)庫沒問題。這一步很多人卡住是因?yàn)槌跏蓟瓴恢酪謩訂觤ysqld進(jìn)程以為裝完就能連。3.2 數(shù)據(jù)庫導(dǎo)入字符集和庫名先對齊拿到 SQL 腳本后先看清楚庫名是什么。很多畢設(shè)項(xiàng)目的建庫語句寫的是CREATE DATABASE kangxie_community你本地如果已經(jīng)有一個同名庫導(dǎo)入會報(bào)錯或者覆蓋。我的習(xí)慣是先手動建一個空庫再導(dǎo)入表結(jié)構(gòu)和數(shù)據(jù)mysql -u root -p -e CREATE DATABASE IF NOT EXISTS kangxie_community DEFAULT CHARSET utf8mb4; mysql -u root -p kangxie_community kangxie_community.sql第一個命令建庫指定utf8mb4字符集第二個命令把整個 SQL 腳本導(dǎo)進(jìn)去。導(dǎo)入過程如果報(bào)Unknown character set或一堆亂碼多半是 SQL 文件頭寫了 MySQL 不認(rèn)識的字符集名或者文件本身是 GBK 編碼。在 MySQL 8.0 里通常不用管但 5.7 會有問題。簡單處理方式是用文本編輯器把 SQL 另存為 UTF-8 無 BOM 格式再導(dǎo)入。導(dǎo)入完成后驗(yàn)證一下表和數(shù)據(jù)有沒有進(jìn)來USE kangxie_community; SHOW TABLES; SELECT * FROM sys_user LIMIT 5;能查到管理員賬號數(shù)據(jù)說明數(shù)據(jù)庫這關(guān)過了。查詢結(jié)果里如果中文顯示成?是客戶端字符集問題用SET NAMES utf8mb4;再查一次即可。3.3 后端啟動數(shù)據(jù)源配置改對再跑 Maven后端項(xiàng)目打開src/main/resources/application.yml核心配置就一塊spring: datasource: url: jdbc:mysql://127.0.0.1:3306/kangxie_community?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai username: root password: 123456 redis: host: 127.0.0.1 port: 6379 server: port: 8080URL 里的三個參數(shù)是血淚經(jīng)驗(yàn)useUnicodetrue和characterEncodingutf8保證中文不亂碼serverTimezoneAsia/Shanghai解決 MySQL 8.0 的時間差報(bào)錯。密碼改成你本地的實(shí)際密碼如果初始化時用的空密碼就把password那行留空或刪掉。很多畢設(shè)項(xiàng)目還引入了 Redis 做登錄驗(yàn)證碼緩存。如果你啟動后報(bào)Unable to connect to Redis要么去裝一個 Redis 并啟動要么直接在配置里把 Redis 相關(guān)的依賴和配置注釋掉。畢設(shè)答辯沒人會關(guān)心你有沒有用 Redis登錄邏輯改成數(shù)據(jù)庫校驗(yàn)同樣能跑。啟動命令常見有兩種# 方式一直接跑 mvn spring-boot:run # 方式二打包后再跑 mvn package -DskipTests java -jar target/kangxie-community-0.0.1-SNAPSHOT.jar第一種適合調(diào)試第二種適合確認(rèn)打包沒問題。啟動日志里看到Started Application in xx seconds就算成功。如果報(bào)Failed to configure a DataSource說明 yml 里的配置沒被讀到檢查配置文件名是不是application.yml不是application.yaml沒問題但不能兩個都放著還要確認(rèn)spring.datasource.url的鍵名拼寫。3.4 前端啟動npm 依賴裝完再配代理前端目錄找到package.json后先裝依賴再啟動cd frontend # 實(shí)際目錄名以解壓結(jié)果為準(zhǔn) npm install npm run devnpm install如果卡住或者報(bào)權(quán)限錯誤換成npm install --registryhttps://registry.npmmirror.com用鏡像源裝。裝完啟動后終端會打印一個本地訪問地址通常是http://localhost:5173。瀏覽器打開它如果頁面能出來但接口報(bào) 404問題幾乎一定在前端代理沒配。Vue 3 Vite 的代理在vite.config.js里長這樣server: { port: 5173, proxy: { /api: { target: http://127.0.0.1:8080, changeOrigin: true } } }意思是以/api開頭的請求全部轉(zhuǎn)發(fā)到8080端口的后端服務(wù)。改完代理一定要重啟npm run dev只刷新頁面不生效。3.5 用一條 curl 驗(yàn)證登錄閉環(huán)前后端都起來后別急著點(diǎn)頁面先用 curl 直接打后端接口能更快定位問題curl -X POST http://127.0.0.1:8080/api/login \ -H Content-Type: application/json \ -d {username:admin,password:123456}返回 JSON 里帶了 token 或者登錄成功標(biāo)記說明后端接口通。如果報(bào) 404去看看后端 Controller 的RequestMapping前綴是不是/api前端代理轉(zhuǎn)發(fā)路徑要和它完全一致。到這里數(shù)據(jù)庫、后端、前端三層已經(jīng)打通最小閉環(huán)成立。把當(dāng)前這套能跑的目錄整體打成 zip 備份一份后面改代碼心里不慌cd ~/workspace zip -r kangxie-community-running.zip kangxie-community -x */node_modules/* */target/*4. 把通用系統(tǒng)改成「小康之家」的樣子真正要動的四塊代碼4.1 先改全局站點(diǎn)信息和登錄頁這是最快能看到效果的地方拿到了能跑的系統(tǒng)現(xiàn)在要讓它看起來不像「別人的項(xiàng)目」。全局站點(diǎn)信息通常在三個位置前端index.html的title、前端布局組件里的頂部標(biāo)題欄、后端配置文件里的應(yīng)用名。以 Vue 項(xiàng)目為例!-- frontend/public/index.html -- title小康之家智慧社區(qū)管理系統(tǒng)/title登錄頁的文案、副標(biāo)題、版權(quán)信息在src/views/login.vue或類似文件里搜「智慧社區(qū)」「管理系統(tǒng)」就能找到。把這些固定文案改成「小康之家」的語境比如「歡迎登錄小康之家智慧社區(qū)管理平臺」十分鐘內(nèi)能看到質(zhì)變。同時把前端調(diào)用的后端接口前綴、后端返回的公告標(biāo)題、物業(yè)公司名稱等寫死在代碼里的字段統(tǒng)一替換一遍這個操作看著簡單卻能讓答辯老師第一眼覺得「這項(xiàng)目是定制的」。4.2 用小區(qū)情景初始化樓棟與業(yè)主數(shù)據(jù)別留著別人的示例數(shù)據(jù)答辯把 SQL 里的示例數(shù)據(jù)替換成小康之家小區(qū)自己的樓棟、住戶信息。常見畢設(shè)系統(tǒng)會有一張building或house表記錄樓棟號和房間號。刪掉原作者的「XX小區(qū)1棟」換成你自己的設(shè)定比如把小區(qū)起名「康馨苑」INSERT INTO building (name, address, create_time) VALUES (康馨苑 1棟, 1號樓 1單元, NOW()), (康馨苑 2棟, 2號樓 1單元, NOW()), (康馨苑 3棟, 3號樓 1單元, NOW());業(yè)主數(shù)據(jù)同理。注意不要只改幾條把樓棟、房間、業(yè)主、車輛、車位這些關(guān)聯(lián)數(shù)據(jù)統(tǒng)一改成一套邏輯自洽的場景。比如 1 棟 101 室的業(yè)主姓王他名下有一輛車和一個車位報(bào)修記錄里能看到他家報(bào)過兩次維修——答辯時老師隨機(jī)點(diǎn)開一個業(yè)主發(fā)現(xiàn)數(shù)據(jù)是有故事性的比看到死板的「張三、李四」強(qiáng)太多。4.3 把報(bào)修流程做出狀態(tài)閉環(huán)加一個「超時未處理」字段物業(yè)報(bào)修是智慧社區(qū)系統(tǒng)的核心業(yè)務(wù)很多畢設(shè)項(xiàng)目只有「提交報(bào)修」和「管理員列表」兩個頁面沒有狀態(tài)流轉(zhuǎn)。至少要把狀態(tài)機(jī)補(bǔ)齊待派單 → 處理中 → 已完成 → 已評價(jià)。如果數(shù)據(jù)庫里沒有狀態(tài)字段加一列ALTER TABLE repair_order ADD COLUMN repair_status TINYINT DEFAULT 0 COMMENT 0待派單 1處理中 2已完成 3已評價(jià), ADD COLUMN expect_finish_time DATETIME COMMENT 預(yù)計(jì)完成時間;后端在派單、接單、完成、評價(jià)四個接口里各自更新repair_status前端工單列表按狀態(tài)篩選用 Tab 切換。這套閉環(huán)做完答辯的「業(yè)務(wù)完整性」這項(xiàng)分基本穩(wěn)了。4.4 給首頁看板補(bǔ)兩個統(tǒng)計(jì)接口讓數(shù)據(jù)大屏有東西可看大部分畢設(shè)項(xiàng)目的首頁有個數(shù)據(jù)看板但統(tǒng)計(jì)口徑都很敷衍。你只要補(bǔ)兩個真正有意義的統(tǒng)計(jì)就能把這塊做厚。-- 各樓棟本月報(bào)修數(shù)量 TOP5按樓棟分組統(tǒng)計(jì)截止到當(dāng)月底的數(shù)據(jù) SELECT b.name AS building_name, COUNT(r.id) AS repair_count FROM repair_order r JOIN building b ON r.building_id b.id WHERE r.create_time DATE_FORMAT(CURDATE(), %Y-%m-01) AND r.create_time DATE_ADD(DATE_FORMAT(CURDATE(), %Y-%m-01), INTERVAL 1 MONTH) GROUP BY b.id ORDER BY repair_count DESC LIMIT 5;統(tǒng)計(jì)接口返回當(dāng)月報(bào)修趨勢按天分組、各樓棟報(bào)修排行、未處理工單數(shù)前端用 ECharts 渲染成柱狀圖和折線圖。注意接口返回的數(shù)據(jù)結(jié)構(gòu)要和圖表組件要求的格式對齊最常見的問題是后端返回{repairCount: 5}前端卻取data.repair_count字段沒對上圖表就是空的。5. 智慧社區(qū)畢設(shè)常見問題排查解壓、啟動、跨域、亂碼、連不上庫5.1 數(shù)據(jù)庫導(dǎo)入后中文全是亂碼頁面顯示「??」現(xiàn)象導(dǎo)入 SQL 后SELECT查出來中文顯示為??或者頁面顯示問號加方框。原因SQL 文件本身的編碼和數(shù)據(jù)庫連接字符集不一致通常發(fā)生在 SQL 文件是 GBK、而數(shù)據(jù)庫是 UTF-8 的情況下。解決用文本編輯器打開 SQL 文件另存為 UTF-8 無 BOM 格式刪除舊庫重建再導(dǎo)入導(dǎo)入前執(zhí)行SET NAMES utf8mb4;。5.2 前端頁面能打開但表格里沒有任何數(shù)據(jù)接口全部報(bào)錯現(xiàn)象前端跑起來了頁面也能顯示但所有請求都失敗Network 面板里請求狀態(tài)是 404 或 500。原因前端代理沒配或后端端口不一致請求根本沒打到后端。解決先確認(rèn)后端啟動日志能看到Tomcat started on port(s): 8080再檢查vite.config.js里代理的target端口是否和后端一致。改完代理重啟前端不要嫌麻煩這是跨域問題里最典型的坑??缬蛴袝r候看得很玄學(xué)實(shí)際就是端口、路徑、前綴三項(xiàng)沒對齊。5.3 微信小程序端調(diào)接口一直報(bào)「url not in domain list」現(xiàn)象zip 里帶小程序目錄時用微信開發(fā)者工具打開后調(diào)接口報(bào)域名不合法。原因微信平臺對request合法域名有白名單校驗(yàn)本地開發(fā)時http://127.0.0.1:8080不在白名單里。解決在開發(fā)者工具的「本地設(shè)置」里勾選「不校驗(yàn)合法域名、web-view業(yè)務(wù)域名、TLS 版本以及 HTTPS 證書」這是開發(fā)調(diào)試階段的正當(dāng)操作。注意生產(chǎn)環(huán)境必須配 HTTPS 域名但畢設(shè)答辯在演示模式下不校驗(yàn)域名是官方支持的能力不屬于違規(guī)操作。5.4 后端啟動報(bào)「Failed to configure a DataSource」或「Access denied for user」現(xiàn)象Maven 啟動秒失敗日志明確提示數(shù)據(jù)源配置有問題。原因application.yml里的數(shù)據(jù)庫賬號密碼和本地不一致或者spring.datasource.url里的庫名和實(shí)際庫名對不上。解決打開配置文件逐項(xiàng)核對 url、username、password 三個值密碼有特殊字符時用引號包起來。改了配置之后重啟后端不需要mvn clean但如果你發(fā)現(xiàn)改了配置不生效檢查是不是存在application-prod.yml之類的多環(huán)境配置覆蓋了主配置。5.5 解壓報(bào)「invalid zip archive: could not find EOCD」現(xiàn)象unzip -t直接報(bào)文件損壞或者解壓到一半停止。原因下載不完整或文件在網(wǎng)盤傳輸中被截?cái)嘁部赡芪募旧聿皇菢?biāo)準(zhǔn) zip。解決從源頭重新下載一次對比文件大小和來源標(biāo)記用 7-Zip 打開試試如果 7-Zip 也不認(rèn)基本可以確定壓縮包損壞。這個報(bào)錯在畢設(shè)群里隔三差五出現(xiàn)根源大多是手機(jī)網(wǎng)盤客戶端自動壓縮或轉(zhuǎn)存失敗別在損壞的包上浪費(fèi)時間直接換源重新拿。6. 再往前一步用 AOP 把操作日志做成答辯加分項(xiàng)系統(tǒng)能跑、業(yè)務(wù)閉環(huán)、數(shù)據(jù)有場景這套畢設(shè)已經(jīng)達(dá)到「良」的水平。想再往上走我建議加一個操作日志切面——不用改業(yè)務(wù)代碼只加一個切面類和一張表就能把「誰在什么時候做了什么操作」全部記錄下來。這屬于從「會調(diào)用」到「會設(shè)計(jì)」的分水嶺答辯時非常能講。后端加一張日志表字段保持精簡CREATE TABLE operation_log ( id BIGINT AUTO_INCREMENT PRIMARY KEY, operator VARCHAR(50) COMMENT 操作人, module_name VARCHAR(50) COMMENT 功能模塊, action_name VARCHAR(50) COMMENT 操作動作, method_name VARCHAR(200) COMMENT 請求方法, cost_ms INT COMMENT 耗時毫秒, create_time DATETIME COMMENT 操作時間 ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;然后定義一個注解用來標(biāo)記哪些方法需要記錄日志Target(ElementType.METHOD) Retention(RetentionPolicy.RUNTIME) public interface OperationLog { String module() default ; String action() default ; }核心是 AOP 切面。先用Around攔截帶注解的方法方法執(zhí)行完再記錄模塊名、操作人和耗時Aspect Component Slf4j public class OperationLogAspect { Around(annotation(com.kangxie.community.annotation.OperationLog)) public Object around(ProceedingJoinPoint point) throws Throwable { long start System.currentTimeMillis(); Object result point.proceed(); long cost System.currentTimeMillis() - start; MethodSignature signature (MethodSignature) point.getSignature(); OperationLog annotation signature.getMethod().getAnnotation(OperationLog.class); String username anonymous; // 從 Spring Security 上下文取當(dāng)前登錄用戶名如果項(xiàng)目沒接安全框架就跳過 // Authentication auth SecurityContextHolder.getContext().getAuthentication(); OperationLogEntity entity new OperationLogEntity(); entity.setOperator(username); entity.setModuleName(annotation.module()); entity.setActionName(annotation.action()); entity.setMethodName(signature.getMethod().getName()); entity.setCostMs(cost); entity.setCreateTime(LocalDateTime.now()); // 注入 Mapper 后執(zhí)行 insert // operationLogMapper.insert(entity); return result; } }這段代碼的關(guān)鍵在Around(annotation(...))它把攔截范圍限定在帶有自定義注解的方法上不會影響其他接口。point.proceed()是原方法本身記錄耗時時注意要在proceed()之后取差。實(shí)踐里我的習(xí)慣是優(yōu)先給 Delete 類和 Update 類操作加注解查詢操作不記避免日志表被刷爆。答辯時被問到「你這個系統(tǒng)有什么亮點(diǎn)」把這張表打開講清楚「管理員刪除業(yè)主時日志里記錄了操作人、操作模塊、耗時方便審計(jì)溯源」比講用了什么新技術(shù)更有說服力。我這些年經(jīng)手過的畢設(shè)項(xiàng)目凡是加了這套切面的答辯通過率沒有差的因?yàn)樗瑫r證明你理解了 AOP 機(jī)制、SpEL 表達(dá)式、數(shù)據(jù)庫設(shè)計(jì)三層能力。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取