Browse Source

docs: 完善项目文档,删除多余文件 - 重写 README.md:完整的功能说明、技术架构、项目结构、环境变量说明 - 重写部署文档.md:Docker 一键部署全流程、运维命令、升级流程、故障排查 - 重写测试文档.md:157 条详细功能测试用例,覆盖全部模块 - 删除多余的启动说明.md - 修复 /profile 接口读取 APP_TITLE 的方式(使用 CONFIG 对象) - 修复 LogoFull 组件在未登录时主动获取平台名称

mengboxin137-blip 5 ngày trước cách đây
mục cha
commit
4b604c85bc

+ 150 - 372
README.md

@@ -1,390 +1,168 @@
-# ZhAgentOS 2.0
-
-企业级智能体平台 —— 强大易用的 AI Agent 构建与管理系统。
-
-## 技术栈
-
-| 层级 | 技术 |
-|------|------|
-| 后端 | Python 3.11 + Django 5.2 + DRF |
-| 前端 | Vue 3 + TypeScript + Vite 6 + Element Plus |
-| 数据库 | PostgreSQL 17 + pgvector |
-| 缓存 | Redis 7 |
-| 任务队列 | Celery + Redis |
-| 包管理 | uv (Python) + npm (Node.js) |
-
-## 三端架构
-
-项目前端分为三个独立的 SPA,共享同一套后端 API 和前端代码库:
-
-```
-┌─────────────────┐     ┌──────────────────┐     ┌─────────────────┐
-│   Admin 管理端   │     │  Builder 构建端   │     │   Chat 访问端   │
-│   /admin/       │     │  /builder/       │     │   /chat/        │
-│   端口 3000     │     │  端口 3002       │     │   端口 3001     │
-└────────┬────────┘     └────────┬─────────┘     └────────┬────────┘
-         │                       │                        │
-         └───────────────────────┼────────────────────────┘
-                                 │
-                    ┌────────────▼────────────┐
-                    │     Django REST API     │
-                    │        :8080            │
-                    └────────────┬────────────┘
-                                 │
-              ┌──────────────────┼──────────────────┐
-              │                  │                  │
-        ┌─────▼─────┐     ┌─────▼─────┐     ┌─────▼─────┐
-        │ PostgreSQL │     │   Redis   │     │  Celery   │
-        │   :5433    │     │   :6379   │     │  Worker   │
-        └───────────┘     └───────────┘     └───────────┘
-```
-
-### Admin 管理端 (`/admin/`)
-
-平台管理员使用,负责系统级管理:
-
-- 用户管理(创建、角色分配、权限控制)
-- 工作区管理
-- 角色权限管理
-- 资源管理与授权
-- 系统设置(主题、认证、邮件)
-- 操作日志
-
-### Builder 构建端 (`/builder/`)
-
-智能体开发者使用,负责资源构建:
-
-- 智能体(应用)管理 —— 创建、配置、发布
-- 知识库管理 —— 文档上传、向量化、Q&A 管理
-- 工具管理 —— 自定义工具、MCP 工具
-- 模型管理 —— 接入 20+ 模型供应商
-- 工作流编排 —— 可视化流程编辑器(LogicFlow)
-- 触发器管理
-
-### Chat 访问端 (`/chat/`)
-
-终端用户使用,访问发布的智能体:
-
-- PC 端对话界面
-- 移动端对话界面
-- 嵌入式对话组件
-- 分享对话链接
-- 用户登录(支持钉钉、飞书、企业微信扫码)
-
-## 项目结构
-
-```
-zhagent/
-├── main.py                    # 后端入口(start/dev/upgrade_db/collect_static)
-├── config.yml                 # 运行时配置(DB、Redis、语言等)
-├── pyproject.toml             # Python 依赖(uv 管理)
-├── startTools.bat             # Windows 服务管理菜单
-├── apps/                      # Django 后端
-│   ├── maxkb/                 #   项目核心(settings、urls、wsgi)
-│   ├── users/                 #   用户管理
-│   ├── application/           #   智能体/应用管理 + 工作流引擎
-│   ├── knowledge/             #   知识库(向量搜索、文档处理)
-│   ├── models_provider/       #   模型供应商集成(20+ 供应商)
-│   ├── tools/                 #   工具管理
-│   ├── chat/                  #   聊天 API
-│   ├── trigger/               #   触发器系统
-│   ├── oss/                   #   文件存储
-│   ├── system_manage/         #   系统管理
-│   ├── folders/               #   文件夹管理
-│   ├── common/                #   公共模块(认证、缓存、中间件等)
-│   └── static/                #   构建产物(collect_static 输出)
-└── ui/                        # Vue 前端(三端完全独立)
-    ├── package.json           #   便捷脚本集合
-    ├── admin/                 #   管理端(完全独立)
-    │   ├── package.json       #     管理端依赖
-    │   ├── admin.html         #     入口 HTML
-    │   ├── vite.config.ts     #     Vite 构建配置
-    │   ├── env/.env           #     环境变量(port 3000)
-    │   └── src/               #     管理端源代码
-    │       ├── main.ts        #       入口文件
-    │       ├── App.vue        #       根组件
-    │       ├── router/        #       路由(system 模块)
-    │       ├── views/         #       页面(system, login, error)
-    │       ├── api/           #       API 客户端
-    │       ├── stores/        #       状态管理
-    │       ├── components/    #       共享组件副本
-    │       ├── styles/        #       样式副本
-    │       ├── locales/       #       国际化副本
-    │       ├── utils/         #       工具函数副本
-    │       └── ...
-    ├── builder/               #   构建端(完全独立)
-    │   ├── package.json       #     构建端依赖
-    │   ├── builder.html       #     入口 HTML
-    │   ├── vite.config.ts     #     Vite 构建配置
-    │   ├── env/.env           #     环境变量(port 3002)
-    │   └── src/               #     构建端源代码
-    │       ├── builder.ts     #       入口文件
-    │       ├── App.vue        #       根组件
-    │       ├── router/        #       路由(application, knowledge, tool, model, trigger)
-    │       ├── views/         #       页面(application, knowledge, tool, model 等)
-    │       ├── api/           #       API 客户端
-    │       ├── stores/        #       状态管理
-    │       ├── workflow/      #       工作流编辑器
-    │       ├── components/    #       共享组件副本
-    │       ├── styles/        #       样式副本
-    │       ├── locales/       #       国际化副本
-    │       ├── utils/         #       工具函数副本
-    │       └── ...
-    └── chat/                  #   访问端(完全独立)
-        ├── package.json       #     访问端依赖
-        ├── chat.html          #     入口 HTML
-        ├── vite.config.ts     #     Vite 构建配置
-        ├── env/.env           #     环境变量(port 3001)
-        └── src/               #     访问端源代码
-            ├── chat.ts        #       入口文件
-            ├── App.vue        #       根组件
-            ├── router/        #       路由(chat 模块)
-            ├── views/         #       页面(chat 对话界面)
-            ├── api/           #       API 客户端
-            ├── stores/        #       状态管理(chat-user)
-            ├── components/    #       共享组件副本
-            ├── styles/        #       样式副本
-            ├── locales/       #       国际化副本
-            ├── utils/         #       工具函数副本
-            └── ...
-```
-
-## 环境依赖
-
-| 依赖 | 版本 | 说明 |
+# 四川路桥 Maas 智能体平台
+
+企业级 AI 智能体管理平台,支持多模型接入、知识库管理、工作流编排、插件扩展等核心能力。
+
+## 平台功能
+
+### 基础配置
+- **模型接入**:支持公域模型(OpenAI、DeepSeek、通义千问、文心一言、智谱、Gemini 等)和私域模型(Ollama、vLLM、Xinference),普通用户可自行接入模型,支持 LLM/Embedding/TTS/STT/图像生成等多种模型类型
+- **工具配置**:三方工具接入,支持自定义 Python 工具、MCP 协议工具、技能工具、数据源工具、工作流工具,配置 API Key 即可使用
+
+### 系统管理
+- **用户管理**:用户的增删改查、启用禁用、密码重置
+- **角色管理**:管理员、工作空间管理员、普通用户三级角色体系
+- **资源授权**:细粒度的资源权限控制,支持对智能体、工具、模型、知识库四种资源类型分别授权
+- **SSO 单点登录**:对接统一认证平台,OAuth2 协议,自动同步用户和角色
+
+### 知识库
+- **通用知识库**:支持文本文档上传(txt/pdf/docx/md/csv)、表格导入、文档智能切分、QA 问答对自动生成、标签管理
+- **工作流知识库**:通过可视化工作流编排数据处理流程,支持数据清洗、加工、工具处理、入库等节点
+- **知识库检索**:语义检索(向量相似度)、全文检索(关键词)、混合检索三种模式,支持设置相似度阈值、Top N、最大段落字符数
+- **样本中心知识库**:对接样本中心系统,支持将本地文档段落推送到样本中心进行向量化入库
+
+### 智能体
+- **简单智能体**:对话模式,配置模型+提示词+知识库即可使用,支持文件上传对话
+- **高级智能体**:工作流模式,35+ 节点类型(AI 对话、条件判断、循环、知识库检索、工具调用、参数提取、意图识别、文档处理、图片/视频生成理解、TTS/STT 等),支持智能体记忆(对话记忆、关键词记忆、摘要记忆)
+- **智能体管理**:全生命周期管理,版本追踪与回滚,启用/禁用控制
+- **智能体发布**:公开访问链接、白名单控制、访问次数限制、认证配置、嵌入代码生成
+
+### 工具与触发器
+- **工具管理**:自定义工具在线编写和调试、MCP 工具接入、技能工具、数据源工具
+- **触发器**:定时触发(Cron 表达式)、事件触发(Webhook URL),支持关联智能体或工具自动执行
+
+### 插件系统
+- **插件注册封装**:统一 Schema 结构定义,标准化插件注册、参数校验与模块挂载
+- **插件日常管理**:完整生命周期(安装/卸载/启用/禁用/重装)
+- **插件测试验证与版本控制**:异常分类、错误码体系、测试执行与历史记录、版本管理与回滚
+
+## 技术架构
+
+```
+┌────────────────────────────────────────────────────┐
+│                    Nginx (端口 80)                   │
+│         反向代理 + 前端静态文件服务                    │
+└───────────┬────────────────────────┬───────────────┘
+            │                        │
+    ┌───────▼───────┐       ┌───────▼───────┐
+    │  Django Web   │       │  前端 SPA     │
+    │  (端口 8080)  │       │  (Vue 3)      │
+    └───────┬───────┘       └───────────────┘
+            │
+    ┌───────┼───────────────┐
+    │       │               │
+┌───▼───┐ ┌─▼──┐ ┌─────────▼─────────┐
+│ PgSQL │ │Redis│ │  Celery Worker    │
+│pgvector│ │    │ │ (异步任务/定时任务) │
+└───────┘ └────┘ └───────────────────┘
+```
+
+| 组件 | 技术 | 说明 |
 |------|------|------|
