# 移动端（uni-app）— 测试用例

> 依据：`ruoyi-ui-app/pages.json`、`ruoyi-ui-app/doc/*.md`、`doc/uni-app标准.md` 及各业务页面实现。  
> **应用形态**：uni-app（Vue3 + uView Plus），主包 4 Tab + 分包 `package-a` 共 20 个子页。  
> **接口鉴权**：Header `Authorization: Bearer {token}`（本地键 `Admin-Token`）；401 时 Toast「登录过期，即将登录」并跳转登录页。

---

## 通用前置

| 项 | 说明 |
| --- | --- |
| **测试账号** | 用户名 **ry**，密码 **123456** |
| **后端** | 与 `ruoyi-ui-app/config/index.js` 中 `DEV_API_HOST` 一致（默认 `http://192.168.1.25:8010`）；后端已启动且 CORS 已开 |
| **运行方式** | H5：`npm run dev:h5`（端口以控制台为准，常见 5173）；微信/APP 按 manifest 另行配置 |
| **数据** | 业务库宜有：资讯分类（moduleId=01）、畜牧资源、农技课程/实战培训、预约资源（兽医 004001 / 专家 004005 / 机构 004003）、在线接诊兽医、牦牛行情样本 |
| **登录态** | 需登录场景：先完成登录；Token 过期场景可 Mock `code=401` 或等待过期 |

**App 路由索引**（H5 hash 示例）：

| 模块 | 路径 |
| --- | --- |
| 登录 | `#/pages/login/index` |
| 首页 Tab | `#/pages/home/index` |
| AI Tab | `#/pages/ai/index` |
| 消息 Tab | `#/pages/message/index` |
| 我的 Tab | `#/pages/mine/index` |
| 养殖资讯 | `#/package-a/breeding-news/index` |
| 畜牧资源 | `#/package-a/livestock-resources/index` |
| 农技课堂 | `#/package-a/agri-classroom/index` |
| 用药工具 | `#/package-a/medicine-tools/index` |
| 牦牛行情 | `#/package-a/yak-market/index` |
| 预约服务 | `#/package-a/booking-service/index` |
| 我的预约 | `#/package-a/my-booking/index` |
| 在线问诊 | `#/package-a/online-clinic/index` |
| AI 助手 | `#/package-a/ai-assistant/index` |

---

## 覆盖说明

| 类别 | 覆盖要点 |
| --- | --- |
| **登录鉴权** | 登录/退出、验证码、记住账号、Token 401、ensureApiToken 跳转 |
| **Tab 与 i18n** | 四 Tab 切换、汉藏双语、Tab 文案同步、藏文布局 |
| **可匿名浏览** | 首页宫格、资讯/资源/课堂/用药/行情、课程详情（query 传参） |
| **需登录操作** | 预约提交、我的报名、在线问诊、消息、AI 会话、评价提交 |
| **预约全链路** | 兽医/专家/机构三类型、表单校验、状态筛选、取消、专家评价 |
| **问诊与 AI** | 兽医列表→会话→消息；AI 列表→助手聊天→多媒体 |
| **异常** | 空列表、网络失败、重复预约、非法表单、未登录拦截 |

---

## 一、接口测试用例

