更新
This commit is contained in:
@@ -0,0 +1,264 @@
|
||||
# 医生角色关系说明
|
||||
|
||||
## 概述
|
||||
|
||||
医生和角色的关系通过中间表 `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` 的管理员
|
||||
|
||||
这样可以确保只查询出具有医生角色的管理员。
|
||||
Reference in New Issue
Block a user