Files
zyt/ADMIN_ROLE_API_SUMMARY.md
T
2026-03-04 15:32:30 +08:00

244 lines
6.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 管理员角色接口优化总结
## 概述
为了解决权限问题,创建了两个专门的接口用于获取医生和医助列表,替代原来的 `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
**状态:** ✅ 完成
**影响范围:** 诊单管理、挂号预约