1. 先想清楚再动手:需求建模与模块划分
1.1 拿到题目第一周,不要急着建工程
每年毕业季,基于SpringBoot的Java后端课题里,银行基本业务管理系统几乎是常驻题目。很多同学一看到这个标题,第一反应就是赶紧新建SpringBoot工程,先把界面搭出来再说。结果做到中途发现需求没理清,业务边界不明确,又回头改表结构、加字段,前前后后浪费一个多月。
我自己的习惯是,拿到这类系统题目后,第一周完全不碰代码,只做需求拆解和流程梳理。你首先要弄清一个问题:银行基本业务管理系统,到底“基本”到什么程度,又“管理”哪些内容?
结合我之前开发过的几个类似项目来看,这个题目的核心业务集中在五个板块:客户信息管理、账户管理、存款取款、转账汇款、流水查询。如果课题名称里再加“综合业务管理平台”几个字,通常意味着还希望系统具备柜员管理、角色权限、操作日志、审批流或统计报表这类后台能力。也就是说,你不能只做一个“前端客户点按钮存钱取钱”的Demo,还要有员工端、管理端的概念,这才能被称作“平台”。
1.2 功能优先级怎么排,直接决定你后面累不累
我在项目启动前,通常会列一份“功能范围表”,把功能分成三类,这样后面开发时不会看什么都想做,最后什么都没做完。
第一类叫核心功能,必须全部实现且稳定运行。客户开户、账户查询、存款、取款、转账、交易流水查询、登录登出,这些是最基础的生命线功能。如果答辩时存取款链路都不完整,其他功能做得再花哨也很难兜底。
第二类叫业务完整性功能。比如冻结与解冻、挂失、销户、柜员权限控制、密码修改、操作日志。很多人会漏掉冻结和销户,但这两个功能恰恰是面试或答辩时专家喜欢追问的点,因为涉及到账户状态机,能体现你是否理解了银行账户的完整生命周期。
第三类叫加分模块。像Excel报表导出、可视化统计图表、定期转活期、批量开户、Web端管理员审计面板,这些功能不是必须,但可以让演示效果更好看,也能在论文里作为“系统扩展与创新”来写。
我强烈建议按这个顺序推进:先把核心功能链路做通,再补齐账户状态类功能,最后还有时间再碰加分模块。千万不要先钻进数据可视化的大屏页面里出不来,否则等回头做转账时才发现自己核心账户模型设计得太简单,返工成本极其痛苦。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术选型不能只看热闹
2.1 为什么SpringBoot是这个题目的最优解
题目限定是Java和SpringBoot,其实这个选择在毕业设计场景下非常合适。SpringBoot的优势在于:不用再像传统Spring项目那样写大量XML配置,内嵌了Tomcat容器,一个java -jar就能启动。对应届生来说,环境搭建环节的摩擦越小,留给业务实现的时间就越多。
版本上,我自己做毕设规模的项目时不太建议一上来就追求最新版。比如SpringBoot 3.x要求JDK 17起步,而很多学校机房或老教程还停留在JDK 8,如果你跟着网上教程大量抄2.x的代码,在3.x环境里可能直接编译失败。我在实际开发中更倾向用SpringBoot 2.7.x搭配JDK 8,这个组合稳定,资料多,遇到问题也好搜。
持久层方面,推荐MyBatis-Plus而非原生MyBatis。原因很现实:毕设项目通常有大量单表CRUD,用MyBatis-Plus可以少写很多XML和Mapper方法,自带分页插件、逻辑删除和字段自动填充,能极大提升开发速度。而且MyBatis-Plus本身是MyBatis的增强,答辩被问到“底层原理”时,你也可以顺着讲MyBatis的JDBC执行流程和ORM映射逻辑。
2.2 前端到底该选什么:前后端分离不是唯一答案
关于前端,我的建议非常务实:会根据本人在这个项目里的前端熟练度来选型。如果你Vue熟练,那用SpringBoot + Vue做前后端分离是很标准的方案,前端口碑好,项目文档结构也清晰,答辩时更讨喜。如果你对Vue只是会复制教程,建议不要强行上复杂的长链路前端工程,不然调试跨域、打包、路由守卫时,很可能浪费大量时间。
我见过很多同学在这个题目上被前端组件库坑到:比如Element UI按需引入配置不对,页面样式炸了;Vue Router history模式没有后端配合,刷新页面就404。这些问题本身不难,但在毕业设计时间轴上真的很烦人。
我个人在这个项目里采用的是简化方案:后端SpringBoot提供纯JSON API,前端用Vue3 + Element Plus。但如果你更希望省心,也可以做Thymeleaf服务端渲染,把页面直接放到resources/templates下面,数据和页面一起渲染,彻底绕开跨域和前端工程化问题。缺点是交互流畅度稍差,但银行后台管理的交互本身并不复杂,用服务端渲染也完全够展示。
2.3 数据库和ORM的硬性配置常识
银行综合业务管理平台这种项目,数据库用MySQL最常见。需要注意的配置细节有:
- MySQL连接串必须要加characterEncoding和serverTimezone,不然会出现中文乱码和时区偏差。
- 账号和权限要独立,不要整个项目都用root连库。
- MyBatis-Plus的逻辑删除和分页插件要给上。
我在实际开发中踩过的第一个坑就是把逻辑删除前缀deleted加在了账户表上,然后查询余额时MyBatis-Plus自动拼接deleted=0,导致账户状态为“已销户”的数据也查不到,统计报表数量对不上。后来规范了字段语义:deleted只负责物理删除标记,业务上的取消状态用单独status字段表达,两者不要混用,系统才稳定下来。
3. 数据库建模决定你系统能走多远
3.1 客户表和账户表必须拆分,不要混在一张表里
银行系统的数据库设计,第一原则就是“客户、账户、交易流水”三块一定要拆分清楚。很多初学者会把一个用户的姓名、身份证号、卡号、余额全部塞进一张用户表里,后面做一个用户开多个账户时瞬间束手无策。
我的建议是拆成两类核心实体:
客户表(customer):存储客户的身份信息、联系方式。这是人的维度。
账户表(account):存储账户号、所属客户ID、账户类型、余额、状态。这是资金维度的容器。
一个客户可以对应多个账户,这是标准的一对多关系。账户表里放customer_id作为外键逻辑;账户号不是物理主键,而是业务唯一键。为什么这么做?因为银行卡号、账户号是会变的,会出现挂失换卡、合并账户等场景,如果拿卡号当主键去关联流水,后续扩展非常崩溃。
我也建议把账户设计成两个层次:普通活期账户和定期账户在设计上用account_type字段区分即可,毕业设计没必要拆成多张表。如果真有定期利息计算需求,扩展一个定时任务去算就行,系统结构依然清爽。
3.2 流水表是最该花心思设计的一张表
交易流水表是整个系统里数据量增长最快、同时也是逻辑中心的一张表。存取款、转账都必须实时写流水。流水表的字段至少应该包括:流水号、账户号/客户ID、交易类型、交易金额、交易前余额、交易后余额、交易时间、操作柜员ID、业务摘要、关联流水号(用于冲正或退汇)。
我最想提醒的一点是,不管存款还是取款,交易前余额和交易后余额都是必填字段。这样有什么好处?第一,用户在查看明细时能直接显示余额变化,体验接近真实网银;第二,答辩时如果提出问题“怎么去验证系统不会算错账”,你可以拍着胸脯说:通过连续流水能回放账户在每个时间点的余额快照,逻辑上不存在凭空多钱或少钱。
金额字段请记住,绝对不要用float或double,要用Decimal类型,Java里对应BigDecimal。浮点数在二进制存储中会存在精度损失,银行金额一分钱都不能差,这是红线问题。
3.3 别忘了把“柜员”和“管理员”做成用户体系
很多毕业设计做银行系统时,只做了客户账号,没有“柜员端”概念。但你仔细看课题名称“银行综合业务管理平台”,这里的“管理”是需要主体角色的。真实银行网点里,办理存取款是柜员在操作系统,不是客户自己在App上点。
所以系统至少要有两种用户:管理员,后面可以看成业务管理员角色;柜员,也就是业务经办人。用户表就是staff_user,存登录账号、密码(必须加密存储)、姓名、角色、所属机构/网点。最好再给每个操作日志记录操作人,这样溯源时能直接定位到是哪位柜员办理的业务。
数据库到底要不要做标准RBAC五表结构?我的观点是:如果题目明确写了权限管理或在论文里要有权限控制,那就做;如果只要求基本业务功能,那可以在用户表里保存一个简单角色字段,后端根据角色拦截接口,前端根据角色渲染菜单。
我自己在银行类毕设里会更倾向给出一个升级方案:菜单表、角色表、用户表、角色菜单关联表、用户角色关联表。虽然刚开始写接口多花了一天,但答辩聊权限时你能讲出“基于RBAC模型的权限控制”,这个专业感比“我写了个判断是不是管理员”要强很多。
4. 后端拆解:从Controller到Service到Mapper的每一层职责
4.1 参数从接口进来后到底走过了什么
我见过很多毕设代码,Controller里直接把业务逻辑写满一堆SQL,Service层是空的,实体对象处处透传。这样的代码跑起来可能没问题,但一旦答辩被问“你这系统架构怎么设计”,回答起来会非常尴尬。
标准的调用链是:前端请求到达Controller,Controller负责解析参数、调用Service、捕获异常、返回统一结果;Service负责写业务规则、协作事务;Mapper通过MyBatis或MyBatis-Plus和数据库交互。
举一个具体例子:客户发起一笔1000元的存款请求。Controller接到的入参是账户号和存款金额,它不会去查这个账户存不存在,只调用accountService.deposit()。真正的方法里,Service要做的逻辑是:
- 根据账户号查账户。
- 校验账户是否存在。
- 校验账户状态是否正常。
- 判断存款金额是否大于0。
- 用乐观锁或行锁方式更新账户余额。
- 记一条流水。
- 若中途任何一步异常,抛出业务异常并回滚整个事务。
这些逻辑如果堆在Controller里,你还要在Controller里面对各种异常,非常混乱。分开以后,Controller只关心“拿到结果往前端返回”;Service只关心“我的业务规则是否满足”。
4.2 为什么要分层,以及事务注解怎么放才对
Service层最核心的作用是承载事务边界。Spring的声明式事务通常通过@Transactional注解实现,一个最容易踩的坑是:注解放在Controller上或放在私有方法上,导致事务不生效。
什么时候需要事务?凡是涉及多个数据表写操作,特别是账户余额和流水同时更新的场景,都必须在同一个事务里。转账就是最经典的例子:转出账户扣钱和转入账户加钱必须是一个原子操作。如果A扣除成功后,B账户加钱前抛了异常,没有事务就会出现钱凭空消失。
银行系统对这种一致的追求,远高于速度要求。即使再往后引入消息队列,最终能保证对账一致才可以。毕设阶段的实践可以把数据库事务机制讲得滴水不漏,这是非常重要的亮点。
4.3 银行核心类接口实现时,要绕开哪些业务坑
第一,账户余额变化应该由数据库“原子更新”,而不是先查出余额在Java里算好再update回去。因为后一种方式在并发场景下面临严重超扣危险。
第二,转账接口必须检查转出账户和转入账户是否是同一个账户。真实业务里虽然不可思议,但接口如果做不到这种基础校验,被传相同账户号时会出现莫名其妙的自转自现象,流水账面虽然能平,但属于逻辑错误。
第三,做转账或取款时,扣钱顺序、验密环节、限额控制是否可以做得完善。哪怕你是演示系统,也应该演示出“单笔限额”的存在,比如普通账户单笔不能超5万。真实银行系统对这个极为看重,把这个校验写出来,在业务答辩时会更真实。
4.4 实体类怎么做数据校验
在SpringBoot里,对入参做参数校验是必须的。可以通过javax.validation注解,比如@NotBlank、@Size、@DecimalMin。转账金额是0或者负数直接拒绝,应该在接口层面就拦截。开发这个项目时,我因为存了“转账金额为0”的鸡肋细节,被专家调侃了很久,后来我把这类校验定义为基本法。
金额参数我用的注解是@DecimalMin(value = "0.01")。为什么不用@Min?因为@Min只支持整数,银行系统会和分打交道。
5. 并发与安全:这块能讲清楚,答辩直接上档
5.1 并发存取款会造成什么后果,怎么防
这是银行系统必问问题。你要让系统能支撑并发请求,而不是单用户演示。假设余额1000,两个人同时取款800。如果没有并发控制,两个请求都读到1000,各自判断够扣,再各自把余额改为200,最终账户余额剩200,实际上银行两次扣了1600,账根本平不了。
我实现账户余额扣减使用的是带条件的更新SQL:
sql复制UPDATE account
SET balance = balance - #{amount}, version = version + 1
WHERE account_id = #{accountId}
AND balance >= #{amount}
这条SQL把“余额是否充足”和“扣款”合并为一个原子操作,数据库行锁天然解决了并发问题。如果影响行数为0,说明要么余额不足,要么账户被并发修改不可用,那么抛业务异常让前端报错即可。
另一种方案是使用乐观锁version字段,先select version,更新时where version=旧值,失败则重试。这种方式在交易系统里不如条件更新直接,但在讲技术方案时可以作为方案B进行说明。我建议你把两种方案的适用场景都准备好,人家问你能不能在同一个系统里同时用,你用“业务层看需求,交易类操作更偏向数据库原子更新”来回答,会显得很扎实。
5.2 越权问题:柜员没事别去动管理端接口
权限控制的细节我不重复讲太多表结构的点,但一定要强调后端接口必须做防护。如果你只在前端隐藏了管理按钮,有人直接拼URL访问管理端接口,系统照样会执行操作,这就是垂直越权。
在SpringBoot里,我通常写一个登录拦截器。核心思路是:
- 注册一个WebMvcConfigurer,通过addInterceptors注册自定义HandlerInterceptor。
- 拦截器里通过HandlerMethod判断哪些请求真的需要权限。
- 从Session或ThreadLocal里获取当前登录用户,如果用户为空直接返回401 JSON,而不是跳转页面。
- 如果请求路径匹配管理员接口,但当前用户角色不是管理员,直接返回403 JSON。
除了拦截器,也可以直接把Spring Security引入项目,用注解@PreAuthorize控制角色权限。如果你对Spring Security比较熟,用它是加分项。如果你不熟,强行加上后又配不明白filter链,容易拖慢进度。
5.3 密码和登录态如何处理
密码加密存储是我在这个项目里一再强调的点。很多毕设直接把密码明文存在数据库里,答辩时专家一查表就非常尴尬。可以通过Spring Security后端的BCryptPasswordEncoder完成加密,它每次生成不同盐值,即使两条同密码记录,密文也完全不同。
登录态建议使用Session,简单可靠。银行系统毕设中不建议强行上JWT,除非你对Token刷新机制和用户踢下线非常熟。JWT虽然热门,但会话失效管理、服务端主动失效都更麻烦,一个演示系统用Session既满足场景,也减少了跨域配置复杂度。
数据库层面还应该给流水表、账户表加必要的索引。比如查询一个月内某账户的流水,不能每次全表扫描。哪些字段在where里最常用?账户号、交易时间、流水号。这几个字段加索引就够了,别每个字段都加,数据插入反而变慢。
6. 从零到可演示项目的完整开发顺序
6.1 第一步先不要写页面,先做数据库脚本
我实际做完整个项目后复盘发现最有效的顺序是先把数据库建出来,并准备好一份初始化数据。银行系统尤其需要演示数据,不然答辩时现场造数太慢,还会在各种空数据状态中卡住。
推荐必备演示数据:
- 3个柜员账号。
- 1个管理员账号。
- 8~10个客户(提供不同年龄层、不同业务偏好,让列表看起来像真实系统)。
- 配套账户,既有活期也有定期需求可以加定期。
初始化管理员账号建议默认admin/admin123,不过密码必须是加密后的字符串,不要是明文。
6.2 Maven工程和项目结构
建议在一个干净目录下建工程,使用IDEA初始化Spring Initializr,选择Java 8、SpringBoot 2.7.x。
我的项目结构习惯是:
- entity包,对应数据库表。
- mapper包,继承BaseMapper。
- service与service.impl包。
- controller包。
- common包,放统一返回结果和异常处理。
- config包,放配置类。
- utils包,放工具类。
- dto包,放入参。
- vo包,放返回给前端视图对象。
6.3 先做核心后端链路还是先做登录界面
这个问题我的回复是:两手都要有,但先做登录链路。
因为后续所有操作都需要知道“当前用户是谁”,如果你没登录就去开发转账,后面再去补登录,中间每一处对操作员的硬编码都要返工。正确顺序是:
- 实现登录接口,建启动页能跳转到主界面。
- 实现客户列表及相关查询。
- 实现开户业务流程。
- 实现账户管理和账户状态变更。
- 做存款、取款接口并同步测试。
- 做转账接口,重点处理流水和事务。
- 做流水查询。
- 做管理端的用户、角色权限配置。
- 最后补各种Excel导出、图表等加分模块。
每完成一个模块,就用curl或Postman把接口真实跑一遍,再用前端页面操作一遍。不要一口气写十几个接口再统一测试,那样出问题时很难定位。
6.4 接口设计时统一封装返回体
采用统一返回体,会让前后端联调省力很多。我自己写的是:
java复制public class Result<T> {
private Integer code;
private String message;
private T data;
}
code用0表示成功,非0表示业务异常。业务异常用全局异常处理器统一捕获,不要每个Controller都try-catch然后再手动封装返回。一旦出现未预期异常,全局处理器应记录日志并返回一个“系统繁忙”的提示,既提高系统健壮性,又避免把原始堆栈直接暴露给前端。
这一点在银行类系统里还有一层安全含义:异常信息如果回传太多,比如“SQL插入冲突,账户号XXXXX重复”,可以被攻击者利用。所以线上系统通常选择把异常细节打到服务端日志,前端只接收不暴露内部细节的通识文案。
7. 前端页面搭建和交互演示的加分细节
7.1 菜单结构怎么设计更专业
如果画一个银行综合业务管理平台的功能菜单,我会建议按“客户中心、账户中心、交易中心、报表中心、系统管理”五大模块组织。
客户中心:客户列表、客户新增、客户详情。
账户中心:账户列表、开户、冻结/解冻、销户。
交易中心:存款、取款、转账、流水查询。
报表中心:当日交易汇总、机构余额日终统计。
系统管理:柜员列表、角色权限分配、操作日志。
这套结构能看出你对银行内部系统的理解是有层次的。前端菜单只要分模块渲染,答辩时按模块逐个讲解也能保证节奏清晰。如果菜单平铺一层,把所有按钮堆在一页,那演示时感觉就像个增删改查练习题,不像业务系统。
7.2 操作类页面要保障确认和反馈
银行系统的页面不要过度追求动画,但操作一定要有“二次确认”和“结果反馈”。
存款、取款、转账、冻结、销户这些接口都尽量在弹窗里展示信息。比如转账前弹窗显示:转账金额、付款方账户、收款方账户、手续费(可用0占位)、确认按钮。提交后在页面顶部展示成功提示,并跳转到这笔流水的详情页面。这样用户逻辑是闭环的,看到结果以后,系统状态也直观反馈了。
前端权限方面注意控制:你虽然在后端做了拦截,但前端还应该根据当前登录人角色动态渲染菜单。普通柜员看不到管理端入口,避免那个“不让做但能看见菜单”的尴尬,也让系统的权限体系看起来完整。
7.3 使用成熟的组件,不写重复轮子
后端管理平台前端用Element Plus或Ant Design Vue套表格和表单。项目演示时表格尽量做好分页、排序、搜索这几个基本点。分页建议用后端分页,不要只把当前页数据查出后在前端假分页。
银行流水的表格应该做到按账户号或流水号搜索,按时间倒序排列。如果你做了导出功能,还需要考虑日期的易读性。很多新手直接把数据库datetime原样返回成JSON,导致前端页面上出现“2025-05-06T10:23:45”这种带T格式,非常业余。封装VO时把时间格式化为“yyyy-MM-dd HH:mm:ss”,这个小细节能在答辩时让老师觉得你对工程细致程度有把控。
8. 常见问题排查与避坑实录
8.1 联调阶段最容易踩的那几个坑
我先列一个高频问题表,这些都是在真实开发和指导时常遇到的。
| 现象 | 根本原因 | 解决办法 |
|---|---|---|
| 转账后两个账户余额总和不对 | 用了浮点类型或两段更新未放事务 | 统一BigDecimal,事务包裹,加更新条件 |
| 中文乱码 | 数据库字符集和连接字符串不一致 | 建库用utf8mb4,URL加characterEncoding=utf8 |
| 服务启动后端口被占用 | 本机多个Java项目同时跑 | 换server.port,使用8081或8082避免冲突 |
| 前端刷新页面后404 | Vue history模式刷新无匹配路由 | 开发用hash模式或后端配置forward到index |
| 两个请求同时操作同一个账户,出现负余额 | 缺少原子更新或乐观锁 | 改成带balance >= 金额的条件update |
| 流水查出来了,但客户姓名没有 | 关联查询不熟只用单表 | 写SQL join或服务端组装VO |
| 逻辑删除和业务状态混了 | 状态设计不清 | 区分deleted字段和status字段 |
| Long类型ID传到前端精度丢失 | 雪花ID超过JS安全整数 | 主键在Jackson序列化中ToString |
如果你在项目开发到一半遇到这些问题,建议直接对照上表修。不要绕路,这些坑基本集中在数据库和前端传参衔接上,早发现早解决。
8.2 谈谈业务场景中容易让专家连续追问的点
答辩时,专家通常不会只看你会不会写增删改查,而会从业务上抽几个“保证系统不出错”的点来问。
第一个问题大概率是“你怎么保证账户余额不足时操作会失败”。你如果说“我在代码里判断if(balance<amount) return error”,那会陷入并发争议。如果你回答“我通过带条件的UPDATE原子扣减,影响行数为0时判定余额不足”,显然更扎实。
第二个问题会是“万一扣了钱,流水没记上怎么处理”。这用数据库事务去回答,加上Spring的@Transactional,两个写操作要么同时成功,要么同时回滚。如果专家继续问“那如果事务提交后程序写磁盘成功了但前端没收到结果,客户以为失败又点了一次怎么办”,你可以引入幂等键概念,即前端提交时生成一个业务请求号,后端重复请求时会拦截。
第三个问题和“怎么证明你的系统安全”有关,把深度做进权限接口、参数校验、密码加密这条线里。你可以参考我前面段落提到的内容,把后端权限链路梳理成一条能对答如流的话术。
8.3 演示现场最怕冷场,我建议准备一套演示脚本
演示系统最忌讳现开系统现找数据。另一个我踩过的坑是前期开发时刻意造了许多边界数据,比如某账户余额为“76.32”元,某客户年龄很大,等到答辩演示转账时,客户名,账号混淆,现场紧张很大概率出错。
建一套“演示剧本”会稳妥得多。我的建议是固定的基本客户、相对整的余额,比如100000.00元这样的,看起来很清晰;转账要演示不同条件下的结果:
- 第一笔正常转账:A转账1000给B,双方余额变化。
- 第二笔余额不足:A转账数额大于余额,抛出“余额不足”。
- 第三笔账户状态异常:把A账户临时冻结后转账,前端直接被拒。
提前把这三个场景走一遍,前端、数据库、日志记录全部验证无误。答辩时只演示这套脚本,不会因为现场操作不当而出丑。
9. 关于SpringBoot你至少能讲清的三个原理点
9.1 自动装配不是魔法
作为一个SpringBoot项目,答辩很大可能会被问到“为什么你的配置类里写一个@Configuration就能注入一堆Bean?”。
我的理解是,SpringBoot用大量的自动配置类,按条件装配方式判断当前应用是否具备某个Starter依赖。比如你引入spring-boot-starter-web后,ServletWebServerFactoryAutoConfiguration会在classpath里有Servlet容器时自动去配置内嵌Tomcat监听端口;如果你在官方默认配置里看不到这些Bean的创建过程,不代表它没有发生。
你可以说实话:项目中更多依赖starter完成整体装配,而如果需要自定义Bean,则用@Bean注入。答题关键是让教授知道你理解依赖条件装配思路,而不是背概念。
9.2 Starter到底帮你做了什么
SpringBoot的Starter本质是把某一类功能需要的依赖统一管理起来,比如spring-boot-starter-web打包了Spring MVC、Jackson、内嵌Tomcat等依赖,你不需要逐个指定各版本。Starter还提供了默认配置类,所以不用写一个配置类去注册DispatcherServlet。
这个点在设计银行系统的项目文稿或答辩里可以往这两个方向展开:你如何引入自己对应的数据库 starter;你用到的 starter 如何涉及容器配置与数据源配置。
9.3 配置绑定里的坑
很多人在application.yml里面配置自定义参数,比如一个“银行单笔转账限额”,想用@ConfigurationProperties绑定到自定义Properties类,结果类里没有加@Component或没有在启动类开启@ConfigurationPropertiesScan,导致参数始终读不到。可以顺手把这个绑定链路理清,写纸上备用,一到了细节问答环节,解释清楚能有效拉高专业感。
SpringBoot的体系很大,但对毕设来说更多是工具和载体,真正要花心思的永远是业务模型。账户模型建清楚了,后台系统的骨架就稳了。
最后分享一个个人的操作体会:这个项目做完以后,我养成了一个习惯,每做一个银行账户类的状态更新都会先在数据库开启一个事务,然后把生产环境上的测试数据用明文脱敏方式保存到本地,再反复验证前端的按钮主流程是否真的同步更新了后台状态。银行系统是一个只要有一个流程不合规就会出大问题的系统,把每一步闭环预演成功,再去扩展其他模块,会远比东敲一点西敲一点更高效。答辩前的那个晚上,把开户、存取款、转账、流水、冻结这一条主链路完整走三遍,是最有价值的事。
