# 智能IT支持服务台 — 管理后台架构设计文档

> **文档版本**: v1.0
> **架构师**: 高见远 (Bob)
> **日期**: 2026-07-15
> **关联文档**: `docs/PRD-admin.md`、`docs/ARCHITECTURE.md`

---

## 目录

1. [实现方案与框架选型](#1-实现方案与框架选型)
2. [文件列表及相对路径](#2-文件列表及相对路径)
3. [数据模型](#3-数据模型)
4. [API 接口设计](#4-api-接口设计)
5. [程序调用流程](#5-程序调用流程)
6. [任务列表](#6-任务列表)
7. [依赖包列表](#7-依赖包列表)
8. [共享知识](#8-共享知识)
9. [待明确事项](#9-待明确事项)

---

## 1. 实现方案与框架选型

### 1.1 核心技术挑战

| # | 挑战 | 解决方案 |
|---|------|---------|
| C1 | 管理后台 RBAC 权限校验 | 复用坐席端 Redis token 机制，新增 `require_admin` 依赖函数，校验 `Agent.role == 'admin'` |
| C2 | 配置变更历史追踪 | 新建 `config_change_logs` 表，每次 PUT 配置时记录 `{key, old, new, who, when}` |
| C3 | 快速回复审核状态机 | `QuickReplyTemplate` 新增 `status`/`version`/`submitted_by` 字段，状态流转: `draft→pending_review→approved/rejected` |
| C4 | 坐席端快速回复可见性逻辑 | 坐席端 `GET /api/quick-replies` 增加状态筛选: 返回 `approved` + 自己的 `pending_review` |
| C5 | 深色科技风 UI 主题 | 全局 CSS 变量覆盖 Element Plus 默认样式，使用 Tailwind CSS 辅助布局 |
| C6 | 前端项目隔离 | 新建 `frontend-admin/` 独立项目，部署路径 `/itadmin/`，与坐席端 `/itagent/` 并列 |

### 1.2 技术栈确认

#### 前端（新建 `frontend-admin/`）

| 项目 | 版本 | 用途 |
|------|------|------|
| Vue 3 | ^3.4.0 | UI 框架，Composition API |
| TypeScript | ^5.5.0 | 类型安全 |
| Vite | ^5.3.0 | 构建工具 |
| Element Plus | ^2.7.0 | UI 组件库 |
| Pinia | ^2.1.0 | 状态管理 |
| Tailwind CSS | ^3.4.0 | 工具类样式 |
| Vue Router | ^4.3.0 | 路由管理 |
| Axios | ^1.7.0 | HTTP 客户端 |
| @element-plus/icons-vue | ^2.3.0 | 图标库 |

#### 后端（扩展现有 FastAPI）

| 项目 | 版本 | 用途 |
|------|------|------|
| FastAPI | 现有 | Web 框架 |
| SQLAlchemy 2.0 | 现有 | ORM（async） |
| Pydantic | 现有 | 数据校验 |
| Alembic | 现有 | 数据库迁移 |

### 1.3 架构模式

- **前端**: SPA + 侧边栏导航布局，Pinia 状态管理，Axios 统一拦截
- **后端**: 增量式扩展，新建 `admin.py` 路由模块 + `admin_service.py` 服务层
- **认证**: 复用坐席端 Redis token，新增 admin 角色校验中间件

---

## 2. 文件列表及相对路径

### 2.1 前端（`frontend-admin/`，新建项目）

```
frontend-admin/
├── index.html                              # HTML 入口
├── package.json                             # 依赖声明
├── tsconfig.json                            # TypeScript 配置
├── tsconfig.node.json                       # Node 端 TS 配置
├── vite.config.ts                           # Vite 配置（base: /itadmin/）
├── tailwind.config.js                       # Tailwind CSS 配置
├── postcss.config.js                        # PostCSS 配置
├── env.d.ts                                 # 环境类型声明
├── src/
│   ├── main.ts                              # Vue 应用入口
│   ├── App.vue                              # 根组件
│   ├── api/
│   │   └── index.ts                         # Axios 实例 + 拦截器（admin_token）
│   ├── api/
│   │   ├── admin.ts                         # 管理后台 API 调用函数
│   ├── router/
│   │   └── index.ts                         # 路由配置（含 admin 守卫）
│   ├── stores/
│   │   ├── admin.ts                         # 管理员状态 Store（登录/权限）
│   │   ├── config.ts                        # 配置项 Store
│   │   ├── agent.ts                         # 坐席管理 Store
│   │   └── quickReply.ts                    # 快速回复管理 Store
│   ├── layouts/
│   │   └── AdminLayout.vue                  # 管理后台布局（侧边栏+面包屑+内容区）
│   ├── views/
│   │   ├── Login.vue                        # 管理员登录页
│   │   ├── Dashboard.vue                    # 运营总览仪表盘
│   │   ├── Configs.vue                       # 功能开关/参数管理
│   │   ├── Agents.vue                        # 坐席人员管理
│   │   ├── Integrations.vue                  # 外部系统集成配置
│   │   ├── QuickReplies.vue                  # 快速回复管理
│   │   ├── AssignmentMode.vue                # 消息分配模式（占位）
│   │   ├── Monitor.vue                       # 会话监控（Demo预览）
│   │   ├── Flowcharts.vue                    # 排查流程图（占位）
│   │   └── Placeholder.vue                   # 通用占位页模板
│   ├── components/
│   │   ├── Sidebar.vue                      # 侧边栏导航组件
│   │   ├── Breadcrumb.vue                   # 面包屑导航组件
│   │   ├── StatCard.vue                     # 统计卡片组件
│   │   ├── ConfigGroup.vue                  # 配置分组卡片组件
│   │   ├── AgentTable.vue                   # 坐席列表表格组件
│   │   ├── IntegrationCard.vue              # 集成系统卡片组件
│   │   ├── QuickReplyCard.vue               # 快速回复卡片组件
│   │   └── SearchBox.vue                    # 全局搜索组件
│   ├── types/
│   │   └── index.ts                         # TypeScript 类型定义
│   └── styles/
│       └── global.css                       # 深色科技风全局样式 + CSS 变量
```

### 2.2 后端（扩展现有 `backend/`）

```
backend/
├── app/
│   ├── models/
│   │   ├── agent.py                         # 修改：新增 role, skill_tags 字段
│   │   ├── quick_reply_template.py          # 修改：新增 status, version, submitted_by 字段
│   │   ├── config_change_log.py             # 新增：配置变更日志模型
│   │   └── __init__.py                      # 修改：导入新模型
│   ├── schemas/
│   │   ├── agent.py                         # 修改：新增 role, skill_tags 字段到响应
│   │   ├── quick_reply.py                   # 修改：新增 status, version, submitted_by
│   │   └── admin.py                         # 新增：管理后台专用 Schema
│   ├── api/
│   │   ├── admin.py                         # 新增：管理后台路由
│   │   ├── router.py                        # 修改：注册 admin_router
│   │   └── quick_replies.py                 # 修改：增加 status 筛选逻辑
│   └── services/
│       └── admin_service.py                 # 新增：管理后台业务逻辑
├── alembic/
│   └── versions/
│       └── 006_admin_extension.py           # 新增：管理后台数据库迁移
```

### 2.3 文件变更标注

| 标记 | 含义 |
|------|------|
| **新增** | 全新创建的文件 |
| **修改** | 在现有文件中添加/修改内容 |

---

## 3. 数据模型

### 3.1 新增模型：ConfigChangeLog

```python
# backend/app/models/config_change_log.py

import uuid
from datetime import datetime

from sqlalchemy import DateTime, String, Text
from sqlalchemy.orm import Mapped, mapped_column

from app.database import Base


class ConfigChangeLog(Base):
    """配置变更日志模型 — 对应 config_change_logs 表。

    记录每次配置项的变更历史，包含变更前后的值、操作人和时间。

    Attributes:
        id: 日志唯一标识（UUID）
        config_key: 变更的配置键
        old_value: 变更前的值
        new_value: 变更后的值
        changed_by: 变更操作人（agent_id）
        changed_at: 变更时间
    """

    __tablename__ = "config_change_logs"

    id: Mapped[str] = mapped_column(
        String(36),
        primary_key=True,
        default=lambda: str(uuid.uuid4()),
    )

    config_key: Mapped[str] = mapped_column(
        String(128),
        nullable=False,
        comment="配置键",
    )

    old_value: Mapped[str] = mapped_column(
        Text,
        nullable=False,
        default="",
        comment="变更前的值",
    )

    new_value: Mapped[str] = mapped_column(
        Text,
        nullable=False,
        default="",
        comment="变更后的值",
    )

    changed_by: Mapped[str] = mapped_column(
        String(36),
        nullable=False,
        comment="变更操作人 agent_id",
    )

    changed_at: Mapped[datetime] = mapped_column(
        DateTime(timezone=True),
        nullable=False,
        default=datetime.now,
        comment="变更时间",
    )

    __table_args__ = (
        Index("idx_ccl_config_key", "config_key"),
        Index("idx_ccl_changed_at", "changed_at"),
    )

    def __repr__(self) -> str:
        return f"<ConfigChangeLog(key={self.config_key}, by={self.changed_by})>"
```

### 3.2 扩展模型：Agent（新增字段）

```python
# 在 backend/app/models/agent.py 中新增字段：

role: Mapped[str] = mapped_column(
    String(20),
    nullable=False,
    default="agent",
    comment="角色：admin=组长, agent=坐席",
)

skill_tags: Mapped[list] = mapped_column(
    JSON,
    nullable=False,
    default=list,
    comment="技能标签列表（电脑/软件/外设/网络/安全/资产/其他）",
)
```

### 3.3 扩展模型：QuickReplyTemplate（新增字段）

```python
# 在 backend/app/models/quick_reply_template.py 中新增字段：

status: Mapped[str] = mapped_column(
    String(20),
    nullable=False,
    default="approved",
    comment="状态：draft/pending_review/approved/rejected",
)

version: Mapped[int] = mapped_column(
    Integer,
    nullable=False,
    default=1,
    comment="版本号，每次审核通过后 +1",
)

submitted_by: Mapped[str] = mapped_column(
    String(36),
    nullable=True,
    default=None,
    comment="提交人 agent_id",
)
```

### 3.4 类图

```mermaid
classDiagram
    class Agent {
        +str id
        +str user_id
        +str name
        +str status
        +str role
        +list skill_tags
        +int current_load
        +int max_load
        +datetime created_at
        +datetime updated_at
    }

    class SystemConfig {
        +str id
        +str config_key
        +str config_value
        +str description
        +datetime updated_at
    }

    class ConfigChangeLog {
        +str id
        +str config_key
        +str old_value
        +str new_value
        +str changed_by
        +datetime changed_at
    }

    class QuickReplyTemplate {
        +str id
        +str category
        +str title
        +str content
        +list variables
        +int sort_order
        +str status
        +int version
        +str submitted_by
        +datetime created_at
        +datetime updated_at
    }

    class Conversation {
        +str id
        +str employee_id
        +str employee_name
        +str status
        +int urgency_score
        +str assigned_agent_id
        +datetime created_at
    }

    ConfigChangeLog --> SystemConfig : tracks changes to
    ConfigChangeLog --> Agent : changed_by
    QuickReplyTemplate --> Agent : submitted_by
    Conversation --> Agent : assigned_agent_id
```

---

## 4. API 接口设计

### 4.1 权限校验依赖

```python
# backend/app/api/admin.py 中定义

from app.api.agents import get_current_agent

async def require_admin(
    agent: Agent = Depends(get_current_agent),
) -> Agent:
    """管理后台权限校验：仅 role='admin' 可访问。"""
    if agent.role != "admin":
        raise AppException(1004, "无管理权限")
    return agent
```

### 4.2 API 端点列表

所有管理后台 API 统一前缀 `/api/admin/`。

#### 4.2.1 运营总览仪表盘

**GET /api/admin/dashboard/overview**

- 权限: admin
- 描述: 获取仪表盘统计数据
- 响应:
```json
{
  "code": 0,
  "data": {
    "online_agents": 3,
    "today_conversations": 12,
    "avg_response_time": "—",
    "ai_hit_rate": "—",
    "pending_reviews": 2,
    "system_alerts": [],
    "integrations_health": [
      {"system": "Dify AI", "status": "connected"},
      {"system": "RAGFlow", "status": "partial"}
    ]
  }
}
```

#### 4.2.2 功能开关/参数管理

**GET /api/admin/configs**

- 权限: admin
- 描述: 获取全部配置项（按功能分组）
- 响应:
```json
{
  "code": 0,
  "data": {
    "groups": [
      {
        "name": "AI 对话引擎",
        "key_prefix": "ai_",
        "items": [
          {
            "key": "ai_auto_reply",
            "value": "true",
            "description": "AI自动回复开关",
            "value_type": "boolean"
          },
          {
            "key": "intervene_round_threshold",
            "value": "3",
            "description": "AI介入轮次阈值",
            "value_type": "number"
          },
          {
            "key": "hand_raise_keywords",
            "value": "[\"转人工\",\"人工\",\"人工服务\"]",
            "description": "举手关键词列表",
            "value_type": "json_array"
          }
        ]
      },
      {
        "name": "应急模式",
        "key_prefix": "emergency_",
        "items": [
          {
            "key": "emergency_mode",
            "value": "false",
            "description": "应急模式开关",
            "value_type": "boolean"
          }
        ]
      }
    ]
  }
}
```

**PUT /api/admin/configs/{key}**

- 权限: admin
- 描述: 更新单个配置项（同时记录变更日志）
- 请求体:
```json
{
  "value": "true"
}
```
- 响应:
```json
{
  "code": 0,
  "data": {
    "key": "emergency_mode",
    "old_value": "false",
    "new_value": "true",
    "changed_at": "2026-07-15T10:30:00Z"
  }
}
```

**GET /api/admin/configs/{key}/history**

- 权限: admin
- 描述: 获取指定配置项的变更历史
- 查询参数: `limit` (默认20)
- 响应:
```json
{
  "code": 0,
  "data": {
    "items": [
      {
        "id": "uuid",
        "config_key": "emergency_mode",
        "old_value": "false",
        "new_value": "true",
        "changed_by": "agent_id",
        "changed_by_name": "宋献",
        "changed_at": "2026-07-15T10:30:00Z"
      }
    ]
  }
}
```

#### 4.2.3 坐席人员管理

**GET /api/admin/agents**

- 权限: admin
- 描述: 获取坐席列表（管理视图，含角色/技能标签）
- 查询参数: `status` (可选，筛选 online/offline/busy)
- 响应:
```json
{
  "code": 0,
  "data": {
    "items": [
      {
        "id": "uuid",
        "user_id": "SongXian",
        "name": "宋献",
        "status": "online",
        "role": "admin",
        "skill_tags": ["电脑", "网络", "软件"],
        "current_load": 2,
        "max_load": 5,
        "today_resolved": 8,
        "created_at": "2026-01-01T00:00:00Z",
        "updated_at": "2026-07-15T08:00:00Z"
      }
    ]
  }
}
```

**POST /api/admin/agents**

- 权限: admin
- 描述: 添加坐席
- 请求体:
```json
{
  "user_id": "WangLi",
  "name": "王丽",
  "role": "agent",
  "skill_tags": ["外设", "安全"],
  "max_load": 5
}
```
- 响应:
```json
{
  "code": 0,
  "data": {
    "id": "uuid",
    "user_id": "WangLi",
    "name": "王丽",
    "role": "agent",
    "skill_tags": ["外设", "安全"],
    "status": "offline",
    "current_load": 0,
    "max_load": 5
  }
}
```

**PUT /api/admin/agents/{id}**

- 权限: admin
- 描述: 编辑坐席（角色/技能标签/负载上限）
- 请求体:
```json
{
  "role": "agent",
  "skill_tags": ["电脑", "网络"],
  "max_load": 8
}
```
- 响应:
```json
{
  "code": 0,
  "data": {
    "id": "uuid",
    "role": "agent",
    "skill_tags": ["电脑", "网络"],
    "max_load": 8
  }
}
```

**DELETE /api/admin/agents/{id}**

- 权限: admin
- 描述: 移除坐席
- 响应:
```json
{
  "code": 0,
  "data": null,
  "message": "坐席已移除"
}
```

#### 4.2.4 外部系统集成配置

**GET /api/admin/integrations**

- 权限: admin
- 描述: 获取集成系统列表及配置状态
- 响应:
```json
{
  "code": 0,
  "data": {
    "items": [
      {
        "id": "dify",
        "name": "Dify AI",
        "status": "connected",
        "configurable": true,
        "config": {
          "api_url": "https://api.dify.ai/v1",
          "api_key_set": true
        }
      },
      {
        "id": "ragflow",
        "name": "RAGFlow",
        "status": "partial",
        "configurable": true,
        "config": {
          "api_url": "",
          "api_key_set": false
        }
      },
      {
        "id": "data_platform",
        "name": "数据平台",
        "status": "disconnected",
        "configurable": false,
        "config": null
      },
      {
        "id": "beisen",
        "name": "北森 eHR",
        "status": "disconnected",
        "configurable": false,
        "config": null
      },
      {
        "id": "huorong",
        "name": "火绒安全",
        "status": "disconnected",
        "configurable": false,
        "config": null
      },
      {
        "id": "liansoft",
        "name": "联软安全",
        "status": "pending",
        "configurable": false,
        "config": null
      }
    ]
  }
}
```

**PUT /api/admin/integrations/{id}**

- 权限: admin
- 描述: 更新集成配置（仅 dify/ragflow 可用，配置存 system_configs 表，键前缀 `integration_`）
- 请求体:
```json
{
  "api_url": "https://api.dify.ai/v1",
  "api_key": "app-xxxxx"
}
```
- 响应:
```json
{
  "code": 0,
  "data": {
    "id": "dify",
    "name": "Dify AI",
    "status": "connected",
    "config": {
      "api_url": "https://api.dify.ai/v1",
      "api_key_set": true
    }
  }
}
```

#### 4.2.5 快速回复管理

**GET /api/admin/quick-replies/pending**

- 权限: admin
- 描述: 获取待审核模板列表
- 查询参数: `category` (可选)
- 响应:
```json
{
  "code": 0,
  "data": {
    "items": [
      {
        "id": "uuid",
        "category": "电脑",
        "title": "密码重置引导",
        "content": "您好{employee_name}...",
        "variables": ["employee_name"],
        "status": "pending_review",
        "version": 1,
        "submitted_by": "agent_id",
        "submitted_by_name": "王丽",
        "sort_order": 0,
        "created_at": "2026-07-14T10:00:00Z",
        "updated_at": "2026-07-14T10:00:00Z"
      }
    ]
  }
}
```

**PUT /api/admin/quick-replies/{id}/review**

- 权限: admin
- 描述: 审核快速回复模板（通过/驳回）
- 请求体:
```json
{
  "action": "approve",
  "reason": ""
}
```
或:
```json
{
  "action": "reject",
  "reason": "内容需要更具体的操作步骤"
}
```
- 响应:
```json
{
  "code": 0,
  "data": {
    "id": "uuid",
    "status": "approved",
    "version": 2
  }
}
```

#### 4.2.6 消息分配模式

**GET /api/admin/assignment-mode**

- 权限: admin
- 描述: 获取当前分配模式
- 响应:
```json
{
  "code": 0,
  "data": {
    "current_mode": "manual",
    "modes": [
      {"id": "manual", "name": "手动接单", "enabled": true, "locked": false},
      {"id": "round_robin", "name": "轮询分配", "enabled": false, "locked": true, "unlock_at": "阶段二"},
      {"id": "least_active", "name": "最少活跃优先", "enabled": false, "locked": true, "unlock_at": "阶段二"},
      {"id": "weighted", "name": "加权比例分配", "enabled": false, "locked": true, "unlock_at": "阶段三"},
      {"id": "skill_match", "name": "技能匹配分配", "enabled": false, "locked": true, "unlock_at": "阶段三"},
      {"id": "priority_queue", "name": "优先队列", "enabled": false, "locked": true, "unlock_at": "阶段三"}
    ]
  }
}
```

**PUT /api/admin/assignment-mode**

- 权限: admin
- 描述: 切换分配模式（阶段一仅允许手动接单）
- 请求体:
```json
{
  "mode": "manual"
}
```

#### 4.2.7 会话监控

**GET /api/admin/monitor/sessions**

- 权限: admin
- 描述: 获取实时会话列表（Demo预览）
- 查询参数: `status` (可选，默认非 resolved)
- 响应:
```json
{
  "code": 0,
  "data": {
    "stats": {
      "in_progress": 3,
      "queued": 1,
      "resolved_today": 8,
      "alerts": 0
    },
    "items": [
      {
        "id": "uuid",
        "employee_name": "张三",
        "status": "serving",
        "assigned_agent_name": "宋献",
        "urgency_score": 3,
        "created_at": "2026-07-15T09:00:00Z",
        "last_message_summary": "我的电脑无法开机"
      }
    ]
  }
}
```

#### 4.2.8 全局搜索

**GET /api/admin/search?q=关键词**

- 权限: admin
- 描述: 搜索配置项、坐席、快速回复
- 响应:
```json
{
  "code": 0,
  "data": {
    "items": [
      {"type": "config", "id": "emergency_mode", "name": "应急模式", "route": "/admin/configs"},
      {"type": "agent", "id": "uuid", "name": "宋献", "route": "/admin/agents"},
      {"type": "quick_reply", "id": "uuid", "name": "密码重置引导", "route": "/admin/quick-replies"}
    ]
  }
}
```

---

## 5. 程序调用流程

### 5.1 管理员登录流程

```mermaid
sequenceDiagram
    participant U as 管理员(组长)
    participant FE as frontend-admin
    participant API as /api/agents/login
    participant Redis as Redis
    participant DB as PostgreSQL

    U->>FE: 输入 user_id + name 登录
    FE->>API: POST /api/agents/login
    API->>DB: 查询 Agent (user_id)
    DB-->>API: Agent 记录（含 role 字段）
    API->>Redis: 存储 token → user_id 映射
    API-->>FE: {agent_info, token, role: "admin"}
    FE->>FE: 检查 role === "admin"
    FE->>FE: 存储 admin_token 到 localStorage
    FE->>FE: 跳转到 /admin/dashboard
```

### 5.2 配置变更流程

```mermaid
sequenceDiagram
    participant U as 管理员
    participant FE as frontend-admin
    participant API as /api/admin/configs/{key}
    participant SVC as admin_service
    participant DB as PostgreSQL

    U->>FE: 切换应急模式开关
    FE->>API: PUT /api/admin/configs/emergency_mode
    API->>API: require_admin 校验权限
    API->>SVC: update_config(key, value, agent_id)
    SVC->>DB: SELECT SystemConfig WHERE key=emergency_mode
    DB-->>SVC: 当前值 "false"
    SVC->>DB: INSERT ConfigChangeLog(old="false", new="true", by=agent_id)
    SVC->>DB: UPDATE SystemConfig SET value="true"
    DB-->>SVC: 更新成功
    SVC-->>API: {key, old_value, new_value, changed_at}
    API-->>FE: 返回变更结果
    FE->>FE: 显示变更成功提示
```

### 5.3 快速回复审核流程

```mermaid
sequenceDiagram
    participant A as 坐席(王丽)
    participant AG as /api/quick-replies
    participant U as 管理员(宋献)
    participant ADM as /api/admin/quick-replies
    participant DB as PostgreSQL

    A->>AG: POST /api/quick-replies (创建模板, status=draft)
    A->>AG: PUT /api/quick-replies/{id} (提交审核, status→pending_review)
    AG->>DB: UPDATE QuickReplyTemplate SET status='pending_review', submitted_by='wang_li'

    U->>ADM: GET /api/admin/quick-replies/pending
    ADM->>DB: SELECT WHERE status='pending_review'
    DB-->>ADM: 待审核列表
    ADM-->>U: 显示待审核模板

    U->>ADM: PUT /api/admin/quick-replies/{id}/review (action=approve)
    ADM->>DB: UPDATE SET status='approved', version=version+1
    DB-->>ADM: 更新成功

    A->>AG: GET /api/quick-replies (获取可见模板)
    AG->>DB: SELECT WHERE status='approved' OR (status='pending_review' AND submitted_by=自己)
    DB-->>AG: 全员可见(approved) + 仅自己(pending_review)
```

### 5.4 坐席管理 CRUD 流程

```mermaid
sequenceDiagram
    participant U as 管理员
    participant FE as frontend-admin
    participant API as /api/admin/agents
    participant DB as PostgreSQL

    U->>FE: 进入坐席管理页面
    FE->>API: GET /api/admin/agents?status=online
    API->>API: require_admin 校验
    API->>DB: SELECT Agent (含 role, skill_tags)
    DB-->>API: 坐席列表
    API-->>FE: 返回坐席数据

    U->>FE: 编辑坐席（修改技能标签）
    FE->>API: PUT /api/admin/agents/{id}
    API->>API: require_admin 校验
    API->>DB: UPDATE Agent SET skill_tags=['电脑','网络']
    DB-->>API: 更新成功
    API-->>FE: 返回更新后的坐席信息
```

---

## 6. 任务列表

### T01: 项目基础设施

**任务名称**: 项目基础设施 + 数据库迁移
**优先级**: P0
**依赖**: 无
**涉及文件**:

| 文件 | 操作 | 职责 |
|------|------|------|
| `frontend-admin/package.json` | 新增 | 前端依赖声明 |
| `frontend-admin/vite.config.ts` | 新增 | Vite 构建配置（base: /itadmin/） |
| `frontend-admin/tsconfig.json` | 新增 | TypeScript 配置 |
| `frontend-admin/tsconfig.node.json` | 新增 | Node TS 配置 |
| `frontend-admin/tailwind.config.js` | 新增 | Tailwind CSS 配置 |
| `frontend-admin/postcss.config.js` | 新增 | PostCSS 配置 |
| `frontend-admin/index.html` | 新增 | HTML 入口 |
| `frontend-admin/env.d.ts` | 新增 | 环境类型声明 |
| `frontend-admin/src/main.ts` | 新增 | Vue 应用入口 |
| `frontend-admin/src/App.vue` | 新增 | 根组件 |
| `frontend-admin/src/styles/global.css` | 新增 | 深色科技风全局样式 |
| `frontend-admin/src/api/index.ts` | 新增 | Axios 实例（admin_token） |
| `frontend-admin/src/types/index.ts` | 新增 | TypeScript 类型定义 |
| `backend/app/models/config_change_log.py` | 新增 | 配置变更日志模型 |
| `backend/app/models/agent.py` | 修改 | 新增 role, skill_tags 字段 |
| `backend/app/models/quick_reply_template.py` | 修改 | 新增 status, version, submitted_by 字段 |
| `backend/app/models/__init__.py` | 修改 | 导入新模型 |
| `backend/app/schemas/agent.py` | 修改 | 新增 role, skill_tags 到响应 |
| `backend/app/schemas/quick_reply.py` | 修改 | 新增 status, version, submitted_by |
| `backend/app/schemas/admin.py` | 新增 | 管理后台专用 Schema |
| `backend/alembic/versions/006_admin_extension.py` | 新增 | 数据库迁移脚本 |

**具体工作**:
1. 初始化 `frontend-admin/` 项目（Vue 3 + TS + Vite + Element Plus + Pinia + Tailwind CSS）
2. 配置 Vite（base: `/itadmin/`、API 代理到 `localhost:8000`）
3. 创建 Axios 实例（使用 `admin_token` 而非 `agent_token`）
4. 定义全局 CSS 变量（深色科技风，与 PRD §10.2 对齐）
5. 后端新增 `ConfigChangeLog` 模型
6. 后端扩展 `Agent` 模型（新增 `role`, `skill_tags`）
7. 后端扩展 `QuickReplyTemplate` 模型（新增 `status`, `version`, `submitted_by`）
8. 后端新增 `admin.py` Schema（请求/响应数据结构）
9. 创建 Alembic 迁移脚本 `006_admin_extension.py`

---

### T02: 后端管理 API + 权限中间件

**任务名称**: 后端管理 API 路由 + 权限校验 + 业务逻辑
**优先级**: P0
**依赖**: T01
**涉及文件**:

| 文件 | 操作 | 职责 |
|------|------|------|
| `backend/app/api/admin.py` | 新增 | 管理后台全部路由（7组 API） |
| `backend/app/services/admin_service.py` | 新增 | 管理后台业务逻辑层 |
| `backend/app/api/router.py` | 修改 | 注册 admin_router |
| `backend/app/api/quick_replies.py` | 修改 | 增加 status 筛选逻辑（坐席端可见性） |

**具体工作**:
1. 实现 `require_admin` 依赖函数（校验 token + role=admin）
2. 实现 `/api/admin/dashboard/overview` — 仪表盘聚合查询
3. 实现 `/api/admin/configs` — 配置项分组读取
4. 实现 `/api/admin/configs/{key}` PUT — 配置更新 + 变更日志写入
5. 实现 `/api/admin/configs/{key}/history` — 配置变更历史查询
6. 实现 `/api/admin/agents` CRUD — 坐席管理（含 role/skill_tags 编辑）
7. 实现 `/api/admin/integrations` — 集成系统配置（复用 SystemConfig，键前缀 `integration_`）
8. 实现 `/api/admin/quick-replies/pending` + `/{id}/review` — 审核流程
9. 实现 `/api/admin/assignment-mode` — 分配模式读写
10. 实现 `/api/admin/monitor/sessions` — 会话监控查询
11. 实现 `/api/admin/search` — 全局搜索
12. 修改坐席端 `GET /api/quick-replies` 增加 status 筛选（approved + 自己的 pending_review）
13. 在 `router.py` 中注册 admin_router

---

### T03: 前端布局框架 + P0 页面

**任务名称**: 前端布局框架 + P0 核心页面（仪表盘/配置/坐席/集成）
**优先级**: P0
**依赖**: T01
**涉及文件**:

| 文件 | 操作 | 职责 |
|------|------|------|
| `frontend-admin/src/router/index.ts` | 新增 | 路由配置（含 admin 守卫） |
| `frontend-admin/src/stores/admin.ts` | 新增 | 管理员状态 Store |
| `frontend-admin/src/stores/config.ts` | 新增 | 配置项 Store |
| `frontend-admin/src/stores/agent.ts` | 新增 | 坐席管理 Store |
| `frontend-admin/src/api/admin.ts` | 新增 | 管理后台 API 调用函数 |
| `frontend-admin/src/layouts/AdminLayout.vue` | 新增 | 管理后台布局 |
| `frontend-admin/src/components/Sidebar.vue` | 新增 | 侧边栏导航 |
| `frontend-admin/src/components/Breadcrumb.vue` | 新增 | 面包屑 |
| `frontend-admin/src/components/StatCard.vue` | 新增 | 统计卡片 |
| `frontend-admin/src/components/ConfigGroup.vue` | 新增 | 配置分组卡片 |
| `frontend-admin/src/components/AgentTable.vue` | 新增 | 坐席列表表格 |
| `frontend-admin/src/components/IntegrationCard.vue` | 新增 | 集成系统卡片 |
| `frontend-admin/src/components/SearchBox.vue` | 新增 | 全局搜索 |
| `frontend-admin/src/views/Login.vue` | 新增 | 管理员登录页 |
| `frontend-admin/src/views/Dashboard.vue` | 新增 | 运营总览仪表盘 |
| `frontend-admin/src/views/Configs.vue` | 新增 | 功能开关/参数管理 |
| `frontend-admin/src/views/Agents.vue` | 新增 | 坐席人员管理 |
| `frontend-admin/src/views/Integrations.vue` | 新增 | 外部系统集成配置 |

**具体工作**:
1. 实现路由配置（全部 10 个路由 + 路由守卫校验 admin 角色）
2. 实现管理员 Store（登录/登出/权限校验，使用 `admin_token`）
3. 实现 AdminLayout（深色侧边栏 + 面包屑 + 内容区）
4. 实现 Sidebar（导航分组 + 优先级标签 + 灰化占位）
5. 实现登录页（复用坐席登录 API，检查 role=admin）
6. 实现仪表盘页面（4 个统计卡片 + 待处理事项 + 系统健康状态）
7. 实现功能开关页面（6 组配置卡片 + toggle 开关 + JSON 编辑对话框）
8. 实现坐席管理页面（表格列表 + 状态筛选 + 编辑角色/技能标签对话框）
9. 实现系统集成页面（6 个系统卡片 + Dify/RAGFlow 配置表单）
10. 实现全局搜索组件

---

### T04: P1 页面 + 快速回复管理 + 占位页

**任务名称**: P1 运营管理页面（快速回复/分配模式/会话监控/排查流程图）+ 占位页
**优先级**: P1
**依赖**: T03
**涉及文件**:

| 文件 | 操作 | 职责 |
|------|------|------|
| `frontend-admin/src/stores/quickReply.ts` | 新增 | 快速回复管理 Store |
| `frontend-admin/src/components/QuickReplyCard.vue` | 新增 | 快速回复卡片组件 |
| `frontend-admin/src/views/QuickReplies.vue` | 新增 | 快速回复管理页面 |
| `frontend-admin/src/views/AssignmentMode.vue` | 新增 | 消息分配模式（占位） |
| `frontend-admin/src/views/Monitor.vue` | 新增 | 会话监控（Demo预览） |
| `frontend-admin/src/views/Flowcharts.vue` | 新增 | 排查流程图（占位） |
| `frontend-admin/src/views/Placeholder.vue` | 新增 | 通用占位页模板 |

**具体工作**:
1. 实现快速回复管理页面（卡片列表 + 分类筛选 + 审核操作按钮）
2. 实现审核流程交互（通过/驳回对话框，驳回需填原因）
3. 实现分配模式页面（6 个模式卡片，手动接单可选，其余灰化+锁图标）
4. 实现会话监控页面（统计卡片 + 实时会话表格，标注 Demo 预览）
5. 实现排查流程图页面（模板列表 + 灰化的导入导出按钮）
6. 实现通用占位页模板（居中"开发中"提示 + 返回首页按钮）

---

### T05: 集成测试 + 样式打磨 + 部署配置

**任务名称**: 前后端集成联调 + 深色主题样式打磨 + 部署配置
**优先级**: P1
**依赖**: T02, T03, T04
**涉及文件**:

| 文件 | 操作 | 职责 |
|------|------|------|
| `frontend-admin/src/styles/global.css` | 修改 | 深色主题样式微调 |
| `frontend-admin/src/layouts/AdminLayout.vue` | 修改 | 响应式适配 |
| `frontend-admin/src/components/*.vue` | 修改 | 组件样式统一 |
| `frontend-admin/dist/` | 生成 | 构建产物 |
| Nginx 配置 | 修改 | 新增 /itadmin/ 路由 |

**具体工作**:
1. 前后端联调：逐一测试所有 API 端点
2. 深色科技风主题一致性检查（所有页面、组件、对话框）
3. Element Plus 组件深色样式覆盖（表格、表单、对话框、分页等）
4. 响应式布局调整（窗口缩放、侧边栏折叠）
5. 前端构建 `npm run build`，确认 dist 产物可用
6. Nginx 配置更新（新增 `/itadmin/` 路由）
7. 种子数据更新（宋献设为 admin 角色，现有快速回复设为 approved 状态）

---

### 任务依赖图

```mermaid
graph TD
    T01[T01: 项目基础设施+DB迁移] --> T02[T02: 后端管理API+权限]
    T01 --> T03[T03: 前端布局+P0页面]
    T03 --> T04[T04: P1页面+快速回复+占位]
    T02 --> T05[T05: 集成测试+样式+部署]
    T04 --> T05
```

---

## 7. 依赖包列表

### 7.1 前端新增（`frontend-admin/package.json`）

```json
{
  "dependencies": {
    "vue": "^3.4.0",
    "vue-router": "^4.3.0",
    "pinia": "^2.1.0",
    "element-plus": "^2.7.0",
    "@element-plus/icons-vue": "^2.3.0",
    "axios": "^1.7.0"
  },
  "devDependencies": {
    "@vitejs/plugin-vue": "^5.0.0",
    "typescript": "^5.5.0",
    "vite": "^5.3.0",
    "vue-tsc": "^2.0.0",
    "tailwindcss": "^3.4.0",
    "postcss": "^8.4.0",
    "autoprefixer": "^10.4.0"
  }
}
```

### 7.2 后端新增

无新增 pip 依赖。所有后端功能基于现有 FastAPI + SQLAlchemy + Pydantic + Redis 实现。

---

## 8. 共享知识

### 8.1 API 响应格式

所有 API 遵循统一响应格式：

```json
// 成功
{"code": 0, "data": {...}, "message": "success"}

// 失败
{"code": 1004, "data": null, "message": "无管理权限"}
```

### 8.2 错误码规范

| 错误码 | 含义 | 使用场景 |
|--------|------|---------|
| 0 | 成功 | — |
| 1001 | 参数错误 | 请求体校验失败 |
| 1002 | 未授权 | token 缺失/无效/过期 |
| 1003 | 资源不存在 | 查询对象不存在 |
| 1004 | 无权限访问 | 非 admin 角色访问管理 API |
| 1005 | 服务器内部错误 | 未预期异常 |

### 8.3 认证方式

- **管理后台前端**: 登录成功后将 token 存储到 `localStorage` 的 `admin_token` 键
- **请求头**: `Authorization: Bearer {token}`
- **后端校验**: 复用坐席端 `get_current_agent` 依赖，新增 `require_admin` 校验 `role == 'admin'`
- **Token 存储**: Redis `agent:token:{token}` → `user_id`，TTL 8 小时

### 8.4 前端 Token 键名

| 端 | localStorage 键 | 说明 |
|----|-----------------|------|
| 坐席端 | `agent_token` | 坐席工作台 |
| 管理后台 | `admin_token` | 管理后台（独立键避免冲突） |

### 8.5 CSS 变量（深色科技风）

管理后台使用固定深色主题，CSS 变量与 PRD §10.2 对齐：

```css
:root {
  --bg-primary: #0f172a;
  --bg-secondary: #1e293b;
  --bg-tertiary: #334155;
  --accent: #3b82f6;
  --success: #10b981;
  --warning: #f59e0b;
  --danger: #ef4444;
  --text-primary: #f1f5f9;
  --text-secondary: #94a3b8;
  --text-muted: #64748b;
}
```

### 8.6 集成配置存储约定

阶段一复用 `SystemConfig` 表存储集成系统配置，键命名规则：

| 键 | 值示例 | 说明 |
|----|--------|------|
| `integration_dify_api_url` | `https://api.dify.ai/v1` | Dify API 地址 |
| `integration_dify_api_key` | `app-xxxxx` | Dify API Key |
| `integration_ragflow_api_url` | `http://ragflow:9380` | RAGFlow API 地址 |
| `integration_ragflow_api_key` | `ragflow-xxxxx` | RAGFlow API Key |

### 8.7 快速回复状态枚举

```
draft → pending_review → approved
                    └→ rejected → (修改后重新提交) → pending_review
```

- `approved`: 全员可见
- `pending_review`: 仅提交人 + admin 可见
- `rejected`: 仅提交人可见（返回修改后重新提交）
- `draft`: 仅提交人可见

### 8.8 坐席端快速回复可见性规则

坐席端 `GET /api/quick-replies` 返回条件：
- `status = 'approved'`（全员可见）
- `status = 'pending_review' AND submitted_by = 当前坐席ID`（自己的待审核）

### 8.9 技能标签枚举

```typescript
const SKILL_TAGS = ['电脑', '软件', '外设', '网络', '安全', '资产', '其他'] as const;
```

### 8.10 日期格式

所有日期使用 ISO 8601 UTC 格式，如 `2026-07-15T10:30:00Z`。

---

## 9. 待明确事项

| # | 事项 | 当前假设 | 影响范围 |
|---|------|---------|---------|
| 1 | 坐席"今日结单数"统计口径 | 从 `conversations` 表统计 `assigned_agent_id = agent.id AND status = 'resolved' AND DATE(resolved_at) = TODAY` | 仪表盘 + 坐席管理 |
| 2 | 集成配置中 API Key 是否加密存储 | 阶段一明文存储（与现有 SystemConfig 一致），阶段二引入加密 | 安全性 |
| 3 | 管理后台是否支持移动端适配 | 阶段一仅支持桌面端，不做移动端响应式 | 布局 |
| 4 | 应急模式引导文案是否阶段二可配 | 按主理人决策，阶段一固定文案 | 功能开关页 |
| 5 | 全局搜索结果排序规则 | 按类型优先级排序：配置项 > 坐席 > 快速回复，同类型按名称排序 | 搜索体验 |

---

> **文档结束** — 本架构设计文档覆盖管理后台阶段一 1B 的全部技术方案，与 PRD-admin.md 和主理人决策对齐。