-| Python | 3.11+ | 推荐用 uv 管理 |
-| Node.js | 18+ | npm 管理前端依赖 |
-| PostgreSQL | 14+ | 需要 pgvector 扩展 |
-| Redis | 6+ | 缓存 + Celery broker |
-
-## 快速启动(开发环境)
-
-### 1. 克隆项目
-
-```bash
-git clone <repo-url> zhagent
-cd zhagent
-```
-
-### 2. 安装 Python 依赖
-
-```bash
-uv sync
-```
-
-### 3. 安装前端依赖
-
-```bash
-cd ui && npm install && cd ..
-```
-
-### 4. 配置数据库
-
-复制配置模板并编辑:
-
-```bash
-cp config_example.yml config.yml
-```
-
-编辑 `config.yml`:
-
-```yaml
-DB_HOST: 127.0.0.1
-DB_PORT: 5432          # PostgreSQL 端口
-DB_USER: postgres
-DB_PASSWORD: your_password
-DB_NAME: maxkb
-REDIS_HOST: 127.0.0.1
-REDIS_PORT: 6379
-REDIS_PASSWORD: ''
-REDIS_DB: 0
-DEBUG: true
-LANGUAGE_CODE: zh-CN
-```
-
-### 5. 初始化数据库
-
-确保 PostgreSQL 已启动并创建了数据库:
-
-```sql
-CREATE DATABASE maxkb;
-CREATE EXTENSION IF NOT EXISTS vector;
-```
-
-### 6. 启动服务
+| 后端框架 | Django 4.x + DRF | REST API 服务 |
+| 异步任务 | Celery + Redis | 向量化、定时触发、数据同步 |
+| 数据库 | PostgreSQL 16 + pgvector | 关系数据 + 向量检索 |
+| 前端 | Vue 3 + TypeScript + Element Plus | SPA 单页应用 |
+| 构建工具 | Vite 6 | 前端构建 |
+| 部署 | Docker Compose + Nginx | 容器化一键部署 |
 
-```bash
-# 终端 1:Celery Worker
-python main.py dev celery
-
-# 终端 2:Django Web(端口 8080)
-python main.py dev web
-
-# 终端 3:管理端(端口 3000)
-cd ui && npm run dev
-
-# 终端 4:构建端(端口 3002)
-cd ui && npm run builder
-
-# 终端 5:访问端(端口 3001)
-cd ui && npm run chat
-```
-
-或者使用 Windows 服务管理菜单:
+## 快速开始
 
 ```bash
-startTools.bat
-# 选择 1 启动全部服务
-```
-
-### 7. 登录
-
-- 管理端:`http://localhost:3000/admin/`
-- 构建端:`http://localhost:3002/builder/`
-- 访问端:`http://localhost:3001/chat/<accessToken>`
-
-默认账号:`admin@zhagent.com`
-默认密码:`ZhAgent@980123`
-
-## 构建部署
-
-### Docker 部署(推荐)
+# 1. 获取代码
+git clone <仓库地址> && cd zhagent
 
-```bash
-# 1. 构建前端
-bash build-frontend.sh
+# 2. 配置环境变量
+cp .env.example .env
+# 编辑 .env,修改 APP_TITLE、DB_PASSWORD、SSO 配置等
 
-# 2. 启动全部服务
+# 3. 一键启动
 docker compose up -d
 
-# 3. 查看日志
-docker compose logs -f
-
-# 4. 停止服务
-docker compose down
+# 4. 访问平台
+# 浏览器打开 http://<服务器IP>/admin/
+# 默认账号:admin / admin123
 ```
 
-数据持久化目录(挂载到本地磁盘):
-- `./data/postgresql` — PostgreSQL 数据
-- `./data/redis` — Redis 数据
-- `./data/uploads` — 上传文件
+详细部署流程见 [部署文档.md](部署文档.md)
 
-修改默认密码:创建 `.env` 文件
-```bash
-DB_PASSWORD=your_secure_password
-```
-
-### 开发模式(仅数据库和缓存)
-
-```bash
-# 启动 PostgreSQL + Redis
-docker compose -f docker-compose.dev.yml up -d
-
-# 启动后端
-python main.py dev celery  # 终端 1
-python main.py dev web     # 终端 2
-
-# 启动前端
-cd ui && npm run dev:all
-```
-
-### 手动部署
-
-```bash
-# 构建前端
-cd ui && npm run install:all
-npm run build:admin
-npm run build:builder
-npm run build:chat
-
-# 收集静态文件到 Django
-python main.py collect_static
+## 项目结构
 
-# 启动生产服务(gunicorn + celery)
-python main.py start all
 ```
-
-## 前端开发指南
-
-### 三端完全独立
-
-三个 SPA 各自独立,拥有完整的代码副本:
-- `ui/admin/` — 管理端(系统管理、用户管理、角色权限)
-- `ui/builder/` — 构建端(智能体、知识库、工具、模型、工作流)
-- `ui/chat/` — 访问端(对话界面、用户登录)
-
-### 开发命令
+zhagent/
+├── apps/                          # 后端 Django 应用
+│   ├── maxkb/                     # Django 项目配置(settings/urls/conf)
+│   ├── application/               # 智能体管理(模型/序列化器/API/工作流/对话管道)
+│   ├── knowledge/                 # 知识库(文档/段落/向量检索/样本中心对接)
+│   ├── models_provider/           # 模型提供商(23+ 提供商实现)
+│   ├── tools/                     # 工具管理(自定义/MCP/技能/工作流工具)
+│   ├── trigger/                   # 触发器(定时/事件/Webhook)
+│   ├── plugin/                    # 插件系统(注册/验证/版本/测试)
+│   ├── users/                     # 用户管理
+│   ├── system_manage/             # 系统管理(角色/权限/资源映射)
+│   ├── sso/                       # SSO 单点登录
+│   ├── chat/                      # 对话服务
+│   ├── oss/                       # 文件存储
+│   └── static/                    # 前端构建产物
+├── ui/                            # 前端 Vue 项目
+│   ├── src/
+│   │   ├── views/                 # 页面组件
+│   │   ├── api/                   # API 接口定义
+│   │   ├── router/                # 路由
+│   │   ├── stores/                # Pinia 状态管理
+│   │   ├── workflow/              # 工作流可视化编辑器
+│   │   ├── components/            # 公共组件
+│   │   └── locales/               # 国际化(中/英/繁体)
+│   └── env/                       # 前端环境变量
+├── docker-compose.yml             # Docker 编排文件
+├── Dockerfile                     # 后端镜像构建
+├── nginx.conf                     # Nginx 反向代理配置
+├── .env.example                   # 环境变量模板
+├── config.yml                     # 本地开发配置(不提交到仓库)
+├── README.md                      # 本文件
+├── 部署文档.md                     # Docker 部署指南
+└── 测试文档.md                     # 功能测试用例
+```
+
+## 环境变量说明
+
+所有配置通过项目根目录 `.env` 文件统一管理(Docker 部署时自动读取)。
+
+| 分类 | 变量名 | 说明 | 示例 |
+|------|--------|------|------|
+| 平台 | APP_TITLE | 平台显示名称 | 四川路桥Maas智能体平台 |
+| 平台 | APP_VERSION | 版本号 | v1.0 |
+| 数据库 | DB_HOST | 数据库地址 | 127.0.0.1 |
+| 数据库 | DB_PORT | 数据库端口 | 5432 |
+| 数据库 | DB_USER | 数据库用户 | postgres |
+| 数据库 | DB_PASSWORD | 数据库密码 | (必须修改) |
+| 数据库 | DB_NAME | 数据库名 | maxkb |
+| Redis | REDIS_HOST | Redis 地址 | 127.0.0.1 |
+| Redis | REDIS_PORT | Redis 端口 | 6379 |
+| Redis | REDIS_PASSWORD | Redis 密码 | (可为空) |
+| SSO | SSO_BASE_URL | SSO 认证服务地址 | http://sso-server:8200 |
+| SSO | SSO_CLIENT_ID | SSO 应用标识 | - |
+| SSO | SSO_CLIENT_SECRET | SSO 应用密钥 | - |
+| SSO | SSO_REDIRECT_URI | SSO 回调地址 | http://平台地址/admin/auth/callback |
+| SSO | SSO_LOGOUT_REDIRECT_URL | 登出跳转地址 | - |
+| 样本中心 | SAMPLE_CENTER_BASE_URL | 样本中心地址 | - |
+| 样本中心 | SAMPLE_CENTER_APP_ID | 样本中心应用标识 | - |
+| 样本中心 | SAMPLE_CENTER_APP_SECRET | 样本中心应用密钥 | - |
+| 服务 | DEBUG | 调试模式 | false |
+| 服务 | LANGUAGE_CODE | 默认语言 | zh-CN |
+
+## 本地开发
 
 ```bash
