5.9 KiB
5.9 KiB
医生角色集成完成总结
问题描述
医生和角色的关系是通过中间表 zyt_admin_role 来管理的,而不是直接在 zyt_admin 表中存储 role_id 字段。
解决方案
1. 更新后端逻辑 (DoctorLogic.php)
关键改动:
- 导入
AdminRole模型 - 通过中间表查询医生:
AdminRole::where('role_id', 1)->column('admin_id') - 使用
whereIn()查询具有医生角色的管理员
核心代码:
use app\common\model\auth\AdminRole;
// 获取所有医生的 admin_id
$adminIds = AdminRole::where('role_id', 1)->column('admin_id');
// 查询医生信息
$doctors = Admin::whereIn('id', $adminIds)
->where('disable', 0)
->select();
2. 数据库关系
zyt_admin (管理员表)
↓ (通过 admin_id)
zyt_admin_role (中间表)
↓ (role_id = 1)
医生角色
3. 查询流程
API 请求: GET /api/doctor/lists
↓
DoctorLogic::getDoctorList()
↓
从 zyt_admin_role 查询 role_id = 1 的所有 admin_id
↓
从 zyt_admin 查询这些 admin_id 的管理员信息
↓
过滤 disable = 0 的管理员
↓
返回医生列表
文件更新
后端文件
-
server/app/api/logic/DoctorLogic.php ✅
- 更新
getDoctorList()- 通过中间表查询医生列表 - 更新
getDoctorDetail()- 检查医生角色 - 更新
getDoctorRoster()- 检查医生角色
- 更新
-
server/app/api/controller/DoctorController.php ✅
- 无需修改(已正确实现)
文档文件
-
server/DOCTOR_ROLE_RELATIONSHIP.md ✅
- 详细说明医生角色关系
- 数据库表结构
- 查询方式
- 常见问题
-
server/sql/add_test_doctors.sql ✅
- 添加测试医生数据
- 分配医生角色
- 添加排班数据
使用示例
1. 添加测试医生
执行 SQL 脚本:
mysql -u root -p database_name < server/sql/add_test_doctors.sql
2. 查询医生列表
curl "http://localhost:8000/api/doctor/lists?page_no=1&page_size=10"
响应:
{
"code": 1,
"msg": "success",
"data": {
"lists": [
{
"id": 2,
"name": "张医生",
"account": "doctor1",
"avatar": "/uploads/avatar/doctor1.jpg",
"mobile": "13800138000",
"email": "doctor1@example.com",
"specialty": "医生",
"title": "医生",
"rating": "4.8"
}
],
"count": 4,
"page_no": 1,
"page_size": 10
}
}
3. 查询医生详情
curl "http://localhost:8000/api/doctor/detail?id=2"
4. 查询医生排班
curl "http://localhost:8000/api/doctor/roster?doctor_id=2&date=2024-03-11"
关键代码片段
获取医生列表
// 通过中间表查询医生
$adminIds = AdminRole::where('role_id', 1)->column('admin_id');
if (empty($adminIds)) {
return ['lists' => [], 'count' => 0];
}
$doctors = Admin::whereIn('id', $adminIds)
->where('disable', 0)
->select();
检查医生角色
// 检查管理员是否有医生角色
$hasRole = AdminRole::where('admin_id', $doctorId)
->where('role_id', 1)
->exists();
if (!$hasRole) {
return null; // 不是医生
}
前端集成
小程序前端无需修改,已正确集成:
-
TUICallKit-Vue3/utils/api.js ✅
- 使用全局
$url和apiUrl - 医生 API 端点正确
- 使用全局
-
TUICallKit-Vue3/pages/index/index.vue ✅
- 自动加载医生列表
- 展示医生卡片
测试步骤
1. 后端测试
# 运行测试脚本
php server/test_doctor_api.php
2. 前端测试
- 打开小程序首页
- 查看医生列表是否正确加载
- 点击医生卡片,检查跳转是否正常
3. 数据库验证
-- 查询所有医生
SELECT a.id, a.name, a.account, ar.role_id
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;
-- 查询医生排班
SELECT * FROM la_doctor_roster WHERE doctor_id IN (2, 3, 4, 5);
常见问题
Q: 医生列表为空?
A: 检查以下几点:
-
是否有管理员被分配了医生角色(role_id = 1)
SELECT * FROM zyt_admin_role WHERE role_id = 1; -
医生的
disable字段是否为 0SELECT * FROM zyt_admin WHERE id IN (SELECT admin_id FROM zyt_admin_role WHERE role_id = 1); -
医生是否被软删除
SELECT * FROM zyt_admin WHERE delete_time IS NOT NULL;
Q: 如何添加新医生?
A:
- 在后台管理系统中创建新管理员
- 为该管理员分配医生角色(role_id = 1)
- 系统会自动在
zyt_admin_role表中插入记录
Q: 如何移除医生角色?
A:
AdminRole::where('admin_id', $adminId)
->where('role_id', 1)
->delete();
Q: 如何查询某个管理员的所有角色?
A:
$admin = Admin::find($adminId);
$roleIds = $admin->role_id; // 返回数组
相关文件清单
后端文件
server/app/api/logic/DoctorLogic.php- 医生逻辑层(已更新)server/app/api/controller/DoctorController.php- 医生控制器server/app/common/model/auth/Admin.php- 管理员模型server/app/common/model/auth/AdminRole.php- 角色中间表模型
文档文件
server/DOCTOR_ROLE_RELATIONSHIP.md- 医生角色关系说明server/sql/add_test_doctors.sql- 测试数据 SQLserver/test_doctor_api.php- API 测试脚本
前端文件
TUICallKit-Vue3/utils/api.js- API 服务TUICallKit-Vue3/pages/index/index.vue- 首页组件TUICallKit-Vue3/utils/global.js- 全局工具
总结
✅ 已完成医生角色集成:
- ✅ 后端逻辑更新 - 通过中间表查询医生
- ✅ 数据库关系正确 - 使用
zyt_admin_role中间表 - ✅ API 端点正确 - 医生列表、详情、排班
- ✅ 前端集成完成 - 小程序首页展示医生
- ✅ 文档完整 - 详细说明和测试数据
医生现在可以通过中间表正确查询和展示。