1. 项目概述
这个基于SpringBoot和SSM框架的家庭个人收支管理系统,是我在开发个人财务管理工具时的一个实践项目。作为一个长期关注家庭财务健康的开发者,我发现市面上大多数记账软件要么功能过于复杂,要么无法满足个性化需求。于是决定自己动手开发一个轻量级但功能完备的系统,既能满足日常记账需求,又能提供实用的统计分析功能。
系统采用SpringBoot 2.7作为基础框架,整合了MyBatis作为持久层框架,前端使用Thymeleaf模板引擎。数据库选用MySQL 8.0,整个系统设计遵循MVC模式,实现了收支记录、分类管理、报表统计等核心功能模块。
2. 技术架构解析
2.1 SpringBoot框架选型
选择SpringBoot主要基于以下几个考虑:
- 快速启动:内嵌Tomcat,无需单独部署
- 约定优于配置:减少XML配置
- 丰富的Starter依赖:轻松集成其他组件
- 完善的生态:社区支持强大
在实际开发中,我特别使用了SpringBoot的以下特性:
- Actuator端点监控
- DevTools热部署
- 自动配置的数据源
- 内置的缓存支持
2.2 SSM框架整合
SSM(Spring+SpringMVC+MyBatis)是Java Web开发的经典组合。在这个项目中:
Spring:
- 负责IoC容器管理
- AOP事务控制
- 各组件间的依赖注入
SpringMVC:
- 处理HTTP请求
- 路由分发
- 参数绑定
- 视图解析
MyBatis:
- ORM映射
- 动态SQL
- 二级缓存
- 插件扩展
整合过程中特别注意了:
- MyBatis-Spring的版本兼容性
- 事务管理器的配置
- 分页插件的集成
3. 核心功能实现
3.1 收支记录模块
这是系统的核心功能,实现了:
- 收入/支出记录CRUD
- 多条件复合查询
- 批量导入导出
- 附件上传
关键技术点:
java复制// 示例:收支记录实体类
@Data
@TableName("t_finance_record")
public class FinanceRecord {
@TableId(type = IdType.AUTO)
private Long id;
private BigDecimal amount;
private Integer type; // 1收入 2支出
private Long categoryId;
private Date recordTime;
private String remark;
private String attachment;
// getter/setter...
}
3.2 分类管理模块
支持多级分类管理:
- 收入分类(工资、投资、其他)
- 支出分类(餐饮、交通、娱乐等)
- 自定义分类图标
- 分类预算设置
实现要点:
- 树形结构存储
- 递归查询
- 分类统计关联
3.3 报表统计模块
提供多种统计分析:
- 日/周/月/年收支对比
- 分类占比饼图
- 趋势折线图
- 预算执行情况
技术实现:
- 使用ECharts可视化
- 动态SQL统计查询
- 定时任务生成月报
4. 数据库设计
4.1 主要表结构
用户表(t_user):
sql复制CREATE TABLE `t_user` (
`id` bigint NOT NULL AUTO_INCREMENT,
`username` varchar(50) NOT NULL,
`password` varchar(100) NOT NULL,
`email` varchar(100) DEFAULT NULL,
`avatar` varchar(255) DEFAULT NULL,
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `idx_username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
收支记录表(t_finance_record):
sql复制CREATE TABLE `t_finance_record` (
`id` bigint NOT NULL AUTO_INCREMENT,
`user_id` bigint NOT NULL,
`amount` decimal(12,2) NOT NULL,
`type` tinyint NOT NULL COMMENT '1收入 2支出',
`category_id` bigint NOT NULL,
`record_time` datetime NOT NULL,
`remark` varchar(255) DEFAULT NULL,
`attachment` varchar(255) DEFAULT NULL,
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_user_time` (`user_id`,`record_time`),
KEY `idx_category` (`category_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
4.2 索引优化
针对查询特点建立了以下索引:
- 用户+时间的联合索引
- 分类ID索引
- 金额范围索引
5. 系统安全设计
5.1 认证与授权
采用Spring Security实现:
- 基于JWT的认证
- RBAC权限模型
- 密码加密存储
- 防暴力破解
关键配置:
java复制@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.authorizeRequests()
.antMatchers("/api/auth/**").permitAll()
.anyRequest().authenticated()
.and()
.addFilter(new JwtAuthenticationFilter(authenticationManager()))
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS);
}
}
5.2 数据安全
- 敏感字段加密
- SQL注入防护
- XSS过滤
- 定期备份机制
6. 性能优化实践
6.1 缓存策略
采用多级缓存:
- 本地Caffeine缓存
- Redis分布式缓存
- 数据库查询缓存
配置示例:
yaml复制spring:
cache:
type: redis
redis:
time-to-live: 3600000
key-prefix: "finance:"
cache-null-values: false
6.2 异步处理
使用Spring异步特性:
- 邮件发送异步化
- 报表生成异步化
- 日志记录异步化
实现方式:
java复制@Service
public class ReportService {
@Async
public CompletableFuture<Report> generateMonthlyReport(Long userId) {
// 报表生成逻辑
return CompletableFuture.completedFuture(report);
}
}
7. 部署与运维
7.1 部署方案
采用Docker容器化部署:
- 应用容器
- MySQL容器
- Redis容器
- Nginx反向代理
docker-compose示例:
yaml复制version: '3'
services:
app:
image: finance-app:latest
ports:
- "8080:8080"
depends_on:
- mysql
- redis
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: finance
redis:
image: redis:6.0
7.2 监控方案
- SpringBoot Actuator
- Prometheus指标收集
- Grafana可视化
- ELK日志系统
8. 开发心得与避坑指南
8.1 开发中的关键决策
-
放弃使用前端框架,选择Thymeleaf模板
- 项目规模不大,没必要引入复杂前端框架
- 开发效率更高,学习成本更低
-
采用JWT而非Session
- 更适合前后端分离
- 无状态更易扩展
-
报表生成使用异步任务
- 避免阻塞主线程
- 提升用户体验
8.2 遇到的典型问题
问题1:分类删除时关联记录处理
- 现象:删除分类后,关联的收支记录变成"孤儿"
- 解决方案:采用逻辑删除+分类合并功能
问题2:大数据量统计性能差
- 现象:年度报表生成缓慢
- 解决方案:预聚合+定时任务+缓存
问题3:金额计算精度问题
- 现象:浮点数计算出现精度丢失
- 解决方案:统一使用BigDecimal类型
8.3 给开发者的建议
- 数据库设计阶段就要考虑统计需求
- 金额相关字段一定要用Decimal/BigDecimal
- 建立合理的索引提升查询性能
- 重要操作记录日志
- 定期备份数据
9. 系统扩展方向
- 移动端适配
- 多账本支持
- 账单自动识别
- 财务规划建议
- 第三方支付对接
实现这些扩展需要注意:
- 保持核心架构稳定
- 设计良好的API接口
- 考虑数据隔离需求
- 评估性能影响
这个项目从设计到实现大约花费了3个月时间,期间不断调整优化,最终形成了一个稳定可用的家庭财务管理系统。通过这个项目,我深刻体会到即使是看似简单的个人项目,也需要考虑诸多技术细节和用户体验问题。