6.1 KiB
6.1 KiB
医生角色关系说明
概述
医生和角色的关系通过中间表 zyt_admin_role 来管理。医生是具有 role_id = 1 角色的管理员。
数据库表结构
1. 管理员表 (zyt_admin)
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)
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)
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:通过中间表查询(推荐)
// 获取所有医生的 admin_id
$adminIds = AdminRole::where('role_id', 1)->column('admin_id');
// 查询医生信息
$doctors = Admin::whereIn('id', $adminIds)
->where('disable', 0)
->select();
方式2:通过 Admin 模型的 role_id 属性
// Admin 模型中有 getRoleIdAttr 方法,会自动从中间表获取 role_id
$admin = Admin::find(1);
$roleIds = $admin->role_id; // 返回数组 [1, 2, ...]
// 检查是否是医生
if (in_array(1, $roleIds)) {
// 是医生
}
后端实现
DoctorLogic.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
流程:
- 从
zyt_admin_role表查询所有role_id = 1的admin_id - 从
zyt_admin表查询这些admin_id的管理员信息 - 过滤
disable = 0的管理员 - 返回医生列表
响应:
{
"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
流程:
- 检查
admin_id = 2是否在zyt_admin_role表中有role_id = 1的记录 - 如果有,从
zyt_admin表查询医生信息 - 返回医生详情
获取医生排班
请求:
GET /api/doctor/roster?doctor_id=2&date=2024-03-11
流程:
- 检查医生是否有医生角色
- 从
la_doctor_roster表查询排班信息
添加医生的步骤
1. 创建管理员
在后台管理系统中创建新的管理员:
- 名称:张医生
- 账号:doctor1
- 头像:上传头像
- 手机:13800138000
- 邮箱:doctor@example.com
2. 分配医生角色
在后台管理系统中为该管理员分配医生角色(role_id = 1)。
系统会自动在 zyt_admin_role 表中插入一条记录:
INSERT INTO zyt_admin_role (admin_id, role_id) VALUES (2, 1);
3. 验证
调用 API 验证医生是否已添加:
GET /api/doctor/lists
常见问题
Q: 如何查询某个管理员的所有角色?
A:
$admin = Admin::find($adminId);
$roleIds = $admin->role_id; // 返回数组
Q: 如何检查某个管理员是否是医生?
A:
$hasRole = AdminRole::where('admin_id', $adminId)
->where('role_id', 1)
->exists();
Q: 如何为管理员添加医生角色?
A:
AdminRole::create([
'admin_id' => $adminId,
'role_id' => 1
]);
Q: 如何移除管理员的医生角色?
A:
AdminRole::where('admin_id', $adminId)
->where('role_id', 1)
->delete();
Q: 医生列表为空?
A: 检查以下几点:
- 是否有管理员被分配了医生角色(role_id = 1)
- 医生的
disable字段是否为 0 - 医生是否被软删除(
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 与管理员关联的。查询医生时需要:
- 从
zyt_admin_role表查询role_id = 1的所有admin_id - 从
zyt_admin表查询这些admin_id的管理员信息 - 过滤
disable = 0的管理员
这样可以确保只查询出具有医生角色的管理员。