系统架构

前端架构

EduBuddy 前端是一个基于 React 18 + TypeScript + Vite 构建的单页应用(SPA),采用 Ant Design 作为 UI 组件库,ECharts 绘制可视化图表,Zustand 管理全局状态。

技术栈

技术版本用途
React18.xUI 框架,函数组件 + Hooks
TypeScript5.x类型安全
Vite8.x构建工具,HMR 开发体验
React Router6.x客户端路由
Ant Design5.xUI 组件库(表单、表格、模态框等)
ECharts / echarts-for-react5.x折线图、雷达图、饼图等可视化
Zustand4.x轻量全局状态管理
Axios1.xHTTP 请求客户端
react-markdown9.x渲染 AI 返回的 Markdown 内容

目录结构

frontend/src/
├── App.tsx              # 根组件,路由配置
├── index.tsx            # 应用入口,挂载 React
├── index.css            # 全局样式
├── components/
│   └── layout/
│       └── MainLayout.tsx   # 主布局(侧边栏 + 顶部栏 + Outlet)
├── pages/               # 页面级组件(与路由一一对应)
│   ├── DashboardPage.tsx
│   ├── QuestionsPage.tsx
│   ├── PracticePage.tsx
│   ├── LearningPathsPage.tsx
│   ├── ProgressPage.tsx
│   ├── UploadPage.tsx
│   ├── SharingPage.tsx
│   ├── ProfilePage.tsx
│   ├── LoginPage.tsx
│   └── RegisterPage.tsx
├── services/
│   └── api.ts           # 所有 API 调用封装
└── store/
    └── useStore.ts      # Zustand 全局状态

路由设计

采用 React Router v6 嵌套路由,通过路由守卫实现权限控制:

// 路由结构
/login          → LoginPage(PublicRoute,已登录跳 /dashboard)
/register       → RegisterPage(PublicRoute)
/               → MainLayout(PrivateRoute,未登录跳 /login)
  /dashboard    → DashboardPage
  /questions    → QuestionsPage
  /practice     → PracticePage
  /practice/:id → PracticePage(指定题目)
  /learning-paths → LearningPathsPage
  /progress     → ProgressPage
  /upload       → UploadPage
  /sharing      → SharingPage
  /profile      → ProfilePage

路由守卫

全局状态管理(Zustand)

useStore.ts 使用 Zustand + persist 中间件持久化用户状态:

interface AppState {
  user: User | null;          // 当前登录用户信息
  token: string | null;       // JWT Token
  isAuthenticated: boolean;   // 是否已登录
  sidebarCollapsed: boolean;  // 侧边栏折叠状态

  // Actions
  setUser(user, token): void   // 登录后调用
  logout(): void               // 清除状态和 localStorage
  toggleSidebar(): void
  updateUser(updates): void    // 更新个人资料后调用
}

持久化策略:仅持久化 usertokenisAuthenticated 三个字段到 localStorage(key: ai-student-store),UI 状态(sidebarCollapsed)不持久化。

API 服务层

services/api.ts 使用 Axios 封装所有接口调用,分为 6 个命名空间:

命名空间说明
authAPI登录、注册、获取/更新用户信息、修改密码
questionAPI题目 CRUD、AI 生成、AI 解题、提交答案
progressAPI知识点掌握度、每日统计、AI 分析、评估报告
pathAPI学习路线 CRUD、AI 生成、报名、进度更新
uploadAPIPDF/图片/语音/文本上传解析
sharingAPI分享、收件箱、发件箱、标记已读

Axios 拦截器

主布局组件(MainLayout)

MainLayout.tsx 是登录后所有页面的外层容器,包含:

可视化图表

进度页面(ProgressPage.tsx)使用 echarts-for-react 渲染三种图表:

图表类型数据来源展示内容
折线图(Line)GET /api/progress/daily-stats近 30 天每日练习题数 + 学习时长
雷达图(Radar)GET /api/progress/mastery各知识点掌握度(0-100%)
饼图(Pie)GET /api/progress/subject-distribution各学科练习占比

Markdown 渲染

AI 返回的解题过程、学习路线节点内容、评估报告均为 Markdown 格式,使用 react-markdown + remark-gfm 插件渲染,支持表格、代码块、数学公式(需额外插件)。

语音朗读(TTS)

答题页面通过浏览器原生 Web Speech APIwindow.speechSynthesis)实现文字转语音朗读,无需额外依赖或 API 费用。语言设置为 zh-CN(中文普通话)。

Web Speech API 的语音朗读功能依赖浏览器和操作系统内置的 TTS 引擎,在不同平台上音质和支持程度可能有所差异。Safari / Firefox 的行为与 Chrome 可能略有不同。