新增功能

This commit is contained in:
Your Name
2026-03-04 15:32:30 +08:00
parent a07e844c47
commit ab77f5488d
2266 changed files with 177942 additions and 3444 deletions
+289
View File
@@ -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
**状态:** ✅ 完成