关联:执行-批次1:品牌/图标替换 蓝湖来源:项目「城市生命线驾驶舱」,9 个画板 2026-10-12 版(v3/v4) 本文档只讲怎么验收;改动理由与映射过程见票 14 与复查附录。
驾驶舱顶栏品牌位与地图四个图层 chip 的图标,从代码内联的几何占位图形换成蓝湖导出的正式切图,经统一资产解析层按语义 key 消费。
只有 6 个位置会看到变化:
| 位置 | 改动前(占位) | 改动后(正式切图) |
|---|---|---|
| 顶栏品牌位 | 同心圆 + 十字轴线,白色描边 | 渐变浅蓝底板 + 顶部青色亮边(蓝湖 nav/title-bg) |
| chip「管线图层」 | 三层叠片菱形 | 网格方块 |
| chip「监测点」 | 双同心圆 | 水滴 |
| chip「事件定位」 | 空心三角 + 感叹号 | 实心警告三角(橙黄) |
| chip「应急资源」 | 屋顶+门框线稿 | 火焰(红橙) |
| 空面板占位 | 折线框 + 折线 | 不变(设计稿未覆盖,仍走原占位) |
首次交付未能生效,2026-10-12 已修复。 审核发现「图标没有应用到场景中」,连到真实运行地址定位到两个叠加缺陷: ① 资源路径少一级目录——manifest 写
icons/brand.png,文件实际在public/cockpit/assets/icons/,导致浏览器请求/cockpit/icons/brand.png落到 Vite 的 dev 兜底页上,返回 200 +index.html,status: 200骗过了 HTTP 层与原格式校验两层检查(复现坑见 §3); ② 品牌位改宽挤掉标题——品牌槽从 32×32 改成 90×34 后,顶栏「城市生命线驾驶舱系统」被截断,已按切图原比例收回 50×19。 修复后复验:6/6 资源返回正确image/png/image/svg+xml与正确字节;标题完整显示;品牌底板在顶栏可见。 同时把校验补强到文件真实可达 + 拒绝 HTML 兜底页 + 内容 hash 一致,避免同类问题再靠人工发现。 另需知悉:icon.brand素材本身像素级实测 alpha 仅 10–18%,是半透明装饰板,叠在深色顶栏上呈低调浅蓝光晕——这是素材特性,不是渲染故障;其余四枚为完全不透明的实心彩色图标。
在仓库根目录执行,逐条比对:
# 1.1 正式切图已入库(17 个 PNG + 1 个临时 SVG)
Get-ChildItem public/cockpit/assets/icons | Select-Object Name, Length
# 1.2 旧占位 SVG 已删除(应只余 blank.svg)
Get-ChildItem public/cockpit/assets/icons -Filter *.svg
# 1.3 manifest 状态:17 条 formal + 1 条 temporary(且文件真实可达)
node .scratch/lanhu-cockpit-asset-replacement/research/check-manifest.mjs
# 1.4 确认组件与地图服务中没有散落的物理路径(只应命中解析层 1 处)
git grep -n "cockpit/assets" -- src
# 1.5 四处交叉引用一致性:注册表 ↔ manifest ↔ 组件引用 ↔ 面板/行业映射
node .scratch/lanhu-cockpit-asset-replacement/research/cross-check-icons.mjs
判定:1.1 看到 17 个 png + blank.svg;1.2 只剩 blank.svg;1.3 打印 manifest 校验通过(含文件可达性与 hash 一致性),退出码 0;1.4 只出现 runtimeAssets.js:15 一行;1.5 打印 ✅ 四处交叉引用完全一致。
1.3 现在会比对磁盘上的真实文件、拒绝 HTML 兜底页、并核对内容 sha256——这三项正是本次缺陷 1(路径少一级目录、被 dev 兜底成 200 HTML)漏掉的口子,已补上。
补充人工核对(打开文件看):
public/cockpit/assets/manifest.json 中每条含 source.board(蓝湖画板名)、source.layer(图层路径)、source.url(导出地址)、hash(sha256)、dimensions、statussrc/modules/cockpit/components/CockpitIcon.vue 有 renderMode === 'image' 分支(彩色切图)与 mask 分支(单色)并存src/modules/cockpit/CockpitShell.vue:1709 附近 .cockpit-shell__mark 为 width: calc(50 * var(--u))、height: calc(19 * var(--u))(按切图 90:34 原比例缩放;直接用 90×34 会把标题挤出顶栏),且选择器含 imgsrc/modules/cockpit/CockpitShell.vue 的 .cockpit-shell__brand-text 带 flex: none(保证标题不被压缩)直接看蓝湖导出的正式切图:
| key | 文件 | 应看到 |
|---|---|---|
icon.brand |
brand.png | 浅蓝渐变矩形板,顶部一条青色亮线 |
icon.layers |
pipe-facility.png | 管网设施(弯管,蓝渐变) |
icon.points |
pipe-alert.png | 预警处置(警灯,蓝渐变) |
icon.event |
pipe-command.png | 应急指挥(文档+警示三角,蓝渐变) |
icon.resource |
scale-kind.png | 规模种类(双层数据库堆叠,蓝渐变) |
icon.manhole |
manhole.png | 井盖(紫色网格球) |
icon.infrastructure |
infrastructure.png | 楼宇 |
icon.facility |
facility.png | 立方体(红) |
icon.safety |
safety.png | 盾牌对勾 |
icon.history |
history.png | 时钟 |
icon.efficiency |
efficiency.png | 绿色对勾圆 |
icon.pulse |
pulse.png | 信号波形 |
icon.close |
close.png | 关闭叉 |
icon.emergency |
emergency.png | 大火焰 |
icon.industry.gas |
industry-gas.png | 消防栓(绿) |
icon.industry.water |
industry-water.png | 水波 |
icon.industry.drainage |
industry-drainage.png | 雨云 |
判定:17 张都能正常显示(不是空白/破损);语义对得上——弯管=管线图层、警灯=监测点、文档警示=事件定位、数据库堆叠=应急资源(均为维护者指派的 Pipe/Q 系列切图)、紫网格球=井盖(行业筛选「窨井」)、楼宇=基础设施、消防栓=燃气、水波=供水、雨云=排水、时钟=历史、对勾=效率、波形=实时监测。
若图片显示不出来,先确认浏览器没有拦截本地相对路径;也可直接用系统图片查看器打开。
真实运行地址:http://127.0.0.1:8000/#/cockpit(维护者已提供并在运行,无需重启)。
Content-Type 是不是 image/png;若是 text/html 说明路径错了(这正是本次修复的缺陷 1)。① 顶栏品牌位
② 16 个面板标题图标(切换四个一级模式逐一看)
data-panel-id 仍在③ 行业筛选按钮图标(顶栏「行业」一栏)
data-industry 仍在④ 四个图层 chip(需先点开「地图摘要」浮标;须与文字同行)
.map-info__layer-chip 失效)⑤ 无地图位置浮块
⑥ 空面板占位
icon.blank 是 temporary)⑦ 结构未受影响(重点回归)
button.textContent.trim 应与改动前一致)// 应输出渲染出来的图标:17 条 formal + 1 条 temporary(品牌位 1 + 行业 4 + 面板按当前模式若干 + chip 4)
Array.from(document.querySelectorAll('[data-icon-name]'))
.map(el => `${el.dataset.iconName}=${el.dataset.assetStatus}`)
// 面板图标覆盖度:切四个一级模式,看 16 个 panelId 是否都出图标
Array.from(document.querySelectorAll('[data-panel-id]'))
.map(el => `${el.dataset.panelId}:${el.querySelector('[data-icon-name]')?.dataset.iconName || 'MISSING'}`)
期望:所有条目的 status 为 formal,只有 blank=temporary;data-panel-id 列表 16 项且无 MISSING。
若某条为空 → 该图标没渲染出来;Resource 面板里搜 cockpit/assets/icons,确认 Status 列是 200 且 Content-Type 为 image/png(若为 text/html 即路径错误)。
截图留存:顶栏品牌位一张、行业筛选栏一张、某模式的左/右栏面板标题一张、地图摘要展开后的四个 chip 一张。
| 结果 | 结论 |
|---|---|
| 静态全过 + 走查 ①–⑦ 全过 | 批次 1 通过,可关闭票 14 |
| 静态全过 + ① 或 ② 观感不可接受 | 记为视觉偏差,登记进票 06 缺口清单 |
| ② 图标发白/全黑 | 缺陷:走了单色渲染分支,需要修 CockpitIcon.vue 的 image 分支 |
| ⑤ 出现模式/面板/地图行为变化 | 阻断:说明改动越界,需回退并复查 |
本批改动是自包含的,回滚成本低:
# 回滚代码与 manifest(会一并恢复 5 个占位 SVG)
git checkout -- src/modules/cockpit public/cockpit
# 或只回滚品牌位尺寸调整(切图本身保留)
# 编辑 src/modules/cockpit/CockpitShell.vue 的 .cockpit-shell__mark,恢复 32×32
回滚后:顶栏恢复白色同心圆,四个 chip 恢复几何占位图形,其余功能不受影响(资产层改动已隔离在 icons.js / runtimeAssets.js / CockpitIcon.vue 三处)。
AGENTS.md 限制,视觉效果的最终判定必须由方式三完成。panelId、状态词表、地图图层、拾取与定位契约——本批只换素材来源。icon.blank 仍是占位:设计稿确实没有空面板占位图示,属「设计稿未覆盖」,不算缺陷。