畢業(yè)設計:核心模塊與避坑指南)
每年到這個時間點都會有大量計算機專業(yè)的同學開始頭疼畢業(yè)設計選什么題目。在Java Web這個方向里停車場管理系統(tǒng)幾乎可以算是經(jīng)久不衰的經(jīng)典選題但正因為做的人多想做出差異化反而更難。如果你手里現(xiàn)在拿到的標題是“基于SpringBoot框架的智能車庫運營平臺”或者“智慧停車服務系統(tǒng)”那恭喜你選對方向了——這個題目工作量適中、技術棧主流、演示效果直觀而且只要把幾個核心模塊做扎實答辯時完全有東西可講。這篇文章我不會跟你扯那些華而不實的概念直接從實際開發(fā)的角度拆解這個項目核心功能怎么設計、數(shù)據(jù)庫表怎么建、計費流程怎么實現(xiàn)、哪些地方容易踩坑、答辯時老師最愛問什么。無論你是打算自己從零寫還是參考別人的項目改造這篇內容都能讓你少走不少彎路。1. 項目整體拆解停車場管理系統(tǒng)到底在解決什么問題1.1 核心需求解析先想明白一件事停車場管理系統(tǒng)本質上是干什么的說得直白一點它就是把“車輛進入停車場、找到車位停好、離開時計算費用并繳費”這一系列線下行為搬到線上進行信息化管理。但如果你只做到這個程度那這個項目就太單薄了撐不起“智能車庫運營平臺”這個title。一個能拿得出手的停車場管理系統(tǒng)至少要覆蓋三個角色的訴求車主端查詢剩余車位、快速入場、自助繳費、查看停車記錄?,F(xiàn)實中很多停車場已經(jīng)做到車牌識別自動抬桿但作為畢業(yè)設計你可以用“手動錄入車牌系統(tǒng)分配車位”的方式模擬這個過程。管理員端車位實時監(jiān)控、入場/出場登記、收費規(guī)則配置、訂單管理、異常處理比如某個車位被占用但系統(tǒng)沒記錄。這部分是整個系統(tǒng)的管理核心也是你展示CRUD功底的舞臺。系統(tǒng)層面計費規(guī)則要靈活可配按時長、按次數(shù)、免費時段、封頂價格、數(shù)據(jù)要可視化今日車流量、當前占用率、營收統(tǒng)計、操作要有日志記錄。別小看這個需求拆解很多同學上來就建表寫代碼做到一半才發(fā)現(xiàn)字段不夠用、流程對不上返工成本極高。我的建議是動工之前先把這三個角色的核心操作畫成流程圖哪怕是用紙筆草草畫一下都能幫你避開大量邏輯漏洞。1.2 為什么選SpringBoot而不是其他框架這個題目用SpringBoot幾乎是標準答案但你得知道為什么答辯時老師一定會問。SpringBoot的核心價值在于“約定大于配置”——傳統(tǒng)的SSH或SSM框架光配置文件就要寫一大堆SpringBoot把大部分自動配置都封裝好了讓你把精力集中在業(yè)務代碼上。對比其他方案也很直觀如果只用Servlet/JSP開發(fā)效率太低而且代碼耦合嚴重難以體現(xiàn)分層思想如果選Python的Django/Flask雖然開發(fā)快但作為一個計算機專業(yè)的畢業(yè)設計Java技術棧在展現(xiàn)“工程化能力”方面更占優(yōu)勢SpringCloud那套微服務架構對這個規(guī)模的系統(tǒng)又屬于殺雞用牛刀徒增復雜度。SpringBoot恰好處于“夠用且主流”的甜蜜點上手門檻不高、社區(qū)資料豐富這意味著你遇到問題幾乎都能搜到答案、企業(yè)實際需求量大現(xiàn)在很多中小公司的后臺系統(tǒng)就是SpringBootMyBatis這套組合拳。一句話總結選SpringBoot不是因為它最先進而是因為它最適合這個體量的項目而且最能體現(xiàn)你的工程素養(yǎng)。2. 技術架構與核心設計思路2.1 分層架構與技術棧選型系統(tǒng)整體采用經(jīng)典的前后端分離架構技術棧如下后端Spring Boot 2.7.x MyBatis-Plus MySQL 8.0 Redis可選 Sa-Token或JWT做登錄鑒權前端Vue 3 Element-Plus Axios管理端后臺如果你不熟悉前端開發(fā)也可以直接用Thymeleaf模板引擎做服務端渲染工作量更少但視覺上會樸素一些工具Maven管理依賴、Git做版本控制、Postman測接口或者用Apifox國產(chǎn)工具更順手說到技術選型我得專門聊兩句MyBatis-Plus。很多教材還在教MyBatis寫XML映射文件但實際開發(fā)中MyBatis-Plus的單表CRUD幾乎不需要寫SQL——它內置了通用Mapper你只需要定義實體類基礎的增刪改查方法直接用就行。復雜查詢比如多表關聯(lián)統(tǒng)計再手寫SQL這樣開發(fā)效率提升非常明顯。答辯時老師如果問“MyBatis和MyBatis-Plus的區(qū)別”你要能說出這一點MyBatis-Plus是MyBatis的增強工具只做增強不做改變核心賣點是通用Mapper和條件構造器。數(shù)據(jù)庫用MySQL 8.0沒什么好說的存儲引擎務必選InnoDB支持事務和外鍵約束。這里有個細節(jié)要注意數(shù)據(jù)庫連接串記得加上serverTimezoneAsia/Shanghai參數(shù)否則日期時間字段會出現(xiàn)時區(qū)偏差問題我見過太多人在這個細節(jié)上翻車。2.2 核心模塊劃分整個系統(tǒng)按功能邊界拆成六個核心模塊每個模塊各司其職系統(tǒng)管理模塊管理員賬號管理、角色權限控制、操作日志。這是所有后臺系統(tǒng)的底座沒有它其他模塊就是裸奔。車位管理模塊車位信息的增刪改查、車位狀態(tài)管理空閑/占用/鎖定、車位的區(qū)域劃分比如A區(qū)、B區(qū)。這部分是停車場的基礎數(shù)據(jù)維護。車輛管理模塊車輛入場登記車牌號、入場時間、分配車位、車輛出場結算計算費用、生成訂單、釋放車位、長期車輛管理月卡/年卡用戶。收費規(guī)則模塊這是整個項目的核心亮點。你可以實現(xiàn)按時長計費首小時X元、后續(xù)每小時Y元、封頂Z元、按次計費、夜間免費時段、節(jié)假日折扣等多種策略。把這個模塊做成可配置的而不是寫死在代碼里就是加分項。統(tǒng)計報表模塊今日營收、車流量走勢、車位利用率、收入來源分析臨時車VS月卡車。你可以用ECharts在管理端畫幾個圖表演示效果直接拉滿。大屏展示模塊如果說統(tǒng)計報表是給管理員看的大屏就是給評委和參觀者看的。一塊展示實時車位占用情況、今日車流、營收數(shù)據(jù)的可視化看板演示效果非常加分。2.3 數(shù)據(jù)庫設計七張核心表的結構與關聯(lián)數(shù)據(jù)庫設計是畢業(yè)設計的重頭戲也是答辯時老師必看的部分。表結構設計得好不好直接決定了后面代碼好不好寫。我按實際開發(fā)經(jīng)驗整理出下面這套經(jīng)過驗證的表結構方案用戶表sys_user字段id、username、passwordBCrypt加密存儲、real_name、roleadmin/operator/super_admin、status、create_time說明用戶表就是管理員表別跟車主表混在一起。車主信息直接用車輛表關聯(lián)即可不需要單獨建用戶表不然邏輯會繞。車輛信息表car_info字段id、plate_number車牌號建唯一索引、owner_name、owner_phone、car_type臨時車/月卡車/免費車、monthly_card_expire月卡到期時間、create_time說明這張表是整個系統(tǒng)的關鍵線索。車牌號唯一索引是必須的因為入場出場都是靠車牌號來識別車輛身份。車位信息表parking_space字段id、space_no車位編號、space_area所屬區(qū)域、space_type普通車位/新能源車位/無障礙車位、status空閑/占用/鎖定、current_car_id當前停放車輛ID外鍵關聯(lián)car_info、update_time說明這是判斷停車場是否“滿員”的基礎。status字段要建索引因為查詢空車位是整個系統(tǒng)最高頻的操作。停車記錄表parking_record字段id、car_id外鍵關聯(lián)car_info、space_id外鍵關聯(lián)parking_space、entry_time、exit_time、duration_minutes、total_amount、status停泊中/已結算/異常訂單、operator_id操作員ID說明這是系統(tǒng)最核心的業(yè)務流水表。每輛車入場生成一條記錄出場時更新這條記錄而不是新建一條這樣所有歷史流水都留存在同一張表里統(tǒng)計數(shù)據(jù)非常方便。收費規(guī)則表charging_rule字段id、rule_name、rule_type時長計費/按次計費、free_duration_minutes免費時長、first_hour_fee首小時費用、additional_hour_fee追加每小時費用、daily_cap_amount每日封頂金額、night_free_start夜間免費開始時間、night_free_end夜間免費結束時間、effective_status、create_time說明這張表是“運營平臺”的點睛之筆。把計費邏輯做成可配置的而不是代碼寫死整個系統(tǒng)的靈活性和商業(yè)價值立馬不一樣。訂單表parking_order字段id、order_no訂單編號生成規(guī)則可以做成日期隨機數(shù)、record_id關聯(lián)停車記錄、pay_amount、pay_type現(xiàn)金/微信/支付寶/月卡抵扣、pay_status待支付/已支付/已退款、pay_time、operator_id說明訂單表可以單獨建也可以直接合并到停車記錄表里。我建議單獨建因為訂單意味著“支付行為”字段和責任更清晰而且后面如果要接支付接口訂單表是必須的。操作日志表operation_log字段id、operator_id、operation_type、operation_content、operation_time、ip_address說明用于記錄管理員的關鍵操作比如修改了收費規(guī)則、強制出場某個車輛。這既是安全審計需求也是答辯時的加分細節(jié)——“我們這個系統(tǒng)具備完整的操作留痕能力”。這套表結構是一對多關系為主的經(jīng)典范式一張car_info對應多條parking_record一條parking_record對應一條parking_orderparking_space和parking_record之間是一對一的當前占用關系。關系的清晰度在答辯時用ER圖一畫老師立刻就能看出你的設計功底。3. 核心業(yè)務流程與關鍵實現(xiàn)細節(jié)3.1 車輛入場流程從車牌識別到車位分配入場是整個系統(tǒng)第一個核心流程?,F(xiàn)實中的停車場通過攝像頭自動識別車牌畢業(yè)設計階段你可以模擬這個過程——管理員在后臺輸入車輛的車牌號系統(tǒng)自動完成后續(xù)操作。入場流程的核心邏輯public ParkingRecord vehicleEntry(String plateNumber, Long spaceId) { // 1. 校驗車輛信息如果是未登記的新車先自動建檔 CarInfo carInfo carInfoMapper.selectByPlateNumber(plateNumber); if (carInfo null) { carInfo new CarInfo(); carInfo.setPlateNumber(plateNumber); carInfo.setCarType(CarType.TEMPORARY); carInfoMapper.insert(carInfo); } // 2. 校驗車牌號是否已經(jīng)在場內防止重復入場 // 這一點極易遺漏有些車輛出場時沒結算成功導致系統(tǒng)里一直有一條“停泊中”的記錄 // 3. 分配車位優(yōu)先分配同區(qū)域的空閑車位如果沒有空閑車位則提示“車位已滿” // 可以設計為自動分配select * from parking_space where status FREE limit 1 // 4. 鎖定車位創(chuàng)建停車記錄 // 需要開啟事務扣減車位 插入停車記錄兩步必須同時成功 // 5. 記錄操作日志 }這段邏輯在面試或者答辯時最值得展開講的就是事務問題。入場操作涉及兩步寫操作更新車位狀態(tài)為“占用”、插入一條停泊中的停車記錄。這兩步必須放在一個事務里否則會出現(xiàn)車位顯示占用但系統(tǒng)無記錄、或者有記錄但車位還是空閑的數(shù)據(jù)不一致問題。3.2 車輛出場與計費核心算法怎么設計出場流程比入場復雜因為涉及計費。計費算法是整個項目的靈魂你需要認真設計?;A計費邏輯偽代碼如下public BigDecimal calculateFee(ParkingRecord record, ChargingRule rule) { long durationMinutes Duration.between(record.getEntryTime(), LocalDateTime.now()).toMinutes(); // 1. 免費時長判斷 if (durationMinutes rule.getFreeDurationMinutes()) { return BigDecimal.ZERO; } // 2. 按次計費 if (rule.getRuleType() RuleType.PER_ENTRY) { return rule.getFirstHourFee(); } // 3. 按時長計費首小時 追加小時 BigDecimal totalFee rule.getFirstHourFee(); long additionalMinutes durationMinutes - rule.getFreeDurationMinutes() - 60; if (additionalMinutes 0) { long additionalHours (long) Math.ceil(additionalMinutes / 60.0); totalFee totalFee.add(rule.getAdditionalHourFee().multiply(BigDecimal.valueOf(additionalHours))); } // 4. 封頂金額判斷 if (totalFee.compareTo(rule.getDailyCapAmount()) 0) { totalFee rule.getDailyCapAmount(); } return totalFee; }這里面有幾個細節(jié)需要特別提醒金額計算務必使用BigDecimal不要用double或float。這個不是小題大做——二進制浮點數(shù)在計算金額時會出現(xiàn)精度丟失比如0.10.20.30000000000000004這在涉及金錢的場景是絕對不可接受的。時長計算要向上取整。停車1小時01秒按2小時收費這是行業(yè)慣例。Math.ceil可以幫你實現(xiàn)。免費時段判斷不要寫死在代碼里。把夜間免費時段的起止時間放在收費規(guī)則表里管理員可以在界面上配置這才是“運營平臺”該有的姿態(tài)。出場操作還要處理訂單生成和收款狀態(tài)。如果你做線下收費場景現(xiàn)金掃碼出場時更新停車記錄的狀態(tài)、釋放車位、生成訂單這三步同樣要在一個事務里完成。3.3 月卡與長期車輛別做成雞肋功能很多同學做月卡功能就是在車輛信息表里加一個字段“is_monthly_card”然后出入場都不收費了。這樣做太簡單也沒有實際管理意義。稍微像樣一點的實現(xiàn)應該包含月卡續(xù)費在管理端為長期車輛辦理續(xù)費更新月卡到期時間。到期提醒系統(tǒng)在月卡到期前7天、3天、1天生成提醒管理員在首頁可以看到“即將到期車輛”列表。過期處理月卡過期后車輛再入場時按臨時車標準計費出場時提示“月卡已過期按臨時車收費”。月卡充值記錄記錄每次續(xù)費的金額、時長、操作員。這樣財務上才能查賬。把月卡做成獨立的功能模塊而不是一個標記字段這會讓你的系統(tǒng)在功能完整度上拉開同學一個身位。3.4 登錄鑒權用Sa-Token還是JWT登錄鑒權是每個后臺系統(tǒng)的剛需。技術方案上有兩個主流選擇JWTJSON Web Token無狀態(tài)、跨域友好、天然適合前后端分離。但JWT有個明顯的坑——Token簽發(fā)后無法主動失效如果管理員改了密碼舊Token依然有效除非你自己實現(xiàn)Token黑名單機制。Sa-Token國產(chǎn)輕量級鑒權框架核心思路是“登錄后把Token存到服務端Redis或內存注銷時直接刪除”天然支持主動失效和會話管理。API設計很簡潔登錄只需要一行StpUtil.login(userId)。如果你在簡歷上寫“精通Spring Security”那可以挑戰(zhàn)一下Spring SecurityJWT但說實話這套組合的學習曲線比較陡峭對畢業(yè)設計來說屬于性價比很低的方案。我給的建議是選Sa-Token。理由很簡單——夠用、簡單、代碼干凈而且答辯時你能清清楚楚講出它的設計思路這比背一堆Spring Security的過濾器鏈概念要實在得多。3.5 Redis在項目里的定位緩存與分布式鎖Redis在這個項目里可以做兩件事緩存熱點數(shù)據(jù)比如車位剩余數(shù)量、收費規(guī)則列表這些數(shù)據(jù)被高頻讀取但低頻修改非常適合緩存。但要注意緩存一致性更新收費規(guī)則后要主動清除或更新緩存否則會出現(xiàn)“改了半天規(guī)則計費還是老樣子”的詭異bug。分布式鎖解決并發(fā)入場想象一個場景——停車場只剩最后一個車位兩輛車幾乎同時入場如果不用鎖兩個請求都可能查到“有空閑車位”然后都執(zhí)行入場邏輯導致車位超賣。這本質上和電商秒殺超賣是同一個問題。最簡單的方案是用Redis的setnx命令實現(xiàn)一個輕量鎖Boolean locked redisTemplate.opsForValue().setIfAbsent(lock:parking:entry, locked, 10, TimeUnit.SECONDS); if (!locked) { throw new BusinessException(系統(tǒng)繁忙請稍后重試); } try { // 執(zhí)行入場邏輯 } finally { redisTemplate.delete(lock:parking:entry); }答辯時能把這個并發(fā)場景講清楚屬于非常硬核的加分項。很多同學做管理系統(tǒng)根本沒考慮過并發(fā)問題你能主動說出來說明你思考過真實環(huán)境下的運行狀態(tài)。4. 從零到部署完整實操過程記錄4.1 環(huán)境準備與項目初始化工欲善其事必先利其器。動手寫代碼之前先把環(huán)境裝好JDK 1.8 或 11建議1.8兼容性最好大部分公司老項目還是以1.8為主Maven 3.6用來管理依賴和打包MySQL 8.0本地裝一個別用云端數(shù)據(jù)庫做開發(fā)調試麻煩Redis 5.0Windows用戶可以用微軟移植版或者Docker裝IDEA 2023版本以上社區(qū)版就夠用沒必要破解旗艦版項目初始化用IDEA的Spring Initializr最方便選好SpringBoot版本、勾選Lombok、Spring Web、MyBatis之后在pom.xml里手動加MyBatis-Plus依賴、MySQL Driver、Validation。注意SpringBoot的版本選擇我推薦2.7.x而不是3.x——3.x是基于Jakarta EE的很多老教程的代碼在3.x上跑不通而且部分第三方starter還沒適配完沒必要給自己挖坑。4.2 后端代碼結構包名怎么分、代碼怎么組織包結構是代碼規(guī)范的第一張臉我見過太多同學的代碼全部堆在controller里一個方法寫幾百行這種代碼別說答辯自己回頭調試都頭疼。合理包結構參考如下com.smartparking ├── controller // 接口層只做參數(shù)接收和響應封裝 │ ├── AdminController │ ├── CarController │ ├── ParkingController │ └── StatisticsController ├── service // 業(yè)務層核心邏輯全部寫在這里 │ ├── impl │ ├── ParkingService.java │ ├── ChargingService.java │ └── StatisticsService.java ├── mapper // 數(shù)據(jù)訪問層MyBatis-Plus的Mapper接口 ├── entity // 實體類對應數(shù)據(jù)庫表 ├── dto // 數(shù)據(jù)傳輸對象接收前端參數(shù)、返回前端響應 ├── common // 通用類統(tǒng)一返回結果Result、異常處理、常量定義 ├── config // 配置類跨域配置、攔截器、Redis配置 └── utils // 工具類JWT工具、日期工具、車牌校驗工具分層的核心法則Controller只干活不決策Service只做業(yè)務不碰HTTPMapper只碰數(shù)據(jù)庫不寫邏輯。這樣職責清晰、代碼可讀性強答辯時老師一眼就能看出你有工程化意識。4.3 從數(shù)據(jù)庫到接口15個核心接口的完整實現(xiàn)這個項目后端要做多少個接口才算是“完整系統(tǒng)”我按模塊給你梳理一遍總共大概15-18個接口。每個接口都對應一個具體的業(yè)務場景做完這些系統(tǒng)的功能閉環(huán)就完整了系統(tǒng)管理模塊3個接口管理員登錄POST /api/auth/login接收用戶名密碼校驗后返回token管理員登出POST /api/auth/logout清除服務端會話獲取當前登錄用戶信息GET /api/auth/info車位管理模塊3個接口車位列表分頁狀態(tài)篩選GET /api/spaces新增/修改車位POST/PUT /api/spaces刪除車位DELETE /api/spaces/{id}車輛管理模塊4個接口車輛入場POST /api/vehicle/entry核心接口入?yún)⑹擒嚺铺柡蛙囄籌D車輛出場POST /api/vehicle/exit核心接口入?yún)⑹擒嚺铺柣蛲\囉涗汭D車輛列表查詢GET /api/vehicles月卡辦理/續(xù)費POST /api/vehicles/renew收費規(guī)則模塊2個接口查詢當前生效的收費規(guī)則GET /api/charging/current修改收費規(guī)則PUT /api/charging/rule統(tǒng)計報表模塊3個接口今日概覽數(shù)據(jù)GET /api/statistics/today今日營收、車流量、當前占用營收趨勢GET /api/statistics/revenue-trend近7天/30天營收曲線車位利用率GET /api/statistics/utilization各區(qū)域車位利用率百分比訂單模塊2個接口訂單分頁查詢GET /api/orders按訂單號/車牌號/時間范圍篩選訂單詳情GET /api/orders/{id}統(tǒng)一的返回結果類是必須的。我一般這樣定義Data public class ResultT { private Integer code; // 200表示成功400業(yè)務錯誤401未登錄500系統(tǒng)異常 private String message; private T data; public static T ResultT success(T data) { ResultT result new Result(); result.setCode(200); result.setMessage(操作成功); result.setData(data); return result; } }前端Vue端封裝的axios攔截器統(tǒng)一處理code——code不是200就彈出錯誤提示401就跳轉登錄頁。這套設計模式是行業(yè)標準直接抄。4.4 前端實現(xiàn)要點有沒有必要寫大屏可視化前端部分如果你選擇Vue管理后臺的頁面大概需要登錄頁、首頁儀表盤今日營收、車流量、車位占用概覽、車位管理頁、車輛管理頁、停車記錄頁、收費規(guī)則配置頁、訂單管理頁、大屏展示頁。這里認真聊聊大屏可視化。很多同學會覺得大屏很難實際上現(xiàn)在用ECharts做可視化非??旌诵木褪侨齻€圖實時車位占用環(huán)形圖用餅圖展示空閑/占用/鎖定的比例近7日車流量柱狀圖每天的進場車輛數(shù)近7日營收折線圖每天營收金額變化這三個圖表就足夠撐起大屏的視覺沖擊力了。技術實現(xiàn)上前端定時比如每10秒輪詢后端統(tǒng)計接口刷新圖表數(shù)據(jù)就有“實時”的效果。如果你想做得更高級一點可以用WebSocket做實時推送但這屬于錦上添花不是必須。我個人建議大屏要寫但別在它上面花超過兩天時間。它的核心價值是演示效果好對項目技術深度的貢獻有限。時間應該花在關鍵業(yè)務邏輯上比如計費算法的嚴謹性、并發(fā)入庫的處理——這些才是答辯時真正能扛住深挖的點。4.5 答辯演示腳本5分鐘流程怎么走項目做完答辯演示也是門技術活。很多同學開發(fā)得挺認真演示的時候手忙腳亂項目亮點一個沒展示出來很虧。我建議準備一個5分鐘的演示腳本按照下面的順序走第一分鐘登錄系統(tǒng)展示首頁儀表盤——快速介紹項目的整體功能讓老師對系統(tǒng)規(guī)模有個感性認識。第二分鐘創(chuàng)建一個收費規(guī)則比如“首小時5元后續(xù)每小時3元單日封頂30元”——演示收費規(guī)則的可配置性這是“運營平臺”的關鍵特征。第三分鐘車輛入場操作——錄入一個車牌號GB12345系統(tǒng)自動分配車位。然后去車位管理頁展示該車位狀態(tài)已變?yōu)椤罢加谩?。第四分鐘車輛出場操作——錄入同一個車牌號系統(tǒng)自動計算停車費用??桃馔nD一下把計費明細展示給老師看“入場11分鐘未超過免費時長收費0元”或者“入場2小時15分按3小時計費總費用11元”。第五分鐘打開統(tǒng)計報表或大屏——展示今日營收曲線、車位利用率等圖表。最后補一句“這些圖表的數(shù)據(jù)是從停車記錄表實時匯總計算得出的”。整個演示過程的核心原則是讓老師看到完整的業(yè)務閉環(huán)——配置規(guī)則、入場、計費、出場、統(tǒng)計一條線走完整個系統(tǒng)的價值一目了然。5. 常見問題與避坑經(jīng)驗5.1 代碼層面的“坑”與解決方案問題一日期時間差了8小時原因服務器時區(qū)是格林尼治標準時間而中國是東八區(qū)。表現(xiàn)是數(shù)據(jù)庫里存的時間和本地時間差了8小時。排查方法查看數(shù)據(jù)庫連接串是否加了serverTimezoneAsia/Shanghai以及JVM啟動參數(shù)是否設了-Duser.timezoneGMT8。問題二BigDecimal傳參精度丟失前端傳金額給后端時如果用JSON標準格式傳數(shù)字小數(shù)位數(shù)可能會被截斷。解決方案前端把所有金額字段轉成字符串傳輸后端用JsonFormat或自定義反序列化器處理字符串到BigDecimal的轉換。問題三MyBatis-Plus分頁查不出數(shù)據(jù)大概率是沒配置分頁插件。MyBatis-Plus的分頁功能需要顯式添加PaginationInnerInterceptor在配置類里注冊一下Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); return interceptor; }問題四Lombok在IDEA中提示找不到getter/setter這不是代碼問題是IDEA沒裝Lombok插件或者沒開啟注解處理。設置里搜“annotation processing”勾選“Enable annotation processing”再裝一下Lombok插件重啟即解決。問題五跨域請求報403或CORS錯誤前后端分離部署時跨域是最常見的問題。簡單做法是在后端寫一個配置類實現(xiàn)WebMvcConfigurer重寫addCorsMappings方法允許所有來源。但注意如果你后續(xù)接了權限攔截器跨域預檢請求OPTIONS請求會被攔截器攔掉需要在攔截器里對OPTIONS請求直接放行。5.2 時間管理和開發(fā)節(jié)奏如果現(xiàn)在是畢業(yè)設計啟動初期建議按照下面的節(jié)奏推進第1周完成需求分析、數(shù)據(jù)庫設計、項目初始化。這周是最重要的地基沒打好后面全是返工。第2-3周完成后端核心業(yè)務登錄鑒權、車位管理、入場/出場流程。這是系統(tǒng)的骨架。第4周完成計費規(guī)則、統(tǒng)計報表、訂單管理。這時候系統(tǒng)已經(jīng)能跑通完整閉環(huán)了。第5周寫前端頁面對接接口。如果你前端不熟這周是最大的瓶頸期建議提前規(guī)劃好頁面數(shù)量和交互復雜度。第6周部署、測試、寫論文、準備答辯PPT。最后留一周緩沖處理意外問題。5.3 答辯老師最愛問的幾個問題提前把這些問題想清楚答辯時就不慌為什么選擇SpringBoot答SpringBoot簡化了Spring的配置復雜度內置Tomcat起步依賴自動管理jar包非常適合快速構建獨立運行的微服務應用。順著這個回答可以展開聊自動配置原理你的系統(tǒng)跟別的停車管理系統(tǒng)相比有什么亮點答第一收費規(guī)則可配置化運營人員無需改代碼就能調整計費策略第二使用Redis分布式鎖解決并發(fā)入場場景下的車位超賣問題第三系統(tǒng)內置統(tǒng)計報表模塊便于管理者做運營分析。建議直接背下來數(shù)據(jù)庫表為什么這樣設計答采用三范式設計車輛表、停車記錄表、訂單表分離各自記錄不同維度的業(yè)務數(shù)據(jù)。車位表和停車記錄表之間是一對一關系因為一個車位同一時間只能停一輛車。同時通過外鍵關聯(lián)保持數(shù)據(jù)一致性。畫ER圖的時候把這些關系指給老師看如果停車記錄有異常數(shù)據(jù)比如入場了但沒出場記錄如何發(fā)現(xiàn)和處理答系統(tǒng)會定期掃描停車記錄表找出“停泊中”狀態(tài)但已超過最大停車時長的記錄標識為異常訂單管理員可以手工處理。還可以寫一個定時任務每日凌晨掃描未關閉的記錄并生成提醒。5.4 論文寫作的側重點最后聊兩句論文。畢業(yè)論文不要全篇寫代碼而是要突出“設計思路”和“解決問題的方法”。比較好的結構是緒論研究背景、國內外現(xiàn)狀、研究內容相關技術介紹SpringBoot、MyBatis-Plus、Redis、Vue系統(tǒng)需求分析功能需求、非功能需求性能、安全性、易用性系統(tǒng)設計架構設計、功能模塊設計、數(shù)據(jù)庫設計系統(tǒng)實現(xiàn)各模塊的關鍵代碼注意不是貼全部代碼是貼核心邏輯段系統(tǒng)測試功能測試用例表、測試結論答辯論文里一定要放幾張截圖數(shù)據(jù)庫ER圖、系統(tǒng)架構圖、核心功能界面圖。圖比字重要得多這是論文答辯的通用法則。寫論文的時候我建議先搭框架再填充內容不要想到哪寫到哪??蚣艽詈煤竺刻焱七M一個章節(jié)一周到十天就能出完整初稿。這個停車場管理系統(tǒng)的題目說難不難說簡單也絕對不簡單。關鍵在于你是否把核心業(yè)務邏輯想透了——入場出場的狀態(tài)流轉、計費規(guī)則的靈活設計、并發(fā)場景的數(shù)據(jù)一致性這三個點做好了你的項目就站在了“管理系統(tǒng)”和“運營平臺”的分界線上。我個人在做類似項目時最大的體會是別急著寫代碼先把入場出場的整個狀態(tài)流轉畫清楚。狀態(tài)機理清楚了數(shù)據(jù)庫表和業(yè)務代碼都是水到渠成的事情狀態(tài)機含糊代碼寫再多也是空中樓閣。做畢業(yè)設計如此以后進公司做真實項目更是一個道理。再有就是動手之前花兩小時把技術棧定下來版本、包結構、統(tǒng)一返回格式這些約定提前說好后面寫代碼會順暢很多。祝你項目順利答辯穩(wěn)過。