| 用例编号 | 测试模块 | 测试项 | 测试类型 | 测试工具 | 测试目的 | 前置条件 | 测试步骤 | 预期结果 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| YDD-LOGIN-API-001 | 登录 | 正常登录 | 接口测试 | Postman/curl | 获取 Token | 验证码关闭或已知 code | `POST /login` Body: `username=ry&password=123456` | `code=200`；返回 `token` |
| YDD-LOGIN-API-002 | 登录 | 错误密码 | 接口测试 | Postman | 鉴权失败 | 无 | 错误 password | `code≠200`；msg 提示账号或密码错误 |
| YDD-LOGIN-API-003 | 登录 | 获取用户信息 | 接口测试 | Postman | 会话有效 | 已登录 Token | `GET /getInfo` | `code=200`；含 `user`、`roles` |
| YDD-LOGIN-API-004 | 登录 | 未登录访问 | 接口测试 | curl | 401 | 无 Token | `GET /getInfo` | 401 或未登录 |
| YDD-LOGIN-API-005 | 登录 | 退出 | 接口测试 | Postman | 清会话 | 已登录 | `POST /logout` | `code=200` |
| YDD-NEWS-API-001 | 养殖资讯 | 分类树 | 接口测试 | Postman | 分类加载 | 无 | `GET /category/informationCategory/tree?moduleId=01` | `code=200`；可见分类 |
| YDD-NEWS-API-002 | 养殖资讯 | 列表分页 | 接口测试 | Postman | 列表 | 有资讯数据 | `GET /app/farmingNews/list?type={code}&pageNum=1&pageSize=10` | `code=200`；`rows` 非 null |
| YDD-NEWS-API-003 | 养殖资讯 | 标题模糊 | 接口测试 | Postman | 搜索 | 有样本 | `title=关键字` | 仅匹配标题 |
| YDD-RES-API-001 | 畜牧资源 | 四类列表 | 接口测试 | Postman | Tab 数据 | 有资源 | `GET /app/livestockResource/list?type=004002`（及 006/007/008） | 各 type 可返回；`rows` 含 `id`、`sourceType` |
| YDD-RES-API-002 | 畜牧资源 | 详情-科技 | 接口测试 | Postman | 源表全字段 | 有已发布技术成果 | `GET /app/livestockResource/{id}?type=2` | `code=200`；`data.resourceType` 为 004006/007/008 |
| YDD-RES-API-003 | 畜牧资源 | 详情-医疗 | 接口测试 | Postman | 源表全字段 | 有已发布专家团队 | `GET /app/livestockResource/{id}?type=1` | `code=200`；`data.resourceType=004002` |
| YDD-RES-API-004 | 畜牧资源 | 详情-不存在 | 接口测试 | Postman | 异常 | 已登录 | `GET /app/livestockResource/999999?type=2` | 失败；msg 含「下线或不存在」 |
| YDD-CLASS-API-001 | 农技课堂 | 视频课程 | 接口测试 | Postman | 课程列表 | 有课程 | `GET /app/agriculturalCourse/list?courseTopic=005001&pageNum=1` | `code=200` |
| YDD-CLASS-API-002 | 农技课堂 | 实战培训 | 接口测试 | Postman | 培训列表 | 有培训 | `GET /app/agriculturalCourse/list?trainingStatus=006002` | `code=200` |
| YDD-CLASS-API-003 | 培训报名 | 报名 | 接口测试 | Postman | 需登录 | ry 登录；培训 006002 | `POST /app/practicalTraining/{id}/enroll` | `code=200` |
| YDD-CLASS-API-004 | 培训报名 | 取消报名 | 接口测试 | Postman | 需登录 | 已报名记录 | `POST /app/practicalTraining/{id}/cancelEnroll` | `code=200` |
| YDD-CLASS-API-005 | 我的报名 | 列表 | 接口测试 | Postman | 需登录 | ry 登录 | `GET /app/practicalTraining/myEnroll/list?pageNum=1` | `code=200` |
| YDD-MED-API-001 | 用药工具 | 药物查询 | 接口测试 | Postman | 药名必填 | 库有药物 | `GET /app/medication/drug/query?drugName=青霉素` | 返回 drugTypeName 等 |
| YDD-MED-API-002 | 用药工具 | 休药期计算 | 接口测试 | Postman | 日期+药名 | 库有药物 | `GET /app/medication/withdrawal/calculate?drugName=xx&stopDate=2026-05-20` | 返回 endDate、withdrawalDays |
| YDD-MED-API-003 | 用药工具 | 配伍检查 | 接口测试 | Postman | ≥2 药名 | 无 | `GET /app/medication/compatibility/check?drugName1=a&drugName2=b` | 返回 compatResult |
| YDD-MKT-API-001 | 牦牛行情 | 昨日行情 | 接口测试 | Postman | 主卡片 | 有行情 | `GET /app/yakMarket/yesterday` | `code=200` |
| YDD-MKT-API-002 | 牦牛行情 | 7 日统计 | 接口测试 | Postman | 统计 | 有数据 | `GET /app/yakMarket/stats7` | `code=200` |
| YDD-MKT-API-003 | 牦牛行情 | 走势 | 接口测试 | Postman | 图表 | 有数据 | `GET /app/yakMarket/trend?days=7` | `code=200` |
| YDD-MKT-API-004 | 牦牛行情 | 每日列表 | 接口测试 | Postman | 分页 | 有数据 | `GET /app/yakMarket/daily/list?pageNum=1` | `code=200` |
| YDD-BOOK-API-001 | 预约服务 | 可约日期 | 接口测试 | Postman | 日期 Chip | 无 | `GET /app/bookingService/dates` | 近 7 日 |
| YDD-BOOK-API-002 | 预约服务 | 资源列表 | 接口测试 | Postman | 三类型 | 有资源 | `GET /app/bookingService/resource/list?resourceType=004001` | 兽医列表 |
| YDD-BOOK-API-003 | 预约 | 已约时段 | 接口测试 | Postman | 防重复 | ry 登录 | `GET /app/bookingService/appointment/booked?providerType=1&providerId={id}&appointDate=2026-05-25` | 返回已占时段 |
| YDD-BOOK-API-004 | 预约 | 提交兽医预约 | 接口测试 | Postman | 主流程 | ry 登录；有效资源 | `POST /app/bookingService/appointment` Body 含 appointeeName、contactPhone、timeSlot、serviceAddress、serviceRequirement | `code=200`；status=0 待确认 |
| YDD-BOOK-API-005 | 预约 | 提交机构预约 | 接口测试 | Postman | 机构规则 | ry 登录 | providerType=机构；Body 仅姓名电话 | `code=200`；status=5 已预约 |
| YDD-MYBOOK-API-001 | 我的预约 | 列表-兽医 | 接口测试 | Postman | 分页 | ry 登录；有预约 | `GET /app/myAppointment/list?providerType=1&statusTab=all` | `code=200` |
| YDD-MYBOOK-API-002 | 我的预约 | 状态筛选 | 接口测试 | Postman | statusTab | 有多状态样本 | `statusTab=notStarted` / `completed` / `cancelled` | 结果符合映射 |
| YDD-MYBOOK-API-003 | 我的预约 | 取消预约 | 接口测试 | Postman | 取消 | 可取消记录 | `POST /app/myAppointment/cancel/{id}` | `code=200`；status=3 |
| YDD-MYBOOK-API-004 | 我的预约 | 未登录 | 接口测试 | curl | 401 | 无 Token | `GET /app/myAppointment/list` | 401 |
| YDD-REVIEW-API-001 | 评价 | 专家历史评价 | 接口测试 | Postman | 列表 | 有评价 | `GET /app/bookingService/expert/{id}/reviews` | `code=200` |
| YDD-REVIEW-API-002 | 评价 | 提交评价 | 接口测试 | Postman | 三维评分 | ry 登录；专家已完成未评 | `POST /app/myAppointment/{id}/review` Body: punctualityScore、attitudeScore、guidanceScore、summary | `code=200` |
| YDD-REVIEW-API-003 | 评价 | 查看评价 | 接口测试 | Postman | 只读 | 已评价 | `GET /app/myAppointment/{id}/review` | 含三维分与 summary |
| YDD-CLINIC-API-001 | 在线问诊 | 兽医列表 | 接口测试 | Postman | 列表 | 有在线接诊兽医 | `GET /app/onlineConsult/vet/list?pageNum=1` | `code=200` |
| YDD-CLINIC-API-002 | 在线问诊 | 开启会话 | 接口测试 | Postman | 开 session | ry 登录 | `POST /app/onlineConsult/session/open` Body: vetResourceId | `code=200`；sessionId |
| YDD-CONSULT-API-001 | 问诊详情 | 消息列表 | 接口测试 | Postman | 历史消息 | 有 session | `GET /app/onlineConsult/session/{id}/messages` | `code=200` |
| YDD-CONSULT-API-002 | 问诊详情 | 发送文本 | 接口测试 | Postman | 发消息 | ry 登录 | `POST /app/onlineConsult/session/{id}/message` msgType=1 | `code=200` |
| YDD-MSG-API-001 | 消息 | 会话列表 | 接口测试 | Postman | Tab 消息 | ry 登录 | `GET /app/onlineConsult/session/list?pageNum=1&pageSize=24` | `code=200` |
| YDD-MSG-API-002 | 消息 | 隐藏会话 | 接口测试 | Postman | 删除 | 有 session | `POST /app/consult/vet/session/{sessionId}/hide` | `code=200` |
| YDD-AI-API-001 | AI | 会话列表 | 接口测试 | Postman | AI Tab | ry 登录 | `GET /app/consult/ai/session/list?pageNum=1&pageSize=100` | `code=200` |
| YDD-AI-API-002 | AI | 新建会话 | 接口测试 | Postman | 新建 | ry 登录 | `POST /app/consult/ai/session` | 返回 sessionId |
| YDD-AI-API-003 | AI | 隐藏会话 | 接口测试 | Postman | 删除 | 有 session | `POST /app/consult/ai/session/{id}/hide` | `code=200` |
| YDD-AI-API-004 | AI | 发送消息 | 接口测试 | Postman | LLM | ry 登录；有 session | `POST /app/consult/ai/session/{id}/message` | `code=200`（超时≤65s） |

