# 蚊子系统管理后台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 模块划分

> **重要**: 本文档中列出的225个权限点为PRD规划目标。当前验收基线为 **90 个 Canonical 权限码**，详见 [权限码映射表.md](./权限码映射表.md)。

| 序号 | 模块代码 | 模块名称 | 权限点数量(规划) |
|------|----------|----------|-------------------|
| 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 数据权限应用规则

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 活动全生命周期流程

```mermaid
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 奖励发放流程

```mermaid
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
```

**审批规则**（与业务流程.md保持一致）：
| 金额范围 | 审批流程 | 审批人 | 超时时间 |
|----------|----------|--------|----------|
| <1000 | 自动发放 | - | - |
| 1000-9999 | 风控审核 | 风控专员 | 24h |
| 10000-49999 | 风控→财务审批 | 风控专员→财务经理 | 24h+24h |
| ≥50000 | 风控→财务→总监 | 三级审批 | 24h+24h+48h |

---

### 8.3 风险处理流程

```mermaid
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 用户管理流程

```mermaid
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 通用审批流程

```mermaid
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）**
```sql
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）**
```sql
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）**
```sql
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）**
```sql
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）**
```sql
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）**
```sql
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）**
```sql
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）**
```sql
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）**
```sql
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）**
```sql
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 权限判断核心逻辑

> ⚠️ **技术建议**：数据权限过滤建议在数据库层实现（视图或行级安全策略），避免大数据量时应用层性能问题。

```sql
-- 数据权限视图示例（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';
```

```java
// 权限判断服务
@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 权限变更审计

```java
// 权限变更审计服务
@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 多角色优先级规则

```java
// 多角色权限合并策略
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 权限配置

```java
// 权限注解
@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 前端路由守卫

```typescript
// 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 前端权限组件

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

---

**文档结束**