Files

1275 lines
37 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 | 现有 | ORMasync |
| 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. 配置 Vitebase: `/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 和主理人决策对齐。