# 操作日志权限配置方案 ## 概述 为操作日志模块增加完整的权限控制配置,包括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: , 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;