毕业设计实战:基于SSM的大学生智能消费记账系统设计与实现,从需求到测试全流程拆解,新手也能轻松通关!

59 阅读17分钟

毕业设计实战:基于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 实操)

很多宝子卡在“环境配置”,跟着步骤来超简单,我当初一次成功:

  1. 装JDK 1.8:记住安装路径(比如D:\Java\jdk1.8.0_301),配置“JAVA_HOME”环境变量别写错,不然IDEA认不到JDK
  2. 装IDEA(社区版):选“Community Edition”,免费够用,首次打开勾选“SSM”“Maven”插件,自动安装
  3. 装MySQL 8.0:用Navicat管理(可视化工具超方便,新建表直接选字段类型,比命令行快10倍),新建数据库“smart_account”,编码设“utf8mb4”
  4. 配Tomcat 9.0:在IDEA中添加服务器,选“Apache Tomcat v9.0”,关联安装路径,启动后看到“Server startup in XX ms”就是成功
  5. 导入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个规则:

  1. 矩形代表“实体”(比如“用户”“支出”)
  2. 椭圆代表“属性”(比如用户的“姓名”“手机号”)
  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)关键操作逻辑
  1. 新增支出前,先校验“关联预算是否存在且未超支”(超支则提示“预算不足,是否继续?”);
  2. 填写金额时,限制“≥0.01元”(避免无效数据),自动同步更新预算“已用金额”;
  3. 上传凭证时,限制格式(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)关键操作逻辑
  1. 新增预算类型时,区分“一级类型”和“二级类型”(二级类型需关联一级类型,避免混乱);
  2. 删除类型前,校验“是否有关联预算”(有关联则提示“该类型关联XX个预算,无法删除”);
  3. 支持“禁用”类型(而非物理删除),禁用后用户无法选择该类型创建预算。
(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点,导师直接给“良好”:

  1. 演示流程要顺畅:提前录演示视频(怕现场系统崩),按“管理员加预算类型→用户创建预算→用户新增支出→查看预算进度”的流程来,别跳步
  2. 重点讲“你解决了啥问题”:比如“一开始收支凭证存数据库加载慢,改成存路径后,加载速度提升70%;预算超支无提醒,加校验和标色功能解决”,比光说“我用了SSM”有亮点
  3. 准备常见问题:导师大概率问“为啥选SSM不选Spring Boot”“数据多了怎么优化”,提前答:“SSM学习资料多,适合毕业设计;数据多就加索引(如支出表的yonghu_id和zhichu_time联合索引),优化查询速度”

最后:毕设通关的小私心

以上就是基于SSM的大学生智能消费记账系统从0到1的避坑干货!毕设没那么难,关键是找对方法,别瞎做复杂功能。

需要核心源码(带注释,直接能跑)、数据库脚本(含测试数据)、ER图模板的宝子,评论区扣“大学生智能消费记账系统”,我私发你;卡在某个模块(比如支出关联预算、预算进度计算),也可以留言,我看到必回!

点赞收藏这篇,下次找流程不迷路~祝宝子们毕设顺利,轻松毕业!😘