一、需求分析:找准核心用户与功能
刚开始我试图做一个"大而全"的系统,包含了供应商管理、客户管理等模块,结果导师说"重点不突出,核心功能深度不够"。后来才明白,财务管理系统要抓住资金流水这个核心,围绕收入、支出、薪资、报销展开。
1. 核心用户角色与功能模块
系统主要面向三类用户,每类用户的功能要精准定位:
-
管理员端(系统维护核心):
- 财务人员管理:添加/修改财务人员信息、设置登录账号
- 员工信息管理:维护员工基本信息、部门分配
- 留言管理:查看员工留言、回复反馈
- 薪资管理:设置和调整员工薪资标准
- 数据备份:定期备份财务数据(加分项!)
-
财务人员端(业务处理核心):
- 收费信息管理:记录企业各项收入、分类统计
- 支出信息管理:记录日常运营支出、分类管理
- 报销审核:审核员工提交的报销申请、审批状态更新
- 薪资发放:计算和记录员工每月薪资
- 财务报表:生成收支统计报表(导师很看重这个!)
-
员工端(基础应用端):
- 报销申请:提交日常费用报销、上传相关凭证
- 薪资查询:查看个人薪资明细和发放记录
- 留言反馈:向管理员提出系统使用问题或建议
- 公告查看:查看企业最新财务政策和通知
2. 需求分析实战技巧
- 一定要做用户访谈:我找了3个会计专业的同学模拟财务人员,他们提出"报销单要有状态跟踪",我才加了"待提交/待审核/已通过/已驳回"的状态流转,这个细节让导师很满意
- 画好用例图:用DrawIO画出三个角色的用例图,标注清楚"员工-提交报销""财务人员-审核报销"等核心关系,答辩时一目了然
- 写清业务规则:在需求文档中明确"报销金额超过5000元需要二级审核""薪资每月5号固定发放"等规则,编码时不会遗漏
3. 可行性分析三要素
导师必问"为什么你觉得这个系统可行?",要从三个角度回答:
- 技术可行性:使用学过的Spring Boot+MySQL组合,社区资源丰富,遇到问题容易找到解决方案
- 经济可行性:全部使用开源工具,Eclipse、MySQL、Tomcat都是免费的,开发成本为零
- 操作可行性:界面模仿常见的财务软件,财务人员上手快,减少培训成本
二、技术选型:稳定比新颖更重要
曾经尝试用Vue.js做前端,结果前后端分离的跨域问题调试了两天,最后还是换回Thymeleaf模板引擎,开发效率大大提升!
1. 技术栈选择理由
| 技术组件 | 选择理由 | 避坑提醒 |
|---|---|---|
| Spring Boot 2.x | 比传统SSM配置简单,内嵌Tomcat | 不要用3.x版本,兼容性有问题 |
| MySQL 8.0 | 高校教学常用,资料丰富 | 安装时记住root密码,不然重置很麻烦 |
| Thymeleaf | 与Spring Boot完美整合,学习成本低 | 模板文件要放在templates目录下 |
| Bootstrap 4.x | 响应式布局,适配PC和移动端 | 使用CDN引入,不要下载本地文件 |
2. 开发环境搭建步骤
- JDK 1.8:配置JAVA_HOME环境变量,这是很多初学者容易出错的地方
- Eclipse IDE:安装Spring Tools Suite插件,支持Spring Boot项目创建
- MySQL 8.0:使用Navicat可视化工具管理数据库,比命令行高效
- Maven 3.6:配置阿里云镜像,加快依赖下载速度
3. 系统架构设计
采用经典的B/S架构,画架构图时重点展示:
- 浏览器层:用户操作界面
- Web服务器层:Spring Boot应用处理业务逻辑
- 数据访问层:MyBatis持久化框架
- 数据存储层:MySQL数据库
三、数据库设计:财务数据的核心
最初设计时把报销信息和员工信息放在同一张表,导致数据冗余严重,查询效率极低。重新设计后按第三范式拆分,系统性能提升明显。
1. 核心数据表设计
员工表(yuangong)
CREATE TABLE `yuangong` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(200) DEFAULT NULL COMMENT '账户',
`password` varchar(200) DEFAULT NULL COMMENT '密码',
`yuangong_name` varchar(200) DEFAULT NULL COMMENT '员工姓名',
`yuangong_phone` varchar(200) DEFAULT NULL COMMENT '员工手机号',
`yuangong_id_number` varchar(200) DEFAULT NULL COMMENT '员工身份证号',
`yuangong_photo` varchar(200) DEFAULT NULL COMMENT '员工头像',
`sex_types` int(11) DEFAULT NULL COMMENT '性别',
`yuangong_email` varchar(200) DEFAULT NULL COMMENT '电子邮箱',
`create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='员工表';
报销信息表(baoxiao)
CREATE TABLE `baoxiao` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`yuangong_id` int(11) DEFAULT NULL COMMENT '申请人',
`baoxiao_name` varchar(200) DEFAULT NULL COMMENT '报销名目',
`baoxiao_types` int(11) DEFAULT NULL COMMENT '报销类型',
`insert_time` timestamp NULL DEFAULT NULL COMMENT '申请时间',
`baoxiao_money` decimal(10,4) DEFAULT NULL COMMENT '报销金额',
`baoxiao_content` text COMMENT '报销详情',
`baoxiao_yesno_types` int(11) DEFAULT '0' COMMENT '是否同意',
`create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `fk_yuangong` (`yuangong_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='报销信息表';
2. 表关系设计要点
- 一对多关系:一个员工可以有多个报销记录,一个财务人员可以处理多个收费记录
- 状态字段设计:报销表包含
baoxiao_yesno_types字段,0-待审核、1-已通过、2-已驳回 - 金额字段:使用decimal类型,确保计算精度,避免float类型的精度丢失问题
- 时间戳:每个表都添加create_time字段,记录数据创建时间
3. 数据库优化技巧
- 为经常查询的字段建立索引,如员工表的username、报销表的yuangong_id
- 使用外键约束保证数据完整性
- 敏感信息如密码使用MD5加密存储
四、核心功能实现与代码详解
1. 报销审核模块(财务人员端)
这是系统的核心功能,实现员工提交报销、财务人员审核的全流程。
Controller层代码:
@Controller
@RequestMapping("/caiwu/baoxiao")
public class BaoxiaoController {
@Autowired
private BaoxiaoService baoxiaoService;
// 审核报销申请
@PostMapping("/shenhe")
public String shenheBaoxiao(Integer id, Integer shenheStatus,
String shenheContent, HttpServletRequest request) {
BaoxiaoEntity baoxiao = baoxiaoService.selectById(id);
if(baoxiao == null) {
request.setAttribute("msg", "报销记录不存在");
return "redirect:/caiwu/baoxiao/list";
}
// 设置审核状态和审核意见
baoxiao.setBaoxiaoYesnoTypes(shenheStatus);
baoxiao.setBaoxiaoYesnoText(shenheContent);
baoxiao.setUpdateTime(new Date());
// 更新数据库
baoxiaoService.updateById(baoxiao);
request.setAttribute("msg", "审核完成");
return "redirect:/caiwu/baoxiao/list";
}
// 报销列表查询
@RequestMapping("/list")
public String list(@RequestParam Map<String, Object> params, Model model) {
EntityWrapper<BaoxiaoEntity> ew = new EntityWrapper<>();
// 根据状态筛选
if(params.get("status") != null) {
ew.eq("baoxiao_yesno_types", params.get("status"));
}
PageUtils page = baoxiaoService.queryPage(params, ew);
model.addAttribute("page", page);
return "caiwu/baoxiaoList";
}
}
页面设计要点:
- 使用Bootstrap表格展示报销列表
- 不同状态使用不同颜色标签:待审核(橙色)、已通过(绿色)、已驳回(红色)
- 审核按钮触发模态框,包含审核意见文本框
- 支持按状态、时间范围筛选报销记录
2. 薪资管理模块(管理员端)
Service层代码:
@Service
public class XinziServiceImpl implements XinziService {
@Autowired
private XinziMapper xinziMapper;
@Override
public boolean addXinzi(XinziEntity xinzi) {
// 校验是否已存在相同月份的薪资记录
EntityWrapper<XinziEntity> ew = new EntityWrapper<>();
ew.eq("yuangong_id", xinzi.getYuangongId());
ew.eq("xinzi_month", xinzi.getXinziMonth());
Integer count = xinziMapper.selectCount(ew);
if(count > 0) {
throw new RuntimeException("该员工本月薪资已存在");
}
// 设置创建时间
xinzi.setCreateTime(new Date());
return xinziMapper.insert(xinzi) > 0;
}
@Override
public PageUtils queryPage(Map<String, Object> params,
EntityWrapper<XinziEntity> ew) {
Page<XinziEntity> page = new Page<>(
Integer.parseInt(params.get("page").toString()),
Integer.parseInt(params.get("limit").toString())
);
IPage<XinziEntity> result = xinziMapper.selectPage(page, ew);
return new PageUtils(result);
}
}
3. 收费信息管理(财务人员端)
Entity实体类:
@TableName("shoufei")
public class ShoufeiEntity implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(type = IdType.AUTO)
private Integer id;
// 收费名目
private String mingmuName;
// 收费类型
private Integer shoufeixinxiTypes;
// 预售金额
private BigDecimal shoufeixinxiYushouMoney;
// 实收金额
private BigDecimal shoufeixinxiShishouMoney;
// 收费时间
private Date shoufeiTime;
// 创建时间
private Date createTime;
// getter和setter方法
}
五、系统测试:确保答辩不翻车
曾经以为功能实现就万事大吉,结果导师测试时发现员工可以审核自己的报销单,这是个严重权限漏洞!从此明白了测试的重要性。
1. 功能测试用例
报销流程测试:
| 测试场景 | 操作步骤 | 预期结果 | 实际结果 |
|---|---|---|---|
| 员工提交报销 | 登录员工账号→填写报销信息→提交 | 状态显示"待审核",财务人员可见 | |
| 财务审核通过 | 登录财务账号→选择报销单→审核通过 | 状态变为"已通过",员工可见结果 | |
| 财务审核驳回 | 登录财务账号→选择报销单→填写意见→驳回 | 状态变为"已驳回",显示审核意见 | |
| 员工重复提交 | 对已审核报销单再次提交 | 提示"该报销单已审核,不能重复提交" |
权限测试:
| 测试场景 | 操作步骤 | 预期结果 |
|---|---|---|
| 员工访问财务页面 | 员工账号尝试访问/caiwu/路径 | 跳转到无权限页面或登录页 |
| 未登录访问 | 直接访问系统内部URL | 跳转到登录页面 |
2. 性能测试要点
- 数据量测试:导入1000条员工数据,测试列表页面加载速度
- 并发测试:模拟10个用户同时提交报销,检查系统响应
- 压力测试:连续操作系统2小时,观察内存占用情况
3. 兼容性测试
- 浏览器:Chrome、Firefox、Edge、IE11
- 分辨率:1920×1080、1366×768、移动端适配
- 操作系统:Windows 10、Windows 7
六、答辩准备与演示技巧
1. 演示流程设计
按照实际业务流演示,让导师看到系统的完整性:
- 管理员登录→添加员工和财务人员账号
- 员工登录→提交报销申请→填写留言
- 财务人员登录→审核报销→处理收费记录
- 管理员登录→查看系统数据统计
2. 重点问题准备
导师常问的问题和回答思路:
-
为什么选择Spring Boot? "Spring Boot简化了配置,快速开发,内嵌Tomcat便于部署"
-
系统的安全性如何保障? "使用拦截器验证登录状态,不同角色权限分离,密码MD5加密"
-
如果数据量增大如何优化? "可以添加数据库索引,分库分表,使用Redis缓存热点数据"
3. 答辩文档准备
- 系统设计文档:包含需求分析、数据库设计、架构图
- 测试报告:功能测试结果、性能测试数据
- 用户手册:各角色操作步骤说明
- 源码注释:关键代码添加详细注释
结语
纺织品企业财务管理系统毕设其实并不难,关键是抓住财务管理的核心流程,把报销、收费、支出、薪资这几个模块做深做透。使用Spring Boot+MySQL这个经典组合可以避免很多技术上的坑,把精力集中在业务逻辑实现上。
需要完整源码(含详细注释)、数据库脚本、部署文档的同学,可以在评论区留言,我会分享给大家。如果在开发过程中遇到具体技术问题,也欢迎交流讨论!
希望这篇指南能帮助大家顺利完成毕设,轻松通过答辩!