---

## 二、界面测试用例（UI）

**测试工具**：

- **H5**：Playwright + Chromium（`channel: 'chrome'`）或手工；`baseURL` 为 H5 开发地址（如 `http://localhost:5173`）
- **小程序/APP**：手工 + 真机；步骤与 H5 一致，定位方式改为可见文案/组件

**通用登录步骤（前置）**：打开 `#/pages/login/index` → 输入 **ry** / **123456** →（若显示验证码则填写）→ 登录 → 进入首页 Tab。

| 用例编号 | 测试模块 | 测试项 | 测试类型 | 测试工具 | 测试目的 | 前置条件 | 测试步骤 | 预期结果 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| YDD-LOGIN-UI-001 | 登录 | 空用户名 | UI 测试 | Playwright/手工 | 前端校验 | 未登录 | 密码填 123456，用户名为空→登录 | Toast 提示用户名不能为空 |
| YDD-LOGIN-UI-002 | 登录 | 空密码 | UI 测试 | Playwright/手工 | 前端校验 | 未登录 | 用户名 ry，密码空→登录 | Toast 提示密码不能为空 |
| YDD-LOGIN-UI-003 | 登录 | 验证码必填 | UI 测试 | Playwright/手工 | captchaEnabled | 后端开启验证码 | 不填验证码→登录 | Toast 提示验证码不能为空 |
| YDD-LOGIN-UI-004 | 登录 | 成功登录 | UI 测试 | Playwright/手工 | 主流程 | 验证码关或正确 | ry / 123456→登录 | 跳转首页 Tab；本地有 Token |
| YDD-LOGIN-UI-005 | 登录 | 记住账号 | UI 测试 | Playwright/手工 | 持久化 | 勾选记住 | 登录成功→退出→再进登录页 | 用户名自动回填 ry |
| YDD-LOGIN-UI-006 | 登录 | 已有 Token 跳过 | UI 测试 | Playwright/手工 | 免登 | 已登录 | 直接打开登录页 | 自动 switchTab 首页 |
| YDD-LOGIN-UI-007 | 登录 | 401 过期 | UI 测试 | Playwright/手工 | request.js | 已登录 | Mock 某接口 401 或等过期 | Toast「登录过期，即将登录」→ 登录页 |
| YDD-TAB-UI-001 | Tab | 四 Tab 切换 | UI 测试 | 手工 | 导航 | 已登录 | 依次点 首页/AI/消息/我的 | 各 Tab 高亮绿色；页面正确 |
| YDD-TAB-UI-002 | Tab | 默认首页 | UI 测试 | 手工 | 默认页 | 冷启动 | 打开 App | 默认展示首页 Tab |
| YDD-I18N-UI-001 | 多语言 | 切换藏文 | UI 测试 | 手工 | i18n | 我的页 | 语言版本→选 བོད་ཡིག | 文案变藏文；根节点 `lang-bo` |
| YDD-I18N-UI-002 | 多语言 | Tab 文案同步 | UI 测试 | 手工 | tabBar | 已切藏文 | 查看底部 Tab | Tab 文本为藏文 |
| YDD-I18N-UI-003 | 多语言 | 切回中文 | UI 测试 | 手工 | i18n | 当前藏文 | 语言版本→简体中文 | 文案恢复中文；布局正常 |
| YDD-HOME-UI-001 | 首页 | 九宫格展示 | UI 测试 | 手工 | 入口 | 首页 | 查看 3×3 宫格 | 9 项：资讯、资源、课堂、用药、行情、店铺、预约、问诊、AI助手 |
| YDD-HOME-UI-002 | 首页 | 跳转养殖资讯 | UI 测试 | 手工 | 导航 | 首页 | 点击「养殖资讯」 | 进入 breeding-news |
| YDD-HOME-UI-003 | 首页 | 跳转预约服务 | UI 测试 | 手工 | 导航 | 首页 | 点击「预约服务」 | 进入 booking-service |
| YDD-HOME-UI-004 | 首页 | 跳转在线问诊 | UI 测试 | 手工 | 导航 | 首页 | 点击「在线问诊」 | 进入 online-clinic |
| YDD-HOME-UI-005 | 首页 | 跳转 AI 助手 | UI 测试 | 手工 | 导航 | 首页 | 点击「AI助手」 | 进入 ai-assistant |
| YDD-NEWS-UI-001 | 养殖资讯 | 分类 Tab | UI 测试 | 手工 | 筛选 | 有分类数据 | 切换顶部分类 | 列表随 type 刷新 |
| YDD-NEWS-UI-002 | 养殖资讯 | 搜索 | UI 测试 | 手工 | 模糊 | 有资讯 | 输入标题关键字 | 列表过滤匹配项 |
| YDD-NEWS-UI-003 | 养殖资讯 | 全部分类弹窗 | UI 测试 | 手工 | 分类 | 首页进资讯 | 打开全部分类→选 Chip | 列表切换对应分类 |
| YDD-NEWS-UI-004 | 养殖资讯 | 进详情 | UI 测试 | 手工 | 详情 | 有列表 | 点击一条 | 进入 news-detail；标题/日期/简介展示 |
| YDD-NEWS-UI-005 | 养殖资讯 | 附件预览 | UI 测试 | 手工 | 附件 | 详情含 PDF/图片 | 点击附件 | 图片预览或跳转 file-preview |
| YDD-RES-UI-001 | 畜牧资源 | 四类 Tab | UI 测试 | 手工 | Tab | 有数据 | 切换 t1～t4 | 各 Tab 列表不同 |
| YDD-RES-UI-002 | 畜牧资源 | 搜索 | UI 测试 | 手工 | 模糊 | 有资源 | 输入标题搜索 | 列表过滤 |
| YDD-CLASS-UI-001 | 农技课堂 | 视频/培训 Tab | UI 测试 | 手工 | 主 Tab | 有数据 | 切换视频课程与实战培训 | 子 Chip 与列表联动 |
| YDD-CLASS-UI-002 | 农技课堂 | 进课程详情 | UI 测试 | 手工 | 视频 | 有视频课 | 点击课程卡片 | course-detail；可播放视频 |
| YDD-CLASS-UI-003 | 培训详情 | 未开始不可报 | UI 测试 | 手工 | 006001 | 培训 status=006001 | 打开培训详情 | 按钮灰色不可点 |
| YDD-CLASS-UI-004 | 培训详情 | 报名中可报 | UI 测试 | 手工 | 006002 | ry 登录；未满 | 打开→立即报名 | 成功；按钮变取消报名 |
| YDD-CLASS-UI-005 | 培训详情 | 取消报名 | UI 测试 | 手工 | 已报名 | ry 登录 | 点击取消报名 | 成功；恢复可报名 |
| YDD-CLASS-UI-006 | 培训详情 | 未登录报名 | UI 测试 | 手工 | 401 | 未登录 | 点击立即报名 | 提示登录或跳转登录页 |
| YDD-ENROLL-UI-001 | 我的报名 | 入口需登录 | UI 测试 | 手工 | mine | 未登录 | 我的→我的报名 | 跳转登录页 |
| YDD-ENROLL-UI-002 | 我的报名 | 列表与筛选 | UI 测试 | 手工 | 列表 | ry 登录；有报名 | 我的→我的报名；切换状态 Chip | 双列卡片；筛选正确 |
| YDD-ENROLL-UI-003 | 我的报名 | 进培训详情 | UI 测试 | 手工 | 跳转 | 有卡片 | 点击卡片 | 进入 training-detail |
| YDD-MED-UI-001 | 用药工具 | 药名空查询 | UI 测试 | 手工 | 校验 | 查询 Tab | 药名空→查询 | Toast 提示药名不能为空 |
| YDD-MED-UI-002 | 用药工具 | 药物查询成功 | UI 测试 | 手工 | 展示 | 库有药 | 输入有效药名→查询 | 展示类型、休药期、用法等 |
| YDD-MED-UI-003 | 用药工具 | 休药期缺日期 | UI 测试 | 手工 | 校验 | 休药期 Tab | 仅填药名→计算 | 提示选停药日期 |
| YDD-MED-UI-004 | 用药工具 | 休药期计算 | UI 测试 | 手工 | 计算 | 有效药+日期 | 选日期→计算 | 展示 endDate、天数 |
| YDD-MED-UI-005 | 用药工具 | 配伍少于 2 药 | UI 测试 | 手工 | 校验 | 配伍 Tab | 仅 1 个药名→检查 | 提示至少 2 个药名 |
| YDD-MED-UI-006 | 用药工具 | 配伍重复药名 | UI 测试 | 手工 | 校验 | 配伍 Tab | 两行相同药名 | 提示不可重复 |
| YDD-MED-UI-007 | 用药工具 | 配伍成功 | UI 测试 | 手工 | 结果 | ≥2 不同药名 | 检查 | 展示 compatResult / 禁忌 |
| YDD-MKT-UI-001 | 牦牛行情 | 主卡片数据 | UI 测试 | 手工 | 展示 | 有行情 | 打开牦牛行情 | 昨日价、涨跌等展示 |
| YDD-MKT-UI-002 | 牦牛行情 | 7/30 日切换 | UI 测试 | 手工 | 图表 | 有走势 | 切换 7 日/30 日 | 折线图更新 |
| YDD-MKT-UI-003 | 牦牛行情 | 列表分页 | UI 测试 | 手工 | 滚动 | 有多日数据 | 滚动到底 | 加载更多每日行情 |
| YDD-BOOK-UI-001 | 预约服务 | 三类型 Tab | UI 测试 | 手工 | Tab | 有资源 | 切换兽医/专家/机构 | 列表 resourceType 对应 |
| YDD-BOOK-UI-002 | 预约服务 | 日期筛选 | UI 测试 | 手工 | 日期 Chip | 有近 7 日 | 选某日 | 列表按日期过滤 |
| YDD-BOOK-UI-003 | 预约服务 | 名称搜索 | UI 测试 | 手工 | 防抖 | 有资源 | 输入名称 | 300ms 后列表过滤 |
| YDD-BOOK-UI-004 | 预约服务 | 未登录预约 | UI 测试 | 手工 | ensureApiToken | 未登录 | 点某资源「预约」 | Toast 请先登录→登录页 |
| YDD-VET-UI-001 | 预约兽医 | 表单必填 | UI 测试 | 手工 | 校验 | ry 登录；进兽医详情 | 留空→提交 | 各必填项 Toast |
| YDD-VET-UI-002 | 预约兽医 | 手机号格式 | UI 测试 | 手工 | 校验 | 同上 | 输入非法手机号 | 提示格式错误 |
| YDD-VET-UI-003 | 预约兽医 | 非服务日禁用 | UI 测试 | 手工 | weekday | 资源不含今日 weekday | 查看日期 Chip | 今日不可选或禁用 |
| YDD-VET-UI-004 | 预约兽医 | 提交成功 | UI 测试 | 手工 | 主流程 | 合法表单 | 填全→提交 | 成功；状态待确认 |
| YDD-VET-UI-005 | 预约兽医 | 同日重复预约 | UI 测试 | 手工 | 防重复 | 同日已有有效预约 | 再进同资源同日 | 按钮「已预约」禁用 |
| YDD-EXPERT-UI-001 | 预约专家 | 评分跳转 | UI 测试 | 手工 | 评价入口 | 专家有评分 | 点击评分区 | 进入 review-history?id= |
| YDD-EXPERT-UI-002 | 预约专家 | 提交预约 | UI 测试 | 手工 | 同兽医 | ry 登录 | 填表提交 | 成功；status=0 |
| YDD-ORG-UI-001 | 预约机构 | 仅姓名电话 | UI 测试 | 手工 | 简化表单 | ry 登录 | 打开机构预约弹窗 | 无时段/地址手填项（地址取机构） |
| YDD-ORG-UI-002 | 预约机构 | 无机构地址 | UI 测试 | 手工 | 约束 | 机构 detailAddress 空 | 提交 | 不可提交或提示无地址 |
| YDD-ORG-UI-003 | 预约机构 | 提交成功 | UI 测试 | 手工 | status=5 | 有效机构 | 提交 | 成功；status 已预约 |
| YDD-MYBOOK-UI-001 | 我的预约 | 兽医 Tab 筛选 | UI 测试 | 手工 | statusTab | ry 有各状态预约 | 我的→我的预约；兽医 Tab；切 未开始/已完成/已取消 | 列表符合状态映射 |
| YDD-MYBOOK-UI-002 | 我的预约 | 专家待评价 | UI 测试 | 手工 | pendingReview | 专家已完成未评 | 专家 Tab→待评价 | 仅未评价已完成项 |
| YDD-MYBOOK-UI-003 | 我的预约 | 取消预约 | UI 测试 | 手工 | 取消 | 待确认/已预约 | 取消预约→确定 | 状态变已取消 |
| YDD-MYBOOK-UI-004 | 我的预约 | 取消二次确认 | UI 测试 | 手工 | confirm | 可取消项 | 取消→点取消 | 状态不变 |
| YDD-MYBOOK-UI-005 | 我的预约 | 专家评价入口 | UI 测试 | 手工 | 评价 | 已完成未评 | 点击「评价」 | 进入 review-history mode=submit |
| YDD-MYBOOK-UI-006 | 我的预约 | 查看评价 | UI 测试 | 手工 | 只读 | 已评价 | 点击「查看评价」 | mode=view；三维分展示 |
| YDD-REVIEW-UI-001 | 历史评价 | 评分必选 | UI 测试 | 手工 | 1～5 分 | 提交模式 | 不选分→提交 | 提示选择评分 |
| YDD-REVIEW-UI-002 | 历史评价 | 总结必填 | UI 测试 | 手工 | summary | 提交模式 | 总结空→提交 | 提示必填 |
| YDD-REVIEW-UI-003 | 历史评价 | 总结超长 | UI 测试 | 手工 | ≤100 字 | 提交模式 | 输入 101 字 | 不可提交或提示超长 |
| YDD-REVIEW-UI-004 | 历史评价 | 提交成功 | UI 测试 | 手工 | 主流程 | 合法三维分+总结 | 提交 | 成功；我的预约变「查看评价」 |
| YDD-CLINIC-UI-001 | 在线问诊 | 兽医列表 | UI 测试 | 手工 | 列表 | 有在线兽医 | 打开在线问诊 | 展示姓名、单位等 |
| YDD-CLINIC-UI-002 | 在线问诊 | 资料页 | UI 测试 | 手工 | vet-profile | 有兽医 | 点「资料」 | 展示简介、地址、服务时间 |
| YDD-CLINIC-UI-003 | 在线问诊 | 未登录问诊 | UI 测试 | 手工 | 鉴权 | 未登录 | 点「问诊」 | 跳转登录 |
| YDD-CLINIC-UI-004 | 在线问诊 | 开启会话 | UI 测试 | 手工 | 主流程 | ry 登录 | 点「问诊」 | 进入 consult-detail |
| YDD-CONSULT-UI-001 | 问诊详情 | 发文本 | UI 测试 | 手工 | msgType=1 | 有 session | 输入文本→发送 | 消息出现在列表 |
| YDD-CONSULT-UI-002 | 问诊详情 | 发图片 | UI 测试 | 手工 | msgType=2 | 有 session | 选图片发送 | 图片消息展示 |
| YDD-CONSULT-UI-003 | 问诊详情 | 超长文本 | UI 测试 | 手工 | maxlength | 有 session | 输入 >2000 字 | 无法输入或截断 |
| YDD-MSG-UI-001 | 消息 | 未登录 | UI 测试 | 手工 | 鉴权 | 未登录 | 点消息 Tab | 提示登录或空态+跳转 |
| YDD-MSG-UI-002 | 消息 | 会话列表 | UI 测试 | 手工 | 列表 | ry 登录；有问诊 | 消息 Tab | 展示兽医名、最后一条预览 |
| YDD-MSG-UI-003 | 消息 | 搜索过滤 | UI 测试 | 手工 | 本地搜 | 有多会话 | 输入兽医名 | 列表本地过滤 |
| YDD-MSG-UI-004 | 消息 | 进详情 | UI 测试 | 手工 | 跳转 | 有会话 | 点击一条 | consult-detail |
| YDD-MSG-UI-005 | 消息 | 长按删除 | UI 测试 | 手工 | hide | 有会话 | 长按→删除 | 列表移除；API hide 成功 |
| YDD-AI-UI-001 | AI Tab | 未登录列表 | UI 测试 | 手工 | 鉴权 | 未登录 | AI Tab | 提示登录或无法加载 |
| YDD-AI-UI-002 | AI Tab | 会话列表 | UI 测试 | 手工 | 列表 | ry 登录 | AI Tab | 展示历史 AI 会话 |
| YDD-AI-UI-003 | AI Tab | 新建会话 | UI 测试 | 手工 | 创建 | ry 登录 | 点底部新建 | 创建成功→跳转 ai-assistant |
| YDD-AI-UI-004 | AI Tab | 长按删除 | UI 测试 | 手工 | hide | 有会话 | 长按→删除 | 会话从列表消失 |
| YDD-AIASST-UI-001 | AI助手 | 免责声明 | UI 测试 | 手工 | 顶栏 | 进助手页 | 查看顶部 | 展示 disclaimer |
| YDD-AIASST-UI-002 | AI助手 | 模型切换 | UI 测试 | 手工 | LLM | ry 登录 | 切换 auto/疾病/通用/饲喂 | 发送后走对应模型 |
| YDD-AIASST-UI-003 | AI助手 | 发文本 | UI 测试 | 手工 | 聊天 | 有 session | 输入问题→发送 | 展示用户消息与 AI 回复 |
| YDD-AIASST-UI-004 | AI助手 | 空内容禁用 | UI 测试 | 手工 | disabled | 无文本无附件 | 查看发送按钮 | 不可点 |
| YDD-AIASST-UI-005 | AI助手 | 图片附件 | UI 测试 | 手工 | 多媒体 | 有 session | 选图片发送 | 上传并展示 |
| YDD-MINE-UI-001 | 我的 | 未登录展示 | UI 测试 | 手工 | 登录按钮 | 未登录 | 我的 Tab | 显示登录按钮 |
| YDD-MINE-UI-002 | 我的 | 已登录信息 | UI 测试 | 手工 | 用户信息 | ry 登录 | 我的 Tab | 展示昵称/头像等 |
| YDD-MINE-UI-003 | 我的 | 退出登录 | UI 测试 | 手工 | logOut | ry 登录 | 退出→确认 | 清 Token；进登录页 |
| YDD-MINE-UI-004 | 我的 | 编辑资料占位 | UI 测试 | 手工 | 即将上线 | ry 登录 | 点编辑资料 | Toast 即将上线 |
| YDD-MINE-UI-005 | 我的 | 我的预约入口 | UI 测试 | 手工 | 导航 | ry 登录 | 点我的预约 | 进入 my-booking |
| YDD-STORE-UI-001 | 我的店铺 | 占位页 | UI 测试 | 手工 | 占位 | 首页进我的店铺 | 打开页面 | 展示占位文案；无报错 |

