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

192 lines
4.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 订单系统 - 权限控制实现
## 功能说明
订单列表现已实现权限控制:
-**主管**: 可以查看所有订单
-**普通员工**: 只能查看自己创建的订单
---
## 实现原理
### 权限检查方法
`OrderLists` 中添加了 `filterByPermission()` 方法,支持超管、主管和普通员工三个权限级别:
```php
/**
* @notes 权限过滤 - 普通员工只能看自己创建的订单
* @param array $where
* @return void
*/
private function filterByPermission(array &$where): void
{
// 检查是否是超管(root字段为1)
if (!empty($this->adminInfo['root']) && $this->adminInfo['root'] == 1) {
// 超管不过滤,可以看所有订单
return;
}
// 主管角色ID列表(可根据实际调整)
$supervisorRoles = [0, 3];
// 检查当前用户是否是主管
$roleIds = AdminRole::where('admin_id', $this->adminId)->column('role_id');
// 如果不是主管,只能看自己创建的订单
$isSupervisor = count(array_intersect($roleIds, $supervisorRoles)) > 0;
if (!$isSupervisor) {
$where[] = ['creator_id', '=', $this->adminId];
}
}
```
### 调用位置
`lists()``count()` 方法中都调用了权限检查:
```php
public function lists(): array
{
$where = $this->searchWhere;
// 权限控制:普通员工只能看自己创建的订单
$this->filterByPermission($where);
// ... 其他查询逻辑
}
public function count(): int
{
$where = $this->searchWhere;
// 权限控制:普通员工只能看自己创建的订单
$this->filterByPermission($where);
// ... 其他查询逻辑
}
```
---
## 角色配置
### 超管
- **标识**: root 字段 = 1
- **权限**: 查看所有订单(不过滤)
### 主管角色(支持多个)
- **角色ID**: 0, 3(可根据实际调整)
- **权限**: 查看所有订单
### 普通员工角色
- **角色ID**: 其他(如 2, 4 等)
- **权限**: 只能查看自己创建的订单
---
## 权限检查流程
1. **检查是否是超管** → 如果是,不过滤,返回所有订单
2. **检查是否是主管** → 如果是,不过滤,返回所有订单
3. **普通员工** → 过滤,只返回自己创建的订单
---
## 自定义配置
### 修改主管角色ID
如果你的系统中主管角色ID不同,需要修改 `filterByPermission()` 方法中的 `$supervisorRoles` 数组:
```php
// 修改这一行
$supervisorRoles = [0, 3]; // 主管角色ID列表
// 改为你的实际角色ID,例如:
$supervisorRoles = [2, 5]; // 你的主管角色ID列表
```
支持任意数量的主管角色,只需添加到数组中即可。
### 超管字段
超管通过 `adminInfo['root']` 字段判断,值为 1 表示超管。这个字段来自 Admin 模型的 root 属性。
---
## 数据库关系
### 角色关联表 (zyt_admin_role)
```
admin_id: 管理员ID
role_id: 角色ID
```
### 订单表 (la_order)
```
creator_id: 创建人ID(管理员ID
```
---
## 工作流程
### 普通员工查看订单列表
1. 发送请求获取订单列表
2. 系统检查当前用户角色
3. 如果不是主管,添加过滤条件 `creator_id = 当前用户ID`
4. 返回该员工创建的订单
### 主管查看订单列表
1. 发送请求获取订单列表
2. 系统检查当前用户角色
3. 如果是主管,不添加过滤条件
4. 返回所有订单
---
## 测试步骤
### 测试普通员工权限
1. 以普通员工账号登录
2. 访问订单列表
3. 验证只显示该员工创建的订单
### 测试主管权限
1. 以主管账号登录
2. 访问订单列表
3. 验证显示所有订单
---
## 相关文件
- `server/app/adminapi/lists/order/OrderLists.php` - 订单列表(权限控制实现)
- `server/app/common/model/auth/AdminRole.php` - 管理员角色关联模型
- `server/app/common/model/Order.php` - 订单模型
---
## 注意事项
1. **角色ID配置**: 确保主管角色ID与系统实际配置一致
2. **权限验证**: 权限检查在列表查询时进行,不影响其他操作
3. **性能考虑**: 权限检查使用简单的 WHERE 条件,性能影响最小
4. **安全性**: 权限检查在后端进行,前端无法绕过
---
## 版本信息
- **实现版本**: 1.3.0
- **实现日期**: 2026-03-10
- **功能类型**: 权限控制
- **状态**: ✅ 完成
---
**实现完成**