新增功能
This commit is contained in:
@@ -0,0 +1,289 @@
|
||||
# 医生列表接口优化
|
||||
|
||||
## 问题描述
|
||||
|
||||
在挂号预约页面中,获取医生列表时调用了 `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
|
||||
**状态:** ✅ 完成
|
||||
Reference in New Issue
Block a user