# zjj_icode **Repository Path**: speaker01/zjj_icode ## Basic Information - **Project Name**: zjj_icode - **Description**: 小码智学项目,代码提交位置 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-10-27 - **Last Updated**: 2026-08-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 小码智学 (iCode) — 在线编程学习与评测平台 张家界学院在线编程学习与评测系统 ## 项目简介 **小码智学(iCode)** 是一款面向高校的在线编程学习与评测平台,支持 **C/C++、Java、Python** 三种编程语言的自动评测功能。系统采用 **微服务架构**,包含核心业务后端、多种语言评测机以及前端应用,适用于编程教学、作业布置、竞赛训练、考试组卷等场景。集成了 **DeepSeek AI** 能力,提供代码分析、智能提示、错误分析、教学建议等智能化教学辅助功能。 --- ## 系统架构 ``` ┌─────────────────────────────────────────────────────────┐ │ 客户端 (Browser) │ │ Vue 3 SPA (学生端 + 教师端) │ └────────────────────────┬────────────────────────────────┘ │ HTTP / WebSocket ▼ ┌─────────────────────────────────────────────────────────┐ │ 后端服务 (Spring Boot) │ │ icode-be :51024 │ │ Controller → Service → Mapper → MySQL │ │ + DeepSeek AI + WebSocket + Quartz │ └──────┬────────────┬────────────┬──────────────┬─────────┘ │ │ │ │ ▼ ▼ ▼ ▼ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────────┐ │ RabbitMQ │ │ Redis │ │ MySQL │ │ 阿里云OSS │ │ 消息队列 │ │ 缓存 │ │ 数据库 │ │ 文件存储 │ └────┬─────┘ └──────────┘ └──────────┘ └──────────────┘ │ ├──────────────┬──────────────┬──────────────┐ ▼ ▼ ▼ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ C/C++ │ │ Java │ │ Python │ │ │ 评测器 │ │ 评测器 │ │ 评测器 │ │ └──────────┘ └──────────┘ └──────────┘ │ │ ┌────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────┐ │ Nginx (静态资源代理 + 反向代理) │ └─────────────────────────────────────────────────────────┘ ``` ### 核心技术栈 | 层级 | 技术 | 版本 | |------|------|------| | 前端框架 | Vue 3 + Vue Router 4 + Pinia | ^3.2.13 | | UI 组件库 | Element Plus + Vant | ^2.11.8 / ^4.9.21 | | 代码编辑器 | Monaco Editor | ^0.44.0 | | 图表 | ECharts + vue-echarts | ^6.0.0 | | 后端框架 | Spring Boot | 3.5.7 | | ORM | MyBatis Plus | 3.5.7 | | 数据库 | MySQL | 8.0+ | | 缓存 | Redis (Lettuce) | 6.0+ | | 消息队列 | RabbitMQ | 3.12+ | | AI 模型 | DeepSeek (deepseek-v4-pro) | — | | 定时任务 | Quartz | — | | 构建工具 | Maven (后端) / Webpack 5 (前端) | — | | 容器化 | Docker + Docker Compose | — | --- ## 功能特性 ### 👨‍🎓 学生端 | 模块 | 功能 | |------|------| | **题库练习** | 分类浏览题目、按标签筛选、题目搜索 | | **在线编程** | Monaco Editor 代码编辑器,支持 C/C++/Java/Python | | **代码评测** | 实时提交评测,查看评测结果(AC/WA/TLE/RE/MLE/CE) | | **作业任务** | 查看教师布置的任务,跟踪完成进度 | | **在线考试** | 参加在线考试,自动计时,自动阅卷 | | **竞赛对战** | 1v1 实时对战、战队对战,排行榜 | | **题解社区** | 发布和查看题解文章,代码讨论 | | **AI 助学** | 语法检查、代码分析评价、智能解题提示、多轮对话 | | **个性化推荐** | AI 根据做题记录推荐适配题目 | | **水平评估** | 通过测试题评估编程水平等级 | | **社区贴吧** | 发帖交流、学习讨论 | | **好友系统** | 添加好友、查看好友动态 | ### 👨‍🏫 教师端 | 模块 | 功能 | |------|------| | **题库管理** | 创建/编辑/删除题目,批量导入,测试用例管理 | | **任务管理** | 布置编程作业,设置截止时间,查看学生进度 | | **智能组卷** | AI 辅助出题组卷,自动生成试卷 | | **考试管理** | 创建考试、在线监考、自动阅卷、成绩统计 | | **竞赛管理** | 创建竞赛(ACM/IOI 计分模式) | | **班级管理** | 学生管理、班级分组 | | **AI 教学助手** | AI 错误分析、AI 教学建议、AI 答疑库 | ### 🤖 AI 智能教学(DeepSeek 集成) - **代码语法检查**:实时检测代码语法错误 - **代码分析评价**:对提交代码进行质量评分和优化建议 - **智能解题提示**:提供题目解题思路,不直接给出答案 - **知识点总结**:根据题目自动生成知识点总结 - **错误分析**:分析错误原因,给出针对性学习建议 - **教学建议**:根据班级整体数据生成教学改进建议 - **个性化推荐**:基于学生做题历史推荐适配题目 --- ## 项目结构 ``` icode/ ├── BE/ # 后端服务目录 │ ├── icode-be/ # 核心业务后端 (Spring Boot) │ │ ├── src/main/java/com/iflytek/icode/ │ │ │ ├── IcodeApplication.java # 入口类 │ │ │ ├── config/ # 配置类 │ │ │ │ ├── CorsConfig.java # 跨域配置 │ │ │ │ ├── SecurityConfig.java # 安全加密配置 │ │ │ │ ├── RedisConfig.java # Redis 配置 │ │ │ │ ├── RabbitMQConfig.java # 消息队列配置 │ │ │ │ ├── WebSocketConfig.java # WebSocket 配置 │ │ │ │ ├── QuartzJobConfig.java # 定时任务配置 │ │ │ │ ├── MyBatisPlusConfig.java # MyBatis Plus 配置 │ │ │ │ ├── DeepseekConfig.java # DeepSeek API 配置 │ │ │ │ ├── OpenAiConfig.java # OpenAI API 配置 │ │ │ │ ├── InterceptorConfig.java # 拦截器配置 │ │ │ │ ├── JacksonConfig.java # JSON 序列化配置 │ │ │ │ └── RestTemplateConfig.java # HTTP 客户端配置 │ │ │ ├── controller/ # 控制器层 (REST API) │ │ │ │ ├── problem/ # 题目相关 │ │ │ │ │ ├── ProblemController.java │ │ │ │ │ ├── JudgeController.java │ │ │ │ │ └── ProblemAiStreamController.java # AI 流式接口 │ │ │ │ ├── task/ # 任务相关 │ │ │ │ │ ├── TaskController.java │ │ │ │ │ ├── TaskRecommendController.java │ │ │ │ │ ├── TaskErrorAnalysisStreamController.java │ │ │ │ │ └── TaskTeachingSuggestionStreamController.java │ │ │ │ ├── contest/ # 竞赛相关 │ │ │ │ │ └── ContestController.java │ │ │ │ ├── exam/ # 考试相关 │ │ │ │ │ └── ExamController.java │ │ │ │ ├── community/ # 社区相关 │ │ │ │ │ ├── ForumController.java │ │ │ │ │ ├── LeaderBoardController.java │ │ │ │ │ ├── ProblemSolutionController.java │ │ │ │ │ ├── TeamController.java │ │ │ │ │ └── FileUploadController.java │ │ │ │ ├── battle/ # 对战相关 │ │ │ │ │ └── BattleController.java │ │ │ │ ├── assessment/ # 评估相关 │ │ │ │ ├── chat/ # 聊天相关 │ │ │ │ ├── friend/ # 好友相关 │ │ │ │ ├── notification/ # 通知相关 │ │ │ │ ├── Users/ # 用户相关 │ │ │ │ │ ├── UserController.java │ │ │ │ │ ├── StudentUserController.java │ │ │ │ │ └── TeacherUserController.java │ │ │ │ └── DeepSeekStreamController.java # AI 流式对话接口 │ │ │ ├── service/ # 业务逻辑层 │ │ │ │ ├── problem/ # 题目服务 │ │ │ │ ├── judge/ # 评测服务 │ │ │ │ ├── task/ # 任务服务 │ │ │ │ ├── contest/ # 竞赛服务 │ │ │ │ ├── exam/ # 考试服务 │ │ │ │ ├── AIFunction/ # AI 功能服务 │ │ │ │ ├── genericDeepseek/ # DeepSeek 通用调用 │ │ │ │ ├── community/ # 社区服务 │ │ │ │ ├── battle/ # 对战服务 │ │ │ │ ├── chat/ # 聊天服务 │ │ │ │ ├── friend/ # 好友服务 │ │ │ │ ├── notification/ # 通知服务 │ │ │ │ ├── cache/ # 缓存服务 │ │ │ │ ├── dashboard/ # 仪表盘服务 │ │ │ │ ├── runtime/ # 运行时服务 │ │ │ │ └── Users/ # 用户服务 │ │ │ ├── mapper/ # 数据访问层 (MyBatis) │ │ │ │ ├── problems/ # 题目数据访问 │ │ │ │ ├── task/ # 任务数据访问 │ │ │ │ ├── contest/ # 竞赛数据访问 │ │ │ │ ├── exam/ # 考试数据访问 │ │ │ │ ├── users/ # 用户数据访问 │ │ │ │ ├── community/ # 社区数据访问 │ │ │ │ ├── battle/ # 对战数据访问 │ │ │ │ ├── chat/ # 聊天数据访问 │ │ │ │ ├── friend/ # 好友数据访问 │ │ │ │ ├── notification/ # 通知数据访问 │ │ │ │ ├── ai/ # AI 数据访问 │ │ │ │ ├── favorites/ # 收藏数据访问 │ │ │ │ ├── dashboard/ # 仪表盘数据访问 │ │ │ │ ├── runtime/ # 运行时数据访问 │ │ │ │ ├── useranswers/ # 用户答案数据访问 │ │ │ │ └── DashboardMapper.java │ │ │ ├── pojo/ # 数据模型 │ │ │ │ ├── entity/ # 实体类 │ │ │ │ ├── DTO/ # 数据传输对象 │ │ │ │ └── VO/ # 视图对象 │ │ │ ├── handler/ # 处理器 │ │ │ │ ├── GlobalExceptionHandler.java │ │ │ │ ├── ChatWebSocketHandler.java │ │ │ │ ├── DeepSeekWebSocketHandler.java │ │ │ │ └── NotificationWebSocketHandler.java │ │ │ ├── interceptor/ # 拦截器 │ │ │ │ └── JWEInterceptor.java # JWE 认证拦截器 │ │ │ ├── consumer/ # RabbitMQ 消费者 │ │ │ │ └── JudgeResultConsumer.java # 评测结果消费 │ │ │ ├── job/ # Quartz 定时任务 │ │ │ │ ├── TaskStatusUpdateJob.java # 任务状态更新 │ │ │ │ ├── TaskStatusTriggerJob.java # 任务触发 │ │ │ │ ├── TaskErrorAnalysisJob.java # 错误分析 │ │ │ │ ├── TaskTeachingSuggestionJob.java # 教学建议 │ │ │ │ ├── ExamAutoGradingJob.java # 自动阅卷 │ │ │ │ ├── DashboardSnapshotJob.java # 仪表盘快照 │ │ │ │ ├── LeaderBoardSnapshotJob.java # 排行榜快照 │ │ │ │ ├── TeamHeatDeductionJob.java # 战队活跃度 │ │ │ │ └── ActivityReminderJob.java # 活动提醒 │ │ │ ├── utils/ # 工具类 │ │ │ │ ├── Result.java # 统一响应封装 │ │ │ │ ├── JWEUtils.java # JWE 加密工具 │ │ │ │ ├── CaptchaUtil.java # 验证码工具 │ │ │ │ └── ... │ │ │ └── context/ # 上下文 │ │ │ └── SpringApplicationContextHolder.java │ │ ├── src/main/resources/ │ │ │ └── application.yaml # 主配置文件 │ │ ├── pom.xml # Maven 依赖配置 │ │ ├── icode.sql # 数据库初始化脚本 │ │ ├── Dockerfile # Docker 构建文件 │ │ ├── DOCKER_GUIDE.md # Docker 部署指南 │ │ └── JUDGE_SERVER_SPEC.md # 评测器对接规范 │ │ │ ├── cpp-judge-server/ # C/C++ 评测服务 │ │ ├── Dockerfile # Docker 构建文件 │ │ ├── CMakeLists.txt # CMake 构建配置 │ │ └── src/ # 源代码 │ │ │ ├── java-judge-server/ # Java 评测服务 │ │ ├── Dockerfile # Docker 构建文件 │ │ ├── pom.xml # Maven 依赖配置 │ │ ├── docker-compose.yml # 评测器 Docker Compose │ │ └── src/ # 源代码 │ │ │ ├── python-judge-server/ # Python 评测服务 │ │ ├── Dockerfile # Docker 构建文件 │ │ ├── requirements.txt # Python 依赖 │ │ ├── run.py # 启动入口 │ │ ├── config/ # 配置文件 │ │ └── src/ # 源代码 │ │ │ ├── docker-compose.yml # 全局 Docker Compose (统筹部署) │ └── deploy_ubuntu.sh # Ubuntu 一键部署脚本 │ ├── FE/ # 前端应用 (Vue 3) │ ├── public/ # 静态资源 │ ├── src/ │ │ ├── main.js # 入口文件 │ │ ├── App.vue # 根组件 │ │ ├── router/ │ │ │ ├── index.js # 路由配置 │ │ │ └── guards.js # 路由守卫 │ │ ├── stores/ # Pinia 状态管理 │ │ │ └── mockdata.js # 模拟数据 │ │ ├── api/ # API 接口封装 │ │ │ ├── index.js # 统一导出 │ │ │ ├── auth.js # 认证接口 │ │ │ ├── problem.js # 题目接口 │ │ │ ├── judge.js # 评测接口 │ │ │ ├── task.js # 任务接口 │ │ │ ├── exam.js # 考试接口 │ │ │ ├── contest.js # 竞赛接口 │ │ │ ├── battle.js # 对战接口 │ │ │ ├── ai.js # AI 接口 │ │ │ ├── chat.js # 聊天接口 │ │ │ ├── forum.js # 论坛接口 │ │ │ ├── class.js # 班级接口 │ │ │ ├── student.js # 学生接口 │ │ │ ├── teacher.js # 教师接口 │ │ │ ├── dashboard.js # 仪表盘接口 │ │ │ ├── notification.js # 通知接口 │ │ │ ├── friend.js # 好友接口 │ │ │ ├── community.js # 社区接口 │ │ │ ├── team.js # 战队接口 │ │ │ ├── assessment.js # 评估接口 │ │ │ └── ... (共 30+ API 模块) │ │ ├── components/ # 公共组件 │ │ │ ├── StudentLayout.vue # 学生端布局 │ │ │ ├── TeacherLayout.vue # 教师端布局 │ │ │ ├── CEditor.vue # 代码编辑器组件 │ │ │ ├── ChatComponent.vue # 聊天组件 │ │ │ ├── FloatingChat.vue # 浮动聊天组件 │ │ │ ├── AiProblemStreamPanel.vue # AI 流式面板 │ │ │ ├── RadarChart.vue # 雷达图组件 │ │ │ └── ... │ │ ├── composables/ # 组合式函数 │ │ │ ├── useDarkMode.js # 暗黑模式 │ │ │ ├── useAiSimilarBatchStream.js # AI 流式批量处理 │ │ │ └── useRecentActivities.js # 最近活动 │ │ ├── views/ # 页面视图 │ │ │ ├── LoginPage.vue # 登录页 │ │ │ ├── AboutUs.vue # 关于我们 │ │ │ ├── Student/ # 学生端页面 (34+ 页面) │ │ │ │ ├── HomePage.vue # 首页 │ │ │ │ ├── QuestionBank.vue # 题目列表 │ │ │ │ ├── QuestionDetails.vue # 题目详情+在线编程 │ │ │ │ ├── MyTasks.vue # 我的任务 │ │ │ │ ├── CompetitionPage.vue # 竞赛列表 │ │ │ │ ├── ContestArena.vue # 竞赛答题 │ │ │ │ ├── ExamList.vue # 考试列表 │ │ │ │ ├── ExamArena.vue # 考试答题 │ │ │ │ ├── BattlePage.vue # 1v1 对战 │ │ │ │ ├── TeamBattlePage.vue # 战队对战 │ │ │ │ ├── RankingPage.vue # 排行榜 │ │ │ │ ├── SolutionList.vue # 题解列表 │ │ │ │ ├── ForumList.vue # 社区贴吧 │ │ │ │ └── ... │ │ │ └── Teacher/ # 教师端页面 (17+ 页面) │ │ │ ├── HomePage.vue # 教师首页 │ │ │ ├── QuestionManage.vue # 题目管理 │ │ │ ├── QuestionBank.vue # 题库管理 │ │ │ ├── TaskManagement.vue # 任务管理 │ │ │ ├── ExamManage.vue # 考试管理 │ │ │ ├── ContestManage.vue # 竞赛管理 │ │ │ ├── StudentManagement.vue # 班级管理 │ │ │ ├── WrongAnalysis.vue # AI 错题分析 │ │ │ ├── TeachingSuggestion.vue # AI 教学建议 │ │ │ └── ... │ │ ├── utils/ # 工具函数 │ │ │ ├── request.js # Axios 封装 │ │ │ ├── auth.js # 认证工具 │ │ │ ├── time.js # 时间工具 │ │ │ ├── env.js # 环境变量 │ │ │ └── notificationWs.js # WebSocket 通知 │ │ └── assets/ # 静态资源 │ │ ├── styles/ # 样式 │ │ ├── images/ # 图片 │ │ ├── avatar/ # 头像 │ │ └── iconfont/ # 图标字体 │ ├── vue.config.js # Vue CLI 配置 │ ├── babel.config.js # Babel 配置 │ ├── package.json # 前端依赖 │ └── .env.development # 开发环境变量 │ ├── docs/ # 项目文档 │ ├── API接口文档.md # API 文档 v1 │ ├── API接口文档_v2.md # API 文档 v2 │ ├── API接口文档_v0.2.md │ ├── API接口文档_v0.3(AI).md # AI 相关 API 文档 │ ├── community-api-docs.md # 社区功能 API │ ├── API_班级管理新增功能.md # 班级管理 API │ └── C语言编程智能体学生练习平台需求文档.md # 需求文档 │ ├── build/ # 构建产物目录 ├── README.md # 本文件 └── .gitignore # Git 忽略规则 ``` --- ## 消息队列架构 (RabbitMQ) 系统使用 **RabbitMQ** 进行异步评测任务分发和结果收集: | 队列名称 | 用途 | 消费者 | |----------|------|--------| | `judge.submit.cpp` | C/C++ 评测提交 | cpp-judge-server | | `judge.submit.java` | Java 评测提交 | java-judge-server | | `judge.submit.python` | Python 评测提交 | python-judge-server | | `judge.result.complete` | 评测结果回写 | icode-be (JudgeResultConsumer) | **工作流程**: 1. 用户提交代码 → icode-be 将评测任务发送到对应语言的RabbitMQ队列 2. 评测器消费队列 → 在沙箱中编译/运行代码 → 收集评测结果 3. 评测器将结果发送到 `judge.result.complete` 队列 4. icode-be 消费结果 → 更新数据库 → 通过 WebSocket 推送结果给前端 --- ## 快速开始 ### 环境要求 | 依赖 | 版本要求 | |------|----------| | JDK | 21+ | | Python | 3.11+ | | Node.js | 16+ | | MySQL | 8.0+ | | Redis | 6.0+ | | RabbitMQ | 3.12+ | | Maven | 3.8+ | | Docker | 24.0+(推荐 Docker Desktop 或 Docker CE) | | Docker Compose | v2.0+(docker compose 插件) | ### 1. 克隆项目 ```bash git clone https://gitee.com/speaker01/zjj_icode.git cd icode ``` ### 2. 初始化数据库 ```bash # 创建数据库并导入初始数据 mysql -u root -p < BE/icode-be/icode.sql ``` ### 3. 配置后端 编辑 `BE/icode-be/src/main/resources/application.yaml`,配置以下参数: ```yaml spring: datasource: url: jdbc:mysql://:3306/icode username: password: data: redis: host: password: rabbitmq: host: username: icode password: ``` ### 4. 启动后端服务 ```bash cd BE/icode-be mvn spring-boot:run # 或打包后运行 mvn package -DskipTests java -jar target/icode-0.0.1-SNAPSHOT.jar ``` 服务默认启动在 `http://localhost:51024` ### 5. 启动评测器(可选,如需代码评测功能) #### C/C++ 评测器 ```bash cd BE/cpp-judge-server mkdir -p build && cd build cmake .. -DCMAKE_BUILD_TYPE=Release make -j$(nproc) ./cpp-judge-server ``` #### Java 评测器 ```bash cd BE/java-judge-server mvn package -DskipTests java -jar target/java-judge-server-0.0.1-SNAPSHOT.jar ``` #### Python 评测器 ```bash cd BE/python-judge-server python3 -m venv venv source venv/bin/activate # Windows: venv\Scripts\activate pip install -r requirements.txt python run.py ``` ### 6. 启动前端 ```bash cd FE npm install # 开发模式(端口 3000) npm run serve # 生产构建 npm run build ``` 前端默认代理后端到 `http://localhost:8080`(可通过 `VUE_APP_API_BASE_URL` 修改)。 --- ## 🐳 Docker 一键部署(推荐) Docker 部署是启动整个平台最快的方式,一条命令即可启动 **前端 + 后端 + MySQL + Redis + RabbitMQ + 三个评测机** 全部服务。 ### 前置条件 | 环境 | 要求 | |------|------| | Docker | 24.0+ | | Docker Compose | v2.0+ | | 内存 | ≥ 8GB(推荐 16GB) | | 磁盘 | ≥ 20GB 可用空间 | ```bash # 验证 Docker 环境 docker --version docker compose version ``` ### 文件说明 项目根目录下的 Docker 相关文件: | 文件 | 说明 | |------|------| | **`docker-compose.yml`** | 主编排文件,定义全部 8 个服务 | | **`.env`** | 环境变量配置(数据库密码、API Key、域名等) | | **`init-ssl.sh`** | Let's Encrypt SSL 证书首次申请脚本 | | **`FE/Dockerfile`** | 前端 Vue 应用构建 + Nginx 运行 | | **`FE/nginx.conf`** | Nginx SSL/HTTP 配置模板 | | **`BE/icode-be/Dockerfile`** | 后端 Spring Boot 多阶段构建 | | **`BE/cpp-judge-server/Dockerfile`** | C/C++ 评测机(已有) | | **`BE/java-judge-server/Dockerfile`** | Java 评测机(已有) | | **`BE/python-judge-server/Dockerfile`** | Python 评测机(已有) | ### 快速启动(无域名 / 内网环境) ```bash # 1. 进入项目根目录 cd zjj_icode # 2. 编辑 .env 文件,修改关键配置 # - DEEPSEEK_API_KEY: 你的 DeepSeek API 密钥 # - 其他密码可按需修改 ```
.env 核心配置项 ```env # DeepSeek AI 配置(必须修改为你的 Key) DEEPSEEK_API_KEY=sk-你的API密钥 # MySQL 数据库密码 MYSQL_ROOT_PASSWORD=root123! MYSQL_USER=icode MYSQL_PASSWORD=你的数据库密码 # Redis 密码 REDIS_PASSWORD=你的Redis密码 # RabbitMQ 密码 RABBITMQ_USER=icode RABBITMQ_PASSWORD=你的RabbitMQ密码 # 域名(如果有域名,用于 SSL) DOMAIN_NAME=你的域名.com CERTBOT_EMAIL=你的邮箱@example.com ```
```bash # 3. 一键启动所有服务(需等待镜像下载和构建) docker compose --env-file .env up -d # 4. 查看启动日志 docker compose logs -f # 5. 查看服务状态 docker compose ps ``` 启动后访问 **http://服务器IP** 即可使用。 > ⏱ 首次启动耗时约 5-15 分钟(取决于网络下载速度),因为需要: > - 拉取 MySQL / Redis / RabbitMQ 等基础镜像 > - 构建后端 Spring Boot(Maven 下载依赖) > - 构建前端 Vue(pnpm 下载依赖) > - 构建三个评测机 ### 服务架构 ``` 用户访问 │ ┌─────▼─────┐ │ Nginx │ 端口 80/443 │ 前端 SPA │ └─────┬─────┘ │ /icode-be/ ┌─────▼──────┐ │ icode-be │ Spring Boot :51024 │ 后端服务 │ └──┬──┬──┬───┘ │ │ │ ┌────────────┘ │ └────────────┐ ▼ ▼ ▼ ┌──────────┐ ┌──────────┐ ┌────────────┐ │ MySQL │ │ Redis │ │ RabbitMQ │ │ 数据库 │ │ 缓存 │ │ 消息队列 │ └──────────┘ └──────────┘ └──────┬─────┘ │ ┌────────────────────┼────────────────────┐ ▼ ▼ ▼ ┌────────────┐ ┌────────────┐ ┌────────────┐ │ C/C++ 评测机│ │ Java 评测机 │ │Python 评测机│ └────────────┘ └────────────┘ └────────────┘ ``` ### 服务端口说明 | 服务 | 内部端口 | 外部端口(可配置) | 说明 | |------|----------|-------------------|------| | Nginx | 80/443 | 80/443 | 前端访问入口 | | icode-be | 51024 | 51024 | 后端 API | | MySQL | 3306 | 3306(仅 localhost) | 数据库 | | Redis | 6379 | 6379(仅 localhost) | 缓存 | | RabbitMQ | 5672 | 5672(仅 localhost) | 消息队列 | | RabbitMQ Mgmt | 15672 | 15672(仅 localhost) | 管理面板 | > 数据库/Redis/RabbitMQ 的外部端口绑定到 `127.0.0.1`,仅宿主机可访问,增强安全性。 ### 常用管理命令 ```bash # 查看所有容器状态 docker compose ps # 查看所有日志(实时) docker compose logs -f # 查看单个服务日志 docker compose logs -f icode-be docker compose logs -f nginx docker compose logs -f cpp-judge-server # 重启单个服务 docker compose restart icode-be # 重新构建并启动(代码变更后) docker compose up -d --build icode-be # 停止所有服务 docker compose down # 停止并删除所有数据卷(⚠️ 会清空数据库) docker compose down -v # 查看容器资源占用 docker stats ``` ### 首次启动顺序说明 `docker-compose.yml` 中配置了服务依赖和健康检查,容器会自动按以下顺序启动: 1. **MySQL** → 等待数据库就绪(`mysqladmin ping` 健康检查通过) 2. **Redis** → 等待缓存就绪(`redis-cli ping` 通过) 3. **RabbitMQ** → 等待消息队列就绪(`rabbitmq-diagnostics ping` 通过) 4. **icode-be** → 等待 MySQL/Redis/RabbitMQ 全部就绪后才启动 5. **评测机** → 等待 RabbitMQ 就绪后才启动 6. **Nginx** → 最后启动 ### 启动单个服务(调试用) ```bash # 只启动基础设施 docker compose up -d mysql redis rabbitmq # 只启动后端(基础设施需提前启动) docker compose up -d icode-be # 只启动前端 docker compose up -d nginx ``` --- ### 有域名?启用 HTTPS(Let's Encrypt) 如果拥有域名并已将 DNS 解析到服务器 IP,可以一键配置 HTTPS: #### 1️⃣ 配置域名 编辑 `.env` 文件: ```env DOMAIN_NAME=你的域名.com # 如 xiaomazhixue.icu CERTBOT_EMAIL=你的邮箱@example.com ``` > 请确保域名 DNS 已正确解析到服务器公网 IP,且服务器 80/443 端口已开放。 #### 2️⃣ 首次申请 SSL 证书 ```bash # 赋予执行权限 chmod +x init-ssl.sh # 执行 SSL 初始化(会自动申请证书并配置 HTTPS) ./init-ssl.sh ``` 脚本执行流程: 1. 启动 Nginx(HTTP 模式,用于 Let's Encrypt 域名验证) 2. 通过 Certbot 申请 SSL 证书 3. 重启 Nginx(启用 HTTPS) 4. 启动 Certbot 自动续签服务 #### 3️⃣ 验证 HTTPS 访问 `https://你的域名.com`,确认: - ✅ 浏览器地址栏显示安全锁标志 - ✅ HTTP 自动重定向到 HTTPS - ✅ 后端 API `https://你的域名.com/icode-be/` 正常工作 #### 4️⃣ 证书自动续签 Certbot 服务会每 **12 小时** 自动检查证书是否需要续签,无需人工干预。 ``` 证书有效期 90 天 → 到期前自动续签 → 无缝切换 ``` #### 没有域名怎么办? 如果只想在内网或通过 IP 访问,不需要 SSL,直接: ```bash docker compose --env-file .env up -d ``` Nginx 会以 HTTP 模式正常运行,访问 `http://服务器IP` 即可。 --- ### 重建单个服务(代码更新后) 当代码变更后,只需重新构建对应的服务即可: ```bash # 后端代码变更 docker compose up -d --build icode-be # 前端代码变更 docker compose up -d --build nginx # C++ 评测机代码变更 docker compose up -d --build cpp-judge-server # Java 评测机代码变更 docker compose up -d --build java-judge-server # Python 评测机代码变更 docker compose up -d --build python-judge-server ``` ### 从零开始完全重置 ```bash # 停止所有容器并删除数据 docker compose down -v # 删除所有构建的镜像 docker compose down --rmi all # 清理 Docker 系统(可选) docker system prune -a # 重新启动 docker compose --env-file .env up -d ``` ### 生产环境安全建议 | 项目 | 建议 | |------|------| | **密码** | 修改 `.env` 中所有默认密码 | | **API Key** | 使用自己的 DeepSeek API Key | | **端口暴露** | 数据库/Redis/RabbitMQ 默认绑定 127.0.0.1 | | **SSL** | 生产环境务必启用 HTTPS | | **日志** | 定期查看 `docker compose logs` | | **备份** | 定期备份 MySQL 数据卷 | --- ### Docker 镜像私有化 如需将 Docker 镜像推送到私有仓库: ```bash # 标记镜像 docker tag icode-be:latest registry.example.com/icode-be:1.0.0 # 推送 docker push registry.example.com/icode-be:1.0.0 # 在服务器上拉取并运行 docker pull registry.example.com/icode-be:1.0.0 ``` ### 方式二:一键自动部署脚本(不推荐(ai生成脚本) — Ubuntu 服务器) 项目根目录提供了全栈一键部署脚本 `deploy_ubuntu.sh`,**自动安装所有依赖、构建前后端、部署评测器并配置 Nginx 反向代理**。 #### 快速使用 ```bash # 以 root 权限运行 sudo bash deploy_ubuntu.sh ``` #### 交互式步骤选择 脚本启动后会展示 **13 个部署步骤** 的交互菜单,输入数字即可切换启用/禁用: ``` 部署步骤选择 (输入数字切换, 输入 'done' 开始部署): [✓] 1. 检查系统环境 (Ubuntu 版本 / 内存) [✓] 2. 更新系统软件包 [✓] 3. 安装基础依赖 (curl/wget/git 等) [✓] 4. 安装 JDK 21 [✓] 5. 安装 Maven [✓] 6. 安装 Python 3.11+ [✓] 7. 安装 Node.js 18+ [✓] 8. 安装 C++ 编译环境 [✓] 9. 安装 Nginx [✓] 10. 构建部署后端 Spring Boot 服务 [✓] 11. 构建部署前端 Vue 应用 [✓] 12. 构建部署评测器 (C/C++/Java/Python) [✓] 13. 配置 Nginx 反向代理 ``` 输入 `done` 后进入参数配置: 1. **域名配置** — 是否拥有域名、是否启用 Let's Encrypt 自动 SSL 2. **数据库配置** — MySQL / Redis / RabbitMQ 连接信息 #### 自动完成的任务 | 类别 | 内容 | |------|------| | **环境依赖** | JDK 21 / Maven 3.9 / Python 3.11+ / Node.js 20+ / gcc-cmake / Nginx | | **后端部署** | Maven 编译 → 生成 `application-prod.yaml` → 复制 JAR 到 `/app/icode/` → 注册 `systemd` 服务 | | **前端部署** | npm build → 自动设置 API 地址 → 部署静态文件到 `/var/www/html/icode-v2/` | | **着陆页** | 将 `server_index/` 目录(赛博朋克欢迎页)部署到 `/var/www/html/` | | **评测器** | Java 评测器 (Maven 编译) / C++ 评测器 (CMake + AMQP-CPP) / Python 评测器 (venv + pip) → 注册 `systemd` 服务 | | **Nginx 配置** | 三种模式自动生成:有域名+SSL(Let's Encrypt)/ 有域名无 SSL / 无域名 IP 模式 | #### Nginx 三种部署模式 | 模式 | 触发条件 | 配置内容 | |------|----------|----------| | **HTTPS + SSL** | 有域名 + 启用 SSL | 先配置 HTTP → certbot 申请证书 → 自动重写为 HTTPS | | **HTTP 域名** | 有域名 / 不启用 SSL | 标准 HTTP 域名配置 | | **HTTP IP** | 无域名 | `default_server` 监听 80 端口,通过 IP 访问 | 每种模式均包含以下 location 块: - `location = /` → 着陆页(server_index/index.html) - `location ^~ /icode-be/` → 后端反向代理(含 WebSocket 支持) - `location /icode-v2/` → Vue SPA 前端 + `try_files` - `location /xmzx/`、`location /icode/` → 历史路径兼容 - `location ~* \.(js|css|...)$` → 30 天静态资源缓存 #### 步骤失败处理 任何步骤执行失败时,脚本会暂停并提示: ``` 步骤 [xxx] 执行失败 [c] 继续执行后续步骤(跳过当前步骤) [r] 重试当前步骤 [q] 退出部署 ``` #### 部署完成后 脚本输出完整的服务管理命令和访问地址: ```bash systemctl start/stop/restart icode-backend # 后端服务 systemctl start/stop/restart java-judge # Java 评测器 systemctl start/stop/restart cpp-judge # C++ 评测器 systemctl start/stop/restart python-judge # Python 评测器 systemctl status icode-backend # 查看后端状态 journalctl -u icode-backend -f # 查看后端日志 systemctl reload nginx # 重载 Nginx 配置 ``` > **注意**:此脚本替代了旧版 `BE/deploy_ubuntu.sh`(仅部署评测器)。如需单独部署评测器,可继续使用旧版脚本。 #### 另见:旧版评测器部署脚本 如需**单独部署评测器**(不涉及前后端和 Nginx),仍可使用: ```bash sudo bash BE/deploy_ubuntu.sh ``` 旧版脚本会安装依赖并部署 Java / C++ / Python 三个评测器,创建以下管理脚本: ```bash ./BE/start_all.sh # 启动所有评测器 ./BE/stop_all.sh # 停止所有评测器 ./BE/restart_all.sh # 重启所有评测器 ./BE/status_all.sh # 查看所有服务状态 ./BE/logs_all.sh java # 查看 Java 评测器日志 ``` ### 方式三:独立打包部署(生产环境推荐) #### 后端独立打包 ```bash cd BE/icode-be # 使用 Maven 打包(跳过测试) mvn clean package -DskipTests -Pprod # 打包产物 ls target/icode-0.0.1-SNAPSHOT.jar # 传输到云服务器 scp target/icode-0.0.1-SNAPSHOT.jar user@your-server:/app/icode/ # 远程启动 ssh user@your-server java -jar /app/icode/icode-0.0.1-SNAPSHOT.jar \ --spring.datasource.url=jdbc:mysql://:3306/icode \ --spring.datasource.username=icode \ --spring.datasource.password= \ --spring.data.redis.host= \ --spring.rabbitmq.host= \ > /app/icode/logs/app.log 2>&1 & ``` #### 前端独立打包 ```bash cd FE # 设置生产环境 API 地址 # Windows PowerShell: $env:VUE_APP_API_BASE_URL="https://your-domain.com" npm run build # 或修改 vue.config.js 中 proxy 目标地址 ``` 构建产物在 `FE/dist/` 目录,将其部署到 Nginx 或上传至对象存储(如阿里云 OSS、腾讯云 COS)即可。 ### Docker 镜像私有化 如需将 Docker 镜像推送到私有仓库: ```bash # 构建镜像 docker build -t registry.yourcompany.com/icode-backend:1.0.0 ./BE/icode-be # 登录私有仓库 docker login registry.yourcompany.com # 推送镜像 docker push registry.yourcompany.com/icode-backend:1.0.0 # 在云服务器上拉取并运行 docker pull registry.yourcompany.com/icode-backend:1.0.0 docker run -d --name icode-backend \ -p 51024:51024 \ -e SPRING_DATASOURCE_URL=jdbc:mysql://:3306/icode \ -e SPRING_DATASOURCE_USERNAME=icode \ -e SPRING_DATASOURCE_PASSWORD= \ registry.yourcompany.com/icode-backend:1.0.0 ``` ### 生产环境部署架构图 ``` 用户 │ ▼ ┌─────────────────┐ │ Nginx (443) │ │ HTTPS 反向代理 │ └────────┬─────────┘ │ ┌───────────────┼───────────────┐ ▼ ▼ ┌─────────────────┐ ┌─────────────────┐ │ 前端静态资源 │ │ 后端 API 代理 │ │ /icode-v2/* │ │ /api/* → :51024 │ │ (dist/ 目录) │ │ /ws/* → WebSocket│ └─────────────────┘ └────────┬─────────┘ │ ┌────────┴────────┐ │ icode-backend │ │ (Spring Boot) │ │ 端口 :51024 │ └────────┬─────────┘ │ ┌──────────────────────────────┼──────────────────────────────┐ │ │ │ ▼ ▼ ▼ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │ MySQL │ │ Redis │ │ RabbitMQ │ │ :3306 │ │ :6379 │ │ :5672 │ └─────────────────┘ └─────────────────┘ └────────┬─────────┘ │ ┌──────────────────────────────────────────────┼──┐ │ │ │ │ ▼ ▼ ▼ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┘ │ C/C++ 评测器 │ │ Java 评测器 │ │ Python 评测器 │ │ (AMQP-CPP) │ │ (Spring Boot) │ │ (Python) │ └─────────────────┘ └─────────────────┘ └──────────────────┘ ``` --- ## 配置说明 ### 后端配置(application.yaml) | 配置项 | 说明 | 默认值 | |--------|------|--------| | `server.port` | 服务端口 | 51024 | | `spring.datasource` | MySQL 数据库连接 | — | | `spring.data.redis` | Redis 缓存配置 | — | | `spring.rabbitmq` | RabbitMQ 消息队列 | — | | `deepseek.api-key` | DeepSeek AI API 密钥 | 需自行配置 | | `deepseek.model` | DeepSeek 模型 | deepseek-v4-pro | | `file.upload.root-path` | 文件上传路径 | ./resource | | `file.access.base-url` | 文件访问基础 URL | — | ### 前端配置(vue.config.js) | 配置项 | 说明 | 默认值 | |--------|------|--------| | `publicPath` | 生产环境部署路径 | /icode-v2/ | | `devServer.proxy` | 开发环境 API 代理 | localhost:8080 | | `MonacoWebpackPlugin` | 代码编辑器语言支持 | C/CPP/Java/Python/JS/TS | ### 评测器配置 各评测器通过环境变量或 `config.json` 配置 RabbitMQ 连接信息和评测参数: | 配置项 | 说明 | |--------|------| | `RABBITMQ_HOST` | RabbitMQ 地址 | | `JUDGE_TIMEOUT_BUFFER_MS` | 超时缓冲时间 (ms) | | `JUDGE_TEMP_DIRECTORY` | 临时评测目录 | --- ## API 概览 ### 认证相关 - `POST /api/auth/login` — 用户登录 - `POST /api/auth/register` — 用户注册 - `POST /api/auth/captcha` — 获取验证码 ### 题目相关 - `GET /api/problems` — 题目列表(支持分页、搜索、筛选) - `GET /api/problems/{id}` — 题目详情 - `POST /api/problems` — 创建题目(教师) - `PUT /api/problems/{id}` — 编辑题目(教师) - `DELETE /api/problems/{id}` — 删除题目(教师) ### 评测相关 - `POST /api/judge/submit` — 提交代码评测 - `GET /api/judge/result/{id}` — 查询评测结果 - `GET /api/judge/history` — 评测历史 ### AI 能力 - `GET /api/ai/stream/chat` — AI 流式对话 (SSE) - `GET /api/ai/stream/analyze` — AI 代码分析 (SSE) - `GET /api/ai/stream/hint` — AI 解题提示 (SSE) - `WebSocket /ws/deepseek` — AI 流式 WebSocket 接口 - `WebSocket /ws/notification` — 通知推送 ### 任务相关 - `GET /api/tasks` — 任务列表 - `POST /api/tasks` — 创建任务 - `GET /api/tasks/{id}/progress` — 学生进度 ### 竞赛/考试 - `GET /api/contests` — 竞赛列表 - `POST /api/exams` — 创建考试 - `POST /api/exams/{id}/submit` — 提交考试答案 - `GET /api/exams/{id}/result` — 考试成绩 > 完整 API 文档请参见 `docs/` 目录下的文档。 --- ## 定时任务(Quartz) 系统内置了以下定时任务,自动运行: | 任务 | 说明 | 触发频率 | |------|------|----------| | TaskStatusUpdateJob | 更新任务状态(过期自动关闭) | 每分钟 | | TaskStatusTriggerJob | 触发定时发布的任务 | 每分钟 | | TaskErrorAnalysisJob | AI 自动分析学生错误 | 每天凌晨 | | TaskTeachingSuggestionJob | 生成教学改进建议 | 每天凌晨 | | ExamAutoGradingJob | 自动阅卷(客观题) | 考试结束后 | | DashboardSnapshotJob | 仪表盘数据快照 | 每小时 | | LeaderBoardSnapshotJob | 排行榜缓存快照 | 每小时 | | TeamHeatDeductionJob | 战队活跃度扣减 | 每天 | --- ## 常见问题 ### Q: 前端开发时如何解决跨域? 前端已配置代理,`vue.config.js` 中 `devServer.proxy` 会将 `/api` 请求代理到后端 `localhost:8080`。如后端端口不同,可修改 `VUE_APP_API_BASE_URL` 环境变量。 ### Q: 如何修改前端生产环境的 API 地址? 方法一:构建时设置环境变量 `VUE_APP_API_BASE_URL=https://your-api.com` 方法二:修改 `vue.config.js` 中 chainWebpack 里的默认值 ### Q: 部署后 WebSocket 连接失败? 确保 Nginx 配置了 WebSocket 代理支持(Upgrade 和 Connection 头)。详见上方 Nginx 配置示例。 ### Q: 评测功能无法使用? 1. 检查 RabbitMQ 是否正常运行 2. 检查评测器是否成功连接到 RabbitMQ 3. 查看评测器日志定位具体原因 4. 运行 `docker compose logs` 或 `./BE/logs_all.sh` 查看日志 ### Q: 如何修改 DeepSeek API Key? 编辑 `application.yaml` 中的 `deepseek.api-key`,或通过环境变量 `DEEPSEEK_API_KEY` 传入。 --- ## 许可证 本项目仅供学习交流使用。 ## 联系方式 - 项目仓库:https://gitee.com/speaker01/zjj_icode - 如有问题,请提交 Issue 或联系项目维护者。