# 主应用界面
1. 目的与范围 #
本文档详细介绍Ragflow-Plus的主应用界面实现,包括基于React的用户前端应用和基于Vue.js的管理仪表盘。主应用界面提供聊天交互、文档管理、知识库访问等核心功能,而管理仪表盘提供系统管理、用户管理、配置管理等管理功能。
关于底层API详情,请参阅 API参考。关于前端应用的部署配置,请参阅 部署与配置。关于对话系统实现,请参阅 对话与对话系统。
2. 界面架构概述 #
Ragflow-Plus实现了双前端架构,使用不同的技术栈服务于不同的用户角色和使用场景。
2.1 前端应用架构 #
┌─────────────────────────────────────────┐
│ 用户前端应用 (User Frontend) │
│ ┌──────────┐ ┌──────────┐ ┌──────┐ │
│ │ 主应用 │ │ 聊天界面 │ │编写界面│ │
│ │ React+TS │ │ Chat UI │ │Write │ │
│ └──────────┘ └──────────┘ └──────┘ │
│ ┌──────────┐ ┌──────────┐ ┌──────┐ │
│ │知识库界面 │ │ 字体系统 │ │国际化│ │
│ │ KB UI │ │ Font │ │ I18n │ │
│ └──────────┘ └──────────┘ └──────┘ │
└─────────────────────────────────────────┘
↕
┌─────────────────────────────────────────┐
│ 管理前端应用 (Admin Frontend) │
│ ┌──────────┐ ┌──────────┐ ┌──────┐ │
│ │管理仪表盘 │ │Element │ │文件上传│ │
│ │ Vue.js │ │Plus组件 │ │Upload│ │
│ └──────────┘ └──────────┘ └──────┘ │
│ ┌──────────┐ ┌──────────┐ ┌──────┐ │
│ │路由管理 │ │状态管理 │ │HTTP │ │
│ │ Router │ │ Pinia │ │Axios │ │
│ └──────────┘ └──────────┘ └──────┘ │
└─────────────────────────────────────────┘2.2 组件交互流程 #
主应用界面的组件交互遵循以下流程:
用户 → Chat界面 → ChatContainer → MessageInput
↓
DialogService
↓
RAG Engine
↓
响应生成
↓
ChatContainer显示3. 主应用界面实现 #
主应用界面基于React和TypeScript构建,提供集成的聊天交互、文档管理和知识库访问体验。
3.1 聊天界面实现 #
聊天系统由多个关键组件协同工作,提供对话式RAG体验:
| 组件 | 文件路径 | 用途 |
|---|---|---|
Chat |
web/src/pages/chat/index.tsx |
主聊天页面协调器 |
ChatContainer |
web/src/pages/chat/chat-container/index.tsx |
消息显示和输入处理 |
MessageInput |
@/components/message-input |
支持文件上传的用户输入 |
MessageItem |
@/components/message-item |
单个消息渲染 |
PdfDrawer |
@/components/pdf-drawer |
文档引用查看器 |
聊天界面支持以下高级功能:
- 动态字体大小:通过
useSafeLocalStorageState实现持久化存储 - 实时流式响应:服务器发送事件实现实时响应生成
- 文档引用:可点击的源文档引用,支持PDF预览
- 对话管理:多对话支持,支持重命名和删除操作
- 助手配置:自定义AI助手创建,支持知识库选择
聊天状态管理:
// From web/src/pages/chat/index.tsx
const {
value,
ref,
loading,
sendLoading,
derivedMessages,
handleInputChange,
handlePressEnter,
regenerateMessage,
removeMessageById,
stopOutputMessage,
} = useSendNextMessage(controller);3.2 字体大小管理系统 #
聊天界面包含一个完善的字体大小管理系统,用于可访问性:
用户字体调整
↓
FontStorageUtil (font-storage.ts)
↙ ↘
localStorage Cookie备份
(chatFontSize) (30天过期)
↓ ↓
ChatContainer (CSS变量)
↓
消息渲染 (动态字体大小)字体系统提供:
- 持久化存储:主要使用localStorage,Cookie作为备用
- 默认回退:当没有存储值时,默认使用18px
- CSS集成:使用CSS自定义属性实现动态大小调整
- 跨会话一致性:Cookie 30天过期,确保持久性
实现细节:
// From web/src/utils/font-storage.ts
export const FontStorageUtil = {
getFontSize: () => {
// 从localStorage读取,失败则从Cookie读取
// 都没有则返回默认值18px
},
setFontSize: (size: number) => {
// 同时写入localStorage和Cookie
}
};4. 管理仪表盘 #
管理界面使用Vue.js和Element Plus组件,提供全面的系统管理能力。
4.1 管理界面架构 #
管理应用 (management/web/src/)
↙ ↓ ↘
Vue Router Pinia Store Element Plus UI
↓ ↓ ↓
HTTP层 (Axios Instance)
↙ ↓ ↘
Auth拦截器 错误处理 后端API
↓ ↓ ↓
Management API Ragflow Core API4.2 Element Plus组件集成 #
管理仪表盘利用全面的Element Plus组件集:
| 组件类别 | 组件 | 用途 |
|---|---|---|
| 数据展示 | ElTable, ElTableColumn, ElPagination |
用户列表、文件管理、系统日志 |
| 表单控件 | ElForm, ElFormItem, ElInput, ElSelect |
配置表单、用户创建 |
| 导航 | ElMenu, ElMenuItem, ElSubMenu |
主导航、嵌套菜单结构 |
| 反馈 | ElDialog, ElDrawer, ElAlert |
模态对话框、通知 |
| 文件上传 | ElUpload, ElProgress |
文档上传、进度跟踪 |
4.3 高级文件上传系统 #
管理界面包含一个支持大文件和批量操作的高级文件上传系统:
上传配置:
// From management/web/src/common/composables/useFileUpload.ts
interface FileUploadConfig {
chunkSize: number; // 分块大小
maxConcurrent: number; // 最大并发数
retryAttempts: number; // 重试次数
onProgress: (progress: number) => void;
onComplete: (fileId: string) => void;
onError: (error: Error) => void;
}功能特性:
- 分块上传:支持大文件分块上传
- 进度跟踪:实时上传进度显示
- 队列管理:多文件上传队列管理
- 错误处理:自动重试和错误恢复
- 并发控制:限制同时上传的文件数量
上传流程:
文件选择
↓
useFileUpload composable
↙ ↘
分块上传 进度跟踪
↓ ↓
后端API 队列管理
↓
上传完成5. 技术实现细节 #
5.1 React应用架构 #
主应用使用以下技术栈:
- 框架:React 18+ with TypeScript
- 路由:React Router
- 状态管理:React Hooks + Context API
- HTTP客户端:Axios
- 样式:Less/CSS Modules
5.2 Vue.js应用架构 #
管理仪表盘使用以下技术栈:
- 框架:Vue 3 + TypeScript
- 路由:Vue Router
- 状态管理:Pinia
- UI组件库:Element Plus
- HTTP客户端:Axios with interceptors
5.3 HTTP客户端配置 #
管理前端Axios配置:
// From management/web/src/http/axios.ts
const axiosInstance = axios.create({
baseURL: import.meta.env.VITE_API_BASE_URL,
timeout: 30000,
});
// 请求拦截器 - 添加JWT token
axiosInstance.interceptors.request.use((config) => {
const token = getToken();
if (token) {
config.headers.Authorization = `Bearer ${token}`;
}
return config;
});
// 响应拦截器 - 错误处理
axiosInstance.interceptors.response.use(
(response) => response.data,
(error) => {
// 统一错误处理
handleError(error);
return Promise.reject(error);
}
);6. 最佳实践 #
6.1 组件设计原则 #
- 单一职责:每个组件只负责一个功能
- 可复用性:通用组件提取到共享目录
- 类型安全:使用TypeScript确保类型安全
- 性能优化:使用React.memo和useMemo优化渲染
6.2 状态管理 #
- 本地状态:使用useState管理组件内部状态
- 共享状态:使用Context API或Pinia管理全局状态
- 持久化:重要状态使用localStorage或Cookie持久化
6.3 错误处理 #
- 统一错误处理:在HTTP拦截器中统一处理错误
- 用户友好提示:使用Element Plus的ElMessage显示错误信息
- 错误日志:记录错误日志便于调试
7. 总结 #
主应用界面通过双前端架构实现了用户功能和管理功能的清晰分离。React主应用提供流畅的用户体验,Vue.js管理仪表盘提供强大的管理能力。两个应用通过统一的API接口与后端通信,实现了系统的完整功能。
通过合理的组件设计、状态管理和错误处理,系统提供了稳定、高效、用户友好的界面体验。