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