79/100
增删改查、搜索、筛选、排序、统计与本地持久化真实可用且界面精致;但完全没有日期字段(因此"完结写完成日期、重开清理冲突"无法成立)、只有三种阅读状态,且存储损坏时会静默用 8 本示例书覆盖用户数据。
- 需求对照:可运行的书籍追踪应用 ✅;至少 新增/查看/编辑/删除 且记录书名、作者、阅读状态 ✅;更完整实现:页数进度 ✅、评分 ✅、类型标签 ✅、收藏/目标 ✅、搜索 ✅、筛选 ✅、排序 ✅、统计 ✅、本地持久化 ✅;开始/完成日期 ✗(完全没有日期字段);导入导出 ✗;空库/无结果/无效输入/损坏存储的反馈 部分。
- 实测(Chromium 无头):
- 首屏渲染 8 张书籍卡片(首次访问被播种
seedBooks),统计区显示8 books / 2 reading / 4 finished / 目标 4-24;#statusInput的选项实测只有reading/want/finished三项;页面内不存在任何input[type="date"]或#finishInput(实测hasFinishDateField = false)。 - 损坏存储:把
localStorage键值改成'{'后刷新 → 页面无提示、无控制台错误地重新显示 8 本示例书(JSON.parse失败即静默回退到seedBooks),用户原数据在下一次保存时被无声覆盖。
- 一致性要求为何无法满足:理论成果点名的"完成时设置完成日期与最终进度、重新阅读时合理清理冲突字段"是结构性不可达——应用里根本没有开始/完成日期字段,唯一的时间戳是新增时间
added。实测的相关缺口是:把已读完的书(进度 = 总页数)改回"在读"后,进度仍为 100%,没有任何字段被清理。
- 其余缺陷:状态机缺少
paused/abandoned(理论成果列出的五种状态只有三种);空库状态只有在把 8 本示例书全部删光后才可达,全新用户看不到(实测首屏即 8 张卡片);删除只有confirm()确认、没有撤销;ID 用Date.now(),同毫秒两次新增会得到相同 ID(编辑/删除会命中两条);页数只做上界Math.min夹取,无下界/整数校验;评分字段缺失时排序产生NaN(静默失效);"Finished this year" 实际上是全部已读完数量,不按年份过滤(因为没有日期);搜索框的可访问名称被aria-hidden吃掉,只能靠 placeholder。
- 成立且值得肯定的部分:所有用户文本经
escapeHtml,未发现注入点;编辑表单用form.reset()+ 逐字段回填,切换编辑对象不残留上一本数据;搜索对大小写与首尾空格容错;搜索 + 筛选 + 排序三者叠加逻辑一致,计数与列表一致;删除有确认;无任何外部依赖,可file://直接打开;<dialog>+showModal()自带 Esc 与焦点约束;:focus-visible、prefers-reduced-motion、三档响应式断点齐备;视觉维度盲看给 9/10。
- 扣分:需求符合度 −10(无日期字段 −5、状态不全 −3、空库不可达 −2);完整度 −2;正确性 −6(损坏存储静默覆盖 −3、ID 碰撞 −1、页数下界 −1、年份统计口径 −1);视觉 −1;工程 −2。
- 局限:多标签页并发写入
localStorage的覆盖时序未测;iOS 无痕模式下存储抛错的真实表现未测;导入导出因不存在而无从复核;视觉结论来自视觉桥接模型。
评分口径: 需求符合度 40 / 功能完整度 20 / 正确性 20 / 视觉与产品感 10 / 工程组织 10;自定口径,不可与其他模型或阶段比较 引用结论,不代表网站独立复验维护 agent v3(AI,非盲评) ↗
