Prechádzať zdrojové kódy

build(cockpit): 构建入口收敛为驾驶舱专用路由与最小依赖

.fes.js显式路由(/跳转、/cockpit、catchall);app.jsx只留FES生命周期与Pinia;依赖104→10、锁文件501KB→190KB(720条可达记录静态核验完整);新增development/production/local.example环境文件;cockpitEnvPlugin从deploy模板生成运行时配置;cockpitStaticPlugin白名单关闭public自动拷贝。
ChenJZ 2 dní pred
rodič
commit
2962944498
14 zmenil súbory, kde vykonal 185 pridanie a 1926 odobranie
  1. 1 1
      .env
  2. 20 0
      .env.development
  3. 4 0
      .env.local.example
  4. 23 0
      .env.production
  5. 38 162
      .fes.js
  6. 30 61
      .gitignore
  7. 31 450
      README.md
  8. 2 15
      index.html
  9. 4 107
      package.json
  10. 6 184
      src/app.jsx
  11. 1 1
      src/global.less
  12. 1 1
      src/pages/index.vue
  13. 0 6
      tsconfig.json
  14. 24 938
      yarn.lock

+ 1 - 1
.env

@@ -1,4 +1,4 @@
-# 自动增加插件里面pages的页面路由
+# 驾驶舱专用入口;仅保留兼容标记,不再扫描/注册上游插件页面
 FES_APP_PLUGINS=false
 
 # 自动替换默认目录为插件的preview.vue

+ 20 - 0
.env.development

@@ -0,0 +1,20 @@
+# 驾驶舱开发环境(fes dev / Vite development 模式)
+# 访问 http://localhost:8000 即自动进入驾驶舱;端口由 .fes.js 固定。
+# VITE_ 变量会进入浏览器代码;禁止填写数据库密码、MinIO密钥或短信密钥。
+
+# 页面标题;index.html 使用该值,未配置时沿用 FES 的 title。
+VITE_APP_TITLE='沅陵城市生命线驾驶舱系统'
+VITE_APP_ENV='development'
+VITE_APP_MINIO_BASE_URL='http://111.23.174.45:9000/pipe/'
+
+# 现有配置服务使用 VITE_COCKPIT_*,不是参考项目的 VITE_APP_BASE_API。
+VITE_COCKPIT_DATA_SOURCE='real'
+VITE_COCKPIT_API_BASE_URL='http://192.168.110.96:8301/api/cockpit/v1'
+VITE_COCKPIT_WS_URL='ws://192.168.110.96:8301/ws/deviceStatus'
+
+# 自动读取 public/cockpit/config.json;该文件的值优先于上述兜底值。
+# 无本机 JSON 时使用 deploy/cockpit.config.json + 本环境连接配置;GIS/模型不在 .env 重复维护。
+VITE_COCKPIT_CONFIG_URL='auto'
+VITE_COCKPIT_BASEMAP_SOURCE='natural-earth'
+
+# GIS 本机路径仍由 .env.local 的 COCKPIT_GIS_MOUNTS 提供,不进入浏览器产物。

+ 4 - 0
.env.local.example

@@ -0,0 +1,4 @@
+# 复制为 .env.local 后只调整本机目录;这些数据必须单独从资产交付包取得。
+# 生产不使用开发中间件,须由 Nginx/CDN 挂载相同 URL 前缀。
+# 不要在 .env.local 写开发 API/WS/图片地址,以免 FES 预加载覆盖生产配置。
+COCKPIT_GIS_MOUNTS=[{"prefix":"/gis/pic-ring0","dir":"D:/GIS/cockpit-gis-v2/pic-ring0"},{"prefix":"/gis/pic-ring1","dir":"D:/GIS/cockpit-gis-v2/pic-ring1"},{"prefix":"/gis/pic-ring2","dir":"D:/GIS/cockpit-gis-v2/pic-ring2"},{"prefix":"/gis/pic-ring3","dir":"D:/GIS/cockpit-gis-v2/pic-ring3"},{"prefix":"/gis/dem-lod","dir":"D:/GIS/cockpit-gis-v2/dem"},{"prefix":"/gis/cad-bim","dir":"D:/GIS/cockpit-models/cad-bim"}]

+ 23 - 0
.env.production

@@ -0,0 +1,23 @@
+# 驾驶舱生产环境(fes build / Vite production 模式)
+# 此文件不绑定正式服务器IP;Nginx负责将同源路径转发到后端。
+# VITE_ 变量对浏览器公开;禁止填写数据库密码、MinIO密钥或短信密钥。
+
+VITE_APP_TITLE='沅陵城市生命线驾驶舱系统'
+VITE_APP_ENV='production'
+VITE_APP_MINIO_BASE_URL='/minio/pipe/'
+
+VITE_COCKPIT_DATA_SOURCE='real'
+VITE_COCKPIT_API_BASE_URL='/api/cockpit/v1'
+
+# 浏览器原生 WebSocket 支持同源相对路径:HTTP页面使用WS,HTTPS页面使用WSS。
+# Nginx必须为该路径配置 WebSocket Upgrade 转发。
+VITE_COCKPIT_WS_URL='/ws/deviceStatus'
+
+# 生产构建已开启运行时JSON,无需再手动给index.html添加auto开关。
+# cockpitEnvPlugin 从 deploy/cockpit.config.json 生成配置,覆盖 API/WS/图片基址;地图参数保留。
+# 部署后仍可修改 dist/cockpit/config.json,无需重新构建。
+VITE_COCKPIT_CONFIG_URL='auto'
+VITE_COCKPIT_BASEMAP_SOURCE='natural-earth'
+
+# MinIO 只配置公开图片基址;密钥不进入前端。GIS/模型使用独立静态服务,不复制进 dist。
+# .env/.env.local不要定义开发API/WS;FES预加载会使其覆盖生产环境变量。

+ 38 - 162
.fes.js

@@ -6,197 +6,73 @@
  * @LastEditors: 地虎降天龙
  * @LastEditTime: 2025-12-31 11:44:50
  */
-// import { resolve } from 'path';
-import { join, dirname } from 'path'
-import { fileURLToPath } from 'url'
 import { defineBuildConfig } from '@fesjs/fes'
-import { templateCompilerOptions } from '@tresjs/core'
-// eslint-disable-next-line import/no-unresolved
-import UnoCSS from 'unocss/vite'
-// eslint-disable-next-line import/no-extraneous-dependencies
-import glsl from 'vite-plugin-glsl'
-import federation from '@originjs/vite-plugin-federation'
 import cesiumStatic from './src/common/cesiumStaticPlugin.js'
 import localGisStatic from './src/common/localGisStaticPlugin.js'
