Parcourir la source

外壳对齐(步骤4 完成): 页签栏 header 之外 nav.tabs#tabs(照 v2.9.2 shell);Workbench 去 nav.wb-tabs;页头去应用模式按钮;补 TABS/DONE import;新增选择器式挂载门禁 tools/_mount_check.mjs

zhouyang.xie il y a 1 semaine
Parent
commit
cef79f1a02

+ 6 - 0
app_frontEnd/web/src/App.vue

@@ -11,6 +11,7 @@
 import { computed, onMounted, ref, watch } from 'vue'
 import { computed, onMounted, ref, watch } from 'vue'
 import ContractSmoke from './views/ContractSmoke.vue'
 import ContractSmoke from './views/ContractSmoke.vue'
 import Workbench from './views/Workbench.vue'
 import Workbench from './views/Workbench.vue'
+import { TABS, DONE } from './lib/tabs'
 import { t } from './i18n/zh'
 import { t } from './i18n/zh'
 import PortalView from './views/PortalView.vue'
 import PortalView from './views/PortalView.vue'
 import { callApi } from './api/contract'
 import { callApi } from './api/contract'
@@ -114,6 +115,11 @@ onMounted(() => {
       <button :class="{ on: mode === 'about' }" @click="go('about')">关于本前端</button>
       <button :class="{ on: mode === 'about' }" @click="go('about')">关于本前端</button>
     </nav>
     </nav>
   </header>
   </header>
+  <nav class="tabs" id="tabs">
+    <button v-for="id in TABS" :key="id" :class="{ on: id === tab }" @click="tab = id">
+      {{ t('tab.' + id) }}<sup v-if="!DONE.includes(id)" class="todo">迁移中</sup>
+    </button>
+  </nav>
   <main id="root" v-if="mode !== 'portal'">
   <main id="root" v-if="mode !== 'portal'">
     <template v-if="mode === 'workbench'">
     <template v-if="mode === 'workbench'">
       <p v-if="loading" class="hint" style="padding:0 18px">取数中(/api/fleet)…</p>
       <p v-if="loading" class="hint" style="padding:0 18px">取数中(/api/fleet)…</p>

+ 0 - 5
app_frontEnd/web/src/views/Workbench.vue

@@ -46,11 +46,6 @@ const pending = computed(() => !DONE.includes(props.tab))
 </script>
 </script>
 
 
 <template>
 <template>
-  <nav class="wb-tabs">
-    <button v-for="id in TABS" :key="id" :class="{ on: id === tab }" @click="emit('tab', id)">
-      {{ t('tab.' + id) }}<sup v-if="!DONE.includes(id)" class="todo">迁移中</sup>
-    </button>
-  </nav>
   <div class="page-head">
   <div class="page-head">
     <h1>{{ t('tab.' + tab) }}</h1>
     <h1>{{ t('tab.' + tab) }}</h1>
     <!-- 与旧 app.js:1066 逐字一致:`${t('win.label')} · ${winName(WIN)}`(对拍实逮:写成 win.l 第 1 项就错位) -->
     <!-- 与旧 app.js:1066 逐字一致:`${t('win.label')} · ${winName(WIN)}`(对拍实逮:写成 win.l 第 1 项就错位) -->

+ 32 - 0
app_frontEnd/web/tools/_mount_check.mjs

@@ -0,0 +1,32 @@
+// P60 挂载检查(选择器式):打印关键选择器命中与 console 错误,供门禁判定
+import { readFileSync } from 'node:fs'
+import { fileURLToPath } from 'node:url'
+import { dirname, resolve } from 'node:path'
+import { JSDOM, VirtualConsole } from 'jsdom'
+const HERE = dirname(fileURLToPath(import.meta.url))
+const dist = resolve(HERE, '../../../release/web')
+const idx = readFileSync(dist + '/index.html', 'utf8')
+const jsFile = (idx.match(/src="([^"]+\.js)"/) || [])[1].replace(/^.*\//, '')
+const cssFile = (idx.match(/href="([^"]+\.css)"/) || [])[1].replace(/^.*\//, '')
+const code = readFileSync(dist + '/assets/' + jsFile, 'utf8')
+const css = readFileSync(dist + '/assets/' + cssFile, 'utf8')
+const errs = []
+const vc = new VirtualConsole()
+vc.on('jsdomError', (e) => errs.push(String(e && e.message).slice(0, 200)))
+vc.on('error', (...a) => errs.push(a.map(String).join(' ').slice(0, 200)))
+const dom = new JSDOM(idx.replace('</head>', '<style>' + css + '</style></head>'),
+  { url: 'http://127.0.0.1:28084/detail/v2#workbench', runScripts: 'outside-only', pretendToBeVisual: true, virtualConsole: vc })
+const w = dom.window
+w.fetch = async () => ({ ok: true, status: 200, json: async () => ({ win: '2026年', all_months: ['2026-08', '2026-09'] }), text: async () => '{}' })
+try { w.eval(code) } catch (e) { errs.push('EVAL ' + String(e).slice(0, 200)) }
+for (let i = 0; i < 20; i++) { await new Promise((r) => setTimeout(r, 400)); if (w.document.querySelector('nav.tabs#tabs, .wb-tabs')) break }
+const d = w.document
+const q = (s) => (d.querySelector(s) ? 'Y' : 'N')
+console.log('APP_CHILDREN ' + d.getElementById('app').children.length)
+console.log('NAV_TABS_ID ' + q('nav.tabs#tabs'))
+console.log('TAB_BUTTONS ' + d.querySelectorAll('nav.tabs#tabs > button').length)
+console.log('WRAP ' + q('.wrap') + ' HEADER ' + q('header.top') + ' MARK ' + q('span.mark') + ' BRAND ' + q('span.brand'))
+console.log('RIGHT ' + q('div.right') + ' BACKPORTAL ' + q('a.back-portal') + ' RESELECT ' + q('button.reselect'))
+console.log('WIN_SELECT ' + q('#win') + ' OPTS ' + d.querySelectorAll('#win option').length + ' WINRNG ' + q('span.winrng'))
+console.log('MAIN_ROOT ' + q('main#root') + ' PAGEHEAD ' + q('.page-head') + ' FOOTER ' + q('footer#foot'))
+console.log('ERRORS ' + JSON.stringify(errs.slice(0, 3)))

Fichier diff supprimé car celui-ci est trop grand
+ 0 - 0
release/web/assets/index-B-A9wmEl.js


Fichier diff supprimé car celui-ci est trop grand
+ 0 - 0
release/web/assets/index-CaGxeZ59.css


+ 2 - 2
release/web/index.html

@@ -4,8 +4,8 @@
   <meta charset="utf-8" />
   <meta charset="utf-8" />
   <meta name="viewport" content="width=device-width, initial-scale=1" />
   <meta name="viewport" content="width=device-width, initial-scale=1" />
   <title>观澜 · 风电数据分析与决策支持</title>
   <title>观澜 · 风电数据分析与决策支持</title>
-  <script type="module" crossorigin src="/web/assets/index-C6eKPw1d.js"></script>
-  <link rel="stylesheet" crossorigin href="/web/assets/index-B0oni8dy.css">
+  <script type="module" crossorigin src="/web/assets/index-B-A9wmEl.js"></script>
+  <link rel="stylesheet" crossorigin href="/web/assets/index-CaGxeZ59.css">
 </head>
 </head>
 <body>
 <body>
   <div id="app"></div>
   <div id="app"></div>

Certains fichiers n'ont pas été affichés car il y a eu trop de fichiers modifiés dans ce diff