AI 辅助开发实战:基于 Java 的毕业设计网上记账系统架构与实现
最近在辅导学弟学妹做毕业设计,发现很多同学在做“网上记账系统”这类项目时,容易陷入几个典型的困境:要么是照着老掉牙的教程写出一堆面条式代码,前后端不分家;要么是功能堆砌,但一谈到事务、安全就两眼一抹黑;还有的同学甚至不知道如何组织项目结构,导致后期修修补补,越改越乱。
恰好我自己在尝试用一些AI编程助手(比如GitHub Copilot和通义灵码)来提升开发效率,就想着能不能结合这个具体的毕业设计案例,分享一下如何更“聪明”、更规范地完成一个Java Web项目。今天这篇笔记,就围绕一个Spring Boot + MyBatis-Plus的网上记账系统,聊聊怎么借助AI工具,从零搭建一个结构清晰、安全可靠、还能拿去当毕业设计的系统。

1. 学生开发中的常见痛点与AI的切入点
在开始动手之前,我们先盘一盘同学们常踩的坑。知道了问题在哪,AI工具才能更好地帮我们解决问题。
-
痛点一:重复造轮子与代码质量低下。很多同学会花大量时间写基础的CRUD(增删改查)代码,比如一个账单的查询、新增方法,虽然简单但重复性高,容易出错。这时,AI代码补全工具就派上用场了。你只需要写出清晰的方法名或注释,AI就能帮你生成大致的代码框架,你只需要关注核心业务逻辑即可。
-
痛点二:安全意识薄弱。直接把用户密码用明文存数据库?在SQL语句里拼接用户输入?这些在毕业答辩时都是“送命题”。AI助手可以在你编写代码时,提示你使用
BCryptPasswordEncoder进行密码加密,或者建议你使用MyBatis-Plus的Wrapper来构建查询条件,避免SQL注入。 -
痛点三:事务管理缺失。比如“记账”这个操作,可能涉及插入账单记录和更新账户余额两个步骤。如果其中一个失败,数据就不一致了。很多初学者会忘记用
@Transactional注解来保证事务。AI工具可以在你编写Service层方法时,根据上下文提示你添加事务注解。 -
痛点四:项目结构混乱。Controller里写满了业务逻辑,Service层成了空壳,各种工具类随处放。AI工具虽然不能直接帮你设计架构,但当你遵循一些常见的分层模式(如Controller-Service-Mapper)编写代码时,它能更准确地预测和补全代码,间接促使你养成好习惯。
2. 技术栈选型:为什么是Spring Boot + MyBatis-Plus?
对于毕业设计级别的项目,技术选型的核心原则是:成熟、高效、资料多、易于快速上手。
-
Spring Boot vs. 传统SSM:这个基本没悬念。传统SSM(Spring+SpringMVC+MyBatis)需要大量XML配置,整合起来繁琐。Spring Boot通过自动配置和起步依赖,能让你的项目在几分钟内就跑起来。对于时间紧、任务重的毕业设计来说,Spring Boot是首选。AI工具对Spring Boot的支持也更为全面和精准。
-
MyBatis-Plus vs. JPA:两者都是优秀的持久层框架。JPA更面向对象,规范统一;MyBatis-Plus则更灵活,对SQL的掌控力强,并且内置了强大的CRUD封装和代码生成器。对于记账系统这种表结构相对固定、但查询统计需求多样的项目,MyBatis-Plus的
QueryWrapper和Service封装能极大减少代码量。它的代码生成器功能,配合AI的辅助,能一键生成实体类、Mapper、Service和基础的Controller,效率极高。
最终我们的技术栈清单如下:
- 后端:Spring Boot 2.x, MyBatis-Plus, Spring Security (用于鉴权)
- 数据库:MySQL 8.0
- 安全:JWT (JSON Web Token) 用于无状态认证
- 工具:Lombok (简化POJO), Hutool (工具包)
- 测试:JUnit 5, JMeter (压测)
3. 核心模块实现细节与AI辅助实践
接下来,我们分模块看看具体怎么实现,以及AI工具如何在各个环节帮助我们。
3.1 用户鉴权模块 (JWT实现)
安全是第一步。我们采用常见的“用户名密码登录,返回JWT令牌”的模式。
-
依赖与配置:在
pom.xml中加入spring-boot-starter-security和JWT(如jjwt)的依赖。AI工具可以帮你快速补全这些依赖的<dependency>片段。 -
核心代码实现:
- 登录接口:在
AuthController中,我们提供一个/api/auth/login的POST接口。 - 自定义UserDetailsService:实现
loadUserByUsername方法,从数据库查询用户并验证密码。这里AI可以帮你快速生成方法骨架。 - 密码加密:在Security配置类中,配置一个
BCryptPasswordEncoder的Bean。AI会提示你使用这个强哈希算法。
@Service public class UserDetailsServiceImpl implements UserDetailsService { @Autowired private UserMapper userMapper; @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { // AI可能会补全:根据用户名查询用户 User user = userMapper.selectOne(new QueryWrapper<User>().eq("username", username)); if (user == null) { throw new UsernameNotFoundException("用户不存在"); } // 返回Spring Security需要的UserDetails对象 return new org.springframework.security.core.userdetails.User( user.getUsername(), user.getPassword(), // 数据库存储的应是BCrypt加密后的密码 Collections.emptyList() // 权限列表,这里先置空 ); } }- JWT工具类:编写一个
JwtUtil类,用于生成和解析JWT令牌。AI可以辅助你写出generateToken和parseToken的方法签名和核心逻辑。
- 登录接口:在
-
配置Spring Security:编写一个配置类,继承
WebSecurityConfigurerAdapter,禁用CSRF,设置登录接口公开,其他接口需要认证。并添加一个JWT认证过滤器。这个过程步骤较多,AI的代码补全可以帮你快速填充configure等方法体。
3.2 账单CRUD与事务控制
这是系统的业务核心。我们设计Bill(账单)实体,包含金额、类型(收入/支出)、分类、时间等字段。
-
代码生成:使用MyBatis-Plus的代码生成器,输入数据库表名,一键生成
Bill的实体类、BillMapper接口、BillService接口及其实现类BillServiceImpl。这是AI在“生成”层面的直接体现,节省了大量机械劳动。 -
核心业务实现:在
BillService中,我们实现新增账单的方法。这里的关键是事务控制。@Service public class BillServiceImpl extends ServiceImpl<BillMapper, Bill> implements BillService { @Autowired private AccountService accountService; // 假设有一个关联的账户服务 @Override @Transactional(rollbackFor = Exception.class) // 关键注解:声明式事务 public boolean addBill(Bill bill) { // 1. 保存账单记录 boolean saveBill = this.save(bill); if (!saveBill) { // 保存失败,事务会回滚 return false; } // 2. 更新关联的账户余额(例如,支出则扣减,收入则增加) boolean updateAccount = accountService.updateBalance(bill.getAccountId(), bill.getAmount(), bill.getType()); if (!updateAccount) { // 更新失败,由于@Transactional,上面的save操作也会被回滚 // 手动抛出异常触发回滚是更常见的做法 throw new RuntimeException("更新账户余额失败"); } return true; } }AI辅助点:当你输入
@Transa时,AI会自动补全@Transactional注解,并可能提示你常用的属性如rollbackFor。它也能在你编写updateBalance方法调用时,根据已有代码预测出参数。 -
Controller层编写:在
BillController中,注入BillService,提供增删改查的RESTful接口。注意,Controller应保持“瘦”,只负责参数校验、请求转发和响应封装。@RestController @RequestMapping("/api/bills") public class BillController { @Autowired private BillService billService; @PostMapping public Result addBill(@RequestBody @Valid Bill bill) { // @Valid 用于参数校验 boolean success = billService.addBill(bill); return success ? Result.ok("添加成功") : Result.fail("添加失败"); } // 其他GET, PUT, DELETE方法... }AI可以快速帮你生成这些标准的CRUD接口方法。
3.3 分类统计功能
统计功能是展示数据分析能力的关键。例如,统计某个月份各项支出的比例。
-
Mapper层自定义SQL:在
BillMapper.xml中编写统计查询。<select id="getCategoryStat" resultType="map"> SELECT category, SUM(amount) as total FROM bill WHERE user_id = #{userId} AND type = 'EXPENSE' -- 支出 AND DATE_FORMAT(create_time, '%Y-%m') = #{month} GROUP BY category </select>在
BillMapper.java接口中定义对应的方法。AI可以帮助你快速编写SQL语句的WHERE和GROUP BY部分。 -
Service层调用:在Service中调用这个Mapper方法,并对数据进行处理(如计算百分比)。
-
Controller层暴露接口:提供一个
/api/bills/stat/category的GET接口。
4. 安全性考量与基础性能测试
4.1 安全性加固
- 密码加密:如前所述,必须使用
BCryptPasswordEncoder。 - SQL注入防护:坚持使用MyBatis-Plus的
QueryWrapper或XML中的#{}占位符,绝不使用字符串拼接。 - XSS防护:对于前端提交的富文本内容(如账单备注),在存储或展示前进行转义。Spring Boot默认集成了Thymeleaf等模板引擎会对输出进行HTML转义。如果是前后端分离,后端可以返回纯文本,由前端框架(如Vue、React)负责安全渲染。也可以在全局或单个接口上使用
@JsonSerialize配合转义库处理。 - JWT安全:设置合理的令牌过期时间;不要在客户端存储敏感信息;使用HTTPS传输。
4.2 基础性能测试
毕业设计虽然不要求高并发,但做简单的压力测试能体现你的工程素养。可以用JMeter模拟多用户并发添加账单。
- 测试场景:100个线程,在10秒内启动,循环调用“添加账单”接口。
- 关注指标:吞吐量(Requests per Second)、平均响应时间、错误率。
- 简单优化:如果测试发现数据库连接成为瓶颈,可以考虑配置Druid连接池,并调整连接参数。AI可以辅助你编写Druid的配置类。

5. 生产环境避坑指南(毕业设计加分项)
即使是个课程设计,按照接近生产的标准来思考,能让你在答辩时更有底气。
- 避免在Controller写业务逻辑:牢记分层架构。Controller -> Service -> Mapper。Controller只做参数校验和格式转换。这个规范本身就能让AI在补全代码时更精准。
- 统一的响应封装:定义一个
Result类,包含code、msg、data字段,所有接口都返回它。这样前端处理起来更统一。 - 全局异常处理:使用
@ControllerAdvice和@ExceptionHandler捕获系统异常,并返回友好的Result对象,而不是一堆栈信息。 - 日志记录与脱敏:使用SLF4J记录关键操作日志。在打印日志时,对用户手机号、身份证号、金额等敏感信息进行脱敏处理(如
138****1234)。你可以编写一个工具类来做脱敏,AI可以帮你生成正则表达式匹配模式。 - 接口文档:使用Swagger或Knife4j自动生成API文档。这几乎是毕业设计的标配了。添加依赖和配置后,AI能帮你补全Swagger的注解,如
@ApiOperation、@ApiParam。
结尾思考:AI是副驾,你才是司机
通过这个记账系统的实践,我们可以看到,AI编程助手(Copilot、通义灵码等)在减少重复编码、提示最佳实践、加速知识查询方面确实是个好帮手。但它生成的代码并非总是正确或最优的。
关键在于,我们要学会向AI提问(写清晰的注释和函数名),并具备鉴别和修改AI生成代码的能力。 例如,AI可能生成一个没有事务管理的方法,你需要识别出来并加上@Transactional;AI生成的SQL可能效率不高,你需要根据业务知识进行优化。
所以,利用AI提升代码质量的核心,不在于让它写更多的代码,而在于:
- 用它来遵循规范:当你开始按Controller-Service的结构写,AI补全的代码会强化这种模式。
- 用它来学习新知:看到一个不认识的注解或API,让AI解释一下。
- 用它来审查代码:将你写的代码片段发给AI,让它看看有没有潜在的安全风险或性能问题。
最终,你的架构设计能力、业务抽象能力、问题排查能力,这些才是程序员的核心价值,也是你毕业设计想要展示给导师看的东西。AI是一个强大的杠杆,能放大你的效率,但支点,永远是你自己的扎实基础与思考。希望这个结合AI辅助的“网上记账系统”实战思路,能帮你更轻松、更专业地完成自己的毕业设计项目。
更多推荐




所有评论(0)