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

5.9 KiB

医生角色集成完成总结

问题描述

医生和角色的关系是通过中间表 zyt_admin_role 来管理的,而不是直接在 zyt_admin 表中存储 role_id 字段。

解决方案

1. 更新后端逻辑 (DoctorLogic.php)

关键改动:

  • 导入 AdminRole 模型
  • 通过中间表查询医生:AdminRole::where('role_id', 1)->column('admin_id')
  • 使用 whereIn() 查询具有医生角色的管理员

核心代码:

use app\common\model\auth\AdminRole;

// 获取所有医生的 admin_id
$adminIds = AdminRole::where('role_id', 1)->column('admin_id');

// 查询医生信息
$doctors = Admin::whereIn('id', $adminIds)
    ->where('disable', 0)
    ->select();

2. 数据库关系

zyt_admin (管理员表)
    ↓ (通过 admin_id)
zyt_admin_role (中间表)
    ↓ (role_id = 1)
医生角色

3. 查询流程

API 请求: GET /api/doctor/lists
    ↓
DoctorLogic::getDoctorList()
    ↓
从 zyt_admin_role 查询 role_id = 1 的所有 admin_id
    ↓
从 zyt_admin 查询这些 admin_id 的管理员信息
    ↓
过滤 disable = 0 的管理员
    ↓
返回医生列表

文件更新

后端文件

  1. server/app/api/logic/DoctorLogic.php

    • 更新 getDoctorList() - 通过中间表查询医生列表
    • 更新 getDoctorDetail() - 检查医生角色
    • 更新 getDoctorRoster() - 检查医生角色
  2. server/app/api/controller/DoctorController.php

    • 无需修改(已正确实现)

文档文件

  1. server/DOCTOR_ROLE_RELATIONSHIP.md

    • 详细说明医生角色关系
    • 数据库表结构
    • 查询方式
    • 常见问题
  2. server/sql/add_test_doctors.sql

    • 添加测试医生数据
    • 分配医生角色
    • 添加排班数据

使用示例

1. 添加测试医生

执行 SQL 脚本:

mysql -u root -p database_name < server/sql/add_test_doctors.sql

2. 查询医生列表

curl "http://localhost:8000/api/doctor/lists?page_no=1&page_size=10"

响应:

{
  "code": 1,
  "msg": "success",
  "data": {
    "lists": [
      {
        "id": 2,
        "name": "张医生",
        "account": "doctor1",
        "avatar": "/uploads/avatar/doctor1.jpg",
        "mobile": "13800138000",
        "email": "doctor1@example.com",
        "specialty": "医生",
        "title": "医生",
        "rating": "4.8"
      }
    ],
    "count": 4,
    "page_no": 1,
    "page_size": 10
  }
}

3. 查询医生详情

curl "http://localhost:8000/api/doctor/detail?id=2"

4. 查询医生排班

curl "http://localhost:8000/api/doctor/roster?doctor_id=2&date=2024-03-11"

关键代码片段

获取医生列表

// 通过中间表查询医生
$adminIds = AdminRole::where('role_id', 1)->column('admin_id');

if (empty($adminIds)) {
    return ['lists' => [], 'count' => 0];
}

$doctors = Admin::whereIn('id', $adminIds)
    ->where('disable', 0)
    ->select();

检查医生角色

// 检查管理员是否有医生角色
$hasRole = AdminRole::where('admin_id', $doctorId)
    ->where('role_id', 1)
    ->exists();

if (!$hasRole) {
    return null; // 不是医生
}

前端集成

小程序前端无需修改,已正确集成:

  1. TUICallKit-Vue3/utils/api.js

    • 使用全局 $urlapiUrl
    • 医生 API 端点正确
  2. TUICallKit-Vue3/pages/index/index.vue

    • 自动加载医生列表
    • 展示医生卡片

测试步骤

1. 后端测试

# 运行测试脚本
php server/test_doctor_api.php

2. 前端测试

  1. 打开小程序首页
  2. 查看医生列表是否正确加载
  3. 点击医生卡片,检查跳转是否正常

3. 数据库验证

-- 查询所有医生
SELECT a.id, a.name, a.account, ar.role_id
FROM zyt_admin a
INNER JOIN zyt_admin_role ar ON a.id = ar.admin_id
WHERE ar.role_id = 1 AND a.disable = 0;

-- 查询医生排班
SELECT * FROM la_doctor_roster WHERE doctor_id IN (2, 3, 4, 5);

常见问题

Q: 医生列表为空?

A: 检查以下几点:

  1. 是否有管理员被分配了医生角色(role_id = 1)

    SELECT * FROM zyt_admin_role WHERE role_id = 1;
    
  2. 医生的 disable 字段是否为 0

    SELECT * FROM zyt_admin WHERE id IN (SELECT admin_id FROM zyt_admin_role WHERE role_id = 1);
    
  3. 医生是否被软删除

    SELECT * FROM zyt_admin WHERE delete_time IS NOT NULL;
    

Q: 如何添加新医生?

A:

  1. 在后台管理系统中创建新管理员
  2. 为该管理员分配医生角色(role_id = 1)
  3. 系统会自动在 zyt_admin_role 表中插入记录

Q: 如何移除医生角色?

A:

AdminRole::where('admin_id', $adminId)
    ->where('role_id', 1)
    ->delete();

Q: 如何查询某个管理员的所有角色?

A:

$admin = Admin::find($adminId);
$roleIds = $admin->role_id; // 返回数组

相关文件清单

后端文件

  • server/app/api/logic/DoctorLogic.php - 医生逻辑层(已更新)
  • server/app/api/controller/DoctorController.php - 医生控制器
  • server/app/common/model/auth/Admin.php - 管理员模型
  • server/app/common/model/auth/AdminRole.php - 角色中间表模型

文档文件

  • server/DOCTOR_ROLE_RELATIONSHIP.md - 医生角色关系说明
  • server/sql/add_test_doctors.sql - 测试数据 SQL
  • server/test_doctor_api.php - API 测试脚本

前端文件

  • TUICallKit-Vue3/utils/api.js - API 服务
  • TUICallKit-Vue3/pages/index/index.vue - 首页组件
  • TUICallKit-Vue3/utils/global.js - 全局工具

总结

已完成医生角色集成:

  1. 后端逻辑更新 - 通过中间表查询医生
  2. 数据库关系正确 - 使用 zyt_admin_role 中间表
  3. API 端点正确 - 医生列表、详情、排班
  4. 前端集成完成 - 小程序首页展示医生
  5. 文档完整 - 详细说明和测试数据

医生现在可以通过中间表正确查询和展示。