192 lines
4.3 KiB
Markdown
192 lines
4.3 KiB
Markdown
# 订单系统 - 权限控制实现
|
||
|
||
## 功能说明
|
||
|
||
订单列表现已实现权限控制:
|
||
- ✅ **主管**: 可以查看所有订单
|
||
- ✅ **普通员工**: 只能查看自己创建的订单
|
||
|
||
---
|
||
|
||
## 实现原理
|
||
|
||
### 权限检查方法
|
||
|
||
在 `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
|
||
- **功能类型**: 权限控制
|
||
- **状态**: ✅ 完成
|
||
|
||
---
|
||
|
||
**实现完成** ✅
|