務管理系統(tǒng)設計與實現(xiàn))
這次我們來看一個很典型的 Java 畢業(yè)設計項目基于 SSM 框架的資產評估業(yè)務管理系統(tǒng)。這類系統(tǒng)在高校畢業(yè)設計里出現(xiàn)頻率很高原因是它把 SSM 開發(fā)的核心鏈路完整串起來了Spring 負責對象管理SpringMVC 負責請求分發(fā)MyBatis 負責數(shù)據(jù)庫操作前端再配合 JSP、Bootstrap 渲染頁面。技術棧很基礎但業(yè)務模型足夠寫清楚數(shù)據(jù)庫設計、權限控制和多角色操作流程適合用來做畢設初版也適合剛學完 JavaWeb 的同學拿來練手。這個資產評估業(yè)務管理系統(tǒng)本質上是一個圍繞“資產信息錄入 - 評估項目立項 - 評估人員作業(yè) - 評估報告生成”的業(yè)務流轉系統(tǒng)。相比普通的增刪改查它的業(yè)務鏈更長涉及用戶、資產、項目、機構、報告多張表所以比“圖書管理”“學生管理”這類項目更有內容可寫也更能體現(xiàn)你對數(shù)據(jù)庫設計和項目結構的理解。本文會從項目定位、環(huán)境準備、架構設計、數(shù)據(jù)庫設計、核心代碼實現(xiàn)、部署啟動、功能測試和問題排查這幾個維度完整講一遍最后給出幾個適合寫進論文的改進方向。如果你正在選畢設題目或者想找一個 SSM 項目邊讀邊改建議先收藏再跟著下面的步驟把系統(tǒng)結構過一遍。1. 核心能力速覽項目項說明項目類型Java Web 畢業(yè)設計 / SSM 框架整合項目技術棧Spring SpringMVC MyBatis MySQL Maven Tomcat前端方案JSP Bootstrap / Layui可選 Vue3 前后端分離改造開發(fā)工具IntelliJ IDEA、Navicat、Postman核心業(yè)務資產信息管理、評估項目管理、評估機構管理、評估報告管理、用戶權限管理數(shù)據(jù)庫MySQL 5.7 / 8.0部署方式Maven 打 war 包部署到 Tomcat 8.5適合人群Java 學習者、計算機專業(yè)畢設學生、SSM 入門開發(fā)者擴展方向Spring Boot 改造、Vue 前后端分離、Excel 導入導出、Shiro/JWT 權限增強從表格能看出來這個項目的定位不是一個商業(yè)級系統(tǒng)而是一個“結構完整、能跑通、能講清楚”的教學型系統(tǒng)。它的優(yōu)點是你不需要太多高深知識把 SSM 的三層架構理解熟就能把整個項目吃透缺點是你如果只做純增刪改查答辯時容易顯得單薄所以后面要重點把業(yè)務流轉和統(tǒng)計報表說清楚。2. 適用場景與使用邊界這個系統(tǒng)適合三個場景。第一種是畢業(yè)設計參考。資產評估行業(yè)本身有明確的業(yè)務對象系統(tǒng)里可以用“評估項目編號 委托人 評估機構 評估報告”這幾個核心字段把業(yè)務串起來寫論文的時候“需求分析”“數(shù)據(jù)庫設計”“系統(tǒng)實現(xiàn)”三章都有實際內容支撐。第二種是 SSM 框架學習。如果你想練習 SpringMVC 的注解開發(fā)、MyBatis 的動態(tài) SQL、攔截器做登錄校驗這個系統(tǒng)提供了比較完整的代碼層次比零散寫 demo 更有價值。第三種是課程設計改造。把頁面精簡一下業(yè)務字段換成其他行業(yè)比如“設備管理系統(tǒng)”“房屋評估系統(tǒng)”改造成本不高。同時也要說清楚邊界這不是一個生產環(huán)境可以直接用的資產評估平臺因為真正的評估業(yè)務涉及估價模型、法律法規(guī)、報告合規(guī)審核這些不是普通畢設系統(tǒng)能覆蓋的。另外如果你是直接用別人開源的畢設源碼一定要注意學術誠信論文要寫自己對系統(tǒng)的理解代碼要能在本地跑通并說清楚每一層的作用否則答辯時一問就暴露了。建議參考源碼的結構然后自己重新建表、重寫核心模塊這樣才能真正掌握。3. 開發(fā)環(huán)境準備在開始搭建項目之前先確認電腦上的基礎環(huán)境。下面是推薦版本盡量保持一致減少踩坑概率。3.1 基礎軟件清單軟件推薦版本說明JDKJDK 1.8SSM 項目最穩(wěn)定避免用 JDK 17 出現(xiàn)兼容問題Maven3.6.3統(tǒng)一管理依賴MySQL5.7 或 8.0建庫時注意字符集 utf8mb4TomcatTomcat 8.5對應 Servlet 3.1匹配 SpringMVCIDEA2020.3 以上社區(qū)版或旗艦版都可以3.2 環(huán)境變量配置Windows 下安裝完 JDK 和 Maven需要配置環(huán)境變量否則 IDEA 里會提示找不到 Java 或 Maven。# JDK 環(huán)境變量 JAVA_HOME C:\Program Files\Java\jdk1.8.0_202 Path 追加 %JAVA_HOME%\bin # Maven 環(huán)境變量 MAVEN_HOME D:\apache-maven-3.6.3 Path 追加 %MAVEN_HOME%\bin配置完成后在命令行執(zhí)行java -version和mvn -v能正常輸出版本信息就說明環(huán)境沒問題。3.3 數(shù)據(jù)庫準備在 MySQL 中創(chuàng)建數(shù)據(jù)庫字符集選擇utf8mb4排序規(guī)則選擇utf8mb4_general_ci。CREATE DATABASE IF NOT EXISTS asset_assess DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; USE asset_assess;后續(xù)把所有建表 SQL 放到asset_assess.sql腳本里通過 Navicat 或命令行一次性導入。3.4 IDEA 中的 Maven 設置打開 IDEA進入File - Settings - Maven把 Maven home directory 指向本機的 Maven 目錄將settings.xml中的本地倉庫路徑配置好最好再配置阿里的鏡像加快依賴下載速度。這里給出settings.xml里的鏡像片段mirror idaliyunmaven/id mirrorOf*/mirrorOf name阿里云公共倉庫/name urlhttps://maven.aliyun.com/repository/public/url /mirror4. 系統(tǒng)總體設計4.1 技術架構分層整個系統(tǒng)采用經典 SSM 三層架構再加上 Controller 層和 View 層。調用順序是JSP 頁面發(fā)起請求 - SpringMVC Controller 接收 - Service 處理業(yè)務 - MyBatis Mapper 訪問 MySQL返回結果再逆向回到頁面。這種分層最大的好處是職責分離每一層只做自己的事。Controller 不做數(shù)據(jù)庫操作Service 里不放頁面跳轉邏輯Mapper 只寫 SQL這樣后面改需求的時候改動范圍可以控制在一個模塊內。4.2 功能模塊設計資產評估業(yè)務管理系統(tǒng)按角色來分通常包含以下模塊模塊功能說明登錄與用戶管理管理員登錄、用戶增刪改查、密碼 MD5 加密資產信息管理資產基本信息的添加、修改、刪除、分頁查詢評估項目管理創(chuàng)建評估項目、指派評估機構、維護項目狀態(tài)評估機構管理機構信息維護項目分配時關聯(lián)機構評估報告管理報告上傳、報告審核狀態(tài)、報告下載數(shù)據(jù)統(tǒng)計按資產類別和項目月份統(tǒng)計數(shù)量用于首頁圖表展示4.3 數(shù)據(jù)庫表設計這是整個項目最值得寫的部分。我給出一個合理的表結構設計字段可以根據(jù)自己的業(yè)務繼續(xù)補充。第一張表是用戶表保存系統(tǒng)登錄用戶信息CREATE TABLE sys_user ( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) NOT NULL UNIQUE, password VARCHAR(100) NOT NULL, real_name VARCHAR(50), role VARCHAR(20) DEFAULT ADMIN, phone VARCHAR(20), status INT DEFAULT 1, create_time DATETIME DEFAULT CURRENT_TIMESTAMP );第二張表是資產信息表保存被評估資產的詳細數(shù)據(jù)CREATE TABLE asset_info ( id INT PRIMARY KEY AUTO_INCREMENT, asset_code VARCHAR(50) NOT NULL UNIQUE, asset_name VARCHAR(100) NOT NULL, category VARCHAR(50), spec VARCHAR(100), original_value DECIMAL(16,2), net_value DECIMAL(16,2), purchase_date DATE, location VARCHAR(255), remark TEXT, create_time DATETIME DEFAULT CURRENT_TIMESTAMP );第三張表是評估項目表串聯(lián)資產、委托方和評估機構CREATE TABLE assess_project ( id INT PRIMARY KEY AUTO_INCREMENT, project_code VARCHAR(50) NOT NULL UNIQUE, project_name VARCHAR(100) NOT NULL, client_name VARCHAR(100), asset_id INT, org_id INT, project_status VARCHAR(20) DEFAULT PENDING, assess_amount DECIMAL(16,2), start_time DATETIME, end_time DATETIME, create_time DATETIME DEFAULT CURRENT_TIMESTAMP );第四張表是評估機構表CREATE TABLE appraisal_org ( id INT PRIMARY KEY AUTO_INCREMENT, org_name VARCHAR(100) NOT NULL, org_code VARCHAR(50), legal_person VARCHAR(50), address VARCHAR(255), phone VARCHAR(20), qualification VARCHAR(50) );第五張表是評估報告表通過外鍵關聯(lián)評估項目CREATE TABLE assess_report ( id INT PRIMARY KEY AUTO_INCREMENT, project_id INT, report_code VARCHAR(50) NOT NULL, report_name VARCHAR(100), report_url VARCHAR(255), report_status VARCHAR(20) DEFAULT DRAFT, create_time DATETIME DEFAULT CURRENT_TIMESTAMP, update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP );數(shù)據(jù)庫設計答辯時最少要能講清楚三件事每個表是干什么的、表之間的關系是什么、為什么這么設計。這里assess_project作為核心表通過asset_id關聯(lián)資產通過org_id關聯(lián)機構assess_report再關聯(lián)項目業(yè)務鏈路就完整了。5. 核心代碼實現(xiàn)下面給出系統(tǒng)核心代碼的編寫思路。注意以下代碼是 SSM 項目的通用實現(xiàn)模板類名和字段請按你的實際表結構調整。5.1 實體類以AssetInfo為例實體類字段與數(shù)據(jù)庫表對應。這里不引入 Lombok使用原生 getter/setter避免環(huán)境沒有裝 Lombok 時報錯。public class AssetInfo { private Integer id; private String assetCode; private String assetName; private String category; private String spec; private BigDecimal originalValue; private BigDecimal netValue; private Date purchaseDate; private String location; private String remark; public Integer getId() { return id; } public void setId(Integer id) { this.id id; } public String getAssetCode() { return assetCode; } public void setAssetCode(String assetCode) { this.assetCode assetCode; } // 其他字段的 getter/setter 同理 }5.2 Mapper 接口與 XMLAssetInfoMapper接口定義數(shù)據(jù)庫操作方法public interface AssetInfoMapper { AssetInfo selectById(Integer id); ListAssetInfo selectList(AssetInfoQuery query); int insert(AssetInfo assetInfo); int update(AssetInfo assetInfo); int deleteById(Integer id); long count(AssetInfoQuery query); }對應的 Mapper XML 放在resources/mapper/AssetInfoMapper.xml核心查詢語句select idselectList resultTypecom.example.entity.AssetInfo SELECT * FROM asset_info where if testassetName ! null and assetName ! AND asset_name LIKE CONCAT(%, #{assetName}, %) /if if testcategory ! null and category ! AND category #{category} /if /where ORDER BY create_time DESC /select這里用了 MyBatis 動態(tài) SQL支持根據(jù)資產名稱和類別條件組合查詢是答辯時容易加分的一個點。5.3 Service 層Service 負責業(yè)務邏輯。以“創(chuàng)建評估項目”為例需要同時校驗資產是否存在、機構是否存在再插入項目記錄Service public class AssessProjectService { Autowired private AssessProjectMapper projectMapper; Autowired private AssetInfoMapper assetInfoMapper; Transactional public boolean createProject(AssessProject project) { AssetInfo assetInfo assetInfoMapper.selectById(project.getAssetId()); if (assetInfo null) { throw new RuntimeException(關聯(lián)資產不存在); } project.setProjectCode(PRJ System.currentTimeMillis()); project.setProjectStatus(PENDING); return projectMapper.insert(project) 0; } }Transactional保證創(chuàng)建項目時如果中間步驟報錯整個事務回滾不會產生臟數(shù)據(jù)。5.4 Controller 層Controller 使用Controller注解配合 SpringMVC 處理頁面跳轉數(shù)據(jù)通過Model傳遞到 JSPController RequestMapping(/asset) public class AssetInfoController { Autowired private AssetInfoService assetInfoService; RequestMapping(/list) public String list(AssetInfoQuery query, Model model) { PageResult pageResult assetInfoService.queryPage(query); model.addAttribute(pageResult, pageResult); model.addAttribute(query, query); return asset/list; } RequestMapping(/save) public String save(AssetInfo assetInfo) { assetInfoService.saveOrUpdate(assetInfo); return redirect:/asset/list; } RequestMapping(/delete) public String delete(Integer id) { assetInfoService.deleteById(id); return redirect:/asset/list; } }5.5 登錄攔截器系統(tǒng)頁面不能繞過登錄直接訪問需要實現(xiàn) SpringMVC 的HandlerInterceptor。public class LoginInterceptor implements HandlerInterceptor { Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { Object user request.getSession().getAttribute(loginUser); if (user null) { response.sendRedirect(request.getContextPath() /login); return false; } return true; } }然后在spring-mvc.xml里注冊攔截器并排除登錄接口和靜態(tài)資源mvc:interceptors mvc:interceptor mvc:mapping path/**/ mvc:exclude-mapping path/login/ mvc:exclude-mapping path/static/**/ bean classcom.example.interceptor.LoginInterceptor/ /mvc:interceptor /mvc:interceptors5.6 Spring 與 MyBatis 配置applicationContext.xml中配置數(shù)據(jù)源和 MyBatis 的 Mapper 掃描context:property-placeholder locationclasspath:jdbc.properties/ bean iddataSource classcom.alibaba.druid.pool.DruidDataSource property namedriverClassName value${jdbc.driver}/ property nameurl value${jdbc.url}/ property nameusername value${jdbc.username}/ property namepassword value${jdbc.password}/ /bean bean idsqlSessionFactory classorg.mybatis.spring.SqlSessionFactoryBean property namedataSource refdataSource/ property namemapperLocations valueclasspath:mapper/*.xml/ /bean bean classorg.mybatis.spring.mapper.MapperScannerConfigurer property namebasePackage valuecom.example.mapper/ /beanjdbc.properties內容jdbc.drivercom.mysql.cj.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/asset_assess?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai jdbc.usernameroot jdbc.password123456這里的數(shù)據(jù)庫密碼需要改成你自己的本機密碼。6. 項目部署與啟動6.1 IDEA 導入項目在 IDEA 中執(zhí)行File - New - Project from Existing Sources選擇項目的pom.xml之后等待 Maven 自動下載依賴。如果下載很慢檢查第 3 節(jié)中的阿里云鏡像是否配置成功。6.2 Maven 打包在 IDEA 右側 Maven 面板執(zhí)行clean然后執(zhí)行package最終會在target目錄下生成一個 war 包。mvn clean package -DskipTests6.3 Tomcat 部署如果是 IDEA 集成 Tomcat點擊Run - Edit Configurations - - Tomcat Server - Local選擇 Tomcat 目錄然后在Deployment里添加war explodedApplication context 設置為/asset。啟動后訪問地址http://localhost:8080/asset/login如果端口被占用可以在config/server.xml中把 8080 改為 8081。啟動成功后使用管理員賬號登錄系統(tǒng)密碼在sys_user表中預先初始化也可以在登錄頁面通過內置的初始化數(shù)據(jù)導入。建議在sql里加入一條初始管理員記錄INSERT INTO sys_user(username, password, real_name, role) VALUES (admin, 202cb962ac59075b964b07152d234b70, 系統(tǒng)管理員, ADMIN);這里的密碼字符串是123的 MD5 值。7. 功能測試與效果驗證系統(tǒng)啟動后按順序走一遍核心流程驗證系統(tǒng)是否可用。7.1 登錄模塊驗證輸入錯誤的密碼看是否提示“用戶名或密碼錯誤”。輸入正確賬號登錄成功后是否跳轉到首頁。未登錄直接訪問/asset/list觀察攔截器是否生效并跳轉到登錄頁。7.2 資產信息管理驗證點擊資產列表確認分頁展示正常。新增一條資產記錄字段包含資產編碼、資產名稱、類別、原值、凈值保存后列表是否出現(xiàn)新數(shù)據(jù)。修改某條資產的原值看數(shù)據(jù)庫和頁面是否同步。刪除一條資產確認列表記錄減少。7.3 評估項目流程驗證創(chuàng)建一個評估項目選擇資產和評估機構。將項目狀態(tài)從“待評估”改為“評估中”。給項目上傳一份評估報告狀態(tài)變?yōu)椤耙淹瓿伞?。這里建議用一個測試表格記錄結果測試模塊測試步驟預期結果是否通過登錄模塊錯誤密碼登錄提示錯誤待驗證登錄模塊正確賬號登錄跳轉首頁待驗證資產管理新增資產列表出現(xiàn)新記錄待驗證評估項目創(chuàng)建項目并派單項目狀態(tài)更新待驗證報告管理上傳報告報告可下載待驗證7.4 分頁與條件查詢驗證在列表中按資產名稱關鍵字搜索確認 SQL 動態(tài)條件生效點擊第 2 頁確認分頁參數(shù)正常傳遞。分頁功能建議使用 PageHelper 插件用法簡單dependency groupIdcom.github.pagehelper/groupId artifactIdpagehelper/artifactId version5.2.1/version /dependencyPageHelper.startPage(pageNum, pageSize); ListAssetInfo list assetInfoMapper.selectList(query); PageInfoAssetInfo pageInfo new PageInfo(list);8. 常見問題與排查方法問題現(xiàn)象可能原因排查方式解決方案Maven 依賴下載失敗網絡問題或鏡像未配置檢查settings.xml鏡像配置阿里云鏡像并更新倉庫Tomcat 啟動報端口占用8080 被其他進程占用netstat -anofindstr 8080數(shù)據(jù)庫中文亂碼數(shù)據(jù)庫字符集不是 utf8mb4查看表字符集重新建庫連接 URL 加characterEncodingutf8登錄后頁面 404攔截器把靜態(tài)資源攔截了查看日志和請求路徑排除/static/**和/loginLombok 編譯報錯實體類用了Data但未裝插件IDEA 提示找不到 getter/setter安裝 Lombok 插件或者實體類不使用 Lombokjava.lang.OutOfMemoryErrorTomcat 內存不足查看catalina.out日志修改 catalina.sh 中的JAVA_OPTS調大-XmxMyBatis 綁定異常Mapper 接口和 XML 不匹配檢查 namespace 和 id確保接口方法名和 XML id 完全一致訪問 500 錯誤SQL 字段與實體類不對應看控制臺完整錯誤棧比對數(shù)據(jù)庫字段和實體屬性源發(fā)行版 17 需要目標發(fā)行版 17Maven 編譯 JDK 版本過高檢查項目pom.xml統(tǒng)一為 JDK 1.8設置maven.compiler.source和target出現(xiàn)問題時最有效的排查順序是先看控制臺報錯的前三行再確認數(shù)據(jù)庫連接是否正常最后檢查 Mapper XML 的 namespace。很多時候 500 錯誤就是字段名寫錯或者大小寫不匹配。另外啟動項目時如果遇到Annotation processing is not supported for module cycles說明 Spring 模塊和實體類模塊存在循環(huán)依賴需要把公共類單獨抽到一個模塊里或者調整包結構對多數(shù) SSM 單項目來說直接把兩個類放到同一個模塊即可。9. 最佳實踐與畢設改進方向如果只是把增刪改查寫完這個系統(tǒng)還不夠有競爭力。建議從以下幾個方向做增強。9.1 增加角色權限目前sys_user表只有一個role字段如果希望管理員、評估人員、普通用戶看到不同菜單可以引入攔截器判斷角色更復雜的可以引入 Shiro。答辯時能講清“不同權限訪問不同資源”會比單純做登錄校驗更有亮點。9.2 增加 Excel 導入導出資產信息往往需要批量導入使用 Apache POI 或者 EasyExcel 實現(xiàn) Excel 導入導出是業(yè)務系統(tǒng)里非常常見的需求。比如在資產列表頁提供“批量導入”按鈕上傳 Excel 后解析并插入數(shù)據(jù)庫這個功能寫進論文也很有價值。9.3 改造成 Spring Boot 版本目前基于 SSM 的配置比較繁瑣Spring Boot 可以大量簡化配置。改造時只需要保留 Controller、Service、Mapper 三層代碼把 XML 配置替換為自動配置。熱詞里也出現(xiàn)了vue3 連接 ssm 框架說明前后端分離是當前主流方向你可以用 Vue3 Element Plus 替換 JSP后端只提供 JSON 接口這樣項目會更有時代感。9.4 加入日志與數(shù)據(jù)統(tǒng)計使用 SLF4J 記錄關鍵操作日志評估項目首頁統(tǒng)計待評估、評估中、已完成的項目數(shù)量用 ECharts 展示柱狀圖或餅圖。這些屬于非功能需求但能顯著提升系統(tǒng)觀感。9.5 代碼規(guī)范與目錄管理模型文件、SQL 腳本、接口文檔分別建目錄業(yè)務代碼放入controller、service、mapper三個包前端頁面按模塊建文件夾。保留一份最小可運行配置這份配置只包含 JDK、Maven、MySQL、Tomcat方便在任何機器上快速恢復環(huán)境。10. 總結與下一步基于 SSM 框架的資產評估業(yè)務管理系統(tǒng)最值得參考的是它的業(yè)務流設計從資產到項目到報告一張核心表把多個業(yè)務實體串起來數(shù)據(jù)庫設計有內容可講代碼分層清楚適合作為畢設初版。拿到這個項目后第一件事不是急著看完整代碼而是先建庫、導數(shù)據(jù)、啟動項目把登錄、資產新增、項目創(chuàng)建這三條主流程走通。最容易踩的坑集中在環(huán)境上主要是 Maven 依賴下載慢、Tomcat 端口沖突、MySQL 字符集亂碼。如果你本地已經裝過多個版本的 JDK還要注意 IDEA 里 Project Structure 和 Maven 的 JDK 設置必須保持一致否則源發(fā)行版 17 需要目標發(fā)行版 17這類編譯錯誤會直接把你卡住。后續(xù)可以按照上面的改進方向繼續(xù)擴展想要系統(tǒng)看起來更現(xiàn)代就給后端加一個 Spring Boot 版本想要業(yè)務邏輯更有深度就加上 Excel 導入導出和 ECharts 統(tǒng)計報表想要答辯更有亮點就講清楚登錄攔截器、事務回滾、動態(tài) SQL 這幾個設計點。建議收藏備用。真正動手的時候把本文的建庫腳本、項目結構和核心代碼作為參考自己從頭寫一遍遇到問題再回來對照排查這樣你的項目不只是能跑還能講明白。