更新
This commit is contained in:
@@ -0,0 +1,275 @@
|
||||
# 医生角色集成完成总结
|
||||
|
||||
## 问题描述
|
||||
|
||||
医生和角色的关系是通过中间表 `zyt_admin_role` 来管理的,而不是直接在 `zyt_admin` 表中存储 `role_id` 字段。
|
||||
|
||||
## 解决方案
|
||||
|
||||
### 1. 更新后端逻辑 (DoctorLogic.php)
|
||||
|
||||
**关键改动**:
|
||||
- 导入 `AdminRole` 模型
|
||||
- 通过中间表查询医生:`AdminRole::where('role_id', 1)->column('admin_id')`
|
||||
- 使用 `whereIn()` 查询具有医生角色的管理员
|
||||
|
||||
**核心代码**:
|
||||
```php
|
||||
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 脚本:
|
||||
```bash
|
||||
mysql -u root -p database_name < server/sql/add_test_doctors.sql
|
||||
```
|
||||
|
||||
### 2. 查询医生列表
|
||||
|
||||
```bash
|
||||
curl "http://localhost:8000/api/doctor/lists?page_no=1&page_size=10"
|
||||
```
|
||||
|
||||
**响应**:
|
||||
```json
|
||||
{
|
||||
"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. 查询医生详情
|
||||
|
||||
```bash
|
||||
curl "http://localhost:8000/api/doctor/detail?id=2"
|
||||
```
|
||||
|
||||
### 4. 查询医生排班
|
||||
|
||||
```bash
|
||||
curl "http://localhost:8000/api/doctor/roster?doctor_id=2&date=2024-03-11"
|
||||
```
|
||||
|
||||
## 关键代码片段
|
||||
|
||||
### 获取医生列表
|
||||
|
||||
```php
|
||||
// 通过中间表查询医生
|
||||
$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();
|
||||
```
|
||||
|
||||
### 检查医生角色
|
||||
|
||||
```php
|
||||
// 检查管理员是否有医生角色
|
||||
$hasRole = AdminRole::where('admin_id', $doctorId)
|
||||
->where('role_id', 1)
|
||||
->exists();
|
||||
|
||||
if (!$hasRole) {
|
||||
return null; // 不是医生
|
||||
}
|
||||
```
|
||||
|
||||
## 前端集成
|
||||
|
||||
小程序前端无需修改,已正确集成:
|
||||
|
||||
1. **TUICallKit-Vue3/utils/api.js** ✅
|
||||
- 使用全局 `$url` 和 `apiUrl`
|
||||
- 医生 API 端点正确
|
||||
|
||||
2. **TUICallKit-Vue3/pages/index/index.vue** ✅
|
||||
- 自动加载医生列表
|
||||
- 展示医生卡片
|
||||
|
||||
## 测试步骤
|
||||
|
||||
### 1. 后端测试
|
||||
|
||||
```bash
|
||||
# 运行测试脚本
|
||||
php server/test_doctor_api.php
|
||||
```
|
||||
|
||||
### 2. 前端测试
|
||||
|
||||
1. 打开小程序首页
|
||||
2. 查看医生列表是否正确加载
|
||||
3. 点击医生卡片,检查跳转是否正常
|
||||
|
||||
### 3. 数据库验证
|
||||
|
||||
```sql
|
||||
-- 查询所有医生
|
||||
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)
|
||||
```sql
|
||||
SELECT * FROM zyt_admin_role WHERE role_id = 1;
|
||||
```
|
||||
|
||||
2. 医生的 `disable` 字段是否为 0
|
||||
```sql
|
||||
SELECT * FROM zyt_admin WHERE id IN (SELECT admin_id FROM zyt_admin_role WHERE role_id = 1);
|
||||
```
|
||||
|
||||
3. 医生是否被软删除
|
||||
```sql
|
||||
SELECT * FROM zyt_admin WHERE delete_time IS NOT NULL;
|
||||
```
|
||||
|
||||
### Q: 如何添加新医生?
|
||||
|
||||
A:
|
||||
1. 在后台管理系统中创建新管理员
|
||||
2. 为该管理员分配医生角色(role_id = 1)
|
||||
3. 系统会自动在 `zyt_admin_role` 表中插入记录
|
||||
|
||||
### Q: 如何移除医生角色?
|
||||
|
||||
A:
|
||||
```php
|
||||
AdminRole::where('admin_id', $adminId)
|
||||
->where('role_id', 1)
|
||||
->delete();
|
||||
```
|
||||
|
||||
### Q: 如何查询某个管理员的所有角色?
|
||||
|
||||
A:
|
||||
```php
|
||||
$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. ✅ 文档完整 - 详细说明和测试数据
|
||||
|
||||
医生现在可以通过中间表正确查询和展示。
|
||||
Reference in New Issue
Block a user