功能特性 · 技术栈 · 项目结构 · 快速开始 · 配置说明 · 部署 · 贡献 · 许可证
Smart Exam Cloud 是一款功能完整、界面友好、部署简单的智慧考试云平台。后端采用 Spring Boot + MyBatis-Plus + Spring Security 的成熟架构,前端基于 Vue 2 + Element UI 构建,深度集成 AI 智能组卷与阅卷,覆盖学生、教师、管理员三类角色的完整考试与教学场景。
⚠️ 本项目面向学习。生产环境部署前,请务必阅读 安全须知。
用户角色 · 前端 · 接入层 · 后端服务 · 数据存储 · AI 能力的整体关系
表现层 → 接入与安全 → 应用控制 → 领域服务 → 数据访问 → 基础设施
AI 场景 → LangChain4j 编排中枢 → LLM / Dify / Embedding · Milvus
- 在线考试:单选 / 多选 / 判断 / 简答等多种题型,支持自动倒计时、进度保存、自动交卷。
- AI 智能阅卷:客观题秒级判分,主观题由 AI 给出评分建议与分析。
- 防作弊体系:基于浏览器 Visibility API 的实时切屏检测 + 考试异常锁定机制。
- 学习管理:考试记录回顾、智能错题本、成绩达标自动生成荣誉证书(HTML2Canvas + JsPDF)。
- 互动社区:支持发布动态、多级评论嵌套、点赞互动。
- 系统通知:全站公告 / 班级通知实时送达。
- 班级管理:创建班级、口令一键进班、学习进度监控。
- 智慧题库:多级分类,支持手动录入、Excel 批量导入、AI 智能生成试题。
- 考试全流程:固定选题 / 随机抽题 / AI 一键组卷,实时考场监控与成绩分布。
- 成绩分析:多维度报表统计,成绩单批量导出。
- 全权管理(覆盖教师端功能)。
- 用户角色与权限的集中式管控。
- 操作日志审计,系统运行安全合规。
| 分层 | 选型 |
|---|---|
| 后端框架 | Spring Boot 2.x、Spring Security、JWT |
| 持久层 | MyBatis-Plus、Druid 连接池、MySQL |
| 缓存与中间件 | Redis |
| 对象存储 | 阿里云 OSS / MinIO(可切换) |
| AI 能力 | LangChain4j(OpenAI 兼容)、Milvus 向量库、Dify |
| 接口文档 | Knife4j (OpenAPI 2 / Swagger) |
| 工具 | Hutool、Lombok、EasyExcel、ip2region |
| 前端框架 | Vue 2.7、Vue Router、Vuex |
| UI | Element UI |
| 构建 | Vite、pnpm |
smart-exam-cloud/
├── online-exam-system-backend/ # 后端 Spring Boot 服务
│ ├── src/main/java/ # Java 源码
│ ├── src/main/resources/ # 配置文件、MyBatis Mapper
│ ├── img/ # 架构 / ER 图
│ └── pom.xml
├── online-exam-system-frontend/ # 前端 Vue 应用
│ ├── src/
│ ├── public/
│ └── package.json
├── sql/ # 数据库初始化脚本
│ └── db_exam.sql
├── docs/ # 项目文档
└── README.md
- JDK 1.8
- Maven 3.6+
- Node.js 16+ 与 pnpm(
npm i -g pnpm) - MySQL 8.x
- Redis 6+
- (可选)MinIO / Milvus,用于本地对象存储与向量检索
git clone <your-repo-url>.git
cd smart-exam-cloud创建数据库 db_exam,导入初始化脚本:
mysql -uroot -p -e "CREATE DATABASE db_exam DEFAULT CHARACTER SET utf8mb4;"
mysql -uroot -p db_exam < sql/db_exam.sql后端配置位于 online-exam-system-backend/src/main/resources/,默认激活 dev profile。
真实的
application-dev.yml已在.gitignore中排除,不会进入仓库。仓库仅提供模板application-dev-example.yml。
首次运行请复制模板并填入你自己的密钥:
cd online-exam-system-backend/src/main/resources
cp application-dev-example.yml application-dev.yml
# Windows PowerShell: Copy-Item application-dev-example.yml application-dev.yml然后编辑 application-dev.yml,按文件中的 TODO 提示填写:MySQL 密码、JWT 密钥(≥ 64 字符随机串)、OSS / MinIO / LLM / Embedding / Dify / Milvus 等凭证。
💡 生产环境(
prodprofile)的application-prod.yml使用${ENV_VAR}占位符,建议通过系统环境变量注入,避免在文件中硬编码密钥:
export DB_PASSWORD=your-mysql-password
export JWT_SECRET=$(openssl rand -hex 32) # 至少 64 字符的随机字符串
export OSS_ACCESS_KEY_ID=your-oss-ak
export OSS_ACCESS_KEY_SECRET=your-oss-sk
# 其余变量见下表cd online-exam-system-backend
mvn clean spring-boot:run
# 默认端口 8080,接口文档:http://localhost:8080/doc.htmlcd online-exam-system-frontend
pnpm install
pnpm dev # 开发模式,默认 http://localhost:9528构建生产包:
pnpm build:prod # 产物输出到 dist/| 环境变量 | 说明 | 默认 / 示例 |
|---|---|---|
DB_PASSWORD |
MySQL 密码 | 无,必填 |
JWT_SECRET |
JWT 签名密钥(≥ 64 字符) | 无,必填 |
OSS_ACCESS_KEY_ID |
阿里云 OSS AccessKey ID | 使用本地存储可不配 |
OSS_ACCESS_KEY_SECRET |
阿里云 OSS AccessKey Secret | 同上 |
MINIO_ACCESS_KEY / MINIO_SECRET_KEY |
MinIO 凭证 | admin / 无 |
LLM_API_KEY / LLM_BASE_URL / LLM_MODEL |
大语言模型配置 | 视服务商而定 |
EMBEDDING_API_KEY |
Embedding 模型密钥 | 无 |
DIFY_API_KEY |
Dify 应用密钥 | 无 |
MILVUS_USERNAME / MILVUS_PASSWORD |
Milvus 凭证 | root / 无 |
存储方式可在 application-*.yml 中通过 online-exam.storage.type 在 aliyun 与 minio 间切换。
- 前端:
pnpm build:prod后将dist/部署到 Nginx,反向代理/api到后端 8080 端口。 - 后端:
mvn clean package -DskipTests,使用java -jar target/*.jar --spring.profiles.active=prod启动,通过环境变量或外部application-prod.yml注入生产配置。 - 生产环境强烈建议:HTTPS、独立的数据库账号与最小权限、定期轮换 JWT 密钥与 API Key。
在公开仓库中请遵守以下原则:
- 绝不提交真实密钥:数据库密码、JWT 密钥、AccessKey、API Key 等,请只填写在本地被
.gitignore排除的application-dev.yml中,或通过生产环境变量注入。仓库内只保留application-dev-example.yml模板与使用占位符的application-prod.yml。 - 历史泄露需轮换:如果密钥曾被提交到 Git 历史,仅删除当前文件是不够的,必须立即在对应服务商控制台吊销并重签相关密钥(阿里云 AK、LLM/Embedding/Dify Key、JWT Secret 等)。
- 最小权限:生产数据库账号应仅授予业务所需的最小权限。
- CORS 与端口:生产环境关闭 Swagger 公开访问,限制数据库、Redis、MinIO 端口的公网暴露。
欢迎提交 Issue 与 Pull Request。提交前请:
- 确保本地
pnpm lint与后端编译通过。 - 不要在代码或提交信息中包含任何真实密钥。
- 遵循现有代码风格与提交规范(
<type>(scope): <summary>)。
本项目采用 AGPL-3.0 License 开源。
⚠️ AGPL-3.0 的网络条款:如果你修改了本项目并通过网络提供服务(例如部署成在线服务供他人使用),必须向这些用户提供修改后的完整源代码。在使用或二次开发前,请务必阅读 LICENSE 全文以了解你的义务。


