265 lines
6.1 KiB
Markdown
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` 的管理员
|
|
|
|
这样可以确保只查询出具有医生角色的管理员。
|