Files
yianxue-assistant/实施开发方案.md

94 lines
14 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 谊安学助手实施开发方案
日期:2026-10-18。依据 [需求.md](需求.md),在现有用户脚本上增量开发,完成后构建、验证、提交并推送当前仓库。
## 1. 开发顺序与交付
| 阶段 | 实施内容 | 验收重点 |
|---|---|---|
| 统一题库 | 三岗位来源统一存储、检索与精确匹配;旧数据迁移;生成统一 CSV | 5520 条来源记录不丢失;无岗位文件可用;重复导入不增生;冲突不覆盖 |
| 六栏面板 | 总览、视频、考试、题库、控制台、其他设置;保留拖拽与折叠 | 窄屏可操作;全局暂停常驻;切栏不启动任务或导出 |
| 学习调度 | 从实际页面发现任务,按稳定标识排队;四种模式,顺序与并行 | 不猜业务接口;已完成不重做;受前置条件约束;独立视频与考试任务不重复领取 |
| 视频与恢复 | 真实播放器倍速、平台记录、课中题检测、受限恢复及检查点 | 播放结束不误判完成;主动暂停/弹题不刷新;重试有上限;人工重开默认暂停 |
| 考试流程 | 主题关联预检、整卷预检、逐题间隔、分值读取、选中全文核验、交卷、缺题人工确认开关 | 网页题目与答题卡完整;严格大于 80 分;至少 6 分钟;默认缺题人工确认,关闭后按部分题库规则交卷;真实提交结果确认 |
| 集成发布 | 既有复制/搜索/导出/范围/拖拽回归,更新文档与用户脚本 | 本地模拟业务页面完成交互测试;无外网业务请求;提交并推送远程 |
## 2. 模块边界
- `bank-store.js`、`answer-matcher.js`:统一题库与证据匹配,岗位仅作来源信息。
- `assistant-panel.js`:六个功能栏及状态展示,仅通过回调发出用户操作。
- `attempt-policy.js`:课中题及课程考试共用的可见机会数取证;只读取指定题目/考试容器,不读全页、Angular 私有状态或业务接口。
- `learning-engine.js`:任务、视频、恢复、检查点、日志及多页面协调。
- `exam-controller.js`:当前考试的主题依据、原始进入时间、分值核算及交卷状态机。
- `answer-runner.js`:按配置间隔点击真实选项,保持每步上下文及全文核验。
- `practice-exporter.js`:统一协调页面识别、用户设置、模块生命周期及站点范围。
- `build-userscript.mjs`:发布单文件用户脚本,名称继续为“谊安学助手 2.0”。
## 3. 状态与操作约束
- 用户启动任务才调度。切栏、搜索、读取日志不改变运行状态。
- 课中题归视频任务;考试交卷规则不应用到课中题或练习。
- 考试先核对主题关联;仅相似词不能授权自动答题。完整题干预检发生在试卷加载后,不能将已进入试卷的场次称为未开考。
- 预计得分仅计入答案唯一、当前选中全文一致的题目实际分值。未知、冲突及分值不明不算正分。
- “题目不全时手动确认交卷”开关默认开启:任意题目未匹配、冲突、未核验或不支持,以及正常未答完提醒均等待人工在网站确认。关闭时允许网页整卷完整、全部可匹配题处理并全文核验、预计得分严格大于 80 分且满 6 分钟的部分题库试卷自动交卷及确认正常未答完提醒;未知题不猜答、不计正分。
- 网页整卷和答题卡完整、主题关联明确、分值与分制可核对、可匹配题均已全文核验、预计得分严格大于 80 分和达到最早交卷时长等通用门槛,在任何开关状态下均生效。
- 用户手动作答、关停自动选择、暂停、题库/主题变更均取消旧交卷计划;继续前重新核验。
- 提交过程保存状态;结果不明先等待检查,不重复点击。网站倒计时独立于脚本暂停。
- 同一任务只由一个有效执行页持有;并行受阻时显示原因,不显示虚假的运行成功。
## 4. 样本与验证策略
- 保存网页按静态 DOM 解析,不运行其中原站脚本,也不向业务服务器发送请求。
- 使用真实考试样本验证分值标记、40 题全文匹配及选项换序,使用独立本地模型验证网站选中状态回读。
- 使用可控制时钟与本地提交模型覆盖 80/大于 80、6 分钟前后、人工暂停、未知分值、重复提交及恢复。
- 使用课程/视频模拟页面覆盖倍率、平台完成条件、课中弹题阻塞、卡顿恢复和多页协调。
- 用桌面与窄屏浏览器验证六栏、拖拽、切换状态及控制台;截图保存在系统临时目录。
## 5. 真实环境验收边界
当前包未包含实际课中弹题内容,也没有完整登录后的课程解锁、平台后台播放及正式交卷结果流程。实现采用保守 DOM 识别:结构或结果无法确认时进入等待人工,不猜答案、不伪造学习进度、不绕过网站验证。发布记录须分别说明本地已验证能力和需要在真实环境核实的流程。
验收完成后将需求、实施方案、源代码、测试、统一题库和构建后的脚本一并提交,推送至 `ssh://git@192.168.10.31:2222/qishizhe/yianxue-shauti.git`。
## 6. 本次实现与验证记录
- 发布版本 2.1.0,脚本名称保持“谊安学助手 2.0”。以上模块已接入构建后的单文件脚本,六栏共享全局控制及状态。
- 统一题库保留 5520 条来源记录,2458 道唯一题、2459 个答案组合、1 道冲突题;合并脚本核对原 28 个 CSV 的字段和真实导入结果。
- 增加统一题库、课程状态机、课中题、考试交卷、六栏及完整考试/视频流程回归,连同既有用例共 13 个测试套件。
- 浏览器验证使用本地 Chrome / Playwright,覆盖桌面、390px 窄屏及 320×480 小窗口;Browser 插件在当前环境不可用。截图位于系统临时目录,不提交至仓库。
- 实际保存题目用于验证全文、类型、分值与选项乱序。课程任务、平台完成、并行心跳、课中题判分和提交结果通过独立本地模型验证,没有参加真实考试或调用业务提交接口。
- 补充回归保护异步保存期间的暂停/题库/页面/分值变化、重考计时隔离、未知提交防重复、课中题选中后立即暂停、视频先结束后的并行汇总及平台完成状态展示。
代码交付并不替代第 5 节的真实账号环境验收;未识别的页面结构、身份验证、结果或后台限制会停止受影响任务并提示人工处理。
## 7. 2.1.1 调整:缺题人工确认开关
- “考试答题”栏新增“题目不全时手动确认交卷”开关(`manualConfirmIncomplete`),默认开启,设置跨页面及刷新保存。
- 开启时要求整卷每题唯一精确匹配且当前选中全文核验通过,题库缺题、冲突、未核验、无法唯一映射或不支持时等待人工;网站正常未答完提醒也由用户确认。关闭时恢复部分题库自动交卷,保留题库主题预检、全部可匹配题已处理并全文核验、预计得分严格大于 80 分及默认 6 分钟等条件,允许自动确认本场正常未答完提醒。
- 网页题目或答题卡加载不全、分值或分制不明、主题关联不明确、可匹配题未处理或核验失败、80 分及以下、计时未到、暂停、身份验证及结果不明等条件始终阻止自动交卷。开关不能覆盖这些通用门槛。
- 在入口、提交前复查及确认阶段统一核对开关和通用门槛。切换开关立即暂停当前答题与交卷计划,须用户明确继续后重验,不能关闭时立即提交。未知题不猜答,人工补选的未知答案不自动计正分。
- 本次验收重点:网页整卷完整、已核验 84 分但有 4 题未匹配时,开关开启则满 6 分钟仍不点击提交/确认,关闭并明确继续重验后可按原规则交卷及确认正常未答完提醒;完整 100 分且每题核验通过,达到时长并满足其他条件后可正常自动交卷。另覆盖任何开关状态下的加载不全、分值不明、80 分、主题不明,以及开关默认值、持久化和切换中止。
- 本节记录本次实施与验收范围,测试结果以本次实际执行记录为准。
## 8. 2.1.2 调整:续播、单次机会保护与视频后续考试
1. 在视频栏提供三个独立、默认开启并保存的开关:`autoContinuePlayback`(自动继续上次播放)、`skipSingleAttemptQuiz`(仅 1 次答题机会时交给我处理)、`resumePlaybackOnReturn`(切回页面时自动恢复播放)。设置由协调器传给任务、课中题及考试模块,跨页恢复时保留当前策略。
2. 续播只处理唯一可见、正文匹配“是否继续上次播放的位置?”且同时含“重新开始”“继续播放”两个按钮的网站弹窗,正常点击“继续播放”。关闭开关、已暂停任务、弹窗不明或存在待处理题目时,不擅自播放或选择其他弹窗。
3. 用户确认的单次规则为“只剩 1 次或总共仅允许 1 次答题机会时,交给我手动答题”。公共机会数模块只读取当前弹题/考试范围内可见的允许、总、剩余次数和实际补考文案,1 次或 0 次阻止受影响的自动操作;明确大于 1 次保留证据,未显示时不推断。题干、选项、参考答案、隐藏节点、已答次数、已答题数和交卷人数都不作为机会数证据。
4. 在课中题选项/提交、考试入口及自动答题/交卷前复核该规则,避免只在首次读页检查。详情页机会数证据只用于同一受控考试流,不能把其他课程的次数借给当前试卷。关闭保护仍须通过原有题库全文匹配、分值、计时和交卷条件。
5. 旧站静态代码显示 `visibilitychange` 的后台分支主动暂停视频,没有返回恢复逻辑。本版在切页前保存真实播放状态,后台暂停显示“后台暂停,等待返回”,返回后按开关及实际任务状态续播。手动暂停播放器、全局或局部暂停、弹题和待人工状态优先;后台暂停不触发故障刷新,不伪造播放时长,不承诺后台一直播放。
6. 新安装默认 `all`,即“视频+考试(含课中答题)”;已有保存的模式继续使用,不覆盖用户显式的仅视频选择。顺序模式在平台确认视频完成、关联考试开放后才进入考试,仍受单次机会及题库预检约束;`video`、`videoQuiz` 不进入独立或关联考试。视频栏根据当前模式及保护设置说明后续流程,不增设重复按钮。
本次补充包 `08.zip` 只有 Angular 初始外壳,没有播放器、弹窗、次数提示 DOM 或业务 JS 资源。适配参考旧完整归档的静态模板及脚本片段,不执行下载页面中的原站代码。旧源码已提供续播正文和两个按钮、后台主动暂停、`不及格,还可补考 N 次` 及 `还可重考 N 次` 的静态证据;真实账号的播放器和考试状态仍需实站确认。
最终本地验证:`npm test` 的 15 套回归全部通过,学习引擎另完成 52 项检查。已覆盖三个开关默认值、保存、回读及切栏不触发动作,精确续播与未知弹窗,后台暂停与返回恢复、关闭恢复及用户手动暂停优先,明确 0/1/多次和缺失机会数、补考按钮、隐藏及题干干扰,课中题与考试共同保护,新安装默认与旧模式保留,以及平台确认完成后串联考试。额外验证共享设置不同键并发不丢失、旧读取及旧设置快照不覆盖新值、暂停写入期间不重新启动弹题、不同考试的次数证据隔离、关联考试完整导航及完成后不重复加入任务。桌面及 390px 窄屏检查通过;业务 URL 全部在本地拦截,未操作真实学习或考试记录,真实账号流程仍需实站验收。
## 9. 2.1.3 调整:租约等待与持久日志
- 将同类租约冲突与人工确认等待区分。临时冲突保留自动调度资格,在旧占用失效后重新领取;有效占用不强制抢占。领取成功时清除旧租约等待文案并按实际视频、考试状态更新面板。
- 完整导航及受控恢复仍须核对同一会话、任务、账号、目标页面和有效的一次性标记;手动刷新或新开普通页面继续默认暂停。所有实际动作仍受租约、全局暂停和当前页面证据约束。
- 运行日志继续显示最近 500 条,“清空显示”只清运行日志显示。新增“持续记录诊断日志”开关并默认开启,独立持久保存最近 2000 条诊断记录,刷新后保留;“导出诊断 JSON”“导出诊断 TXT”导出已存记录,“清空已保存诊断”只删除诊断。关闭开关只停止新增,已有记录仍可导出;清空不删除任务检查点、原始考试计时或题库。诊断不含完整题干、选项、答案和 URL 查询参数,多页写入需避免旧页面把新记录覆盖。
- 归档 `01/70-es2015` 的学习地图入口调用 `onSelect` 后通过基类 `navigate` 调用 Angular Router;课程及考试入口均无直接 `window.open`。这排除了该归档入口必然保留旧地图标签的假设,但不推断用户的其他入口行为。
- 本地已复现同类租约领取失败后不再重试、成功恢复后仍显示旧等待提示两项缺陷;这不代表已确认用户必然有多个标签。验证重点为:同类领取失败后租约过期能重试、恢复后提示与动作一致、有效执行器保持互斥、暂停及人工等待仍有效,以及诊断默认值/关闭后可导出/刷新保留/两种清空/2000 条上限和敏感内容过滤。结果以本次实际回归记录为准,不将静态样本及模拟通过等同于真实账号验收。
- 最终验证:`npm test` 的 18 套回归通过;执行权恢复 12 项检查、原学习引擎 52 项检查通过。已实际下载诊断 JSON/TXT 并核对执行权事件、刷新恢复、关闭及清空效果,验证 URL 参数和题目正文不进入导出;桌面和 390px 窄屏检查通过,业务 URL 全部本地拦截。