毕设开发中的典型痛点
需求来回改,原型图永远定不下来
老师一句“再加个报表”就能让数据库推翻重来,需求文档却只有三行字。最惨的是,评审前一天还在改字段名。技术栈选择困难症
想上 Spring Cloud 怕太重,用 Flask 又怕不够“企业级”。GitHub 逛了三天,star 数破千的项目跑起来却全是报错。CRUD 重复造轮子
用户注册、登录、找回密码、分页查询,写了四年还是同一套代码。复制粘贴到吐,还要为每个接口补单元测试。代码越写越“脏”
为了赶进度,DAO 层直接拼 SQL,业务逻辑塞在 Controller,一个函数 300 行。答辩 PPT 上却写着“高内聚、低耦合”。团队协作踩坑
同组同学用 Windows 自己装 MySQL 8,Mac 机装 5.7,字段大小写敏感问题拖到上线前才炸开。
主流 AI 辅助工具选型对比
| 维度 | GitHub Copilot | Amazon CodeWhisperer | 本地 LLM (CodeLlama-13B) |
|---|---|---|---|
| 延迟 | 100 ms 级 | 150 ms 级 | 2 s 级(RTX 4060) |
| 安全 | 代码上传云端 | 可选离线模式 | 纯本地,无外传 |
| 价格 | 10 $/月 | 免费个人版 | 电费 |
| 语言支持 | 全栈 | Java, Python 最佳 | 取决于量化版本 |
| 幻觉率 | 低-中 | 中 | 高(需调 temperature=0.1) |
结论:
- 校内敏感课题(含隐私数据)优先本地 LLM;
- 想“开箱即用”且预算充足,Copilot 效率最高;
- CodeWhisperer 适合 AWS 全家桶用户,Lambda 模板一键出。
智能脚手架设计思路
目标:5 分钟生成一套“用户-角色-权限-日志”骨架,技术栈 Spring Boot 3 + MyBatis-Plus + PostgreSQL,端口 8080,统一 REST 风格。
工程结构约定
src ├── main │ ├── java │ │ └── com.selab │ │ ├── config // 跨域、Swagger、MyBatis-Plus │ │ ├── security // JWT + RBAC │ │ ├── module │ │ │ ├── user │ │ │ ├── role │ │ │ └── log │ │ └── SelabApplication.java │ └── resources │ ├── db/migration // Flyway SQL │ └── application.yml核心模块生成脚本(Python 3,Jinja2 模板)
脚本放在scaffold/gen.py,运行前pip install jinja2 sqlalchemy。# gen.py from jinja2 import Environment, FileSystemLoader import json, os, inflection TABLES = json.load(open("tables.json")) # 由 LLM 根据需求澄清生成 env = Environment(loader=FileSystemLoader('templates')) env.filters['camel'] = inflection.camelize env.filters['lower_camel'] = lambda s: inflection.camelize(s, False) for t in TABLES: # 1. 生成 Entity entity = env.get_template("entity.java.j2").render(table=t) open(f"../src/.../module/{t['name']}/{t['name'].capitalize()}.java", 'w').write(entity) # 2. 生成 Mapper XML xml = env.get_template("mapper.xml.j2").render(table=t) open(f"../src/.../mapper/{t['name']}Mapper.xml", 'w').write(xml) # 3. 生成 Service/Controller 略 print("代码骨架生成完毕,请执行 mvn compile")模板示例(entity.java.j2)
符合 Clean Code 原则:字段私有、Builder 构造、无 setXxx() 暴露。package com.selab.module.{{ table.name }}; import com.baomidou.mybatisplus.annotation.*; import java.time.LocalDateTime; import lombok.*; @Data @Builder @NoArgsConstructor @AllArgsConstructor @TableName("t_{{ table.name }}") public class {{ table.name|camel }} { @TableId(type = IdType.AUTO) private Long id; {% for col in table.columns %} /** {{ col.comment }} */ private {{ col.javaType }} {{ col.name|lower_camel }}; {% endfor %} @TableField(fill = FieldFill.INSERT) private LocalDateTime createTime; @Version // 乐观锁 private Integer version; }权限控制切面
利用 Spring Security 的@PreAuthorize("hasRole('ADMIN')"),在生成 Controller 时自动读取tables.json里的needRole字段,避免手写注解。日志记录自动注入
通过 MyBatis-Plus 插件拦截update和insert,把变更 JSON 写入t_log表,字段含operator_id,table_name,row_id,diff。
安全性与健壮性复盘
幂等性
在t_user表对email加唯一索引,Service 层createUser先SELECT ... FOR UPDATE,若存在则抛DuplicateKeyException,防止重复注册。SQL 注入
MyBatis-Plus 条件构造器内部使用#{}预编译,禁止在 XML 里写${}。生成模板默认开启#{},若检测到模糊查询,自动改用LIKE CONCAT('%', #{keyword}, '%')。并发竞争用乐观锁
Entity 带@Version字段,更新时 SQL 追加AND version=#{version},失败抛OptimisticLockingException,上层重试或提示用户刷新。越权访问
在生成的 Controller 里统一加@RequestScope的SecurityChecker,对比 JWT 中的userId与路径参数,不匹配直接 403。敏感字段脱敏
模板内置@JsonIgnore对password,并生成UserVo传输对象,只暴露id, username, email, roleName。
生产环境避坑指南
模型幻觉导致逻辑错误
曾出现 LLM 把“分页查询”生成limit 1000, 1的离谱 SQL,测试库数据少没发现,上线后全表扫描把 CPU 打满。务必- 给生成器加单元测试模板,跑 1000 条随机数据;
- 对 SQL 用
EXPLAIN扫描成本,>1000 就告警。
依赖版本冲突
Spring Boot 3.2 与 MyBatis-Plus 3.5.5 有kotlin-stdlib传递依赖差异,打包时mvn dependency:tree会提示kotlin-stdlib-1.9.10与1.8.22冲突。在pom里统一dependencyManagement锁定版本,防止运行时NoSuchMethodError。冷启动延迟
本地 LLM 第一次加载 13B 模型需 8 s,接口返回超时。做法:- 预加载脚本随系统服务启动;
- 对外提供
/health探针,Kubernetes 就绪检查通过后再放流量。
日志量爆炸
默认把完整 JSON diff 写数据库,批量导入时 1 分钟产生 2 G 日志。采用条件采样:只记录role=ADMIN或updateColumns contains sensitive的字段。忘记关闭 Swagger
生产环境忘记加springdoc.swagger-ui.enabled=false,接口裸奔。脚手架模板已设置prodprofile 自动关闭,并加BasicAuth双重保护。
动手定制你的毕设模板
- fork 官方示例仓库,把
tables.json换成自己的课题——比如“实验室设备预约”。 - 修改
gen.py里包名com.selab→com.lab.reserve,运行python gen.py。 - 对生成代码跑
mvn test,覆盖率 >80% 再提交 Git。 - 把常用算法(预约冲突检测、库存扣减)写成策略模式,让 LLM 只生成骨架,核心逻辑人工重写。
- 答辩前删掉所有
TODO AI注释,老师问“这段代码谁写的”——记得回答“AI 帮写,我负责 Code-review 与单元测试”。
AI 与人工的边界并不模糊:
- 让模型做它最擅长的——样板代码、翻译、命名;
- 把思考留给自己——业务规则、异常策略、数据一致性。
祝你 30 分钟搭完骨架,剩下的时间安心写论文,不再熬夜调 SQL。