療保險(xiǎn)管理系統(tǒng)實(shí)戰(zhàn):從業(yè)務(wù)建模到部署全流程)
總有些人以為Spring Boot 校園醫(yī)療保險(xiǎn)就是個學(xué)生信息表的增刪改查配個 Bootstrap 后臺模板就能交差。但真正上手做這個題的人都知道坑在業(yè)務(wù)規(guī)則、角色流轉(zhuǎn)、數(shù)據(jù)庫狀態(tài)機(jī)甚至在你以為萬無一失的打包部署環(huán)節(jié)。這篇就完整還原一套可運(yùn)行的校園醫(yī)療保險(xiǎn)管理系統(tǒng)的落地過程從業(yè)務(wù)建模、技術(shù)選型、數(shù)據(jù)庫設(shè)計(jì)到報(bào)銷審核流轉(zhuǎn)、部署排錯和論文材料準(zhǔn)備全程基于 Spring Boot 2.7 MyBatis-Plus MySQL 8.0 Redis 這套目前課設(shè)最穩(wěn)妥的組合。不管你是自己寫、拿到源碼后二次開發(fā)還是正在頭疼畢業(yè)設(shè)計(jì)按這個思路走至少能少熬夜兩個星期。1. 這個題最難的從來不是 Spring Boot而是把醫(yī)保業(yè)務(wù)捋清楚很多拿到校園醫(yī)療保險(xiǎn)管理系統(tǒng)題目的同學(xué)第一步就直接開 IDE 建項(xiàng)目這基本就輸了。醫(yī)保業(yè)務(wù)和普通的宿舍管理系統(tǒng)完全不同它最核心的不是增刪改查而是審核狀態(tài)的流轉(zhuǎn)和報(bào)銷金額的計(jì)算規(guī)則。這兩塊沒想清楚后面寫多少代碼都是在打補(bǔ)丁。1.1 角色與流程先畫人再寫代碼一個完整的校園醫(yī)保系統(tǒng)至少要有四類角色缺一個答辯的時候都會被老師問住學(xué)生參保人注冊登錄、填寫參保信息、提交報(bào)銷申請、上傳發(fā)票病歷、查看審核進(jìn)度。校醫(yī)院/衛(wèi)生所初審角色審核學(xué)生提交的報(bào)銷材料是否符合門診、住院的基本要求材料不全直接駁回。醫(yī)保辦/資助中心復(fù)審角色核定報(bào)銷金額確認(rèn)是否進(jìn)入打款環(huán)節(jié)。這個角色在多數(shù)課設(shè)里容易被忽略但它決定了系統(tǒng)有沒有完整閉環(huán)。系統(tǒng)管理員用戶管理、角色分配、報(bào)銷規(guī)則參數(shù)配置起付線、比例、封頂線、數(shù)據(jù)統(tǒng)計(jì)。對應(yīng)的主流程就是學(xué)生參保登記 → 管理員審核參保資格 → 學(xué)生提交報(bào)銷申請 → 校醫(yī)院初審 → 醫(yī)保辦復(fù)審 → 生成報(bào)銷結(jié)果 → 學(xué)生查看反饋。這條鏈路里審核不是一個布爾字段而是要有狀態(tài)機(jī)。我在實(shí)際做這個系統(tǒng)的時候把報(bào)銷單狀態(tài)定義成了 10 個草稿、待初審、初審?fù)ㄟ^/駁回、待復(fù)審、復(fù)審?fù)ㄟ^/駁回、待打款、已打款、已歸檔。有人覺得 10 個太多但等你寫完論文第六章系統(tǒng)測試時就會發(fā)現(xiàn)狀態(tài)越細(xì)測試用例越好寫答辯演示的時候也越有的講。1.2 報(bào)銷計(jì)算規(guī)則一處小改動牽動全系統(tǒng)報(bào)銷金額計(jì)算是這個系統(tǒng)的業(yè)務(wù)核心很多同學(xué)直接寫死在 Service 里比如if (type 1) ratio 0.7??粗芘艿袀€致命缺陷校醫(yī)院的人改報(bào)銷比例時難道要找你改代碼重新部署所以規(guī)則必須可配置化。我采用的方案是設(shè)計(jì)一張reimburse_rule規(guī)則表字段包括就診類型門診/住院/大病門診、起付線、報(bào)銷比例、單次封頂、年度累計(jì)封頂、生效時間。計(jì)算報(bào)銷金額時一次性把規(guī)則取出來做匹配并記錄本次計(jì)算用的是哪條規(guī)則快照。舉個例子某校的規(guī)則是門診每次起付線 300 元超出部分報(bào)銷 70%年度累計(jì)報(bào)銷上限 2000 元住院起付線 800 元報(bào)銷 80%年度上限 20 萬。那么門診報(bào)銷金額的計(jì)算邏輯就是報(bào)銷金額 (本次總費(fèi)用 - 起付線) x 70%同時還要判斷這個人今年已經(jīng)報(bào)銷了多少超額部分自動截?cái)唷_@在 MySQL 里不算復(fù)雜但要注意并發(fā)問題如果學(xué)生同時提交兩筆報(bào)銷申請年度累計(jì)額度就可能被重復(fù)計(jì)算。穩(wěn)妥的做法是在事務(wù)里加鎖或者先查詢已通過審核且進(jìn)入打款環(huán)節(jié)的報(bào)銷單總額再和規(guī)則比較。課設(shè)里不需要做太重的分布式鎖但要保證單機(jī)事務(wù)一致性和重要字段的樂觀鎖版本控制。1.3 系統(tǒng)交付邊界哪些功能必須有哪些是加分項(xiàng)功能模塊直接決定了論文的大綱和工作量我用一個表格說明我當(dāng)時劃分的交付范圍功能模塊核心功能建議等級用戶與權(quán)限注冊、登錄、密碼加密、角色路由、菜單權(quán)限必須有參保管理學(xué)生參保信息登記、資格審核、參保記錄查詢必須有報(bào)銷管理申請?zhí)峤?、材料附件、審核流、金額計(jì)算、進(jìn)度查詢必須有規(guī)則配置報(bào)銷比例、起付線、封頂線的后臺維護(hù)必須有通知公告報(bào)銷結(jié)果通知、政策公告發(fā)布建議有數(shù)據(jù)統(tǒng)計(jì)按學(xué)院/年度統(tǒng)計(jì)報(bào)銷金額、參保人數(shù)圖表加分項(xiàng)導(dǎo)出功能Excel 導(dǎo)出報(bào)銷清單、參保名單加分項(xiàng)如果你拿到手的源代碼資源包只給了前三項(xiàng)那其實(shí)是正常的核心版本但建議至少自己補(bǔ)上一個規(guī)則配置頁面。因?yàn)榇疝q評閱時老師最愛問的問題就是報(bào)銷比例如果要改怎么辦如果你答案不優(yōu)雅前半小時的辛苦演示都會白費(fèi)。2. 技術(shù)選型與開發(fā)環(huán)境夠用、好調(diào)試、答辯扛得住技術(shù)選型是很多人忽略但實(shí)際影響開發(fā)效率的環(huán)節(jié)。校園醫(yī)療系統(tǒng)這類課設(shè)項(xiàng)目不需要上微服務(wù)、不需要容器化編排更不需要什么 Distributed Transaction選一套主流、資料多、代碼量適中的棧才是正道。2.1 完整技術(shù)棧清單與版本對應(yīng)關(guān)系我最終用的是這套組合不敢說最優(yōu)但勝在穩(wěn)定和資料多后端框架Spring Boot 2.7.18這里提醒一下不要上 Spring Boot 3.x。3.x 依賴 JDK 17而且很多課設(shè)用的 MyBatis-Plus 版本和 Java 代碼兼容性問題會把你折磨瘋。2.7 團(tuán)隊(duì)里用得多、報(bào)錯搜得到答案選它不丟人。持久層MyBatis-Plus 3.5.3配合TableLogic邏輯刪除、MetaObjectHandler自動填充 createTime/updateTime能省 30% 的重復(fù)代碼。數(shù)據(jù)庫MySQL 8.0字符集 utf8mb4排序規(guī)則 utf8mb4_unicode_ci。連接池Druid監(jiān)控頁面druid/index.html在答辯演示時很加分。權(quán)限鑒權(quán)Sa-Token 或 Spring Security JWT。我更推薦 Sa-Token因?yàn)樗鼪]有 Spring Security 那么多過濾器鏈的概念課設(shè)工期緊張時學(xué)起來快得多。緩存Redis主要用來存登錄 Token、報(bào)銷規(guī)則緩存和部分熱點(diǎn)數(shù)據(jù)不是必須但建議有。工具庫Hutool、EasyExcel導(dǎo)出用、Lombok。開發(fā)環(huán)境我用的是 JDK 8 Maven 3.6.3 IDEA 2023.2Windows 10。這里有一個值得注意的建議IDEA 的 Lombok 插件一定要裝并開啟注解處理否則代碼一編譯就莫名報(bào)找不到getter/setter你還會以為是自己代碼寫錯了。2.2 開發(fā)環(huán)境初始化的三個容易忽略的配置第一個是 Maven 倉庫鏡像。國內(nèi)網(wǎng)絡(luò)環(huán)境下載 Spring Boot 相關(guān)依賴時默認(rèn)中央倉庫速度不穩(wěn)定我直接在settings.xml里配了阿里云鏡像spring-boot-starter-parent的依賴基本一分鐘內(nèi)全部拉完。第二個是application.yml里的數(shù)據(jù)庫連接串。MySQL 8.0 的驅(qū)動類名是com.mysql.cj.jdbc.Driver連接串里必須加上serverTimezoneAsia/Shanghai同時建議顯式聲明useUnicodetruecharacterEncodingutf8mb4。不寫 timezone 會導(dǎo)致查出來的時間比實(shí)際少 8 小時甚至有項(xiàng)目直接啟動報(bào)錯The server time zone value 亂碼 is unrecognized。第三個是數(shù)據(jù)源自動配置的問題。如果你項(xiàng)目里同時引入了 Spring Boot 的spring-boot-starter-data-jpa和 MyBatis-Plus啟動時可能因?yàn)閮蓚€持久層框架自動配置沖突而報(bào)Invalid bean definition。我個人的做法是項(xiàng)目只用一個持久層框架。這個系統(tǒng)完全用 MyBatis-Plus 就夠了別貪多同時引用 JPA。2.3 為什么強(qiáng)烈建議拆分 dev/prod 兩套配置我在拿到課設(shè)題目的第一周就拆出了三個文件application.yml公共配置、application-dev.yml本地開發(fā)、application-prod.yml服務(wù)器部署。開發(fā)環(huán)境用本地的 MySQL賬號 root、密碼隨意Redis 也默認(rèn)本地 6379生產(chǎn)環(huán)境則通過啟動參數(shù)切換java -jar xx.jar --spring.profiles.activeprod。這樣做的好處一是本地調(diào)試不會被服務(wù)器配置干擾二是部署到服務(wù)器時不用重新改代碼只需改 yml 里的連接信息即可。這種細(xì)節(jié)在論文的系統(tǒng)部署章節(jié)里也是很好的素材。就算你不打算真的部署到云服務(wù)器在論文中把這個過程寫清楚整個論文的完整度會提升一大截。3. 數(shù)據(jù)庫設(shè)計(jì)12 張核心表怎么落才不返工數(shù)據(jù)庫設(shè)計(jì)是這個系統(tǒng)里最容易返工的部分。我見過一個同學(xué)把報(bào)銷附件直接存成longblob字段塞進(jìn)報(bào)銷單表結(jié)果一張發(fā)票 5MB整張表膨脹到幾百 MB查一次列表卡 3 秒。附件的正確做法是單獨(dú)建表只存文件名、存儲路徑、關(guān)聯(lián)的業(yè)務(wù) ID。3.1 核心表結(jié)構(gòu)與字段設(shè)計(jì)整個系統(tǒng)我設(shè)計(jì)了 12 張表核心表如下表名用途關(guān)鍵字段sys_user用戶表統(tǒng)一放所有登錄賬號id, username, password, salt, role_id, status, create_timesys_role角色表id, role_code, role_namestudent_info學(xué)生參保信息id, user_id, student_no, name, college, grade, phone, id_card(加密), insurance_statusinsurance_record參保記錄/續(xù)保歷史id, student_id, academic_year, policy_no, insured_date, expire_datereimburse_application報(bào)銷申請主表id, student_id, medical_type, hospital, total_amount, apply_date, status, rule_snapshotreimburse_detail報(bào)銷費(fèi)用明細(xì)id, application_id, item_name, item_category, amount, invoice_noaudit_record審核記錄表id, application_id, auditor_id, audit_action, audit_comment, audit_timereimburse_rule報(bào)銷規(guī)則配置表id, medical_type, deductible, ratio, single_cap, annual_cap, effective_dateattachment附件表發(fā)票、病歷id, biz_type, biz_id, file_name, file_path, file_sizesys_config系統(tǒng)參數(shù)配置id, config_key, config_value, description這里有一個關(guān)鍵設(shè)計(jì)原則報(bào)銷金額計(jì)算不能直接改規(guī)則表里的當(dāng)前值而是要在報(bào)銷單里冗余一份rule_snapshot。因?yàn)橐?guī)則會變學(xué)生 3 月份提交申請時用的是 70% 比例5 月份學(xué)校調(diào)成了 65%如果審核時實(shí)時讀規(guī)則表之前的申請就會被錯誤地按新規(guī)則計(jì)算??煺兆侄挝矣?JSON 格式存儲計(jì)算當(dāng)時的規(guī)則對象一勞永逸地規(guī)避了這個爭議問題。3.2 報(bào)銷狀態(tài)機(jī)的落表方式狀態(tài)機(jī)我用的方案是主表有一個status字段另外單獨(dú)建audit_record表記錄每一次流轉(zhuǎn)的痕跡。有人覺得重復(fù)有人覺得沒必要但最后的效果是每一條報(bào)銷單都能完整追溯誰在什么時間做了什么動作、寫了什么意見。這在系統(tǒng)測試和答辯時是非常好的談資老師一看就知道你考慮到了審計(jì)需求。具體實(shí)現(xiàn)上Service 層不要直接對著status字段隨意 set而是封裝一個auditRimbursement(applicationId, auditAction, auditComment, auditorId)方法內(nèi)部用樂觀鎖 狀態(tài)校驗(yàn)初審只能操作待初審的單子復(fù)審只能操作初審?fù)ㄟ^的單子學(xué)生只能撤回草稿或待初審的單子已打款的單子不可再修改。3.3 數(shù)據(jù)冗余與聯(lián)表查詢的取舍學(xué)生個人信息、學(xué)院信息、報(bào)銷單列表之間是典型的一對多關(guān)系。查詢報(bào)銷列表的時候如果每次都要student_info表 join 一次雖然也能跑但列表頁字段一多就會顯得慢。我在reimburse_application表里冗余了student_no、student_name、college這幾個只讀字段提交報(bào)銷申請時從學(xué)生檔案一次性快照過來。這樣做的好處是列表頁不需要 join查詢效率高壞處是如果學(xué)生畢業(yè)后改了學(xué)院名稱歷史數(shù)據(jù)會有不一致。但對于課設(shè)系統(tǒng)這個規(guī)模讀多寫少、以展示為主的場景冗余帶來的收益遠(yuǎn)大于風(fēng)險(xiǎn)。你也可以在論文里專門寫一小段反范式設(shè)計(jì)的理由反而顯得有思考深度。4. 關(guān)鍵功能模塊的實(shí)現(xiàn)從登錄到報(bào)銷審核流轉(zhuǎn)這個章節(jié)直接對應(yīng)論文的系統(tǒng)實(shí)現(xiàn)也是你能不能把代碼跑通的關(guān)鍵。4.1 登錄、鑒權(quán)與角色路由的設(shè)計(jì)密碼存儲不要用明文更不要只用 MD5。我一直用 BCryptSpring Security 里的BCryptPasswordEncoder可以直接拿來用。前臺密碼加密傳輸這塊課設(shè)不用搞太復(fù)雜HTTPS 一般用不上但至少要做到數(shù)據(jù)庫泄露后密碼不裸奔。使用 Sa-Token 做登錄時登錄成功后返回 token前端請求頭加satoken字段。每個接口用SaCheckRole(admin)這類注解控制角色權(quán)限。值得注意的是前端路由也要做角色控制管理員登錄后菜單顯示規(guī)則配置和用戶管理學(xué)生登錄后只顯示參保登記和報(bào)銷申請。不然學(xué)生直接在瀏覽器輸入 URL 訪問管理頁面雖然后端權(quán)限攔截了但用戶體驗(yàn)很差答辯時也容易被挑毛病。4.2 報(bào)銷審核流轉(zhuǎn)的實(shí)現(xiàn)細(xì)節(jié)這一塊是最容易出現(xiàn)并發(fā)問題的。兩個審核員同時審核同一個報(bào)銷單如果都讀了 status 為待初審一個改為通過、一個改為駁回后提交的會把前一個結(jié)果覆蓋掉。我當(dāng)時的解決方案是加了個樂觀鎖版本號字段version更新時執(zhí)行 SQLUPDATE reimburse_application SET status 初審?fù)ㄟ^, version version 1 WHERE id #{id} AND status 待初審 AND version #{version}如果更新影響行數(shù)為 0說明狀態(tài)已經(jīng)被別人改過直接拋出報(bào)銷單已被處理的提示。這套邏輯不復(fù)雜但對項(xiàng)目完整性非常重要論文測試用例中也可以專門提一條并發(fā)審核場景。4.3 文件上傳與敏感信息處理學(xué)生在提交報(bào)銷單時要上傳發(fā)票照片、病歷掃描件后端接收MultipartFile后先做類型白名單校驗(yàn)jpg、png、pdf 三種格式大小限制 5MB。文件命名規(guī)則我采用UUID 原始文件名存儲路徑按日期分目錄例如uploads/20250307/uuid.jpg。數(shù)據(jù)庫里只存路徑不存 Base64。還有一塊敏感內(nèi)容是學(xué)生的身份證號。我在student_info表中對身份證號做了加密存儲展示時用工具類脫敏成110***********1234。這個點(diǎn)雖小但寫進(jìn)論文的數(shù)據(jù)安全設(shè)計(jì)里會顯得你考慮問題很全面。畢竟現(xiàn)在個人信息保護(hù)是熱點(diǎn)話題很多評閱老師都會留意。4.4 統(tǒng)計(jì)報(bào)表與 Excel 導(dǎo)出報(bào)表功能我用了 Hutool 的PoiWriter或 EasyExcel。最常用的三個維度是按學(xué)院統(tǒng)計(jì)當(dāng)前年度參保人數(shù)按月份統(tǒng)計(jì)報(bào)銷申請數(shù)量和報(bào)銷金額按報(bào)銷類型統(tǒng)計(jì)門診/住院的占比。后端接口返回ListMapString, Object前端用 ECharts 畫餅圖和柱狀圖。這里有一個易踩坑的地方ECharts 依賴的數(shù)據(jù)字段名在 JS 里是駝峰而后端 Java 返回的是下劃線字段比如totalAmount對應(yīng)數(shù)據(jù)庫的total_amount。使用 MyBatis-Plus 時先在全局配置map-underscore-to-camel-case: true否則前端拿到一堆帶下劃線的 JSON 字段圖表渲染出來標(biāo)簽全是亂的。5. 調(diào)試部署全流程實(shí)錄從本地跑通到服務(wù)器上線課設(shè)題目里寫了調(diào)試部署開發(fā)環(huán)境所以這節(jié)直接說實(shí)戰(zhàn)中最容易浪費(fèi)時間的幾個環(huán)節(jié)。5.1 本地啟動必須檢查的四件事拿到源碼或者自己寫完第一版后啟動失敗的 80% 原因集中在四個方面JDK 版本與 Spring Boot 版本不匹配Spring Boot 2.7 用 JDK 8 和 11 都沒問題但如果你電腦默認(rèn) JDK 17編譯會報(bào)Unsupported class file major version或者 Lombok 崩潰。MySQL 服務(wù)沒有啟動很多人報(bào)錯Communications link failure不是代碼問題是 MySQL 服務(wù)壓根沒開或者端口被改了。數(shù)據(jù)庫沒有初始化如果項(xiàng)目連了數(shù)據(jù)庫但忘記執(zhí)行項(xiàng)目里的sql文件啟動時會出現(xiàn)Table xx.reimburse_application doesnt exist。Redis 未啟動如果登錄用到了 Sa-Token 的 Redis 集成而本機(jī)沒啟動 Redis會報(bào)Unable to connect to Redis。這個錯誤表面上是連接失敗實(shí)際是環(huán)境缺服務(wù)。我建議在跑任何代碼前先寫一個簡單的curl http://localhost:8080再配合后端控制臺日志逐行看不要一上來就懷疑框架配錯了。5.2 打包含依賴的坑jar 包一跑就掛Fine你本地 IDEA 點(diǎn)擊運(yùn)行一切正常但執(zhí)行mvn package后java -jar一跑就no main manifest attribute或報(bào)告找不到主類。這個坑十個人里有八個人會遇到。原因是 Spring Boot 項(xiàng)目必須用spring-boot-maven-plugin插件來 repackage否則打出來的只是普通 jar不是 fat jar。正確配置是確保 pom.xml 里有build plugins plugin groupIdorg.springframework.boot/groupId artifactIdspring-boot-maven-plugin/artifactId version2.7.18/version /plugin /plugins /build打完包后用java -jar target/xxx.jar --spring.profiles.activeprod啟動。如果報(bào)端口被占用就用nohup java -jar xxx.jar --server.port8081換一個端口。5.3 服務(wù)器部署Nginx 反向代理與 MySQL 初始化如果你有一臺云服務(wù)器騰訊云/阿里云輕量服務(wù)器都行部署思路是這樣服務(wù)器安裝 JDK 8、MySQL 8.0、Redis可選把本地導(dǎo)出的 SQL 文件在服務(wù)器上執(zhí)行一遍用scp或 GitHub 把 jar 包傳到服務(wù)器寫一個簡單的start.shnohup java -jar xxx.jar --spring.profiles.activeprod app.log 21 配置 Nginx 反向代理 80 端口到 8080 端口前端靜態(tài)資源放 Nginx。安全組記得開放 3306 端口只給特定 IP不然是個人都能連你的數(shù)據(jù)庫。這個問題我在好幾篇課設(shè)項(xiàng)目里反復(fù)提醒過因?yàn)楹芏嗤瑢W(xué)圖方便把數(shù)據(jù)庫賬號密碼裸寫在 yml 里然后直接上傳服務(wù)器如果安全組設(shè)置不當(dāng)數(shù)據(jù)庫很快會被惡意掃描拖走。5.4 常見異常對照表異?,F(xiàn)象常見原因處理思路Access denied for user rootlocalhost密碼或權(quán)限問題檢查 yml 密碼MySQL 8 用caching_sha2_password時注意驅(qū)動版本Invalid bound statement (not found)Mapper XML 掃描路徑不對檢查MapperScan和 XML 的 namespace 是否對應(yīng)Failed to configure a DataSource未配置數(shù)據(jù)源或配置錯誤檢查spring.datasource.url是否符合規(guī)范Table doesnt exist沒有執(zhí)行 SQL 初始化腳本用 Navicat 或命令行初始化數(shù)據(jù)庫Whitelabel Error Page 404Controller 路徑或靜態(tài)資源放錯位置檢查RequestMapping與前端請求路徑是否一致中文查詢結(jié)果亂碼連接串或表字符集不統(tǒng)一統(tǒng)一 utf8mb4連接串加 characterEncoding6. 論文寫作與項(xiàng)目論證一萬字文檔的骨架標(biāo)題里提到論文文檔 1 萬字以上很多同學(xué)把論文和開發(fā)分開來最后再熬夜拼湊過程非常痛苦。實(shí)際上論文的章節(jié)對應(yīng)系統(tǒng)的開發(fā)過程是天然的同構(gòu)關(guān)系。6.1 論文大綱與系統(tǒng)開發(fā)的對應(yīng)關(guān)系完整系統(tǒng)論文通常用這個框架第一章緒論。寫研究背景、國內(nèi)外發(fā)展現(xiàn)狀、研究內(nèi)容。開題的時候就要確定為什么做這個系統(tǒng)我的推薦寫法是先用一個真實(shí)的校園場景切入從大學(xué)生醫(yī)保報(bào)銷流程繁瑣說起再分析目前常見線上化系統(tǒng)的不足最后引出本系統(tǒng)的目標(biāo)。第二章相關(guān)技術(shù)介紹。寫 Spring Boot、MyBatis-Plus、MySQL、Redis、Vue 或 Thymeleaf。這里不要長篇大論的復(fù)制概念要結(jié)合系統(tǒng)用到的場景描述比如MyBatis-Plus 的 LambdaQueryWrapper 在報(bào)銷單列表的分頁查詢中提高了開發(fā)效率。第三章需求分析。包括可行性分析經(jīng)濟(jì)、技術(shù)、操作功能性需求用例圖和用例說明非功能需求性能、安全、可靠性。第四章系統(tǒng)設(shè)計(jì)??傮w架構(gòu)圖、功能模塊圖、數(shù)據(jù)庫設(shè)計(jì)ER 圖、表結(jié)構(gòu)說明重點(diǎn)把報(bào)銷審核狀態(tài)流轉(zhuǎn)畫清楚。第五章系統(tǒng)實(shí)現(xiàn)。這是最操蛋但最好寫的一章把關(guān)鍵頁面截圖貼上去配核心代碼片段說明實(shí)現(xiàn)邏輯。用什么技術(shù)就寫什么不要抄大段無意義的代碼。第六章系統(tǒng)測試。測試環(huán)境、測試用例表、測試結(jié)果和分析。每個功能模塊至少寫 5 條測試用例包含正常流程和異常流程比如提交未上傳附件的報(bào)銷單系統(tǒng)應(yīng)提示材料不完整。第七章總結(jié)與展望??偨Y(jié)系統(tǒng)完成的功能和不足展望未來的移動端版本或消息推送優(yōu)化。6.2 截圖、表格、ER 圖怎么準(zhǔn)備才能讓老師無話可說多的不說這幾條是我從答辯教室走出來以后才徹底想明白的截圖不要只在本地 IDEA 里截。把系統(tǒng)部署起來用瀏覽器訪問 8080 端口用真實(shí)流程走一遍再截圖。首頁、登錄頁、報(bào)銷申請頁、審核列表頁、統(tǒng)計(jì)頁每一張都要有清晰的數(shù)據(jù)展示。要注意的是頁面上別留測試數(shù)據(jù)123這種明顯敷衍的臟數(shù)據(jù)用一個聽上去真實(shí)的示例賬號比如2023501001 張三。數(shù)據(jù)表格要和系統(tǒng)截圖對應(yīng)論文里設(shè)計(jì)的字段如果頁面里看不到老師心里會嘀咕。ER 圖最好用專業(yè)工具Navicat 或者 PowerDesigner生成不要手畫。數(shù)據(jù)庫每個字段加注釋論文表結(jié)構(gòu)描述就能直接從注釋里抄。6.3 答辯前要背熟的三句話經(jīng)過幾十次模擬答辯我發(fā)現(xiàn)老師問來問去就那么幾個切入點(diǎn)提前準(zhǔn)備好標(biāo)準(zhǔn)回答比臨時翻筆記靠譜報(bào)銷比例怎么配置的——回答我設(shè)計(jì)了reimburse_rule規(guī)則表管理員在后臺可以動態(tài)調(diào)整起付線、報(bào)銷比例和封頂線計(jì)算時讀取生效規(guī)則并做快照所以規(guī)則變更不影響歷史報(bào)銷單。如果兩個審核員同時審核同一單怎么辦——回答我在數(shù)據(jù)庫表加了 version 字段采用樂觀鎖機(jī)制更新時校驗(yàn)版本號版本不一致就提示已被處理。系統(tǒng)安全性上做了什么——回答密碼使用 BCrypt 加密身份證號脫敏展示上傳文件做了類型和大小限制后臺接口按角色做了權(quán)限攔截。這三句話你要是能流暢地說出來至少能擋住 90% 的常規(guī)追問。我自己做完這個項(xiàng)目的最大體會是這類管理系統(tǒng)真正的交付物不止是一個能跑的 jar而是一套能講清楚業(yè)務(wù)閉環(huán)的邏輯。代碼只是把規(guī)則和流程固化成界面和接口論文只是把你踩過的坑和想清楚的方案記錄下來。先把業(yè)務(wù)當(dāng)業(yè)務(wù)來理解再去寫代碼整個項(xiàng)目就會順很多。最后分享一個實(shí)用小技巧在application-dev.yml里把日志級別調(diào)成debug只看 Hibernate/MyBatis 的 SQL 輸出。當(dāng)年我排查審核狀態(tài)不更新的問題就是靠日志發(fā)現(xiàn) UPDATE 語句根本沒帶 status 條件才修好的。多留一行 debug 日志少熬一夜。