ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

SpringBoot+Vue前后端分离个人理财系统实战与部署全记录

SpringBoot+Vue前后端分离个人理财系统实战与部署全记录 前后端分离个人理财系统实战SpringBootVueMyBatisMySQL完整源码与部署全记录做Java全栈的朋友肯定有这种体会看教程时什么都懂一上手写完整项目就四处碰壁。前后端分离这个概念说了好几年了但真要把一个能跑通的完整系统从零搭出来涉及的知识点远比想象中多——前端工程化、后端接口设计、跨域处理、数据库建模哪一个环节没处理好项目就跑不起来。这套个人理财系统是我近期完整梳理过的一个实战项目技术栈是SpringBootVueMyBatisMySQL前后端完全分离。麻雀虽小五脏俱全账目管理、收支统计、分类报表、数据可视化这些核心功能都有。更关键的是这套项目的源码结构和部署流程都能直接迁移到简历项目或者课程设计里对正在学SpringBoot整合Vue的同学、准备毕设的学生、想做个完整作品集的新人来说参考价值都比较高。这篇内容我打算从项目设计思路、核心模块实现、部署操作步骤、常见坑点排查这几个维度展开尽量把整个项目掰开揉碎讲清楚让大家拿到源码后能顺利跑起来也能真正理解每一层代码背后的设计逻辑。1. 项目整体设计与思路拆解1.1 前后端分离架构下的模块划分个人理财系统说白了就是一套账本管理工具核心业务围绕“记账”和“分析”展开。前端负责用户交互和数据展示后端提供接口和业务逻辑两者通过HTTPJSON进行通信。我在设计这个项目时没有把它做成传统的服务端渲染模式而是坚持了前后端完全分离的架构。前端项目独立运行在8080端口使用Vue脚手架搭建后端SpringBoot项目运行在8081端口通过接口对外提供服务。这样做的好处很明显前后端可以并行开发后端接口用Postman调试好之后前端直接对接即可联调效率非常高。从功能模块来看系统可以划分为四个核心区域用户模块负责注册登录和用户信息维护账目模块是系统的业务核心处理收入支出记录的增删改查分类模块用于区分消费类型比如餐饮、购物、工资等统计模块将账目数据按时间维度和分类维度进行聚合展示生成图表报表。1.2 技术选型背后的关键考量有人会问这个体量的项目为什么要用SpringBootMyBatis这种组合而不是更轻量的方案我的回答是这套技术栈恰恰是当前企业级Java开发中最主流的组合用它做完整项目练手的价值最高。SpringBoot的核心价值在于自动配置和快速启动。只需要引入spring-boot-starter-web依赖加上SpringBootApplication注解一个完整的Web服务就跑起来了省去了传统SSM框架中繁琐的XML配置。个人理财系统选择了SpringBoot 2.7.x版本这个版本既兼容Java 8又不会像SpringBoot 3.x那样对环境和依赖有较高要求对于绝大多数学习者的电脑配置来说是最稳妥的选择。MyBatis负责数据库操作层它和SpringBoot整合后写SQL的手感非常接近原生JDBC方便精细控制查询逻辑。在理财系统里统计报表功能需要写复杂的聚合SQL比如按月分组统计收支总和这种场景用MyBatis写动态SQL和自定义结果映射比JPA这种全自动ORM要直观得多排查问题也更简单。Vue端选择了Vue 2.6版本搭配ElementUI组件库。有人可能会说Vue 3都出来这么久了为什么不用新版本这里有个很实际的考虑ElementUI对Vue 2的支持已经非常成熟稳定网上相关资料也最丰富新手上手时遇到问题搜答案更容易。用这套组合来学习和理解前端工程化的核心概念比如组件化开发、路由管理、状态管理、Axios请求封装完全够用。1.3 数据库表结构设计思路理财系统的数据库设计遵循“够用且合理”的原则一共三张核心表。用户表存储账号信息主要字段包括用户ID、用户名、密码加密后存储。账目表是核心业务表包含账目ID、用户ID外键关联、收支类型、金额、分类、备注、记账日期等字段。分类表维护系统的分类字典包括分类ID、分类名称和类型标识。这三张表的关联关系设计得像现实中的账本一样直观每个用户可以有多条账目记录每条账目记录归属一个分类。统计查询时通过联表查询快速获取用户自定义分类下的汇总数据。注意密码绝对不能明文存储。这个项目里我用了MD5加盐的方式做加密处理虽然从现代安全标准来看更推荐BCrypt但考虑到学习项目需要控制复杂度MD5加盐已经足以说明设计思路了。如果后续想升级换加密方案的成本也不高。2. 核心细节解析与实操要点2.1 后端SpringBoot项目结构解剖很多初学者拿到源码第一件事就是点开application.yml然后挨个改配置。这种操作的坏处是容易忽略项目结构本身的价值。我建议先看整体包结构弄清每一个类该放在哪里再深入细节。后端项目采用经典的分层架构这种结构会成为你后续写公司项目时的肌肉记忆controller层接口入口负责接收参数、调用服务、返回统一结果集service层业务逻辑层处理具体的业务规则mapper层数据访问层对应MyBatis的Mapper接口entity/pojo层实体类对应数据库表结构config层配置类例如跨域配置、WebMvc配置common/result层统一返回结果封装和全局异常处理这样分层之后每一层各司其职代码的可维护性大幅提升。以“新增一条账目”这个简单操作为例请求到达CusController后Controller只做参数接收和结果返回真正的业务判断在CusService中完成CusMapper则负责最终的SQL执行。哪怕后续要修改业务规则也只需要动service层完全不影响接口和数据库操作。2.2 统一返回结果与异常处理的必要性在前后端分离项目中统一接口返回格式是我特别想强调的一点。如果每个接口返回的数据格式都不一样前端处理起来会非常痛苦这个接口返回{code:200}那个接口返回{success:true}前端联调时得写一堆兼容逻辑。这个项目中定义了一个Result类来统一封装接口返回结构核心字段只有三个状态码、提示信息、业务数据。所有接口都返回这个结构前端用Axios拦截器统一处理code字段只有code等于200时才把data传给页面否则弹出错误提示。这一来一回前后端联调的效率提升得非常明显。全局异常处理也是必不可少的环节。RestControllerAdvice注解配合ExceptionHandler可以在不侵入业务代码的前提下统一捕获异常。比如参数校验失败会抛出业务异常数据库异常会抛出SQL异常最终都转换成统一格式的错误响应返回给前端而不是让框架返回默认的500错误页。2.3 前端Vue项目工程化配置实战前端部分我按照Vue CLI标准工程构建项目结构保持了Vue项目常见的目录划分方式views目录存放页面组件components目录存放公共组件router目录管理路由api目录封装接口请求方法。开发阶段最关键的配置是Vue的代理转发。因为前端运行在8080端口后端在8081端口直接请求后端接口必然存在跨域问题。我在vue.config.js中配置了devServer代理将所有以/api开头的请求转发到8081端口的后端服务这样开发环境下就彻底绕开了跨域限制。API层的封装也值得说说。在src/api/index.js中我用Axios实例统一配置了baseURL和请求超时时间。所有页面调用接口的流程都是页面调用API层的方法API层发起请求Axios响应拦截器统一处理返回结果。这种封装方式避免了在每个组件里重复写请求代码的问题也让接口管理变得集中可控。2.4 路由和页面流转设计前端路由采用Vue Router的history模式通过路由配置将URL路径和组件建立对应关系。比如/路径对应登录页/index路径对应系统主页/chart路径对应数据统计页。在实际项目开发中我还加入了路由懒加载机制使用动态import方式按需加载路由对应的组件。这样做的效果很明显首次打开页面时不用一次性加载所有JS资源页面秒开资源加载效率也高了不少。配合ElementUI的菜单组件整个系统的页面跳转体验下来的感觉是足够流畅自然的。3. 实操过程与核心环节实现3.1 开发环境准备与版本选择在正式搭建之前先把开发环境梳理清楚能避免后面很多不必要的折腾。这个项目我使用的版本组合如下JDK 1.8SpringBoot 2.x的最佳伴侣Maven 3.6.3项目依赖管理和构建Node.js 16.20.2Vue项目运行环境MySQL 5.7.44数据库服务IDEA 2023.2开发工具这个组合经过我多次实测兼容性表现稳定。特别提醒一下MySQL 8.0系列对连接驱动、时区配置的要求和5.7有很大不同如果条件允许完全按5.7版本来能少踩不少坑。另外建议在IDEA中配置好Maven的阿里云镜像源否则第一次加载SpringBoot依赖可能要等很久。3.2 数据库初始化与连接配置数据库部分我提供了一个init.sql初始化脚本涵盖创建数据库、数据表以及预置测试数据。拿到脚本后执行方式和常规操作一致在MySQL命令行执行source命令或在Navicat中直接运行SQL文件。初始化时要注意检查MySQL的账号和密码设置。项目里application.yml中的数据库配置是开发环境的默认配置用户名是root密码是123456如果你的数据库密码不一样需要改成自己的配置。数据库连接URL中我额外配置了useSSLfalse和serverTimezoneAsia/Shanghai这两项参数前者避免本地连接时出现SSL警告后者保证时间字段读写正确。3.3 Maven后端启动全流程后端项目的启动流程较为固定首次启动时有一个关键操作在Maven面板中先执行clean清除目标目录再执行install完成依赖打包。这样做是为了确保所有依赖都正确下载并编译构建完成。运行启动类FinanceApplication的main方法时Spring容器会完成项目依赖的自动装配。启动成功后能看到Tomcat启动的日志信息端口默认8081。如果8081端口被占用可以在application.yml中修改server.port也可以直接换一个空闲端口。后端启动后建议用Postman先做接口连通性测试例如请求获取账目列表的接口如果有正确的JSON数据返回说明数据库连接、MyBatis映射、Controller链路全部是通的。这个测试步骤虽然简单但能有效帮你区分后端问题和前端问题。3.4 Vue前端安装依赖与运行调试进入前端项目目录后第一步是执行npm install安装项目依赖。这一步是前端开发中最容易出问题的环节网络状况不佳可能导致依赖下载失败或版本异常。这里分享一个实用经验如果npm官方源装得非常慢或一直报错可以临时切换到淘宝镜像源下载速度会有极大提升。依赖安装完成之后使用npm run serve命令启动前端开发服务器。等编译完成浏览器访问localhost:8080就能看到系统登录页面。首次打开时如果出现页面能访问但接口报404或网络错误的情况大概率是代理配置或后端启动状态的问题优先检查这两个环节。3.5 前后端接口联调验证当后端服务和前端开发服务器同时启动后整个系统就处于完整的运行状态了。从注册账号开始到录入第一笔收支记录到在统计页面查看图表变化整个链路如果顺畅走通前后端联调就基本成功了。这里有个值得关注的小细节注册时需要检查用户名是否重复但这个检查是后端操作还是前端操作正确的做法是后端接口处理这个逻辑在用户注册的service层先查询用户名是否存在存在就抛出业务异常不存在才执行注册逻辑。在调试这个功能时可以故意输入一个已存在的用户名观察前端是否正确提示了注册失败的信息以此判断整个异常链路是否正常工作。4. 常见问题与排查技巧实录4.1 前端跨域请求失败跨域问题可以说是前后端分离项目中最常见的一个坑。症状表现为浏览器控制台出现CORS错误或者请求状态码为200但前端拿不到数据。排查方案需要双管齐下。一方面检查Vue的vue.config.js是否正确配置了代理转发注意修改完配置文件必须重启npm run serve才生效另一方面确认后端是否配置了跨域支持。我在这个项目中采用了后端跨域配置类的方式统一处理实现了所有接口的跨域访问支持。投资项目时我建议开发环境靠前端代理生产环境靠后端开启跨域实际部署中验证过的成熟方案更稳妥。4.2 数据库连接失败或拒绝访问测试阶段最常见的典型报错是连接数据库失败错误信息中也常能直接看到相关信息。排查步骤一般是先验证MySQL服务是否正常运行再确认账号密码是否正确最后检查数据库名是否和配置中的Database名称一致。还有一个容易踩的坑新安装的MySQL 8.0会使用caching_sha2_password的默认认证方式而项目中的数据库驱动是基于MySQL 5.7的版本两者搭配使用时可能认证失败。如果有人遇到类似问题时最直接的解决办法就是统一MySQL版本到5.7.x用起来也省心一些。4.3 前端页面正常但接口404这是让人非常疑惑的一个问题页面打开没问题登录请求却报404。这种问题的背后一般有两种原因请求的URL路径写错导致根本匹配不到后端的Controller映射或者后端接口本身的访问路径和前端请求路径不一致。从实际项目来看第二种原因的发生频率更高。排查时先看后端Controller的RequestMapping注解里面配置的路径是什么再打开前端API文件查看baseURL和具体请求路径拼接后的最终URL两相对比基本就能定位问题。4.4 时间字段显示异常或插入失败理财系统里的记账日期经常涉及时间处理稍不注意就会出现8小时时差或格式显示错乱问题。出现这种情况时优先检查MySQL连接URL是否正确配置了serverTimezone参数项目中使用Asia/Shanghai时区能保证北京时间正确读写。另外接收前端时间参数时可以考虑统一使用字符串接收在Service层通过DateTimeFormatter解析为日期类型这种方式比直接依赖框架自动转换要更稳定可控也更好排查格式错误。4.5 打包部署常见坑前端资源加载空白开发环境跑得好好的上线部署时却遇到白屏问题这是部署环节最常见的坑。核心原因是Vue默认的history路由模式在刷新非登录页时会导致服务器路由查找失败从而返回404。解决办法有两种路径。方案一修改VueRouter模式为hash模式将createWebHistory改为createWebHashHistoryURL地址变为带#号的形式虽然不够美观稳妥但是一种绕过服务器配置问题的常用手段。方案二在Nginx中配置try_files规则将所有请求都指向index.html交给前端路由自行处理。对于个人项目和学习项目我建议优先选择第一种方案操作简单直接又能规避服务器配置带来的兼容性问题一次配置后面就不会再被这个问题干扰到了。5. 项目扩展方向与后续优化建议如果只是把项目跑通其实只完成了目标的一半。我个人强烈建议在这个基础上做一些扩展和改造才能真正加深理解也让项目在面试中更有说服力。第一个值得做的升级是引入Spring Security或JWT做更完善的登录认证机制。目前项目里的登录状态管理比较简单如果要让系统更接近真实企业项目的水平基于JWT的无状态认证方案是个非常值得投入的方向。JWT令牌包含用户身份信息后端接口通过拦截器统一校验令牌合法性整体实现并不复杂但带来的技术含金量提升非常明显。第二个方向是给系统增加定时任务能力。比如每月自动生成消费报表并发送邮件这个功能的实现基于SpringBoot自带的Scheduled注解只需要在启动类加上EnableScheduling开启定时任务支持再在方法上标注执行周期即可。如果想要进一步丰富技术栈引入Redis作为缓存层也是一个不错的选择比如缓存用户信息、缓存分类列表这类读取频繁变化较少的数据。不过需要提醒的是理财系统的数据体量并不大从这个项目本身来看引入缓存更多是为了用技术而技术。我只建议在学有余力的前提下做这种扩展。从我个人带项目的实践经验来看判断你是否真正掌握了这套个人理财系统的标准是脱离源码从零开始自己重新搭建一遍遇到问题时能不看教程独立排查解决。这个过程确实会经历很多次报错和反复调试但每解决一个问题你对SpringBoot和Vue这套主流技术栈的理解都会深一层。最后分享一个我在实际开发中特别受用的小习惯项目启动和运行过程中遇到任何异常第一反应不要直接去搜报错信息而是先看完整的异常堆栈日志从最底部找到真正的Root Cause再动手。绝大多数“奇怪的问题”根源往往是一个很不起眼的配置失误。这套系统的部署过程虽然不算复杂但把这条排查思路练熟比多跑通几个项目珍贵得多。
返回列表