Files
wecom_it_smart_desk/docs/ARCHITECTURE-admin.md

37 KiB
Raw Permalink Blame History

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

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


目录

  1. 实现方案与框架选型
  2. 文件列表及相对路径
  3. 数据模型
  4. API 接口设计
  5. 程序调用流程
  6. 任务列表
  7. 依赖包列表
  8. 共享知识
  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

# 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(新增字段)

# 在 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(新增字段)

# 在 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 类图

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 权限校验依赖

# 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
  • 描述: 获取仪表盘统计数据
  • 响应:
{
  "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
  • 描述: 获取全部配置项(按功能分组)
  • 响应:
{
  "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
  • 描述: 更新单个配置项(同时记录变更日志)
  • 请求体:
{
  "value": "true"
}
  • 响应:
{
  "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)
  • 响应:
{
  "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)
  • 响应:
{
  "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
  • 描述: 添加坐席
  • 请求体:
{
  "user_id": "WangLi",
  "name": "王丽",
  "role": "agent",
  "skill_tags": ["外设", "安全"],
  "max_load": 5
}
  • 响应:
{
  "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
  • 描述: 编辑坐席(角色/技能标签/负载上限)
  • 请求体:
{
  "role": "agent",
  "skill_tags": ["电脑", "网络"],
  "max_load": 8
}
  • 响应:
{
  "code": 0,
  "data": {
    "id": "uuid",
    "role": "agent",
    "skill_tags": ["电脑", "网络"],
    "max_load": 8
  }
}

DELETE /api/admin/agents/{id}

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

4.2.4 外部系统集成配置

GET /api/admin/integrations

  • 权限: admin
  • 描述: 获取集成系统列表及配置状态
  • 响应:
{
  "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_
  • 请求体:
{
  "api_url": "https://api.dify.ai/v1",
  "api_key": "app-xxxxx"
}
  • 响应:
{
  "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 (可选)
  • 响应:
{
  "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
  • 描述: 审核快速回复模板(通过/驳回)
  • 请求体:
{
  "action": "approve",
  "reason": ""
}

或:

{
  "action": "reject",
  "reason": "内容需要更具体的操作步骤"
}
  • 响应:
{
  "code": 0,
  "data": {
    "id": "uuid",
    "status": "approved",
    "version": 2
  }
}

4.2.6 消息分配模式

GET /api/admin/assignment-mode

  • 权限: admin
  • 描述: 获取当前分配模式
  • 响应:
{
  "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
  • 描述: 切换分配模式(阶段一仅允许手动接单)
  • 请求体:
{
  "mode": "manual"
}

4.2.7 会话监控

GET /api/admin/monitor/sessions

  • 权限: admin
  • 描述: 获取实时会话列表(Demo预览)
  • 查询参数: status (可选,默认非 resolved)
  • 响应:
{
  "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
  • 描述: 搜索配置项、坐席、快速回复
  • 响应:
{
  "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 管理员登录流程

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 配置变更流程

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 快速回复审核流程

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 流程

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 状态)

任务依赖图

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

{
  "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 遵循统一响应格式:

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

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

8.2 错误码规范

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

8.3 认证方式

  • 管理后台前端: 登录成功后将 token 存储到 localStorageadmin_token
  • 请求头: Authorization: Bearer {token}
  • 后端校验: 复用坐席端 get_current_agent 依赖,新增 require_admin 校验 role == 'admin'
  • Token 存储: Redis agent:token:{token}user_idTTL 8 小时

8.4 前端 Token 键名

localStorage 键 说明
坐席端 agent_token 坐席工作台
管理后台 admin_token 管理后台(独立键避免冲突)

8.5 CSS 变量(深色科技风)

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

: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 技能标签枚举

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 和主理人决策对齐。