-# 安装依赖
-cd ui && npm run install:all
+# 后端
+cd apps
+# 确保 config.yml 已配置数据库和 Redis 连接
+python main.py dev web      # 启动 Web 服务
+python main.py dev celery   # 启动 Celery Worker(另一个终端)
 
-# 启动单个端
-cd ui && npm run dev:admin    # 管理端 :3000
-cd ui && npm run dev:builder  # 构建端 :3002
-cd ui && npm run dev:chat     # 访问端 :3001
-
-# 同时启动三端
-cd ui && npm run dev:all
+# 前端
+cd ui
+npm install
+npm run dev                 # 启动开发服务器(端口 8080)
 ```
 
-### 新增页面
-
-- 管理端页面:添加到 `ui/admin/src/router/modules/system.ts`
-- 构建端页面:添加到 `ui/builder/src/router/modules/` 对应的模块
-- 访问端页面:添加到 `ui/chat/src/router/chat/routes.ts`
-
-### API 请求
-
-每个端通过 `window.MaxKB.prefix` 动态设置 API 基础路径:
-- 管理端:`/admin/api`
-- 构建端:`/builder/api`
-- 访问端:`/chat/api`
-
-### 注意事项
-
-由于三端代码完全独立,修改共享代码(如组件、样式、工具函数)时需要同步修改三个目录。建议:
-1. 先在一个端修改并验证
-2. 然后复制到其他两个端
-3. 或使用脚本批量同步
-
-## 后端开发指南
-
-### Django Apps
-
-| App | 路径前缀 | 用途 |
-|-----|---------|------|
-| users | `/admin/api/` | 用户管理 |
-| system_manage | `/admin/api/` | 系统管理 |
-| application | `/builder/api/` | 智能体管理 |
-| knowledge | `/builder/api/` | 知识库管理 |
-| tools | `/builder/api/` | 工具管理 |
-| models_provider | `/builder/api/` | 模型管理 |
-| trigger | `/builder/api/` | 触发器 |
-| chat | `/chat/api/` | 聊天 API |
-| oss | 共用 | 文件存储 |
-
-### 新增 Django App
-
-1. 在 `apps/` 下创建 app 目录
-2. 添加到 `apps/maxkb/settings/base/web.py` 的 `INSTALLED_APPS`
-3. 在 `apps/maxkb/urls/web.py` 中注册路由到对应的 API 前缀
-4. 运行 `python main.py upgrade_db` 创建数据库表
-
-### 配置系统
-
-配置优先级:
-1. 环境变量 `MAXKB_*`(需设置 `MAXKB_CONFIG_TYPE=ENV`)
-2. YAML 文件(`config.yml` > `config.yaml` > `config_example.yml`)
-3. 默认值(`apps/maxkb/conf.py` 中 `Config.defaults`)
-
-## 模型供应商
-
-支持 20+ 模型供应商,位于 `apps/models_provider/impl/`:
-
-OpenAI、Anthropic、DeepSeek、Gemini、Qwen、Ollama、Azure、AWS Bedrock、阿里云百炼、火山引擎、腾讯云、SiliconFlow、Kimi、文心一言、讯飞星火、本地模型、vLLM、Xinference、Docker AI、Regolo
-
-## License
-
-MIT License
+前端开发服务器会自动代理 API 请求到后端 8080 端口。

+ 4 - 2
apps/system_manage/serializers/system.py

@@ -15,7 +15,9 @@ from django.core.cache import cache
 from common.constants.cache_version import Cache_Version
 from common.database_model_manage.database_model_manage import DatabaseModelManage
 from common.utils.rsa_util import get_key_pair_by_sql
+from django.conf import settings as django_settings
 from maxkb import settings
+from maxkb.const import CONFIG
 from system_manage.models import SystemSetting
 
 
@@ -42,5 +44,5 @@ class SystemProfileSerializer(serializers.Serializer):
         return {'version': version, 'edition': settings.edition,
                 'license_is_valid': license_is_valid() if license_is_valid() is not None else False,
                 'rsa': get_key_pair_by_sql().get('key'),
-                'app_title': getattr(settings, 'APP_TITLE', '智能体平台'),
-                'app_version': getattr(settings, 'APP_VERSION', 'v1.0')}
+                'app_title': CONFIG.get('APP_TITLE') or '智能体平台',
+                'app_version': CONFIG.get('APP_VERSION') or 'v1.0'}

+ 1 - 1
ui/env/.env.admin

@@ -1,5 +1,5 @@
 VITE_APP_NAME=admin
 VITE_BASE_PATH=/admin/
 VITE_APP_PORT=8080
-VITE_APP_TITLE=网讯Maas智能体平台v1.0
+VITE_APP_TITLE=四川路桥Maas智能体平台v1.0
 VITE_ENTRY="admin.html"

+ 1 - 1
ui/env/.env.builder

@@ -1,5 +1,5 @@
 VITE_APP_NAME=builder
 VITE_BASE_PATH=/builder/
 VITE_APP_PORT=8082
-VITE_APP_TITLE=网讯Maas智能体平台
+VITE_APP_TITLE=四川路桥Maas智能体平台v1.0
 VITE_ENTRY="builder.html"

+ 1 - 1
ui/env/.env.chat

@@ -1,5 +1,5 @@
 VITE_APP_NAME=chat
 VITE_BASE_PATH=/chat/
 VITE_APP_PORT=3001
-VITE_APP_TITLE=网讯Maas智能体平台
+VITE_APP_TITLE=四川路桥Maas智能体平台v1.0
 VITE_ENTRY="chat.html"

+ 15 - 0
ui/src/components/logo/LogoFull.vue

@@ -9,6 +9,7 @@
 <script setup lang="ts">
 import { ref, computed, onMounted } from 'vue'
 import useStore from '@/stores'
+import UserApi from '@/api/user/user'
 defineOptions({ name: 'LogoFull' })
 
 defineProps({
@@ -19,6 +20,20 @@ defineProps({
 })
 const { theme, user } = useStore()
 
+// 如果 store 中还没有 appTitle(未登录状态),主动获取一次
+onMounted(() => {
+  if (!user.appTitle || user.appTitle === '智能体平台') {
+    UserApi.getProfile().then((res: any) => {
+      if (res.data?.app_title) {
+        user.appTitle = res.data.app_title
+      }
+      if (res.data?.app_version) {
+        user.appVersion = res.data.app_version
+      }
+    }).catch(() => {})
+  }
+})
+
 const platformTitle = computed(() => {
   const title = user.appTitle || '智能体平台'
   const version = user.appVersion || ''

+ 0 - 90
启动说明.md

@@ -1,90 +0,0 @@
-# 快速启动
-
-> 完整文档请查看 [README.md](README.md)
-
-## 服务端口
-
-| 服务 | 端口 | 说明 |
-|------|------|------|
-| Admin 管理端 | 3000 | `/admin/` |
-| Chat 访问端 | 3001 | `/chat/` |
-| Builder 构建端 | 3002 | `/builder/` |
-| Django Web | 8080 | REST API |
-| PostgreSQL | 5432 | 数据库 |
-| Redis | 6379 | 缓存 |
-
-## 启动步骤
-
-```bash
-# 1. 安装后端依赖
-uv sync
-
-# 2. 安装前端依赖(三端独立)
-cd ui && npm run install:all
-
-# 3. 配置数据库
-cp config_example.yml config.yml
-# 编辑 config.yml 填写数据库连接信息
-
-# 4. 启动后端
-python main.py dev celery    # 终端 1
-python main.py dev web       # 终端 2
-
-# 5. 启动前端(三端独立)
-cd ui
-npm run dev:admin      # 管理端 :3000
-npm run dev:builder    # 构建端 :3002
-npm run dev:chat       # 访问端 :3001
-
-# 或同时启动三端
-npm run dev:all
-```
-
-## 默认账号
-
-- 用户名:`admin@zhagent.com`
-- 密码:`ZhAgent@980123`
-
-## Windows 一键启动
-
-```bash
-startTools.bat
-# 选择 1 启动全部服务
-```
-
-## 三端独立开发
-
-每个端完全独立,位于 `ui/` 下的独立目录:
-- `ui/admin/` — 管理端(系统管理)
-- `ui/builder/` — 构建端(智能体构建)
-- `ui/chat/` — 访问端(对话访问)
-
-进入对应目录可独立开发:
-```bash
-cd ui/admin && npm run dev    # 仅启动管理端
-cd ui/builder && npm run dev  # 仅启动构建端
-cd ui/chat && npm run dev     # 仅启动访问端
-```
-
-## Docker 部署
-
-```bash
-# 构建前端
-bash build-frontend.sh
-
-# 启动全部服务(PostgreSQL + Redis + Django + Celery + Nginx)
-docker compose up -d
-
-# 查看日志
-docker compose logs -f
-
-# 停止服务
-docker compose down
-```
-
-数据目录(挂载到本地磁盘):
-- `./data/postgresql` — 数据库
-- `./data/redis` — 缓存
-- `./data/uploads` — 上传文件
-
-访问地址:`http://localhost`(Nginx 端口 80)

