Skip to content

jxiaof/react-proj

Repository files navigation

📄 DocQA - 智能文档问答系统

🚀 企业级 AI 驱动的文档分析平台 | 支持 Web & H5 响应式设计 | 开箱即用的 Mock 数据演示

React TypeScript Vite Tailwind CSS License

✨ 核心特性

🎯 AI 驱动功能

  • 智能文档解析 - 支持 PDF、Word、Markdown、Excel 等 10+ 格式
  • 精准语义检索 - 基于 RAG 技术的上下文感知问答
  • 多语言支持 - 中、英、日、韩等 15+ 语言自动识别
  • 实时响应 - 平均响应时间 < 200ms(基于 Mock 数据演示)

💻 专业 UI/UX

  • 企业级设计系统 - 完整的主题定制(浅色/深色模式)
  • 响应式布局 - 无缝适配 Web、平板、手机各端设备
  • 流畅动画 - 业界标准缓动曲线,1000+ 毫秒级动画优化
  • 可访问性 - WCAG 2.1 AA 级标准,全键盘导航支持

📱 H5 优化(业界领先)

  • 沉浸式体验 - 全屏布局 + 虚拟键盘适配
  • 🎮 触摸友好 - 手势识别、惯性滚动、安全区域处理
  • 🔄 智能适配 - 动态视口高度处理、刘海屏适配
  • 📲 底部导航 - 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 复杂场景:

1️⃣ ScrollablePageLayout(数据展示类)

适用场景: 首页、文档列表、设置页面

// 特点:全局滚动、Header 固定、自动预留 TabBar 空间
<ScrollablePageLayout hideBottomNav={false}>
  <DocumentList />
</ScrollablePageLayout>
  • ✅ 内容全局可滚动
  • ✅ H5 自动预留 64px TabBar 空间
  • ✅ Web 支持 max-width 约束

2️⃣ InteractivePageLayout(实时交互类)

适用场景: 聊天页面、实时协作

// 特点:内容独占滚动、Header/Footer 固定、支持侧边栏
<InteractivePageLayout
  header={<ChatHeader />}
  sidebar={<ChatSidebar />}
  content={<MessagesList />}
  footer={<ChatInput />}
  hideBottomNav={false}
/>
  • ✅ 消息列表独占滚动(min-h-0 关键!)
  • ✅ Input 固定底部,虚拟键盘弹起时自动推起
  • ✅ Sidebar 只在 Web 显示(md:hidden)
  • ✅ H5 通过 Sheet 抽屉式侧边栏

3️⃣ HybridPageLayout(混合类)

适用场景: 复杂后台系统、多面板布局

// 特点:支持左/右侧边栏、灵活滚动策略
<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 触摸友好的最小点击区域

H5 安全区域处理

// 刘海屏/挖孔屏 + 虚拟键盘 + 底部导航栏
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 错开延迟

⚠️ 总动画时长 - 不超过 800ms


🎯 核心功能演示

📄 文档管理

// 支持的格式
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);

🌐 部署

GitHub Pages(推荐)

完整的自动部署流程,详见 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 调试

Mock 数据

无需后端,完整功能演示:

// 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', ... },
  // ...
];

切换到真实 API

// 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');
}

📱 H5 优化亮点

沉浸式设计

  • 全屏布局 - 禁用全局滚动条
  • 虚拟键盘适配 - Input 固定底部,键盘弹起自动推起
  • 安全区域处理 - 刘海屏/挖孔屏完美适配
  • 触摸友好 - 最小点击区域 44x44px,惯性滚动

动画优化

  • GPU 加速 - 使用 transformopacity
  • 帧率稳定 - 监控 FPS,低端机自动降级
  • 电量优化 - 遵守 prefers-reduced-motion

响应式断点

断点 宽度 设备 布局策略
mobile < 640px 手机 单列、底部导航、全屏
sm 640px 手机横屏 微调间距
md 768px 平板/Web 双列、侧边栏、顶部导航
lg 1024px 桌面 三列、复杂布局
xl 1280px 大屏 最大宽度约束

🤝 贡献指南

提交 Pull Request

  1. Fork 本仓库
  2. 创建特性分支 (git checkout -b feature/amazing-feature)
  3. 提交更改 (git commit -m 'feat: 添加新功能')
  4. 推送到分支 (git push origin feature/amazing-feature)
  5. 打开 Pull Request

提交规范

feat:     新功能
fix:      bug 修复
style:    代码格式调整
refactor: 代码重构
perf:     性能优化
docs:     文档更新
test:     测试用例
chore:    构建配置、依赖更新

📚 文档


🛠️ 常见问题

Q1: 如何集成真实 API?

// src/features/documents/api/documentApi.ts
const USE_MOCK = false; // 禁用 Mock

export async function getDocuments() {
  return httpClient.get<Document[]>('/api/documents');
}

Q2: 如何自定义主题颜色?

// src/index.css 中修改 CSS 变量
:root {
  --primary: 217 91% 60%;     /* 改为你的颜色 */
  --secondary: 217 80% 88%;
  // ...
}

Q3: H5 输入框被键盘遮挡?

✅ 已解决!使用 InteractivePageLayout,Input 固定底部,虚拟键盘自动推起。

Q4: 页面一闪一闪?

✅ 已优化!改进了动画初始状态(opacity: 1),无再需任何修复。


📞 获取帮助


📄 许可

MIT License © 2024 DocQA Team


🌟 特别鸣谢


🎯 Roadmap

  • v1.1 - 集成真实 API,连接后端服务
  • v1.2 - 实时协作编辑(WebSocket)
  • v1.3 - 移动应用(React Native)
  • v2.0 - 企业级功能(权限管理、审计日志)

⭐ 如果您觉得有帮助,请给个 Star!

访问在线演示: https://YOUR_USERNAME.github.io/react-docqa-web

About

react-proj

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages