简介基于Spring Boot与React构建的Java家庭理财系统完整源码包面向希望掌握全栈业务开发流程的Java学习者和毕业设计学生能帮助解决家庭理财项目从环境搭建到功能落地的完整实现问题。压缩包共246个文件压缩后约4.48MB文件类型以Java后端逻辑、JS/JSX前端组件、XML/YML配置文件、SQL脚本和说明文档为主可分别支撑系统服务、页面交互、环境配置与数据初始化。系统内置家庭理财常见模块包括支出与收入管理、支出类型分析、股市与基金走势展示、已买股票和基金增删改、外债借出借入、固定资产房贷车贷管理以及月末年末报表生成业务维度较完整结合Nginx、Tomcat、MySQL、Redis、RabbitMQ等运行环境也能够帮助理解微服务化改造和消息中间件接入方式。包内还附带论文正文和核心业务类示例代码便于对照学习系统设计与编码实现目前已有537人学习下载适合直接导入开发工具运行并基于现有模块做二次扩展。1. Java家庭理财系统源码一个能落地的 Spring Boot 记账台如果你跟我一样手里攒着工资、房贷、基金和几笔外债光靠记账 App 永远对不上账那这套 Java 家庭理财系统源码值得你花一个晚上拆开看。它不是那种只能演示登录注册的教学项目而是把支出、收入、股票、基金、外债、固定资产、月末年末报表都串起来的完整 B/S 结构应用。后端用 Spring Boot 2.0.7 配合 SpringCloud Finchley.SR2前端走 React 16 Ant Design Pro 4.0.0图表用 Echarts 渲染静态服务交给 Nginx应用层挂 TomcatMySQL 5.7.30 存流水Redis 6.0.8 扛会话和缓存。适合两类人一类是刚学完 Spring Boot 想找完整项目源码练手的 Java 开发工程师另一类是家里账目复杂、想把收支和持仓放到自己服务器上的实操派。2. 技术栈与工程结构Spring Boot 2.0.7 与 React 16 是怎么组装的2.1 后端微服务边界B/S 双层容器怎么分这套系统的后端不是一个大而全的 war 包硬塞进 Tomcat而是沿着 Spring Cloud 的思路把模块化拆开。从friday-registry.iml这类工程文件能看出它保留了注册中心、业务服务和公共依赖的目录骨架。服务运行在 Tomcat 8.5.59 里Nginx 1.14.2 负责静态资源转发RabbitMQ 3.4 做消息中间件。构建层面统一用 Maven 3.6.3Java 版本锁定在 1.8.0_251这意味着你本机 JDK 必须是 8 的某个小版本用 11 或 17 直接编会有兼容性问题。我第一次拆这类源码时习惯先看pom.xml和.editorconfig这样能快速判断团队锁了哪些依赖版本。这套系统的核心依赖大致如下组件版本作用Spring Boot2.0.7.RELEASE业务接口与自动装配Spring CloudFinchley.SR2服务注册发现与配置管理MySQL5.7.30结构化账目数据持久化Redis6.0.8会话、缓存、热点数据RabbitMQ3.4异步消息与报表生成通知2.2 前端 Ant Design Pro 4 的工程组织与图表依赖前端部分用 React 16.0.19 做基础库脚手架走 Ant.Design.pro 4.0.0。如果你之前只写过 jQuery 或原生 JS第一次看 Ant Design Pro 的目录结构会觉得有点重但其实它的约定很清晰pages下面按业务模块放页面services里放接口调用封装models里管理全局状态。图表部分引入Echarts-For-React-2.0.16这是一个把 Echarts 封装成 React 组件的桥接层。图表是这套系统最直观的展示层。它拆分了几类图表场景本日、本月、本年的支出柱状图支出类型分析用的饼图收入趋势用的折线图股票和基金走势用的 K 线或面积图。实际看源码你会发现图表配置并没有写死在组件里而是通过后端接口返回的option结构体直接传给 Echarts。这种做法在前后端分离项目里很实用因为报表口径经常变改后端比改前端发版成本低得多。2.3 一条数据链路从 MySQL 流水表到 Echarts 图表收支这块的表结构不算复杂典型的流水表设计id、type、amount、occur_date、note、create_time。后端通过 MyBatis 或 JPA 查询聚合再返回 JSON 给前端渲染。以“本日支出”为例一个常见的 service 实现会是这样public ListExpenseVO getTodayExpense() { String today LocalDate.now().format(DateTimeFormatter.ofPattern(yyyy-MM-dd)); QueryWrapperExpenseRecord wrapper new QueryWrapper(); wrapper.ge(occur_date, today) .lt(occur_date, today 23:59:59); ListExpenseRecord records expenseMapper.selectList(wrapper); // 按支出类型分组聚合 return records.stream() .collect(Collectors.groupingBy(ExpenseRecord::getType)) .entrySet().stream() .map(e - new ExpenseVO(e.getKey(), e.getValue().stream().mapToDouble(ExpenseRecord::getAmount).sum())) .collect(Collectors.toList()); }这段代码的逻辑不复杂先拿到当天零点的时间字符串再查occur_date在这个区间内的所有流水最后按type分组求和。实际生产里我会建议把occur_date建成普通索引否则随着流水增多这个查询会变成慢查询。前端拿到ListExpenseVO后直接映射成 Echarts 的pie数据源饼图就出来了。整个过程里Redis 的主要价值是缓存这些聚合结果避免每次刷新页面都去打一次 MySQL。3. 核心业务模块收支、股市基金、外债与固定资产的落点3.1 收支统计与类型分析三个时间刻度怎么处理系统把支出情况拆成三个时间刻度本日、本月、本年。这三个查询的 SQL 写法套路是一样的区别只在时间范围。我建议你拿到源码后重点看 mapper 里的 XML 或注解 SQL因为它能直接看出作者对日期函数的处理习惯。有的项目用DATE_FORMAT(occur_date, %Y-%m-%d) CURDATE()有的用occur_date BETWEEN ? AND ?前者在日期字段没建索引时会全表扫描后者只要索引命中就很快。收入模块相对简单只按月、按年统计因为它不像支出那样需要盯每日流水。收入类型分析图一般就是饼图按工资、奖金、理财收益等分类。这里有一个值得复用的点类型字典没有写死在枚举里而是单独维护了一张字典表后期加一个“副业收入”类型不用改代码只改数据库数据。3.2 股市与基金行情趋势图与持仓的增删改这一块是系统里最贴近真实投资场景的部分。它把“看市场”和“管持仓”拆成两个区域上方展示当前股市走势图和基金市场走势图下方维护用户已购买的股票和基金列表支持增删改操作。走势图这一层一般对接的是公开行情接口通过后端定时任务把快照数据拉到本地缓存然后前端用折线图或蜡烛图画出来。如果你要部署到自己服务器上注意行情接口的调用频率往往有限制不要在前端直连一定要走后端代理。已买股票的表结构我建议至少包含这些字段字段说明stock_code股票代码stock_name股票名称buy_price买入价hold_shares持有股数buy_date买入日期remark备注持仓的成本计算和盈亏展示由后端算好再返回不在前端做浮点运算避免 JavaScript 的精度问题。3.3 外债、固定资产与月末年报表的聚合逻辑外债情况拆成“借出”和“借入”两个方向这个在表设计上其实就是加了一个方向字段。需要注意的是一笔外债可能跨月甚至跨年所以它不能按月度报表直接汇总得用status字段标记是否已结清报表统计时默认只算未结清的余额。固定资产部分最有意思的是它同时处理了两类情况房贷车贷这类分期负债以及全款购置的资产。房贷车贷要记录贷款总额、已还期数、每期还款额系统按剩余本金计算资产负债率全款资产则直接记录购置价格和购置日期。月度报表和年度报表的生成逻辑会把这些数据连同收入支出一起跑汇总生成一份 PDF 或 Excel 导出文件。这个生成动作我是建议走 RabbitMQ 异步队列的——点击“生成报表”立刻返回后台线程慢慢算算完通知下载体验比页面转圈好得多。4. 从源码到本地跑通Nginx Tomcat MySQL 5.7 Redis 6 部署实录4.1 版本选型与环境准备这套系统对版本敏感部署的第一步不是写代码而是把环境对齐。我踩过太多 Java 项目“本地能跑、服务器跑不起来”的坑八成是版本不一致。下面是完整的环境对照清单软件版本安装备注JDK1.8.0_251必须 8不能用更高版本Maven3.6.3依赖管理和打包MySQL5.7.30建库 utf8mb4Redis6.0.8默认端口 6379Tomcat8.5.59后端应用容器Nginx1.14.2静态文件与反向代理RabbitMQ3.4消息队列报表生成用装好这些之后用java -version和mvn -v先确认两个最基本的命令都正常。如果 JDK 版本不对后面 Maven 编译大概率会报invalid target release或者一堆UnsupportedClassVersionError。4.2 数据库初始化、Redis 配置、后端启动拿到源码包后先找sql目录里的初始化脚本。正常做法是用 root 登录 MySQL创建一个独立账号和业务库比如mysql -uroot -p CREATE DATABASE family_finance DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; CREATE USER finance_userlocalhost IDENTIFIED BY your_password; GRANT ALL PRIVILEGES ON family_finance.* TO finance_userlocalhost; FLUSH PRIVILEGES; EXIT;然后导入工程里自带的.sql文件把表结构和初始字典数据装进去。导入之后一定要抽查几张表确认中文没乱码SELECT * FROM expense_type;。这一步能提前暴露字符集问题。数据库搞完改配置文件。在application.yml或application.properties里重点检查三处数据源地址、Redis 连接、RabbitMQ 连接。启动后端一般是这样cd /path/to/project mvn clean package -DskipTests java -jar target/family-finance.jar --spring.profiles.activedev后端启动后先用简单命令探活curl http://localhost:8080/api/health能返回 JSON 说明 Tomcat 和 Spring 容器起来了。如果起不来先看日志里的第一个异常八成不是 Redis 连不上就是数据库密码配错。4.3 前端打包与 Nginx 反向代理后端活着前端才能干活。前端项目安装依赖、打包生成静态资源cd frontend npm install --registryhttps://registry.npmmirror.com npm run build构建完会在dist目录产出静态文件。把这些文件放到 Nginx 的 html 目录下然后配置反向代理把/api开头的请求转发到 Tomcatserver { listen 80; server_name your-domain.com; location / { root /usr/share/nginx/html; index index.html; try_files $uri $uri/ /index.html; } location /api/ { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }这个配置里try_files是给 React Router 用的防止前端路由刷新后 404。proxy_pass后面没带路径时Nginx 会把请求原样转发到后端后端接口如果统一带了/api前缀就能直接命中。5. 部署与运行避坑最容易翻车的五个细节5.1 界面中文全变问号罪魁祸首是字符集现象系统登录后支出类型、收入类型、菜单名全部显示为???。原因MySQL 数据库或表的字符集不是 utf8mb4导入数据时中文被转成了无法识别的编码。还有一种可能是后端 JDBC URL 里漏了characterEncodingutf-8参数。解决建库时强制DEFAULT CHARACTER SET utf8mb4检查后端连接串jdbc:mysql://localhost:3306/family_finance?useUnicodetruecharacterEncodingutf-8serverTimezoneAsia/Shanghai改完库表和连接串重新导入一遍 SQL 脚本别只改一处。5.2 Redis 没配密码后端启动秒报 RedisConnectionException现象后端启动日志里出现RedisConnectionException: Unable to connect to localhost:6379。原因Redis 6 默认配置下没有密码保护但后端的配置文件里写了password字段两边对不上。反过来也常见本机 Redis 配了密码但配置文件里是空的。解决redis-cli进去执行CONFIG SET requirepass your_password或直接在redis.conf里写死。然后保持后端配置文件的密码与 Redis 一致。如果只是本地测试最简单的做法是把后端配置里的 Redis 密码删掉。5.3 RabbitMQ 没装或没启动注册中心拉不到服务现象前端登录成功后部分下拉框和数据加载转圈但后端单独测接口又是通的。原因这套系统启动时如果friday-registry依赖了 RabbitMQ而 RabbitMQ 服务没起来Spring Cloud 的服务发现会反复重试业务接口虽然能调但前端在等一个永远不来的响应。解决先把 RabbitMQ 启动起来systemctl start rabbitmq-server然后用rabbitmqctl status确认运行中。再重启后端服务。如果项目里有些模块不需要消息队列也可以直接把对应配置注释掉减少启动时的心跳重试。5.4 Nginx 转发后接口 404路径多了个 context现象前端能打开首页但点击任何菜单时接口报404 Not Found而用curl直接打 Tomcat 地址是通的。原因后端应用部署在 Tomcat 时带了 context path比如访问路径是http://localhost:8080/family-finance/api/expense而 Nginx 转发时只把请求转到了http://127.0.0.1:8080context 路径被丢了。解决如果王后端应用发布了family-finance这个 context反向代理要补上location /api/ { proxy_pass http://127.0.0.1:8080/family-finance/api/; }注意proxy_pass末尾带不带斜杠行为不同带/family-finance/api/就是把/api/替换成/family-finance/api/。5.5 Echarts 图表白屏控制台报Cannot read properties of undefined现象页面框架正常渲染但所有图表区域都是空白浏览器控制台报Cannot read properties of undefined (reading series)。原因前端拿到的图表配置里数据字段为空。通常是后端接口返回的data是null而Echarts-For-React组件在初始化时直接访问了不存在的字段。解决不急着改前端组件先看后端接口返回了什么。用 Postman 调一次图表数据接口确认是不是 Redis 缓存里没有数据导致降级返回了空对象。常见做法是在后端聚合方法里对空数据做兜底if (list null || list.isEmpty()) { return new ExpenseVO(暂无数据, 0.0); }前端组件拿到空数据后渲染成“暂无数据”的空态比一个白屏更容易让用户接受。6. 用月末报表验证系统从“能跑”到“账目可信”这周我重新部署这套系统时没有直接拿真实家庭数据测试而是先造了一批跨月、跨年的模拟流水专门用来验证月末报表和年末报表的聚合逻辑。具体做法是往expense_record表里插入三个月前、两个月前、上个月和本月的多条记录金额故意取带两位小数的数比如328.57、1299.00。然后跑一次月末报表生成拿系统算出来的总额跟我在 SQL 里手动 sum 的结果比对。SELECT DATE_FORMAT(occur_date, %Y-%m) AS month, SUM(amount) AS total FROM expense_record WHERE occur_date 2025-01-01 GROUP BY DATE_FORMAT(occur_date, %Y-%m);这一步能同时验证三件事日期函数是否跨年正确、金额聚合是否有精度丢失、报表导出是否真包含了所有已结清和未结清的条目。我的习惯是把系统报表导出的 Excel 和这条 SQL 的结果放在一起逐月对差额差一分钱也要查到底。验证通过之后再接入真实账目。你会发觉这套系统真正的价值不在“记账”这个动作而在月末报表和年末报表帮你把碎片数据变成可盘点的资产视图。如果你想改成适合自己的家庭结构优先扩展expense_type字典表把“孩子教育”“赡养老人”这类分类加进去前端图表和报表会自动跟着变不用碰代码。从那以后我每次部署财务类系统都会强制走一遍“造数据 → 手动聚合比对 → 对上再上线”的流程这已经成了我拆这类源码的默认动作。希望帮到你少走这一段弯路。本文还有配套的精品资源点击获取