# 医生角色关系说明 ## 概述 医生和角色的关系通过中间表 `zyt_admin_role` 来管理。医生是具有 `role_id = 1` 角色的管理员。 ## 数据库表结构 ### 1. 管理员表 (zyt_admin) ```sql CREATE TABLE `zyt_admin` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID', `name` varchar(50) NOT NULL COMMENT '管理员名称', `account` varchar(50) NOT NULL COMMENT '管理员账号', `avatar` varchar(255) DEFAULT NULL COMMENT '头像', `mobile` varchar(20) DEFAULT NULL COMMENT '手机号', `email` varchar(100) DEFAULT NULL COMMENT '邮箱', `disable` tinyint(1) DEFAULT '0' COMMENT '是否禁用', `create_time` int(10) unsigned DEFAULT NULL COMMENT '创建时间', `update_time` int(10) unsigned DEFAULT NULL COMMENT '更新时间', `delete_time` int(10) unsigned DEFAULT NULL COMMENT '删除时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='管理员表'; ``` ### 2. 角色表 (zyt_admin_role) ```sql CREATE TABLE `zyt_admin_role` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID', `admin_id` int(11) NOT NULL COMMENT '管理员ID', `role_id` int(11) NOT NULL COMMENT '角色ID', PRIMARY KEY (`id`), UNIQUE KEY `uk_admin_role` (`admin_id`, `role_id`), KEY `idx_admin_id` (`admin_id`), KEY `idx_role_id` (`role_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='管理员角色中间表'; ``` ### 3. 角色表 (zyt_admin_role_info) ```sql CREATE TABLE `zyt_admin_role_info` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID', `name` varchar(50) NOT NULL COMMENT '角色名称', `remark` varchar(255) DEFAULT NULL COMMENT '备注', `create_time` int(10) unsigned DEFAULT NULL COMMENT '创建时间', `update_time` int(10) unsigned DEFAULT NULL COMMENT '更新时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='角色信息表'; ``` ## 角色 ID 说明 | role_id | 角色名称 | 说明 | |---------|---------|------| | 1 | 医生 | 医生角色 | | 2 | 管理员 | 系统管理员 | | ... | ... | 其他角色 | ## 查询医生的方式 ### 方式1:通过中间表查询(推荐) ```php // 获取所有医生的 admin_id $adminIds = AdminRole::where('role_id', 1)->column('admin_id'); // 查询医生信息 $doctors = Admin::whereIn('id', $adminIds) ->where('disable', 0) ->select(); ``` ### 方式2:通过 Admin 模型的 role_id 属性 ```php // Admin 模型中有 getRoleIdAttr 方法,会自动从中间表获取 role_id $admin = Admin::find(1); $roleIds = $admin->role_id; // 返回数组 [1, 2, ...] // 检查是否是医生 if (in_array(1, $roleIds)) { // 是医生 } ``` ## 后端实现 ### DoctorLogic.php ```php use app\common\model\auth\AdminRole; // 获取医生列表 $adminIds = AdminRole::where('role_id', 1)->column('admin_id'); $doctors = Admin::whereIn('id', $adminIds) ->where('disable', 0) ->select(); // 获取医生详情 $hasRole = AdminRole::where('admin_id', $doctorId) ->where('role_id', 1) ->exists(); if ($hasRole) { $doctor = Admin::find($doctorId); } ``` ## API 端点 ### 获取医生列表 **请求**: ``` GET /api/doctor/lists?page_no=1&page_size=10 ``` **流程**: 1. 从 `zyt_admin_role` 表查询所有 `role_id = 1` 的 `admin_id` 2. 从 `zyt_admin` 表查询这些 `admin_id` 的管理员信息 3. 过滤 `disable = 0` 的管理员 4. 返回医生列表 **响应**: ```json { "code": 1, "msg": "success", "data": { "lists": [ { "id": 2, "name": "张医生", "account": "doctor1", "avatar": "http://example.com/avatar.jpg", "mobile": "13800138000", "email": "doctor@example.com", "specialty": "医生", "title": "医生", "rating": "4.8" } ], "count": 1, "page_no": 1, "page_size": 10 } } ``` ### 获取医生详情 **请求**: ``` GET /api/doctor/detail?id=2 ``` **流程**: 1. 检查 `admin_id = 2` 是否在 `zyt_admin_role` 表中有 `role_id = 1` 的记录 2. 如果有,从 `zyt_admin` 表查询医生信息 3. 返回医生详情 ### 获取医生排班 **请求**: ``` GET /api/doctor/roster?doctor_id=2&date=2024-03-11 ``` **流程**: 1. 检查医生是否有医生角色 2. 从 `la_doctor_roster` 表查询排班信息 ## 添加医生的步骤 ### 1. 创建管理员 在后台管理系统中创建新的管理员: - 名称:张医生 - 账号:doctor1 - 头像:上传头像 - 手机:13800138000 - 邮箱:doctor@example.com ### 2. 分配医生角色 在后台管理系统中为该管理员分配医生角色(role_id = 1)。 系统会自动在 `zyt_admin_role` 表中插入一条记录: ```sql INSERT INTO zyt_admin_role (admin_id, role_id) VALUES (2, 1); ``` ### 3. 验证 调用 API 验证医生是否已添加: ``` GET /api/doctor/lists ``` ## 常见问题 ### Q: 如何查询某个管理员的所有角色? A: ```php $admin = Admin::find($adminId); $roleIds = $admin->role_id; // 返回数组 ``` ### Q: 如何检查某个管理员是否是医生? A: ```php $hasRole = AdminRole::where('admin_id', $adminId) ->where('role_id', 1) ->exists(); ``` ### Q: 如何为管理员添加医生角色? A: ```php AdminRole::create([ 'admin_id' => $adminId, 'role_id' => 1 ]); ``` ### Q: 如何移除管理员的医生角色? A: ```php AdminRole::where('admin_id', $adminId) ->where('role_id', 1) ->delete(); ``` ### Q: 医生列表为空? A: 检查以下几点: 1. 是否有管理员被分配了医生角色(role_id = 1) 2. 医生的 `disable` 字段是否为 0 3. 医生是否被软删除(`delete_time` 不为空) ## 相关文件 - 医生逻辑: `server/app/api/logic/DoctorLogic.php` - 医生控制器: `server/app/api/controller/DoctorController.php` - Admin 模型: `server/app/common/model/auth/Admin.php` - AdminRole 模型: `server/app/common/model/auth/AdminRole.php` ## 总结 医生是通过中间表 `zyt_admin_role` 与管理员关联的。查询医生时需要: 1. 从 `zyt_admin_role` 表查询 `role_id = 1` 的所有 `admin_id` 2. 从 `zyt_admin` 表查询这些 `admin_id` 的管理员信息 3. 过滤 `disable = 0` 的管理员 这样可以确保只查询出具有医生角色的管理员。