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