Files
wenzi/docs/prd/管理后台PRD-v1.0.md
Your Name 18a586df49 feat(permission): 创建权限管理核心模块
- V21迁移: 创建10张权限系统表(sys_role, sys_permission等)
- 添加角色实体(SysRole)、Repository、Service
- 添加权限系统Schema验证测试(21个测试用例)

Phase 1数据库表创建完成,Phase 2开始实施
2026-03-04 21:51:50 +08:00

42 KiB
Raw Blame History

蚊子系统管理后台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 项目目标

设计一套生产级管理后台权限体系,实现:

  1. 完整的角色权限体系15个专业角色
  2. 权限细化到功能按钮级别200+权限点)
  3. 业务场景完整闭环
  4. 数据权限控制(全部、部门、个人三级)
  5. 审批流程设计

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/deleteAPI密钥管理

权限管理模块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 数据权限应用规则

  1. 列表查询:系统自动根据数据权限过滤
  2. 详情查看无权限时返回403
  3. 编辑/删除:按权限控制操作范围
  4. 导出:根据权限限制导出范围
  5. ⚠️ 敏感数据脱敏:无权限查看敏感字段时,自动脱敏显示

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 审批流程类型

  1. 串行审批:按顺序逐级审批
  2. 并行审批:多个审批人同时审批,任一通过即可
  3. 会签审批:多个审批人同时审批,全部通过才可

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 基于角色的访问控制
数据权限 控制用户可见数据的范围
功能权限 控制用户可操作的功能
审批流 业务流程中的审批环节
权限点 最细粒度的权限单元

文档结束