+ 610 - 0
测试文档.md

@@ -0,0 +1,610 @@
+# 功能测试文档
+
+## 测试说明
+
+本文档为四川路桥 Maas 智能体平台 v1.0 的完整功能测试用例,供测试人员逐项执行验证。
+
+### 测试前准备
+
+1. **平台已部署完成**,可通过浏览器正常访问
+2. **管理员账号**:admin / admin123(或部署时设置的密码)
+3. **AI 模型 API Key**:至少准备一个可用的 LLM 模型 Key(推荐 DeepSeek)和一个 Embedding 模型 Key
+4. **测试文档**:准备 2-3 个测试文件(txt/pdf/docx 格式,内容已知,方便验证检索结果)
+5. **SSO 环境**(如需测试 SSO):确认 SSO 服务可用,已配置好回调地址
+6. **样本中心环境**(如需测试):确认样本中心服务可用,有 App ID 和 Secret
+
+### 测试地址
+
+`http://<部署服务器IP>/admin/`
+
+---
+
+## 一、登录与认证模块
+
+### TC-1.1 账号密码登录(正常流程)
+
+**前置条件:** 未登录状态
+
+| 步骤 | 操作 | 预期结果 |
+|------|------|----------|
+| 1 | 打开平台地址 | 显示登录页面,页面标题显示平台名称 |
+| 2 | 确认页面元素 | 包含:用户名输入框、密码输入框、验证码输入框、验证码图片、登录按钮、SSO 登录按钮 |
+| 3 | 输入正确用户名 admin | - |
+| 4 | 输入正确密码 admin123 | - |
+| 5 | 输入验证码图片中显示的字符 | - |
+| 6 | 点击"登录"按钮 | 登录成功,页面跳转到智能体列表页,左上角显示平台名称 |
+
+### TC-1.2 登录异常场景
+
+| 步骤 | 操作 | 预期结果 |
+|------|------|----------|
+| 1 | 输入正确用户名,错误密码,正确验证码,点击登录 | 提示"用户名或密码错误",不跳转 |
+| 2 | 输入不存在的用户名,点击登录 | 提示"用户名或密码错误" |
+| 3 | 不输入验证码,点击登录 | 表单校验提示验证码必填 |
+| 4 | 输入错误验证码,点击登录 | 提示验证码错误,验证码图片刷新 |
+| 5 | 所有字段为空,点击登录 | 表单校验提示各字段必填 |
+| 6 | 点击验证码图片 | 验证码刷新为新的图片 |
+
+### TC-1.3 SSO 单点登录
+
+**前置条件:** SSO 服务已配置且可用
+
+| 步骤 | 操作 | 预期结果 |
+|------|------|----------|
+| 1 | 在登录页点击"统一认证登录 (SSO)"按钮 | 浏览器跳转到 SSO 认证平台的登录页面 |
+| 2 | 在 SSO 页面输入 SSO 账号密码,完成登录 | SSO 认证成功,浏览器回调到平台 |
+| 3 | 观察回调后的页面 | 自动登录成功,跳转到智能体列表页 |
+| 4 | 首次 SSO 登录的用户 | 系统自动创建本地用户,角色根据 SSO 返回的角色信息映射 |
+
+### TC-1.4 退出登录
+
+| 步骤 | 操作 | 预期结果 |
+|------|------|----------|
+| 1 | 已登录状态,点击右上角用户头像 | 弹出下拉菜单 |
+| 2 | 点击"退出登录" | 跳转到登录页面 |
+| 3 | 退出后,直接在地址栏输入平台内页地址 | 自动跳转到登录页(Token 已清除) |
+| 4 | 退出后,点击浏览器后退按钮 | 不能回到已登录的页面 |
+
+### TC-1.5 Token 过期
+
+| 步骤 | 操作 | 预期结果 |
+|------|------|----------|
+| 1 | 登录后等待 Token 过期(默认 8 小时,可调短测试) | - |
+| 2 | 过期后点击页面中的任意操作 | 自动跳转到登录页,提示需要重新登录 |
+
+---
+
+## 二、模型管理模块
+
+### TC-2.1 查看模型列表
+
+| 步骤 | 操作 | 预期结果 |
+|------|------|----------|
+| 1 | 点击顶部导航栏"模型" | 进入模型管理页面 |
+| 2 | 查看页面内容 | 左侧显示模型提供商列表(OpenAI、DeepSeek、通义千问等),右侧显示已添加的模型 |
+
+### TC-2.2 添加 LLM 模型
+
+| 步骤 | 操作 | 预期结果 |
+|------|------|----------|
+| 1 | 在模型提供商列表中选择一个(如 DeepSeek) | 弹出模型配置对话框 |
+| 2 | 填写 API Key(使用有效的 Key) | - |
+| 3 | 填写 API 地址(如有自定义地址) | - |
+| 4 | 点击"获取模型"或选择模型 | 显示该提供商可用的模型列表 |
+| 5 | 勾选需要的模型(如 deepseek-chat) | - |
+| 6 | 点击"添加" | 模型添加成功,列表中显示新模型,状态为绿色"可用" |
+
+### TC-2.3 添加 Embedding 模型
+
+| 步骤 | 操作 | 预期结果 |
+|------|------|----------|
+| 1 | 选择支持 Embedding 的提供商 | 弹出配置对话框 |
+| 2 | 填写 API Key | - |
+| 3 | 选择 Embedding 类型的模型 | - |
+| 4 | 点击添加 | Embedding 模型添加成功(后续创建知识库时需要) |
+
+### TC-2.4 模型异常场景
+
+| 步骤 | 操作 | 预期结果 |
+|------|------|----------|
+| 1 | 使用无效的 API Key 添加模型 | 模型状态显示红色"不可用" |
+| 2 | 删除一个已被智能体使用的模型 | 提示该模型正在被使用,确认是否删除 |
+| 3 | 编辑模型,修改为无效 Key | 模型状态变为"不可用" |
+
+---
+
+## 三、知识库模块
+
+### TC-3.1 创建通用知识库
+
+**前置条件:** 已添加至少一个 Embedding 模型
+
+| 步骤 | 操作 | 预期结果 |
+|------|------|----------|
+| 1 | 点击顶部导航"知识库" | 进入知识库列表页 |
+| 2 | 点击右上角"创建"按钮 | 弹出下拉菜单,显示多种知识库类型 |
+| 3 | 选择"通用知识库" | 弹出创建对话框 |
+| 4 | 输入知识库名称(如"测试知识库") | - |
+| 5 | 输入描述(可选) | - |
+| 6 | 在"向量模型"下拉中选择已添加的 Embedding 模型 | 下拉列表显示可用模型 |
+| 7 | 点击"创建" | 创建成功,自动跳转到该知识库的文档管理页 |
+
+### TC-3.2 上传文档
+
+**前置条件:** 已创建知识库
+
+| 步骤 | 操作 | 预期结果 |
+|------|------|----------|
+| 1 | 在知识库文档页,点击"上传文档" | 跳转到文档上传页面 |
+| 2 | 点击选择文件或拖拽文件到上传区域 | 文件出现在待上传列表中 |
+| 3 | 上传一个 txt 文件 | 文件显示在列表中 |
+| 4 | 上传一个 pdf 文件 | 文件显示在列表中 |
+| 5 | 上传一个 docx 文件 | 文件显示在列表中 |
+| 6 | 查看分段预览(如有) | 显示文档将被切分的段落预览 |
+| 7 | 点击"开始上传"或"确认" | 上传成功,返回文档列表页 |
+| 8 | 查看文档状态 | 初始显示"向量化中",等待后变为"已完成" |
+
+### TC-3.3 文档段落管理
+
+| 步骤 | 操作 | 预期结果 |
+|------|------|----------|
+| 1 | 在文档列表中点击某个文档名称 | 进入段落列表页,显示该文档的所有段落 |
+| 2 | 查看段落内容 | 每个段落显示文本内容、字符数、状态 |
+| 3 | 点击某个段落的"编辑" | 可修改段落内容 |
+| 4 | 修改内容后保存 | 保存成功,内容更新 |
+| 5 | 点击"新增段落" | 可添加新的段落 |
+| 6 | 填写内容后保存 | 新段落出现在列表中 |
+| 7 | 选中一个段落,点击"删除" | 确认后段落删除 |
+| 8 | 切换段落的"启用/禁用"状态 | 禁用的段落不参与检索 |
+
+### TC-3.4 命中测试
+
+**前置条件:** 知识库中有已向量化完成的文档
+
+| 步骤 | 操作 | 预期结果 |
+|------|------|----------|
+| 1 | 在知识库中找到"命中测试"功能入口 | 进入命中测试页面 |
+| 2 | 在输入框中输入一个与文档内容相关的问题 | - |
+| 3 | 点击"测试"按钮 | 返回匹配的段落列表 |
+| 4 | 查看结果 | 每条结果显示:段落内容、相似度分数、所属文档 |
+| 5 | 修改"相似度阈值"为更高的值(如 0.8) | 结果数量减少(只保留高相似度的) |
+| 6 | 修改"Top N"为 1 | 只返回最匹配的 1 条结果 |
+| 7 | 切换搜索模式为"关键词检索" | 使用关键词匹配,结果可能不同 |
+| 8 | 切换搜索模式为"混合检索" | 综合向量和关键词的结果 |
+| 9 | 输入一个与文档完全无关的问题 | 返回空结果或相似度很低的结果 |
+
+### TC-3.5 知识库管理操作
+
+| 步骤 | 操作 | 预期结果 |
+|------|------|----------|
+| 1 | 在知识库列表中,点击某个知识库的"编辑" | 可修改名称和描述 |
+| 2 | 修改后保存 | 保存成功 |
+| 3 | 选中文档 → 点击"向量化" | 重新向量化任务启动 |
+| 4 | 选中文档 → 点击"删除" | 确认后文档删除 |
+| 5 | 删除整个知识库 | 确认后知识库及所有文档、段落全部删除 |
+
+### TC-3.6 样本中心知识库
+
+**前置条件:** 样本中心服务可用
+
+| 步骤 | 操作 | 预期结果 |
+|------|------|----------|
+| 1 | 创建 → 选择"样本中心知识库" | 弹出连接配置对话框(步骤一) |
+| 2 | 填写 API 地址 | - |
+| 3 | 填写 App ID | - |
+| 4 | 填写 App Secret | - |
+| 5 | 点击"连接" | 连接成功,进入步骤二,显示样本中心的知识库列表 |
+| 6 | 连接失败场景:填写错误的地址或密钥 | 提示连接失败 |
+| 7 | 在列表中选择一个知识库,点击"选择" | 进入步骤三,显示创建表单 |
+| 8 | 确认知识库名称(默认为样本中心知识库名称) | - |
+| 9 | 选择向量模型 | - |
+| 10 | 点击"创建" | 本地知识库创建成功,跳转到文档页 |
+| 11 | 上传文档到该知识库 | 上传成功(与普通知识库相同) |
+| 12 | 选中文档 → 点击"推送到样本中心" | 弹出推送确认对话框 |
+| 13 | 确认目标知识库信息,点击"确认推送" | 任务提交成功,显示进度信息 |
+| 14 | 观察任务进度 | 状态从"等待处理"→"处理中"→"已完成" |
+| 15 | 任务完成后查看结果 | 显示成功条数和失败条数 |
+
+
+---
+
+## 四、智能体模块
+
+### TC-4.1 创建简单智能体
+
+**前置条件:** 已添加至少一个 LLM 模型
+
+| 步骤 | 操作 | 预期结果 |
+|------|------|----------|
+| 1 | 点击顶部导航"智能体" | 进入智能体列表页 |
+| 2 | 点击"创建" | 弹出创建对话框 |
+| 3 | 选择"简易模式" | - |
+| 4 | 输入智能体名称(如"测试助手") | - |
+| 5 | 选择 AI 模型 | 下拉显示已添加的 LLM 模型 |
+| 6 | 点击"创建" | 创建成功,进入智能体设置页 |
+| 7 | 在"系统提示词"中输入提示词(如"你是一个友好的助手") | - |
+| 8 | 点击保存 | 保存成功 |
+
+### TC-4.2 智能体关联知识库
+
+**前置条件:** 已创建知识库且有已向量化的文档
+
+| 步骤 | 操作 | 预期结果 |
+|------|------|----------|
+| 1 | 在智能体设置页,找到"知识库"配置区域 | - |
+| 2 | 点击"添加知识库" | 弹出知识库选择列表 |
+| 3 | 勾选要关联的知识库 | - |
+| 4 | 确认 | 知识库关联成功,显示在配置中 |
+| 5 | 保存智能体设置 | 保存成功 |
+
+### TC-4.3 智能体对话调试
+
+| 步骤 | 操作 | 预期结果 |
+|------|------|----------|
+| 1 | 在智能体页面点击"调试"按钮 | 打开对话调试窗口 |
+| 2 | 输入"你好" | 智能体正常回复问候 |
+| 3 | 输入与知识库内容相关的问题 | 回复中引用了知识库的内容 |
+| 4 | 查看回复中的"来源"标记 | 显示引用的段落来源 |
+| 5 | 连续发送多条消息 | 上下文连贯,智能体记住之前的对话 |
+| 6 | 点击"新建对话" | 清空历史,开始全新对话 |
+| 7 | 查看左侧对话历史列表 | 显示之前的对话记录 |
+
+### TC-4.4 创建高级智能体(工作流模式)
+
+| 步骤 | 操作 | 预期结果 |
+|------|------|----------|
+| 1 | 创建智能体 → 选择"工作流模式" | 创建成功,进入工作流可视化编辑器 |
+| 2 | 查看默认工作流 | 画布上显示默认节点(开始→AI对话→直接回复) |
+| 3 | 点击"AI 对话"节点 | 右侧弹出节点配置面板 |
+| 4 | 选择模型、填写提示词 | - |
+| 5 | 保存节点配置 | 配置保存成功 |
+| 6 | 从左侧节点面板拖拽"知识库检索"节点到画布 | 节点出现在画布上 |
+| 7 | 删除原有连线,重新连接:开始→知识库检索→AI对话→直接回复 | 连线成功 |
+| 8 | 配置"知识库检索"节点(选择知识库) | 配置保存 |
+| 9 | 点击右上角"调试" | 打开调试对话窗口 |
+| 10 | 发送一条消息 | 工作流按顺序执行,返回结果 |
+| 11 | 查看执行详情 | 显示每个节点的输入、输出、耗时 |
+
+### TC-4.5 工作流节点测试
+
+| 步骤 | 操作 | 预期结果 |
+|------|------|----------|
+| 1 | 添加"条件判断"节点 | 节点添加成功,可配置条件 |
+| 2 | 添加"工具调用"节点 | 节点添加成功,可选择工具 |
+| 3 | 添加"参数提取"节点 | 节点添加成功,可配置提取规则 |
+| 4 | 删除一个节点 | 节点及其连线删除 |
+| 5 | 撤销操作 | 恢复删除的节点 |
+| 6 | 保存工作流 | 保存成功 |
+
+### TC-4.6 智能体发布
+
+| 步骤 | 操作 | 预期结果 |
+|------|------|----------|
+| 1 | 进入智能体 → "概览"页面 | 显示发布配置 |
+| 2 | 开启"公开访问"开关 | 生成公开访问链接 |
+| 3 | 复制链接,在新的浏览器窗口(未登录状态)打开 | 显示对话界面,可正常发送消息和接收回复 |
+| 4 | 设置"访问次数限制"为 5 | 保存成功 |
+| 5 | 在公开链接中发送超过 5 次消息 | 第 6 次提示访问次数已用完 |
+| 6 | 开启"白名单",添加一个 IP 地址 | 保存成功 |
+| 7 | 从非白名单 IP 访问公开链接 | 拒绝访问 |
+| 8 | 关闭"公开访问"开关 | 公开链接不再可用 |
+
+### TC-4.7 智能体版本管理
+
+| 步骤 | 操作 | 预期结果 |
+|------|------|----------|
+| 1 | 修改工作流后点击"发布" | 弹出发布确认,创建新版本 |
+| 2 | 再次修改工作流并发布 | 又创建一个新版本 |
+| 3 | 查看版本列表 | 显示所有历史版本及发布时间 |
+| 4 | 选择一个历史版本,点击"回滚" | 工作流恢复到该版本的状态 |
+
+---
+
+## 五、工具管理模块
+
+### TC-5.1 创建自定义工具
+
+| 步骤 | 操作 | 预期结果 |
+|------|------|----------|
+| 1 | 点击顶部导航"工具" | 进入工具列表页 |
+| 2 | 点击"创建" → "自定义工具" | 弹出工具编辑对话框 |
+| 3 | 输入工具名称(如"获取当前时间") | - |
+| 4 | 输入工具描述 | - |
+| 5 | 在代码编辑器中编写 Python 代码 | 如:`import datetime; return {"time": str(datetime.datetime.now())}` |
+| 6 | 定义输入参数(如无参数可跳过) | - |
+| 7 | 点击"调试" | 弹出调试面板 |
+| 8 | 点击"执行" | 返回当前时间,执行成功 |
+| 9 | 点击"保存" | 工具保存成功,出现在列表中 |
+
+### TC-5.2 工具在智能体中使用
+
+| 步骤 | 操作 | 预期结果 |
+|------|------|----------|
+| 1 | 进入一个智能体的设置页 | - |
+| 2 | 在"工具"配置区域,点击添加 | 弹出工具选择列表 |
+| 3 | 勾选刚创建的工具 | - |
+| 4 | 保存 | 工具关联成功 |
+| 5 | 在对话中问"现在几点了" | 智能体调用工具,返回当前时间 |
+
+### TC-5.3 MCP 工具
+
+| 步骤 | 操作 | 预期结果 |
+|------|------|----------|
+| 1 | 创建 → "MCP 工具" | 弹出 MCP 配置对话框 |
+| 2 | 填写 MCP 服务地址和配置 | - |
+| 3 | 测试连接 | 显示连接状态(成功/失败) |
+| 4 | 保存 | MCP 工具添加成功 |
+
+### TC-5.4 工具管理操作
+
+| 步骤 | 操作 | 预期结果 |
+|------|------|----------|
+| 1 | 编辑已有工具的代码 | 修改保存成功 |
+| 2 | 删除工具 | 确认后删除成功 |
+| 3 | 启用/禁用工具 | 状态切换成功 |
+
+---
+
+## 六、触发器模块
+
+### TC-6.1 访问触发器页面
+
+| 步骤 | 操作 | 预期结果 |
+|------|------|----------|
+| 1 | 点击右上角的触发器图标(闪电图标) | 进入触发器管理页面 |
+| 2 | 查看页面 | 显示触发器列表(可能为空) |
+
+### TC-6.2 创建定时触发器
+
+| 步骤 | 操作 | 预期结果 |
+|------|------|----------|
+| 1 | 点击"创建" | 弹出创建对话框 |
+| 2 | 选择"定时触发" | 显示定时配置选项 |
+| 3 | 选择关联的智能体或工具 | - |
+| 4 | 配置执行周期(如"每 5 分钟执行一次") | - |
+| 5 | 配置输入参数(如有) | - |
+| 6 | 点击保存 | 触发器创建成功,状态为"启用" |
+| 7 | 等待触发时间到达 | 触发器自动执行 |
+| 8 | 查看执行记录 | 显示执行时间、状态(成功/失败)、执行结果 |
+
+### TC-6.3 创建事件触发器(Webhook)
+
+| 步骤 | 操作 | 预期结果 |
+|------|------|----------|
+| 1 | 创建 → 选择"事件触发" | 显示事件配置选项 |
+| 2 | 选择关联的智能体或工具 | - |
+| 3 | 保存 | 创建成功,页面显示生成的 Webhook URL |
+| 4 | 复制 Webhook URL | - |
+| 5 | 使用 Postman 或 curl 向该 URL 发送 POST 请求 | 触发器被触发执行 |
+| 6 | 查看执行记录 | 显示本次触发的执行记录 |
+
+### TC-6.4 触发器管理
+
+| 步骤 | 操作 | 预期结果 |
+|------|------|----------|
+| 1 | 禁用一个触发器 | 状态变为"禁用" |
+| 2 | 禁用后等待触发时间 | 不再自动执行 |
+| 3 | 重新启用 | 状态变为"启用",恢复执行 |
+| 4 | 编辑触发器配置 | 修改保存成功 |
+| 5 | 删除触发器 | 确认后删除成功 |
+| 6 | 批量选中多个触发器 → 批量删除 | 批量删除成功 |
+
+
+---
+
+## 七、系统管理模块
+
+### TC-7.1 用户管理
+
+| 步骤 | 操作 | 预期结果 |
+|------|------|----------|
+| 1 | 点击右上角头像 → "系统管理" → "用户管理" | 进入用户管理页面,显示用户列表 |
+| 2 | 点击"创建用户" | 弹出创建表单 |
+| 3 | 填写用户名(如 testuser) | - |
+| 4 | 填写密码 | - |
+| 5 | 选择角色为"普通用户" | - |
+| 6 | 点击确认 | 用户创建成功,列表中显示新用户 |
+| 7 | 退出当前账号,用新用户登录 | 登录成功 |
+| 8 | 新用户查看页面 | 只能看到被授权的资源(初始可能为空) |
+| 9 | 切回 admin 账号,编辑 testuser 的信息 | 修改成功 |
+| 10 | 禁用 testuser | 状态变为禁用 |
+| 11 | 尝试用 testuser 登录 | 登录失败,提示账号已禁用 |
+| 12 | 重新启用 testuser | 可以正常登录 |
+| 13 | 删除 testuser | 确认后删除成功 |
+
+### TC-7.2 角色管理
+
+| 步骤 | 操作 | 预期结果 |
+|------|------|----------|
+| 1 | 进入"系统管理" → "角色管理" | 显示角色列表 |
+| 2 | 查看系统内置角色 | 包含:管理员、工作空间管理员、普通用户 |
+| 3 | 查看各角色的权限说明 | 显示权限范围 |
+
+### TC-7.3 资源授权
+
+| 步骤 | 操作 | 预期结果 |
+|------|------|----------|
+| 1 | 进入"系统管理" → "资源授权" | 显示资源授权页面 |
+| 2 | 选择资源类型"知识库" | 显示知识库资源列表 |
+| 3 | 选择一个知识库,点击"授权" | 弹出用户选择 |
+| 4 | 选择 testuser,授予"查看"权限 | 授权成功 |
+| 5 | 用 testuser 登录 | 能看到被授权的知识库 |
+| 6 | testuser 尝试删除该知识库 | 无权限,操作被拒绝 |
+| 7 | admin 取消 testuser 的授权 | 取消成功 |
+| 8 | testuser 刷新页面 | 该知识库不再显示 |
+
+### TC-7.4 修改密码
+
+| 步骤 | 操作 | 预期结果 |
+|------|------|----------|
+| 1 | 点击右上角头像 → "修改密码" | 弹出修改密码对话框 |
+| 2 | 输入旧密码 | - |
+| 3 | 输入新密码和确认密码 | - |
+| 4 | 点击确认 | 密码修改成功 |
+| 5 | 退出后用新密码登录 | 登录成功 |
+| 6 | 用旧密码登录 | 登录失败 |
+
+---
+
+## 八、插件管理模块
+
+### TC-8.1 创建插件
+
+| 步骤 | 操作 | 预期结果 |
+|------|------|----------|
+| 1 | 进入插件管理页面 | 显示插件列表 |
+| 2 | 点击"创建插件" | 弹出创建表单 |
+| 3 | 填写插件名称(如"测试插件") | - |
+| 4 | 填写插件编码(如"test_plugin",唯一标识) | - |
+| 5 | 选择插件类型(工具插件/知识库插件/模型插件/自定义) | - |
+| 6 | 填写描述 | - |
+| 7 | 填写版本号(如"1.0.0") | - |
+| 8 | 填写 Schema(JSON 格式的配置结构定义) | - |
+| 9 | 点击确认 | 插件创建成功 |
+| 10 | 尝试创建相同编码的插件 | 提示编码已存在 |
+
+### TC-8.2 插件生命周期管理
+
+| 步骤 | 操作 | 预期结果 |
+|------|------|----------|
+| 1 | 查看新创建的插件状态 | 状态为"未安装" |
+| 2 | 点击"安装" | 状态变为"已启用" |
+| 3 | 点击"禁用" | 状态变为"已禁用" |
+| 4 | 点击"启用" | 状态恢复为"已启用" |
+| 5 | 点击"卸载" | 状态变为"未安装" |
+| 6 | 点击"重装"(安装) | 状态变为"已启用" |
+
+### TC-8.3 插件版本管理
+
+| 步骤 | 操作 | 预期结果 |
+|------|------|----------|
+| 1 | 进入插件详情页 | 显示插件信息和版本列表 |
+| 2 | 点击"创建新版本" | 弹出版本创建表单 |
+| 3 | 填写版本号(如"1.1.0")和更新日志 | - |
+| 4 | 确认 | 新版本创建成功,插件当前版本更新 |
+| 5 | 查看版本列表 | 显示 1.0.0 和 1.1.0 两个版本 |
+| 6 | 选择 1.0.0 版本,点击"回滚" | 插件配置恢复到 1.0.0 版本 |
+| 7 | 确认当前版本号 | 显示为 1.0.0 |
+
+### TC-8.4 插件测试
+
+| 步骤 | 操作 | 预期结果 |
+|------|------|----------|
+| 1 | 在插件详情页点击"测试" | 弹出测试执行面板 |
+| 2 | 填写测试输入参数 | - |
+| 3 | 点击"执行测试" | 返回测试结果(通过/失败、耗时、输出数据) |
+| 4 | 查看测试历史 | 显示历史测试记录列表 |
+| 5 | 点击某条记录查看详情 | 显示完整的输入、输出、错误信息 |
+
+### TC-8.5 Schema 验证
+
+| 步骤 | 操作 | 预期结果 |
+|------|------|----------|
+| 1 | 在插件创建/编辑时,填写无效的 Schema(如缺少必填字段) | - |
+| 2 | 提交验证 | 返回具体的验证错误信息 |
+| 3 | 修正 Schema 后重新提交 | 验证通过 |
+
+---
+
+## 九、对话功能模块
+
+### TC-9.1 基础对话
+
+| 步骤 | 操作 | 预期结果 |
+|------|------|----------|
+| 1 | 进入智能体调试页面 | 显示对话界面 |
+| 2 | 发送"你好" | 智能体回复问候语 |
+| 3 | 发送一个知识性问题 | 智能体正常回答 |
+| 4 | 观察回复过程 | 流式输出,逐字显示 |
+| 5 | 发送多轮对话(引用上文内容) | 智能体理解上下文,回复连贯 |
+
+### TC-9.2 知识库增强对话
+
+**前置条件:** 智能体已关联知识库
+
+| 步骤 | 操作 | 预期结果 |
+|------|------|----------|
+| 1 | 发送与知识库文档内容直接相关的问题 | 回复引用知识库内容,可能显示来源标记 |
+| 2 | 发送与知识库完全无关的问题 | 根据"无引用时"配置:AI 自行回答或提示无相关信息 |
+| 3 | 发送模糊相关的问题 | 智能体综合知识库内容和自身能力回答 |
+
+### TC-9.3 对话历史
+
+| 步骤 | 操作 | 预期结果 |
+|------|------|----------|
+| 1 | 进行一段对话后,点击"新建对话" | 开始新的对话,之前的对话保存 |
+| 2 | 在左侧对话列表中点击之前的对话 | 恢复显示之前的对话内容 |
+| 3 | 删除一条对话记录 | 确认后删除成功 |
+
+### TC-9.4 公开链接对话
+
+| 步骤 | 操作 | 预期结果 |
+|------|------|----------|
+| 1 | 获取智能体的公开访问链接 | - |
+| 2 | 在无痕浏览器窗口打开链接 | 显示对话界面(无需登录) |
+| 3 | 发送消息 | 正常回复 |
+| 4 | 刷新页面 | 对话历史保留(基于浏览器存储) |
+
+---
+
+## 十、其他功能
+
+### TC-10.1 多语言切换
+
+| 步骤 | 操作 | 预期结果 |
+|------|------|----------|
+| 1 | 点击右上角语言切换(或登录页右上角) | 显示语言选项 |
+| 2 | 切换为"English" | 界面文字变为英文 |
+| 3 | 切换为"繁體中文" | 界面文字变为繁体中文 |
+| 4 | 切换回"简体中文" | 界面恢复简体中文 |
+| 5 | 刷新页面 | 语言设置保持不变 |
+
+### TC-10.2 文件夹管理
+
+| 步骤 | 操作 | 预期结果 |
+|------|------|----------|
+| 1 | 在知识库/智能体/工具列表页,点击"创建文件夹" | 弹出文件夹命名对话框 |
+| 2 | 输入文件夹名称,确认 | 文件夹创建成功 |
+| 3 | 将资源拖拽或移动到文件夹中 | 移动成功 |
+| 4 | 重命名文件夹 | 修改成功 |
+| 5 | 删除空文件夹 | 删除成功 |
+
+### TC-10.3 平台名称配置验证
+
+| 步骤 | 操作 | 预期结果 |
+|------|------|----------|
+| 1 | 查看登录页标题 | 显示 .env 中配置的 APP_TITLE + APP_VERSION |
+| 2 | 查看浏览器标签页标题 | 显示前端 env 中配置的 VITE_APP_TITLE |
+| 3 | 登录后查看左上角 Logo 文字 | 显示 APP_TITLE + APP_VERSION |
+
+---
+
+## 测试结果汇总
+
+| 模块 | 用例数 | 通过 | 失败 | 阻塞 | 备注 |
+|------|--------|------|------|------|------|
+| 一、登录认证 | 15 | | | | |
+| 二、模型管理 | 9 | | | | 需要有效 API Key |
+| 三、知识库 | 30 | | | | 样本中心需对应环境 |
+| 四、智能体 | 28 | | | | 需要模型和知识库就绪 |
+| 五、工具管理 | 12 | | | | |
+| 六、触发器 | 13 | | | | |
+| 七、系统管理 | 17 | | | | |
+| 八、插件管理 | 15 | | | | |
+| 九、对话功能 | 10 | | | | |
+| 十、其他 | 8 | | | | |
+| **合计** | **157** | | | | |
+
+---
+
+## 缺陷记录
+
+| 编号 | 模块 | 用例编号 | 问题描述 | 复现步骤 | 严重程度 | 状态 |
+|------|------|----------|----------|----------|----------|------|
+| BUG-001 | | | | | 致命/严重/一般/轻微 | 新建/已确认/已修复/已关闭 |
+
+**严重程度定义:**
+- 致命:系统崩溃、数据丢失、核心功能完全不可用
+- 严重:核心功能异常、影响主流程、无法绕过
+- 一般:非核心功能异常、有替代方案可绕过
+- 轻微:UI 显示问题、文案错误、不影响功能使用

