Forráskód Böngészése

docs(cockpit): 新增部署配置模板与瘦身、环境、部署记录文档

deploy/cockpit.config.json为可复现运行时配置模板(GIS/模型参数保留、连接值由生产env覆盖);city-model-assets.json为模型独立交付清单;三份文档记录瘦身结果、GIS/模型体积与运行闭包、环境优先级与代理要求。
ChenJZ 2 napja
szülő
commit
cc7c98cda6

+ 25 - 0
deploy/city-model-assets.json

@@ -0,0 +1,25 @@
+{
+  "description": "城市模型独立交付清单;不被浏览器读取,不包含加工工具。更新模型入口后必须重新核对引用闭包。",
+  "urlPrefix": "/gis/cad-bim/",
+  "roots": [
+    "city-regions-v10-cs1/coarse-tileset.json",
+    "city-regions-v10-cs1/runtime-manifest.json"
+  ],
+  "includeDirectories": [
+    "city-regions-v10-cs1"
+  ],
+  "excludeFiles": [
+    "city-regions-v10-cs1/manifest.json",
+    "city-regions-v10-cs1/cesium-compatibility-report.json"
+  ],
+  "includeFiles": [
+    "lod-near-estate-pilot-v6/streaming-v14/cell-00-15-p000-lod0.glb",
+    "lod-near-estate-pilot-v6/streaming-v14/cell-14-00-p000-lod0.glb",
+    "lod-near-estate-pilot-v6/streaming-v14/cell-15-00-p000-lod0.glb"
+  ],
+  "expected": {
+    "files": 6745,
+    "bytes": 277949900
+  },
+  "layout": "保持上述目录的相对层级;不能扁平化,也不能仅上传 city-regions-v10-cs1。"
+}

+ 163 - 0
deploy/cockpit.config.json

@@ -0,0 +1,163 @@
+{
+  "version": 1,
+  "dataSource": "real",
+  "api": {
+    "baseUrl": "/api/cockpit/v1"
+  },
+  "ws": {
+    "url": "/ws/deviceStatus"
+  },
+  "images": {
+    "baseUrl": "/minio/pipe/"
+  },
+  "map": {
+    "basemap": {
+      "source": "natural-earth"
+    },
+    "home": {
+      "lon": 110.39028164,
+      "lat": 28.4436787,
+      "heading": 0,
+      "pitch": -55,
+      "range": 12000,
+      "label": "沅陵县城"
+    },
+    "intro": {
+      "enabled": true,
+      "title": "点击进入系统",
+      "spinSeconds": 48
+    },
+    "primaryArea": {
+      "bounds": [
+        110.328749941417,
+        28.3917230659234,
+        110.465779226663,
+        28.4913038992907
+      ]
+    },
+    "terrain": {
+      "url": "/gis/dem-lod",
+      "requestVertexNormals": true
+    },
+    "fog": {
+      "enabled": true,
+      "fadeInMs": 900,
+      "fadeOutMs": 300,
+      "altitudeFullM": 14000,
+      "altitudeZeroM": 3000000,
+      "altitudeSlewMs": 600
+    },
+    "handover": {
+      "enabled": true,
+      "fadeMs": 500,
+      "minEdgeOcclusion": 0.7,
+      "requireTilesLoaded": false
+    },
+    "grade": {
+      "enabled": true,
+      "saturation": 0.82,
+      "brightness": 0.96,
+      "contrast": 1.08,
+      "tint": "#2fa8ff",
+      "tintStrength": 0.26
+    },
+    "overlays": [
+      {
+        "url": "/gis/pic-ring3/{z}/{x}/{reverseY}.png",
+        "minimumLevel": 0,
+        "maximumLevel": 14,
+        "bounds": [
+          109.96215820312366,
+          27.962869019358852,
+          111.04568213224277,
+          29.060971407383555
+        ],
+        "credit": "远景 z14(全范围)"
+      },
+      {
+        "url": "/gis/pic-ring2/{z}/{x}/{reverseY}.png",
+        "minimumLevel": 15,
+        "maximumLevel": 15,
+        "bounds": [
+          110.24701895063546,
+          28.31985817192412,
+          110.54751021744454,
+          28.56316879328998
+        ],
+        "credit": "中景 z15"
+      },
+      {
+        "url": "/gis/pic-ring1/{z}/{x}/{reverseY}.png",
+        "minimumLevel": 15,
+        "maximumLevel": 17,
+        "bounds": [
+          110.29810081987392,
+          28.36477373067367,
+          110.49642834820608,
+          28.51825323454043
+        ],
+        "credit": "近景 z17"
+      },
+      {
+        "url": "/gis/pic-ring0/{z}/{x}/{reverseY}.png",
+        "minimumLevel": 0,
+        "maximumLevel": 19,
+        "bounds": [
+          110.328749941417,
+          28.3917230659234,
+          110.465779226663,
+          28.4913038992907
+        ],
+        "credit": "主场景 z19"
+      }
+    ],
+    "detail": {
+      "refine": {
+        "nearThreshold": 20,
+        "baseThreshold": 56,
+        "nearBandM": 200,
+        "farBandM": 1200
+      },
+      "tiers": [
+        {
+          "name": "far",
+          "geometry": "coarse",
+          "activateWithinM": 6000
+        },
+        {
+          "name": "regional",
+          "geometry": "coarse",
+          "activateWithinM": 3000
+        },
+        {
+          "name": "preview",
+          "geometry": "preview",
+          "activateWithinM": 1400
+        },
+        {
+          "name": "medium",
+          "geometry": "medium",
+          "activateWithinM": 500
+        },
+        {
+          "name": "fine",
+          "geometry": "fine",
+          "activateWithinM": 150
+        }
+      ]
+    },
+    "tilesets": [
+      {
+        "url": "/gis/cad-bim/city-regions-v10-cs1/coarse-tileset.json",
+        "regionManifest": "/gis/cad-bim/city-regions-v10-cs1/runtime-manifest.json",
+        "role": "far",
+        "eager": true,
+        "progressiveRefinement": true,
+        "maximumScreenSpaceError": 115,
+        "maximumDistance": 14000,
+        "loadDistance": 7000,
+        "lighting": true
+      }
+    ]
+  }
+}

