244 lines
6.0 KiB
Markdown
244 lines
6.0 KiB
Markdown
# 管理员角色接口优化总结
|
||
|
||
## 概述
|
||
|
||
为了解决权限问题,创建了两个专门的接口用于获取医生和医助列表,替代原来的 `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
|
||
**状态:** ✅ 完成
|
||
**影响范围:** 诊单管理、挂号预约
|