+ 387 - 0
部署文档.md

@@ -0,0 +1,387 @@
+# 部署文档
+
+## 一、环境要求
+
+| 项目 | 最低要求 | 推荐配置 |
+|------|----------|----------|
+| 操作系统 | CentOS 7+ / Ubuntu 20.04+ / Windows Server 2019+ | Ubuntu 22.04 LTS |
+| Docker | 24.0+ | 最新稳定版 |
+| Docker Compose | v2.20+(随 Docker 一起安装) | 最新稳定版 |
+| CPU | 2 核 | 4 核+ |
+| 内存 | 4 GB | 8 GB+(模型推理和向量化需要更多内存) |
+| 磁盘 | 20 GB | 50 GB+(知识库文档和向量数据会持续增长) |
+| 网络 | 能访问外部模型 API | 带宽 10Mbps+ |
+
+**端口占用:**
+- 80:Nginx(HTTP 访问入口)
+- 5432:PostgreSQL(仅容器内部通信,可不对外暴露)
+- 6379:Redis(仅容器内部通信,可不对外暴露)
+- 8080:Django Web(仅容器内部通信,Nginx 反向代理)
+
+---
+
+## 二、部署步骤
+
+### 第一步:安装 Docker
+
+**Ubuntu / Debian:**
+```bash
+# 安装 Docker
+curl -fsSL https://get.docker.com | sh
+
+# 启动并设置开机自启
+systemctl enable docker
+systemctl start docker
+
+# 验证安装
+docker --version
+docker compose version
+```
+
+**CentOS / RHEL:**
+```bash
+yum install -y yum-utils
+yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
+yum install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
+systemctl enable docker
+systemctl start docker
+```
+
+**Windows Server:**
+- 安装 Docker Desktop for Windows
+- 或使用 WSL2 + Docker Engine
+
+---
+
+### 第二步:获取项目代码
+
+```bash
+# 克隆代码到服务器
+git clone <仓库地址> /opt/zhagent
+cd /opt/zhagent
+```
+
+如果服务器无法访问 Git 仓库,可以在开发机打包后上传:
+```bash
+# 开发机上打包
+tar -czf zhagent.tar.gz --exclude='.venv' --exclude='node_modules' --exclude='.git' zhagent/
+
+# 上传到服务器后解压
+tar -xzf zhagent.tar.gz -C /opt/
+cd /opt/zhagent
+```
+
+---
+
+### 第三步:配置环境变量
+
+```bash
+cp .env.example .env
+vim .env
+```
+
+**必须修改的配置:**
+
+```ini
+# ===== 平台名称 =====
+APP_TITLE=四川路桥Maas智能体平台
+APP_VERSION=v1.0
+
+# ===== 数据库密码(务必修改为强密码)=====
+DB_PASSWORD=YourStrongPassword123!
+
+# ===== SSO 配置(如需单点登录)=====
+SSO_BASE_URL=http://your-sso-server:8200
+SSO_CLIENT_ID=your_client_id
+SSO_CLIENT_SECRET=your_client_secret
+SSO_REDIRECT_URI=http://your-platform-domain/admin/auth/callback
+SSO_LOGOUT_REDIRECT_URL=http://your-sso-server/login
+
+# ===== 样本中心(如需对接)=====
+SAMPLE_CENTER_BASE_URL=http://sample-center-server:port
+SAMPLE_CENTER_APP_ID=your_app_id
+SAMPLE_CENTER_APP_SECRET=your_app_secret
+```
+
+**可选修改:**
+```ini
+# 关闭调试模式(生产环境必须关闭)
+DEBUG=false
+
+# 数据存储路径(默认在项目目录下的 data/)
+DATA_PATH=./data
+UPLOAD_PATH=./data/uploads
+```
+
+---
+
+### 第四步:构建前端(自定义平台名称时需要)
+
+如果需要修改浏览器标签页显示的标题,需要重新构建前端。如果使用默认名称可跳过此步。
+
+```bash
+# 需要 Node.js 18+ 环境
+# 安装 Node.js(如服务器没有)
+curl -fsSL https://deb.nodesource.com/setup_18.x | bash -
+apt-get install -y nodejs
+
+# 修改前端标题
+sed -i 's/VITE_APP_TITLE=.*/VITE_APP_TITLE=四川路桥Maas智能体平台v1.0/' ui/env/.env.admin
+sed -i 's/VITE_APP_TITLE=.*/VITE_APP_TITLE=四川路桥Maas智能体平台v1.0/' ui/env/.env.chat
+sed -i 's/VITE_APP_TITLE=.*/VITE_APP_TITLE=四川路桥Maas智能体平台v1.0/' ui/env/.env.builder
+
+# 安装依赖并构建
+cd ui
+npm install
+npm run build-only-admin
+npm run build-only-chat
+npm run build-only-builder
+
+# 复制构建产物
+cp -r dist/admin/* ../apps/static/admin/
+cp -r dist/chat/* ../apps/static/chat/
+cp -r dist/builder/* ../apps/static/builder/
+cd ..
+```
+
+> **提示:** 也可以在开发机构建好后,将 `apps/static/` 目录一起打包部署,服务器上就不需要 Node.js 环境。
+
+---
+
+### 第五步:一键启动
+
+```bash
+docker compose up -d
+```
+
+首次启动会自动:
+1. 拉取基础镜像(python:3.11-slim、postgres:16、redis:7、nginx:alpine)
+2. 构建后端应用镜像
+3. 启动所有容器
+4. 自动执行数据库迁移
+5. 创建默认管理员账号
+
+整个过程约 3-10 分钟(取决于网络速度和服务器性能)。
+
+---
+
+### 第六步:验证部署
+
+```bash
+# 1. 查看容器状态(全部 Up 即正常)
+docker compose ps
+
+# 预期输出:
+# zhagent-db       Up (healthy)
+# zhagent-redis    Up (healthy)
+# zhagent-web      Up
+# zhagent-celery   Up
+# zhagent-nginx    Up
+
+# 2. 等待后端完全启动(约 30-60 秒)
+docker compose logs web --tail 5
+# 看到 SQL 查询日志或 "Listening" 字样即启动完成
+
+# 3. 测试 API
+curl http://localhost/admin/api/profile
+# 应返回 JSON:{"code":200,"data":{"app_title":"四川路桥Maas智能体平台",...}}
+```
+
+---
+
+### 第七步:访问平台
+
+浏览器打开:`http://<服务器IP>/admin/`
+
+- **默认管理员账号:** admin
+- **默认密码:** admin123
+- **首次登录后请立即修改密码**
+
+---
+
+## 三、服务说明
+
+| 容器名 | 服务 | 作用 |
+|--------|------|------|
+| zhagent-nginx | Nginx | HTTP 入口,反向代理 API 请求,托管前端静态文件 |
+| zhagent-web | Django | 后端 API 服务,处理所有业务逻辑 |
+| zhagent-celery | Celery Worker | 异步任务执行(文档向量化、定时触发器、数据同步等) |
+| zhagent-db | PostgreSQL + pgvector | 关系数据存储 + 向量检索 |
+| zhagent-redis | Redis | 缓存 + 消息队列(Celery Broker) |
+
+---
+
+## 四、数据持久化
+
+所有数据存储在宿主机目录,容器删除后数据不会丢失:
+
+| 数据类型 | 宿主机路径 | 说明 |
+|----------|-----------|------|
+| 数据库文件 | `${DATA_PATH}/postgresql/` | PostgreSQL 数据文件 |
+| Redis 数据 | `${DATA_PATH}/redis/` | Redis 持久化文件 |
+| 上传文件 | `${UPLOAD_PATH}/` | 用户上传的文档、图片等 |
+
+默认 `DATA_PATH=./data`,即项目目录下的 `data/` 文件夹。
+
+---
+
+## 五、日常运维
+
+### 查看日志
+```bash
+# 后端日志
+docker compose logs -f web
+
+# 异步任务日志
+docker compose logs -f celery
+
+# 所有服务日志
+docker compose logs -f
+
+# 只看最近 100 行
+docker compose logs --tail 100 web
+```
+
+### 重启服务
+```bash
+# 重启后端(修改代码或配置后)
+docker compose restart web celery
+
+# 重启所有服务
+docker compose restart
+
+# 完全停止所有服务
+docker compose down
+
+# 停止并删除数据卷(⚠️ 会丢失所有数据)
+docker compose down -v
+```
+
+### 重新构建
+```bash
+# 代码更新后重新构建镜像并启动
+docker compose up -d --build
+
+# 只重新构建后端
+docker compose build web celery
+docker compose up -d --force-recreate web celery
+```
+
+### 进入容器调试
+```bash
+# 进入后端容器
+docker exec -it zhagent-web bash
+
+# 进入数据库
+docker exec -it zhagent-db psql -U postgres -d maxkb
+
+# 执行 Django 管理命令
+docker exec -it zhagent-web python manage.py shell
+```
+
+### 数据库备份与恢复
+```bash
+# 备份
+docker exec zhagent-db pg_dump -U postgres maxkb > backup_$(date +%Y%m%d_%H%M%S).sql
+
+# 恢复
+cat backup_20260522.sql | docker exec -i zhagent-db psql -U postgres maxkb
+
+# 建议设置定时备份(crontab)
+# 每天凌晨 2 点自动备份
+0 2 * * * cd /opt/zhagent && docker exec zhagent-db pg_dump -U postgres maxkb > backups/backup_$(date +\%Y\%m\%d).sql
+```
+
+---
+
+## 六、升级流程
+
+```bash
+cd /opt/zhagent
+
+# 1. 备份数据库(重要!)
+docker exec zhagent-db pg_dump -U postgres maxkb > backup_before_upgrade_$(date +%Y%m%d).sql
+
+# 2. 拉取最新代码
+git pull origin master
+
+# 3. 如有前端变更,重新构建前端
+cd ui && npm install && npm run build-only-admin
+cp -r dist/admin/* ../apps/static/admin/
+cd ..
+
+# 4. 重新构建镜像并重启
+docker compose up -d --build
+
+# 5. 等待启动完成后验证
+sleep 30
+curl http://localhost/admin/api/profile
+```
+
+---
+
+## 七、HTTPS 配置(生产环境推荐)
+
+### 方式一:使用 Let's Encrypt 免费证书
+
+```bash
+# 安装 certbot
+apt install -y certbot
+
+# 获取证书(需要域名已解析到服务器)
+certbot certonly --standalone -d your-domain.com
+
+# 修改 nginx.conf 添加 SSL 配置
+```
+
+### 方式二:使用已有证书
+
+将证书文件放到服务器上,修改 `nginx.conf`:
+
+```nginx
+server {
+    listen 443 ssl;
+    server_name your-domain.com;
+    
+    ssl_certificate /path/to/cert.pem;
+    ssl_certificate_key /path/to/key.pem;
+    
+    # ... 其余配置不变
+}
+
+server {
+    listen 80;
+    return 301 https://$host$request_uri;
+}
+```
+
+修改 `docker-compose.yml` 中 nginx 的端口映射和证书挂载。
+
+---
+
+## 八、常见问题排查
+
+| 现象 | 可能原因 | 解决方法 |
+|------|----------|----------|
+| 访问返回 502 Bad Gateway | 后端还在启动中(初始化约 30-60 秒) | 等待后重试,或 `docker compose logs web` 查看进度 |
+| 登录页面空白 | 前端静态文件缺失 | 确认 `apps/static/admin/index.html` 存在,重新构建前端 |
+| 登录提示密码错误 | 密码不正确 | 进入数据库重置:`UPDATE "user" SET password=md5('新密码') WHERE username='admin'` |
+| SSO 登录回调报错 | 回调地址配置不匹配 | 检查 `.env` 中 `SSO_REDIRECT_URI` 与 SSO 平台配置一致 |
+| 知识库向量化一直"处理中" | Celery Worker 异常 | `docker compose logs celery` 查看错误,`docker compose restart celery` |
+| 容器启动后立即退出 | 端口被占用或配置错误 | `docker compose logs <容器名>` 查看具体错误 |
+| 数据库连接失败 | 密码不匹配或数据库未就绪 | 确认 `.env` 中密码正确,等待 db 容器 healthy |
+| 上传文件失败 | 磁盘空间不足或权限问题 | `df -h` 检查磁盘,确认 uploads 目录可写 |
+| 模型调用失败 | API Key 无效或网络不通 | 检查模型配置的 API Key,确认服务器能访问模型 API |
+
+---
+
+## 九、安全加固建议
+
+1. **修改默认密码**:部署后立即修改 admin 密码和数据库密码
+2. **关闭调试模式**:`.env` 中设置 `DEBUG=false`
+3. **配置 HTTPS**:生产环境必须使用 HTTPS
+4. **限制端口暴露**:`docker-compose.yml` 中去掉 db 和 redis 的 ports 映射(仅内部通信)
+5. **防火墙配置**:只开放 80/443 端口
+6. **定期备份**:设置 crontab 每日自动备份数据库
+7. **日志监控**:关注 ERROR 级别日志,建议接入日志收集系统
+8. **更新维护**:定期更新依赖包,修复安全漏洞