-
Notifications
You must be signed in to change notification settings - Fork 0
08 standard crawl and field alignment
github-actions[bot] edited this page Apr 1, 2026
·
1 revision
本文说明 从工标网拉取标准元数据 的后端链路、前端回填注意点,以及与 .cursor/rules 中已记录问题的对应关系。
在「标准规范」维护表单中,按标准号从 csres.com 拉取元数据,自动填充标准名称、日期、状态等,减少手工录入。
| 环节 | 文件 | 说明 |
|---|---|---|
| API 入口 | backend/apps/standards/views.py |
StandardViewSet → @action crawl,POST .../crawl/
|
| 编排 | backend/apps/standards/csres_crawl.py |
crawl_standard_metadata |
| 解析 | backend/apps/standards/csres_parse.py |
fetch_csres_metadata(无 Django 依赖,可与脚本共用) |
| 演示脚本 | scripts/csres_fetch_demo.py |
单独调试抓取结果应与线上一致 |
权限:lims_action_map 将 crawl 映射为 view,避免仅有 view/edit 的业务角色无法调用(见 views.py 注释)。
路由前缀:/api/v1/standards/(backend/limis/urls.py);爬取动作为 POST .../crawl/(detail=False)。
| 环节 | 文件 |
|---|---|
| HTTP 信封 | frontend/src/utils/request.ts |
| 载荷剥层 | frontend/src/utils/apiField.ts |
| 表单 |
frontend/src/views/standards/StandardList.vue(及关联表单组件) |
-
信封:接口统一
{ code, message, data };网关若把code变为字符串,旧逻辑会解包失败 → 仅部分字段偶发有值。 -
嵌套:响应可能是
data.data多层,需要unwrapCrawlPayload剥到含standard_no/name的平面对象。 -
命名:后端 DRF 多为 snake_case;序列化若出现 camelCase,需
apiField同时读取两种键名。
用户输入标准号 → 点击爬取
↓
POST /api/v1/standards/crawl/
(路由注册见 backend/apps/standards/urls.py:`router.register('', StandardViewSet)`,避免 /standards/standards/ 重复)
↓
crawl_standard_metadata → fetch_csres_metadata
↓
返回业务字段对象
↓
request 解包 → unwrapCrawlPayload → 合并到表单 model
| 风险 | 说明 |
|---|---|
| 外部站点结构变更 |
csres_parse.py 需同步更新;可用 demo 脚本回归 |
| 频率过高被封 IP | 服务端限流、缓存或人工触发 |
| 解析兜底错误 | 规则中已说明「现行、较新年号」等策略,见解析模块注释 |
回滚:前端/后端字段映射回退到上一 Git 版本;数据层一般不写库(crawl 多为 不落库只回填,以 views.py 说明为准)。
cd /opt/limis
PYTHONPATH=backend python scripts/csres_fetch_demo.py(参数以脚本内 argparse 为准。)
backend/apps/standards/views.pybackend/apps/standards/csres_crawl.pybackend/apps/standards/csres_parse.pyscripts/csres_fetch_demo.pyfrontend/src/utils/request.tsfrontend/src/utils/apiField.ts