SpringBoot 2.7 + MySQL 8.0 毕设项目实战:家庭理财系统从需求到部署的 5 个关键步骤
SpringBoot 2.7 + MySQL 8.0 毕设项目实战:家庭理财系统从需求到部署的 5 个关键步骤
在计算机专业毕业设计中,一个完整的、可运行的项目往往比华丽的论文更能打动评委。本文将带你用SpringBoot 2.7和MySQL 8.0技术栈,从零开始构建一个功能完善的家庭理财系统。不同于泛泛而谈的理论指导,这里每个步骤都配有可执行的代码片段和配置示例,确保你能真正把项目跑起来。
1. 项目规划与环境搭建
任何成功的项目都始于清晰的规划。我们先定义家庭理财系统的核心功能:
- 账户管理:支持多账户创建与分类(如现金、银行卡、支付宝等)
- 收支记录:记录每笔收入的来源和支出的去向
- 统计分析:按日/月/年生成收支报表
- 预算管理:设置各类支出的预算上限
技术选型方面,我们采用以下组合:
| 技术栈 | 版本 | 用途说明 |
|---|---|---|
| SpringBoot | 2.7.x | 后端框架 |
| MySQL | 8.0 | 数据存储 |
| MyBatis-Plus | 3.5.x | ORM框架 |
| Lombok | 1.18.x | 简化实体类代码 |
| Vue.js | 3.x | 前端框架(可选) |
开发环境准备:
# 使用Spring Initializr创建项目基础结构 curl https://start.spring.io/starter.zip \ -d dependencies=web,mysql,mybatis,lombok \ -d javaVersion=11 \ -d artifactId=family-finance \ -d baseDir=family-finance \ -o family-finance.zip提示:建议使用IntelliJ IDEA作为开发IDE,其优秀的SpringBoot支持能显著提升开发效率
2. 数据库设计与实现
合理的数据库设计是系统稳定性的基石。我们采用以下表结构:
核心表关系图:
- 用户表(user) → 账户表(account)
- 账户表(account) → 交易记录表(transaction)
- 分类表(category) → 交易记录表(transaction)
建表SQL示例:
CREATE TABLE `account` ( `id` BIGINT NOT NULL AUTO_INCREMENT, `user_id` BIGINT NOT NULL, `account_name` VARCHAR(50) NOT NULL COMMENT '账户名称', `account_type` TINYINT NOT NULL COMMENT '1-现金 2-银行卡 3-电子支付', `balance` DECIMAL(12,2) NOT NULL DEFAULT 0.00, `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), INDEX `idx_user` (`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE `transaction` ( `id` BIGINT NOT NULL AUTO_INCREMENT, `account_id` BIGINT NOT NULL, `category_id` BIGINT NOT NULL, `amount` DECIMAL(12,2) NOT NULL, `transaction_type` TINYINT NOT NULL COMMENT '1-收入 2-支出', `remark` VARCHAR(200) DEFAULT NULL, `transaction_time` DATETIME NOT NULL, `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), INDEX `idx_account` (`account_id`), INDEX `idx_time` (`transaction_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;实体类映射示例:
@Data @TableName("transaction") public class Transaction { @TableId(type = IdType.AUTO) private Long id; private Long accountId; private Long categoryId; private BigDecimal amount; private Integer transactionType; private String remark; private LocalDateTime transactionTime; private LocalDateTime createTime; }3. 核心业务逻辑实现
3.1 账户资金变动处理
资金变动需要保证事务一致性,我们采用声明式事务管理:
@Service @RequiredArgsConstructor public class AccountServiceImpl implements AccountService { private final AccountMapper accountMapper; private final TransactionMapper transactionMapper; @Transactional @Override public void processTransaction(TransactionDTO dto) { // 1. 记录交易 Transaction transaction = new Transaction(); BeanUtils.copyProperties(dto, transaction); transactionMapper.insert(transaction); // 2. 更新账户余额 Account account = accountMapper.selectById(dto.getAccountId()); if (dto.getTransactionType() == 1) { account.setBalance(account.getBalance().add(dto.getAmount())); } else { account.setBalance(account.getBalance().subtract(dto.getAmount())); } accountMapper.updateById(account); } }3.2 统计报表生成
利用MySQL的窗口函数实现高效统计:
public interface TransactionMapper extends BaseMapper<Transaction> { @Select("SELECT DATE_FORMAT(transaction_time, '%Y-%m') AS month, " + "SUM(CASE WHEN transaction_type = 1 THEN amount ELSE 0 END) AS income, " + "SUM(CASE WHEN transaction_type = 2 THEN amount ELSE 0 END) AS expense " + "FROM transaction " + "WHERE user_id = #{userId} " + "GROUP BY DATE_FORMAT(transaction_time, '%Y-%m') " + "ORDER BY month DESC") List<MonthlyReportVO> getMonthlyReport(Long userId); }4. 接口设计与安全控制
采用RESTful风格API设计,配合JWT认证:
API端点示例:
- POST /api/auth/login - 用户登录
- GET /api/accounts - 获取账户列表
- POST /api/transactions - 新增交易记录
- GET /api/reports/monthly - 获取月度报表
安全配置类:
@Configuration @EnableWebSecurity @RequiredArgsConstructor public class SecurityConfig extends WebSecurityConfigurerAdapter { private final JwtAuthenticationFilter jwtAuthenticationFilter; @Override protected void configure(HttpSecurity http) throws Exception { http.csrf().disable() .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) .and() .authorizeRequests() .antMatchers("/api/auth/**").permitAll() .anyRequest().authenticated() .and() .addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class); } }5. 部署与性能优化
5.1 生产环境部署
使用Docker compose编排服务:
version: '3' services: mysql: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: root123 MYSQL_DATABASE: finance_db ports: - "3306:3306" volumes: - mysql_data:/var/lib/mysql backend: build: . ports: - "8080:8080" environment: SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/finance_db depends_on: - mysql volumes: mysql_data:5.2 性能优化要点
数据库层面:
- 为常用查询字段添加合适索引
- 对大表考虑分库分表策略
应用层面:
- 启用SpringBoot缓存
- 对报表数据使用定时任务预计算
前端优化:
- 实现分页加载
- 使用WebSocket推送余额变动通知
@Configuration @EnableCaching public class CacheConfig { @Bean public CacheManager cacheManager() { return new ConcurrentMapCacheManager("monthlyReports"); } }在项目开发过程中,我特别建议每天结束时提交代码到Git仓库,并撰写简明的提交信息。遇到复杂功能时,可以先在单独分支开发,测试通过后再合并到主分支。这种工作习惯能让你的开发过程更加有序,也方便导师检查进度。