-import { vendoredPluginLibAliases } from './src/common/vendoredPluginLibAliases.js'
-
-const __filename = fileURLToPath(import.meta.url);
-const __dirname = dirname(__filename);
-
-const timeStamp = new Date().getTime()
-const combinedIsCustomElement = (tag) => tag.startsWith('iconify-icon') || templateCompilerOptions.template.compilerOptions.isCustomElement(tag)
+import cockpitStatic from './src/common/cockpitStaticPlugin.js'
+import cockpitEnvPlugin from './src/common/cockpitEnvPlugin.js'
 
 export default defineBuildConfig({
     mountElementId: 'tvt-app',
     title: '沅陵城市生命线驾驶舱系统',
-    publicPath: './', // './' 若在线部署用于生产环境 且 是使用qiankun微前端时,需要配置base为主应用地址 https://cos.icegl.cn/qiankun/tvt/
-    access: {
-        roles: {
-            admin: ['*'],
-            manager: ['/'],
-        },
-    },
-    layout: {
-        navigation: null,
-    },
-    enums: {
-        status: [
-            ['0', '无效的'],
-            ['1', '有效的'],
+    publicPath: './',
+    // 显式入口,不再让新增页面或上游示例自动进入构建。
+    router: {
+        mode: 'hash',
+        routes: [
+            { path: '/', component: '@/pages/index.vue' },
+            { path: '/cockpit', component: '@/pages/cockpit/index.vue' },
+            { path: '/:pathMatch(.*)*', redirect: '/cockpit' },
         ],
     },
-    qiankun: {
-        micro: {
-            useDevMode: true,
-        },
-    },
-    //add by 地虎降天龙
-    viteVuePlugin: {
-        template: {
-            compilerOptions: {
-                isCustomElement: (tag) => combinedIsCustomElement(tag),
-            },
-        },
-    },
     viteOption: {
         plugins: [
-            UnoCSS({
-                /* options */
-            }),
-            glsl({
-                warnDuplicatedImports: false, // 禁用重复导入警告
-            }),
-            federation({
-                name: 'tvt-host',
-                remotes: {
-                    home: {
-                        // 必须默认引用一个 不然会报错:ReferenceError: __rf_placeholder__shareScope is not defined
-                        external: `Promise.resolve('https://dcser.icegl.cn/assets/remoteEntry.js')`,
-                        externalType: "promise"
+            {
+                name: 'cockpit-development-port',
+                configResolved(config) {
+                    if (config.command === 'serve' && config.server.port !== 8000) {
+                        throw new Error('驾驶舱开发入口固定 localhost:8000;请检查端口占用,不另开端口。')
                     }
                 },
-                shared: {
-                    vue: {},
-                    three: { version: '0.180.0' },
-                    // "@tresjs/cientos": { version: '5.2.0' },
-                    // "@tresjs/core": { version: '5.2.0' },
-                    // three: { import: false, generate: false }
-                }
-                // 票27:cesium 不进 shared —— 远程不需要它,且体积大、CESIUM_BASE_URL 是进程级单例。
-            }),
-            // 票27:把 cesium 预构建静态资源接到 <base>/cesium/(dev 中间件 + build 拷贝)。
+            },
             cesiumStatic(),
-            // 票21:把本机/甲方的 GIS 目录(DEM、影像切片)挂成静态路径,目录由 .env.local 的
-            // COCKPIT_GIS_MOUNTS 给;没配就什么也不挂,别的机器照常跑。
-            localGisStatic()
+            localGisStatic(),
+            cockpitStatic(),
+            cockpitEnvPlugin(),
         ],
         build: {
-            target: 'esnext', // 或者 'es2020' 以支持 BigInt
-            chunkSizeWarningLimit: 1000, // 单位为KB
+            target: 'esnext',
+            chunkSizeWarningLimit: 1000,
+            copyPublicDir: false,
             rollupOptions: {
                 output: {
-                    minifyInternalExports: false,
-                    manualChunks: {
-                        three: ['three'],
-                        '3d-tiles-renderer': ['3d-tiles-renderer'],
-                        cesium: ['cesium'], // 票27:引擎单独分包
+                    // 只为真正被引用的引擎分包,不用对象形式强制拉入未使用库。
+                    manualChunks(id) {
+                        const moduleId = id.replaceAll('\\', '/')
+                        if (moduleId.includes('/node_modules/cesium/') || moduleId.includes('/node_modules/@cesium/')) return 'cesium'
+                        if (moduleId.includes('/node_modules/three/')) return 'three'
                     },
-                    // manualChunks (id) {
-                    //     // 自定义拆分策略,例如将特定的第三方库拆分为单独的 chunk
-                    //     if (id.includes('node_modules')) {
-                    //         const texts = id.toString().split('node_modules/')[1].split('/')[0]
-                    //         // if (texts) {
-                    //         //     console.log(id.toString(), texts)
-                    //         // }
-                    //         return texts
-                    //     }
-                    // },
-                    format: 'es',
-                    chunkFileNames: `js/[name].[hash]${timeStamp}.js`,
-                    entryFileNames: `js/[name].[hash]${timeStamp}.js`,
-                    assetFileNames: `[ext]/[name].[hash]${timeStamp}.[ext]`,
-                    name: 'TvT.js',
+                    chunkFileNames: 'js/[name].[hash].js',
+                    entryFileNames: 'js/[name].[hash].js',
+                    assetFileNames: '[ext]/[name].[hash].[ext]',
                 },
             },
             sourcemap: false,
             minify: 'terser',
         },
-        // 全局 css 注册
-        css: {
-            preprocessorOptions: {
-                scss: {
-                    // javascriptEnabled: true,
-                    // additionalData: `@import "src/plugins/goView/lib/scss/style.scss";`,
-                    additionalData: (content, filename) => {
-                        if (filename.includes('src/plugins/goView') || filename.includes('src/plugins/zone3Deditor')) {
-                            return `@import "src/plugins/goView/lib/scss/style.scss";\n${content}`
-                        }
-                        return content
-                    }
-                },
-            },
-        },
         server: {
-            headers: {
-                'Access-Control-Allow-Origin': '*',
-            },
             host: '0.0.0.0',
-            // 票26:面板与 DSH 的原子写临时文件在 Windows 上都会让 chokidar 抛 EBUSY 击穿 dev server。
-            //   `**/.scratch/**` → issue tracker 面板保存单据时的 .tmpdir 原子写
-            //   `**/.dsh-*`      → DSH 每次编辑文件时在项目根生成的 .dsh-edit-review.json.<pid>.<guid>.tmpdir
-            //   `**/*.tmpdir/**` → 票27 实测:同一类原子写临时目录这次落在**源码目录旁**
-            //                      (src/modules/cockpit/components/.MapCanvas.vue.<pid>.<guid>.tmpdir),
-            //                      前两条都盖不住,pre.dev.one 首次启动被击穿。按模式排除,别只堵已知的那一个路径。
-            // Vite 内部默认 ignore(node_modules/.git/cacheDir 等)与此合并而非覆盖,见 vite resolveChokidarOptions。
+            port: 8000,
+            strictPort: true,
             watch: {
-                // 目录本身与目录内容要分别盖住:chokidar 对目录条目的匹配和对其内容的匹配是两条判断,
-                // 只写 `**/*.tmpdir/**` 时那个目录本身仍会被进入,读它时照样 EBUSY。
                 ignored: [
-                    '**/.scratch/**', '**/.dsh-*', '**/*.tmpdir', '**/*.tmpdir/**',
-                    // 2026-10-30 内存优化:这些目录不参与热更新,却会被 chokidar 全量索引。
-                    // `tools/` 实测 36,745 个文件(city-massing 生成物),是 dev server 常驻内存的
-                    // 主要来源之一;DesignAssets / dynamic-component-service-master 同样只读。
-                    '**/tools/**',
-                    '**/DesignAssets/**',
-                    '**/dynamic-component-service-master/**',
-                    '**/docs/**',
-                    '**/openspec/**',
-                    '**/skills/**',
-                    '**/preview/**',
-                    '**/pluginMaker/**',
-                    '**/verify/**',
-                    '**/after-deploy/**',
-                    '**/.cache/**',
-                    '**/.qoder/**',
-                    '**/.idea/**',
+                    '**/.scratch/**', '**/.scratch-cache*/**', '**/.local-archive/**',
+                    '**/.dsh-*', '**/*.tmpdir', '**/*.tmpdir/**',
+                    '**/tools/**', '**/DesignAssets/**', '**/dynamic-component-service-master/**',
+                    '**/docs/**', '**/openspec/**', '**/skills/**', '**/verify/**',
+                    '**/after-deploy/**', '**/.cache/**', '**/.qoder/**', '**/.idea/**',
                 ],
             },
-            proxy: {
-                '/resource.cos': {
-                    target: 'https://opensource.cdn.icegl.cn',
-                    changeOrigin: true,
-                    rewrite: (path) => path.replace(/^\/resource.cos/, ''),
-                },
-                // 天地图本地代理
-                '/tianditu.map': {
-                    target: 'https://t0.tianditu.gov.cn/',
-                    changeOrigin: true,
-                    headers: {
-                        Origin: 'opensource.icegl.cn',
-                        Referer: 'http://opensource.icegl.cn',
-                    },
-                    rewrite: (path) => path.replace(/^\/tianditu.map/, ''),
-                }
-            },
         },
     },
-    alias: {
-        // 插件自带的依赖副本(src/plugins/<插件>/lib/<包>)指回插件内部:
-        // useThreeGeospatial 用的 @takram/three-3d-tiles-support 等包没有发布到 npm,
-        // 不映射的话 yarn build 会直接在这些 import 上失败。
-        ...vendoredPluginLibAliases(join(__dirname, './src/plugins'), join(__dirname, './node_modules')),
-        PLS: join(__dirname, './src/plugins'),
-    },
-    // { find: 'pls', replacement: resolve(__dirname, './src/plugins') },
-    // { '@': join(__dirname, '/src') }
-})
+})

+ 30 - 61
.gitignore

@@ -1,68 +1,37 @@
+# 本地依赖、构建及编辑器产物
+node_modules/
+/dist/
+/build/
+/coverage/
+/.cache/
+/logs/
 .DS_Store
-.cache
-/logs
+yarn-error.log
+package-lock.json
+/src/.fes*/
+/.idea/
+/.qoder/
+.dsh-*
+*~RF*.TMP
+*.class
 
-# 票 35 收口(2026-10-26):.scratch 是本地工作区(issue 追踪、verify 脚本、离线证据),
-# 不进版本库 —— 维护者要求测试类与 matt-skills 过程产物不传到服务器。
-# 需要长期保留的产物应提升到 src/、docs/ 或 tools/ 下再提交。
+# 本地隔离区、测试证据与离线资产加工目录
+/.local-archive/
 /.scratch/
 /.scratch-cache*/
-
-/dist
-
-# dependencies
-/node_modules/*
-/coverage
-
-# fes
-/src/.fes
-/src/.fes-production
-/src/.fes-test
-
-# 面板渲染层闸门(t11)编译出的中间产物,运行时可重建
-.scratch/cockpit-overview-redesign/verify/.ssr
-
-# 只读库探针工具的编译产物(Q.java 每次运行前再编译)
-*.class
+/tools/
+/verify/
+/after-deploy/
+/DesignAssets/
+/dynamic-component-service-master/
+/agg-*.json
+/wo-*.json
+/device-facts.json
+/.scratch-probe.json
+/--report
+
+# 部署模板入库;本机覆盖、历史备份与真实配置不入库
 .env.local
 .env.*.local
-
-#不排除 排除alienkitty 和 oimophysics  基于:https://github.com/alienkitty/alien.js 库
-#因为这两个库从npm包很难下载,且有的下架了
-#!/node_modules/@alienkitty/
-#!/node_modules/oimophysics/
-yarn-error.log
-package-lock.json
-
-# 排除安装插件包
-!pluginMaker/install/请把下载的插件包放在这里。
-pluginMaker/install
-
-# DSH 编辑审阅产物(每次编辑在项目根生成,属运行期临时文件)
-.dsh-*
-
-# 驾驶舱部署配置(票 04):各环境真实地址与只读令牌不入库,模板见 public/cockpit/config.example.json
+.env*.bak*
 public/cockpit/config.json
-node_modules
-
-# 后端校验副本(票 29/30 的隔离工作树,内含嵌套 .git,不入库)
-.scratch/*/implementation/*/push-checkout/
-.scratch/*/implementation/*/validation-checkout/
-
-# 编辑器临时备份
-*~RF*.TMP
-
-# ── city-massing 生成物与中间产物(2026-11-03 维护者:远端删除、本地保留)────────
-# 这些是构建 3D 城市模型的中间产物(批次 GLB、发射/座席 JSON、地形采样),
-# 体量大且可重算,不进版本库、不进生产产物;本地保留以便复现与调试。
-# 例外:生产资产 city-regions-v10-cs1/ 与 lod-near-estate-pilot-v6/ 已入库,不忽略。
-tools/city-massing/city/cad-bim/lod-batch-*/
-tools/city-massing/city/cad-bim/lod-pilot-*/
-tools/city-massing/city/cad-bim/seated-*.json
-tools/city-massing/city/cad-bim/plan.json
-tools/city-massing/city/cad-bim/terrain-samples.json
-tools/city-massing/city/cad-bim/instanced-active-input.json
-tools/city-massing/city/cad-bim/city-regions-v*/
-!tools/city-massing/city/cad-bim/city-regions-v10-cs1/
-tools/city-massing/city/oldtown/
-tools/city-massing/__pycache__/

+ 31 - 450
README.md

@@ -1,464 +1,45 @@
-# 🧊 TvT.js
+# 城市生命线驾驶舱
 
-English | [简体中文](./README_zh.md)
+Vue 3 + Pinia + Three.js + CesiumJS 的独立 Web 驾驶舱。基于 [TvT.js / ICEGL](https://github.com/hawk86104/three-vue-tres),保留原作者声明与 [Apache-2.0 许可证](<LICENSE>)。本仓库现按驾驶舱部署用途裁剪,不再提供上游插件市场、编辑器、示例页面或微前端演示入口。
 
-## An AI-Collaborative Open-Source Web 3D Ecosystem
+## 运行与构建
 
-From requirements and Spec-driven AI development to image-to-3D generation, scene editing, and plugin-based delivery, TvT.js helps turn 3D ideas into real projects instead of one-off demos.
+- Node.js **22+**(当前 Cesium engine 的要求);Yarn Classic **1.22.22**。
+- 安装和构建工具必须一起安装,不要使用 production-only 安装来构建。
+- 安装后保留 [FES 路由补丁](<patches/@fesjs+preset-built-in+4.0.0-beta.0.patch>),不要跳过 postinstall。
+- 服务入口及运行命令授权规则见 [项目规则](<AGENTS.md>);代码修改后不会自动启动服务或构建。
 
-TvT.js is an open-source Web 3D engineering ecosystem by ICEGL. Built on Three.js, Vue 3, TresJS, and Fes.js, it is designed for digital twins, industrial visualization, online 3D editors, and plugin-based project delivery. It is permanently open-source and free for commercial use.
+以下命令供部署人员明确执行,本次代码清理没有执行:
 
-> **Requirement → Spec Constraints → AI-Assisted Implementation → Scene Validation → Plugin or Source-Code Delivery**
+```sh
+yarn install --frozen-lockfile
+yarn build
+```
 
-<p align="center">
-  <a href="https://github.com/hawk86104/three-vue-tres" target="_blank">
-    <img src="https://img.shields.io/github/stars/hawk86104/three-vue-tres" />
-  </a>
-  <img alt="GitHub last commit" src="https://img.shields.io/github/last-commit/hawk86104/three-vue-tres">
-  <img src="https://img.shields.io/github/license/hawk86104/three-vue-tres" />
-  <a href="https://docs.icegl.cn/docs/three-vue-tres/guide/ai-collaboration.html" target="_blank">
-    <img alt="AI Spec Driven" src="https://img.shields.io/badge/AI-Spec--Driven-6C63FF">
-  </a>
-  <a target="_black" href="https://gitee.com/ice-gl/icegl-three-vue-tres">
-    <img src="https://gitee.com/ice-gl/icegl-three-vue-tres/badge/star.svg?theme=dark" alt="gitee-starts" />
-  </a>
-  <a target="_black" href="https://gitcode.com/hawk86104/icegl-three-vue-tres">
-    <img src="https://gitcode.com/hawk86104/icegl-three-vue-tres/star/badge.svg?theme=dark" alt="gitcode-starts" />
-  </a>
-  <a target="_black" href="https://space.bilibili.com/410503457">
-    <img alt="bilibili" src="https://img.shields.io/badge/dynamic/json?url=https://api.bilibili.com/x/relation/stat?vmid=410503457&query=data.follower&color=282c34&label=%E5%86%B0%E5%93%A5B%E7%AB%99&labelColor=FE7398&logo=data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAD7ElEQVR4nO2dW9WrMBCFK6ESkFAJSKiESqgEHCABCZWAhEpAAhL2ecik5dDc%2FpXLBDLfWnlqy0xmJ5BMQnq5CIIgCIIgCIIgCIIgCEIBAHQAemYfrgCunD6wAKAHsEKxALgx%2BbCQD8%2FS9tmgVqeDr1lLigDgZvDhXso%2BK9TyTBQRwRJ8AHjntl0Flh5QRAQK%2FmKxPeayWx2OXpBNBKiHvi34b7T2MC4pAvW6twR%2FRwkRKPizBN8CgEcuESj4Lwm%2BBwBjahEk%2BH8EwJRKhOaCDzW8e1JLfkUUH1NgmR3XmHffHR1l%2B72BSs8d7w8U%2BJDAnZERQMcV%2BCtUi7dNqFqibB4J7vtrq7xKCuAasbTMXCL4T%2B5aVk6%2B2xHUrWdhruAR6HIJcOeu2UHI8zyAe2ytWfEdWz9PVvQ8YAmIQ5dDAB9LFsMVAv8oMO2zAGrC5WNIarRiAuKR9jYEd9pY08aa6uUzIHGRdkgKd8pY0yc1WjEBAqypDYoAG0QAZkQAZkQAZkQAZk4vANQenjsSzS3I%2FwcSbXU5jQBUkRtdf4Rar90v8kSv3%2BI3ffCCSpk8I%2Fw%2BlgDkdI%2Fv2rEp2CaiWm1AsDQLlDAD%2BdlFXLMeAaCSeLZdaSFE5VUQNot38cKuEeBgAsSuG0flVZBmEanbXfNQAsS0fgBYIn2fIu3%2FBBMHEyBmDXlFfA8IzeHb%2BEms4WAChKykrVA9ZfsQTL57jXzRg4A5wC%2FA8N4ADiZAZwm2XjW75Qh2KOTfA0p4kygPw28OJcCVgn3nDnYo2EwEYRgGH0qAMyICMCMCMCMCMCMCMCMCMCMCfP3qwHDOQ4AAUekTk8FaBRihJnZdYbvtCGC7LvmkM63GjVDINPFrQgCq5ETXfmMzI90FXzPvfqt7x4rEu%2FZaEcCUxFvgz2zO%2BBUn6UkoaEEAsptiMSX5e8FoRYCN7cVgb4Vq7U%2FH50Pq4JNP7Qiw8UFnJwcK%2BtXy%2BWj6PLEvPgHSHv5UgwA1IQIwwyFAyLJin9RoxYgAzAQIkPwNmf26busC%2BOIx5TDqo5nDT%2BF%2FSS%2F9CYzwb%2BNo49zNy2evkYv0LywGGAXUvp6eSneycqOic0w20k7CNgKE7jJunSGLACTCxF27ylmQc98T5MQUH49swd%2BI0HPXslLKnT0N%2BwnkrTKi9JZL%2FL9i1SorMmdeQ4TQQ7OFMxIMzGD45w8nUL1im7efENZLJpgPSw0pfz0cdt4U3230Td%2FTvx2R6d2FrHhEWLkq5PELOMsRPHCPnAZGv1xJteL7jbJiaW3sB2nDvPC%2FosSYvjRQz4cJ6n7KO3rYQL7M%2BL6nVtfDVRAEQRAEQRAEQRAEIZ5%2FSAXmdfXaoQsAAAAASUVORK5CYII%3D&cacheSeconds=3600">
-  </a>
-  <a target="_black" href="https://space.bilibili.com/384558900">
-    <img alt="bilibili" src="https://img.shields.io/badge/dynamic/json?url=https://api.bilibili.com/x/relation/stat?vmid=384558900&query=data.follower&color=282c34&label=%E5%9C%B0%E8%99%8EB%E7%AB%99&labelColor=FE7398&logo=data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAD7ElEQVR4nO2dW9WrMBCFK6ESkFAJSKiESqgEHCABCZWAhEpAAhL2ecik5dDc%2FpXLBDLfWnlqy0xmJ5BMQnq5CIIgCIIgCIIgCIIgCEIBAHQAemYfrgCunD6wAKAHsEKxALgx%2BbCQD8%2FS9tmgVqeDr1lLigDgZvDhXso%2BK9TyTBQRwRJ8AHjntl0Flh5QRAQK%2FmKxPeayWx2OXpBNBKiHvi34b7T2MC4pAvW6twR%2FRwkRKPizBN8CgEcuESj4Lwm%2BBwBjahEk%2BH8EwJRKhOaCDzW8e1JLfkUUH1NgmR3XmHffHR1l%2B72BSs8d7w8U%2BJDAnZERQMcV%2BCtUi7dNqFqibB4J7vtrq7xKCuAasbTMXCL4T%2B5aVk6%2B2xHUrWdhruAR6HIJcOeu2UHI8zyAe2ytWfEdWz9PVvQ8YAmIQ5dDAB9LFsMVAv8oMO2zAGrC5WNIarRiAuKR9jYEd9pY08aa6uUzIHGRdkgKd8pY0yc1WjEBAqypDYoAG0QAZkQAZkQAZkQAZk4vANQenjsSzS3I%2FwcSbXU5jQBUkRtdf4Rar90v8kSv3%2BI3ffCCSpk8I%2Fw%2BlgDkdI%2Fv2rEp2CaiWm1AsDQLlDAD%2BdlFXLMeAaCSeLZdaSFE5VUQNot38cKuEeBgAsSuG0flVZBmEanbXfNQAsS0fgBYIn2fIu3%2FBBMHEyBmDXlFfA8IzeHb%2BEms4WAChKykrVA9ZfsQTL57jXzRg4A5wC%2FA8N4ADiZAZwm2XjW75Qh2KOTfA0p4kygPw28OJcCVgn3nDnYo2EwEYRgGH0qAMyICMCMCMCMCMCMCMCMCMCMCfP3qwHDOQ4AAUekTk8FaBRihJnZdYbvtCGC7LvmkM63GjVDINPFrQgCq5ETXfmMzI90FXzPvfqt7x4rEu%2FZaEcCUxFvgz2zO%2BBUn6UkoaEEAsptiMSX5e8FoRYCN7cVgb4Vq7U%2FH50Pq4JNP7Qiw8UFnJwcK%2BtXy%2BWj6PLEvPgHSHv5UgwA1IQIwwyFAyLJin9RoxYgAzAQIkPwNmf26busC%2BOIx5TDqo5nDT%2BF%2FSS%2F9CYzwb%2BNo49zNy2evkYv0LywGGAXUvp6eSneycqOic0w20k7CNgKE7jJunSGLACTCxF27ylmQc98T5MQUH49swd%2BI0HPXslLKnT0N%2BwnkrTKi9JZL%2FL9i1SorMmdeQ4TQQ7OFMxIMzGD45w8nUL1im7efENZLJpgPSw0pfz0cdt4U3230Td%2FTvx2R6d2FrHhEWLkq5PELOMsRPHCPnAZGv1xJteL7jbJiaW3sB2nDvPC%2FosSYvjRQz4cJ6n7KO3rYQL7M%2BL6nVtfDVRAEQRAEQRAEQRAEIZ5%2FSAXmdfXaoQsAAAAASUVORK5CYII%3D&cacheSeconds=3600">
-  </a>
-</p>
+服务器只发布构建产物目录;不需要 Node、依赖目录、源代码、测试或加工工具。开发命令为 `yarn dev`,只能复用约定的唯一入口,不能另外启动端口。
 
-## Project Info
+## 三份独立交付
 
-> If this project helps you, please click the "Star⭐" button in the upper-right corner. Your support is what keeps this project moving forward. Thank you!
+1. **前端代码/静态包**:本仓库的驾驶舱模块及自有图标、字体、管道 glTF/bin;构建时另外拷贝 Cesium Workers / ThirdParty / Assets / Widgets。
+2. **GIS 数据**:分层地形与影像由独立静态服务提供,不进入 Git 或前端构建。
+3. **城市模型**:按 [独立交付清单](<deploy/city-model-assets.json>) 部署模型引用闭包,由独立静态服务提供;不可只复制入口版本目录。
 
-> Since mid-October 2025, the project has fully upgraded its core dependencies, including Vue 3, Tres V5, Fes V4, Cientos V4, and Three.js (r17x → r18x).
+只克隆代码不会自动得到 GIS 和城市模型;必须取得资产包并配置相应静态路径才能显示完整实景。详见 [瘦身盘点](<docs/cockpit-slimming.md>) 和 [部署手册](<docs/cockpit-deployment.md>)。
 
-> If you are upgrading from `tvt.js` V4, please refer to the migration guide: [icegl.cn/ask/article/22769](https://icegl.cn/ask/article/22769.html)
+## 配置入口
 
-> Legacy V4 branch: [tres-v4_fes-v3](https://gitee.com/ice-gl/icegl-three-vue-tres/tree/tres-v4_fes-v3/)
+- [开发环境](<.env.development>):API/WS/公开图片地址兜底。
+- [生产环境](<.env.production>):同源 API/WS/公开图片代理路径。
+- [部署地图模板](<deploy/cockpit.config.json>):已知场景的地形、影像、模型、镜头及性能参数;每次生产构建以此生成运行时配置,不复制本机 JSON。
+- [本机挂载模板](<.env.local.example>):复制为本机覆盖文件后填写资产目录。仅用于开发,生产须使用 Nginx/CDN。
+- [环境说明](<docs/cockpit-environment.md>):配置优先级及生产代理要求。
 
-<table width="100%" align="center">
-  <tr>
-    <td width="50%" align="center" valign="top" style="padding:10px;">
-      <img width="500" src="./preview/gitee2k.png" alt="tvt webgl tvt.js">
-    </td>
-    <td width="50%" align="center" valign="top" style="padding:10px;">
-      <img width="500" src="./preview/gitcodestar.png" alt="tvt webgl tvt.js">
-    </td>
-  </tr>
-</table>
-<br/>
+## 保留与隔离边界
 
-# 🤖 AI Collaboration: From a Requirement to a Deliverable 3D Project
+- [路由配置](<.fes.js>) 只允许根跳转和驾驶舱页;旧 URL 回到驾驶舱。
+- [公共资源白名单](<src/common/cockpitStaticPlugin.js>) 防止上游示例及本机配置进入产物。
+- 运行时 mock 是驾驶舱原有离线模式的一部分,并非孤立测试文件,保留其真实引用链;生产默认 real。
+- 本地归档、工具、模型加工文件、设计源、验证脚本按 [忽略规则](<.gitignore>) 隔离。旧工具依赖原始依赖清单,不能用精简后的安装环境重跑加工流程。
+- [锁文件](<yarn.lock>) 已按当前直接依赖及传递/可选依赖闭包离线裁剪;保留条目的版本、下载地址和完整性字段不变,未安装或升级依赖。
 
-AI is now part of two connected workflows in TvT.js: 3D content creation and engineering development. It can help generate models and scene concepts, while also supporting requirements analysis, plugin implementation, and ongoing changes. Scene configuration, plugin contracts, and versioned Specs connect these workflows so that people and AI can work from the same project context.
-
-| Where AI Participates | TvT.js Practice | Outcome |
-| --- | --- | --- |
-| Requirements and architecture | The `openspec/` baseline captures framework rules, plugin contracts, runtime modes, and integration boundaries; larger changes can be described through `proposal`, `spec`, `design`, and `tasks` documents | Traceable requirements, verifiable behavior, and bounded changes |
-| Engineering collaboration | The `tvt-js-plugin-builder` AI skill captures conventions for plugin directories, routes, assets, dependencies, and cross-platform integrations | AI implements within project conventions instead of producing disposable code |
-| 3D content creation | The open-source Tencent Hunyuan3D workflow can be deployed locally to generate 3D models from images and bring them into TvT.js | 3D assets that remain editable and ready for scene integration |
-| Scene authoring | The zone scene editor can work with AI-generated assets and continues to explore MCP + LLM text-to-scene generation | A path from natural language or generated assets to editable visual scenes |
-| Reuse and delivery | A shared plugin contract, dynamic component service, scene configuration, and source export workflow | AI-assisted results that remain reviewable, reusable, maintainable, and deliverable |
-
-This is more than adding an AI button beside a 3D framework. Specs define **what the result must satisfy**; AI skills explain **how work should be completed in this repository**; plugins and editors then carry generated results into a maintainable delivery workflow.
-
-- [Explore the AI Collaboration and Spec Workflow](https://docs.icegl.cn/docs/three-vue-tres/guide/ai-collaboration.html)
-- [View the TvT.js OpenSpec Baseline](./openspec/)
-- [View the TvT.js Plugin Development AI Skill](./skills/tvt-js-plugin-builder/)
-- [Try Hunyuan3D Image-to-3D](https://opensource.icegl.cn/#/plugins/hunyuan3D/index)
-- [Open the Zone Scene Editor](https://zone3deditor.icegl.cn/#/plugins/zone3Deditor/index)
-
-> **Capability boundaries:** Image-to-3D requires a separately deployed model service, model weights, and suitable hardware. MCP + LLM text-to-scene generation remains an area of ongoing exploration. AI can accelerate generation, modification, and review, but business meaning, visual quality, performance budgets, licensing boundaries, and final releases still require human judgment.
-
-## 🇨🇳 Web 3D Visualization Framework for Domestic / Xinchuang Environments 🚩
-
-For full localization and compatibility details, see the documentation: [Details](https://docs.icegl.cn/docs/three-vue-tres/guide/localization.html)
-
-- Support for domestic hardware platforms
-- Support for domestic operating systems and browsers
-- Domestic-friendly development and deployment environments
-- You can confidently use tvt.js as the frontend foundation for localized 3D visualization projects and digital twin platforms.
-- Built on a fully open-source dependency stack, with independent software intellectual property and software copyright registration, open-source and free for commercial use.
-
-<a style="display:block;width:800px;max-width:100%;" href="https://www.bilibili.com/video/BV1JHqRB7ERB"><img src="./preview/bilibili.gif" alt="tres.js webgl three.js"></a>
-
-# Technical Foundations & Ecosystem `@ThreeJS @Vue3.x @TresJS @FesJS`
-
-> Built by ICEGL. Permanently open-source, free for commercial use, and continuously evolving. Star ⭐ the project to follow an open Web 3D ecosystem built for the AI era.
-
-The project is built on four open-source foundations. Plugins, editors, dynamic components, and an AI collaboration workflow extend this foundation from rendering into project delivery:
-
-| Ecosystem | Description |
-| --- | --- |
-| 🎲 [ThreeJS](https://threejs.org)<br><a href="https://www.npmjs.com/package/three"><img src="https://img.shields.io/npm/v/three?label=three" alt="three npm version"></a> | A widely used JavaScript 3D library for browser rendering. |
-| 🍀 [Vue3.x](https://cn.vuejs.org)<br><a href="https://www.npmjs.com/package/vue"><img src="https://img.shields.io/npm/v/vue?label=vue&color=%2342b883" alt="vue npm version"></a> | A modern frontend framework that is approachable, high-performance, and flexible across many Web use cases. |
-| ⚡ [TresJS](https://tresjs.org)<br><a href="https://www.npmjs.com/package/@tresjs/core"><img src="https://img.shields.io/npm/v/@tresjs/core?color=%2382DBCA&label=%40tresjs%2Fcore&logo=data:image/svg%2bxml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHZpZXdCb3g9IjAgMCAzMiAzMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTExLjY4NTQgMy40MjkxNkMxMi4wNzM4IDIuNzgxODIgMTMuMDEyIDIuNzgxODIgMTMuNDAwNCAzLjQyOTE1TDE5LjE3NzEgMTMuMDU2OUMxOS41NzcgMTMuNzIzNSAxOS4wOTY5IDE0LjU3MTQgMTguMzE5NiAxNC41NzE0SDYuNzY2MjRDNS45ODg5NCAxNC41NzE0IDUuNTA4ODMgMTMuNzIzNSA1LjkwODc1IDEzLjA1NjlMMTEuNjg1NCAzLjQyOTE2WiIgZmlsbD0iIzgyREJDNSIvPgo8cGF0aCBkPSJNMTUuNjg1NyAxMC41NDI5QzE1LjY4NTcgOS45OTA1OSAxNi4xMzM0IDkuNTQyODggMTYuNjg1NyA5LjU0Mjg4SDI2QzI2LjU1MjIgOS41NDI4OCAyNyA5Ljk5MDU5IDI3IDEwLjU0MjlWMTkuODU3MkMyNyAyMC40MDk0IDI2LjU1MjIgMjAuODU3MiAyNiAyMC44NTcySDE2LjY4NTdDMTYuMTMzNCAyMC44NTcyIDE1LjY4NTcgMjAuNDA5NCAxNS42ODU3IDE5Ljg1NzJWMTAuNTQyOVoiIGZpbGw9IiM0RjRGNEYiLz4KPGNpcmNsZSBjeD0iMTYiIGN5PSIyMiIgcj0iNiIgZmlsbD0iI0VGQUMzNSIvPgo8L3N2Zz4K" alt="tres npm version"></a> | A declarative Vue 3 way to build Three.js-powered 3D applications on the frontend. |
-| 🌈 [Fes.js](https://fesjs.mumblefe.cn)<br><a href="https://www.npmjs.com/package/@fesjs/fes"><img src="https://img.shields.io/npm/v/%40fesjs%2Ffes?label=%40fesjs%2Ffes" alt="fesjs npm version"></a> | Provides the routing, layouts, data models, permissions, internationalization, and API conventions needed to deliver production applications. |
-
-## ✨ Dynamic Component Publishing & Loading Service: [🌏 dcser.icegl.cn](https://dcser.icegl.cn/)
-
-> A dynamic component publishing and loading service built around the TvT.js ecosystem for flexible modular application delivery. Component requirements can use Specs to define registration formats, parameter contracts, previews, and editor compatibility, allowing both human-built and AI-assisted components to be published independently, loaded remotely, configured, and evolved over time.
-
-<a style="display:block;width:800px;max-width:100%;" href="https://dcser.icegl.cn"><img src="./preview/dcser.gif" alt="tres.js webgl three.js"></a>
-
-## 🏕 Preview: [🌏 opensource.icegl.cn](https://opensource.icegl.cn)
-
-- If needed, you can also use the GitHub Pages mirror: [🌏 https://hawk86104.github.io](https://hawk86104.github.io/)
-- Full-case WeChat Mini Program ecosystem: [🌏 Open in WeChat](#小程序://三维开源/456pgpJZBiTctdK)
-- Scan the QR code to browse the full Mini Program demo set:
-  <img src="./preview/miniqr.jpg" width="166" alt="tres.js webgl three.js">
-
-### Featured Online Cases
-
-<table width="100%" align="center">
-  <tr>
-    <td width="50%" align="center" valign="top" style="padding:12px;width:50%;vertical-align:top;">
-      <a href="https://zone3deditor.icegl.cn/#/plugins/zone3Deditor/index"><strong>Online 3D Scene Editor</strong></a><br>
-      <sub>Free source export + secondary development</sub><br><br>
-      <a href="https://zone3deditor.icegl.cn/#/plugins/zone3Deditor/index" style="display:block;">
-        <img width="480" height="270" style="width:100%;max-width:480px;height:270px;object-fit:cover;" src="https://cdn.index.icegl.cn/uploads/20250519/94fbce573ef3a2ba59c1100a08339857.png" alt="Online 3D Scene Editor">
-      </a>
-    </td>
-    <td width="50%" align="center" valign="top" style="padding:12px;width:50%;vertical-align:top;">
-      <a href="https://www.icegl.cn/tvtstore/zoneMachinRoom"><strong>Smart Server Room</strong></a><br>
-      <sub>Project-ready output from the editor</sub><br><br>
-      <a href="https://www.icegl.cn/tvtstore/zoneMachinRoom" style="display:block;">
-        <img width="480" height="270" style="width:100%;max-width:480px;height:270px;object-fit:cover;" src="https://opensource.icegl.cn/plugins/zoneMachinRoom/preview/index.png" alt="Smart Server Room">
-      </a>
-    </td>
-  </tr>
-  <tr>
-    <td width="50%" align="center" valign="top" style="padding:12px;width:50%;vertical-align:top;">
-      <a href="https://opensource.icegl.cn/#/plugins/zoneFreeScene/freeTvtStack"><strong>Tech Stack Topology</strong></a><br>
-      <sub>Project-ready output from the editor</sub><br><br>
-      <a href="https://zone3deditor.icegl.cn/#/plugins/zone3Deditor/index?sceneConfig=freeTvtStack" style="display:block;">
-        <img width="480" height="270" style="width:100%;max-width:480px;height:270px;object-fit:cover;" src="https://opensource.icegl.cn/plugins/zoneFreeScene/preview/freeTvtStack.png" alt="Tech Stack Topology">
-      </a>
-    </td>
-    <td width="50%" align="center" valign="top" style="padding:12px;width:50%;vertical-align:top;">
-      <a href="https://opensource.icegl.cn/#/plugins/zoneFreeScene/freeHYworld"><strong>Hunyuan World</strong></a><br>
-      <sub>Project-ready output from the editor</sub><br><br>
-      <a href="https://zone3deditor.icegl.cn/#/plugins/zone3Deditor/index?sceneConfig=freeHYworld" style="display:block;">
-        <img width="480" height="270" style="width:100%;max-width:480px;height:270px;object-fit:cover;" src="https://opensource.icegl.cn/plugins/zoneFreeScene/preview/freeHYworld.png" alt="Hunyuan World">
-      </a>
-    </td>
-  </tr>
-  <tr>
-    <td width="50%" align="center" valign="top" style="padding:12px;width:50%;vertical-align:top;">
-      <a href="https://www.icegl.cn/tvtstore/zoneRefiningIndustry"><strong>Refining Smart Factory Visualization</strong></a><br>
-      <sub>Project-ready output from the editor</sub><br><br>
-      <a href="https://oss.icegl.cn/p/zoneRefiningIndustry/#/plugins/zoneRefiningIndustry/index" style="display:block;">
-        <img width="480" height="270" style="width:100%;max-width:480px;height:270px;object-fit:cover;" src="https://opensource.icegl.cn/plugins/zoneRefiningIndustry/preview/index.png" alt="Refining Smart Factory Visualization">
-      </a>
-    </td>
-    <td width="50%" align="center" valign="top" style="padding:12px;width:50%;vertical-align:top;">
-      <a href="https://www.icegl.cn/tvtstore/zoneOfficeFloor"><strong>Smart Office Space</strong></a><br>
-      <sub>Project-ready output from the editor</sub><br><br>
-      <a href="https://oss.icegl.cn/p/zoneOfficeFloor/#/plugins/zoneOfficeFloor/index" style="display:block;">
-        <img width="480" height="270" style="width:100%;max-width:480px;height:270px;object-fit:cover;" src="https://opensource.icegl.cn/plugins/zoneOfficeFloor/preview/index.png" alt="Smart Office Space">
-      </a>
-    </td>
-  </tr>
-  <tr>
-    <td width="50%" align="center" valign="top" style="padding:12px;width:50%;vertical-align:top;">
-      <a href="https://www.icegl.cn/tvtstore/zoneLowAltitudeUAV.html"><strong>UAV Fleet Visualization</strong></a><br>
-      <sub>Project-ready output from the editor</sub><br><br>
-      <a href="https://www.icegl.cn/tvtstore/zoneLowAltitudeUAV.html" style="display:block;">
-        <img width="480" height="270" style="width:100%;max-width:480px;height:270px;object-fit:cover;" src="https://cdn.index.icegl.cn/uploads/20250813/010ead9fa5b3e69f00ad337b039784eb.png?imageMogr2/thumbnail/600x" alt="UAV Fleet Visualization">
-      </a>
-    </td>
-    <td width="50%" align="center" valign="top" style="padding:12px;width:50%;vertical-align:top;">
-      <a href="https://opensource.icegl.cn/#/#zoneFreeScene"><strong>Low-Poly Refinery</strong></a><br>
-      <sub>Free case</sub><br><br>
-      <a href="https://zone3deditor.icegl.cn/#/plugins/zone3Deditor/index?sceneConfig=freeRefiningIndustry" style="display:block;">
-        <img width="480" height="270" style="width:100%;max-width:480px;height:270px;object-fit:cover;" src="https://opensource.icegl.cn/plugins/zoneFreeScene/preview/freeRefiningIndustry.png" alt="Low-Poly Refinery">
-      </a>
-    </td>
-  </tr>
-  <tr>
-    <td width="50%" align="center" valign="top" style="padding:12px;width:50%;vertical-align:top;">
-      <a href="https://www.icegl.cn/tvtstore/zonePixelLowMachinRoom"><strong>Low-Poly Server Room</strong></a><br>
-      <sub>Project-ready output from the editor</sub><br><br>
-      <a href="https://oss.icegl.cn/p/zonePixelLowMachinRoom/#/plugins/zonePixelLowMachinRoom/index" style="display:block;">
-        <img width="480" height="270" style="width:100%;max-width:480px;height:270px;object-fit:cover;" src="https://cdn.index.icegl.cn/uploads/20251106/ac894bb3033344fe9ca7534d64a9885d.png?imageMogr2/thumbnail/600x" alt="Low-Poly Server Room">
-      </a>
-    </td>
-    <td width="50%" align="center" valign="top" style="padding:12px;width:50%;vertical-align:top;">
-      <a href="https://www.icegl.cn/tvtstore/zonePlasticProducts"><strong>Plastic Products Factory 3D</strong></a><br>
-      <sub>Project-ready output from the editor</sub><br><br>
-      <a href="https://oss.icegl.cn/p/zonePlasticProducts/#/plugins/zonePlasticProducts/secondaryCoding" style="display:block;">
-        <img width="480" height="270" style="width:100%;max-width:480px;height:270px;object-fit:cover;" src="https://cdn.index.icegl.cn/uploads/20251119/09534134fd018fe09c18bad0c4565e1d.png?imageMogr2/thumbnail/600x" alt="Plastic Products Factory 3D">
-      </a>
-    </td>
-  </tr>
-  <tr>
-    <td width="50%" align="center" valign="top" style="padding:12px;width:50%;vertical-align:top;">
-      <a href="https://www.icegl.cn/tvtstore/zoneSmartWarehouse"><strong>Smart Warehouse Management</strong></a><br>
-      <sub>Project-ready output from the editor</sub><br><br>
-      <a href="https://oss.icegl.cn/p/zoneSmartWarehouse/#/plugins/zoneSmartWarehouse/secondaryCoding" style="display:block;">
-        <img width="480" height="270" style="width:100%;max-width:480px;height:270px;object-fit:cover;" src="https://cdn.index.icegl.cn/uploads/20251202/a92bcc26c186fbf65d9851a0c87b05ca.png?imageMogr2/thumbnail/600x" alt="Smart Warehouse Management">
-      </a>
-    </td>
-    <td width="50%" align="center" valign="top" style="padding:12px;width:50%;vertical-align:top;">
-      <a href="https://opensource.icegl.cn/#/#zoneFreeScene"><strong>Ocean Shipping Visualization</strong></a><br>
-      <sub>Free case</sub><br><br>
-      <a href="https://zone3deditor.icegl.cn/#/plugins/zone3Deditor/index?sceneConfig=freeShipSea" style="display:block;">
-        <img width="480" height="270" style="width:100%;max-width:480px;height:270px;object-fit:cover;" src="https://opensource.icegl.cn/plugins/zoneFreeScene/preview/freeShipSea.png?imageMogr2/thumbnail/600x" alt="Ocean Shipping Visualization">
-      </a>
-    </td>
-  </tr>
-  <tr>
-    <td width="50%" align="center" valign="top" style="padding:12px;width:50%;vertical-align:top;">
-      <a href="https://txwikichart.icegl.cn/#/plugins/txWikiChart/columnar"><strong>Financial Report Analysis 3D Chart</strong></a><br>
-      <sub>Project-ready output from the editor</sub><br><br>
-      <a href="https://txwikichart.icegl.cn/#/plugins/txWikiChart/columnar" style="display:block;">
-        <img width="480" height="270" style="width:100%;max-width:480px;height:270px;object-fit:cover;" src="https://cdn.index.icegl.cn/uploads/20260610/3170626e1a2e670fb0ee4c6af936c236.png" alt="Financial Report Analysis 3D Chart">
-      </a>
-    </td>
-    <td width="50%" align="center" valign="top" style="padding:12px;width:50%;vertical-align:top;">
-      <a href="https://animationeditor.icegl.cn/#/plugins/animationEditor/index"><strong>Paramecium Animation Editor</strong></a><br>
-      <sub>Online animation editor</sub><br><br>
-      <a href="https://animationeditor.icegl.cn/#/plugins/animationEditor/index" style="display:block;">
-        <img width="480" height="270" style="width:100%;max-width:480px;height:270px;object-fit:cover;" src="https://cdn.index.icegl.cn/uploads/20260601/a1ed44a8d6573fdb2db8bb44ded6a397.jpg" alt="Paramecium Animation Editor">
-      </a>
-    </td>
-  </tr>
-  <tr>
-    <td width="50%" align="center" valign="top" style="padding:12px;width:50%;vertical-align:top;">
-      <a href="https://www.icegl.cn/tvtstore/gisPlaneEditor"><strong>Map Space Editor</strong></a><br>
-      <sub>A GIS editor for projected-map scenes</sub><br><br>
-      <a href="https://gisplaneeditor.icegl.cn/#/plugins/gisPlaneEditor/index" style="display:block;">
-        <img width="480" height="270" style="width:100%;max-width:480px;height:270px;object-fit:cover;" src="https://opensource.icegl.cn/plugins/gisPlaneEditor/preview/index.png" alt="Map Space Editor">
-      </a>
-    </td>
-    <td width="50%" align="center" valign="top" style="padding:12px;width:50%;vertical-align:top;">
-      <a href="https://gisplaneeditor.icegl.cn/#/plugins/gisPlaneEditor/index?sceneConfig=多套倾斜摄影3D"><strong>Multi-Set Oblique Photography 3D</strong></a><br>
-      <sub>Project-ready output from the editor</sub><br><br>
-      <a href="https://gisplaneeditor.icegl.cn/#/plugins/gisPlaneEditor/preview?sceneConfig=多套倾斜摄影3D" style="display:block;">
-        <img width="480" height="270" style="width:100%;max-width:480px;height:270px;object-fit:cover;" src="https://gisplaneeditor.icegl.cn/plugins/gisPlaneEditor/preview/多套倾斜摄影3D.png" alt="Multi-Set Oblique Photography 3D">
-      </a>
-    </td>
-  </tr>
-</table>
-
-> Tech stack topology example with full project source:
-> [Source file](./src/plugins/zoneFreeScene/pages/freeTvtStack.vue)
-
-> You can reopen this scene in the online editor and export the source again for secondary development:
-> [Open in zone3Deditor](https://zone3deditor.icegl.cn/#/plugins/zone3Deditor/index?sceneConfig=freeTvtStack)
-
-<a style="display:block;width:800px;max-width:100%;" href="https://opensource.icegl.cn/#/plugins/zoneFreeScene/freeTvtStack"><img src="https://opensource.icegl.cn/plugins/zoneFreeScene/preview/freeTvtStack.png" alt="tres.js webgl three.js"></a>
-
-> Because the project is updated and rebuilt frequently, please clear your browser cache if you encounter access or asset-loading issues.
-
-<a href="https://opensource.icegl.cn"><img src="./preview/p2.gif" alt="three.js tres.js webgl tvt.js"></a>
-<a href="https://opensource.icegl.cn"><img src="./preview/p3.gif" alt="three.js tres.js webgl tvt.js"></a>
-
-More demos are available on the preview site.
-
-### If you like the project, please support it with a quick three-step combo: Follow 💛 Like ⭐ Fork 👣
-
-# ✅ Quick Start
-
-> Node.js >= 20.18 is recommended.
-
-| Step | Command / Action | Description |
-| --- | --- | --- |
-| 1 | `git clone` this repository, or download it directly | Get the project source code |
-| 2 | `cd` into the project root | Enter the project directory |
-| 3 | `yarn` | Install dependencies |
-| 4 | `yarn pre.dev` | Debug the preview workspace |
-| 5 | `yarn dev` | Debug your own project workspace |
-| 6 | `yarn pre.build` | Build the preview workspace |
-| 7 | `yarn build` | Build your own project workspace |
-| 8 | `yarn pre.dev.one` | Preview only one specific example or plugin |
-| 9 | `yarn pre.build.one` | Build one specific example or plugin, keeping only configured dependency plugin assets and removing the rest |
-| 10 | `yarn both` | Run `dev` and `pre.dev` at the same time so you can develop your project while comparing against examples and plugins |
-
-![Compile Mode](./preview/compileMode.png)
-
-# 📖 Documentation
-
-## User Guide: [🌏 docs.icegl.cn](https://docs.icegl.cn/)
-
-> Recommended starting point: [🤖 AI Collaboration and Spec Workflow](https://docs.icegl.cn/docs/three-vue-tres/guide/ai-collaboration.html). It covers image-to-3D generation, the OpenSpec baseline, the AI plugin development skill, and a workflow in which requirements become constraints before implementation moves toward delivery.
-
-<table style="border: none; width: 100%; text-align: center;">
-  <tr>
-    <td style="padding:10px;font-size:1.2em;">
-      <a href="https://docs.icegl.cn/docs/three-vue-tres/editor/threeeditor.html">
-        3D Editor: [📊 Native editor + plugin generator]
-      </a>
-    </td>
-    <td style="padding:10px;font-size:1.2em;">
-      <a href="https://docs.icegl.cn/docs/three-vue-tres/editor/goview.html">
-        UI Editor: [📊 GoView export + config import component]
-      </a>
-    </td>
-  </tr>
-  <tr>
-    <td style="padding: 10px;">
-      <a href="https://docs.icegl.cn/docs/three-vue-tres/editor/threeeditor.html" style="display:block;max-width:100%;">
-        <img src="https://docs.icegl.cn/editor.png" alt="tres.js webgl">
-      </a>
-    </td>
-    <td style="padding: 10px;">
-      <a href="https://docs.icegl.cn/docs/three-vue-tres/editor/goview.html" style="display:block;max-width:100%;">
-        <img src="./preview/goViewPlugin.png" alt="tres.js webgl">
-      </a>
-    </td>
-  </tr>
-  <tr>
-    <td style="padding:10px;font-size:1.2em;">
-      <a href="https://docs.icegl.cn/docs/three-vue-tres/frontend/uniapp.html">
-        uniapp Mini Program Ecosystem: [One codebase across platforms]
-      </a>
-    </td>
-    <td style="padding:10px;font-size:1.2em;">
-      <a href="https://docs.icegl.cn/docs/three-vue-tres/qiankun/introduction.html">
-        qiankun Micro Frontend: [Integrate quickly into your existing project]
-      </a>
-    </td>
-  </tr>
-  <tr>
-    <td style="padding: 10px;">
-      <a href="https://docs.icegl.cn/docs/three-vue-tres/frontend/uniapp.html" style="display:block;max-width:100%;">
-        <img src="https://cdn.index.icegl.cn/uploads/20250416/e4d22f7669b1525f5c927270865c8373.jpg?imageMogr2/thumbnail/350x" alt="tres.js webgl">
-      </a>
-    </td>
-    <td style="padding: 10px;">
-      <a href="https://docs.icegl.cn/docs/three-vue-tres/qiankun/introduction.html" style="display:block;max-width:100%;">
-        <img src="https://cdn.index.icegl.cn/uploads/20250416/0fe9fccaaffd82c2e6baba319a2a1ea0.jpg?imageMogr2/thumbnail/350x" alt="tres.js webgl">
-      </a>
-    </td>
-  </tr>
-</table>
-
-# 🧩 Rich Plugin Marketplace: [🌏 tvtstore](https://www.icegl.cn/tvtstore)
-
-#### [🌏 www.icegl.cn/tvtstore](https://www.icegl.cn/tvtstore) brings together a wide range of project scenarios and capabilities. Plugins are a core part of the ICE community ecosystem and provide an engineering boundary between AI-assisted development, online editors, and project delivery. Complete applications, reusable components, AI-assisted features, and source exported from scene editors are all distributed through the marketplace as plugins.
-
-<table style="border: none; width: 100%; text-align: center;">
-  <tr>
-    <td style="padding:10px;font-size:1.2em;">
-      <a href="https://www.icegl.cn/tvtstore">
-        Plugin Marketplace
-      </a>
-    </td>
-    <td style="padding:10px;font-size:1.2em;">
-      <a href="https://www.icegl.cn/p/tvtdeveloper">
-        Become an Author and Join Us
-      </a>
-    </td>
-  </tr>
-  <tr>
-    <td style="padding: 10px;">
-      <a href="https://www.icegl.cn/tvtstore" style="display:block;max-width:100%;">
-        <img src="./preview/tvtstore.png" alt="tres.js webgl">
-      </a>
-    </td>
-    <td style="padding: 10px;">
-      <a href="https://www.icegl.cn/p/tvtdeveloper" style="display:block;max-width:100%;">
-        <img src="./preview/findyou.png" alt="tres.js webgl">
-      </a>
-    </td>
-  </tr>
-</table>
-
-# ❓ Feedback & Support
-
-If you run into any issues while using the project, feel free to reach out through the channels below.
-
-### Q&A Community: [ICE Graphics Community icegl.cn](https://www.icegl.cn/ask)
-
-<a href="https://www.icegl.cn/ask" style="display:block;width:800px;max-width:100%;">
-  <img src="./preview/ask01.png" alt="Graphics Q&A Community">
-</a>
-
-#### Community Contributors and Experts: [Ask the experts](https://icegl.cn/ask/experts.html)
-
-<a href="https://icegl.cn/ask/experts.html" style="display:block;width:800px;max-width:100%;">
-  <img src="./preview/ask02.png" alt="Graphics Q&A Community">
-</a>
-
-### You are also welcome to join our WeChat and QQ groups. Some groups may already be full, but we are always happy to connect and discuss WebGL together.
-
-<table style="border: none; width: 60%; text-align: center;">
-  <tr>
-    <td style="padding:10px;font-size:1.2em;">
-      WeChat Mini Program Ecosystem
-    </td>
-    <td style="padding:10px;font-size:1.2em;">
-      WeChat Group
-    </td>
-    <td style="padding:10px;font-size:1.2em;">
-      <a href="https://qm.qq.com/q/34V4hTtvbq">
-        QQ Group: 795714357
-      </a>
-    </td>
-    <td style="padding:10px;font-size:1.2em;">
-      Official Account: ICE Graphics Community
-    </td>
-  </tr>
-  <tr>
-    <td style="padding: 10px;">
-      <p style="display:block;max-width:100%;">
-        <img src="./preview/miniqr.jpg" alt="tres.js webgl">
-      </p>
-    </td>
-    <td style="padding: 10px;">
-      <p style="display:block;max-width:100%;">
-        <img src="./preview/wx.png" alt="tres.js webgl">
-      </p>
-    </td>
-    <td style="padding: 10px;">
-      <a href="https://qm.qq.com/q/34V4hTtvbq" style="display:block;max-width:100%;">
-        <img src="./preview/qqq.png" alt="tres.js webgl">
-      </a>
-    </td>
-    <td style="padding: 10px;">
-      <p style="display:block;max-width:100%;">
-        <img src="./preview/wxgzh.jpg" alt="tres.js webgl">
-      </p>
-    </td>
-  </tr>
-</table>
-
-# ⭐ Star History
-
-[![Star History Chart](https://api.star-history.com/svg?repos=hawk86104/three-vue-tres,hawk86104/vue3-ts-cesium-map-show&type=Date)](https://star-history.com/#hawk86104/three-vue-tres&hawk86104/vue3-ts-cesium-map-show&Date)
-
-# ™️ Copyright Information
-
-This project is open-sourced under the **Apache License 2.0**, is free to use permanently, and supports commercial use.
-
-> If you use this project commercially, please comply with the Apache License 2.0 and retain the author attribution and technical support statement.
-
-1. **Secondary Development and Copyright Notice**
-
-   When building on top of this project, including but not limited to feature extensions, UI modifications, or custom adaptations, you must not remove, alter, or hide the copyright notice, author statement, or project source attribution in the header of TvT.js source files, whether your use is commercial or non-commercial.
-
-2. **Allowed Commercial Use and Restrictions**
-
-   You may use this project as the foundation for commercial solutions that are primarily based on your own independently developed core features or products, including paid services and software products.
-
-   You may not simply re-open-source this project with only minor changes and charge for it, or package an almost unmodified version as a paid product for sale.
-
-3. **Third-Party Components**
-
-   Copyright and license information for third-party source code and binary files included in this project are marked separately. Please comply with their respective open-source licenses.
-
-Copyright © 2022-2026 by 🧊icegl (https://www.icegl.cn)
-
-All rights reserved.
-
-# City-Lifeline-Cockpit
-
-城市生命线驾驶舱可视化——基于开源项目TvT.js(icegl-three-vue-tres),使用Three.js、Vue 3、TresJS 和 Fes.js技术栈的Web 3D框架
+本次仅做静态核查;尚未进行 build/debug 验证、提交或推送。历史 Git 对象没有被改写,历史仓库体积不会因工作树删文件自动缩小。

+ 2 - 15
index.html

@@ -7,7 +7,7 @@
  * @LastEditTime: 2025-04-01 16:14:04
 -->
 <!DOCTYPE html>
-<html lang="en">
+<html lang="zh-CN">
 
 <head>
     <meta charset="UTF-8">
@@ -15,23 +15,10 @@
     <meta name="referrer" content="never">
     <meta name="referrer" content="strict-origin-when-cross-origin">
     <title>
-        <%= title %>
+        <%= typeof VITE_APP_TITLE === 'undefined' ? title : VITE_APP_TITLE %>
     </title>
     <link rel="shortcut icon" type="image/x-icon" href="./logo.png">
-    <script>
-        var _hmt = _hmt || [];
-        (function () {
-            if (!window.__POWERED_BY_QIANKUN__) {
-                const hm = document.createElement("script")
-                hm.src = "https://hm.baidu.com/hm.js?3c442b1ada04ec23771dfc94ea581c10"
-                const s = document.getElementsByTagName("script")[0]
-                s.parentNode.insertBefore(hm, s)
-            }
-        })()
-    </script>
 
-    <script src="<%= BASE_URL %>lib/jweixin-1.6.0.js"></script>
-    <script src="<%= BASE_URL %>lib/uni.webview.0.1.52.js"></script>
 </head>
 
 <body>

+ 4 - 107
package.json

@@ -2,22 +2,13 @@
   "name": "TvT.js",
   "version": "1.0.0",
   "engines": {
-    "node": ">=18.18"
+    "node": ">=22.0.0"
   },
   "type": "module",
-  "description": "An open-source framework for rapid implementation of 3D visualization projects",
+  "description": "城市生命线驾驶舱(基于 TvT.js,独立部署入口)",
   "scripts": {
     "dev": "fes dev",
     "build": "cross-env NODE_OPTIONS=--max-old-space-size=8088 fes build",
-    "pre.dev": "cross-env FES_ENV=predev fes dev",
-    "pre.dev.one": "cross-env FES_ENV=predev.one fes dev",
-    "pre.build": "cross-env NODE_OPTIONS=--max-old-space-size=8088 FES_ENV=predev fes build",
-    "pre.build.one": "cross-env NODE_OPTIONS=--max-old-space-size=8088 FES_ENV=predev.one fes build",
-    "both": "concurrently \"npm run dev\" \"npm run pre.dev\" ",
-    "plugin.marker": "node pluginMaker/index.cjs",
-    "pre.build.icegl": "cross-env NODE_OPTIONS=--max-old-space-size=8088 FES_ENV=predev FES_APP_ONLINE_API=true fes build",
-    "analyze": "cross-env ANALYZE=1 fes build",
-    "test:unit": "fes test:unit",
     "postinstall": "patch-package"
   },
   "keywords": [
@@ -37,112 +28,18 @@
     "access": "public"
   },
   "devDependencies": {
-    "@fesjs/plugin-icon": "5.0.0-beta.0",
-    "@fesjs/utils": "4.0.0-beta.0",
-    "@originjs/vite-plugin-federation": "^1.4.1",
-    "@tweakpane/core": "^2.0.5",
-    "@types/mapbox__tilebelt": "^1.0.4",
-    "@types/offscreencanvas": "^2019.7.3",
-    "@types/three": "0.180.0",
-    "@typescript-eslint/eslint-plugin": "^8.44.1",
-    "@typescript-eslint/parser": "^8.44.1",
-    "@webank/eslint-config-webank": "1.3.1",
-    "concurrently": "^9.2.1",
-    "cross-env": "^10.1.0",
-    "eslint": "^9.36.0",
-    "esm": "^3.2.25",
-    "typescript": "5.9.2",
-    "vite-plugin-glsl": "1.5.1"
+    "cross-env": "^10.1.0"
   },
   "dependencies": {
-    "3d-tiles-renderer": "0.4.16",
-    "@amap/amap-jsapi-loader": "^1.0.1",
     "@fesjs/builder-vite": "4.0.5",
     "@fesjs/fes": "4.0.0-beta.1",
-    "@fesjs/fes-design": "0.8.83",
-    "@fesjs/plugin-access": "^4.0.0-beta.0",
-    "@fesjs/plugin-enums": "4.0.0-beta.0",
-    "@fesjs/plugin-layout": "6.0.0-beta.0",
-    "@fesjs/plugin-model": "4.0.0-beta.0",
-    "@fesjs/plugin-pinia": "4.0.0-beta.0",
-    "@fesjs/plugin-qiankun": "4.0.0-beta.0",
-    "@fesjs/plugin-request": "5.0.0-beta.0",
-    "@fesjs/plugin-sass": "4.0.0-beta.0",
-    "@here/quantized-mesh-decoder": "^1.2.8",
-    "@icegl/geokit": "^2.0.3",
-    "@iconify/json": "2.2.386",
-    "@mapbox/tilebelt": "^2.0.2",
-    "@mkkellogg/gaussian-splats-3d": "^0.4.7",
-    "@pangenerator/tweakpane-textarea-plugin": "^2.0.0",
-    "@pmndrs/vanilla": "^1.25.0",
-    "@sparkjsdev/spark": "2.0.0",
-    "@takram/three-atmosphere": "0.19.1",
-    "@takram/three-clouds": "0.7.6",
-    "@takram/three-geospatial": "0.9.1",
-    "@takram/three-geospatial-effects": "0.6.4",
-    "@tresjs/cientos": "5.2.1",
-    "@tresjs/core": "5.2.1",
-    "@tresjs/leches": "0.14.1",
-    "@tresjs/post-processing": "3.1.0",
-    "@turf/turf": "^7.2.0",
-    "@tweenjs/tween.js": "^25.0.0",
-    "@vicons/carbon": "^0.13.0",
-    "@vicons/ionicons5": "^0.13.0",
-    "@visactor/vchart": "^2.0.5",
-    "@visactor/vchart-theme": "^1.12.2",
-    "animate.css": "^4.1.1",
-    "axios": "^1.12.2",
-    "cannon-es": "^0.20.0",
     "cesium": "1.145.0",
-    "chalk": "^5.6.2",
-    "color": "^5.0.2",
-    "compressing": "^2.0.0",
     "core-js": "^3.45.1",
-    "d3-geo": "^3.1.1",
-    "dayjs": "^1.11.18",
-    "echarts": "^6.0.0",
-    "echarts-liquidfill": "^3.1.0",
-    "echarts-stat": "^1.2.0",
-    "echarts-wordcloud": "^2.1.0",
-    "file-saver": "^2.0.5",
-    "gl-matrix": "^3.4.4",
-    "gl-noise": "^1.6.1",
-    "gsap": "3.13.0",
-    "heatmap.js-fix": "^1.0.0",
-    "iconify-icon": "^3.0.1",
-    "json5": "^2.2.3",
-    "jszip": "^3.10.1",
-    "lamina": "1.2.2",
-    "leaflet": "1.9.4",
-    "lodash": "^4.17.21",
-    "lygia": "^1.3.3",
-    "mqtt": "^5.14.1",
-    "naive-ui": "2.43.1",
-    "netcdfjs": "^3.0.0",
-    "nipplejs": "^0.10.2",
-    "oimophysics": "^1.2.2",
     "patch-package": "^8.0.0",
     "pinia": "2.3.1",
     "postinstall-postinstall": "^2.1.0",
-    "postprocessing": "6.37.8",
-    "sass": "1.49.11",
-    "simplex-noise": "^4.0.3",
     "three": "0.180.0",
-    "three-bvh-csg": "^0.0.17",
-    "three-custom-shader-material": "6.3.7",
-    "three-loader-3dtiles": "1.2.7",
-    "three-mesh-bvh": "0.9.1",
-    "three-subdivide": "^1.1.5",
-    "three-tile": "0.11.10",
-    "three.quarks": "^0.16.0",
-    "tilebelt-wgs84": "1.1.4",
-    "turf": "^3.0.14",
-    "tweakpane": "4.0.5",
-    "unocss": "^66.5.2",
-    "vite-plugin-javascript-obfuscator": "^3.1.0",
-    "vue": "3.5.21",
-    "vue-echarts": "^7.0.3",
-    "vue3-lazyload": "^0.3.8"
+    "vue": "3.5.21"
   },
   "packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e"
 }

+ 6 - 184
src/app.jsx

@@ -6,190 +6,12 @@
  * @LastEditors: 地虎降天龙
  * @LastEditTime: 2025-09-23 11:34:44
  */
-import { defineRuntimeConfig, useModel } from '@fesjs/fes'
-import { reactive } from 'vue'
-import { FMenu } from '@fesjs/fes-design'
-import Tres from '@tresjs/core'
-import chalk from 'chalk'
+import { defineRuntimeConfig } from '@fesjs/fes'
+import { createPinia } from 'pinia'
 
-import 'uno.css'
-import 'animate.css/animate.min.css'
+// 驾驶舱不注册 TvT 预览菜单、插件页面或微前端示例。
+export default defineRuntimeConfig({})
 
-// 注册图标 iconify goview
-import { addCollection } from 'iconify-icon'
-import uimIcons from '@iconify/json/json/uim.json'
-import lineMdIcons from '@iconify/json/json/line-md.json'
-import wiIcons from '@iconify/json/json/wi.json'
-import { useQiankunTvtStore } from '@/plugins/qiankunTvt/stores/index'
-import { qiankunWindow } from 'vite-plugin-qiankun/dist/helper'
-import UserCenter from '@/components/forPreview/userCenter.vue'
-import PageLoading from '@/components/pageLoading.vue'
-import { useForPreviewStore } from '@/stores/forPreview'
-
-addCollection(uimIcons)
-addCollection(lineMdIcons)
-addCollection(wiIcons)
-
-let qiankunTvtStore = null
-export default defineRuntimeConfig({
-    beforeRender: {
-        loading: <PageLoading />,
-        action () {
-            if (qiankunWindow.__POWERED_BY_QIANKUN__) {
-                qiankunTvtStore = useQiankunTvtStore()
-                const purl = qiankunWindow.__INJECTED_PUBLIC_PATH_BY_QIANKUN__
-                globalThis.__INJECTED_PUBLIC_PATH_BY_QIANKUN__ = purl
-                window.__INJECTED_PUBLIC_PATH_BY_QIANKUN__ = purl
-                console.log('qiankunWindow.__INJECTED_PUBLIC_PATH_BY_QIANKUN__', qiankunWindow.__INJECTED_PUBLIC_PATH_BY_QIANKUN__)
-                // window.__webpack_public_path__ = purl
-                // qiankunWindow.__webpack_public_path__ = purl
-                // Object.defineProperty(import.meta, 'url', { get: () => purl })
-            }
-            const { signin, getMenu } = useForPreviewStore()
-            // const { signin, getMenu } = useModel('useAuthModel')
-            signin()
-            if ((process.env.FES_APP_PLUGINS === 'true' && process.env.NODE_ENV === 'development') || process.env.FES_APP_ONLINE_API) {
-                getMenu()
-            }
-        },
-    },
-})
-
-export function layout (layoutConfig) {
-    return {
-        renderCustom: () => <UserCenter />,
-        ...layoutConfig,
-        menus: () => {
-            window.layoutConfig = layoutConfig
-            return layoutConfig.menus
-        }
-    }
-}
-
-
-export function onAppCreated ({ app }) {
-    app.use(FMenu)
-    app.use(Tres)
-
-    window.$vue = app
-
-    // if (process.env.FES_APP_PLUGINS === 'true') { 
-    console.log(chalk.hex('#1c86e5')(`
-     ░▒▓████████▓▒░ ░▒▓█▓▒░░▒▓█▓▒░ ░▒▓████████▓▒░                 ░▒▓█▓▒░  ░▒▓███████▓▒░ 
-        ░▒▓█▓▒░     ░▒▓█▓▒░░▒▓█▓▒░    ░▒▓█▓▒░                     ░▒▓█▓▒░ ░▒▓█▓▒░        
-        ░▒▓█▓▒░      ░▒▓█▓▒▒▓█▓▒░     ░▒▓█▓▒░                     ░▒▓█▓▒░ ░▒▓█▓▒░        
-        ░▒▓█▓▒░      ░▒▓█▓▒▒▓█▓▒░     ░▒▓█▓▒░                     ░▒▓█▓▒░  ░▒▓██████▓▒░  
-        ░▒▓█▓▒░       ░▒▓█▓▓█▓▒░      ░▒▓█▓▒░              ░▒▓█▓▒░░▒▓█▓▒░        ░▒▓█▓▒░ 
-        ░▒▓█▓▒░       ░▒▓█▓▓█▓▒░      ░▒▓█▓▒░     ░▒▓██▓▒░ ░▒▓█▓▒░░▒▓█▓▒░        ░▒▓█▓▒░ 
-        ░▒▓█▓▒░        ░▒▓██▓▒░       ░▒▓█▓▒░     ░▒▓██▓▒░  ░▒▓██████▓▒░  ░▒▓███████▓▒░  
-        `))
-    console.log(chalk.hex('#5384ff').bold('· 二次开发如用于商业性质或开源竞品请不要删除和修改 TvT.js 源码头部的版权与作者声明及出处。'))
-    console.log(chalk.hex('#5384ff').bold('· 本项目遵循 Apache2 开源协议发布,并提供永久免费使用以及商用,但是不允许二次开源出来并进行收费。'))
-    console.log(chalk.hex('#1c86e5').bold('版权所有 Copyright © 2022-2025 by 🧊icegl (https://www.icegl.cn)'))
-    // }
+export function onAppCreated({ app }) {
+    app.use(createPinia())
 }
-const findStringBetween = (str) => {
-    const regex = /plugins\/([^/]+)\/pages\//
-    const match = str.match(regex)
-    if (match && match[1]) {
-        return match[1]
-    }
-    return null
-}
-
-export function patchRoutes ({ routes }) {
-    if (process.env.FES_APP_PLUGINS === 'false') {
-        console.log('项目开发模式: 配置 不自动增加插件plugins里面各个pages的页面路由')
-        return
-    }
-
-    // 自动读取plugins目录下所有插件的pages的目录下的*.vue 并加入路由
-    let viteModules = import.meta.glob('./plugins/**/pages/**/*.vue')
-    if (process.env.FES_APP_PLSNAME !== undefined) {
-        const filteredModules = Object.fromEntries(
-            Object.entries(viteModules).filter(([path]) => path.startsWith(`./plugins/${process.env.FES_APP_PLSNAME}/pages/`))
-        )
-        viteModules = filteredModules
-    }
-    const needAddRouter = {
-        path: '/plugins',
-        component: () => import("./components/forPreview/suspenseLayout.vue"),
-        children: []
-    }
-    // eslint-disable-next-line guard-for-in
-    for (const [key, value] of Object.entries(viteModules)) {
-        const pluginName = findStringBetween(key)
-        const urlList = key.match(/\.\/(.+)\.vue$/)[1].split('/')
-        if (urlList.length === 4) {  //插件一级目录 普通插件
-            needAddRouter.children.unshift({
-                path: `/plugins/${pluginName}/${urlList[3]}`,
-                component: value
-            })
-        }
-        else if (urlList.length === 5) { //插件二级目录 目前只存在已 basic 基础功能展示
-            needAddRouter.children.unshift({
-                path: `/plugins/${pluginName}/${urlList[3]}/${urlList[4]}`,
-                component: value
-            })
-        } else {  // 若目录异常 那么直接跳过
-            return
-        }
-    }
-    routes.unshift(needAddRouter)
-}
-
-export function modifyRoute (memo) {
-    if (process.env.FES_APP_PREINDEX === 'true') {
-        console.log('预览模式下 已经自动替换index的路由为 plugins/preview.vue')
-        let indexRoute = memo.routes.find(route => route.path === '/')
-        if (indexRoute) {
-            indexRoute = indexRoute.children.find(route => route.path === '/')
-            if (indexRoute) {
-                indexRoute.component = () => import("./plugins/preview.vue")
-                indexRoute.meta = {
-                    name: 'preview',
-                    title: '开源框架展示',
-                }
-            }
-        }
-    }
-    if (process.env.FES_APP_PLUGINS === 'false') {
-        console.log('项目开发模式: 默认路由 去除layout模式')
-        const indexRoute = memo.routes.find(route => route.path === '/')
-        if (indexRoute) {
-            indexRoute.component = null
-        }
-    }
-
-    return {
-        ...memo,
-        routes: [
-            ...memo.routes
-        ]
-    }
-}
-
-export const qiankun = { 
-    // 应用加载之前
-    async bootstrap (props) {
-        console.log('son TvT.js bootstrap', props)
-    },
-    // 应用 render 之前触发
-    async mount (props) {
-        console.log('son TvT.js mount', props)
-        if (props) {
-            props.onGlobalStateChange((state, prev) => {
-                qiankunTvtStore.setGlobalState(state)
-            })
-            window.qiankunProps = props
-        }
-    },
-    // 当 props 更新时触发
-    async update (props) {
-        console.log('son TvT.js update', props)
-    },
-    // 应用卸载之后触发
-    async unmount (props) {
-        console.log('son TvT.js unmount', props)
-    },
-}

+ 1 - 1
src/global.less

@@ -4,7 +4,7 @@ body, html {
     height: 100vh;
 }
 #tvt-app{
-    background-color: var(--f-black);
+    background-color: #01090f;
     // position: relative;
     // min-height: 100vh;
 }

+ 1 - 1
src/pages/index.vue

@@ -3,7 +3,7 @@
 </template>
 
 <script setup>
-import { useRoute, useRouter } from 'vue-router'
+import { useRoute, useRouter } from '@fesjs/fes'
 
 // 只输入 IP + 端口时直接进入驾驶舱;保留 dataSource、lodAudit 等查询参数。
 const route = useRoute()

+ 0 - 6
tsconfig.json

@@ -3,9 +3,6 @@
     "outDir": "build/dist",
     "module": "esnext",
     "target": "es2017",
-    "types": [
-      "./src/common/vite-plugin-glsl-ext.d.ts"
-    ],
     "lib": [
       "esnext",
       "dom"
@@ -26,9 +23,6 @@
       "@/*": [
         "./src/*"
       ],
-      "PLS/*": [
-        "./src/plugins/*"
-      ],
       "@@/*": [
         "./src/.fes/*"
       ]

Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 24 - 938
yarn.lock


Niektoré súbory nie sú zobrazené, pretože je v týchto rozdielových dátach zmenené mnoho súborov