From 90338f39808cdd686a93ab7585a7fb77db49d456 Mon Sep 17 00:00:00 2001 From: chenxing Date: Sun, 11 Oct 2026 21:56:40 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AF=B9=E6=8E=A5=E8=A7=84=E8=8C=83=E8=90=BD?= =?UTF-8?q?=E5=9C=B0=EF=BC=9A=E7=89=88=E6=9C=AC=E9=94=811.3.24/=E6=93=8D?= =?UTF-8?q?=E4=BD=9C=E5=88=97actionColumn=20text/=E8=A1=A8=E6=A0=BC?= =?UTF-8?q?=E6=92=91=E6=BB=A1=E6=96=B0=E6=A8=A1=E5=9E=8B/=E6=92=A4?= =?UTF-8?q?=E9=85=8D=E8=89=B2=E5=88=87=E6=8D=A2=E5=99=A8/=E8=B6=85?= =?UTF-8?q?=E7=AE=A1=E9=97=A8=E6=A7=9B+=E5=A4=96=E8=A7=82=E4=B8=89?= =?UTF-8?q?=E9=94=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.dev | 3 + MOCK.md | 2 +- package-lock.json | 2 +- package.json | 2 +- src/App.vue | 80 +++++++- src/assets/mock/gatewayApi.ts | 21 ++ src/assets/styles/main.scss | 18 ++ src/components/TablePageAlovaNew.vue | 47 +++-- src/components/ThemeSwitcher.vue | 274 --------------------------- src/components/layout.vue | 42 ++-- src/main.ts | 8 + src/utils/hook/useElementHeight.ts | 36 ++++ src/utils/superGate.ts | 48 +++++ src/utils/tableActions.ts | 165 ++++++++++++++++ src/utils/theme.ts | 151 --------------- src/views/app/AppList.vue | 22 +-- src/views/ledger/LedgerList.vue | 28 +-- src/views/route/RouteList.vue | 21 +- src/views/target/TargetList.vue | 21 +- vite.config.ts | 8 + 20 files changed, 481 insertions(+), 518 deletions(-) delete mode 100644 src/components/ThemeSwitcher.vue create mode 100644 src/utils/hook/useElementHeight.ts create mode 100644 src/utils/superGate.ts create mode 100644 src/utils/tableActions.ts delete mode 100644 src/utils/theme.ts diff --git a/.env.dev b/.env.dev index 63da704..8676d8a 100644 --- a/.env.dev +++ b/.env.dev @@ -5,3 +5,6 @@ # (/open-gateway/front/ → 首段 open-gateway → ${origin}/open-gateway)。 VITE_SERVICE_HOST=/open-gateway VITE_IS_MOCK=false +# 超管门槛(src/utils/superGate.ts):本地无平台 Cookie 时 CurrentUser 探测失败按放行处理; +# 如需完全旁路门槛,取消下一行注释(仅 dev 生效,build 不读本文件)。 +# VITE_SUPER_GATE=off diff --git a/MOCK.md b/MOCK.md index 5d7d04d..3333dfc 100644 --- a/MOCK.md +++ b/MOCK.md @@ -78,7 +78,7 @@ npm run dev:mock - **接入方式**:`index.html` 头部一段同步 loader(照 Notice 配方,A 类免插件)引 `/static/js/yh-theme-init.js`;host 优先级 `__APP_CONFIG__.staticHost > baseHost > %VITE_THEME_HOST%(dev 可注入)> 同源 /static/`。网关无 env-config,恒走后两档;build 不替换占位符 → 线上走同源通道,零环境值烧入。 - **本地联调**:vite `/static` 代理 → `YH_THEME_PROXY_TARGET`(dev:mock 指本地 9527;`npm run dev` 时指 base 域——**无 VPN 时 `npm run dev` 主题 CSS 取不到,页面剩骨架无皮肤**,这正是 dev:mock 存在的原因)。 - **档位**:五档配色 + 侧栏深浅 + 侧栏跟随 + 顶部渐变,状态存 localStorage(`yh-theme`),由 `/static/js/yh-theme-init.js` 在首帧前挂 `` 档位类(防 FOUC)。 -- **sync 四件**:`src/utils/theme.ts`、`src/components/ThemeSwitcher.vue`、`src/utils/avatar.ts`、`src/components/UserAvatar.vue` 由 YschTheme 下发(consumers.json 已登记 open-gateway 条目)。⚠️ `theme.ts` 顶部有本仓加的 `// @ts-nocheck`(上游为松类型产物)——**下次 `npm run sync` 覆盖后需补回该行**,否则 `npm run typecheck` 报错。 +- **sync 两件**:`src/utils/avatar.ts`、`src/components/UserAvatar.vue` 由 YschTheme 下发(consumers.json 已登记 open-gateway 条目)。2026-10-11 对接规范轮裁撤 `theme.ts` + `ThemeSwitcher.vue`(§3 红线:子应用不做配色切换器),mock 模式配色档位走通道默认档 + `/open-gateway/api/appearance` mock 端点收敛。 ## 实现备注 diff --git a/package-lock.json b/package-lock.json index a0d5f5c..8b6981a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "dependencies": { "alova": "^3.4.0", "sass": "^1.64.1", - "view-ui-plus": "^1.3.16", + "view-ui-plus": "^1.3.24", "vue": "^3.4.19", "vue-router": "4" }, diff --git a/package.json b/package.json index f57a865..6ea57ca 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,7 @@ "dependencies": { "alova": "^3.4.0", "sass": "^1.64.1", - "view-ui-plus": "^1.3.16", + "view-ui-plus": "^1.3.24", "vue": "^3.4.19", "vue-router": "4" }, diff --git a/src/App.vue b/src/App.vue index adf7141..bce4540 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,11 +1,20 @@ @@ -82,4 +110,38 @@ body { height: 100%; overflow-y: auto; } + +/* 通道撑满模型(§4):列表页根节点 page-wrapper yh-fill,flex 纵向铺满、表格区实测高 */ +.base-wrap-main .page-wrapper { + height: 100%; +} + +/* 暂无权限页:整幅居中,配色全走主题令牌(禁写死品牌色,§1) */ +.gate-denied { + height: 100%; + display: flex; + align-items: center; + justify-content: center; + background: var(--page-bg, #f5f7fa); +} +.gate-denied-card { + text-align: center; + padding: 48px 64px; + background: var(--card-bg, #fff); + border-radius: 16px; +} +.gate-denied-icon { + font-size: 44px; + color: var(--brand); +} +.gate-denied-title { + margin: 16px 0 8px; + font-size: 18px; + color: var(--text-main, #17233d); +} +.gate-denied-desc { + margin: 0; + font-size: 13px; + color: var(--text-sub, #808695); +} diff --git a/src/assets/mock/gatewayApi.ts b/src/assets/mock/gatewayApi.ts index 73d7fe3..c8cc242 100644 --- a/src/assets/mock/gatewayApi.ts +++ b/src/assets/mock/gatewayApi.ts @@ -480,6 +480,27 @@ function mockProxyTest(body: any): { code: number; msg: string; data: any } { export async function handleGatewayMockRequest(req: IncomingMessage, res: ServerResponse): Promise { const url = new URL(req.url ?? "/", "http://mock.local"); const pathname = url.pathname; + + // 超管门槛探测(src/utils/superGate.ts):dev:mock 离线可演示两态—— + // 默认超管放行;起服务前设 YH_MOCK_SUPER=0 演示非超管拦截态。 + if (pathname === "/userbase/base/User/CurrentUser") { + const superAdmin = process.env.YH_MOCK_SUPER !== "0"; + send(res, ok({ isSuperAdmin: superAdmin, name: superAdmin ? "mock超级管理员" : "mock普通账号" })); + return true; + } + + // 外观三键同源读(对接规范 §3;线上=网关 AppearanceProxyController 透传 userhome): + // 【裸 payload 无信封】——init 见 code 字段会当异常形态跳过收敛; + // theme/avatar 给生效值即离线走查三键收敛与 yh-appearance-updated 事件。 + if (pathname === "/open-gateway/api/appearance") { + send(res, { + theme: { theme: "blue", sideDeep: false, gradOn: true, sideFollow: true }, + avatar: "text", + logoUrl: null, + }); + return true; + } + if (!pathname.startsWith("/open-gateway/api/")) return false; const api = pathname.slice("/open-gateway".length); diff --git a/src/assets/styles/main.scss b/src/assets/styles/main.scss index bc3eb21..4a21840 100644 --- a/src/assets/styles/main.scss +++ b/src/assets/styles/main.scss @@ -115,3 +115,21 @@ h4.subtitle { margin-right: 4px; margin-bottom: 2px; } + +/* ================= 表格操作列(utils/tableActions.ts)================= + .op-cell:flex 横排容器——把 iView Tooltip/Dropdown 的块级包装层降级为 flex item, + 强制横排(根因:.operating-btn 在通道基线 display:block,.ivu-tooltip 包装层默认 block, + 逐钮竖排;不要再在 cell 上动 display,会牵连其它列)。 + 先落工程内,四端同构后此段上提 YschTheme 主题层。 */ +.op-cell { + display: flex; + align-items: center; + justify-content: center; + gap: 6px; + + // 链间距统一由容器 gap 管理,退役通道基线的 padding-right:10px + .operating-link { + padding-right: 0; + white-space: nowrap; + } +} diff --git a/src/components/TablePageAlovaNew.vue b/src/components/TablePageAlovaNew.vue index 8e1ede6..d9e1e44 100644 --- a/src/components/TablePageAlovaNew.vue +++ b/src/components/TablePageAlovaNew.vue @@ -1,16 +1,18 @@ - - - - diff --git a/src/components/layout.vue b/src/components/layout.vue index 7bfe07e..1811c6f 100644 --- a/src/components/layout.vue +++ b/src/components/layout.vue @@ -1,13 +1,13 @@