本项目由阿里云ESA提供加速、计算和保护
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
- 创建数据库:
CREATE DATABASE easyexam DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;- 执行初始化脚本:
mysql -u root -p easyexam < docs/database/init.sqlcd 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 | 普通用户 |
系统采用 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);
}- 支持公开/私有题库
- 按分类组织题库
- 支持单选、多选、判断题
支持 Excel 格式导入题目,模板格式:
| 题目内容 | 类型 | 选项A | 选项B | 选项C | 选项D | 答案 | 解析 |
|---|---|---|---|---|---|---|---|
| 题目1 | 单选 | 选项A | 选项B | 选项C | 选项D | A | 解析 |
- 实时反馈答题结果
- 显示正确答案和解析
- "太简单了" 按钮快速跳过已掌握题目
- 自动记录错题
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-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"- 构建后端:
cd easyexam-server
./mvnw clean package -DskipTests
java -jar target/easyexam-server-1.0.0.jar- 构建前端:
cd easyexam-user
pnpm build
# 将 dist 目录部署到 NginxMIT License





