Zrincet/EasyExam

★ 0Forks 0JavaGitHub ↗Compare

README

本项目由阿里云ESA提供加速、计算和保护

EasyExam 轻松刷题

EasyExam 是一个基于艾宾浩斯遗忘曲线的AI智能刷题应用,帮助用户高效记忆和复习题目。内置AI解析,支持用户自定义题库和练习模式,帮助用户提高学习效率和知识掌握。支持响应式适配,支持移动端访问。

在线体验-用户端 在线体验-管理端

预览

技术栈

后端

  • Java 17 - 编程语言
  • Spring Boot 3.2.5 - 应用框架
  • MyBatis-Plus 3.5.9 - ORM 框架
  • Sa-Token 1.39.0 - 认证授权框架
  • MySQL 8.0+ - 数据库
  • EasyExcel 3.3.3 - Excel 导入导出
  • Hutool 5.8.26 - 工具库

前端

  • Vue 3.4.21 - 前端框架
  • Vite 5.4.6 - 构建工具
  • TypeScript 5.4 - 类型系统
  • TailwindCSS 4.0 - 样式框架
  • Headless UI 1.7.22 - 无样式组件库
  • Pinia 2.1.7 - 状态管理
  • Vue Router 4.3.0 - 路由管理
  • Axios 1.6.8 - HTTP 客户端

项目结构

EasyExam/
├── easyexam-server/          # 后端服务
│   ├── src/main/java/
│   │   └── com/easyexam/
│   │       ├── common/       # 公共模块
│   │       │   ├── base/     # 基础类
│   │       │   ├── config/   # 配置类
│   │       │   ├── exception/# 异常处理
│   │       │   ├── log/      # 日志
│   │       │   ├── result/   # 统一返回
│   │       │   └── utils/    # 工具类
│   │       └── modules/      # 业务模块
│   │           ├── auth/     # 认证模块
│   │           ├── bank/     # 题库模块
│   │           ├── practice/ # 练习模块
│   │           ├── question/ # 题目模块
│   │           └── user/     # 用户模块
│   └── src/main/resources/
│       ├── application.yml
│       └── mapper/
├── easyexam-user/            # 用户端前端
│   └── src/
│       ├── api/              # API 接口
│       ├── layouts/          # 布局组件
│       ├── router/           # 路由配置
│       ├── stores/           # 状态管理
│       ├── types/            # 类型定义
│       └── views/            # 页面组件
├── easyexam-admin/           # 管理后台前端
│   └── src/
│       ├── api/
│       ├── layouts/
│       ├── router/
│       ├── stores/
│       └── views/
├── easyexam-common/          # 共享组件库
│   └── src/
│       ├── types/
│       └── utils/
└── docs/                     # 文档
    ├── database/             # 数据库脚本
    └── api/                  # API 文档

部署方式

使用云效流水线自动cicd

前端

用户端和管理端分别部署至阿里云ESA Pages

后端

后端通过docker镜像构建推送到阿里云ACR,在阿里云ECS上拉取镜像启动服务,接口通过ESA进行加速与缓存。

快速开始

环境要求

  • JDK 17+
  • Node.js 18+
  • MySQL 8.0+
  • pnpm(推荐)或 npm

数据库初始化

  1. 创建数据库:
CREATE DATABASE easyexam DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
  1. 执行初始化脚本:
mysql -u root -p easyexam < docs/database/init.sql

后端启动

cd easyexam-server
./mvnw spring-boot:run

后端默认运行在 http://localhost:8080

前端启动

用户端:

cd easyexam-user
pnpm install
pnpm dev

用户端运行在 http://localhost:3000

管理后台:

cd easyexam-admin
pnpm install
pnpm dev

管理后台运行在 http://localhost:3001

默认账号

用户名 密码 角色
admin 123456 管理员
test 123456 普通用户

核心功能

1. 艾宾浩斯遗忘曲线算法

系统采用 Leitner Box System(莱特纳箱系统)结合 SM-2 算法 实现智能复习调度:

  • 6个学习等级:新题 → 1天 → 2天 → 4天 → 7天 → 15天 → 30天(已掌握)
  • 动态难度因子:根据答题表现调整复习间隔
  • 智能分发:优先显示待复习题目,然后是新题目
// 复习间隔计算
int[] REVIEW_INTERVALS = {0, 1, 2, 4, 7, 15, 30};

// 答对时升级,答错时降级
public void onCorrectAnswer(EbbinghausState state) {
    state.setBoxLevel(Math.min(state.getBoxLevel() + 1, 6));
    state.setEaseFactor(state.getEaseFactor() + 0.1);
    updateNextReviewTime(state);
}

2. 题库管理

  • 支持公开/私有题库
  • 按分类组织题库
  • 支持单选、多选、判断题

3. 题目批量导入

支持 Excel 格式导入题目,模板格式:

题目内容 类型 选项A 选项B 选项C 选项D 答案 解析
题目1 单选 选项A 选项B 选项C 选项D A 解析

4. 练习模式

  • 实时反馈答题结果
  • 显示正确答案和解析
  • "太简单了" 按钮快速跳过已掌握题目
  • 自动记录错题

API 接口

认证接口

  • POST /api/auth/login - 登录
  • POST /api/auth/register - 注册
  • POST /api/auth/logout - 登出
  • GET /api/auth/current - 获取当前用户

题库接口

  • GET /api/bank/list - 获取题库列表
  • GET /api/bank/{id} - 获取题库详情
  • POST /api/bank - 创建题库
  • PUT /api/bank - 更新题库
  • DELETE /api/bank/{id} - 删除题库

题目接口

  • GET /api/question/list/{bankId} - 获取题目列表
  • GET /api/question/{id} - 获取题目详情
  • POST /api/question - 创建题目
  • PUT /api/question - 更新题目
  • DELETE /api/question/{id} - 删除题目
  • POST /api/question/import - 导入题目
  • GET /api/question/template - 下载导入模板

练习接口

  • GET /api/practice/progress - 获取学习进度
  • GET /api/practice/progress/{bankId} - 获取题库进度
  • GET /api/practice/next/{bankId} - 获取下一题
  • POST /api/practice/answer - 提交答案
  • POST /api/practice/too-easy - 标记太简单
  • POST /api/practice/favorite/{questionId} - 收藏/取消收藏

数据库设计

核心表结构

  • sys_user - 用户表
  • category - 分类表
  • question_bank - 题库表
  • question - 题目表
  • question_option - 选项表
  • practice_record - 练习记录表
  • ebbinghaus_state - 艾宾浩斯状态表
  • user_practice_progress - 用户练习进度表
  • wrong_question - 错题表
  • user_favorite - 收藏表

详细表结构请参考 docs/database/init.sql

部署

Docker 部署(推荐)

# docker-compose.yml
version: '3.8'
services:
  mysql:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: easyexam
    volumes:
      - ./docs/database/init.sql:/docker-entrypoint-initdb.d/init.sql
    ports:
      - "3306:3306"

  backend:
    build: ./easyexam-server
    depends_on:
      - mysql
    environment:
      SPRING_PROFILES_ACTIVE: prod
      DB_HOST: mysql
    ports:
      - "8080:8080"

  frontend:
    build: ./easyexam-user
    ports:
      - "80:80"

手动部署

  1. 构建后端:
cd easyexam-server
./mvnw clean package -DskipTests
java -jar target/easyexam-server-1.0.0.jar
  1. 构建前端:
cd easyexam-user
pnpm build
# 将 dist 目录部署到 Nginx

License

MIT License

Contributors

Zrincet

Issues