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

290 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?role_id=1` 接口,该接口需要管理员权限,可能导致权限不足的问题。
## 解决方案
创建一个专门的接口 `adminapi/tcm.diagnosis/getDoctors` 用于获取医生列表,不需要额外的权限验证。
## 实现细节
### 1. 后端实现
#### 控制器方法
**文件:** `server/app/adminapi/controller/tcm/DiagnosisController.php`
```php
/**
* @notes 获取医生列表
* @return \think\response\Json
*/
public function getDoctors()
{
$result = DiagnosisLogic::getDoctors();
return $this->data($result);
}
```
#### 逻辑层方法
**文件:** `server/app/adminapi/logic/tcm/DiagnosisLogic.php`
```php
/**
* @notes 获取医生列表
* @return array
*/
public static function getDoctors()
{
try {
// 通过中间表查询角色ID为1的管理员(医生)
$doctors = \app\common\model\auth\Admin::alias('a')
->join('admin_role ar', 'a.id = ar.admin_id')
->where('ar.role_id', 1)
->where('a.disable', 0)
->field(['a.id', 'a.name', 'a.account'])
->order('a.id', 'asc')
->select()
->toArray();
return $doctors;
} catch (\Exception $e) {
\think\facade\Log::error('获取医生列表失败: ' . $e->getMessage());
return [];
}
}
```
### 2. 前端实现
#### API 方法
**文件:** `admin/src/api/tcm.ts`
```typescript
// 获取医生列表
export function getDoctors() {
return request.get({ url: '/tcm.diagnosis/getDoctors' })
}
```
#### 组件更新
**文件:** `admin/src/views/tcm/diagnosis/appointment.vue`
```typescript
// 导入新的 API
import { getDoctors } from '@/api/tcm'
// 移除旧的导入
// import { adminLists } from '@/api/perms/admin'
// 更新加载医生列表的方法
const loadDoctors = async () => {
try {
loading.value = true
const res = await getDoctors()
doctorList.value = res || []
} catch (error) {
console.error('加载医生列表失败:', error)
feedback.msgError('加载医生列表失败')
} finally {
loading.value = false
}
}
```
## 数据库结构
### 表关系
```
zyt_admin (管理员表)
├─ id
├─ name
├─ account
└─ disable
zyt_admin_role (管理员角色关联表)
├─ admin_id → zyt_admin.id
└─ role_id → 1 (医生) / 2 (医助)
```
### SQL 查询
```sql
SELECT a.id, a.name, a.account
FROM zyt_admin a
INNER JOIN zyt_admin_role ar ON a.id = ar.admin_id
WHERE ar.role_id = 1
AND a.disable = 0
ORDER BY a.id ASC
```
## 接口说明
### 请求
```
GET /adminapi/tcm.diagnosis/getDoctors
```
### 响应
```json
{
"code": 1,
"msg": "success",
"data": [
{
"id": 1,
"name": "张医生",
"account": "doctor1"
},
{
"id": 2,
"name": "李医生",
"account": "doctor2"
}
]
}
```
### 返回字段说明
| 字段 | 类型 | 说明 |
|------|------|------|
| id | int | 医生ID |
| name | string | 医生姓名 |
| account | string | 医生账号 |
## 优势
1. **权限独立**:不依赖管理员列表接口的权限
2. **数据精简**:只返回必要的字段(id、name、account
3. **性能优化**:直接通过中间表查询医生角色
4. **易于维护**:专门的接口更容易理解和维护
5. **正确的关联**:使用中间表 `admin_role` 而不是直接查询 `role_id` 字段
## 查询条件
- 通过 `zyt_admin_role` 中间表关联
- `ar.role_id = 1`:只查询医生角色
- `a.disable = 0`:只查询启用状态的医生
-`a.id` 升序排列
## 测试
### 测试步骤
1. 登录管理后台
2. 访问诊单管理页面
3. 点击某条诊单的"挂号"按钮
4. 查看医生下拉列表是否正常显示
### 预期结果
- ✅ 医生列表正常加载
- ✅ 下拉框显示所有启用的医生
- ✅ 不会出现权限不足的错误
- ✅ 可以正常选择医生和预约
### 测试 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 * FROM zyt_admin_role WHERE role_id = 1;
```
## 已修改的文件
-`server/app/adminapi/controller/tcm/DiagnosisController.php`
-`server/app/adminapi/logic/tcm/DiagnosisLogic.php`
-`admin/src/api/tcm.ts`
-`admin/src/views/tcm/diagnosis/appointment.vue`
## 相关接口
### 医助列表接口
同时也创建了医助列表接口,使用相同的逻辑:
```
GET /adminapi/tcm.diagnosis/getAssistants
```
查询条件:`ar.role_id = 2`(医助角色)
## 注意事项
1. **中间表关联**:必须通过 `zyt_admin_role` 中间表查询,不能直接查询 `role_id` 字段
2. **角色ID**
- 医生:`role_id = 1`
- 医助:`role_id = 2`
3. **状态检查**:只返回 `disable = 0` 的用户
4. **字段精简**:只返回必要的字段,减少数据传输
5. **错误处理**:捕获异常并记录日志,返回空数组而不是抛出错误
## 数据库检查
### 检查医生数据
```sql
-- 查看所有医生
SELECT
a.id,
a.name,
a.account,
ar.role_id,
a.disable,
a.create_time
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;
```
### 添加测试医生
```sql
-- 1. 添加管理员
INSERT INTO zyt_admin (
name,
account,
password,
disable,
create_time,
update_time
) VALUES (
'测试医生',
'test_doctor',
'e10adc3949ba59abbe56e057f20f883e', -- 密码:123456
0,
UNIX_TIMESTAMP(),
UNIX_TIMESTAMP()
);
-- 2. 获取刚插入的ID
SET @admin_id = LAST_INSERT_ID();
-- 3. 添加角色关联
INSERT INTO zyt_admin_role (admin_id, role_id)
VALUES (@admin_id, 1);
```
---
**修复日期:** 2024-03-04
**状态:** ✅ 完成