Files
OnebotCatalog/web/index.html
wangruiguo fc5ee1dd36 v2.1: DESTACO 风格选型界面 + 参数组合补全(缺组合也能出零件号)
网页版选型改版 (仅网页版, 桌面版待同步)
- 新增零件号实时条: 边选边拼, 已确定片段实心高亮, 未定片段虚化, 进度条随选推进;
  浅色配色 (初版深色块与页面不协调, 已改); 选满且唯一命中时整块转青色实心
- 技术方案: 40 系列中仅 KC 有编码模板 → 改用「当前候选型号的最长公共前缀」,
  已验证 40/40 系列前缀单调增长(不回退)
- 参数选择由下拉菜单改为可视化选项块: 悬停抬升+青色投影, 选中青色填充+✓,
  不可选取值置灰(虚线+划线, 不消失, 让用户看到选项存在但当前组合不适用),
  再点一次取消; 有说明的显示代号+说明, 纯数值用紧凑文字块
- 参数联动仍复用 allowedOptions 规则引擎, 语义未变, 只改渲染

参数组合补全
- 原逻辑: 必须有真实数模才能生成型号 → 库里没有的组合选不出来也出不了号
- infer-sku-template.py 从已有型号反推编码模板, 得 23 个系列 100% 可复现
- verify-templates.py 作为门禁: 用模板重渲染每个已有型号必须逐字一致 ——
  该检查抓出 ULM/ULP 行程补零位数写错(2位写3位), 否则会生成 3000 个不存在的零件号
- gen-missing-combos.py 补全 8 个系列共 3157 个型号 (全库 54136 → 57293)
- 占位数模: 3157 个型号共用 1 个 PLACEHOLDER.step(4.5KB), 构建器按路径打包只存一份,
  数据包仅 2.10GB → 2.14GB (中途用硬链接方案踩坑: NTFS 上限 1024, 超出退化为拷贝白占 500MB)
- _pending_models.csv 输出待补数模清单, 供 AI 补完后替换 step_file

新增脚本: infer-sku-template / verify-templates / quantify-combo-gap /
          gen-missing-combos / gen-placeholder-step / check-combo-unique
新增文档: docs/更改说明-v2.1.md

发现未处理 (已记录在更改说明):
- 夹紧缸 9 系列一组参数对应多型号 (310 个型号, 编码含参数外尾缀, 旧码/新码混用)
- UAGP/LAGP 参数顺序与官方编码结构不符 (传感器应在转角之前)
- 17 个系列因模板不干净未补全 (宁可少补, 不生成可能不存在的零件号)

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-15 02:14:55 +08:00

