- V21迁移: 创建10张权限系统表(sys_role, sys_permission等) - 添加角色实体(SysRole)、Repository、Service - 添加权限系统Schema验证测试(21个测试用例) Phase 1数据库表创建完成,Phase 2开始实施
42 KiB
蚊子系统管理后台PRD v1.0
1. 文档信息
- 版本:v1.0
- 创建日期:2026-03-04
- 作者:AI Assistant
- 项目:蚊子系统(活动传播、邀请奖励与运营分析系统)
变更记录
| 版本 | 日期 | 变更内容 | 作者 |
|---|---|---|---|
| v1.0 | 2026-03-04 | 初始版本 | AI Assistant |
2. 项目概述
2.1 项目背景
蚊子系统是一个活动传播、邀请奖励与运营分析平台。当前管理后台的权限体系过于简单,仅有3个基础角色(admin、operator、viewer),无法满足生产环境中复杂的业务需求。
2.2 项目目标
设计一套生产级管理后台权限体系,实现:
- 完整的角色权限体系(15个专业角色)
- 权限细化到功能按钮级别(200+权限点)
- 业务场景完整闭环
- 数据权限控制(全部、部门、个人三级)
- 审批流程设计
2.3 项目范围
- 适用范围:管理后台(Admin Portal)
- 用户群体:内部运营人员、管理人员
3. 角色体系设计
3.1 角色总览
⚠️ 产品建议:15个角色可根据实际业务规模调整为10个核心角色,其他作为扩展角色。
| 层级 | 角色 | 角色代码 | 数据权限 | 核心角色 |
|---|---|---|---|---|
| 系统层 | 超级管理员 | super_admin | 全部 | ✅ |
| 系统层 | 系统管理员 | system_admin | 全部 | ✅ |
| 管理层 | 运营总监 | operation_director | 部门 | ✅ |
| 管理层 | 运营经理 | operation_manager | 部门 | ✅ |
| 执行层 | 运营专员 | operation_specialist | 个人 | ✅ |
| 管理层 | 市场总监 | marketing_director | 部门 | ⚠️ 扩展 |
| 管理层 | 市场经理 | marketing_manager | 部门 | ⚠️ 扩展 |
| 执行层 | 市场专员 | marketing_specialist | 个人 | ⚠️ 扩展 |
| 管理层 | 财务经理 | finance_manager | 部门 | ✅ |
| 执行层 | 财务专员 | finance_specialist | 个人 | ✅ |
| 管理层 | 风控经理 | risk_manager | 部门 | ✅ |
| 执行层 | 风控专员 | risk_specialist | personal | ✅ |
| 管理层 | 客服主管 | cs_manager | 部门 | ✅ |
| 执行层 | 客服专员 | cs_agent | personal | ✅ |
| 审计层 | 审计员 | auditor | 全部 | ✅ |
核心角色(10个):超级管理员、系统管理员、运营总监、运营经理、运营专员、财务经理、财务专员、风控经理、客服主管、审计员
扩展角色(5个):市场总监、市场经理、市场专员、风控专员、客服专员(可按需启用)
3.2 角色详细定义
3.2.1 超级管理员(super_admin)
- 角色代码:super_admin
- 职责:系统最高权限拥有者,负责系统初始化配置、紧急故障处理
- 典型用户:技术负责人、系统owner
- 数据权限:全部
- 特殊权限:可分配和撤销任何角色、可访问系统底层配置
- ⚠️ 安全限制:绕过审批需记录审计日志,紧急情况需事后报告
3.2.2 系统管理员(system_admin)
- 角色代码:system_admin
- 职责:负责系统日常运维、用户账号管理、系统参数配置
- 典型用户:运维工程师、IT支持人员
- 数据权限:全部
3.2.3 运营总监(operation_director)
- 角色代码:operation_director
- 职责:运营策略制定、活动整体规划、运营数据分析和汇报、部门团队管理
- 典型用户:运营负责人、运营总监
- 数据权限:部门
- 审批范围:运营团队提交的活动审批、运营预算审批
- 业务边界:与市场总监分工明确,运营侧重平台活动,市场侧重对外推广
3.2.4 运营经理(operation_manager)
- 角色代码:operation_manager
- 职责:活动策划和执行、活动效果跟踪、运营数据分析
- 典型用户:运营主管、活动策划负责人
- 数据权限:部门
3.2.5 运营专员(operation_specialist)
- 角色代码:operation_specialist
- 职责:活动创建和执行、活动日常运营、数据统计和汇报
- 典型用户:运营专员、活动执行人员
- 数据权限:个人
3.2.6 市场总监(marketing_director)
- 角色代码:marketing_director
- 职责:市场策略制定、营销活动规划、预算管理和审批、对外合作洽谈
- 典型用户:市场负责人、市场总监
- 数据权限:部门
- 审批范围:市场团队提交的营销活动审批、预算使用审批
- 业务边界:与运营总监分工明确,市场侧重推广获客,运营侧重平台活动
3.2.7 市场经理(marketing_manager)
- 角色代码:marketing_manager
- 职责:营销活动策划、活动推广执行、推广效果跟踪
- 典型用户:市场主管、营销策划负责人
- 数据权限:部门
3.2.8 市场专员(marketing_specialist)
- 角色代码:marketing_specialist
- 职责:营销活动创建、活动推广执行、推广数据分析
- 典型用户:市场专员、推广专员
- 数据权限:个人
3.2.9 财务经理(finance_manager)
- 角色代码:finance_manager
- 职责:奖励资金管理、财务报表审核、奖励发放审批
- 典型用户:财务负责人、会计主管
- 数据权限:部门
3.2.10 财务专员(finance_specialist)
- 角色代码:finance_specialist
- 职责:奖励发放执行、日常对账、财务报表制作
- 典型用户:会计、出纳
- 数据权限:个人
3.2.11 风控经理(risk_manager)
- 角色代码:risk_manager
- 职责:风控策略制定、风控规则配置、风险事件审核
- 典型用户:风控负责人、合规主管
- 数据权限:部门
3.2.12 风控专员(risk_specialist)
- 角色代码:risk_specialist
- 职责:风险事件监测、风险异常处理、风险数据分析
- 典型用户:风控专员、风险分析师
- 数据权限:个人
3.2.13 客服主管(cs_manager)
- 角色代码:cs_manager
- 职责:客服团队管理、客诉处理监督、用户权限审批、重大客诉处理
- 典型用户:客服负责人、客服主管
- 数据权限:部门
- 审批范围:用户冻结/解冻审批、用户权限变更审批、客诉处理方案审批
- 业务边界:客服专员负责日常咨询,主管负责审核和重大问题处理
3.2.14 客服专员(cs_agent)
- 角色代码:cs_agent
- 职责:用户咨询响应、问题处理和解答、用户反馈记录
- 典型用户:客服人员、用户支持专员
- 数据权限:个人
3.2.15 审计员(auditor)
- 角色代码:auditor
- 职责:系统操作审计、合规性检查、异常行为分析
- 典型用户:内审人员、合规专员
- 数据权限:全部
4. 权限体系设计
4.1 权限命名规范
采用四段式命名规范:模块.资源.操作.数据范围
示例:
- activity.list.view.all(查看所有活动列表)
- activity.create.submit(提交创建活动)
- reward.grant.execute(执行奖励发放)
4.2 模块划分
| 序号 | 模块代码 | 模块名称 | 权限点数量 |
|---|---|---|---|
| 1 | dashboard | 仪表盘 | 15 |
| 2 | activity | 活动管理 | 35 |
| 3 | user | 用户管理 | 30 |
| 4 | reward | 奖励管理 | 25 |
| 5 | risk | 风险管理 | 25 |
| 6 | approval | 审批中心 | 20 |
| 7 | audit | 审计日志 | 15 |
| 8 | notification | 通知管理 | 15 |
| 9 | system | 系统配置 | 25 |
| 10 | permission | 权限管理 | 20 |
| 合计 | - | - | 225 |
4.3 核心权限点清单
仪表盘模块(dashboard)
- dashboard.view.all(查看全部仪表盘)
- dashboard.view.department(查看部门仪表盘)
- dashboard.view.own(查看个人仪表盘)
- dashboard.export(导出仪表盘数据)
活动管理模块(activity)
- activity.list.view.all/department/own(查看活动列表)
- activity.detail.view(查看活动详情)
- activity.create.submit(提交创建活动)
- activity.create.approve(审批创建活动)
- activity.edit.submit/approve(编辑活动)
- activity.publish.execute(发布活动)
- activity.pause.execute(暂停活动)
- activity.resume.execute(恢复活动)
- activity.end.execute(结束活动)
- activity.delete.execute(删除活动)
- activity.export.execute(导出活动数据)
用户管理模块(user)
- user.list.view.all/department/own(查看用户列表)
- user.detail.view(查看用户详情)
- user.create.submit/approve(创建用户)
- user.freeze.execute(冻结用户)
- user.unfreeze.execute(解冻用户)
- user.authenticate.execute(实名认证)
- user.permission.assign(分配权限)
- user.role.assign(分配角色)
奖励管理模块(reward)
- reward.list.view(查看奖励列表)
- reward.apply.submit(提交奖励申请)
- reward.apply.approve(审批奖励申请)
- reward.grant.execute(发放奖励)
- reward.reconcile.execute(对账操作)
风险管理模块(risk)
- risk.list.view(查看风险列表)
- risk.rule.create/edit/delete(风控规则管理)
- risk.rule.enable/disable(启用/禁用规则)
- risk.block.execute(拦截风险操作)
审批中心模块(approval)
- approval.pending.view(查看待审批列表)
- approval.execute.approve(执行审批通过)
- approval.execute.reject(执行审批拒绝)
- approval.execute.transfer(转交审批)
审计日志模块(audit)
- audit.log.view(查看审计日志)
- audit.log.export(导出审计日志)
- audit.report.view(查看审计报告)
系统配置模块(system)
- system.config.view/edit(查看/编辑系统配置)
- system.cache.clear(清除缓存)
- system.api-key.create/delete(API密钥管理)
权限管理模块(permission)
- permission.role.view/create/edit/delete(角色管理)
- permission.user.assign(用户授权)
- permission.data.config(数据权限配置)
5. 权限矩阵(核心权限)
| 权限点 | 超级管理员 | 系统管理员 | 运营总监 | 运营经理 | 运营专员 | 市场总监 | 市场经理 | 财务经理 | 风控经理 | 客服主管 | 审计员 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| dashboard.view.all | ✅ | ✅ | ✅ | ❌ | ❌ | ✅ | ❌ | ✅ | ✅ | ❌ | ✅ |
| activity.list.view.all | ✅ | ✅ | ✅ | ❌ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | ✅ |
| activity.create.submit | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ |
| activity.create.approve | ✅ | ❌ | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ |
| activity.publish.execute | ✅ | ❌ | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ |
| user.list.view.all | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ |
| user.freeze.execute | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ❌ |
| user.unfreeze.execute | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | ❌ |
| reward.apply.approve | ✅ | ❌ | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ |
| reward.grant.execute | ✅ | ❌ | ✅ | ❌ | ❌ | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ |
| risk.rule.create | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ❌ | ❌ |
| risk.rule.edit | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ❌ | ❌ |
| approval.pending.view | ✅ | ❌ | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ |
| system.config.edit | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
| permission.role.create | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
6. 数据权限设计
6.1 数据权限级别
| 级别 | 代码 | 说明 |
|---|---|---|
| 全部 | ALL | 查看和操作所有数据 |
| 部门 | DEPARTMENT | 查看和操作本部门及下级部门数据 |
| 个人 | OWN | 查看和操作自己创建/负责的数据 |
6.2 角色数据权限映射
| 角色 | 数据权限 | 继承下级 |
|---|---|---|
| super_admin | ALL | - |
| system_admin | ALL | - |
| operation_director | DEPARTMENT | 是 |
| operation_manager | DEPARTMENT | 是 |
| operation_specialist | OWN | - |
| marketing_director | DEPARTMENT | 是 |
| marketing_manager | DEPARTMENT | 是 |
| marketing_specialist | OWN | - |
| finance_manager | DEPARTMENT | 是 |
| finance_specialist | OWN | - |
| risk_manager | DEPARTMENT | 是 |
| risk_specialist | OWN | - |
| cs_manager | DEPARTMENT | 是 |
| cs_agent | OWN | - |
| auditor | ALL | - |
6.3 数据权限应用规则
- 列表查询:系统自动根据数据权限过滤
- 详情查看:无权限时返回403
- 编辑/删除:按权限控制操作范围
- 导出:根据权限限制导出范围
- ⚠️ 敏感数据脱敏:无权限查看敏感字段时,自动脱敏显示
6.4 敏感数据脱敏规则
| 字段类型 | 脱敏前 | 脱敏后 | 适用场景 |
|---|---|---|---|
| 手机号 | 13812345678 | 138****5678 | 用户手机 |
| 身份证 | 110101199001011234 | 110101********1234 | 实名认证 |
| 银行卡 | 6222021234567890123 | 6222 **** **** 0123 | 奖励发放 |
| 邮箱 | user@example.com | u***r@example.com | 用户邮箱 |
6.5 权限变更审计规则
| 操作类型 | 审计内容 | 保留时间 |
|---|---|---|
| 权限分配 | 操作人、目标人、权限、原因 | 永久 |
| 权限撤销 | 操作人、目标人、权限、原因 | 永久 |
| 审批绕过 | 操作人、业务、原因、审批人 | 永久 |
| 角色变更 | 操作人、角色、变更内容 | 永久 |
| 数据导出 | 操作人、导出数据范围、原因 | 3年 |
7. 审批流程设计
7.1 审批场景
| 审批场景 | 触发条件 | 审批节点 | 超时时间 | 备注 |
|---|---|---|---|---|
| 活动创建 | 提交新活动 | 运营经理→运营总监 | 24h→48h | - |
| 活动编辑 | 修改进行中的活动 | 运营经理→运营总监 | 24h→48h | 重大变更需审批 |
| 活动删除 | 删除草稿/已结束活动 | 运营经理审批 | 24h | - |
| 奖励申请 | 申请奖励 | 风控审核→财务审批 | 24h→24h | - |
| 大额奖励 | 金额≥10000 | 风控→财务经理→总监 | 24h→24h→48h | - |
| 用户冻结 | 冻结用户 | 客服主管审批 | 24h | - |
| 用户解冻 | 解冻用户 | 客服主管→风控审批 | 24h→24h | 含申诉解冻 |
| 用户删除 | 删除用户 | 客服主管→运营总监 | 24h→48h | 不可恢复 |
| 敏感数据导出 | 导出全量用户/订单 | 部门负责人审批 | 24h | 需记录导出原因 |
| 风控规则 | 新增/修改规则 | 风控经理→运营总监 | 24h→48h | - |
| 系统配置 | 修改核心配置 | 系统管理员→超级管理员 | 24h→48h | - |
| 权限变更 | 分配/撤销重要权限 | 审批流配置 | 24h | 敏感权限需审批 |
| 角色变更 | 创建/修改/删除角色 | 超级管理员审批 | 48h | - |
7.2 审批流程类型
- 串行审批:按顺序逐级审批
- 并行审批:多个审批人同时审批,任一通过即可
- 会签审批:多个审批人同时审批,全部通过才可
7.3 审批超时机制
- 50%超时:提醒(站内信、邮件)
- 80%超时:再次提醒(站内信、邮件、短信)
- 100%超时:升级(自动转交)
8. 业务流程
8.1 活动全生命周期流程
flowchart TD
A[创建草稿] --> B{提交审批?}
B -->|是| C[提交审批]
B -->|否| D[保存草稿]
C --> E{审批结果}
E -->|通过| F[审批通过]
E -->|拒绝| G[审批拒绝]
F --> H{发布活动?}
H -->|是| I[发布活动]
I --> J[活动进行中]
H -->|否| K[待发布]
J --> L{异常?}
L -->|是| M[暂停活动]
L -->|否| N{手动暂停?}
N -->|是| M
N -->|否| O{手动结束?}
O -->|是| P[结束活动]
O -->|否| J
M --> Q{恢复活动?}
Q -->|是| J
Q -->|否| R[已暂停]
P --> S[活动归档]
G --> A
D --> A
状态说明:
| 状态 | 说明 | 可执行操作 |
|---|---|---|
| 草稿 | 活动创建未提交 | 编辑、删除、提交审批 |
| 待审批 | 等待审批 | 撤回 |
| 审批通过 | 审批已通过 | 发布 |
| 审批拒绝 | 审批被拒绝 | 编辑、重新提交 |
| 进行中 | 活动正在进行 | 暂停、结束 |
| 已暂停 | 活动已暂停 | 恢复 |
| 已结束 | 活动正常结束 | 归档 |
8.2 奖励发放流程
flowchart TD
A[提交奖励申请] --> B{金额判断}
B -->|<1000| C[直接发放]
B -->|1000-9999| D[风控审核]
B -->|≥10000| E[风控→财务审批]
D --> F{风控结果}
E --> F
F -->|通过| G[发放执行]
F -->|拒绝| H[拒绝申请]
G --> I[用户账户]
I --> J{对账结果}
J -->|成功| K[归档]
J -->|失败| G
审批规则:
| 金额范围 | 审批流程 | 审批人 |
|---|---|---|
| <1000 | 自动发放 | - |
| 1000-9999 | 风控审核 | 风控专员 |
| ≥10000 | 风控→财务审批 | 风控专员→财务经理 |
8.3 风险处理流程
flowchart TD
A[风险检测] --> B{是否异常?}
B -->|否| C[忽略]
B -->|是| D[标记风险]
D --> E{处理方式}
E -->|自动| F[自动拦截]
E -->|人工| G[人工审核]
F --> H[记录日志]
G --> I{审核结果}
I -->|确认| J[执行处理]
I -->|误报| C
J --> K[冻结/警告/限制]
K --> L[通知用户]
L --> M[复核]
M --> N[归档]
H --> M
8.4 用户管理流程
flowchart TD
A[用户注册] --> B{实名认证?}
B -->|否| C[待认证]
B -->|是| D[提交实名]
D --> E{认证结果}
E -->|通过| F[激活]
E -->|拒绝| G[认证失败]
F --> H[正常使用]
H --> I{异常检测}
I -->|正常| H
I -->|异常| J{异常类型}
J -->|轻微| K[警告]
J -->|严重| L[冻结]
K --> H
L --> M{申诉?}
M -->|是| N[申诉处理]
M -->|否| O[冻结状态]
N --> P{申诉结果}
P -->|通过| Q[解冻]
P -->|拒绝| O
Q --> H
8.5 通用审批流程
flowchart TD
A[提交申请] --> B[一级审批]
B --> C{审批结果}
C -->|通过| D{需要二级?}
C -->|拒绝| E[返回修改]
D -->|是| F[二级审批]
D -->|否| G[执行操作]
F --> H{审批结果}
H -->|通过| G
H -->|拒绝| E
G --> I[流程完成]
E --> J[修改申请]
J --> A
审批超时机制:
| 超时比例 | 动作 | 通知方式 |
|---|---|---|
| 50% | 提醒 | 站内信、邮件 |
| 80% | 再次提醒 | 站内信、邮件、短信 |
| 100% | 自动升级 | 自动转交上级 |
9. 功能清单(按钮级)
9.1 仪表盘模块
9.1.1 仪表盘首页
- 路径:
/dashboard - 权限要求:
dashboard.view.*
| 操作按钮 | 权限要求 | 数据范围 | 说明 |
|---|---|---|---|
| 查看全部仪表盘 | dashboard.view.all | ALL | 仅超级管理员/系统管理员/总监可见 |
| 查看部门仪表盘 | dashboard.view.department | DEPARTMENT | 经理及以上可见 |
| 查看个人仪表盘 | dashboard.view.own | OWN | 所有人可见 |
| 刷新数据 | dashboard.view.own | - | 刷新当前数据 |
| 导出报表 | dashboard.export | 根据角色 | 导出Excel/CSV |
| 配置仪表盘 | dashboard.config | - | 自定义面板 |
9.1.2 实时监控
- 路径:
/dashboard/monitor - 权限要求:
dashboard.monitor.view
| 操作按钮 | 权限要求 | 说明 |
|---|---|---|
| 查看实时数据 | dashboard.chart.realtime | 实时刷新 |
| 查看历史趋势 | dashboard.chart.history | 历史曲线 |
| 查看KPI指标 | dashboard.kpi.view | 关键指标展示 |
| 配置告警阈值 | dashboard.kpi.config | 设置阈值 |
9.2 活动管理模块
9.2.1 活动列表页
- 路径:
/activities - 权限要求:
activity.list.view.*
| 操作按钮 | 权限要求 | 数据范围 | 业务规则 |
|---|---|---|---|
| 新建活动 | activity.create.submit | - | 跳转创建页面 |
| 导出数据 | activity.export.execute | 根据角色 | 导出Excel |
| 查看详情 | activity.detail.view | 根据角色 | 跳转详情页 |
| 编辑 | activity.edit.submit | 根据角色 | 草稿/暂停状态可编辑 |
| 删除 | activity.delete.execute | 根据角色 | 仅草稿状态可删除 |
| 发布 | activity.publish.execute | 根据角色 | 审批通过后可发布 |
| 暂停 | activity.pause.execute | 根据角色 | 进行中可暂停 |
| 恢复 | activity.resume.execute | 根据角色 | 已暂停可恢复 |
| 结束 | activity.end.execute | 根据角色 | 进行中可结束 |
| 复制 | activity.clone.execute | 根据角色 | 复制为草稿 |
9.2.2 活动创建/编辑页
- 路径:
/activities/create,/activities/:id/edit - 权限要求:
activity.create.submit,activity.edit.submit
| 操作按钮 | 权限要求 | 业务规则 |
|---|---|---|
| 保存草稿 | activity.create.submit | 保存为草稿状态 |
| 提交审批 | activity.create.submit | 提交后进入审批流程 |
| 取消 | - | 返回列表页 |
| 上一步/下一步 | - | 步骤导航 |
| 选择模板 | activity.template.view | 选择活动模板 |
| 配置活动规则 | activity.config.edit | 设置活动规则 |
| 设置奖励 | reward.apply.submit | 配置奖励规则 |
9.2.3 活动详情页
- 路径:
/activities/:id - 权限要求:
activity.detail.view
| 操作按钮 | 权限要求 | 数据范围 | 业务规则 |
|---|---|---|---|
| 编辑 | activity.edit.submit | 根据角色 | 根据状态判断 |
| 删除 | activity.delete.execute | 根据角色 | 仅草稿可删除 |
| 发布 | activity.publish.execute | 根据角色 | 审批通过后可发布 |
| 暂停/恢复 | activity.pause/resume.execute | 根据角色 | 进行中/暂停状态 |
| 结束 | activity.end.execute | 根据角色 | 进行中可结束 |
| 查看统计 | activity.detail.statistics | 根据角色 | 数据统计 |
| 导出数据 | activity.export.execute | 根据角色 | 导出参与数据 |
| 查看参与者 | activity.participant.view | 根据角色 | 参与用户列表 |
| 生成海报 | activity.poster.generate | - | 生成推广海报 |
9.3 用户管理模块
9.3.1 用户列表页
- 路径:
/users - 权限要求:
user.list.view.*
| 操作按钮 | 权限要求 | 数据范围 | 业务规则 |
|---|---|---|---|
| 新建用户 | user.create.submit | - | 跳转创建页面 |
| 导出数据 | user.detail.export | 根据角色 | 导出用户信息 |
| 查看详情 | user.detail.view | 根据角色 | 跳转详情页 |
| 编辑 | user.edit.submit | 根据角色 | 修改用户信息 |
| 冻结 | user.freeze.execute | 根据角色 | 冻结用户账号 |
| 解冻 | user.unfreeze.execute | 根据角色 | 解冻用户账号 |
| 实名认证 | user.authenticate.execute | 根据角色 | 审核实名认证 |
| 分配权限 | user.permission.assign | - | 分配功能权限 |
| 分配角色 | user.role.assign | - | 分配用户角色 |
| 添加标签 | user.tag.add | - | 给用户打标签 |
9.3.2 用户详情页
- 路径:
/users/:id - 权限要求:
user.detail.view
| 操作按钮 | 权限要求 | 业务规则 |
|---|---|---|
| 编辑 | user.edit.submit | 修改基本信息 |
| 冻结 | user.freeze.execute | 冻结账号 |
| 解冻 | user.unfreeze.execute | 解冻账号 |
| 查看邀请关系 | user.invite.view | 查看邀请树 |
| 查看积分 | user.points.view | 查看积分记录 |
| 查看奖励 | user.reward.view | 查看奖励记录 |
| 查看投诉 | user.complaint.view | 查看投诉记录 |
| 加入白名单 | user.whitelist.add | 添加到白名单 |
| 加入黑名单 | user.blacklist.add | 添加到黑名单 |
| 调整积分 | user.points.adjust | 手动调整积分 |
9.4 奖励管理模块
9.4.1 奖励列表页
- 路径:
/rewards - 权限要求:
reward.list.view.*
| 操作按钮 | 权限要求 | 数据范围 | 业务规则 |
|---|---|---|---|
| 申请奖励 | reward.apply.submit | - | 跳转申请页面 |
| 导出数据 | reward.export.execute | 根据角色 | 导出Excel |
| 查看详情 | reward.detail.view | 根据角色 | 查看详细信息 |
| 审批 | reward.apply.approve | 根据角色 | 审批奖励申请 |
| 发放 | reward.grant.execute | 根据角色 | 执行发放 |
| 取消发放 | reward.grant.cancel | 根据角色 | 取消待发放 |
| 对账 | reward.reconcile.execute | 根据角色 | 执行对账 |
9.4.2 奖励申请页
- 路径:
/rewards/apply - 权限要求:
reward.apply.submit
| 操作按钮 | 权限要求 | 业务规则 |
|---|---|---|
| 提交申请 | reward.apply.submit | 提交后进入审批流 |
| 保存草稿 | reward.apply.submit | 保存为草稿 |
| 取消 | - | 返回列表页 |
9.5 风险管理模块
9.5.1 风险列表页
- 路径:
/risks - 权限要求:
risk.list.view.*
| 操作按钮 | 权限要求 | 数据范围 | 业务规则 |
|---|---|---|---|
| 查看详情 | risk.detail.view | 根据角色 | 查看风险详情 |
| 处理告警 | risk.alert.handle | 根据角色 | 处理风险告警 |
| 配置告警 | risk.alert.config | - | 配置告警规则 |
| 执行检查 | risk.check.execute | - | 手动触发检查 |
| 拦截操作 | risk.block.execute | - | 拦截风险操作 |
| 解除拦截 | risk.block.release | - | 解除拦截 |
9.5.2 风控规则页
- 路径:
/risks/rules - 权限要求:
risk.rule.view
| 操作按钮 | 权限要求 | 业务规则 |
|---|---|---|
| 新建规则 | risk.rule.create | 创建风控规则 |
| 编辑 | risk.rule.edit | 修改规则 |
| 删除 | risk.rule.delete | 删除规则 |
| 启用 | risk.rule.enable | 启用规则 |
| 禁用 | risk.rule.disable | 禁用规则 |
| 导入规则 | risk.rule.create | 批量导入 |
| 导出规则 | risk.rule.view | 批量导出 |
9.6 审批中心模块
9.6.1 审批列表页
- 路径:
/approvals - 权限要求:
approval.pending.view
| 操作按钮 | 权限要求 | 业务规则 |
|---|---|---|
| 查看待审批 | approval.pending.view | 我的待办 |
| 查看已审批 | approval.my.approve | 我已审批 |
| 查看我提交的 | approval.my.submit | 我提交的申请 |
| 审批通过 | approval.execute.approve | 通过申请 |
| 审批拒绝 | approval.execute.reject | 拒绝申请 |
| 转交 | approval.execute.transfer | 转交他人 |
| 批量审批 | approval.batch.execute | 批量通过/拒绝 |
| 添加意见 | approval.comment.add | 添加审批意见 |
9.7 系统配置模块
9.7.1 系统配置页
- 路径:
/system/config - 权限要求:
system.config.view
| 操作按钮 | 权限要求 | 业务规则 |
|---|---|---|
| 查看配置 | system.config.view | 查看所有配置 |
| 编辑配置 | system.config.edit | 修改配置项 |
| 清除缓存 | system.cache.clear | 清理缓存 |
| 配置缓存 | system.cache.config | 缓存策略 |
9.7.2 API密钥管理
- 路径:
/system/api-keys - 权限要求:
system.api-key.create
| 操作按钮 | 权限要求 | 业务规则 |
|---|---|---|
| 创建密钥 | system.api-key.create | 新建API密钥 |
| 查看密钥 | system.api-key.view | 查看密钥详情 |
| 禁用密钥 | system.api-key.disable | 禁用密钥 |
| 启用密钥 | system.api-key.enable | 启用密钥 |
| 删除密钥 | system.api-key.delete | 删除密钥 |
9.8 权限管理模块
9.8.1 角色管理页
- 路径:
/permissions/roles - 权限要求:
permission.role.view
| 操作按钮 | 权限要求 | 业务规则 |
|---|---|---|
| 新建角色 | permission.role.create | 创建角色 |
| 编辑角色 | permission.role.edit | 修改角色 |
| 删除角色 | permission.role.delete | 删除角色 |
| 分配权限 | permission.role.assign | 配置角色权限 |
9.8.2 用户授权页
- 路径:
/permissions/users - 权限要求:
permission.user.view
| 操作按钮 | 权限要求 | 业务规则 |
|---|---|---|
| 查看权限 | permission.user.view | 查看用户权限 |
| 分配权限 | permission.user.assign | 分配功能权限 |
| 撤销权限 | permission.user.revoke | 撤销权限 |
| 分配角色 | permission.user.assign | 分配用户角色 |
| 配置数据权限 | permission.data.config | 设置数据范围 |
10. 实施建议
10.1 分阶段实施
| 阶段 | 时间 | 内容 |
|---|---|---|
| 第1阶段 | 2周 | 角色和权限基础框架 |
| 第2阶段 | 2周 | 数据权限实现 |
| 第3阶段 | 3周 | 审批流引擎 |
| 第4阶段 | 1周 | 测试和优化 |
10.2 数据库设计要点
10.2.1 核心表结构
1. 角色表(sys_role)
CREATE TABLE sys_role (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
role_code VARCHAR(50) NOT NULL UNIQUE COMMENT '角色代码',
role_name VARCHAR(100) NOT NULL COMMENT '角色名称',
role_level VARCHAR(20) NOT NULL COMMENT '角色层级:SYSTEM/MANAGER/EXECUTOR/AUDIT',
data_scope VARCHAR(20) NOT NULL COMMENT '数据权限:ALL/DEPARTMENT/OWN',
description VARCHAR(500) COMMENT '角色描述',
status VARCHAR(20) DEFAULT 'ENABLED' COMMENT '状态:ENABLED/DISABLED',
created_by BIGINT COMMENT '创建人',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
2. 权限表(sys_permission)
CREATE TABLE sys_permission (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
permission_code VARCHAR(100) NOT NULL UNIQUE COMMENT '权限代码',
permission_name VARCHAR(100) NOT NULL COMMENT '权限名称',
module_code VARCHAR(50) NOT NULL COMMENT '模块代码',
resource_code VARCHAR(50) COMMENT '资源代码',
operation_code VARCHAR(50) COMMENT '操作代码',
data_scope VARCHAR(20) COMMENT '数据范围:ALL/DEPARTMENT/OWN',
description VARCHAR(500) COMMENT '权限描述',
status VARCHAR(20) DEFAULT 'ENABLED' COMMENT '状态',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
3. 用户角色关联表(sys_user_role)
CREATE TABLE sys_user_role (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
user_id BIGINT NOT NULL COMMENT '用户ID',
role_id BIGINT NOT NULL COMMENT '角色ID',
department_id BIGINT COMMENT '部门ID',
created_by BIGINT COMMENT '分配人',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
UNIQUE KEY uk_user_role (user_id, role_id, department_id)
);
4. 角色权限关联表(sys_role_permission)
CREATE TABLE sys_role_permission (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
role_id BIGINT NOT NULL COMMENT '角色ID',
permission_id BIGINT NOT NULL COMMENT '权限ID',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
UNIQUE KEY uk_role_permission (role_id, permission_id)
);
5. 部门表(sys_department)
CREATE TABLE sys_department (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
dept_name VARCHAR(100) NOT NULL COMMENT '部门名称',
parent_id BIGINT COMMENT '父部门ID',
dept_code VARCHAR(50) COMMENT '部门编码',
leader_id BIGINT COMMENT '部门负责人',
sort_order INT DEFAULT 0 COMMENT '排序',
status VARCHAR(20) DEFAULT 'ENABLED' COMMENT '状态',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
6. 审批流程配置表(sys_approval_flow)
CREATE TABLE sys_approval_flow (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
flow_code VARCHAR(50) NOT NULL UNIQUE COMMENT '流程代码',
flow_name VARCHAR(100) NOT NULL COMMENT '流程名称',
trigger_event VARCHAR(100) NOT NULL COMMENT '触发事件',
conditions JSON COMMENT '触发条件',
nodes JSON NOT NULL COMMENT '审批节点配置',
timeout_hours INT DEFAULT 24 COMMENT '超时时间(小时)',
timeout_action VARCHAR(20) DEFAULT 'ESCALATE' COMMENT '超时动作',
status VARCHAR(20) DEFAULT 'ENABLED' COMMENT '状态',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
7. 审批记录表(sys_approval_record)
CREATE TABLE sys_approval_record (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
flow_id BIGINT NOT NULL COMMENT '流程配置ID',
biz_type VARCHAR(50) NOT NULL COMMENT '业务类型',
biz_id BIGINT NOT NULL COMMENT '业务ID',
current_node INT NOT NULL COMMENT '当前节点',
applicant_id BIGINT NOT NULL COMMENT '申请人',
status VARCHAR(20) DEFAULT 'PENDING' COMMENT '状态',
current_approver_id BIGINT COMMENT '当前审批人',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
8. 审批历史表(sys_approval_history)
CREATE TABLE sys_approval_history (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
record_id BIGINT NOT NULL COMMENT '审批记录ID',
node_index INT NOT NULL COMMENT '节点索引',
approver_id BIGINT NOT NULL COMMENT '审批人',
action VARCHAR(20) NOT NULL COMMENT '操作:APPROVE/REJECT/TRANSFER',
comment TEXT COMMENT '审批意见',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
9. 权限审计日志表(sys_permission_audit)
CREATE TABLE sys_permission_audit (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
operator_id BIGINT NOT NULL COMMENT '操作人ID',
operation_type VARCHAR(50) NOT NULL COMMENT '操作类型:ASSIGN/REVOKE/BYPASS',
target_type VARCHAR(20) NOT NULL COMMENT '目标类型:USER/ROLE/PERMISSION',
target_id BIGINT NOT NULL COMMENT '目标ID',
change_detail JSON COMMENT '变更详情',
ip_address VARCHAR(50) COMMENT 'IP地址',
reason VARCHAR(500) COMMENT '变更原因',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
10. 数据敏感字段配置表(sys_sensitive_field)
CREATE TABLE sys_sensitive_field (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
table_name VARCHAR(50) NOT NULL COMMENT '表名',
field_name VARCHAR(50) NOT NULL COMMENT '字段名',
field_type VARCHAR(20) NOT NULL COMMENT '字段类型:PHONE/ID_CARD/BANK_CARD/EMAIL',
mask_type VARCHAR(20) NOT NULL COMMENT '脱敏方式:MASK/HIDE/HASH',
mask_pattern VARCHAR(50) COMMENT '脱敏规则',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
10.2.2 权限判断核心逻辑
⚠️ 技术建议:数据权限过滤建议在数据库层实现(视图或行级安全策略),避免大数据量时应用层性能问题。
-- 数据权限视图示例(MySQL)
CREATE VIEW v_activity_with_scope AS
SELECT a.*,
CASE
WHEN u.data_scope = 'ALL' THEN 1
WHEN u.data_scope = 'DEPARTMENT' AND a.department_id IN (
SELECT d.id FROM sys_department d
WHERE d.id = u.department_id OR d.parent_id = u.department_id
) THEN 1
WHEN u.data_scope = 'OWN' AND a.created_by = u.id THEN 1
ELSE 0
END AS has_access
FROM activity a
JOIN user u ON a.created_by = u.id
WHERE u.data_scope != 'RESTRICTED';
// 权限判断服务
@Service
public class PermissionService {
@Autowired
private RolePermissionMapper rolePermissionMapper;
@Autowired
private RedisTemplate<String, Object> redisTemplate;
private static final String PERMISSION_CACHE_KEY = "user:permissions:";
private static final long CACHE_EXPIRE_MINUTES = 30;
/**
* 检查用户是否拥有指定权限(带缓存)
*/
public boolean hasPermission(Long userId, String permissionCode) {
// 1. 先从缓存获取
Set<String> permissions = getCachedPermissions(userId);
if (permissions != null) {
return permissions.contains(permissionCode);
}
// 2. 缓存未命中,从数据库查询
permissions = loadUserPermissions(userId);
// 3. 存入缓存
cachePermissions(userId, permissions);
return permissions.contains(permissionCode);
}
/**
* 权限变更时清除缓存
*/
public void clearPermissionCache(Long userId) {
redisTemplate.delete(PERMISSION_CACHE_KEY + userId);
}
/**
* 过滤数据范围(防止SQL注入)
*/
public <T> List<T> filterByDataScope(Long userId, List<T> dataList, DataScopeFilter filter) {
User user = getUser(userId);
DataScope scope = getUserDataScope(user);
switch (scope) {
case ALL:
return dataList;
case DEPARTMENT:
// 使用参数化查询,防止SQL注入
return filter.filterByDepartment(dataList, user.getDepartmentId());
case OWN:
return filter.filterByOwner(dataList, user.getId());
default:
return Collections.emptyList();
}
}
}
10.2.2.1 权限变更审计
// 权限变更审计服务
@Service
public class PermissionAuditService {
@Autowired
private AuditLogMapper auditLogMapper;
/**
* 记录权限变更审计日志
*/
public void logPermissionChange(PermissionChangeEvent event) {
AuditLog log = new AuditLog();
log.setOperatorId(event.getOperatorId());
log.setOperationType("PERMISSION_CHANGE");
log.setTargetType(event.getTargetType());
log.setTargetId(event.getTargetId());
log.setChangeDetail(JSON.toJSONString(event.getChanges()));
log.setIpAddress(event.getIpAddress());
log.setCreatedAt(new Date());
auditLogMapper.insert(log);
}
/**
* 记录绕过审批操作(超级管理员)
*/
public void logBypassApproval(BypassApprovalEvent event) {
AuditLog log = new AuditLog();
log.setOperatorId(event.getOperatorId());
log.setOperationType("APPROVAL_BYPASS");
log.setTargetType(event.getBizType());
log.setTargetId(event.getBizId());
log.setChangeDetail("原因: " + event.getReason());
log.setIpAddress(event.getIpAddress());
log.setCreatedAt(new Date());
auditLogMapper.insert(log);
}
}
10.2.2.2 多角色优先级规则
// 多角色权限合并策略
public enum MultiRoleStrategy {
// 权限并集:用户拥有任意一个角色有权限即可(默认)
UNION,
// 权限交集:用户必须拥有所有角色才有权限
INTERSECTION,
// 优先级:按角色优先级,取最高优先级角色的权限
PRIORITY
}
// 角色优先级配置
public enum RolePriority {
SUPER_ADMIN(100, "超级管理员"),
SYSTEM_ADMIN(90, "系统管理员"),
DIRECTOR(80, "总监"),
MANAGER(60, "经理"),
SPECIALIST(40, "专员"),
AUDITOR(20, "审计员");
private final int value;
private final String description;
RolePriority(int value, String description) {
this.value = value;
this.description = description;
}
}
10.2.3 Spring Boot 权限配置
// 权限注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface RequirePermission {
String value() default "";
DataScope dataScope() default DataScope.DEPARTMENT;
}
// 权限拦截器
@Component
public class PermissionInterceptor extends HandlerInterceptorAdapter {
@Autowired
private PermissionService permissionService;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
if (!(handler instanceof HandlerMethod)) {
return true;
}
HandlerMethod method = (HandlerMethod) handler;
RequirePermission annotation = method.getMethodAnnotation(RequirePermission.class);
if (annotation == null) {
return true;
}
Long userId = getCurrentUserId();
String permission = annotation.value();
if (!permissionService.hasPermission(userId, permission)) {
response.setStatus(HttpServletResponse.SC_FORBIDDEN);
return false;
}
return true;
}
}
10.2.4 Vue 前端路由守卫
// router/permission.ts
import { useUserStore } from '@/stores/user'
export const setupPermissionGuard = (router: Router) => {
router.beforeEach(async (to, from, next) => {
const userStore = useUserStore()
// 检查页面权限
if (to.meta.permission) {
const hasPermission = userStore.hasPermission(to.meta.permission as string)
if (!hasPermission) {
next({ path: '/403' })
return
}
}
// 检查数据范围
if (to.meta.dataScope) {
const dataScope = to.meta.dataScope as string
userStore.setDataScope(dataScope)
}
next()
})
}
// 使用示例
const routes: RouteRecordRaw[] = [
{
path: '/activities',
component: ActivityListView,
meta: {
permission: 'activity.list.view',
dataScope: 'department'
}
}
]
10.2.5 前端权限组件
<!-- components/PermissionButton.vue -->
<template>
<el-tooltip v-if="!hasPermission" :content="disabledText" placement="top">
<span>
<slot></slot>
</span>
</el-tooltip>
<slot v-else></slot>
</template>
<script setup lang="ts">
import { computed } from 'vue'
import { useUserStore } from '@/stores/user'
const props = defineProps<{
permission: string
disabledText?: string
}>()
const userStore = useUserStore()
const hasPermission = computed(() => userStore.hasPermission(props.permission))
</script>
<!-- 使用示例 -->
<template>
<PermissionButton permission="activity.create.submit">
<el-button type="primary" @click="createActivity">新建活动</el-button>
</PermissionButton>
<PermissionButton permission="activity.delete.execute" disabled-text="仅草稿状态可删除">
<el-button type="danger" @click="deleteActivity">删除</el-button>
</PermissionButton>
</template>
12. 开发任务追踪
详见 开发任务追踪.md
13. 附录
术语表
| 术语 | 说明 |
|---|---|
| RBAC | 基于角色的访问控制 |
| 数据权限 | 控制用户可见数据的范围 |
| 功能权限 | 控制用户可操作的功能 |
| 审批流 | 业务流程中的审批环节 |
| 权限点 | 最细粒度的权限单元 |
文档结束