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

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

流程:

  1. zyt_admin_role 表查询所有 role_id = 1admin_id
  2. zyt_admin 表查询这些 admin_id 的管理员信息
  3. 过滤 disable = 0 的管理员
  4. 返回医生列表

响应:

{
  "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 表中插入一条记录:

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: 检查以下几点:

  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 的管理员

这样可以确保只查询出具有医生角色的管理员。