---

## 三、覆盖对照

| 模块 | 接口 API | 界面 UI |
| --- | --- | --- |
| 登录鉴权 | LOGIN-API-001～005 | LOGIN-UI-001～007 |
| Tab / i18n | — | TAB-UI-001～002；I18N-UI-001～003 |
| 首页 | — | HOME-UI-001～005 |
| 养殖资讯 | NEWS-API-001～003 | NEWS-UI-001～005 |
| 畜牧资源 | RES-API-001～004 | RES-UI-001～002 |
| 农技/培训/报名 | CLASS-API-001～005 | CLASS-UI-001～006；ENROLL-UI-001～003 |
| 用药工具 | MED-API-001～003 | MED-UI-001～007 |
| 牦牛行情 | MKT-API-001～004 | MKT-UI-001～003 |
| 预约服务 | BOOK-API-001～005 | BOOK-UI-001～004；VET/EXPERT/ORG-UI |
| 我的预约/评价 | MYBOOK/REVIEW-API | MYBOOK-UI-001～006；REVIEW-UI-001～004 |
| 在线问诊 | CLINIC/CONSULT-API | CLINIC/CONSULT-UI |
| 消息 | MSG-API-001～002 | MSG-UI-001～005 |
| AI | AI-API-001～004 | AI-UI-001～004；AIASST-UI-001～005 |
| 我的 | — | MINE-UI-001～005 |
| 占位 | — | STORE-UI-001 |

