我是高校老师,以前干过开发。这篇文章不光教你做一个系统,更想告诉你——你以后写代码的方式,可能彻底变了。
先看成品
先不展开技术细节,直接看成品页面。下面三张截图依次对应:登录、用户端图书列表(含搜索与分类筛选)、管理员后台首页。
登录页
用户端 · 图书列表
管理端 · 后台首页
- 登录/注册 → 普通用户进图书浏览,管理员进后台
- 书名搜索、分类筛选、图书详情、一键借阅
- 管理员:图书CRUD、用户管理、借阅记录查看、手动归还、超期追踪
完整项目代码 + 需求设计文档 + 建库脚本 + 测试数据,全在 GitHub:
我是谁?为什么写这篇
我是一名计算机专业的老师,以前做过几年软件开发。
我越来越明确地感受到:会写代码很重要,会正确使用 AI 编程工具同样重要。它不是替代基础学习的捷径,而是学生未来学习、开发和协作时必须掌握的一种新能力。这学期我教 JavaWeb开发技术,将AI 编程工具 Trae 引入课堂。
这篇文章就是我实际教学过程的复盘。不是一个炫技的 demo,而是一套可复用的方法论。
传统开发 vs AI辅助开发:差在哪?
我画张表你就明白了:
| 环节 | 传统方式 | Trae辅助 |
|---|---|---|
| 需求整理 | 手动整理半天,来回改 | 对话式梳理,20分钟出结构化文档 |
| 设计文档 | 翻模板、粘贴拼接 | 一次性生成完整设计文档 |
| 数据库设计 | 翻教材、手写建表SQL | 描述需求,一键生成DDL+测试数据 |
| UI设计 | 手写HTML/CSS,调半天 | 用 frontend design skill 直接出页面 |
| 后端代码 | 一个Servlet一个Servlet敲 | 把设计文档喂进去,一把梭全部生成 |
| 测试 | Postman一个个接口点 | 生成测试用例,全链路验证 |
听起来像在吹牛?往下看。
第0步:用Trae整理需求(最重要的一步)
我见过很多人用 AI 写代码翻车。原因几乎一样:需求没想清楚就让 AI 写代码,它瞎猜,你也瞎改。
我的方法是反过来的——先让 AI 帮我把"到底要做什么"理清楚。
对话式需求梳理
跟 Trae 聊几轮,把模糊的想法变成结构化输出:
- 这个系统有哪些用户角色?(普通用户 / 管理员)
- 每个角色能干什么?(浏览图书、借阅、管理……)
- 业务流程是什么样的?(登录 → 浏览 → 借书 → 还书)
- 有没有边界条件?(最多借5本、超期不能借、有借阅的不能删)
聊完,Trae 直接给我输出了一份完整的需求文档。
生成的完整设计文档
这份文档包含:
- ✅ 功能需求:用户模块(注册/登录/个人信息)、图书模块(浏览/搜索/详情)、借阅模块(借书/还书/记录)、管理模块(图书CRUD/用户管理/借阅管理)
- ✅ 业务流程图:注册登录流程、借书流程、还书流程、超期处理流程——全画好了
- ✅ 数据库设计:users / books / borrow_records 三张表,字段类型、索引、外键、注释——完整 DDL
- ✅ API接口规范:7个Servlet模块、每个接口的请求参数和响应格式——明明白白
- ✅ 技术栈选型:Jakarta Servlet + MySQL + Tomcat 11 + Maven
- ✅ 边界条件:借阅上限、超期限制、删除规则
💡 这一步是整个方法论的核心。文档写清楚了,后面每一步都是"翻译",而不是"探索"。
第1步:用Trae设计数据库
需求文档里已经把表结构定义好了。我说一句:
"按照设计文档里的数据库部分,生成完整建表 SQL,同时生成管理员初始化脚本和测试数据。"
Trae 直接输出:
-- 用户表
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) NOT NULL UNIQUE,
name VARCHAR(50) NOT NULL,
password VARCHAR(255) NOT NULL,
email VARCHAR(100) NOT NULL,
role VARCHAR(20) NOT NULL DEFAULT 'user',
user_type VARCHAR(20) NOT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
-- 图书表
CREATE TABLE books (
id INT PRIMARY KEY AUTO_INCREMENT,
title VARCHAR(200) NOT NULL,
author VARCHAR(100) NOT NULL,
-- ... 完整字段
total_copies INT NOT NULL DEFAULT 1,
available_copies INT NOT NULL DEFAULT 1
);
-- 借阅记录表
CREATE TABLE borrow_records (
id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT NOT NULL,
book_id INT NOT NULL,
borrow_date DATETIME DEFAULT CURRENT_TIMESTAMP,
due_date DATETIME NOT NULL,
return_date DATETIME DEFAULT NULL,
status VARCHAR(20) NOT NULL DEFAULT 'borrowing',
FOREIGN KEY (user_id) REFERENCES users(id),
FOREIGN KEY (book_id) REFERENCES books(id)
);
一个细节值得注意:复本设计。一本书可以有多个复本(total_copies),当前可借的数量是 available_copies。借书 -1,还书 +1。这个设计在整个系统的借还逻辑中贯穿始终,Trae 理解得很到位。
第2步:Trae设计UI界面
不写一行 HTML/CSS。用 Trae 的 frontend design skill。
跟 Trae 描述:
"设计一个图书管理系统的前端界面,包含:登录页(简洁、带角色区分)、用户首页(搜索框+分类下拉+图书卡片网格)、管理员后台(侧边栏导航+数据面板)"
效果:
📸登录页UI设计
📸图书浏览页UI设计,带搜索和分类筛选
每个图书卡片显示封面、书名、作者、出版社,以及 "可借 3/5" 这样的复本状态。搜索框支持按书名/作者模糊匹配,分类下拉点击即筛选。
📸管理员后台面板
界面出来之后,学生对"做项目"这件事明显更有信心了——毕竟看到好看的页面,比看到一堆 Servlet 代码直观得多。
第3步:后端功能一把梭
这一步,可能是最颠覆认知的地方。
为什么能一把梭?
传统的 AI 编程,一般是:说一句话 → AI 写一段 → 你检查 → 再说 → 再写。来回拉扯。
但我要说的是:如果你的设计文档足够清晰,你根本不需要来回拉扯。
我们在第0步磨出来的设计文档里:
- 7 个 Servlet 模块、谁负责什么 → 清清楚楚
- 每个接口的路径、参数、返回格式 → 明明白白
- 数据库表结构、字段、关系 → 板上钉钉
这就是给 AI 的"最高指示"。它不需要猜——翻译就行。
操作方式
把设计文档喂给 Trae,核心 prompt 就一句:
"按照这个设计文档,帮我实现全部后端代码。项目结构按 controller / service / dao / entity / util 分层,Servlet 用 Jakarta 规范,接口返回 JSON 格式,密码用 MD5 加密处理。"
Trae 一次性输出:
book-manage/
├── src/main/java/com/library/
│ ├── controller/
│ │ ├── AuthServlet.java # 登录/注册/登出
│ │ ├── UserServlet.java # 个人信息/修改密码
│ │ ├── BookServlet.java # 图书浏览/搜索/详情
│ │ ├── BorrowServlet.java # 借书/还书/借阅记录
│ │ ├── AdminBookServlet.java # 管理员-图书CRUD
│ │ ├── AdminUserServlet.java # 管理员-用户管理
│ │ └── AdminBorrowServlet.java # 管理员-借阅管理
│ ├── service/ # 业务逻辑层
│ ├── dao/ # 数据访问层
│ ├── entity/ # 实体类(User, Book, BorrowRecord)
│ └── util/ # 工具类(DB连接、MD5加密)
├── pom.xml
└── web.xml
导进 IDEA,跑起来调
代码生成 ≠ 完事。下一步:
- 用 IntelliJ IDEA 打开项目
- 配置 Tomcat 11
- MySQL 建库 → 跑建表脚本 → 插测试数据
- 启动 → 看日志 → 哪里报错调哪里
💡 角色分工总结:Trae 负责"写",IDEA 负责"验证",你负责判断对错。三个各司其职,效率翻倍。
需要微调的地方
一把梭出来的代码,通常就调这几个点:
- import 路径:Trae 偶尔混
javax.servlet和jakarta.servlet,全局替换一下就好 - 数据库连接参数:改
db.properties里的用户名密码 - 中文编码:JDBC URL 加
characterEncoding=utf8,Servlet 加request.setCharacterEncoding("UTF-8") - 边界条件:比如"超期未还不能借书"这个逻辑,设计文档里有,但 Trae 实现时需要确认一下判断时机(我选择在借书时实时检查,不用定时任务)
这些不是 AI 的问题,是从文档到代码的正常摩擦。五分钟搞定。
第4步:前后端对接 & 测试
后端接口跑通了,前端页面也有了,接下来是把它们连起来。
前端调用
用原生 Fetch API,前端页面里这样写:
// 登录
const res = await fetch('/api/auth?action=login', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ username: '20220104044', password: '123456' })
});
const data = await res.json();
if (data.code === 200) {
sessionStorage.setItem('user', JSON.stringify(data.data));
window.location.href = 'index-user.html';
}
登录后用户信息存 sessionStorage,每次请求带上 Session(浏览器自动管理 Cookie),后端过滤器验证权限。
全链路测试
让 Trae 帮我生成测试场景:
- 注册一个新用户 → ✅
- 用 admin 登录,新增一本图书 → ✅
- 普通用户借这本书 → ✅
- 再借一本,验证"我的借阅"显示两条 → ✅
- 归还一本 → 验证可借复本数恢复 → ✅
- 故意借第6本 → 提示"已达上限" → ✅
- 删除一本有借阅记录的图书 → 提示"无法删除" → ✅
走完好,系统的核心逻辑就跑通了。
踩坑实录
真实开发过程中遇到的坑,分享给你:
| 坑 | 现象 | 解法 |
|---|---|---|
| Tomcat 11 的 Jakarta 迁移 | Trae 默认生成 javax.servlet.*,编译报错 | 明确告诉它用 Jakarta,生成后全局检查 import |
| 中文乱码 | 数据库存进去是乱码,页面显示也是乱码 | JDBC URL 加 characterEncoding=utf8,Servlet 统一设请求/响应编码 |
| 超期检查的性能考虑 | Trae 建议用定时任务扫描全表,太重 | 改为用户借书时实时查询 status='borrowing' AND due_date < NOW() |
| 删除关联检查 | Trae 有时忽略"有借阅记录不能删"这个约束 | 提醒它加前置检查,删前查 borrow_records 表 |
| JSON 解析依赖 | 忘了加 Jackson 依赖,返回 JSON 时报错 | pom.xml 加上 jackson-databind |
每个坑踩完都是一次学习。关键是:有 AI 在,解决这些问题的速度快了至少 3 倍。
复盘:AI辅助开发的正确姿势
这篇文章真正的价值,不是"你会做一个图书管理系统了",而是你学会了一套工作方法:
我的 AI 开发六步法
① 需求整理 ──→ ② 设计文档 ──→ ③ UI设计 ──→
④ 后端实现 ──→ ⑤ 前后端对接 ──→ ⑥ 测试验证
↑ |
└───────── 文档驱动,全程 AI 参与 ───────┘
三个核心认知
1. 文档先行,代码后行
需求清楚了,代码就是翻译。花 30% 的时间磨文档,省掉 70% 的返工。
2. AI 是合伙人,不是代码生成器
你负责"做什么"(业务理解、设计决策),AI 负责"怎么做"(代码实现、格式转换)。两个大脑,各擅胜场。
3. 分层推进,每层验证
数据库 → 后端 → 前端 → 联调。不要一把梭到头再回来看,每一层跑通了再进下一层。
对学生和初学者的意义
我之所以把这套方法带到课堂上,是因为我清楚地看到:
未来 3-5 年,程序员的核心竞争力不是"能写多少代码",而是"能多准确地描述需求、多高效地和 AI 协作"。
一个学生按照这套方法,从零到跑通一个完整的 JavaWeb 项目,以前可能需要两周。现在,半天足够。
多出来的时间干嘛?去理解业务、去设计架构、去思考"为什么要这样设计"——这些才是 AI 替代不了的东西。
资源 & 下一步
🔗 GitHub 仓库:(book-manage链接) — 完整项目代码 + 需求设计文档 + 建库脚本 + 测试数据,clone 下来就能跑
📢 如果这篇文章反响不错,我计划录制一套完整的视频教程,把这套方法论从头到尾讲透。
💬 评论区聊聊:你用 AI 写 Java 遇到过什么坑?你觉得 AI 编程对你的学习/工作方式改变了什么?
觉得有用就点个赞 👍,转发给也在学 JavaWeb 的同学。