Files
zyt/server/DOCTOR_ROLE_RELATIONSHIP.md
T
2026-03-11 14:33:49 +08:00

265 lines
6.1 KiB
Markdown

# 医生角色关系说明
## 概述
医生和角色的关系通过中间表 `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` 的管理员
这样可以确保只查询出具有医生角色的管理员。