---

## 四、Playwright（H5）实施提示

1. **安装**：在 `ruoyi-ui-app` 目录 `npm i -D @playwright/test`；`npx playwright install chrome`。
2. **配置示例**：

```js
// playwright.config.js
export default {
  use: {
    channel: 'chrome',
    locale: 'zh-CN',
    baseURL: 'http://localhost:5173',
    viewport: { width: 390, height: 844 }
  }
}
```

3. **登录复用**（`tests/auth.setup.js`）：

```js
await page.goto('/#/pages/login/index')
await page.getByPlaceholder(/用户名|账号/).fill('ry')
await page.getByPlaceholder(/密码/).fill('123456')
await page.getByRole('button', { name: /登录/ }).click()
await page.waitForURL(/pages\/home\/index/)
await context.storageState({ path: 'playwright/.auth/ry.json' })
```

4. **路由示例**：

```js
await page.goto('/#/package-a/my-booking/index')
await page.goto('/#/pages/message/index')
```

5. **401 Mock**：

```js
await page.route('**/app/myAppointment/list', route =>
  route.fulfill({ status: 200, body: JSON.stringify({ code: 401, msg: '未登录' }) })
)
```

6. **藏文**：在 `#/pages/mine/index` 执行语言切换后，断言 `[class*="lang-bo"]` 存在且 Tab 文案变化。

---

## 五、手工测试检查清单（发布前）

- [ ] 账号 **ry / 123456** 可登录并访问需登录功能
- [ ] 四 Tab 与 9 个首页入口均可达且无白屏
- [ ] 汉藏切换后 Tab、导航栏、表单无截断/重叠
- [ ] 兽医/专家/机构预约提交后在「我的预约」可见且状态正确
- [ ] 专家评价三维分与总结提交、查看正常
- [ ] 在线问诊发消息、消息 Tab 列表与删除正常
- [ ] AI 新建/删除会话、助手发文本与附件正常
- [ ] Token 过期后统一跳转登录，无脏数据残留
