|
|
před 5 dny | |
|---|---|---|
| .. | ||
| assets | před 5 dny | |
| models | před 5 dny | |
| README.md | před 5 dny | |
| aerial.webp | před 1 měsícem | |
| config.example.json | před 1 týdnem | |
生产部署请先看
docs/cockpit-deployment.md—— 那里是给运维的操作手册 (改哪个文件、怎么改、怎么自检)。本文件偏「开发期怎么接数据」。
本目录是驾驶舱唯一的静态资源位置:public/plugins/** 属于 TvT 插件体系,
驾驶舱不得依赖它(票 06 验收第 1 条)。
| 文件 | 性质 | 说明 |
|---|---|---|
aerial.webp |
临时占位 | 维护者提供的沅陵影像,仅用于在真底图接入前看整体效果。无地理配准,不得据此推断坐标。真底图/瓦片归票 21,接入后本文件可删。 |
assets/manifest.json |
运行时资产清单 | 规格 09 最小子集:语义 key → 路径/hash/状态的唯一权威入口。被 src/modules/cockpit/domain/runtimeAssets.js 打包导入(同源),同时随产物发布供核对;组件不得绕过它直接引用 assets/ 路径。 |
assets/icons/*.png |
正式 | 五枚蓝湖正式切图(brand 品牌标题底板 90×34、layers 网格 15×15、points 水滴 16×15、event 警告三角 24×24、resource 火焰 15×15,均为 2x 位图),status: formal,由语义 key 经 manifest 解析后消费。 |
assets/icons/blank.svg |
临时 | 空面板占位图示,设计稿未覆盖,保留原内联几何迁移件,status: temporary。 |
组件里通过 Vite 的 import.meta.env.BASE_URL 拼路径取用,例如:
const base = import.meta.env.BASE_URL || '/'
const photoUrl = `${base}cockpit/aerial.webp`
这样在 publicPath: './' 与 qiankun 注入路径下都能取到,不要硬编码 /cockpit/...。
src/modules/cockpit/styles/tokens.css;
图片类资源(图例图标、底图、纹理)放本目录,替换时保持文件名或改用新名 + 更新引用点。mode / panelId / 面板结构变化——票 06 验收第 4 条。
结构由 src/modules/cockpit/domain/panelCatalog.js 决定,与视觉资源解耦。后端地址、天地图、Cesium 与 WebSocket 一律从配置服务(src/modules/cockpit/services/cockpitConfig.js)读,
前端不硬编码环境地址,也不保存账号或密钥。
放哪儿:把 config.example.json 复制成同目录的 config.json(已进 .gitignore)。构建时它随
public/ 一起进产物(dist/cockpit/config.json)。部署后改环境不需要重新构建:直接改产物里那个文件,
或在网关/反向代理把这个路径指向你自己维护的配置。
覆盖顺序(后者覆盖前者,深合并):
| 层 | 来源 | 用途 |
|---|---|---|
| 1 | 内置默认 | dataSource: mock,一份配置都没有也能起 |
| 2 | 构建期 VITE_COCKPIT_* |
本机联调,写 .env.local(已 gitignore) |
| 3 | cockpit/config.json |
部署配置:同一个构建跑多环境 |
| 4 | globalThis.__COCKPIT_CONFIG__ |
qiankun 主应用 / 网关注入(给了就不再拉文件) |
构建期可用键:VITE_COCKPIT_DATA_SOURCE、VITE_COCKPIT_API_BASE_URL、VITE_COCKPIT_API_TOKEN、
VITE_COCKPIT_WS_URL、VITE_COCKPIT_WS_TOKEN、VITE_COCKPIT_TIANDITU_TOKEN、
VITE_COCKPIT_CESIUM_BASE_URL、VITE_COCKPIT_CONFIG_URL。
三态:ready(载入成功)/ missing(没有运行时配置,用内置默认)/ failed(拿到了但不可用)。
顶栏有对应标签,宿主带 data-config-state 供走查断言。
凭据(已废弃,2026-09-28 免鉴权):驾驶舱 REST(/api/cockpit/v1/**)与 WebSocket
(/ws/deviceStatus)均不再要求任何凭据;接口安全由网络层内网隔离保障。
api.token / ws.token 字段仍可写(兼容旧配置)但会被前端忽略。若个别分区出现 401/403,
只把受影响分区标成「数据不可用」,不跳登录页、不整页遮罩(ADR 0005)。
一个坑:yarn dev 下 Vite 会把不存在的路径回退成 index.html + 200,所以配置服务把「HTML 载荷」
也判定为「文件不存在」(missing)——不能只看状态码,见 services/cockpitConfig.js 顶部说明。
中央一张图默认不挂底图(票 27:底图未配置就不伪造地理配准),所以你看到的是一个深色球。
map.basemap.source 四选一:
| source | 需要什么 | 适合 |
|---|---|---|
none(默认) |
无 | 还没有底图,用临时影像兜底 |
natural-earth |
无 —— Cesium 自带离线影像(随 dist/cesium/Assets 一起部署,不连外网) |
想马上看到一个有大陆轮廓的地球 |
tianditu |
map.tianditu.token(天地图 tk);开发走仓库自带的 /tianditu.map 代理,生产直连 t{s}.tianditu.gov.cn |
有天地图 key,要看国内影像/矢量 |
xyz |
map.basemap.url 形如 https://host/tiles/{z}/{x}/{y}.png(可带 {s} 子域) |
甲方本地瓦片、自建瓦片服务、第三方 XYZ |
三种写法的例子:
// 1) 离线内置影像:改完刷新页面就是一个地球
"map": { "basemap": { "source": "natural-earth" } }
// 2) 天地图影像(token 由部署配置给;生产由网关注入也走同一个字段)
"map": { "basemap": { "source": "tianditu" }, "tianditu": { "token": "<你的 tk>", "layer": "img" } }
// 3) 本地/自建瓦片:url 可填相对路径(相对 index.html 解析),subdomains/levels 可选
"map": { "basemap": { "source": "xyz", "url": "tiles/{z}/{x}/{y}.png", "subdomains": [], "minimumLevel": 1, "maximumLevel": 18, "credit": "甲方基础地理" } }
怎么确认生效:宿主 .map-canvas 上的 data-map-basemap 会变成 natural-earth / xyz / tianditu(未配置是
not-configured,配置缺字段是 invalid),引擎浮标同时显示「底图:…」;配置无效时浮标会写明缺什么
(例如「底图配置无效(天地图底图缺少 tk)· 回退临时影像」),不会白屏。
还没做的:地形、3D Tiles、倾斜摄影与地面-管线视图切换归票 21。
两类数据、两个字段,形态决定写法:
| 数据 | 本机形态 | 配置字段 | 关键点 |
|---|---|---|---|
| 地形 DEM | D:\GIS\GIS\yuanlingDEM:cesiumlab 量化网格(layer.json + {z}/{x}/{y}.terrain,EPSG:4326、scheme: "tms"、带顶点法线) |
map.terrain.url |
CesiumTerrainProvider.fromUrl(<目录>) 直接吃 layer.json;scheme: "tms" 由 Cesium 自己认,服务端不要翻 y |
| 影像切片 | D:\GIS\GIS\yuanlingPic3:cesiumlab 切片(meta.json / tilemapresource.xml:EPSG:3857 + TMS,0–19 级 256px PNG) |
map.overlays[] |
TMS 的 y 自下而上 → 模板必须写 {reverseY};把 meta.json 的 bounds 填进 bounds,范围外就不发请求(否则整球视角会刷 404) |
.env.local(已 gitignore)里两条:
COCKPIT_GIS_MOUNTS=[{"prefix":"/gis/dem","dir":"D:/GIS/GIS/yuanlingDEM"},{"prefix":"/gis/pic3","dir":"D:/GIS/GIS/yuanlingPic3"}]
VITE_COCKPIT_CONFIG_URL=auto
COCKPIT_GIS_MOUNTS 由 src/common/localGisStaticPlugin.js 在 dev server 上挂成静态路径 —— DEM 与影像上百 MB,
既不进仓库也不进产物;第二条打开本目录的 config.json(同样 gitignore)。
两个目录放到服务器上(例如 /data/gis/...),nginx 挂出同样的 URL 前缀:
location /gis/dem/ { alias /data/gis/yuanlingDEM/; add_header Cache-Control "public, max-age=86400"; }
location /gis/pic3/ { alias /data/gis/yuanlingPic3/; add_header Cache-Control "public, max-age=86400"; }
改产物里的 dist/cockpit/config.json:map.terrain.url → /gis/dem,map.overlays[0].url → /gis/pic3/{z}/{x}/{reverseY}.png
(或指向另一台瓦片服务;前端只认这三个字段,换数据源就是换这几个 URL)。
.terrain 与 .png 都要能直接下载,别做 SPA 回退 —— 回退成 HTML 时 Cesium 会报「Unexpected token '<'」。
map.basemap.source 用 natural-earth:Cesium 自带离线影像,不依赖外网(本机实测 ArcGIS / OSM 等外部瓦片不可达,
所以这是离线环境的唯一可用项)。能连外网时可改 arcgis-imagery(ArcGIS 官方世界影像,免费免 key,带 Esri 署名)
或 tianditu(要有免费 tk,开发走仓库自带的 /tianditu.map 代理)。