跳转至

实验 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。
  • 逻辑要求
    1. 检查图书是否存在且未售出。
    2. 检查买家余额是否充足。
    3. 扣减买家余额。
    4. 更新图书状态为 SOLD
    5. 插入交易记录。
  • 技术要求
    • 必须在方法上添加 @Transactional 注解。
    • 编写一个 JUnit 单元测试:模拟余额不足的情况,验证事务是否回滚(即:报错后,书的状态应该依然是 ON_SALE,不能被改成 SOLD)。

验收标准:提交 buy 方法的源码截图,以及 JUnit 测试通过(绿色进度条)的截图。


🤖 任务三:AI 智能体集成 (40分)

编写 ChatController,实现 Chat to Action 流程。

1. 定义工具 (Tools)

在代码中定义 JSON 字符串,描述 searchBookbuyBook 两个工具的参数结构。

2. 实现调度逻辑

/chat/send 接口中: 1. 接收前端传来的 userMessagecurrentUser(从 Header 或参数获取)。 2. 调用 AiUtils.callDeepSeek 获取 AI 响应。 3. 判断逻辑: * 如果 AI 返回 tool_calls -> 解析函数名 -> 调用 TradeService 对应方法 -> 将结果再次发给 AI。 * 如果 AI 返回普通文本 -> 直接返回给前端。

验收标准: 1. 打开浏览器 http://localhost:8080。 2. 选择用户“李四”。 3. 输入:“我要买那本 Java 编程思想”。 4. 截图前端收到的回复:“交易成功,订单已生成”。


📝 任务四:成果展示 (10分)

在项目根目录的 README.md 中,按以下格式填写实验报告:

  1. 项目简介:一句话描述这个系统能干什么。
  2. 核心代码:粘贴 TradeService.buyBook 的代码(展示事务注解)。
  3. 运行截图
    • 截图 1:JUnit 测试通过。
    • 截图 2:前端对话界面(成功买书)。
    • 截图 3:买书后,数据库 t_transaction 表的数据记录。

🚀 挑战项 (选做,不计入总分)

如果你学有余力,可以尝试以下改进:
1. 模糊搜索增强:在 TradeService 中使用 MyBatis 的 <if> 标签实现按书名、价格区间组合搜索。
2. Docker 部署:编写 Dockerfile,将应用打包成镜像运行。
3. 信创部署:将项目打包并部署在 Anolis OS (Docker) 环境中运行,并截图 java -version 显示 Dragonwell 字样的画面。