|
|
@@ -0,0 +1,196 @@
|
|
|
+# 操作日志权限配置方案
|
|
|
+
|
|
|
+## 概述
|
|
|
+为操作日志模块增加完整的权限控制配置,包括API权限配置和数据库权限初始化。
|
|
|
+
|
|
|
+## 1. 操作日志API权限配置
|
|
|
+
|
|
|
+### 1.1 当前状态分析
|
|
|
+- 位置:`src/server/api/operation-logs/index.ts`
|
|
|
+- 当前配置:仅使用基础CRUD路由,无权限控制
|
|
|
+- 需要增加:细粒度的权限控制配置
|
|
|
+
|
|
|
+### 1.2 权限配置更新
|
|
|
+需要在 `createCrudRoutes` 中添加 `permissions` 参数:
|
|
|
+
|
|
|
+```typescript
|
|
|
+const operationLogRoutes = createCrudRoutes({
|
|
|
+ entity: OperationLog,
|
|
|
+ createSchema: CreateOperationLogDto,
|
|
|
+ updateSchema: UpdateOperationLogDto,
|
|
|
+ getSchema: OperationLogSchema,
|
|
|
+ listSchema: OperationLogSchema,
|
|
|
+ searchFields: ['resourceType', 'action', 'endpoint', 'username', 'ipAddress'],
|
|
|
+ middleware: [authMiddleware, enhancedPermissionWithLog],
|
|
|
+ userTracking: {
|
|
|
+ createdByField: 'userId',
|
|
|
+ updatedByField: undefined
|
|
|
+ },
|
|
|
+ permissions: {
|
|
|
+ create: ['system:log:create'], // 创建操作日志
|
|
|
+ read: ['system:log:view:all'], // 查看所有操作日志
|
|
|
+ update: ['system:log:update'], // 更新操作日志
|
|
|
+ delete: ['system:log:delete'] // 删除操作日志
|
|
|
+ }
|
|
|
+});
|
|
|
+```
|
|
|
+
|
|
|
+## 2. 数据库权限配置
|
|
|
+
|
|
|
+### 2.1 新增操作日志权限
|
|
|
+需要在 `docs/crm-permission-init.sql` 中添加以下权限记录:
|
|
|
+
|
|
|
+```sql
|
|
|
+-- 操作日志管理权限
|
|
|
+INSERT INTO permission (code, name, type, module, action, description, sort_order, is_active, parent_id) VALUES
|
|
|
+('system:log:create', '创建操作日志', 'operation', 'system', 'log:create', '允许创建操作日志记录', 1010, 1, NULL),
|
|
|
+('system:log:update', '编辑操作日志', 'operation', 'system', 'log:update', '允许编辑操作日志信息', 1020, 1, NULL),
|
|
|
+('system:log:delete', '删除操作日志', 'operation', 'system', 'log:delete', '允许删除操作日志记录', 1030, 1, NULL),
|
|
|
+('system:log:view:own', '查看个人操作日志', 'data', 'system', 'log:view', '仅查看自己创建的操作日志', 1041, 1, NULL),
|
|
|
+('system:log:view:department', '查看部门操作日志', 'data', 'system', 'log:view', '查看所在部门操作日志', 1042, 1, NULL),
|
|
|
+('system:log:view:sub_department', '查看部门及下级操作日志', 'data', 'system', 'log:view', '查看所在部门及下级部门操作日志', 1043, 1, NULL),
|
|
|
+('system:log:view:all', '查看所有操作日志', 'data', 'system', 'log:view', '查看系统所有操作日志', 1044, 1, NULL);
|
|
|
+```
|
|
|
+
|
|
|
+### 2.2 为角色分配操作日志权限
|
|
|
+
|
|
|
+#### 超级管理员权限
|
|
|
+```sql
|
|
|
+-- 超级管理员拥有所有操作日志权限
|
|
|
+INSERT INTO role_permission (role_id, permission_id, data_scope_type, created_at)
|
|
|
+SELECT r.id, p.id, 'COMPANY', NOW()
|
|
|
+FROM role r, permission p
|
|
|
+WHERE r.name = '超级管理员' AND p.code LIKE 'system:log:%';
|
|
|
+```
|
|
|
+
|
|
|
+#### 系统管理员权限
|
|
|
+```sql
|
|
|
+-- 系统管理员拥有操作日志管理权限
|
|
|
+INSERT INTO role_permission (role_id, permission_id, data_scope_type, created_at)
|
|
|
+SELECT r.id, p.id, 'COMPANY', NOW()
|
|
|
+FROM role r, permission p
|
|
|
+WHERE r.name = '系统管理员' AND p.code LIKE 'system:log:%';
|
|
|
+```
|
|
|
+
|
|
|
+#### 部门经理权限
|
|
|
+```sql
|
|
|
+-- 部门经理查看部门及下级操作日志
|
|
|
+INSERT INTO role_permission (role_id, permission_id, data_scope_type, created_at)
|
|
|
+SELECT r.id, p.id, 'SUB_DEPARTMENT', NOW()
|
|
|
+FROM role r, permission p
|
|
|
+WHERE r.name = '部门经理'
|
|
|
+ AND p.code IN ('system:log:view:sub_department', 'system:log:view:department', 'system:log:view:own');
|
|
|
+```
|
|
|
+
|
|
|
+#### 销售经理权限
|
|
|
+```sql
|
|
|
+-- 销售经理查看部门操作日志
|
|
|
+INSERT INTO role_permission (role_id, permission_id, data_scope_type, created_at)
|
|
|
+SELECT r.id, p.id, 'SUB_DEPARTMENT', NOW()
|
|
|
+FROM role r, permission p
|
|
|
+WHERE r.name = '销售经理'
|
|
|
+ AND p.code IN ('system:log:view:sub_department', 'system:log:view:department', 'system:log:view:own');
|
|
|
+```
|
|
|
+
|
|
|
+#### 销售人员权限
|
|
|
+```sql
|
|
|
+-- 销售人员只查看个人操作日志
|
|
|
+INSERT INTO role_permission (role_id, permission_id, data_scope_type, created_at)
|
|
|
+SELECT r.id, p.id, 'PERSONAL', NOW()
|
|
|
+FROM role r, permission p
|
|
|
+WHERE r.name = '销售人员'
|
|
|
+ AND p.code IN ('system:log:view:own');
|
|
|
+```
|
|
|
+
|
|
|
+#### 访客权限
|
|
|
+```sql
|
|
|
+-- 访客只查看个人操作日志
|
|
|
+INSERT INTO role_permission (role_id, permission_id, data_scope_type, created_at)
|
|
|
+SELECT r.id, p.id, 'PERSONAL', NOW()
|
|
|
+FROM role r, permission p
|
|
|
+WHERE r.name = '访客'
|
|
|
+ AND p.code IN ('system:log:view:own');
|
|
|
+```
|
|
|
+
|
|
|
+## 3. 权限标识命名规范
|
|
|
+
|
|
|
+### 3.1 权限分类
|
|
|
+- **操作权限**:`system:log:create`, `system:log:update`, `system:log:delete`
|
|
|
+- **数据权限**:`system:log:view:own`, `system:log:view:department`, `system:log:view:sub_department`, `system:log:view:all`
|
|
|
+
|
|
|
+### 3.2 权限层级
|
|
|
+- **个人级**:仅查看自己创建的操作日志
|
|
|
+- **部门级**:查看所在部门创建的操作日志
|
|
|
+- **子部门级**:查看所在部门及下级部门创建的操作日志
|
|
|
+- **公司级**:查看所有操作日志
|
|
|
+
|
|
|
+## 4. 前端集成
|
|
|
+
|
|
|
+### 4.1 权限检查
|
|
|
+前端页面需要根据权限标识控制按钮显示:
|
|
|
+
|
|
|
+```typescript
|
|
|
+const { hasPermission } = usePermission();
|
|
|
+
|
|
|
+// 检查是否有查看操作日志权限
|
|
|
+const canViewLogs = hasPermission(['system:log:view:all', 'system:log:view:department', 'system:log:view:own']);
|
|
|
+
|
|
|
+// 检查是否有删除操作日志权限
|
|
|
+const canDeleteLogs = hasPermission(['system:log:delete']);
|
|
|
+```
|
|
|
+
|
|
|
+### 4.2 菜单权限
|
|
|
+在 `src/client/admin/menu.tsx` 中添加权限检查:
|
|
|
+
|
|
|
+```typescript
|
|
|
+{
|
|
|
+ key: '/admin/logs',
|
|
|
+ icon: <FileTextOutlined />,
|
|
|
+ label: '操作日志',
|
|
|
+ permissions: ['system:log:view:all', 'system:log:view:department', 'system:log:view:own']
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+## 5. 数据权限实现
|
|
|
+
|
|
|
+### 5.1 数据权限规则
|
|
|
+- **个人级**:`WHERE user_id = 当前用户ID`
|
|
|
+- **部门级**:`WHERE user_id IN (当前部门所有用户)`
|
|
|
+- **子部门级**:`WHERE user_id IN (当前部门及子部门所有用户)`
|
|
|
+- **公司级**:无额外过滤条件
|
|
|
+
|
|
|
+### 5.2 实现方式
|
|
|
+通过通用CRUD模块的权限系统自动处理数据权限过滤。
|
|
|
+
|
|
|
+## 6. 实施步骤
|
|
|
+
|
|
|
+### 步骤1:更新API路由
|
|
|
+1. 修改 `src/server/api/operation-logs/index.ts`
|
|
|
+2. 添加权限配置和中间件
|
|
|
+
|
|
|
+### 步骤2:更新权限初始化脚本
|
|
|
+1. 在 `docs/crm-permission-init.sql` 末尾添加操作日志权限
|
|
|
+2. 执行SQL脚本初始化权限数据
|
|
|
+
|
|
|
+### 步骤3:验证权限配置
|
|
|
+1. 测试不同角色的权限访问
|
|
|
+2. 验证数据权限过滤效果
|
|
|
+3. 验证前端权限检查功能
|
|
|
+
|
|
|
+## 7. 注意事项
|
|
|
+
|
|
|
+1. **向后兼容**:添加权限配置不会影响现有功能
|
|
|
+2. **权限缓存**:权限变更后需要重新登录生效
|
|
|
+3. **性能优化**:为常用查询字段添加数据库索引
|
|
|
+4. **日志记录**:所有权限检查失败的操作都会被记录
|
|
|
+
|
|
|
+## 8. 测试用例
|
|
|
+
|
|
|
+```sql
|
|
|
+-- 测试权限查询
|
|
|
+SELECT r.name, p.code, rp.data_scope_type
|
|
|
+FROM role r
|
|
|
+JOIN role_permission rp ON r.id = rp.role_id
|
|
|
+JOIN permission p ON p.id = rp.permission_id
|
|
|
+WHERE p.code LIKE 'system:log:%'
|
|
|
+ORDER BY r.name, p.code;
|