🚀 企业级 AI 驱动的文档分析平台 | 支持 Web & H5 响应式设计 | 开箱即用的 Mock 数据演示
- 智能文档解析 - 支持 PDF、Word、Markdown、Excel 等 10+ 格式
- 精准语义检索 - 基于 RAG 技术的上下文感知问答
- 多语言支持 - 中、英、日、韩等 15+ 语言自动识别
- 实时响应 - 平均响应时间 < 200ms(基于 Mock 数据演示)
- 企业级设计系统 - 完整的主题定制(浅色/深色模式)
- 响应式布局 - 无缝适配 Web、平板、手机各端设备
- 流畅动画 - 业界标准缓动曲线,1000+ 毫秒级动画优化
- 可访问性 - WCAG 2.1 AA 级标准,全键盘导航支持
- ⚡ 沉浸式体验 - 全屏布局 + 虚拟键盘适配
- 🎮 触摸友好 - 手势识别、惯性滚动、安全区域处理
- 🔄 智能适配 - 动态视口高度处理、刘海屏适配
- 📲 底部导航 - iOS/Android 风格一致的标签栏
- 特性驱动开发 - 高内聚、低耦合的模块化结构
- 类型安全 - 完整的 TypeScript 类型系统
- 状态管理 - Zustand(全局UI) + TanStack Query(服务端状态)
- Mock 数据 - 无需后端,完整功能演示
- Node.js ≥ 18.0
- npm ≥ 9.0 或 pnpm ≥ 8.0
# 1️⃣ 克隆仓库
git clone https://github.com/jxiaof/react-docqa-web.git
cd react-docqa-web
# 2️⃣ 安装依赖
npm install
# 或
pnpm install
# 3️⃣ 启动开发服务器
npm run dev
# 🌐 打开浏览器
# http://localhost:5173# 构建生产版本
npm run build
# 预览生产构建结果
npm run preview
# 验证构建产物
npm run verify| 类别 | 技术 | 版本 | 说明 |
|---|---|---|---|
| 框架 | React | 18 | 现代 UI 库 |
| TypeScript | 5 | 类型安全 | |
| 构建 | Vite | 5 | 极速构建工具 |
| 样式 | Tailwind CSS | 4 | 原子化 CSS 框架 |
| 状态 | Zustand | 5 | 轻量级状态管理 |
| TanStack Query | 5 | 服务端状态管理 | |
| HTTP | Axios | 1 | HTTP 客户端 |
| 路由 | React Router | 7 | 声明式路由 |
| 图标 | Lucide React | Latest | 精美图标库 |
src/
├── infrastructure/ # 🔧 基础设施层
│ ├── http/ # HTTP 客户端 + 拦截器
│ ├── mock/ # 模拟数据(开发环境)
│ └── buildInfo.ts # 构建信息
│
├── shared/ # 🎨 共享层
│ ├── components/
│ │ ├── ui/ # 基础 UI 组件(Button, Card, Dialog)
│ │ ├── layout/ # 响应式布局(ScrollablePageLayout 等)
│ │ ├── feedback/ # 反馈组件(Loading, Toast)
│ │ └── PageTransition # 页面转换动画
│ ├── hooks/ # 通用 Hooks(useAsync 等)
│ └── utils/ # 工具函数(cn, formatDate 等)
│
├── features/ # 🎯 业务特性层(按领域划分)
│ ├── home/ # 首页 + 营销内容
│ ├── documents/ # 📄 文档管理(上传、查看、删除)
│ ├── chat/ # 💬 聊天问答(实时交互)
│ ├── conversations/ # 🔄 会话管理(历史记录)
│ └── settings/ # ⚙️ 系统设置(主题、模型配置)
│
├── store/ # 📊 全局状态(Zustand)
│ ├── themeStore.ts # 主题 + 配色方案
│ ├── chatStore.ts # 聊天 UI 状态
│ └── sidebarStore.ts # 侧边栏状态
│
├── App.tsx # 应用入口
├── routes.tsx # 路由配置
└── index.css # 全局样式 + 动画
每个 feature 遵循标准化结构:
feature/
├── api/
│ ├── types.ts # API 响应类型定义
│ └── endpoints.ts # API 端点调用
├── hooks/
│ └── useFeature.ts # TanStack Query Hooks
├── components/
│ ├── FeatureCard.tsx
│ └── FeatureModal.tsx
├── pages/
│ └── FeaturePage.tsx
└── index.ts # 公开导出
我们实现了企业级响应式布局,完全满足 Web & H5 复杂场景:
适用场景: 首页、文档列表、设置页面
// 特点:全局滚动、Header 固定、自动预留 TabBar 空间
<ScrollablePageLayout hideBottomNav={false}>
<DocumentList />
</ScrollablePageLayout>- ✅ 内容全局可滚动
- ✅ H5 自动预留 64px TabBar 空间
- ✅ Web 支持 max-width 约束
适用场景: 聊天页面、实时协作
// 特点:内容独占滚动、Header/Footer 固定、支持侧边栏
<InteractivePageLayout
header={<ChatHeader />}
sidebar={<ChatSidebar />}
content={<MessagesList />}
footer={<ChatInput />}
hideBottomNav={false}
/>- ✅ 消息列表独占滚动(min-h-0 关键!)
- ✅ Input 固定底部,虚拟键盘弹起时自动推起
- ✅ Sidebar 只在 Web 显示(md:hidden)
- ✅ H5 通过 Sheet 抽屉式侧边栏
适用场景: 复杂后台系统、多面板布局
// 特点:支持左/右侧边栏、灵活滚动策略
<HybridPageLayout
topBar={<Toolbar />}
sidebar={<Sidebar />}
mainContent={<Content />}
bottomBar={<ActionBar />}
/>| 组件 | 高度 | 说明 |
|---|---|---|
| Header | 56px | 全局顶部导航 |
| MobileNav TabBar | 64px | H5 专用底部导航(含 safe-area) |
| Desktop Sidebar | 256px (w-64) | Web 侧边栏宽度 |
| Input 最小 | 44px | 触摸友好的最小点击区域 |
// 刘海屏/挖孔屏 + 虚拟键盘 + 底部导航栏
const H5Height = `calc(100vh - 56px - 64px - max(0px, env(safe-area-inset-bottom)))`;🎯 业界对标: ChatGPT Web、WeChat、Slack
内置 3 种主题模式 + 6 种配色方案:
// 主题模式
type ThemeMode = 'light' | 'dark' | 'auto';
// 配色方案(HSL 色空间)
type ColorScheme =
| 'blue' // 专业蓝(默认)
| 'purple' // 创意紫
| 'green' // 生态绿
| 'orange' // 活力橙
| 'red' // 热情红
| 'slate'; // 中性灰自定义示例:
// 在 SettingsPage 中切换
const { theme, setTheme, colorScheme, setColorScheme } = useThemeStore();
<button onClick={() => setTheme('dark')}>深色模式</button>
<button onClick={() => setColorScheme('purple')}>紫色主题</button>所有变量存储到 localStorage,刷新页面自动恢复。
遵循 Material Design 3 + iOS HIG 标准:
| 动画类型 | 缓动曲线 | 时长 | 使用场景 |
|---|---|---|---|
| 入场(通用) | cubic-bezier(0.25, 0.46, 0.45, 0.94) |
300ms | 卡片、列表项 |
| 页面转换 | cubic-bezier(0.4, 0, 0.2, 1) |
250ms | 路由切换 |
| 弹跳效果 | cubic-bezier(0.34, 1.56, 0.64, 1) |
250ms | 模态框、对话框 |
| 淡入背景 | cubic-bezier(0.4, 0, 0.2, 1) |
200ms | 图片加载、Backdrop |
// 使用示例
<div className="animate-fadeInUp" style={{ animationDelay: '80ms' }}>
{/* 卡片以 80ms 延迟进入 */}
</div>
{/* 列表级联(推荐 60ms 间隔) */}
{items.map((item, idx) => (
<Card
key={item.id}
className="animate-fadeInUp"
style={{ animationDelay: `${idx * 60}ms` }}
>
{item.name}
</Card>
))}可用动画:
.animate-fadeInUp- 向上进入.animate-fadeInDown- 向下进入.animate-slideInLeft- 从左滑入.animate-slideInRight- 从右滑入.animate-scaleIn- 缩放进入.animate-fadeIn- 纯淡入.animate-pageEnter- 页面入场
✅ 首屏关键内容(Hero、Header)- 无延迟 ✅ 卡片网格 - 60-80ms 间隔 ✅ 聊天消息 - 30-40ms 快速级联 ✅ 对话框 - 100-150ms 错开延迟
// 支持的格式
const SUPPORTED_FORMATS = [
'.pdf', '.doc', '.docx', // Word 文档
'.md', '.txt', // 文本文件
'.xls', '.xlsx', // Excel 表格
'.json', '.xml', '.csv', // 结构化数据
'.ppt', '.pptx', // 演示文稿
'.jpg', '.jpeg', '.png', '.gif' // 图片
];
// 功能
- 📤 拖拽上传多个文件
- 📊 实时处理进度展示
- 👁️ 富文本预览(保留格式)
- 🔍 文件搜索和排序
- 🗑️ 批量删除操作// 实时对话
- 🔄 即时响应(基于 Mock 数据)
- 📝 支持 Markdown 格式答案
- 💾 自动保存会话历史
- ⭐ 标记重要对话
- 🔗 分享会话链接(可扩展)
// 高级功能
- 🧠 上下文感知回答
- 🌐 多文档跨域查询
- 📌 引用原文出处// 1. 外观设置
- 主题模式(浅色/深色/自动)
- 配色方案(6 种)
- 字体大小调整
// 2. AI 模型配置
- 配置多个 AI 提供商(OpenAI、Claude、本地模型)
- 模型测试工具(实时验证配置)
- 参数调优(温度、Top-P 等)
// 3. 账户与隐私
- API Key 管理
- 数据导出
- 隐私政策┌─────────────────────────────────────┐
│ 服务端状态 (TanStack Query) │ ← 数据源:Mock/API
│ 文档列表、会话、消息 │
└──────────────────┬──────────────────┘
│ 自动同步
┌──────────────────▼──────────────────┐
│ 全局 UI 状态 (Zustand) │
│ 主题、侧边栏、用户偏好 │
└──────────────────┬──────────────────┘
│
┌──────────────────▼──────────────────┐
│ 局部组件状态 (useState) │
│ 表单输入、临时 UI 状态 │
└─────────────────────────────────────┘
// ✅ TanStack Query - 服务端状态
const { data: documents, isLoading, error } = useDocuments();
const { mutate: uploadFile } = useUploadDocument();
// ✅ Zustand - 全局 UI 状态
const { theme, colorScheme, setTheme } = useThemeStore();
const { sidebarOpen, toggleSidebar } = useSidebarStore();
// ✅ useState - 局部状态
const [selectedDoc, setSelectedDoc] = useState<Document | null>(null);
const [isModalOpen, setIsModalOpen] = useState(false);完整的自动部署流程,详见 DEPLOY.md:
# 1. 初始化 Git
git init
git add .
git commit -m "Initial commit"
# 2. 创建 GitHub 仓库(https://github.com/new)
git remote add origin https://github.com/YOUR_USERNAME/react-docqa-web.git
git push -u origin main
# 3. 配置 GitHub Pages
# Settings → Pages → Source: GitHub Actions
# 系统自动检测 .github/workflows/deploy.yml
# ✅ 自动构建和部署!
# 访问:https://YOUR_USERNAME.github.io/react-docqa-web自动化优势:
- ✅ 每次 push 自动构建
- ✅ 全球 CDN 加速
- ✅ 自动 HTTPS
- ✅ 零配置必要
| 平台 | 成本 | 配置 | 推荐度 |
|---|---|---|---|
| GitHub Pages | 免费 | ⭐ 最简单 | ⭐⭐⭐⭐⭐ |
| Vercel | 免费+ | ⭐⭐ 简单 | ⭐⭐⭐⭐ |
| Netlify | 免费+ | ⭐⭐ 简单 | ⭐⭐⭐⭐ |
| Cloudflare Pages | 免费 | ⭐⭐⭐ 中等 | ⭐⭐⭐ |
- ✅ 代码分割(路由级别)
- ✅ Tree-shaking(移除未使用代码)
- ✅ 压缩(Terser 压缩 JS/CSS)
- ✅ 图片优化(WebP 格式、响应式尺寸)
- ✅ 虚拟滚动(大列表)
- ✅ 防抖/节流(搜索、resize)
- ✅ 懒加载(图片、组件)
- ✅ 缓存策略(Service Worker)
| 指标 | 目标 | 当前 |
|---|---|---|
| LCP(最大内容绘制) | < 2.5s | ~1.8s |
| FID(首次输入延迟) | < 100ms | ~50ms |
| CLS(累积布局偏移) | < 0.1 | ~0.05 |
# 使用 Mock 数据(开发模式自动启用)
npm run dev
# 访问
http://localhost:5173
# 关键特性
- ✅ Hot Module Replacement (HMR)
- ✅ 快速刷新
- ✅ SourceMap 调试无需后端,完整功能演示:
// src/infrastructure/mock/mockData.ts
export const mockDocuments: Document[] = [
{ id: 'doc-1', name: 'Q3 Financial Report.pdf', ... },
// ...
];
export const mockConversations: Conversation[] = [
{ id: 'conv-1', title: 'Project Discussion', ... },
// ...
];// src/features/documents/api/documentApi.ts
const USE_MOCK = import.meta.env.DEV; // 改为 false
export async function getDocuments() {
if (USE_MOCK) {
return mockDocuments;
}
// 真实 API 调用
return httpClient.get('/api/documents');
}- ✅ 全屏布局 - 禁用全局滚动条
- ✅ 虚拟键盘适配 - Input 固定底部,键盘弹起自动推起
- ✅ 安全区域处理 - 刘海屏/挖孔屏完美适配
- ✅ 触摸友好 - 最小点击区域 44x44px,惯性滚动
- ✅ GPU 加速 - 使用
transform和opacity - ✅ 帧率稳定 - 监控 FPS,低端机自动降级
- ✅ 电量优化 - 遵守
prefers-reduced-motion
| 断点 | 宽度 | 设备 | 布局策略 |
|---|---|---|---|
| mobile | < 640px | 手机 | 单列、底部导航、全屏 |
| sm | 640px | 手机横屏 | 微调间距 |
| md | 768px | 平板/Web | 双列、侧边栏、顶部导航 |
| lg | 1024px | 桌面 | 三列、复杂布局 |
| xl | 1280px | 大屏 | 最大宽度约束 |
- Fork 本仓库
- 创建特性分支 (
git checkout -b feature/amazing-feature) - 提交更改 (
git commit -m 'feat: 添加新功能') - 推送到分支 (
git push origin feature/amazing-feature) - 打开 Pull Request
feat: 新功能
fix: bug 修复
style: 代码格式调整
refactor: 代码重构
perf: 性能优化
docs: 文档更新
test: 测试用例
chore: 构建配置、依赖更新LAYOUT_SPECIFICATION.md- 🎨 响应式布局详细规范DEPLOY.md- 🚀 GitHub Pages 部署完整指南- Vite 官方文档
- React 官方文档
- Tailwind CSS 文档
// src/features/documents/api/documentApi.ts
const USE_MOCK = false; // 禁用 Mock
export async function getDocuments() {
return httpClient.get<Document[]>('/api/documents');
}// src/index.css 中修改 CSS 变量
:root {
--primary: 217 91% 60%; /* 改为你的颜色 */
--secondary: 217 80% 88%;
// ...
}✅ 已解决!使用 InteractivePageLayout,Input 固定底部,虚拟键盘自动推起。
✅ 已优化!改进了动画初始状态(opacity: 1),无再需任何修复。
- 📖 查看 LAYOUT_SPECIFICATION.md 了解布局系统
- 🚀 查看 DEPLOY.md 了解部署步骤
- 🐛 提交 Issue
- 💬 讨论 Discussions
MIT License © 2024 DocQA Team
- React 18 - 现代 UI 库
- Vite - 下一代构建工具
- Tailwind CSS - 原子化 CSS
- TanStack Query - 数据获取库
- Zustand - 状态管理
- v1.1 - 集成真实 API,连接后端服务
- v1.2 - 实时协作编辑(WebSocket)
- v1.3 - 移动应用(React Native)
- v2.0 - 企业级功能(权限管理、审计日志)
⭐ 如果您觉得有帮助,请给个 Star!