这个基于SpringBoot的个人财务管理系统,是我在指导本科生毕业设计时反复打磨的一个经典案例。它完美契合了"学以致用"的教学理念——学生既能掌握企业级开发的全套技术栈,又能做出一个真正解决实际痛点的作品。从技术层面看,系统采用了经典的MVC分层架构,前端用Thymeleaf模板引擎实现服务端渲染,后端通过Spring Security完成认证授权,配合MyBatis-Plus实现高效数据操作。但更值得关注的是其业务设计:不是简单的CRUD堆砌,而是融入了复式记账法的核心思想,支持多账户联动更新,自动生成现金流量表,甚至能通过消费分类预测月度支出趋势。
系统需要实现四大核心模块:
账务记录:支持收入/支出双维度记录,包含金额、分类、账户、时间、备注等字段。特别注意要处理外币换算场景,比如当用户用Visa卡进行美元消费时,系统需按实时汇率自动换算为本币记账。
统计分析:
多账户管理:
系统管理:
性能指标:
数据安全:
可扩展性:
mermaid复制graph TD
A[表现层] -->|Thymeleaf| B[业务逻辑层]
B -->|MyBatis-Plus| C[数据访问层]
C --> D[MySQL]
A -->|Ajax| E[REST API]
F[安全控制] -->|Spring Security| B
G[缓存] -->|Redis| B
(注:实际实现时需替换为文字描述)
SpringBoot 2.7.x:
MyBatis-Plus 3.5.x:
Spring Security 5.7.x:
Lombok:
| 表名 | 字段 | 说明 |
|---|---|---|
| user | id, username, password, salt | 用户基础信息 |
| account | id, user_id, account_type, balance | 资金账户表 |
| transaction | id, account_id, amount, category, remark | 交易记录表 |
| category | id, name, type, icon | 收支分类表 |
交易记录表建立复合索引:
sql复制ALTER TABLE transaction
ADD INDEX idx_user_time (user_id, transaction_time)
账户表添加外键约束:
sql复制ALTER TABLE account
ADD CONSTRAINT fk_user_account FOREIGN KEY (user_id) REFERENCES user(id)
java复制// 带事务管理的记账服务
@Transactional
public void addTransaction(TransactionDTO dto) {
// 1. 验证账户有效性
Account account = accountMapper.selectById(dto.getAccountId());
if(account == null) throw new BusinessException("账户不存在");
// 2. 创建交易记录
Transaction transaction = new Transaction();
BeanUtils.copyProperties(dto, transaction);
transactionMapper.insert(transaction);
// 3. 更新账户余额
BigDecimal newBalance = account.getBalance().add(dto.getAmount());
accountMapper.updateBalance(account.getId(), newBalance);
}
使用JPA Native Query实现复杂统计:
java复制@Query(value = "SELECT DATE_FORMAT(t.create_time,'%Y-%m') AS month, " +
"SUM(CASE WHEN t.amount > 0 THEN t.amount ELSE 0 END) AS income, " +
"SUM(CASE WHEN t.amount < 0 THEN t.amount ELSE 0 END) AS expense " +
"FROM transaction t WHERE t.user_id = :userId GROUP BY month",
nativeQuery = true)
List<Map<String, Object>> getMonthlySummary(@Param("userId") Long userId);
bash复制mysql> CREATE DATABASE finance CHARACTER SET utf8mb4;
使用Docker-compose编排:
yaml复制version: '3'
services:
app:
image: openjdk:17-jdk
ports:
- "8080:8080"
volumes:
- ./app.jar:/app.jar
command: java -jar /app.jar
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: yourpassword
volumes:
- ./mysql-data:/var/lib/mysql
在application.yml中添加:
yaml复制spring:
datasource:
url: jdbc:mysql://localhost:3306/finance?serverTimezone=Asia/Shanghai
配置WebMvcConfigurer:
java复制@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurer() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("GET", "POST");
}
};
}
项目源码已托管至Gitee,包含完整数据库脚本和API文档。在实际教学中发现,学生最容易出错的是事务边界控制,建议重点讲解@Transactional的传播机制。系统默认使用内存数据库H2方便演示,切换MySQL时需注意字段类型的兼容性问题。