1. 项目背景与核心价值
记账类应用作为个人财务管理的基础工具,在移动互联网时代有着广泛的应用场景。对于计算机相关专业的毕业生而言,采用Spring Boot框架开发一个完整的记账小程序,既能满足毕业设计的学术要求,又具备实际应用价值。这个选题之所以经典,主要体现在三个方面:
- 技术栈覆盖全面:涉及Spring Boot核心功能、数据库操作、前后端交互等企业级开发必备技能
- 业务逻辑适中:既包含CRUD基础操作,又可扩展统计分析等进阶功能
- 可扩展性强:从单机版可演进为多用户云服务,展示架构设计能力
我去年指导过5个类似选题的毕业设计,发现同学们最容易在数据统计模块和权限控制上遇到瓶颈。本文将分享一个经过实战检验的实现方案,包含完整源码和关键实现细节。
2. 技术选型与项目架构
2.1 基础技术栈说明
本系统采用主流Java技术栈:
- 后端框架:Spring Boot 2.7 + MyBatis Plus
- 数据库:MySQL 8.0(开发环境可用H2内存数据库)
- 前端技术:Thymeleaf模板引擎 + Bootstrap 5
- 构建工具:Maven
选择MyBatis Plus而非JPA的考虑:国内企业使用MyBatis更普遍,且对于需要手写复杂SQL的统计报表场景更灵活
2.2 项目目录结构
标准Maven项目结构如下:
code复制src/
├── main/
│ ├── java/
│ │ └── com/
│ │ └── example/
│ │ └── accountbook/
│ │ ├── config/ # 配置类
│ │ ├── controller/ # 控制器
│ │ ├── entity/ # 实体类
│ │ ├── mapper/ # MyBatis接口
│ │ ├── service/ # 业务逻辑
│ │ └── Application.java # 启动类
│ └── resources/
│ ├── static/ # 静态资源
│ ├── templates/ # 页面模板
│ └── application.yml # 配置文件
3. 核心功能实现详解
3.1 数据库设计
主要表结构设计(DDL示例):
sql复制CREATE TABLE `t_transaction` (
`id` bigint NOT NULL AUTO_INCREMENT,
`user_id` bigint NOT NULL COMMENT '用户ID',
`amount` decimal(10,2) NOT NULL COMMENT '金额',
`category` varchar(20) NOT NULL COMMENT '分类',
`type` tinyint NOT NULL COMMENT '1收入 2支出',
`remark` varchar(255) DEFAULT NULL COMMENT '备注',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `t_category` (
`id` bigint NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL,
`icon` varchar(50) DEFAULT NULL,
`type` tinyint NOT NULL COMMENT '1收入 2支出',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
3.2 账目记录CRUD实现
以新增记录为例展示Service层实现:
java复制@Service
@RequiredArgsConstructor
public class TransactionService {
private final TransactionMapper transactionMapper;
@Transactional
public void addTransaction(TransactionDTO dto) {
// 参数校验
if (dto.getAmount().compareTo(BigDecimal.ZERO) <= 0) {
throw new IllegalArgumentException("金额必须大于0");
}
Transaction transaction = new Transaction();
BeanUtils.copyProperties(dto, transaction);
transaction.setCreateTime(LocalDateTime.now());
// 检查分类是否存在
Category category = categoryService.getById(dto.getCategoryId());
if (category == null || !category.getType().equals(dto.getType())) {
throw new IllegalArgumentException("分类不存在或类型不匹配");
}
transactionMapper.insert(transaction);
}
}
3.3 统计报表功能
实现月度收支统计的Mapper XML示例:
xml复制<select id="getMonthlySummary" resultType="com.example.accountbook.vo.MonthlySummaryVO">
SELECT
DATE_FORMAT(create_time, '%Y-%m') AS month,
SUM(CASE WHEN type = 1 THEN amount ELSE 0 END) AS income,
SUM(CASE WHEN type = 2 THEN amount ELSE 0 END) AS expense
FROM t_transaction
WHERE user_id = #{userId}
GROUP BY DATE_FORMAT(create_time, '%Y-%m')
ORDER BY month DESC
LIMIT 12
</select>
对应的Controller接口:
java复制@GetMapping("/report/monthly")
public ResultVO<List<MonthlySummaryVO>> getMonthlyReport(
@RequestHeader("X-User-Id") Long userId) {
return ResultVO.success(transactionService.getMonthlySummary(userId));
}
4. 关键问题解决方案
4.1 金额计算的精度处理
财务系统必须避免使用float/double存储金额,应采用:
java复制// 实体类字段定义
@Column(precision = 10, scale = 2)
private BigDecimal amount;
// 计算示例
BigDecimal total = transactionList.stream()
.map(Transaction::getAmount)
.reduce(BigDecimal.ZERO, BigDecimal::add);
4.2 分类数据缓存优化
使用Spring Cache减少分类查询的数据库访问:
java复制@Service
@CacheConfig(cacheNames = "category")
public class CategoryService {
@Cacheable(key = "#type")
public List<Category> getByType(Integer type) {
return lambdaQuery()
.eq(Category::getType, type)
.list();
}
}
4.3 日期时间处理
统一采用Java 8的Time API:
java复制// 查询当天记录示例
LocalDate today = LocalDate.now();
List<Transaction> todayList = lambdaQuery()
.ge(Transaction::getCreateTime, today.atStartOfDay())
.lt(Transaction::getCreateTime, today.plusDays(1).atStartOfDay())
.list();
5. 部署与运行指南
5.1 开发环境配置
- 安装JDK 11+和MySQL 8.0
- 导入SQL脚本初始化数据库
- 修改application.yml中的数据库连接配置
- 运行Application主类启动项目
5.2 生产环境部署建议
使用Docker Compose部署方案:
yaml复制version: '3'
services:
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: root
volumes:
- mysql_data:/var/lib/mysql
app:
image: openjdk:11-jre
depends_on:
- mysql
ports:
- "8080:8080"
volumes:
- ./target/accountbook.jar:/app.jar
command: java -jar /app.jar
volumes:
mysql_data:
6. 毕设扩展建议
6.1 功能扩展方向
- 多账本支持:允许用户创建多个独立账本
- 预算管理:设置月度预算并提醒超支
- 数据导出:支持Excel/PDF格式导出报表
- 移动端适配:开发配套微信小程序
6.2 技术深化建议
- 集成Spring Security实现完整权限控制
- 使用Redis缓存热点数据
- 添加Swagger接口文档
- 实现简单的CI/CD流水线
源码获取方式:项目完整代码已托管至Gitee仓库(搜索"accountbook-springboot"),包含详细的README说明文档。在实现过程中特别注意事务边界控制和异常处理,这是我在代码审查时发现学生最容易忽视的两个关键点。