+ 2 - 0
docs/cockpit-deployment.md

@@ -1,5 +1,7 @@
 # 驾驶舱生产部署操作手册
 
+> **2026-11-06 驾驶舱独立部署更新**:新构建已默认启用 auto,不再手动修改 HTML。生产运行时配置由 [部署地图模板](<../deploy/cockpit.config.json>) 和 [生产环境](<../.env.production>) 生成,不复制本机 public JSON。旧文中的手动开关、mock 默认与插件/微前端说明仅供历史产物参考。最新边界以 [环境说明](<cockpit-environment.md>)、[瘦身盘点](<cockpit-slimming.md>) 为准;下面各地图参数和 Nginx 原理仍适用。
+
 > 面向部署人员(运维/实施)。**只改配置与静态目录,不需要重新构建前端。**
 > 阅读顺序:先看「一页速查」,按第 2 节改配置,按第 3 节挂数据,最后跑第 5 节自检。
 

+ 44 - 0
docs/cockpit-environment.md

@@ -0,0 +1,44 @@
+# 驾驶舱开发/生产环境配置
+
+## 配置分工
+
+| 文件 | 用途 |
+| --- | --- |
+| [通用环境](<../.env>) | 旧插件开关维持 false,应用入口已彻底移除插件扫描 |
+| [开发环境](<../.env.development>) | real 数据源、开发 API/WS 与公开图片地址 |
+| [生产环境](<../.env.production>) | real 数据源与同源代理路径,不绑定生产服务器 IP |
+| [本机挂载模板](<../.env.local.example>) | 复制为本机覆盖文件后配置 GIS 与模型的实际目录,不进入 Git |
+| [部署地图模板](<../deploy/cockpit.config.json>) | 生产构建的地图参数来源;不含密钥或本机磁盘路径 |
+
+服务地址及唯一入口约定见 [项目规则](<../AGENTS.md>)。旧预览模式配置已隔离,不再使用 pre.dev / pre.build / FES_ENV=predev。
+
+## 开发与生产不再互相污染
+
+开发时已有 [本机运行时 JSON](<../public/cockpit/config.json>) 仍然优先,当前场景和业务改动不变。干净检出没有该文件时,[配置插件](<../src/common/cockpitEnvPlugin.js>) 使用部署地图模板加开发环境连接值返回配置。地图数据仍需要单独提供。
+
+生产时关闭整个 public 目录的自动复制。配置插件从部署地图模板生成 `cockpit/config.json`,再用本次生产环境覆盖 `dataSource / api.baseUrl / ws.url / images.baseUrl`。**不读取或复制本机 JSON**,不会把现场临时模型参数或开发接口悄悄带入生产。需要变更生产场景时更新部署地图模板,或者在部署后修改服务器上的运行时配置。
+
+两个环境均使用 `VITE_COCKPIT_CONFIG_URL=auto`,新产物无需再向 HTML 手动注入开关。已发布旧产物不会因修改源码环境文件自动改变。
+
+## 生产代理契约
+
+| 公开路径 | 需要部署的内容 |
+| --- | --- |
+| /api/cockpit/v1 | 驾驶舱只读 API |
+| /ws/deviceStatus | WebSocket,代理必须传递 Upgrade/Connection |
+| /minio/pipe/ | 公开图片和附件;只填公开 endpoint,不提供 MinIO 私钥 |
+| /gis/dem-lod/ | 地形目录,含 layer.json 和 terrain 瓦片 |
+| /gis/pic-ring0/ 至 /gis/pic-ring3/ | 分层影像,必须保留 TMS 的 reverseY 语义 |
+| /gis/cad-bim/ | 城市模型实际引用闭包,包含跨版本模型、JSON 和贴图 |
+
+这些路径只是配置契约,不表示 Nginx 或资产已经部署。HTTP 页面自动使用 ws,HTTPS 页面自动使用 wss。内网边界、HTTPS、跨域及缓存由部署方配置。
+
+## 环境覆盖与安全
+
+应用配置优先级仍为:内置默认 → VITE 环境兜底 → 运行时 JSON;宿主明确注入配置对象时直接使用该对象。
+
+FES 会先把通用和本机环境变量写入 process.env,Vite 再加载 mode 环境。因此**不要在通用或本机覆盖文件中写开发 API/WS/图片基址**,否则可能覆盖生产值。开发差异写入 `.env.development.local`,生产差异写入 `.env.production.local`(均不入库)。
+
+`VITE_` 值对浏览器公开。禁止存储数据库密码、MinIO accessKey/secret、短信密钥或带凭据/签名的图片基址。`VITE_APP_ENV` 只是标识,不是构建模式开关。
+
+环境修改要到下一次获授权启动或构建时才生效;本次没有运行 build/dev/debug、浏览器验收,也没有提交推送。

