# lichangrui **Repository Path**: enterprise-practice/lichangrui ## Basic Information - **Project Name**: lichangrui - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-11-06 - **Last Updated**: 2026-11-13 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 讲座管理系统(企业项目实战实训 · 第 11 周进度版) 后端 `lecture-server`(Spring Boot 3.5.16 / JDK17 / MyBatis-Plus 3.5.7),前端 `lecture-web`(Vue3 + Vite + Pinia + Element Plus + Axios + JSEncrypt)。 本轮对齐任务书第 1~10 次课:项目骨架与联通、统一返回、专业/班级/老师/学生/账号管理、BCrypt+JWT+RSA 鉴权与角色拦截、首次强制改密、讲座发布/报名范围/状态计算、学生 H5 报名与取消(含并发控制)、报名名单与导出。 ## 一、目录结构 ``` lecture-system/ ├─ lecture-server/ # 后端(xxx-server) │ ├─ pom.xml │ └─ src/main/ │ ├─ java/com/lecture/ │ │ ├─ common/ Result/ResultCode/BizException/全局异常/分页 │ │ ├─ config/ WebConfig/分页插件/启动种子/Jackson时间格式 │ │ ├─ security/ JWT/RSA/角色注解/拦截器/当前用户/密码策略 │ │ ├─ entity/ dto/ mapper/ service/ controller/ │ └─ resources/ │ ├─ application.yml / application-dev.yml(含密码,已gitignore) │ └─ db/schema.sql、data.sql ├─ lecture-web/ # 前端(xxx-web) │ └─ src/{api,stores,router,utils,layout,views/admin,views/h5} ├─ api-test/ # IDEA HTTP Client 用例 └─ db/ # 可直接执行的建表与种子脚本副本 ``` ## 二、环境要求 - JDK 17、Maven 3.8+、MySQL 8.0、Node.js 18+ / npm - 后端端口 `8090`,前端开发端口 `5173`(Vite 代理 `/api` → `http://localhost:8090`,不重写前缀) ## 三、启动步骤 1. 建库并执行脚本(库名已按学号设为 `lecture_20230301059`,与 `application-dev.yml` 一致;换机器只需改这两处): ```sql source db/schema.sql; source db/data.sql; ``` 2. 修改 `lecture-server/src/main/resources/application-dev.yml` 中的数据库账号密码。 3. 启动后端: ```bash cd lecture-server mvn spring-boot:run ``` 4. 启动前端: ```bash cd lecture-web npm install npm run dev ``` 5. 访问后台 `http://localhost:5173/login`;学生 H5 `http://localhost:5173/h5/login`。 ## 四、默认账号 - 管理员:`admin / admin123`(由 `DataInitializer` 启动时用 BCrypt 自动创建,首次登录建议改密)。 - 学生:由“学生管理 → Excel 导入”或新增创建,初始密码 `123456`,`must_change_pwd=1`,首次登录强制改密。 - 老师账号:管理员在“账号管理”为老师档案创建登录账号,初始 `123456`,停用后无法登录。 ## 五、REST 接口(统一返回 `{code,msg,data}`,code=200 成功) ### 公开 / 认证 - `GET /api/hello` 联通测试 - `GET /api/auth/public-key` 获取 RSA 公钥 - `POST /api/auth/login` 管理员/老师登录 - `POST /api/auth/student-login` 学生登录 - `POST /api/auth/change-password` 修改密码 - `GET /api/auth/me` 当前用户 ### 管理员 `/api/admin/**`(`@RequireRole(ADMIN)`) - 专业:`GET/POST /api/admin/majors`,`PUT/DELETE /api/admin/majors/{id}`,`GET /api/admin/majors/all` - 班级:`GET/POST /api/admin/classes`,`PUT/DELETE /api/admin/classes/{id}`,`GET /api/admin/classes/all` - 老师:`GET/POST /api/admin/teachers`,`PUT/DELETE /api/admin/teachers/{id}`,`GET /api/admin/teachers/all` - 学生:`GET/POST /api/admin/students`,`PUT/DELETE /api/admin/students/{id}`;`POST /api/admin/students/import`;`GET /api/admin/students/import-template`;`POST /api/admin/students/reset-password` - 账号:`GET/POST /api/admin/accounts`;`PUT /api/admin/accounts/{id}/enabled`;`POST /api/admin/accounts/{id}/reset-password`;`DELETE /api/admin/accounts/{id}` - 讲座:`GET/POST /api/admin/lectures`;`PUT /api/admin/lectures/{id}`;`POST /api/admin/lectures/{id}/publish`、`/offline`;`DELETE /api/admin/lectures/{id}`;`GET /api/admin/lectures/{id}/enrollments`;`GET /api/admin/lectures/{id}/enrollments/export` - 代报名:`POST /api/admin/enrollments`;`DELETE /api/admin/enrollments/{id}` - 签到码(第 11 次课):`POST /api/admin/lectures/{id}/sign-code/open?type=CHECKIN|CHECKOUT`;`GET .../sign-code/current`;`POST .../sign-code/refresh`;`POST .../sign-code/close` 投屏页:管理后台 → 讲座列表 → “签到投屏”按钮(`/admin/lectures/{id}/sign`),大屏显示 6 位码与倒计时,到点自动换码。 ### 学生 H5 `/api/h5/**`(`@RequireRole(STUDENT)`,范围与权限在后端校验) - `GET /api/h5/lectures` 范围内可见讲座(带可报名/已报名/已满/已截止标签) - `GET /api/h5/lectures/{id}` 详情 - `POST /api/h5/lectures/{id}/enroll` 报名 - `DELETE /api/h5/lectures/{id}/enroll` 截止前取消并释放名额 - `GET /api/h5/enrollments` 我的报名(时间倒序) ## 六、关键业务规则实现位置 - 并发防超卖:`LectureMapper.increaseEnrolled` 条件更新 `WHERE quota=0 OR enrolled_count`。 - 提交信息遵循 Conventional Commits,如: `feat(auth): 实现 BCrypt+JWT 登录`、`fix(enroll): 修复并发报名超额`、`feat(lecture): 增加报名范围过滤`。 - 每次课在 `feature/` 分支开发,下课前推送到 Gitee 并发起 MR 合并到 `develop`。 ## 八、后续课次扩展点(本轮未实现,按任务书第 11~18 次课逐步补全) - 数字签到码生成/刷新/投屏页、学生签到签退、错误锁定、出勤判定与补签、操作日志页面。 - AI 助手:Ollama 对话、Qdrant RAG 知识库、相似度阈值与检索调试接口、只读查询与权限一致、模型不可用降级。 - 老师端(我的班级/本班出勤/数据范围越权拦截)、统计看板、`mysqldump` 数据备份。 - JUnit 单元测试(报名、签到码校验等至少 5 例)、打包 `mvn package` 与前端 `npm run build`、版本标签 `v1.0`。 - 课程文档:需求说明书、设计说明书、测试报告、RAG 调参实验、AI 协同日志(本轮按要求暂不生成)。 ## 九、说明 - `application-dev.yml` 含本地数据库密码,已在 `.gitignore` 中排除,不提交仓库。 - 本源码按规范静态编写;需在装有 JDK17 + Maven 的环境执行 `mvn compile` 与前端 `npm run build` 完成最终编译验证。