6.0 KiB
6.0 KiB
管理员角色接口优化总结
概述
为了解决权限问题,创建了两个专门的接口用于获取医生和医助列表,替代原来的 adminapi/auth.admin/lists 接口。
问题背景
原来的问题
- 医助列表:
adminapi/auth.admin/lists?role_id=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
查询逻辑
// 通过中间表查询
\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();
实现文件
后端文件
-
控制器:
server/app/adminapi/controller/tcm/DiagnosisController.phpgetAssistants()- 获取医助列表getDoctors()- 获取医生列表
-
逻辑层:
server/app/adminapi/logic/tcm/DiagnosisLogic.phpgetAssistants()- 医助查询逻辑getDoctors()- 医生查询逻辑
前端文件
-
API:
admin/src/api/tcm.tsgetAssistants()- 医助APIgetDoctors()- 医生API
-
组件:
admin/src/views/tcm/diagnosis/index.vue- 使用医助列表admin/src/views/tcm/diagnosis/appointment.vue- 使用医生列表
接口对比
医助列表
旧接口:
import { adminLists } from '@/api/perms/admin'
const assistants = await adminLists({
page_no: 1,
page_size: 1000,
role_id: 2
})
assistantOptions.value = assistants?.lists || []
新接口:
import { getAssistants } from '@/api/tcm'
const assistants = await getAssistants()
assistantOptions.value = assistants || []
医生列表
旧接口:
import { adminLists } from '@/api/perms/admin'
const doctors = await adminLists({
page_no: 1,
page_size: 1000,
role_id: 1
})
doctorList.value = doctors?.lists || []
新接口:
import { getDoctors } from '@/api/tcm'
const doctors = await getDoctors()
doctorList.value = doctors || []
优势对比
| 特性 | 旧接口 | 新接口 |
|---|---|---|
| 权限要求 | 需要管理员权限 | 无需额外权限 |
| 数据结构 | 分页数据 {lists, count} |
直接返回数组 |
| 查询方式 | 错误(直接查role_id) | 正确(通过中间表) |
| 返回字段 | 所有字段 | 精简字段 |
| 性能 | 较慢 | 较快 |
| 维护性 | 依赖权限系统 | 独立维护 |
测试清单
医助列表测试
- 诊单管理页面 - 筛选条件中的医助下拉框
- 诊单管理页面 - 指派医助弹窗
- 批量指派医助功能
- 单个指派医助功能
医生列表测试
- 挂号预约页面 - 医生选择下拉框
- 医生排班查询
- 预约挂号功能
功能测试
- 下拉框正常显示
- 可以正常筛选
- 可以正常指派/预约
- 没有权限错误
- 没有控制台错误
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;
添加测试数据
-- 添加测试医生
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- 医助接口测试指南
注意事项
- 中间表关联:必须通过
zyt_admin_role查询,不能直接查role_id - 角色ID:医生=1,医助=2
- 状态过滤:只返回
disable = 0的用户 - 字段精简:只返回 id、name、account
- 错误处理:捕获异常,返回空数组
- 日志记录:记录错误日志便于排查
迁移步骤
如果其他页面也使用了 adminLists 获取医生/医助列表,可以按以下步骤迁移:
- 导入新的 API:
import { getDoctors, getAssistants } from '@/api/tcm' - 移除旧的导入:
import { adminLists } from '@/api/perms/admin' - 替换调用:
adminLists({role_id: 1})→getDoctors() - 更新数据处理:
res?.lists || []→res || [] - 测试功能是否正常
成功标准
- ✅ 接口返回正确的数据
- ✅ 前端下拉框正常显示
- ✅ 没有权限错误
- ✅ 没有控制台错误
- ✅ 功能正常使用
创建日期: 2024-03-04 状态: ✅ 完成 影响范围: 诊单管理、挂号预约