ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

基于SSM框架的资产评估业务管理系统设计与实现

基于SSM框架的资产评估业务管理系统设计与实现 这次我们来看一个很典型的 Java 毕业设计项目基于 SSM 框架的资产评估业务管理系统。这类系统在高校毕业设计里出现频率很高原因是它把 SSM 开发的核心链路完整串起来了Spring 负责对象管理SpringMVC 负责请求分发MyBatis 负责数据库操作前端再配合 JSP、Bootstrap 渲染页面。技术栈很基础但业务模型足够写清楚数据库设计、权限控制和多角色操作流程适合用来做毕设初版也适合刚学完 JavaWeb 的同学拿来练手。这个资产评估业务管理系统本质上是一个围绕“资产信息录入 - 评估项目立项 - 评估人员作业 - 评估报告生成”的业务流转系统。相比普通的增删改查它的业务链更长涉及用户、资产、项目、机构、报告多张表所以比“图书管理”“学生管理”这类项目更有内容可写也更能体现你对数据库设计和项目结构的理解。本文会从项目定位、环境准备、架构设计、数据库设计、核心代码实现、部署启动、功能测试和问题排查这几个维度完整讲一遍最后给出几个适合写进论文的改进方向。如果你正在选毕设题目或者想找一个 SSM 项目边读边改建议先收藏再跟着下面的步骤把系统结构过一遍。1. 核心能力速览项目项说明项目类型Java Web 毕业设计 / SSM 框架整合项目技术栈Spring SpringMVC MyBatis MySQL Maven Tomcat前端方案JSP Bootstrap / Layui可选 Vue3 前后端分离改造开发工具IntelliJ IDEA、Navicat、Postman核心业务资产信息管理、评估项目管理、评估机构管理、评估报告管理、用户权限管理数据库MySQL 5.7 / 8.0部署方式Maven 打 war 包部署到 Tomcat 8.5适合人群Java 学习者、计算机专业毕设学生、SSM 入门开发者扩展方向Spring Boot 改造、Vue 前后端分离、Excel 导入导出、Shiro/JWT 权限增强从表格能看出来这个项目的定位不是一个商业级系统而是一个“结构完整、能跑通、能讲清楚”的教学型系统。它的优点是你不需要太多高深知识把 SSM 的三层架构理解熟就能把整个项目吃透缺点是你如果只做纯增删改查答辩时容易显得单薄所以后面要重点把业务流转和统计报表说清楚。2. 适用场景与使用边界这个系统适合三个场景。第一种是毕业设计参考。资产评估行业本身有明确的业务对象系统里可以用“评估项目编号 委托人 评估机构 评估报告”这几个核心字段把业务串起来写论文的时候“需求分析”“数据库设计”“系统实现”三章都有实际内容支撑。第二种是 SSM 框架学习。如果你想练习 SpringMVC 的注解开发、MyBatis 的动态 SQL、拦截器做登录校验这个系统提供了比较完整的代码层次比零散写 demo 更有价值。第三种是课程设计改造。把页面精简一下业务字段换成其他行业比如“设备管理系统”“房屋评估系统”改造成本不高。同时也要说清楚边界这不是一个生产环境可以直接用的资产评估平台因为真正的评估业务涉及估价模型、法律法规、报告合规审核这些不是普通毕设系统能覆盖的。另外如果你是直接用别人开源的毕设源码一定要注意学术诚信论文要写自己对系统的理解代码要能在本地跑通并说清楚每一层的作用否则答辩时一问就暴露了。建议参考源码的结构然后自己重新建表、重写核心模块这样才能真正掌握。3. 开发环境准备在开始搭建项目之前先确认电脑上的基础环境。下面是推荐版本尽量保持一致减少踩坑概率。3.1 基础软件清单软件推荐版本说明JDKJDK 1.8SSM 项目最稳定避免用 JDK 17 出现兼容问题Maven3.6.3统一管理依赖MySQL5.7 或 8.0建库时注意字符集 utf8mb4TomcatTomcat 8.5对应 Servlet 3.1匹配 SpringMVCIDEA2020.3 以上社区版或旗舰版都可以3.2 环境变量配置Windows 下安装完 JDK 和 Maven需要配置环境变量否则 IDEA 里会提示找不到 Java 或 Maven。# JDK 环境变量 JAVA_HOME C:\Program Files\Java\jdk1.8.0_202 Path 追加 %JAVA_HOME%\bin # Maven 环境变量 MAVEN_HOME D:\apache-maven-3.6.3 Path 追加 %MAVEN_HOME%\bin配置完成后在命令行执行java -version和mvn -v能正常输出版本信息就说明环境没问题。3.3 数据库准备在 MySQL 中创建数据库字符集选择utf8mb4排序规则选择utf8mb4_general_ci。CREATE DATABASE IF NOT EXISTS asset_assess DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; USE asset_assess;后续把所有建表 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. 系统总体设计4.1 技术架构分层整个系统采用经典 SSM 三层架构再加上 Controller 层和 View 层。调用顺序是JSP 页面发起请求 - SpringMVC Controller 接收 - Service 处理业务 - MyBatis Mapper 访问 MySQL返回结果再逆向回到页面。这种分层最大的好处是职责分离每一层只做自己的事。Controller 不做数据库操作Service 里不放页面跳转逻辑Mapper 只写 SQL这样后面改需求的时候改动范围可以控制在一个模块内。4.2 功能模块设计资产评估业务管理系统按角色来分通常包含以下模块模块功能说明登录与用户管理管理员登录、用户增删改查、密码 MD5 加密资产信息管理资产基本信息的添加、修改、删除、分页查询评估项目管理创建评估项目、指派评估机构、维护项目状态评估机构管理机构信息维护项目分配时关联机构评估报告管理报告上传、报告审核状态、报告下载数据统计按资产类别和项目月份统计数量用于首页图表展示4.3 数据库表设计这是整个项目最值得写的部分。我给出一个合理的表结构设计字段可以根据自己的业务继续补充。第一张表是用户表保存系统登录用户信息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 );第二张表是资产信息表保存被评估资产的详细数据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 );第三张表是评估项目表串联资产、委托方和评估机构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) );第五张表是评估报告表通过外键关联评估项目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 );数据库设计答辩时最少要能讲清楚三件事每个表是干什么的、表之间的关系是什么、为什么这么设计。这里assess_project作为核心表通过asset_id关联资产通过org_id关联机构assess_report再关联项目业务链路就完整了。5. 核心代码实现下面给出系统核心代码的编写思路。注意以下代码是 SSM 项目的通用实现模板类名和字段请按你的实际表结构调整。5.1 实体类以AssetInfo为例实体类字段与数据库表对应。这里不引入 Lombok使用原生 getter/setter避免环境没有装 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接口定义数据库操作方法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 动态 SQL支持根据资产名称和类别条件组合查询是答辩时容易加分的一个点。5.3 Service 层Service 负责业务逻辑。以“创建评估项目”为例需要同时校验资产是否存在、机构是否存在再插入项目记录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(关联资产不存在); } project.setProjectCode(PRJ System.currentTimeMillis()); project.setProjectStatus(PENDING); return projectMapper.insert(project) 0; } }Transactional保证创建项目时如果中间步骤报错整个事务回滚不会产生脏数据。5.4 Controller 层Controller 使用Controller注解配合 SpringMVC 处理页面跳转数据通过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 登录拦截器系统页面不能绕过登录直接访问需要实现 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里注册拦截器并排除登录接口和静态资源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中配置数据源和 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这里的数据库密码需要改成你自己的本机密码。6. 项目部署与启动6.1 IDEA 导入项目在 IDEA 中执行File - New - Project from Existing Sources选择项目的pom.xml之后等待 Maven 自动下载依赖。如果下载很慢检查第 3 节中的阿里云镜像是否配置成功。6.2 Maven 打包在 IDEA 右侧 Maven 面板执行clean然后执行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。启动成功后使用管理员账号登录系统密码在sys_user表中预先初始化也可以在登录页面通过内置的初始化数据导入。建议在sql里加入一条初始管理员记录INSERT INTO sys_user(username, password, real_name, role) VALUES (admin, 202cb962ac59075b964b07152d234b70, 系统管理员, ADMIN);这里的密码字符串是123的 MD5 值。7. 功能测试与效果验证系统启动后按顺序走一遍核心流程验证系统是否可用。7.1 登录模块验证输入错误的密码看是否提示“用户名或密码错误”。输入正确账号登录成功后是否跳转到首页。未登录直接访问/asset/list观察拦截器是否生效并跳转到登录页。7.2 资产信息管理验证点击资产列表确认分页展示正常。新增一条资产记录字段包含资产编码、资产名称、类别、原值、净值保存后列表是否出现新数据。修改某条资产的原值看数据库和页面是否同步。删除一条资产确认列表记录减少。7.3 评估项目流程验证创建一个评估项目选择资产和评估机构。将项目状态从“待评估”改为“评估中”。给项目上传一份评估报告状态变为“已完成”。这里建议用一个测试表格记录结果测试模块测试步骤预期结果是否通过登录模块错误密码登录提示错误待验证登录模块正确账号登录跳转首页待验证资产管理新增资产列表出现新记录待验证评估项目创建项目并派单项目状态更新待验证报告管理上传报告报告可下载待验证7.4 分页与条件查询验证在列表中按资产名称关键字搜索确认 SQL 动态条件生效点击第 2 页确认分页参数正常传递。分页功能建议使用 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. 常见问题与排查方法问题现象可能原因排查方式解决方案Maven 依赖下载失败网络问题或镜像未配置检查settings.xml镜像配置阿里云镜像并更新仓库Tomcat 启动报端口占用8080 被其他进程占用netstat -anofindstr 8080数据库中文乱码数据库字符集不是 utf8mb4查看表字符集重新建库连接 URL 加characterEncodingutf8登录后页面 404拦截器把静态资源拦截了查看日志和请求路径排除/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 字段与实体类不对应看控制台完整错误栈比对数据库字段和实体属性源发行版 17 需要目标发行版 17Maven 编译 JDK 版本过高检查项目pom.xml统一为 JDK 1.8设置maven.compiler.source和target出现问题时最有效的排查顺序是先看控制台报错的前三行再确认数据库连接是否正常最后检查 Mapper XML 的 namespace。很多时候 500 错误就是字段名写错或者大小写不匹配。另外启动项目时如果遇到Annotation processing is not supported for module cycles说明 Spring 模块和实体类模块存在循环依赖需要把公共类单独抽到一个模块里或者调整包结构对多数 SSM 单项目来说直接把两个类放到同一个模块即可。9. 最佳实践与毕设改进方向如果只是把增删改查写完这个系统还不够有竞争力。建议从以下几个方向做增强。9.1 增加角色权限目前sys_user表只有一个role字段如果希望管理员、评估人员、普通用户看到不同菜单可以引入拦截器判断角色更复杂的可以引入 Shiro。答辩时能讲清“不同权限访问不同资源”会比单纯做登录校验更有亮点。9.2 增加 Excel 导入导出资产信息往往需要批量导入使用 Apache POI 或者 EasyExcel 实现 Excel 导入导出是业务系统里非常常见的需求。比如在资产列表页提供“批量导入”按钮上传 Excel 后解析并插入数据库这个功能写进论文也很有价值。9.3 改造成 Spring Boot 版本目前基于 SSM 的配置比较繁琐Spring Boot 可以大量简化配置。改造时只需要保留 Controller、Service、Mapper 三层代码把 XML 配置替换为自动配置。热词里也出现了vue3 连接 ssm 框架说明前后端分离是当前主流方向你可以用 Vue3 Element Plus 替换 JSP后端只提供 JSON 接口这样项目会更有时代感。9.4 加入日志与数据统计使用 SLF4J 记录关键操作日志评估项目首页统计待评估、评估中、已完成的项目数量用 ECharts 展示柱状图或饼图。这些属于非功能需求但能显著提升系统观感。9.5 代码规范与目录管理模型文件、SQL 脚本、接口文档分别建目录业务代码放入controller、service、mapper三个包前端页面按模块建文件夹。保留一份最小可运行配置这份配置只包含 JDK、Maven、MySQL、Tomcat方便在任何机器上快速恢复环境。10. 总结与下一步基于 SSM 框架的资产评估业务管理系统最值得参考的是它的业务流设计从资产到项目到报告一张核心表把多个业务实体串起来数据库设计有内容可讲代码分层清楚适合作为毕设初版。拿到这个项目后第一件事不是急着看完整代码而是先建库、导数据、启动项目把登录、资产新增、项目创建这三条主流程走通。最容易踩的坑集中在环境上主要是 Maven 依赖下载慢、Tomcat 端口冲突、MySQL 字符集乱码。如果你本地已经装过多个版本的 JDK还要注意 IDEA 里 Project Structure 和 Maven 的 JDK 设置必须保持一致否则源发行版 17 需要目标发行版 17这类编译错误会直接把你卡住。后续可以按照上面的改进方向继续扩展想要系统看起来更现代就给后端加一个 Spring Boot 版本想要业务逻辑更有深度就加上 Excel 导入导出和 ECharts 统计报表想要答辩更有亮点就讲清楚登录拦截器、事务回滚、动态 SQL 这几个设计点。建议收藏备用。真正动手的时候把本文的建库脚本、项目结构和核心代码作为参考自己从头写一遍遇到问题再回来对照排查这样你的项目不只是能跑还能讲明白。
返回列表