实验 6:结课大作业 —— SmartBook 二手书交易智能体¶
实验信息
- 实验类型:综合设计性
- 建议时长:4 学时
- 核心目标:基于 Spring Boot + MyBatis + DeepSeek,开发一个能通过自然语言进行二手书买卖的后端系统。
重要提示:不追求大而全
本次实验重点考核 “AI 调度业务逻辑” 的能力。
- ❌ 不需要写登录注册功能(直接在数据库预置用户)。
- ❌ 不需要写精美的 CSS(使用老师提供的模板)。
- ✅ 必须保证“购买”功能的事务安全性。
- ✅ 必须跑通 AI 对话流程。
🏗️ 任务一:环境与数据库准备 (20分)¶
1. 建立工程¶
- 创建 Spring Boot 项目,引入 Web, MyBatis, PostgreSQL/openGauss, Lombok 依赖。
- 将老师提供的前端模板
index.html放入src/main/resources/static/目录。 - 将老师提供的工具类
AiUtils.java放入utils包。
2. 数据库建模¶
在 openGauss 中执行 SQL 脚本,创建以下三张表,并预置测试数据:
* t_user: 预置用户 "zhangsan" (余额 0), "lisi" (余额 500)。
* t_book: 预置 "Java编程思想" (50元), "三体" (30元)。
* t_transaction: 空表。
验收标准:在 DataGrip 中截图三张表的结构和初始数据。
🔧 任务二:核心业务层开发 (30分)¶
编写 TradeService 类,实现以下两个核心方法。
1. 发布图书 (publish)¶
- 接收参数:卖家姓名、书名、价格。
- 逻辑:向
t_book表插入一条数据,状态默认为ON_SALE。
2. 购买图书 (buy) —— 核心考核点¶
- 接收参数:买家姓名、图书 ID。
- 逻辑要求:
- 检查图书是否存在且未售出。
- 检查买家余额是否充足。
- 扣减买家余额。
- 更新图书状态为
SOLD。 - 插入交易记录。
- 技术要求:
- 必须在方法上添加
@Transactional注解。 - 编写一个 JUnit 单元测试:模拟余额不足的情况,验证事务是否回滚(即:报错后,书的状态应该依然是
ON_SALE,不能被改成 SOLD)。
- 必须在方法上添加
验收标准:提交
buy方法的源码截图,以及 JUnit 测试通过(绿色进度条)的截图。
🤖 任务三:AI 智能体集成 (40分)¶
编写 ChatController,实现 Chat to Action 流程。
1. 定义工具 (Tools)¶
在代码中定义 JSON 字符串,描述 searchBook 和 buyBook 两个工具的参数结构。
2. 实现调度逻辑¶
在 /chat/send 接口中:
1. 接收前端传来的 userMessage 和 currentUser(从 Header 或参数获取)。
2. 调用 AiUtils.callDeepSeek 获取 AI 响应。
3. 判断逻辑:
* 如果 AI 返回 tool_calls -> 解析函数名 -> 调用 TradeService 对应方法 -> 将结果再次发给 AI。
* 如果 AI 返回普通文本 -> 直接返回给前端。
验收标准: 1. 打开浏览器
http://localhost:8080。 2. 选择用户“李四”。 3. 输入:“我要买那本 Java 编程思想”。 4. 截图前端收到的回复:“交易成功,订单已生成”。
📝 任务四:成果展示 (10分)¶
在项目根目录的 README.md 中,按以下格式填写实验报告:
- 项目简介:一句话描述这个系统能干什么。
- 核心代码:粘贴
TradeService.buyBook的代码(展示事务注解)。 - 运行截图:
- 截图 1:JUnit 测试通过。
- 截图 2:前端对话界面(成功买书)。
- 截图 3:买书后,数据库
t_transaction表的数据记录。
🚀 挑战项 (选做,不计入总分)¶
如果你学有余力,可以尝试以下改进:
1. 模糊搜索增强:在 TradeService 中使用 MyBatis 的 <if> 标签实现按书名、价格区间组合搜索。
2. Docker 部署:编写 Dockerfile,将应用打包成镜像运行。
3. 信创部署:将项目打包并部署在 Anolis OS (Docker) 环境中运行,并截图 java -version 显示 Dragonwell 字样的画面。