基于SSM框架的个人财务管理系统 - 源码深度解析
在个人财务管理领域,传统的手工记账和电子表格方式存在诸多痛点:数据易丢失、统计效率低、查询不便、缺乏数据分析能力。针对这些行业痛点,我们设计并实现了"智能账本管家"个人财务管理系统。该系统基于成熟的SSM(Spring + Spring MVC + MyBatis)技术栈构建,为用户提供专业级的财务数据管理体验。
系统架构与技术栈选型
整体架构设计
系统采用经典的三层架构模式,确保各层职责清晰分离:
- 表示层:基于HTML5、CSS3和原生JavaScript构建响应式用户界面
- 业务逻辑层:Spring框架实现依赖注入和面向切面编程
- 数据访问层:MyBatis作为ORM框架处理数据库交互
技术栈详解
<!-- Maven依赖管理核心配置 -->
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.18</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.7</version>
</dependency>
</dependencies>
架构优势分析:
- Spring IoC容器统一管理Bean生命周期,降低组件耦合度
- AOP机制实现声明式事务管理,确保数据一致性
- MyBatis动态SQL支持,提升查询灵活性
- Maven标准化依赖管理,保证项目可维护性
数据库设计亮点与优化策略
核心表结构设计
系统数据库设计遵循第三范式,通过三张核心表支撑完整业务逻辑:
用户表(user)安全设计
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`name` varchar(50) NOT NULL DEFAULT '0' COMMENT '用户名',
`password` varchar(50) NOT NULL DEFAULT '0' COMMENT '密码',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户表'
设计亮点:
- 自增主键确保ID唯一性和连续性
- utf8mb4字符集完整支持Unicode,兼容emoji表情
- 密码字段预留50字符长度,为BCrypt等加密算法升级做准备
分类表(category)多租户隔离
CREATE TABLE `category` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`name` varchar(50) DEFAULT NULL COMMENT '分类名称',
`uid` int(11) DEFAULT NULL COMMENT '用户ID',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='分类表'
多租户实现:
- 通过uid字段实现数据逻辑隔离
- 支持用户自定义分类体系(餐饮、交通、娱乐等)
- 索引优化:为uid字段建立非聚集索引提升查询性能
记录表(record)业务核心设计
CREATE TABLE `record` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`type` int(11) NOT NULL DEFAULT 0 COMMENT '记录类型',
`spend` bigint(20) NOT NULL DEFAULT 0 COMMENT '花费金额',
`cid` int(11) NOT NULL DEFAULT 0 COMMENT '分类ID',
`comment` varchar(50) NOT NULL DEFAULT '0' COMMENT '备注说明',
`date` timestamp NOT NULL DEFAULT current_timestamp() COMMENT '记录日期',
`uid` int(11) NOT NULL DEFAULT 0 COMMENT '用户ID',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='记录表'
金额处理最佳实践:
- 使用bigint存储金额(单位:分),避免浮点数精度问题
- timestamp自动记录时间,确保审计追踪完整性
- 复合索引(uid, date)优化时间范围查询性能

核心功能实现细节
用户认证与会话安全
系统采用Session-Cookie机制实现状态管理,确保多用户数据隔离:
@RequestMapping("billCategoryAddAjax")
@ResponseBody
public String billCategoryAddAjax(Category category, HttpSession session) {
// 会话验证
User user = (User) session.getAttribute("user");
if (user == null)
return "fail";
// XSS防护
String name = HtmlUtils.htmlEscape(category.getName());
// 数据绑定
category.setUid(user.getId());
category.setName(name);
// 事务操作
categoryService.add(category);
return "success";
}
安全特性:
- 会话超时机制自动销毁敏感数据
- HTML转义防止跨站脚本攻击(XSS)
- 基于用户ID的数据访问控制
分类管理模块实现
支持动态分类管理,采用AJAX技术提升用户体验:

@RequestMapping("billCategoryRefreshByUid")
@ResponseBody
public String billCategoryRefreshByUid(HttpSession session) {
User user = (User) session.getAttribute("user");
int uid = user.getId();
// 数据库查询优化:使用二级缓存
List<Category> categories = categoryService.listByUid(uid);
// JSON序列化配置
return JSONObject.toJSONString(categories,
SerializerFeature.DisableCircularReferenceDetect);
}
性能优化:
- MyBatis二级缓存减少数据库访问频次
- FastJSON定制序列化策略提升传输效率
- 懒加载策略优化大数据量场景
账目记录业务逻辑
账目录入功能集成数据验证和业务规则处理:

@Service
@Transactional
public class RecordService {
public void addRecord(Record record) {
// 业务规则验证
if (record.getSpend() <= 0) {
throw new BusinessException("金额必须大于0");
}
// 数据完整性处理
if (record.getDate() == null) {
record.setDate(new Date());
}
// 审计日志记录
log.info("用户{}新增记录:金额{}", record.getUid(), record.getSpend());
recordMapper.insert(record);
}
public List<Record> listByDateRange(int uid, Date startDate, Date endDate) {
Map<String, Object> params = new HashMap<>();
params.put("uid", uid);
params.put("startDate", startDate);
params.put("endDate", endDate);
// 动态SQL查询
return recordMapper.selectByDateRange(params);
}
}
数据统计与可视化分析
系统提供多维度数据分析功能,通过图表展示财务趋势:

@Controller
public class ReportController {
@RequestMapping("financialReport")
public String generateReport(HttpSession session, Model model) {
User user = (User) session.getAttribute("user");
int uid = user.getId();
// 多线程数据聚合
CompletableFuture<List<Record>> recordsFuture =
recordService.listOrderByDateAsync(uid);
CompletableFuture<List<Category>> categoriesFuture =
categoryService.listByUidAsync(uid);
// 数据聚合计算
Map<String, Object> reportData = calculateReportData(
recordsFuture.join(), categoriesFuture.join());
model.addAttribute("report", reportData);
return "financialReport";
}
private Map<String, Object> calculateReportData(
List<Record> records, List<Category> categories) {
Map<String, Object> result = new HashMap<>();
// 分类统计
for (Category category : categories) {
long categorySpend = 0;
int recordCount = 0;
for (Record record : records) {
if (record.getCid() == category.getId()) {
categorySpend += record.getSpend();
recordCount++;
}
}
// 统计结果封装
result.put(category.getName() + "_spend", categorySpend);
result.put(category.getName() + "_count", recordCount);
}
return result;
}
}
系统特色与技术创新
- 架构设计:采用分层架构+设计模式,保证系统可扩展性
- 数据安全:多层次验证机制,防止越权访问和数据泄露
- 性能优化:数据库索引优化+缓存策略,提升响应速度
- 用户体验:AJAX异步交互+响应式设计,操作流畅直观
该系统不仅解决了传统财务管理的痛点,更为开发者提供了SSM框架企业级应用的最佳实践参考。