+ 82 - 0
docs/cockpit-slimming.md

@@ -0,0 +1,82 @@
+# 驾驶舱代码与资产瘦身记录
+
+日期:2026-11-06。目标是保留驾驶舱功能、减少 Git 检出与部署依赖,不是删除本机所有研究资料,也不是重写 Git 历史。
+
+## 1. 代码清理结果
+
+| 项目 | 清理前 | 当前 |
+| --- | ---: | ---: |
+| 直接依赖 | 104 | 10 |
+| 锁文件 selector | 1,895 | 720 |
+| 锁文件大小 | 501,732 bytes | 189,609 bytes |
+| 上游插件页面 | 40 插件、299 个页面 | 不再注册或打包 |
+
+原 HEAD 文件树为 940,940,484 bytes(897.35 MiB)。当前 Git 可见、实际存在的候选文件为 367 项、约 5.5 MiB(内容体积约减少 99.39%);该数字包含本轮前已有的业务修改、新配置与文档,不包含忽略目录、Git 历史、依赖安装目录或未来构建产物。初步统计未完整计入 Git 转义的中文文件名,最终以前述 HEAD 树统计为准。**这不是 dist 大小或首屏下载量实测。**
+
+## 2. GIS:当前运行配置的目录与大小
+
+生产地图参数见 [部署模板](<../deploy/cockpit.config.json>),与本机当前 map 对象一致。以下是本机数据路径,不是要求生产机器使用同一磁盘路径。MiB=1,048,576 bytes。
+
+| 内容 | 本机目录 | 精确 bytes |
+| --- | --- | ---: |
+| 主场景影像 ring0 | D:/GIS/cockpit-gis-v2/pic-ring0 | 611,764,124 |
+| 近景影像 ring1 | D:/GIS/cockpit-gis-v2/pic-ring1 | 167,940,923 |
+| 中景影像 ring2 | D:/GIS/cockpit-gis-v2/pic-ring2 | 40,613,998 |
+| 远景影像 ring3 | D:/GIS/cockpit-gis-v2/pic-ring3 | 589,444,075 |
+| 当前 DEM(含根 layer/meta) | D:/GIS/cockpit-gis-v2/dem | 152,662,109 |
+| **当前 GIS 合计** | 不含城市模型 | **1,562,425,229(约 1.455 GiB)** |
+
+这些资源分别映射到 /gis/pic-ring0 至 /gis/pic-ring3,以及 /gis/dem-lod;不进入前端 Git 或构建产物。影像必须保留 TMS 的 reverseY 规则,DEM 必须包含根元数据,不能仅复制数字层级目录。
+
+旧 D:/GIS/GIS/yuanlingDEM 为 222,102,618 bytes(含加工临时目录);旧 D:/GIS/GIS/yuanlingPic3 为 **3,832,749 文件、55,422,123,167 bytes(约 51.62 GiB)**。这两份当前不被地图配置引用,已移除开发挂载,但磁盘原件保留。它们不是新部署的默认上传清单。
+
+## 3. 模型与贴图
+
+当前城市模型服务根目录仍为 tools/city-massing/city/cad-bim,开发挂载 /gis/cad-bim。当前入口是 city-regions-v10-cs1 下的 coarse-tileset.json 与 runtime-manifest.json,不是旧环境文件注释中的 far-aligned。
+
+已确认运行模型引用闭包为 **6,745 个文件、277,949,900 bytes(约 265.07 MiB)**,引用均存在,未发现远程 URI。其中 city-regions-v10-cs1 内 6,742 文件 / 276,595,540 bytes;另外必须保留 lod-near-estate-pilot-v6/streaming-v14 中的 cell-00-15-p000-lod0.glb、cell-14-00-p000-lod0.glb、cell-15-00-p000-lod0.glb,共 1,354,360 bytes。
+
+[模型独立交付清单](<../deploy/city-model-assets.json>) 记录了目录、三个跨版本模型和可排除项。cs1 中的加工 manifest.json(10,211,694 bytes)及兼容报告(311 bytes)不在运行闭包;**runtime-manifest.json 必须保留,不是同一个文件**。所有本机模型、贴图、加工工具均原位保留,只从 Git 索引解除跟踪。
+
+当前闭包内有 **6,630 个 GLB、6,629 个内嵌图像记录,编码图像共 19,603,435 bytes(约 18.70 MiB)**,未发现标准外链图像或 buffer。贴图就在上述 GLB 的 bufferView 内,不需要另找一个外置 textures 目录;此体积已包含于模型总量,不可重复相加。图像记录数不是去重图片数,编码体积也不是 GPU 显存或解码后内存。Cesium 自带的解码器/Worker 仍由构建插件保留,不能因移除旧 public/draco 目录而把 Cesium ThirdParty 也删掉。
+
+完整 city-massing 本机加工目录初始盘点为 21,778 文件、2,368,102,991 bytes;其中大多数历史版本、加工输入、审计图和脚本不在当前运行闭包。它们已退出 Git,但没有在磁盘销毁。
+
+驾驶舱自有管件位于 public/cockpit/models/pipes;五份 glTF + 五份同目录 bin,共 **29,251 bytes**,随前端发布,无外置图像贴图,不依赖已隔离的旧 draco/basis/lib。模型说明 Markdown 不进入产物;字体许可证及资产 manifest 均保留。
+
+## 4. 大工具与耦合处理
+
+- 驾驶舱入口的静态及字面量动态引用图没有 PLS 或上游插件依赖;旧 basic/simpleGIS/digitalCity/GoView 的聚合导出确有强耦合,但整个旧模块组均在驾驶舱引用闭包之外,因此直接隔离,不将其继续拆成新抽象。
+- 真正把旧库带入应用的是 [全局入口](<../src/app.jsx>):已移除预览登录/菜单、Tres、FMenu、iconify、qiankun、插件页 glob;保留 FES 生命周期和 Pinia。
+- [构建配置](<../.fes.js>) 已移除 federation、旧 3d-tiles-renderer 强制分包、PLS/私有库别名、GoView SCSS 注入、GLSL/UnoCSS。仅对实际引用的 Cesium/Three 引擎分包。
+- 离线 GIS/模型加工工具不在浏览器引用闭包,保留本机、退出部署仓库。它们依赖 Turf、图像/压缩处理等旧工具环境,不能拿精简后的依赖安装目录直接重跑。原始依赖与锁文件已留档。
+- [mapService](<../src/modules/cockpit/services/mapService.js>)、[cesiumEngine](<../src/modules/cockpit/services/cesiumEngine.js>) 及地下管道 Three 实现是必要功能,不能整体排除;现有引擎和管线模块懒加载继续保留。单纯按行数拆分不会降低发布代码量,本轮未冒险改动其业务实现。
+- 驾驶舱 mocks 被启动逻辑真实引用,属于既有离线模式;保留,而不是按文件夹名称当孤立测试删除。
+
+## 5. 打包隔离与环境同步
+
+[显式路由](<../.fes.js>) 只保留根跳转和驾驶舱页。旧 URL 回到驾驶舱,不加载示例。旧预览模式及面向上游 GitHub Pages 的发布工作流已隔离。
+
+[静态白名单](<../src/common/cockpitStaticPlugin.js>) 关闭整个 public 目录的自动复制,仅复制驾驶舱 assets、models、aerial.webp 与 favicon。Cesium 的 Workers/ThirdParty/Assets/Widgets 仍单独保留。构建还会拒绝引用被隔离的工作区目录。
+
+[配置插件](<../src/common/cockpitEnvPlugin.js>) 从 [部署模板](<../deploy/cockpit.config.json>) 生成运行时配置,再以 [生产环境](<../.env.production>) 覆盖连接值,不复制本机 JSON。开发/生产图片基址已同步;本机挂载已删掉未使用的旧地形、旧影像和测试夹具路径。[环境说明](<cockpit-environment.md>) 记录了优先级和代理要求。
+
+## 6. 本地留档与 Git 状态
+
+- 隔离区:.local-archive/cockpit-slimming-20261106。已保存旧代码、预览配置和公共示例资源,移动清单 30 项,共 3,306 个文件、216,113,127 bytes;baseline 保存原始配置和本轮开始前的 diff。
+- 原位忽略:tools、verify、DesignAssets、dynamic-component-service-master、.scratch;模型目录不移动,避免破坏当前开发挂载。
+- 上述原位文件的 7,845 项删除已进入 Git 索引;另有旧文件移动形成的工作树删除,以及本轮入口/配置修改。**不能只提交当前暂存区的删除项而遗漏配套修改。**
+- 本轮前已有的驾驶舱业务修改、未跟踪业务文件均未回退;提交时应人工区分主题。
+- 本轮没有 commit/push,远端内容尚未改变;历史 Git 大对象仍然存在。新提交瘦的是当前树。需要小体积检出应使用浅克隆/部分克隆;历史清理另行决定,不能擅自重写。
+
+## 7. 静态核查与限制
+
+- 197 个 JS/JSX/Vue script 源文件完成语法解析,603 条本地导入边无缺失,未发现指向隔离源码的有效导入。
+- 完整续读后确认资产 manifest 有 64 个不同运行时路径(早期截断读取所得 54 个已修正),均存在并落在公共资源白名单,另保留 7 份字体许可;资源审计核对了清单哈希。管件 glTF/bin 引用保留。
+- 720 个可达锁记录均完整;离线裁剪后保留记录的版本、下载地址与完整性字段没有改变,未执行安装或网络解析。
+- 已对照 FES 已安装实现核实路由 schema、插件发现、onAppCreated 时机和构建钩子;另做独立只读审查。
+- diff --check 通过。
+
+**按项目规则,已跳过 build/debug、依赖安装、测试运行、服务器和浏览器验收。** 静态通过不等于真实构建/运行验收通过。
+
+独立资源审计的完整本地证据见 [GIS/模型/贴图审计](<../.scratch/cockpit-slimming/delegated-gis-model-audit.md>),其完整清单仅作本地留档,不进入 Git 或生产产物。