# 管理员角色接口优化总结 ## 概述 为了解决权限问题,创建了两个专门的接口用于获取医生和医助列表,替代原来的 `adminapi/auth.admin/lists` 接口。 ## 问题背景 ### 原来的问题 1. **医助列表**:`adminapi/auth.admin/lists?role_id=2` - 权限不足 2. **医生列表**:`adminapi/auth.admin/lists?role_id=1` - 权限不足 ### 根本原因 - `auth.admin/lists` 接口需要管理员权限 - 普通用户无法访问该接口 - 数据库结构使用中间表 `zyt_admin_role` 关联角色,不是直接的 `role_id` 字段 ## 解决方案 ### 新增接口 | 接口 | 用途 | 角色ID | |------|------|--------| | `/tcm.diagnosis/getAssistants` | 获取医助列表 | 2 | | `/tcm.diagnosis/getDoctors` | 获取医生列表 | 1 | ### 数据库结构 ``` zyt_admin (管理员表) ├─ id ├─ name ├─ account └─ disable zyt_admin_role (中间表) ├─ admin_id → zyt_admin.id └─ role_id → 角色ID ``` ### 查询逻辑 ```php // 通过中间表查询 \app\common\model\auth\Admin::alias('a') ->join('admin_role ar', 'a.id = ar.admin_id') ->where('ar.role_id', $roleId) // 1=医生, 2=医助 ->where('a.disable', 0) ->field(['a.id', 'a.name', 'a.account']) ->order('a.id', 'asc') ->select() ->toArray(); ``` ## 实现文件 ### 后端文件 1. **控制器**:`server/app/adminapi/controller/tcm/DiagnosisController.php` - `getAssistants()` - 获取医助列表 - `getDoctors()` - 获取医生列表 2. **逻辑层**:`server/app/adminapi/logic/tcm/DiagnosisLogic.php` - `getAssistants()` - 医助查询逻辑 - `getDoctors()` - 医生查询逻辑 ### 前端文件 1. **API**:`admin/src/api/tcm.ts` - `getAssistants()` - 医助API - `getDoctors()` - 医生API 2. **组件**: - `admin/src/views/tcm/diagnosis/index.vue` - 使用医助列表 - `admin/src/views/tcm/diagnosis/appointment.vue` - 使用医生列表 ## 接口对比 ### 医助列表 **旧接口:** ```typescript import { adminLists } from '@/api/perms/admin' const assistants = await adminLists({ page_no: 1, page_size: 1000, role_id: 2 }) assistantOptions.value = assistants?.lists || [] ``` **新接口:** ```typescript import { getAssistants } from '@/api/tcm' const assistants = await getAssistants() assistantOptions.value = assistants || [] ``` ### 医生列表 **旧接口:** ```typescript import { adminLists } from '@/api/perms/admin' const doctors = await adminLists({ page_no: 1, page_size: 1000, role_id: 1 }) doctorList.value = doctors?.lists || [] ``` **新接口:** ```typescript import { getDoctors } from '@/api/tcm' const doctors = await getDoctors() doctorList.value = doctors || [] ``` ## 优势对比 | 特性 | 旧接口 | 新接口 | |------|--------|--------| | 权限要求 | 需要管理员权限 | 无需额外权限 | | 数据结构 | 分页数据 `{lists, count}` | 直接返回数组 | | 查询方式 | 错误(直接查role_id) | 正确(通过中间表) | | 返回字段 | 所有字段 | 精简字段 | | 性能 | 较慢 | 较快 | | 维护性 | 依赖权限系统 | 独立维护 | ## 测试清单 ### 医助列表测试 - [ ] 诊单管理页面 - 筛选条件中的医助下拉框 - [ ] 诊单管理页面 - 指派医助弹窗 - [ ] 批量指派医助功能 - [ ] 单个指派医助功能 ### 医生列表测试 - [ ] 挂号预约页面 - 医生选择下拉框 - [ ] 医生排班查询 - [ ] 预约挂号功能 ### 功能测试 - [ ] 下拉框正常显示 - [ ] 可以正常筛选 - [ ] 可以正常指派/预约 - [ ] 没有权限错误 - [ ] 没有控制台错误 ## SQL 测试 ### 检查数据 ```sql -- 检查医生 SELECT a.id, a.name, a.account, ar.role_id, a.disable FROM zyt_admin a INNER JOIN zyt_admin_role ar ON a.id = ar.admin_id WHERE ar.role_id = 1 ORDER BY a.id ASC; -- 检查医助 SELECT a.id, a.name, a.account, ar.role_id, a.disable FROM zyt_admin a INNER JOIN zyt_admin_role ar ON a.id = ar.admin_id WHERE ar.role_id = 2 ORDER BY a.id ASC; -- 检查中间表 SELECT * FROM zyt_admin_role ORDER BY admin_id, role_id; ``` ### 添加测试数据 ```sql -- 添加测试医生 INSERT INTO zyt_admin (name, account, password, disable, create_time, update_time) VALUES ('测试医生', 'test_doctor', 'e10adc3949ba59abbe56e057f20f883e', 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()); INSERT INTO zyt_admin_role (admin_id, role_id) VALUES (LAST_INSERT_ID(), 1); -- 添加测试医助 INSERT INTO zyt_admin (name, account, password, disable, create_time, update_time) VALUES ('测试医助', 'test_assistant', 'e10adc3949ba59abbe56e057f20f883e', 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()); INSERT INTO zyt_admin_role (admin_id, role_id) VALUES (LAST_INSERT_ID(), 2); ``` ## 相关文档 - `ASSISTANT_API_FIX.md` - 医助列表接口详细说明 - `DOCTOR_API_FIX.md` - 医生列表接口详细说明 - `ASSISTANT_API_TEST.md` - 医助接口测试指南 ## 注意事项 1. **中间表关联**:必须通过 `zyt_admin_role` 查询,不能直接查 `role_id` 2. **角色ID**:医生=1,医助=2 3. **状态过滤**:只返回 `disable = 0` 的用户 4. **字段精简**:只返回 id、name、account 5. **错误处理**:捕获异常,返回空数组 6. **日志记录**:记录错误日志便于排查 ## 迁移步骤 如果其他页面也使用了 `adminLists` 获取医生/医助列表,可以按以下步骤迁移: 1. 导入新的 API:`import { getDoctors, getAssistants } from '@/api/tcm'` 2. 移除旧的导入:`import { adminLists } from '@/api/perms/admin'` 3. 替换调用:`adminLists({role_id: 1})` → `getDoctors()` 4. 更新数据处理:`res?.lists || []` → `res || []` 5. 测试功能是否正常 ## 成功标准 - ✅ 接口返回正确的数据 - ✅ 前端下拉框正常显示 - ✅ 没有权限错误 - ✅ 没有控制台错误 - ✅ 功能正常使用 --- **创建日期:** 2024-03-04 **状态:** ✅ 完成 **影响范围:** 诊单管理、挂号预约