# OPTIMIZATION 已实现、但还需要你实测确认的事项。确认没问题后把对应条目删掉。 ## 首次进入课程自动加入(syncSelf) **状态**:已实现,待实测确认。 ### 做了什么 首次进入没加入过的课程时,平台课时树会回 `code=500`「你还没有加入学习…」,前端把这句话 渲染成挡路的弹层,不点就进不去。真正把账号同步进课程的是页面自己发的这一发: ``` GET /mod/school/wanpeng/syncSelf?courseCode= ``` (抓包实录:`isJoin=0 needJoin=1` → syncSelf 约 2s → 再拉 `getById` 就是 `isJoin=1`。) `POST /course/front/student/join` 对 `isFreeJoin=0` 的慕课课会被拒「该课程无法直接加入,请联系管理员」, 所以现在 `ensure_study_join` 的顺序是:已加入 → `student/join` → `syncSelf` + 轮询 `getById`(约 11s) → 刷新 jspx 课程页复查。`course_code` 取自 `trainCourse/getById` 的 `courseCode`。 ### 怎么测 1. 用一个没加入过该课程的账号,或把某课时的 `studyLog` 清掉(制造「首次进入」)。 2. 跑一次自动学习,看日志里加入那一段。 预期出现其中一条: - `加入培训:同步课程页后已加入(student/join 被拒:…;syncSelf=请求成功)` - `加入培训:刷新课程页后已加入(…)` 确认点是:之后的 `period/study/log` 真记账(课时 `completeTime` 有值),且全程不需要人工点弹层。 ### 如果没生效 - 日志是 `加入培训被拒:…;课程没有 courseCode,无法走同步接口` → 该账号/该课程的 `getById` 没返回 `courseCode`,需要再抓一次包定位它的来源 (抓包时重点看 `syncSelf?courseCode=` 参数是从哪个响应/本地状态来的)。 - 日志显示 syncSelf 成功但 `getById` 一直 `isJoin=0` → 同步在服务端没落库,先看 `syncSelf` 响应的 `result.code`,再考虑补 `/mod/gjt/roleList` 之外的接口。