[ Vue 3 | Spring Boot | MyBatis-Plus | Naive UI ]
一个现代化的期末复习在线题库系统,支持题目管理、智能练习、错题本、统计分析等功能。
采用前后端分离架构,提供流畅的学习体验和强大的题库管理能力。
|
|
|
|
Spring Boot 2.7.18 │ Java应用框架
MyBatis-Plus 3.5.5 │ 增强型ORM框架
MySQL 8.0 │ 关系型数据库
EasyExcel 3.3.2 │ Excel处理工具
Lombok │ Java代码简化工具
Hutool 5.8.23 │ Java工具类库
Maven │ 项目构建工具
核心特性:
- 🚀 RESTful API 设计
- 📦 统一结果封装
- 📄 分页查询支持(最大1000条)
- 🔄 跨域配置
- 📝 自动代码生成
- 🏷️ 科目表自动管理
- 📊 题目统计自动更新
Vue 3.4 │ 渐进式JavaScript框架
Vite 5.0 │ 下一代前端构建工具
Naive UI 2.38 │ Vue 3 UI组件库
Vue Router 4.x │ 官方路由管理器
Pinia 2.x │ 新一代状态管理
Axios │ HTTP客户端
XLSX │ Excel处理库
核心特性:
- ⚡ Vite 极速开发体验
- 🎨 Naive UI 精美组件
- 📱 响应式设计
- 🔄 组件化开发
- 💾 持久化状态管理
- JDK: 17+
- Maven: 3.6+
- MySQL: 8.0+
- Node.js: 16+
- npm: 8+
创建数据库:
CREATE DATABASE IF NOT EXISTS exam_practice
DEFAULT CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;执行SQL建表脚本(位于 backend/src/main/resources/sql/ 目录):
-- question表
CREATE TABLE question (
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID',
type VARCHAR(50) NOT NULL COMMENT '题型:single-choice(单选题)/multiple-choice(多选题)/judge(判断题)',
subject VARCHAR(100) NOT NULL DEFAULT '未分类' COMMENT '科目',
content TEXT NOT NULL COMMENT '题目内容',
options JSON COMMENT '选项(JSON数组)',
answer VARCHAR(200) NOT NULL COMMENT '答案',
analysis TEXT COMMENT '解析',
difficulty VARCHAR(20) DEFAULT 'medium' COMMENT '难度:easy/medium/hard',
is_marked TINYINT(1) DEFAULT 0 COMMENT '是否收藏',
practice_count INT DEFAULT 0 COMMENT '练习次数',
wrong_count INT DEFAULT 0 COMMENT '错误次数',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
INDEX idx_type (type),
INDEX idx_subject (subject),
INDEX idx_difficulty (difficulty)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='题目表';
-- practice_record表
CREATE TABLE practice_record (
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID',
question_id BIGINT NOT NULL COMMENT '题目ID',
user_answer VARCHAR(200) COMMENT '用户答案',
is_correct TINYINT(1) COMMENT '是否正确',
practice_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '练习时间',
FOREIGN KEY (question_id) REFERENCES question(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='练习记录表';
-- subject表(科目管理)
CREATE TABLE subject (
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID',
name VARCHAR(100) NOT NULL UNIQUE COMMENT '科目名称',
question_count INT DEFAULT 0 COMMENT '题目数量',
description VARCHAR(500) COMMENT '科目描述',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='科目表';- 用 IntelliJ IDEA 打开
backend目录 - 修改
src/main/resources/application-dev.yml数据库配置:
spring:
datasource:
url: jdbc:mysql://localhost:3306/exam_practice?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
username: root # 修改为你的数据库用户名
password: your_password # 修改为你的数据库密码- 运行
ExamApplication.java的 main 方法 - 看到以下提示表示启动成功:
=================================
期末复习题库系统启动成功!
访问地址: http://localhost:8081
=================================
cd backend
mvn clean package
java -jar target/exam-practice-0.0.1.jar# 双击运行根目录下的 启动后端.bat
启动后端.batcd frontend
# 安装依赖
npm install
# 启动开发服务器
npm run dev- 前端地址: http://localhost:5173
- 后端接口: http://localhost:8081/api
- 题目管理: http://localhost:5173/questions
- 开始练习: http://localhost:5173/practice
Final_Practice/
├── README.md # 项目说明文档
├── 启动后端.bat # Windows后端启动脚本
├── 习思想题库_20251219_134241.xlsx # 示例题库数据
├── .gitignore # Git忽略配置
│
├── backend/ # 后端项目 ✅
│ ├── pom.xml # Maven配置文件
│ ├── src/
│ │ ├── main/
│ │ │ ├── java/com/exam/
│ │ │ │ ├── ExamApplication.java # 启动类
│ │ │ │ ├── config/ # 配置类
│ │ │ │ │ ├── CorsConfig.java # 跨域配置
│ │ │ │ │ └── MybatisPlusConfig.java # MyBatis-Plus配置
│ │ │ │ ├── controller/ # 控制器层
│ │ │ │ │ ├── QuestionController.java # 题目管理API
│ │ │ │ │ ├── PracticeController.java # 练习功能API
│ │ │ │ │ ├── ImportController.java # 导入导出API
│ │ │ │ │ └── TestController.java # 测试API
│ │ │ │ ├── entity/ # 实体类
│ │ │ │ │ ├── Question.java # 题目实体
│ │ │ │ │ ├── PracticeRecord.java # 练习记录实体
│ │ │ │ │ └── Subject.java # 科目实体
│ │ │ │ ├── mapper/ # MyBatis Mapper
│ │ │ │ │ ├── QuestionMapper.java
│ │ │ │ │ ├── PracticeRecordMapper.java
│ │ │ │ │ └── SubjectMapper.java
│ │ │ │ ├── service/ # 业务层
│ │ │ │ │ ├── QuestionService.java
│ │ │ │ │ ├── PracticeRecordService.java
│ │ │ │ │ └── impl/ # 业务实现
│ │ │ │ ├── dto/ # 数据传输对象
│ │ │ │ │ ├── QuestionImportDTO.java
│ │ │ │ │ ├── JudgeQuestionImportDTO.java
│ │ │ │ │ └── QuestionExportDTO.java
│ │ │ │ ├── listener/ # Excel监听器
│ │ │ │ │ ├── ChoiceQuestionImportListener.java
│ │ │ │ │ └── JudgeQuestionImportListener.java
│ │ │ │ └── common/ # 通用类
│ │ │ │ ├── Result.java # 统一返回结果
│ │ │ │ └── PageResult.java # 分页结果
│ │ │ └── resources/
│ │ │ ├── application.yml # 主配置文件
│ │ │ ├── application-dev.yml # 开发环境配置
│ │ │ ├── logback-spring.xml # 日志配置
│ │ │ └── mapper/ # MyBatis XML映射
│ │ └── test/ # 测试目录
│ └── target/ # 编译输出目录
│
└── frontend/ # 前端项目 ✅
├── package.json # 项目依赖配置
├── vite.config.js # Vite构建配置
├── index.html # HTML入口文件
└── src/
├── main.js # 应用入口
├── App.vue # 根组件
├── api/ # API接口
│ ├── request.js # Axios封装
│ ├── question.js # 题目相关接口
│ └── practice.js # 练习相关接口
├── router/ # 路由配置
│ └── index.js # 路由定义
├── stores/ # Pinia状态管理
│ └── practice.js # 练习状态
├── views/ # 页面组件
│ ├── Layout.vue # 布局组件
│ ├── Home.vue # 首页
│ ├── QuestionManage.vue # 题目管理页
│ ├── QuestionConverter.vue # 题目转换工具
│ ├── Practice.vue # 练习页面
│ ├── WrongBook.vue # 错题本
│ └── Statistics.vue # 统计分析
├── components/ # 公共组件
└── assets/ # 静态资源
| 接口 | 方法 | 说明 |
|---|---|---|
/api/questions |
GET | 分页查询题目列表(支持subject/type/difficulty筛选) |
/api/questions/{id} |
GET | 获取题目详情 |
/api/questions |
POST | 新增题目 |
/api/questions/{id} |
PUT | 更新题目 |
/api/questions/{id} |
DELETE | 删除题目(自动更新科目统计) |
/api/questions/batch |
DELETE | 批量删除题目 |
/api/questions/clear |
POST | 清空题库(支持按科目/题型筛选) |
/api/questions/random |
GET | 随机获取题目 |
| 接口 | 方法 | 说明 |
|---|---|---|
/api/subjects |
GET | 获取所有科目列表 |
/api/subjects/recount |
POST | 重新统计所有科目题目数量 |
/api/subjects/{subject}/recount |
POST | 重新统计指定科目题目数量 |
| 接口 | 方法 | 说明 |
|---|---|---|
/api/practice/submit |
POST | 提交答题记录 |
/api/practice/wrong |
GET | 获取错题列表 |
/api/practice/statistics |
GET | 获取练习统计 |
/api/practice/records |
GET | 获取练习记录 |
| 接口 | 方法 | 说明 |
|---|---|---|
/api/import/excel |
POST | 导入Excel题目(支持自定义科目参数) |
/api/import/template/choice |
GET | 下载选择题模板 |
/api/import/template/judge |
GET | 下载判断题模板 |
/api/export |
POST | 导出题目 |
- 支持题目的增删改查
- 多条件筛选(科目、题型、难度)
- 分页展示与批量操作
- 科目动态加载与自动统计
- 支持单选题、多选题、判断题三种题型
- 优雅的答题界面
- 实时反馈与解析
- 进度追踪
- 自动收录错题
- 支持错题重练
- 按科目分类展示
- 练习次数统计
- 正确率分析
- 知识点掌握情况
# 进入后端目录
cd backend
# 编译项目
mvn clean compile
# 运行测试
mvn test
# 打包项目
mvn clean package
# 跳过测试打包
mvn clean package -DskipTests# 进入前端目录
cd frontend
# 安装依赖
npm install
# 启动开发服务器(热重载)
npm run dev
# 构建生产版本
npm run build
# 预览生产构建
npm run preview- 后端: 遵循阿里巴巴Java开发手册
- 前端: 使用Vue 3 Composition API
- 命名: 使用有意义的变量和方法名
- 注释: 关键逻辑必须添加注释
- 访问「题目管理」页面
- 点击「批量导入」按钮
- 在导入对话框中选择或输入科目名称(支持筛选和新建)
- 选择Excel文件进行上传
- 系统自动识别题目类型(单选/多选/判断)
- 导入成功后自动更新科目列表和题目统计
注意事项:
- Excel文件必须包含:题目内容、选项(选择题)、答案等字段
- 单选题答案为单个字母(如A)
- 多选题答案为多个字母(如ABC)
- 判断题答案为"正确"或"错误"
- 导入时会自动创建新科目(如果不存在)
- 访问「开始练习」页面
- 选择科目和题型
- 点击「开始专注练习」
- 答题并查看解析
- 错题自动收录到错题本
- 访问「错题本」页面
- 查看所有答错的题目
- 支持按科目和题型筛选
- 可以重新练习错题
- 访问「统计分析」页面
- 查看练习次数和正确率
- 分析薄弱知识点
- 制定复习计划
欢迎提交 Issue 和 Pull Request!
- Fork 本项目
- 创建新分支 (
git checkout -b feature/AmazingFeature) - 提交更改 (
git commit -m 'Add some AmazingFeature') - 推送到分支 (
git push origin feature/AmazingFeature) - 提交 Pull Request
本项目采用 MIT 许可证 - 详见 LICENSE 文件
- 开发者: IceYuanyyy
- 邮箱: 2478686497@qq.com / ercurym86@gmail.com
- GitHub: @IceYuanyyy
如果这个项目对你有帮助,请给一个 Star ⭐️
如有问题或建议,欢迎通过以下方式联系:
- 📧 Email: 2478686497@qq.com / ercurym86@gmail.com
- 💬 GitHub Issues: 提交Issue
Made with ❤️ by IceYuanyyy