新增入口 /library,详情深链接 /library/:entity/:id。本地预览 http://127.0.0.1:4181/library。
sort 参数:reviews_asc、reviews_desc、price_asc、price_desc。reviewCount、price 与旧游标,保留平台、品牌等明确条件。商品内评价和价格仍按精确商品ID关联,列表排序不传入商品内部的评价查询。商品详情采用紧凑阅读布局:返回与刷新同排,标题和引用操作合并;概况内商品信息与关联资料并列,手机自动纵排。评论合并为连续分隔列表,正文优先,日期、评分和购买规格作为辅助信息;长评价与追加评价仍可展开全文。栏目、条数与查看范围合并为紧凑工具栏,价格和规格按可用宽度并排。商品来源保留为底部横栏,政策、条款等长文阅读页继续采用原有正文布局。1440、1024、390和320宽度已验证,无横向溢出。
页面 → 同源 POST /api/library → Node只读服务 → Python board_library.py → 当前代际 SQLite。
浏览器只允许 summary / browse / detail / version,复用 Agent 的 retrieval.prepare/search/aggregate,禁止传 SQL、磁盘路径和写命令。Node服务并发上限4、输入24KB、超时25秒,读取数据库时使用 mode=ro、immutable 和 query_only。
本地 src/dev/serve.mjs 仅监听127.0.0.1,接口以 localPreview=true 标识预览环境,员工页面不显示环境与连接状态。正式服务 server/library-api.mjs 仅监听127.0.0.1,启动要求 KSF_LIBRARY_API_TOKEN;生产默认拒绝匿名直连。
生产同源网关必须先校验当前访问者的资料授权,再在服务端转发 Bearer;不得把令牌放前端、URL或静态文件,不应对全互联网无条件注入令牌。项目当前没有已经核实的资料库网关身份接入,因此本次没有修改生产网关或公开研究底料。服务通过 KSF_LIBRARY_REGISTRY 指向私有代际目录,KSF_LIBRARY_PYTHON 指向Python3。无需新增Parse云函数。
在受控宿主准备私有目录(目录0700、文件0600、运行用户属主),复用已经核验的r2包中的 library/library.sqlite。以下路径为宿主示例,不在聊天中传任何凭据。
python3 -B server/voc-library/update_library.py \
--incoming /private/r2/library/library.sqlite --registry /private/industry-library --label '首批资料接入'
# 上一步为只读计划;核对后应用,保存stdout作为回执。
python3 -B server/voc-library/update_library.py \
--incoming /private/r2/library/library.sqlite --registry /private/industry-library --label '首批资料接入' --apply
目录 current.json 是原子切换指针,versions/ 保存不可变数据库;不是把SQLite放到站点静态目录。
update_library.py --incoming <候选.sqlite> --registry <目录> 输出只读计划,核结构、完整性、外键和检索投影数量。--apply 合并到一个新代际:已有商品/评价等沿稳定ID关联,相同内容复用;发生业务字段变更时将旧/新记录存入 record_versions,旧代际仍保留。新价格观察不覆盖旧观察。来源路径或来源ID发生冲突时重映射并保留原批次指纹;字典同code定义冲突直接停止。页面每30秒核版本,可手动刷新。Agent通过更新后的 query_voc.py/voc_db.py 使用相同 --registry 或 KSF_LIBRARY_REGISTRY,每次查询解析同一个指针;尚未更新脚本的旧安装版不能直接声称已同步。发布查询模块时同步更新其清单,保留旧Skill备份,不能改冻结r2压缩包。
python3 -B server/voc-library/update_library.py --incoming /private/new/library.sqlite \
--registry /private/industry-library --label '第二批京东商品资料' --apply
python3 -B server/voc-library/query_voc.py contract --registry /private/industry-library
# 回退也先不带 --apply 核对;只切换指针,不删除任一代际。
python3 -B server/voc-library/update_library.py --registry /private/industry-library \
--rollback <旧generation> --apply
合并功能针对当前v2九类结构。新格式需要字段映射;新实体类型需要版本升级。评价ID不是独立消费者ID,社媒评论数不是已采评论数,榜单标识不是完整Top100/400。未知时间不能用入库日补,政策状态只是截至原资料日期的声明。
前端:src/pages/view-library.js、src/pages/library-product-detail.js、src/pages/library-styles.js、src/core/library.js、src/services/library-service.js、src/app.config.js、src/layout/kf-app.js、src/layout/kf-nav.js、src/utils/router.js、src/pages/view-workbench.js、src/components/icons.js。
服务端:server/library-api.mjs;server/voc-library/board_library.py、update_library.py、voc_db.py、retrieval.py、schema.sql、taxonomy.json、query_voc.py。dev/serve仅本地用,不作为生产服务。
正式静态发布前需先核对同名文件现网版本,合并并保留现网员工称呼、机会卡和成员分组等既有功能,不能用整个旧站点覆盖。后端接通并验收授权后再发布前端入口;保留原文件备份可回退。
node scripts/check.mjs
node --test test/*.test.js server/test/member-groups.test.mjs server/test/board-actions.test.mjs
cd server/voc-library
python3 -B -m unittest test_board_library test_retrieval test_voc_db -v
test_retrieval 与 test_voc_db 使用测试生成的数据。test_board_library 需要受控交付的真实研究库,可通过环境变量 KSF_TEST_VOC_DB 指定其绝对路径;缺少该库时会明确跳过,不将私有数据库放入Git。
浏览器验收 scripts/verify-library-browser.py;证据位于 work/library-preview/browser-validation.json 与截图。同一组真实数据下“京东+康师傅+拌面”命中96个商品。测试单独构建的新增样本仅位于临时目录,不进入本地展示库或生产。