實(shí)戰(zhàn):社區(qū)外來務(wù)工人員管理系統(tǒng)完整設(shè)計(jì)與部署指南)
做這類 SSM 畢設(shè)有個(gè)很現(xiàn)實(shí)的感受網(wǎng)上同名義的項(xiàng)目源碼一抓一大把但大多數(shù)人拿到手里并不能順利跑通、講清、過答辯?!吧鐓^(qū)外來務(wù)工人員管理系統(tǒng)”這個(gè)題目非常典型功能點(diǎn)落在人員信息登記、居住管理、就業(yè)跟蹤、服務(wù)申請(qǐng)上聽上去就是四組增刪改查但真正把角色權(quán)限、狀態(tài)流轉(zhuǎn)、到期提醒、數(shù)據(jù)關(guān)聯(lián)做完整并且能寫進(jìn)論文、部署給導(dǎo)師演示里面有不少容易被忽視的細(xì)節(jié)。我以自己實(shí)際做過、也幫人排查過這個(gè)項(xiàng)目為例把整個(gè)從設(shè)計(jì)到部署再到寫說明文檔的過程完整復(fù)盤一遍給正在選型、開題或者已經(jīng)下載了源碼卻跑不起來的同學(xué)一個(gè)能直接參考的實(shí)戰(zhàn)手冊(cè)。這套系統(tǒng)核心價(jià)值在于解決一個(gè)真實(shí)管理場(chǎng)景社區(qū)要掌握外來務(wù)工人員底數(shù)、居住狀態(tài)、就業(yè)變化和公共服務(wù)訴求。如果你的畢設(shè)只做一個(gè)“登記表維護(hù)頁面”那技術(shù)難度撐不起一篇合格的論文答辯也容易空洞。真正做扎實(shí)的是把“登記-居住-就業(yè)-服務(wù)”這條線串起來讓數(shù)據(jù)之間有因果關(guān)系比如一個(gè)人登記后關(guān)聯(lián)居住記錄居住到期提醒觸發(fā)服務(wù)專員回訪就業(yè)狀態(tài)變化產(chǎn)生新的臺(tái)賬申請(qǐng)服務(wù)后能追蹤辦理進(jìn)度。論文里能畫出這條業(yè)務(wù)閉環(huán)評(píng)審老師第一印象就會(huì)不一樣。1. 這類題目拿到手先想清楚要做什么1.1 項(xiàng)目定位與核心業(yè)務(wù)拆解這類社區(qū)管理系統(tǒng)不屬于高并發(fā)、高復(fù)雜度業(yè)務(wù)它更像一個(gè)多角色協(xié)作的 MIS管理信息系統(tǒng)。主干是外來務(wù)工人員的基礎(chǔ)信息臺(tái)賬圍繞臺(tái)賬延伸出四個(gè)業(yè)務(wù)分支。我在一開始就把核心用戶拆成了三類系統(tǒng)管理員、社區(qū)工作人員、務(wù)工人員本人在線訪問。三類角色看到的菜單和操作權(quán)限完全不同。管理員負(fù)責(zé)系統(tǒng)維護(hù)包括賬號(hào)管理、數(shù)據(jù)字典、系統(tǒng)參數(shù)配置以及全局?jǐn)?shù)據(jù)查看。社區(qū)工作人員是日常業(yè)務(wù)執(zhí)行者負(fù)責(zé)錄入人員信息、辦理居住登記、更新就業(yè)狀態(tài)、受理服務(wù)申請(qǐng)。務(wù)工人員則主要通過系統(tǒng)查詢自己的登記狀態(tài)、居住到期時(shí)間、申請(qǐng)服務(wù)并查看辦理進(jìn)度。聽上去不難但一旦沒有做角色區(qū)分教務(wù)審核時(shí)就會(huì)質(zhì)疑“你這個(gè)系統(tǒng)為什么所有人都能刪數(shù)據(jù)”這是很多源碼里存在的通病。四大業(yè)務(wù)模塊的功能邊界我也重新理了一遍人員信息登記模塊不是單獨(dú)的表單它承擔(dān)“建檔”職責(zé)需要支撐重復(fù)人檢測(cè)、證件校驗(yàn)和基礎(chǔ)字段補(bǔ)全居住管理模塊除了登記居住地址還要接上到期時(shí)間提醒和地址變更記錄就業(yè)跟蹤模塊維護(hù)務(wù)工人員的就業(yè)狀態(tài)變化歷程例如待業(yè)、試用期、穩(wěn)定就業(yè)、離職再就業(yè)形成一個(gè)可回溯的臺(tái)賬服務(wù)申請(qǐng)模塊則更接近一個(gè)小型工單系統(tǒng)從申請(qǐng)人提交、工作人員審核、辦理、辦結(jié)到申請(qǐng)人確認(rèn)每一步都要留下狀態(tài)和時(shí)間。1.2 為什么這樣設(shè)計(jì)業(yè)務(wù)更合理順著上面說的業(yè)務(wù)分支數(shù)據(jù)之間形成引用鏈。登記表是主表居住和就業(yè)都是可以一對(duì)多展開的子記錄服務(wù)申請(qǐng)則要掛著登記人 ID 和辦理狀態(tài)。我之所以采用“主數(shù)據(jù) 行為流水 服務(wù)工單”而不是把全部信息揉進(jìn)一張大表原因有兩個(gè)一是避免字段冗余一個(gè)人如果換過兩次住址、換過三次工作一張表根本沒法清晰體現(xiàn)歷史軌跡二是后續(xù)論文寫系統(tǒng)設(shè)計(jì)時(shí)ER 圖和數(shù)據(jù)庫表設(shè)計(jì)都會(huì)非常順暢評(píng)審能一眼看出你是在“設(shè)計(jì)系統(tǒng)”而不是在做“電子表格錄入工具”。三權(quán)分立的角色也很自然地形成權(quán)限控制需求。實(shí)際編碼時(shí)我用攔截器統(tǒng)一控制 Session再通過菜單權(quán)限表控制頁面顯示和請(qǐng)求訪問后端 Controller 入口再做一次校驗(yàn)例如只有 ROLE_ADMIN 才能調(diào)用賬號(hào)刪除接口。這類權(quán)限設(shè)計(jì)并不復(fù)雜但用文字寫進(jìn)論文“系統(tǒng)安全設(shè)計(jì)”章節(jié)非常出效果。業(yè)務(wù)流程上我建議畫出這樣一條主線外來務(wù)工人員到社區(qū)后先登記建檔工作人員為他在系統(tǒng)里創(chuàng)建居住記錄并設(shè)置到期日期系統(tǒng)在到期前自動(dòng)提醒工作人員核實(shí)更新就業(yè)模塊根據(jù)務(wù)工人員反饋持續(xù)更新就業(yè)狀態(tài)當(dāng)其提交培訓(xùn)、法律咨詢、子女入學(xué)咨詢等需求時(shí)服務(wù)申請(qǐng)模塊進(jìn)入工單受理流程。至此每個(gè)模塊不再是孤立功能點(diǎn)而是完整的業(yè)務(wù)協(xié)同邏輯。2. 技術(shù)選型為什么是 SSM這些關(guān)鍵點(diǎn)必須吃透2.1 SSM 三件套的職責(zé)分工系統(tǒng)使用 SSM也就是 Spring SpringMVC MyBatis這在老一代企業(yè)項(xiàng)目中非常主流。Spring 作為容器管理 Service、Mapper 等 Bean 的生命周期和依賴關(guān)系SpringMVC 負(fù)責(zé)接收前端請(qǐng)求、路由到 Controller、返回 JSP 視圖MyBatis 負(fù)責(zé)把 Java 對(duì)象和 SQL 映射起來靈活控制持久層查詢。我實(shí)際編碼時(shí)最直觀的感受是MyBatis 的 SQL 由自己寫所以復(fù)雜統(tǒng)計(jì)非常好控制。比如居住到期提醒列表我可以直接寫一段 SQL 判斷DATEDIFF(end_date, CURDATE())在 0 到 30 天之間的記錄就業(yè)臺(tái)賬里統(tǒng)計(jì)當(dāng)前待業(yè)人數(shù)只需要一條GROUP BY status就能拿到聚合結(jié)果。相比 Hibernate 全自動(dòng) ORMMyBatis 這種方式在畢設(shè)場(chǎng)景下更直白論文里寫“通過自定義 SQL 實(shí)現(xiàn)業(yè)務(wù)統(tǒng)計(jì)”也更有說服力。如果用 JSP Servlet 裸寫所有請(qǐng)求轉(zhuǎn)發(fā)和參數(shù)獲取都要手工處理代碼會(huì)很散亂且難維護(hù)。如果是 Spring Boot對(duì)快速開發(fā)確實(shí)更友好但與部分高校的教學(xué)大綱和大綱模板不完全匹配很多學(xué)校題目仍然明確要求 SSM。做這類畢設(shè)前要先確認(rèn)題目要求如果題目指定了 SSM就盡量使用 SSM 技術(shù)棧而不是自作主張?zhí)鎿Q否則論文技術(shù)路線和任務(wù)書對(duì)不上會(huì)給評(píng)審留下很大扣分點(diǎn)。2.2 核心數(shù)據(jù)表設(shè)計(jì)與關(guān)聯(lián)關(guān)系數(shù)據(jù)庫是這類系統(tǒng)的地基設(shè)計(jì)得清晰能幫你省下至少一半時(shí)間。我以實(shí)際項(xiàng)目表結(jié)構(gòu)為例核心表大致如下表名用途關(guān)鍵字段sys_user系統(tǒng)用戶賬號(hào)id、username、password、role_type、statusmigrant_info務(wù)工人員登記主表id、name、id_card、gender、origin_place、phone、register_timeresident_record居住記錄表id、migrant_id、address、house_owner、start_date、end_date、statusemployment_record就業(yè)記錄表id、migrant_id、company_name、position、job_status、start_date、update_timeservice_apply服務(wù)申請(qǐng)表id、migrant_id、service_type、content、status、operator_id、apply_timenotice_info通知公告id、title、content、publish_time設(shè)計(jì)時(shí)我加了幾個(gè)對(duì)實(shí)際業(yè)務(wù)和論文都很重要的細(xì)節(jié)。第一個(gè)是軟刪除字段deleted默認(rèn)值為 0刪除時(shí)執(zhí)行UPDATE ... SET deleted 1 WHERE id ?而不是物理刪除這樣記錄還能留著做統(tǒng)計(jì)也符合真實(shí)管理系統(tǒng)中檔案留痕的需求。第二個(gè)是冗余字段比如登記主表保留current_address和employment_status方便首頁統(tǒng)計(jì)和列表展示時(shí)直接取主表數(shù)據(jù)避免每次連表查詢同時(shí)把歷史變化放到子表里兩套數(shù)據(jù)互補(bǔ)這是“空間換時(shí)間”的典型做法。第三個(gè)是create_time和update_time所有業(yè)務(wù)表都標(biāo)配在論文測(cè)試填寫時(shí)能體現(xiàn)數(shù)據(jù)變動(dòng)的時(shí)間線。雖然只是畢設(shè)項(xiàng)目我還是給身份證字段加了唯一索引并在 Service 層做了查重。因?yàn)樵谡鎸?shí)社區(qū)錄入場(chǎng)景中錄錯(cuò)重復(fù)底賬是最忌諱的事。這段寫在數(shù)據(jù)庫設(shè)計(jì)章節(jié)里相當(dāng)加分說明你考慮到了數(shù)據(jù)的準(zhǔn)確性和一致性。2.3 前端頁面組織與目錄規(guī)劃SSM 項(xiàng)目前端常用 JSP但 JSP 不應(yīng)該直接放在webapp根目錄讓用戶繞過 Controller 直接訪問。正確做法是放在WEB-INF/jsp目錄下頁面都通過 Controller 返回視圖名稱進(jìn)行跳轉(zhuǎn)這樣既保證訪問受控也能通過 MVC 流程攜帶模型數(shù)據(jù)。目錄規(guī)劃上我建議按controller / service / mapper / entity / common / interceptor分層。entity只放實(shí)體類service層寫業(yè)務(wù)邏輯controller層只做參數(shù)接收、調(diào)用服務(wù)和視圖跳轉(zhuǎn)。有人為省事把查詢寫在 Controller 里一兩頁尚可四個(gè)模塊幾十個(gè)功能會(huì)迅速失控后面寫代碼時(shí)每改一個(gè) Query 都要搜索所有 Controller 才能定位那是災(zāi)難。論文里畫架構(gòu)分層圖時(shí)也更清晰直接對(duì)照你的包結(jié)構(gòu)表現(xiàn)層、業(yè)務(wù)層、持久層一目了然。3. 核心功能怎么實(shí)現(xiàn)我踩過的坑都在這3.1 登錄會(huì)話與權(quán)限攔截訪問控制的實(shí)現(xiàn)邏輯是用戶登錄前只能訪問登錄頁和公開靜態(tài)資源登錄成功后把用戶對(duì)象和角色放入 Session寫一個(gè)HandlerInterceptor攔截未登錄請(qǐng)求同時(shí)區(qū)分不同角色可以進(jìn)入哪些 Controller。我在這里踩了一個(gè)比較隱蔽的坑攔截器里只判斷了“是否登錄”沒有判斷“角色是否匹配”結(jié)果測(cè)試時(shí)用普通賬號(hào)直接輸入管理員的 URL 路徑也能打開頁面。后來加強(qiáng)判斷在攔截器里取出當(dāng)前用戶角色再和請(qǐng)求路徑前綴例如/admin/、/staff/、/migrant/比對(duì)不匹配就返回 403 頁面。這個(gè)看似小的問題寫進(jìn)論文“系統(tǒng)安全性和權(quán)限控制”模塊內(nèi)容就扎實(shí)了。密碼存儲(chǔ)不建議明文入庫。雖然這是畢設(shè)但評(píng)審中經(jīng)常有老師問“用戶密碼如何保護(hù)”。我用 MD5 再拼接隨機(jī)鹽值后入庫登錄時(shí)先按用戶名查出鹽值再拼接比對(duì)。嚴(yán)格來說 MD5 不夠強(qiáng)更合理的是 BCrypt但在傳統(tǒng) SSM 項(xiàng)目中引入 shiro 或 spring-security 又會(huì)讓代碼復(fù)雜度上升。我的建議是如果只按課程要求使用 SSM至少做到 MD5 鹽處理論文里說明“為降低彩虹表碰撞風(fēng)險(xiǎn)對(duì)密碼進(jìn)行加鹽散列”比明文密碼要完整得多。3.2 人員登記模塊的查重與分頁登記功能表面是表單插入但有兩個(gè)小功能別忽略身份證查重和列表分頁。查重我放在 Service 層來做插入前通過身份證查詢主表存在則返回提示讓用戶選擇是否繼續(xù)辦理“重復(fù)建檔”避免同一人員被多次錄入。這樣不僅在功能上嚴(yán)謹(jǐn)也為演示時(shí)制造“錄入重復(fù)會(huì)彈提示”的講解亮點(diǎn)。分頁建議引入 PageHelper 插件。引入后只需在查詢前執(zhí)行PageHelper.startPage(pageNum, pageSize)查詢后把結(jié)果封裝成PageInfo傳到頁面就可以顯示頁碼條、總記錄數(shù)、當(dāng)前頁數(shù)等信息。我試過手寫 LIMIT 再加 count 查詢代碼量和邊界判斷都多出不少PageHelper 能自動(dòng)攔截 SQL 生成 limit 和 counting在 MyBatis 里對(duì)接也順滑。要注意不同版本 PageHelper 和 MyBatis 的兼容問題我的項(xiàng)目里使用了穩(wěn)定版本組合如果啟動(dòng)出現(xiàn)PageHelper異常優(yōu)先檢查版本一致性和mybatis-config.xml中的插件配置。批量導(dǎo)入也比較常見。畢業(yè)設(shè)計(jì)如果使用 Apache POI 可以讀取 Excel 文件逐行插入文件上傳用 CommonsMultipartResolver 處理。這里最煩的是 Excel 單元格類型身份證列會(huì)被讀成科學(xué)計(jì)數(shù)法或末尾 00。解決辦法是統(tǒng)一以字符串方式讀取單元格遇到 NumericCellValue 再轉(zhuǎn)換為字符串并保證格式完整。這段作為“系統(tǒng)特色功能”寫進(jìn)論文會(huì)比較討喜。3.3 居住登記與到期提醒邏輯居住管理模塊建議至少包含兩個(gè)子功能居住登記/地址變更記錄、居住到期提醒列表。一張居住登記記錄要記錄詳情、居住地址、房東聯(lián)系方式和起止日期。登記人員一旦變更地址不應(yīng)直接刪除舊記錄而應(yīng)把舊記錄標(biāo)記為“已遷出”再新增一條“在住”記錄保留該人員的居住軌跡。到期提醒實(shí)現(xiàn)有兩種常見方案。第一種是定時(shí)掃描任務(wù)例如使用 Spring 的Scheduled每天凌晨執(zhí)行一次把結(jié)束日期在當(dāng)天之后三十天內(nèi)且狀態(tài)為“在住”的記錄統(tǒng)一收進(jìn)提醒表或直接生成通知。第二種是頁面上做一個(gè)動(dòng)態(tài)條件查詢打開居住管理頁面時(shí)自動(dòng)篩選“30 天內(nèi)即將到期”的記錄并高亮顯示。我兩個(gè)方案都做了前者用于給工作人員發(fā)送待辦提醒后者用于頁面展示配合起來邏輯很順。時(shí)間字段處理容易踩坑數(shù)據(jù)庫DATE類型傳給 Java 實(shí)體建議使用java.util.Date或者用java.time.LocalDate配合 MyBatis typeHandler直接用String雖然省事但比較日期范圍時(shí)需要額外轉(zhuǎn)換容易出格式問題。我在項(xiàng)目中使用LocalDate配合 Jackson 的日期格式化寫入返回結(jié)果時(shí)統(tǒng)一yyyy-MM-dd格式頁面展示不會(huì)帶著難看的時(shí)分秒。3.4 就業(yè)跟蹤臺(tái)賬怎樣才不算“過度設(shè)計(jì)”就業(yè)跟蹤模塊容易走向兩個(gè)誤區(qū)一是做成一個(gè)簡(jiǎn)單單選字段選一下就完事二是拼命加復(fù)雜功能弄出一套獵頭招聘系統(tǒng)。對(duì)它比較合適的定位是“狀態(tài)記錄 回訪記錄”。務(wù)工人員就業(yè)狀態(tài)設(shè)置為待業(yè)、求職中、試用期、穩(wěn)定就業(yè)、離職狀態(tài)變更時(shí)形成一條就業(yè)記錄并且每次回訪后可補(bǔ)充備注。我在這個(gè)模塊里加了一個(gè)看板統(tǒng)計(jì)功能按狀態(tài)數(shù)量展示在首頁例如當(dāng)前待業(yè)人員人數(shù)、本周新增登記人數(shù)、本月推薦就業(yè)人數(shù)。這些都是簡(jiǎn)單的聚合查詢但頁面效果看起來非常豐滿導(dǎo)師在演示視頻中會(huì)很容易被這種數(shù)據(jù)圖表類頁面吸引。前提是提前栽入一批合理的模擬數(shù)據(jù)演示時(shí)圖表有內(nèi)容而不是空蕩蕩的零值。就業(yè)記錄與登記主表的關(guān)聯(lián)不能丟。每次新增就業(yè)記錄時(shí)必須攜帶migrant_id新增完成后回寫主表的employment_status這樣主表列表頁直接顯示每個(gè)人當(dāng)前就業(yè)狀態(tài)點(diǎn)進(jìn)去又能看到所有歷史記錄。這個(gè)更新邏輯放在同一個(gè) Service 事務(wù)里避免主表狀態(tài)與子表記錄不一致。3.5 服務(wù)申請(qǐng)的狀態(tài)機(jī)流轉(zhuǎn)服務(wù)申請(qǐng)是最能體現(xiàn)邏輯意識(shí)的部分。我把流程狀態(tài)設(shè)置為待受理、審核中、已辦理、已辦結(jié)、已駁回。狀態(tài)推進(jìn)有明確規(guī)則待受理只能流轉(zhuǎn)為審核中或已駁回審核中流轉(zhuǎn)為已辦理已辦理由申請(qǐng)人確認(rèn)后成為已辦結(jié)。不允許跳狀態(tài)刪除也要有約束例如已經(jīng)“已辦理”的業(yè)務(wù)不能直接物理刪除。實(shí)現(xiàn)這種狀態(tài)流轉(zhuǎn)不復(fù)雜Service 層方法接收當(dāng)前狀態(tài)和目標(biāo)狀態(tài)用 if 或 switch 校驗(yàn)允許的轉(zhuǎn)換方向。該設(shè)計(jì)放在論文“系統(tǒng)設(shè)計(jì)”里非常好寫——“服務(wù)申請(qǐng)模塊基于有限狀態(tài)機(jī)實(shí)現(xiàn)流程控制”這是能體現(xiàn)業(yè)務(wù)建模能力的一句話。同時(shí)每次狀態(tài)變更應(yīng)該寫入operation_log表記錄操作人、操作時(shí)間和操作內(nèi)容。一方面方便管理員追溯另一方面在論文測(cè)試部分可以被當(dāng)作功能測(cè)試的依據(jù)。實(shí)際編碼就是用一個(gè)切面日志或者手動(dòng)在 Service 方法里調(diào)用日志組件不必引入龐大的日志框架一張日志表就行。4. 部署是源碼能否跑通的分水嶺4.1 從零到本地跑通需要準(zhǔn)備什么不少人下載源碼后卡在環(huán)境配置上。我按自己多次部署的經(jīng)驗(yàn)給出一個(gè)能穩(wěn)定跑通的組合JDK 8、Maven 3.6.3、MySQL 5.7如果使用 MySQL 8要同步換數(shù)據(jù)庫驅(qū)動(dòng)版本而且指定時(shí)區(qū)參數(shù)、Tomcat 8.5。這些版本與多數(shù) SSM 教學(xué)項(xiàng)目兼容性最高。部署流程大致是先在本機(jī)安裝并配置環(huán)境和 MySQL然后創(chuàng)建數(shù)據(jù)庫執(zhí)行項(xiàng)目提供的init.sql腳本腳本通常會(huì)建庫、建表并插入管理員賬號(hào)接著打開 IDEA以 Maven 項(xiàng)目方式導(dǎo)入源碼等待依賴下載完成再修改數(shù)據(jù)庫配置文件jdbc.properties把url、username、password改成自己的值最后配置 Tomcat將項(xiàng)目打包部署到 Tomcat 并啟動(dòng)。如果你想把項(xiàng)目部署到 Tomcat 的webapps目錄也可以通過 Maven 執(zhí)行clean package打出.war包再丟到 Tomcat 下修改server.xml或直接通過管理器自動(dòng)展開。后者無需 IDEA 也能部署適合錄制部署視頻時(shí)展示。4.2 部署最常見的五個(gè)報(bào)錯(cuò)原因第一個(gè)是數(shù)據(jù)庫連接失敗。報(bào)錯(cuò)多為Access denied for user或者Connection refused。前者是賬號(hào)密碼錯(cuò)誤或權(quán)限未授權(quán)后者是數(shù)據(jù)庫服務(wù)沒啟動(dòng)、端口不是 3306 或 MySQL 8 的時(shí)區(qū)問題。連接 MySQL 8 時(shí)在 JDBC URL 中加上serverTimezoneAsia/Shanghai驅(qū)動(dòng)類也調(diào)整為com.mysql.cj.jdbc.Driver。第二個(gè)是靜態(tài)資源加載不出來。登錄頁 CSS、JS 全部失效問題多半出在 SpringMVC 的攔截配置攔截了靜態(tài)資源。解決辦法是配置mvc:resources mapping/static/** location/static//或開啟mvc:default-servlet-handler/。這一步做不好頁面就會(huì)很像“裸奔的 HTML”。第三個(gè)是 Maven 依賴沒有完全下載。啟動(dòng)時(shí)提示ClassNotFound、NoClassDefFoundError、BeanCreationException基本都和依賴缺失或沖突有關(guān)。先嘗試mvn clean再mvn install然后reimport刷新持續(xù)報(bào)錯(cuò)時(shí)檢查網(wǎng)絡(luò)可以換成國(guó)內(nèi)鏡像倉庫徹底干凈下載。第四個(gè)是 Tomcat 端口沖突。報(bào)錯(cuò)Port 8080 required by Tomcat... is already in use要么改 Tomcat 端口要么結(jié)束占用進(jìn)程。演示視頻最好提前把 8080 空出來不然現(xiàn)場(chǎng)演示時(shí)很尷尬。第五個(gè)是 JSP 編譯或啟動(dòng)報(bào)錯(cuò)頁面顯示 500。常見原因是 JDK 版本太高老項(xiàng)目中的javax.servlet相關(guān)包在 JDK 11 或 17 下可能會(huì)有編譯兼容問題。我直接用 JDK 8 部署后消失如果非要在高版本 JDK 跑需要補(bǔ)充對(duì)應(yīng) servlet-api 依賴。4.3 首次啟動(dòng)成功后建議做的數(shù)據(jù)初始化能打開登錄頁只是第一步。正式錄演示視頻之前建議先準(zhǔn)備一批合理的數(shù)據(jù)。至少包含 20 條以上外來務(wù)工人員記錄其中要覆蓋不同來源省份、不同就業(yè)狀態(tài)包含 10 條居住有效期不同的居住記錄其中 3 至 5 條在一個(gè)月內(nèi)到期包含 2 條處于“待受理”狀態(tài)的服務(wù)申請(qǐng)記錄。這樣演示時(shí)點(diǎn)開到期提醒列表有紅色高亮數(shù)據(jù)點(diǎn)開服務(wù)列表可以現(xiàn)場(chǎng)操作一次完整狀態(tài)流轉(zhuǎn)頁面不會(huì)顯得空洞。數(shù)據(jù)不能亂編。姓名對(duì)應(yīng)身份證號(hào)要符合出生日期邏輯地址、工作單位、申請(qǐng)事項(xiàng)要符合社區(qū)語境。一張亂數(shù)據(jù)的截圖傳到論文里會(huì)被評(píng)審一眼看穿反而影響印象分。5. 說明文檔內(nèi)容與答辯準(zhǔn)備的實(shí)操心得5.1 論文或設(shè)計(jì)說明文檔怎么組織才扣題這類畢設(shè)配套的說明文檔常見結(jié)構(gòu)分為緒論、相關(guān)技術(shù)介紹、需求分析、系統(tǒng)設(shè)計(jì)、系統(tǒng)實(shí)現(xiàn)、系統(tǒng)測(cè)試、總結(jié)與展望。緒論里重點(diǎn)寫項(xiàng)目背景意義和國(guó)內(nèi)外現(xiàn)狀不要大段直接復(fù)制寫清楚“為什么需要該系統(tǒng)”“同類系統(tǒng)有什么不足”即可。需求分析用功能用例、用例描述表、非功能需求安全性、響應(yīng)性能、易用性來寫對(duì)應(yīng)本系統(tǒng)的角色和功能模塊逐條展開。系統(tǒng)設(shè)計(jì)章節(jié)則圍繞總體架構(gòu)、功能結(jié)構(gòu)、數(shù)據(jù)庫設(shè)計(jì)進(jìn)行。數(shù)據(jù)庫部分除了表結(jié)構(gòu)字段列表最好專門用一個(gè)小節(jié)分析表與表之間的引用關(guān)系和約束設(shè)計(jì)例如外來務(wù)工人員與居住記錄一對(duì)多應(yīng)用服務(wù)申請(qǐng)表與用戶表外鍵關(guān)聯(lián)。章節(jié)寫清楚這部分后系統(tǒng)實(shí)現(xiàn)章節(jié)里的每個(gè)功能頁面就可以按“頁面效果 核心代碼片段 代碼邏輯說明”的三段式套用既整潔又不會(huì)寫到一半沒詞。有一個(gè)非常加分的做法每實(shí)現(xiàn)一個(gè)重要功能立即截圖并且給圖配上編號(hào)和簡(jiǎn)明說明例如“圖 4-3 居住到期提醒列表頁面”“圖 5-1 服務(wù)申請(qǐng)狀態(tài)流轉(zhuǎn)時(shí)序示意”。論文寫作最怕最后再補(bǔ)圖尤其頁面結(jié)構(gòu)調(diào)整后截圖全要重來那時(shí)候時(shí)間完全不夠。5.2 評(píng)審老師喜歡問哪些問題我遇到過的高頻問題集中在四個(gè)方面。第一類是角色權(quán)限怎么防止一個(gè)普通務(wù)工人員訪問管理員頁回答思路是攔截器控制所有非登錄請(qǐng)求并校驗(yàn)角色與訪問路徑也就是前文實(shí)現(xiàn)的邏輯。第二類是狀態(tài)設(shè)計(jì)為什么服務(wù)申請(qǐng)必須按流程流轉(zhuǎn)而不允許任意修改回答可以從業(yè)務(wù)流程約束和數(shù)據(jù)可追溯性入手。第三類是查詢性能登記表數(shù)據(jù)量變大后如何提高查詢速度用主鍵索引、身份證唯一索引、狀態(tài)列普通索引、分頁查詢來回答必要時(shí)給一段EXPLAIN驗(yàn)證的結(jié)論。第四類是技術(shù)選型為什么選擇 MyBatis 而不是 Hibernate重點(diǎn)說對(duì)復(fù)雜 SQL、多表統(tǒng)計(jì)更可控SQL 優(yōu)化空間更大即可。提前準(zhǔn)備一些實(shí)際截圖和 SQL 腳本現(xiàn)場(chǎng)演示時(shí)一旦遇到環(huán)境問題也可以直接展示代碼和測(cè)試結(jié)果不至于冷場(chǎng)。5.3 演示視頻錄制的技巧一個(gè)完整的演示視頻時(shí)間最好控制在 6 到 12 分鐘。開頭簡(jiǎn)要說明項(xiàng)目背景和開發(fā)工具依次演示管理員登錄、人員登記新增與查重、居住登記與到期提醒、就業(yè)狀態(tài)更新、服務(wù)申請(qǐng)狀態(tài)流轉(zhuǎn)、數(shù)據(jù)統(tǒng)計(jì)頁面共六步。不要對(duì)著代碼錄要對(duì)著頁面操作重點(diǎn)讓觀看者看到業(yè)務(wù)流程閉環(huán)。錄制前先把瀏覽器窗口比例調(diào)好字體放大不要讓視頻對(duì)方看到模糊的小字。操作時(shí)放慢鼠標(biāo)移動(dòng)速度一次只做一個(gè)動(dòng)作并在重點(diǎn)位置稍微停頓講解一句“這里是通過狀態(tài)判斷來更新列表的”。我自己的經(jīng)驗(yàn)是提前把演示腳本打印在 A4 紙上錄的時(shí)候不會(huì)思路中斷。關(guān)于部署說明我強(qiáng)烈建議寫一份README放項(xiàng)目根目錄內(nèi)容包括環(huán)境版本、數(shù)據(jù)庫初始化步驟、配置文件修改位置、管理員初始賬號(hào)、啟動(dòng)順序和常見問題。這對(duì)一周后重新回看代碼的你同樣有價(jià)值更別說答辯演示現(xiàn)場(chǎng)需要開新環(huán)境時(shí)有一份清晰的部署步驟等于救命稻草。6. 我實(shí)際使用這套方案后的一些體會(huì)如果讓我把整個(gè)項(xiàng)目的開發(fā)濃縮成一句話那就是利用有限的時(shí)間把業(yè)務(wù)邊界定義好把數(shù)據(jù)狀態(tài)流轉(zhuǎn)關(guān)系做好把技術(shù)方案落實(shí)到每一個(gè)模塊而不是追求框架有多新、頁面有多么炫。SSM 看似傳統(tǒng)但正因?yàn)閭鹘y(tǒng)你能更清晰地理解 MVC 各層之間的關(guān)系也能在論文和答辯中把每一處設(shè)計(jì)依據(jù)講得有頭有尾。真正幫我完成這個(gè)項(xiàng)目的不是花哨的代碼技巧而是反復(fù)打磨四個(gè)模塊之間的聯(lián)動(dòng)。當(dāng)我把“居住到期提醒”“就業(yè)狀態(tài)更新”“服務(wù)申請(qǐng)狀態(tài)日志”這三件事通過數(shù)據(jù)表關(guān)聯(lián)和 Service 事務(wù)串起來后系統(tǒng)才從一堆頁面變成一個(gè)可以被稱作“管理系統(tǒng)”的整體。后來的演示視頻錄制、文字內(nèi)容整理、填報(bào)答辯材料都是水到渠成的事情。最后建議準(zhǔn)備這個(gè)題目的同學(xué)不要把精力浪費(fèi)在糾結(jié)“哪個(gè)框架更好”上面先把業(yè)務(wù)閉環(huán)走通把環(huán)境部署跑順再回頭把文檔補(bǔ)全。只要你這幾條線是通的無論誰來驗(yàn)收你都能有底氣地說這個(gè)系統(tǒng)該有的邏輯都在能跑、能講、能演示。