Files
zyt/ADMIN_ROLE_API_SUMMARY.md
T
2026-03-04 15:32:30 +08:00

6.0 KiB
Raw Blame History

管理员角色接口优化总结

概述

为了解决权限问题,创建了两个专门的接口用于获取医生和医助列表,替代原来的 adminapi/auth.admin/lists 接口。

问题背景

原来的问题

  1. 医助列表adminapi/auth.admin/lists?role_id=2 - 权限不足
  2. 医生列表adminapi/auth.admin/lists?role_id=1 - 权限不足

根本原因

  • auth.admin/lists 接口需要管理员权限
  • 普通用户无法访问该接口
  • 数据库结构使用中间表 zyt_admin_role 关联角色,不是直接的 role_id 字段

解决方案

新增接口

接口 用途 角色ID
/tcm.diagnosis/getAssistants 获取医助列表 2
/tcm.diagnosis/getDoctors 获取医生列表 1

数据库结构

zyt_admin (管理员表)
  ├─ id
  ├─ name
  ├─ account
  └─ disable

zyt_admin_role (中间表)
  ├─ admin_id  → zyt_admin.id
  └─ role_id   → 角色ID

查询逻辑

// 通过中间表查询
\app\common\model\auth\Admin::alias('a')
    ->join('admin_role ar', 'a.id = ar.admin_id')
    ->where('ar.role_id', $roleId)  // 1=医生, 2=医助
    ->where('a.disable', 0)
    ->field(['a.id', 'a.name', 'a.account'])
    ->order('a.id', 'asc')
    ->select()
    ->toArray();

实现文件

后端文件

  1. 控制器server/app/adminapi/controller/tcm/DiagnosisController.php

    • getAssistants() - 获取医助列表
    • getDoctors() - 获取医生列表
  2. 逻辑层server/app/adminapi/logic/tcm/DiagnosisLogic.php

    • getAssistants() - 医助查询逻辑
    • getDoctors() - 医生查询逻辑

前端文件

  1. APIadmin/src/api/tcm.ts

    • getAssistants() - 医助API
    • getDoctors() - 医生API
  2. 组件

    • admin/src/views/tcm/diagnosis/index.vue - 使用医助列表
    • admin/src/views/tcm/diagnosis/appointment.vue - 使用医生列表

接口对比

医助列表

旧接口:

import { adminLists } from '@/api/perms/admin'

const assistants = await adminLists({ 
    page_no: 1, 
    page_size: 1000, 
    role_id: 2 
})
assistantOptions.value = assistants?.lists || []

新接口:

import { getAssistants } from '@/api/tcm'

const assistants = await getAssistants()
assistantOptions.value = assistants || []

医生列表

旧接口:

import { adminLists } from '@/api/perms/admin'

const doctors = await adminLists({ 
    page_no: 1, 
    page_size: 1000, 
    role_id: 1 
})
doctorList.value = doctors?.lists || []

新接口:

import { getDoctors } from '@/api/tcm'

const doctors = await getDoctors()
doctorList.value = doctors || []

优势对比

特性 旧接口 新接口
权限要求 需要管理员权限 无需额外权限
数据结构 分页数据 {lists, count} 直接返回数组
查询方式 错误(直接查role_id 正确(通过中间表)
返回字段 所有字段 精简字段
性能 较慢 较快
维护性 依赖权限系统 独立维护

测试清单

医助列表测试

  • 诊单管理页面 - 筛选条件中的医助下拉框
  • 诊单管理页面 - 指派医助弹窗
  • 批量指派医助功能
  • 单个指派医助功能

医生列表测试

  • 挂号预约页面 - 医生选择下拉框
  • 医生排班查询
  • 预约挂号功能

功能测试

  • 下拉框正常显示
  • 可以正常筛选
  • 可以正常指派/预约
  • 没有权限错误
  • 没有控制台错误

SQL 测试

检查数据

-- 检查医生
SELECT 
    a.id,
    a.name,
    a.account,
    ar.role_id,
    a.disable
FROM zyt_admin a
INNER JOIN zyt_admin_role ar ON a.id = ar.admin_id
WHERE ar.role_id = 1
ORDER BY a.id ASC;

-- 检查医助
SELECT 
    a.id,
    a.name,
    a.account,
    ar.role_id,
    a.disable
FROM zyt_admin a
INNER JOIN zyt_admin_role ar ON a.id = ar.admin_id
WHERE ar.role_id = 2
ORDER BY a.id ASC;

-- 检查中间表
SELECT * FROM zyt_admin_role ORDER BY admin_id, role_id;

添加测试数据

-- 添加测试医生
INSERT INTO zyt_admin (name, account, password, disable, create_time, update_time) 
VALUES ('测试医生', 'test_doctor', 'e10adc3949ba59abbe56e057f20f883e', 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP());
INSERT INTO zyt_admin_role (admin_id, role_id) VALUES (LAST_INSERT_ID(), 1);

-- 添加测试医助
INSERT INTO zyt_admin (name, account, password, disable, create_time, update_time) 
VALUES ('测试医助', 'test_assistant', 'e10adc3949ba59abbe56e057f20f883e', 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP());
INSERT INTO zyt_admin_role (admin_id, role_id) VALUES (LAST_INSERT_ID(), 2);

相关文档

  • ASSISTANT_API_FIX.md - 医助列表接口详细说明
  • DOCTOR_API_FIX.md - 医生列表接口详细说明
  • ASSISTANT_API_TEST.md - 医助接口测试指南

注意事项

  1. 中间表关联:必须通过 zyt_admin_role 查询,不能直接查 role_id
  2. 角色ID:医生=1,医助=2
  3. 状态过滤:只返回 disable = 0 的用户
  4. 字段精简:只返回 id、name、account
  5. 错误处理:捕获异常,返回空数组
  6. 日志记录:记录错误日志便于排查

迁移步骤

如果其他页面也使用了 adminLists 获取医生/医助列表,可以按以下步骤迁移:

  1. 导入新的 APIimport { getDoctors, getAssistants } from '@/api/tcm'
  2. 移除旧的导入:import { adminLists } from '@/api/perms/admin'
  3. 替换调用:adminLists({role_id: 1})getDoctors()
  4. 更新数据处理:res?.lists || []res || []
  5. 测试功能是否正常

成功标准

  • 接口返回正确的数据
  • 前端下拉框正常显示
  • 没有权限错误
  • 没有控制台错误
  • 功能正常使用

创建日期: 2024-03-04 状态: 完成 影响范围: 诊单管理、挂号预约