毕业设计实战:基于SSM的大学生智能消费记账系统设计与实现,从需求到测试全流程拆解,新手也能轻松通关!
谁懂啊!当初做大学生智能消费记账系统毕设时,光用户表和预算表的关联就卡了3天——一开始没设外键,查某用户的所有预算记录时数据全乱套,导师看了直接让我“重画数据库E-R图”😫 后来踩遍无数坑才摸出一套高效落地流程,今天把需求分析、技术选型、功能实现到测试的细节全说透,宝子们不用再熬夜改代码,轻松搞定毕设!
一、先搞懂“大学生智能消费记账系统要啥”!需求分析别瞎蒙
刚开始我跳过需求分析就写代码,花两周加了个“消费社交分享功能”,结果导师一句“核心是收支管理与预算控制,不是社交”直接打回重改!后来才明白,需求分析得先抓准“谁用系统、要干啥”,这步做对,后面少走90%弯路。
1. 核心用户&功能拆解(踩坑后总结版)
大学生智能消费记账系统就两类核心用户:管理员和普通用户(别加“访客角色”!我当初加了后,权限逻辑混乱,未登录就能看用户收支数据,最后砍掉才顺畅):
- 管理员端(必做功能):
- 用户管理:查看用户列表、新增用户、重置密码(支持按姓名/手机号模糊查,我当初没加,查用户要翻几十页)
- 预算管理:维护预算类型(新增/删除一级/二级类型)、查看用户预算记录、导出预算统计报表(用下拉框选“月度/季度”,效率翻倍)
- 收支管理:审核用户异常收支记录、管理收支类型(如“兼职收入”“餐饮支出”)、统计全系统收支数据
- 基础数据管理:维护字典表(如收支类型编码)、设置系统基础参数(如默认预算周期)
- 用户端(核心功能):
- 收支记录:新增收入(填金额/选类型/写备注)、新增支出(关联预算、传消费凭证)、查看收支明细(按时间/类型筛选)
- 预算管理:创建预算(选类型/设金额/定周期)、查看预算使用进度(进度条显“已用/总额”)、接收预算超支提醒
- 个人中心:修改个人信息(头像、手机号)、查看收支统计(月度柱状图)、管理消费凭证(删除无效图片)
2. 需求分析避坑指南(血泪教训!)
- 别光靠“空想”!找2个同学模拟管理员和用户提意见:比如有用户说“想快速知道预算够不够”,我才加了“预算进度标色”(超支红色/正常绿色),比瞎加“社交功能”实用多了
- 一定要画用例图!用DrawIO画简单版,标清“管理员-管理预算类型”“用户-新增支出”,跟导师汇报时,比光说“我要做XX功能”直观10倍(当初没画,导师听20分钟还没get到逻辑)
- 写“需求规格说明书”!不用复杂,把“功能描述、约束条件”写清楚(比如“预算金额不能为负”“收支凭证仅支持JPG/PNG”),编码时对着做,不会跑偏
3. 可行性分析别敷衍!5点写清楚就能过
导师超爱问“你这系统可行吗”,别只说“我觉得可行”,从5个角度写,显得专业:
- 技术可行性:SSM、JSP、MySQL都是课堂学过的,图书馆有《SSM框架实战》《MySQL数据库设计》,遇到问题能查资料(别选Vue3!我当初想试,前后端联调卡了一周,换回JSP才顺利)
- 经济可行性:所有工具全免费!IDEA(社区版)、MySQL、Tomcat官网直接下,不用花钱买版权,答辩时说“开发成本为0”,导师会觉得你懂成本控制
- 操作可行性:界面参考主流记账APP(如随手记),按钮布局简洁,我找同学测试,3分钟就学会新增收支记录,导师直接认可
- 时间可行性:预留2个月开发,从需求分析到测试,每天投入3小时,能完成核心功能(我当初合理规划,提前1周完成)
- 法律可行性:开发用的资料来自图书馆和开源社区,无侵权风险;代码独立编写,无抄袭,符合毕业设计要求
二、技术选型别跟风!这套组合稳到爆
刚开始我跟风用SSM+Vue3+Redis,结果“收支数据缓存”卡了5天——Redis的持久化配置没设对,重启后数据全丢😫 后来换成SSM(Spring+SpringMVC+MyBatis)+JSP+MySQL+Tomcat9,新手友好度拉满,调试效率翻两倍!
1. 技术栈详细对比(附避坑提醒)
宝子们别盲目选“最新技术”,稳定比炫酷重要!我整理了5个核心工具的选择理由和坑点,直接抄:
| 技术工具 | 为啥选它 | 避坑提醒!(重点!) |
|---|---|---|
| SSM框架 | 三层架构清晰,适合管理系统开发,学习资料多 | 别用最新版依赖!Spring 5.2.x+MyBatis 3.5.x就行,高版本兼容性差,会报“配置文件解析错误” |
| MySQL 8.0 | 占内存小,存用户、收支、预算数据足够用 | 安装时设“utf8mb4”编码!我当初用默认编码,用户姓名含生僻字乱码,查2小时才解决 |
| Tomcat 9.0 | 稳定!和SSM、JSP适配最好,支持热部署 | 别用Tomcat 10!会出现“Servlet API包名变更”,答辩时系统崩了就完了 |
| JSP | 上手简单,不用单独学前端框架,适合后端新手 | 别用EL表达式老版本!用JSTL 1.2,避免“表达式无法解析”报错 |
| IDEA 2022 | 对SSM支持好,自带代码提示,调试方便 | 别更到2023+版本!高版本对老电脑兼容性差,经常卡顿闪退 |
2. 开发环境搭建(step by step 实操)
很多宝子卡在“环境配置”,跟着步骤来超简单,我当初一次成功:
- 装JDK 1.8:记住安装路径(比如D:\Java\jdk1.8.0_301),配置“JAVA_HOME”环境变量别写错,不然IDEA认不到JDK
- 装IDEA(社区版):选“Community Edition”,免费够用,首次打开勾选“SSM”“Maven”插件,自动安装
- 装MySQL 8.0:用Navicat管理(可视化工具超方便,新建表直接选字段类型,比命令行快10倍),新建数据库“smart_account”,编码设“utf8mb4”
- 配Tomcat 9.0:在IDEA中添加服务器,选“Apache Tomcat v9.0”,关联安装路径,启动后看到“Server startup in XX ms”就是成功
- 导入SSM依赖:在pom.xml中添加Spring、SpringMVC、MyBatis依赖,注意版本匹配(附依赖代码片段)
3. 架构图一定要画!答辩加分项
用DrawIO画SSM三层架构图(像论文里的“系统架构图”),标清“表现层(JSP/Controller)-业务层(Service)-数据访问层(Mapper)”:比如用户点“新增支出”→JSP页面传请求→SpringMVC Controller接收→Service校验预算→MyBatis Mapper存数据。去年答辩时,评委特意夸这图“逻辑清晰”,比光说“我用了SSM”专业多了!
三、数据库设计:别让表关联坑了你
这部分是毕设的“核心骨架”,我当初没关联“用户表”和“支出表”,查“某用户的月度支出”要写3层嵌套SQL,调试到凌晨1点😫 后来按“实体-属性-关系”设计,终于理清了。
1. 核心实体&属性(附ER图绘制技巧)
先确定“实体”(用户、收入、支出、预算),再想“属性”,别漏关键字段!我整理了必做的6张表,直接照着画ER图:
- 用户表(yonghu):id(主键)、yonghu_name(姓名)、yonghu_phone(手机号,唯一)、yonghu_id_number(身份证号)、yonghu_photo(头像路径)、create_time(创建时间)
- 收入表(shouru):id(主键)、yonghu_id(关联用户,外键)、shouru_uuid_number(收入编号,唯一)、shouru_types(收入类型)、shouru_number(金额)、shoru_time(收入时间)
- 支出表(zhichu):id(主键)、yonghu_id(关联用户)、yusuan_id(关联预算)、zhichu_types(支出类型)、zhichu_number(金额)、zhichu_img(凭证路径)
- 预算表(yusuan):id(主键)、yonghu_id(关联用户)、yusuan_types(一级类型)、yusuan_erji_types(二级类型)、yusuan_number(总额)、used_number(已用金额)
画ER图用Visio或亿图,记住3个规则:
- 矩形代表“实体”(比如“用户”“支出”)
- 椭圆代表“属性”(比如用户的“姓名”“手机号”)
- 菱形代表“关系”(比如“用户-创建-预算”是一对多,一个用户能创建多个预算;“预算-关联-支出”是一对多,一个预算能关联多个支出) 避坑提醒:别把“收支凭证、用户头像”存数据库!我当初存二进制导致数据库崩溃,改成存“文件路径”(比如/static/img/zhichu1.jpg)才对。
2. 数据库物理设计(附建表SQL示例)
ER图画好后,转成实际表,字段类型和约束别瞎设!比如“收支金额”用DECIMAL(10,2),别用INT,不然无法存小数;“用户手机号”设UNIQUE约束,避免重复注册。
给宝子们贴“支出表”的建表SQL,复制到Navicat就能用:
CREATE TABLE `zhichu` (
`id` INT NOT NULL AUTO_INCREMENT COMMENT '支出ID',
`yonghu_id` INT DEFAULT NULL COMMENT '关联用户ID(外键)',
`yusuan_id` INT DEFAULT NULL COMMENT '关联预算ID(外键)',
`zhichu_uuid_number` VARCHAR(50) DEFAULT NULL COMMENT '支出唯一编号',
`zhichu_name` VARCHAR(200) NOT NULL COMMENT '支出名称',
`zhichu_types` INT DEFAULT NULL COMMENT '支出类型(1-餐饮,2-交通)',
`zhichu_number` DECIMAL(10,2) NOT NULL COMMENT '支出金额',
`shangjia_content` VARCHAR(500) DEFAULT NULL COMMENT '支出原因',
`zhichu_time` DATETIME DEFAULT NULL COMMENT '支出时间',
`zhichu_img` VARCHAR(200) DEFAULT NULL COMMENT '支出凭证路径',
`create_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`),
KEY `fk_yonghu_zhichu` (`yonghu_id`), -- 外键关联用户表
KEY `fk_yusuan_zhichu` (`yusuan_id`), -- 外键关联预算表
UNIQUE KEY `uk_zhichu_uuid` (`zhichu_uuid_number`) -- 支出编号唯一
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='支出表';
3. 表关联测试!别等编码才发现错
建完表一定要测关联!比如在“支出表”插数据(用户ID=1,预算ID=1,金额=50),用JOIN查询“某用户的支出及关联预算”:
SELECT u.yonghu_name, z.zhichu_name, z.zhichu_number, y.yusuan_types, y.yusuan_number, y.used_number
FROM zhichu z
JOIN yonghu u ON z.yonghu_id = u.id
JOIN yusuan y ON z.yusuan_id = y.id
WHERE u.id = 1;
如果能查出“用户名+支出名称+支出金额+预算类型+预算总额/已用”,说明关联没问题;如果报错“Unknown column”,大概率是外键没设对,赶紧检查表结构。
四、功能实现:核心模块操作+页面设计
不用做所有功能!先搞定3个核心模块,答辩时足够出彩。每个模块我都附关键操作逻辑和页面设计要点,宝子们直接套就行。
1. 用户端:支出新增模块(必做!)
这是用户的核心功能,实现“选预算、填金额、传凭证”,重点说“预算关联校验”和“金额控制”——别漏这两步,我当初就是这里踩了大坑!
(1)关键操作逻辑
- 新增支出前,先校验“关联预算是否存在且未超支”(超支则提示“预算不足,是否继续?”);
- 填写金额时,限制“≥0.01元”(避免无效数据),自动同步更新预算“已用金额”;
- 上传凭证时,限制格式(JPG/PNG)和大小(≤2MB),支持预览后再提交。
(2)页面设计要点(JSP+Bootstrap)
页面标题:用户-新增支出页面
(插入图片位置:此处放“新增支出页面截图”,需包含以下元素)
- 表单元素:
- 关联预算(下拉框,加载当前用户未过期预算,必填)
- 支出名称(输入框,必填,提示“如:午餐外卖”)
- 支出类型(下拉框,选“餐饮/交通/购物”,必填)
- 支出金额(输入框,必填,正则校验“正数且最多2位小数”)
- 支出原因(文本域,选填,提示“简要说明支出用途”)
- 支出凭证(上传框,支持JPG/PNG,预览区显上传图片)
- 按钮:“提交”(绿色btn-success)、“重置”(灰色btn-default)
- 提示信息:红色显“金额格式错误/预算超支”,绿色显“支出新增成功!”
(3)避坑提醒
- 禁止预算超支未提醒!加校验逻辑:
Yusuan yusuan = yusuanService.getById(zhichu.getYusuanId()); BigDecimal totalUsed = yusuan.getUsedNumber().add(zhichu.getZhichuNumber()); if (totalUsed.compareTo(yusuan.getYusuanNumber()) > 0) { // 预算超支,返回提醒 return Result.warn("预算超支" + totalUsed.subtract(yusuan.getYusuanNumber()) + "元,是否继续?"); } - 同步更新预算已用金额!用事务保证数据一致性:
@Transactional public Result addZhichu(Zhichu zhichu) { // 新增支出 zhichuService.save(zhichu); // 更新预算已用金额 Yusuan yusuan = yusuanService.getById(zhichu.getYusuanId()); yusuan.setUsedNumber(yusuan.getUsedNumber().add(zhichu.getZhichuNumber())); yusuanService.updateById(yusuan); return Result.success("支出新增成功!"); }
2. 管理员端:预算类型管理模块(核心需求!)
管理员用系统的核心是“维护预算分类”,流程别复杂:查类型列表→加/改/删类型→看关联预算,我当初加“多级审批”,代码量翻倍,其实“直接管理+类型禁用”更实用。
(1)关键操作逻辑
- 新增预算类型时,区分“一级类型”和“二级类型”(二级类型需关联一级类型,避免混乱);
- 删除类型前,校验“是否有关联预算”(有关联则提示“该类型关联XX个预算,无法删除”);
- 支持“禁用”类型(而非物理删除),禁用后用户无法选择该类型创建预算。
(2)页面设计要点(JSP+Bootstrap)
页面标题:管理员-预算类型管理页面
(插入图片位置:此处放“预算类型管理页面截图”,需包含以下元素)
- 筛选条件:类型级别(下拉框“一级/二级”)、类型名称(模糊查)、状态(“启用/禁用”)
- 类型列表表格:列名“类型编码、类型名称、所属级别、关联预算数、状态、操作”,禁用类型标灰色
- 操作按钮:“新增一级类型”(蓝色btn-primary)、“新增二级类型”(蓝色btn-info)、“修改”(橙色btn-warning)、“禁用/启用”(切换按钮)
- 新增弹窗:一级类型填“名称+编码”;二级类型需选“所属一级类型”+填信息
(3)避坑提醒
- 防止删除关联类型!加校验逻辑:
LambdaQueryWrapper<Yusuan> wrapper = new LambdaQueryWrapper<>(); wrapper.eq(Yusuan::getYusuanTypes, typeId).or().eq(Yusuan::getYusuanErjiTypes, typeId); if (yusuanService.count(wrapper) > 0) { return Result.error("该类型关联" + yusuanService.count(wrapper) + "个预算,无法删除!"); } - 类型编码唯一!避免重复:
LambdaQueryWrapper<YusuanType> wrapper = new LambdaQueryWrapper<>(); wrapper.eq(YusuanType::getTypeCode, type.getTypecode()); if (yusuanTypeService.count(wrapper) > 0) { return Result.error("该类型编码已存在,请更换!"); }
3. 用户端:预算进度查看模块(答辩亮点!)
这个功能最能体现“智能记账”特性,导师超爱问!核心是“直观展示预算使用情况”,别漏“超支提醒”,不然用户无法及时控制消费。
页面设计要点
页面标题:用户-预算进度页面
(插入图片位置:此处放“预算进度页面截图”,需包含以下元素)
- 筛选条件:预算周期(近30天/本月/自定义)、预算类型(下拉框)
- 预算列表:
- 每项含“预算名称、类型、总额、已用金额、剩余金额”
- 进度条:超支显红色(进度>100%)、正常显绿色(进度≤100%),进度条上标百分比
- 操作按钮:“查看明细”(查看该预算关联的支出)、“修改预算”(调整总额/周期)
- 超支提醒区:标红显示“超支预算”,提示“您有2个预算已超支,请控制消费!”
五、测试别敷衍!这3步让答辩不翻车
很多宝子觉得“功能能跑就行”,结果答辩时评委一测就出问题!我当初没测“预算超支后新增支出”,导致系统允许无限超支,导师说“不符合智能记账逻辑”,当场扣分😫 测试一定要针对性做!
1. 功能测试(必测3个模块)
别全测!重点测“核心功能”,我整理了测试用例表,直接填结果:
(1)新增支出测试(表1:新增支出测试用例)
| 测试场景 | 操作步骤 | 预期结果 | 实际结果 | 测试结论 |
|---|---|---|---|---|
| 预算超支新增 | 预算总额100元,已用90元→新增支出20元→提交 | 提示“预算超支10元,是否继续?” | ||
| 金额为0 | 填支出金额0元→选类型→提交 | 提示“支出金额不能小于0.01元!” | ||
| 正常新增 | 预算总额100元→填支出10元→传凭证→提交 | 提示“支出新增成功!”,预算已用金额变10元 |
(2)预算类型管理测试(表2:预算类型测试用例)
| 测试场景 | 操作步骤 | 预期结果 | 实际结果 | 测试结论 |
|---|---|---|---|---|
| 删除关联预算的类型 | 选关联5个预算的类型→点删除 | 提示“该类型关联5个预算,无法删除!” | ||
| 新增重复编码类型 | 新增一级类型→编码填“001”(已存在)→提交 | 提示“该类型编码已存在,请更换!” | ||
| 正常新增二级类型 | 选一级类型“餐饮”→填名称“外卖”→提交 | 提示“二级类型新增成功!”,列表显该类型 |
(3)用户登录测试(表3:登录测试用例)
| 测试场景 | 操作步骤 | 预期结果 | 实际结果 | 测试结论 |
|---|---|---|---|---|
| 密码错误 | 账号:user1→密码:12345(正确123456)→登录 | 提示“账号或密码不正确!” | ||
| 未填手机号 | 账号:空→密码:123456→登录 | 提示“请输入手机号!” | ||
| 正常登录(用户角色) | 账号:13800138000→密码:123456→登录 | 登录成功,跳用户首页 |
2. 兼容性测试(容易忽略的点)
别只在自己电脑测!答辩时评委可能用不同浏览器,我当初没测IE,结果预算进度条显示错乱,赶紧加兼容性CSS才好:
- 浏览器测试:Chrome、Firefox、Edge、IE11(重点测IE,兼容性最差)
- 分辨率测试:1920×1080、1366×768(别让页面出现横向滚动条,用Bootstrap的响应式布局)
3. 测试报告要写好!答辩加分
把测试结果整理成“测试报告”,含“目的、范围、用例、结果、问题总结”,导师会觉得你“做事严谨”。比如:
- 问题总结:“IE浏览器下预算进度条错乱,通过引入excanvas.js修复;未登录用户能访问支出页面,加Spring Security拦截器控制”
- 测试结论:“核心功能(新增支出、预算类型管理、登录)均通过测试,无严重bug;兼容性问题已修复,系统可正常使用”
六、答辩准备:3个加分小技巧
毕设不仅要做出来,还要说清楚!我当初准备了这3点,导师直接给“良好”:
- 演示流程要顺畅:提前录演示视频(怕现场系统崩),按“管理员加预算类型→用户创建预算→用户新增支出→查看预算进度”的流程来,别跳步
- 重点讲“你解决了啥问题”:比如“一开始收支凭证存数据库加载慢,改成存路径后,加载速度提升70%;预算超支无提醒,加校验和标色功能解决”,比光说“我用了SSM”有亮点
- 准备常见问题:导师大概率问“为啥选SSM不选Spring Boot”“数据多了怎么优化”,提前答:“SSM学习资料多,适合毕业设计;数据多就加索引(如支出表的yonghu_id和zhichu_time联合索引),优化查询速度”
最后:毕设通关的小私心
以上就是基于SSM的大学生智能消费记账系统从0到1的避坑干货!毕设没那么难,关键是找对方法,别瞎做复杂功能。
需要核心源码(带注释,直接能跑)、数据库脚本(含测试数据)、ER图模板的宝子,评论区扣“大学生智能消费记账系统”,我私发你;卡在某个模块(比如支出关联预算、预算进度计算),也可以留言,我看到必回!
点赞收藏这篇,下次找流程不迷路~祝宝子们毕设顺利,轻松毕业!😘