fix: import unpublished exam rooms and add opt-in school HTML feedback
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
# Android 首版验证记录
|
||||
|
||||
当前本科登录与导入修复版为0.7.4+22,验证见 [0.7.4记录](tpschedule-0.7.4-validation.md)。本科接入记录见 [0.7.0记录](tpschedule-0.7.0-validation.md)。下文为首版历史记录。
|
||||
当前版本为0.7.5+23,兼容本科考试未发布考场,并新增可选HTML反馈附件,验证见 [0.7.5记录](tpschedule-0.7.5-validation.md)。两例真实课表缺失字段问题待新页面定位。本科接入记录见 [0.7.0记录](tpschedule-0.7.0-validation.md)。下文为首版历史记录。
|
||||
|
||||
日期:2026-10-13。测试环境:Flutter 3.47.7 / Dart 3.13.5 / JDK 17;Android 16 API 36,Pixel 7 模拟器,1080×2400。首版版本 0.1.0+1,包 ID com.example.hepan_everyday,最低 Android 7.0(API 24)。
|
||||
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
# 学校接入状态 · TPSchedule 0.7.4
|
||||
# 学校接入状态 · TPSchedule 0.7.5
|
||||
|
||||
0.7.5兼容本科考场/座位合并为“考试情况尚未发布”的记录,新增默认关闭的HTML邮件排查附件及具体课表字段错误码。0.7.4两例课表失败仍需实际页面才能定位,不宣称已解决,见[0.7.5记录](tpschedule-0.7.5-validation.md)。反馈服务器需同步更新,代理请求体至少24MiB。
|
||||
|
||||
0.7.4将本科重复登录的准确学校HTTP继续链接升级为HTTPS,并解决完整页恢复后History API改变实际文档地址、原生历史地址未同步导致的“页面证据无效”。现按实际文档地址抓取且保留同源及精确校验,见[0.7.4记录](tpschedule-0.7.4-validation.md)。
|
||||
|
||||
|
||||
@@ -0,0 +1,43 @@
|
||||
# TPSchedule 0.7.5+23:本科排考未发布兼容与HTML反馈排查
|
||||
|
||||
2026-10-16,F:/program/app。用户提供三份0.7.4+22日志与截图,均为本科流程,浏览器Chromium138.0.7204.179。前两例显示完整课表但点击导入时报“教师、教室或课程序号缺失”;第三例有日期和考试时间,但考场/座位显示“考试情况尚未发布”,读取报“考试记录字段不完整”。本记录不包含原始学生HTML、账号或日志正文。
|
||||
|
||||
## 定位与范围
|
||||
|
||||
考试解析器原先以9个物理单元格判断完整性。截图提示考场、座位被合并为一个尚未发布的单元格;构造该结构的回归用例在原实现中稳定失败。现仅接受位于考场列的colspan=2且文本为“考试情况尚未发布”的已知结构,恢复逻辑列映射,保留日期、时间、情况及考试类型;座位留空供界面显示尚未安排。其他异常合并、类型/学期不一致和损坏页面继续拒绝,旧数据不被部分结果覆盖。
|
||||
|
||||
课表的笼统错误由教师为空、教室为空或课程序号后缀格式不符三种分支共同产生。日志不含这些字段,测试同学无法提供新HTML,因此目前不能判断其中哪一种是实际原因,也不宣称修复了这两例课表导入。现区分固定原因码teacher_missing、room_missing、course_sequence_invalid及活动序号;日志中不写课程/教师/教室值。
|
||||
|
||||
## 用户确认的HTML反馈功能
|
||||
|
||||
用户选择通过反馈邮件发送,而不是新增本地导出。反馈问题页面在日志下新增默认关闭的“附带最近一次本科导入页面HTML”,须先选择日志并同意个人信息提示。加入开发的申请不携带HTML。
|
||||
|
||||
只保存来源校验通过后、解析前得到的本科课表/课程名单或考试表格片段,最大2MiB,单份内存缓存最多10分钟;退出登录、重新认证、开始新流程及会话销毁清除,不写本地日志/文件。离开学校浏览器返回反馈页面会保留尚未过期的缓存。提交时冻结附件及编号,失败重试字节不变;冻结副本的生命周期是当前反馈表单。过期或不存在时明确提示重新尝试导入或取消附件,保留填写内容。
|
||||
|
||||
片段移除账号页头、表单、事件/URL属性、网络资源、无关脚本和认证参数,只保留课程/考试表格、数字学期/类型以及课程声明与节次赋值;课程脚本使用不执行的类型,HTML带禁止网络/表单的CSP。扫描器不要求声明字段有效,保留null、未知节次表达式和注释后的声明,避免过滤掉错误证据。个人课表信息仍可能敏感,学生需主动同意。
|
||||
|
||||
客户端新增独立multipart字段diagnostic_html;服务端限制一份2MiB UTF-8 HTML,校验固定前缀、平衡结构、标签/属性白名单、精确CSP和惰性脚本类型。拒绝活动脚本、网络资源和事件属性,作为TPSchedule-school-page.html附在邮件中,不占媒体名额,参与原幂等摘要。旧客户端兼容。
|
||||
|
||||
## 验证证据
|
||||
|
||||
- 考试合并单元格用例先失败、修复后通过,异常跨度仍拒绝。
|
||||
- 课表错误分别报告固定原因;失败前捕获证据,退出后清除。HTML过期、来源限制和认证资料过滤通过。
|
||||
- 原过滤器遗漏异常声明、未知节次及注释前缀的回归先失败;修正后导出仍保留原解析错误,正常合成课表重放为18条安排。
|
||||
- 反馈默认关闭、提示确认、不可变附件及失败重试通过;服务端验证第5个附件、独立限额、无效MIME/UTF-8、超限、开发申请拒绝和幂等冲突。
|
||||
- 使用Dart实际过滤器生成9387字节合成样本,Python服务接收并生成逐字节一致的邮件附件;样本中均为测试课程、教师和教室,不是学生原HTML。
|
||||
- 完整Flutter测试281项通过;flutter analyze无问题;4项实际JavaScript采集脚本检查通过;Python反馈服务66项测试通过。
|
||||
- 独立审查两项Important发现(错误证据丢失、服务端活动HTML)修正后复核,无未解决Critical/Important项。审查未代替真实账号测试。
|
||||
|
||||
## 部署与复测
|
||||
|
||||
反馈服务需更新同一容器代码,保留.env、SMTP密码、IDEMPOTENCY_SECRET和数据库卷。OpenResty及雷池请求体放行至少24MiB,原域名和端口链路保持。详见[0.7.5服务器更新说明](../server/feedback/html-diagnostic-update.md)。本次没有操作线上服务器或发送真实邮件。
|
||||
|
||||
覆盖安装后在校园网复测考试,核对待发布考场不会阻断导入;课表再尝试导入,在10分钟内返回反馈页勾选日志与HTML发送,取得具体缺失字段及页面后继续修复。真实手机、真实学校页面和线上SMTP仍需用户确认。
|
||||
|
||||
## 构建及签名
|
||||
|
||||
正式版与调试版构建通过。首次发布构建因生成的注册文件残留integration_test而失败,按完整发布构建流程重新生成配置后通过;该文件不入源码,未修改应用依赖或签名。正式APK的applicationId=com.tpschedule.app、versionName=0.7.5、versionCode=23,minSdk=24、targetSdk=36,60254031字节。
|
||||
|
||||
TPSchedule-0.7.5.apk与TPSchedule.apk相同,SHA256为A9BBBB1A64F14661A91D049D868309138DEBDD54D486363090B9AECEEC68CEF5。apksigner验证通过,与0.7.4证书逐字节相同,证书SHA256仍为AF5C21B1BA1E48E461D8EA38DF0FE1C3653F64EB7E8E7728BAE6E5D988BA0D0A。
|
||||
|
||||
API36测试模拟器安装此正式包成功,冷启动返回Status=ok、LaunchState=COLD、TotalTime=1312ms,进程存在。Windows模拟器沿用测试专用的软件渲染启动参数,未修改手机安装包的默认渲染配置;这不是用户手机启动耗时结论。测试后关闭本任务创建的emulator-5556。
|
||||
Reference in New Issue
Block a user