128 lines
5.4 KiB
HTML

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>OneBot数模下载</title>
<link rel="stylesheet" href="style.css?v=11">
</head>
<body>
<header>
<div class="brand"><img src="OneBot-logo.png" class="logo" alt="OneBot"> OneBot数模下载 <span class="brand-en">ONEBOT Catalog</span>
</div>
<div class="toolbar">
<input id="searchBox" type="text" placeholder="搜索型号 / 关键词 / 拼音">
<button id="btnSearch">搜索</button>
<button id="btnLang">EN</button>
<button id="btnCart" class="cart-badge">清单 (0)</button>
</div>
</header>
<main>
<nav id="tree" class="tree"></nav>
<div id="split1" class="split" title="拖拽调整宽度"></div>
<!-- 首页:全部大类的系列缩略图, 一页铺开 (左树默认展开, 底部箭头可收起) -->
<section id="home" class="home">
<div class="sf-head">
<h2 id="homeTitle"></h2>
<span id="homeCount" class="n"></span>
<span class="grow"></span>
<span class="hint" id="homeHint"></span>
</div>
<div id="matrix"></div>
</section>
<section id="params" class="params hidden">
<div id="modelTitle" class="model-title">请选择产品系列</div>
<!-- 零件号实时条: 边选边拼, 已确定片段高亮 / 待定片段虚化 -->
<div id="skuBar" class="sku-bar">
<div class="sku-label" id="skuLabel">零件号 Part Number</div>
<div class="sku-code" id="skuCode"></div>
<div class="sku-prog"><i id="skuProg"></i></div>
<div class="sku-hint" id="skuHint"></div>
</div>
<div id="paramPanel"></div>
<div id="actions">
<a id="btnDownload" class="btn primary hidden" download>下载 STEP</a>
<select id="btnGenFmt" class="hidden" title="下载格式 (仅非标档位在线生成)">
<option value="zip">全格式 zip</option>
<option value="step">STEP</option>
<option value="iges">IGES</option>
</select>
<a id="btnDatasheet" class="btn hidden">下载 PDF</a>
<button id="btnAddCart" class="btn hidden">加入清单</button>
</div>
</section>
<div id="split2" class="split hidden" title="拖拽调整宽度"></div>
<section id="content" class="content hidden">
<div class="tabs">
<button class="tab active" data-tab="3d">3D / 尺寸图</button>
<button class="tab" data-tab="table">参数表</button>
<button class="tab" data-tab="search">搜索结果</button>
<button class="tab" data-tab="cross">平替对照</button>
</div>
<div class="content-back">
<button id="btnBackHome" class="btn">← 返回系列总览</button>
</div>
<div id="tab-3d" class="tab-body">
<div class="hsplit">
<div id="viewer3dBox" class="hsplit-left">
<iframe id="viewerFrame" class="hidden" allowfullscreen></iframe>
<canvas id="viewer3d" width="900" height="640" class="hidden"></canvas>
<p id="viewer3dHint" class="hint">选型完成后显示 3D 外形 (拖拽旋转 / 滚轮缩放)</p>
</div>
<div id="split3" class="split v" title="拖拽调整大小"></div>
<div id="dimBox" class="hsplit-right">
<img id="dimImage" alt="尺寸图" class="hidden">
<p id="dimHint" class="hint">选型完成后显示尺寸图</p>
<div id="manualWrap"></div>
</div>
</div>
</div>
<div id="tab-table" class="tab-body hidden">
<div class="range-row" id="rangeRow"></div>
<div class="table-scroll"><table id="variantTable"><thead></thead><tbody></tbody></table></div>
</div>
<div id="tab-search" class="tab-body hidden">
<div class="table-scroll"><table id="searchTable"><thead><tr><th>型号</th><th>系列</th><th>STEP</th></tr></thead><tbody></tbody></table></div>
</div>
<div id="tab-cross" class="tab-body hidden">
<div class="range-row"><span>品牌筛选: </span><select id="crossBrand"></select>
<span class="hint" style="margin-left:12px;">只显示当前型号的平替数据; 点击行跳转</span></div>
<div class="table-scroll"><table id="crossTable"><thead><tr><th>品牌</th><th>竞品型号</th><th>我方型号</th><th>备注</th></tr></thead><tbody></tbody></table></div>
</div>
</section>
</main>
<!-- 底部信息栏: 左侧 = 侧边栏折叠按钮 + 状态文字, 右侧 = 服务器状态圆球 (绿=就绪/红=故障) -->
<footer id="status">
<button id="btnTreeToggle" class="tree-toggle" title="收起系列栏">◀ 收起系列栏</button>
<span id="statusMsg">加载中...</span>
<div id="srvStatus" class="srv-status" title="服务检测中…">
<span class="dot"></span>
<span id="srvStatusText" class="text">服务器状态</span>
</div>
</footer>
<!-- 购物车抽屉 (淘宝式清单, 2026-08-24; 刷新页面才清空) -->
<div id="cartOverlay" class="cart-overlay hidden"></div>
<div id="cartPanel" class="cart-panel hidden">
<div class="cart-head">
<span id="cartTitle">我的清单</span>
<button id="cartClose" class="cart-close">✕</button>
</div>
<div id="cartList" class="cart-list"></div>
<div class="cart-foot">
<button id="cartClear" class="btn">清空</button>
<button id="cartDownload" class="btn primary">下载全部 (zip + BOM)</button>
</div>
</div>
<script src="libs/jszip.min.js?v=1"></script>
<script src="config.js?v=1"></script>
<script src="app.js?v=18"></script>
</body>
</html>