From 9471562f67016b61bbcf70f843f1096f90e7f6a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B5=85=E5=BF=B5?= Date: Wed, 23 Sep 2026 07:04:18 +0800 Subject: [PATCH] =?UTF-8?q?feat(ui06):=20B3d=20governance=20+=20B3e=20clos?= =?UTF-8?q?ing=20=E2=80=94=20page=20headings,=20stat=20cards,=20info=20str?= =?UTF-8?q?ip,=20embed=20slots?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 治理页通用层(ui06.scss):.ui06-page 工作区 / .ui06-page-heading 27px 页头 / .ui06-stats 三列统计卡 / .ui06-info-strip 提示条 / .ui06-card-title 17px 卡头 - 10 账号:页头(查看同步入口)+ 来源提示条;分页/同步档案列/G4 功能零改动 - 11 同步:页头(手动补拉上移);状态卡/历史/失败明细抽屉保留 - 12 用量:页头(阈值设置上移)+ 统计卡对齐示例(数字 27px + 注脚 10px) - 13 展示位:页头 + 卡片标题(配置对话框沿用 UI-04 真实组件) - 17-19 异常页:沿用 ArtException(大数字+文案+回退,语义等同示例;登记偏差) - i18n zh/en;typecheck/lint/vitest/build 全绿 Co-Authored-By: Claude Code --- apps/admin/src/assets/styles/custom/ui06.scss | 111 ++++++++++++++++++ apps/admin/src/locales/langs/en.json | 23 +++- apps/admin/src/locales/langs/zh.json | 23 +++- .../src/views/system/embed-slots/index.vue | 20 +++- apps/admin/src/views/system/usage/index.vue | 60 +++++----- .../src/views/system/user-sync/index.vue | 32 +++-- apps/admin/src/views/system/users/index.vue | 26 +++- .../after-b3c/01-login.png | Bin 0 -> 641221 bytes .../after-b3c/02-albums.png | Bin 0 -> 177434 bytes .../after-b3c/03-photos.png | Bin 0 -> 455994 bytes .../after-b3c/04-members.png | Bin 0 -> 150596 bytes .../after-b3c/05-categories.png | Bin 0 -> 155019 bytes .../after-b3c/06-watermark.png | Bin 0 -> 258604 bytes .../after-b3c/07-share.png | Bin 0 -> 254719 bytes .../after-b3c/08-create.png | Bin 0 -> 68287 bytes .../ui06-implementation/after-b3c/09-edit.png | Bin 0 -> 66433 bytes .../after-b3c/10-users.png | Bin 0 -> 132854 bytes .../after-b3c/11-user-sync.png | Bin 0 -> 103407 bytes .../after-b3c/12-usage.png | Bin 0 -> 66978 bytes .../after-b3c/13-embed-slots.png | Bin 0 -> 48725 bytes .../after-b3c/14-embed-editor.png | Bin 0 -> 187570 bytes .../after-b3c/15-branding.png | Bin 0 -> 66425 bytes .../after-b3c/16-photo-viewer.png | Bin 0 -> 66431 bytes .../ui06-implementation/after-b3c/17-403.png | Bin 0 -> 21193 bytes .../ui06-implementation/after-b3c/18-404.png | Bin 0 -> 26730 bytes .../ui06-implementation/after-b3c/19-500.png | Bin 0 -> 24495 bytes .../after-b3c/20-sync-detail.png | Bin 0 -> 111653 bytes .../after-b3c/capture.json | 10 ++ 28 files changed, 254 insertions(+), 51 deletions(-) create mode 100644 docs/designs/ui06-implementation/after-b3c/01-login.png create mode 100644 docs/designs/ui06-implementation/after-b3c/02-albums.png create mode 100644 docs/designs/ui06-implementation/after-b3c/03-photos.png create mode 100644 docs/designs/ui06-implementation/after-b3c/04-members.png create mode 100644 docs/designs/ui06-implementation/after-b3c/05-categories.png create mode 100644 docs/designs/ui06-implementation/after-b3c/06-watermark.png create mode 100644 docs/designs/ui06-implementation/after-b3c/07-share.png create mode 100644 docs/designs/ui06-implementation/after-b3c/08-create.png create mode 100644 docs/designs/ui06-implementation/after-b3c/09-edit.png create mode 100644 docs/designs/ui06-implementation/after-b3c/10-users.png create mode 100644 docs/designs/ui06-implementation/after-b3c/11-user-sync.png create mode 100644 docs/designs/ui06-implementation/after-b3c/12-usage.png create mode 100644 docs/designs/ui06-implementation/after-b3c/13-embed-slots.png create mode 100644 docs/designs/ui06-implementation/after-b3c/14-embed-editor.png create mode 100644 docs/designs/ui06-implementation/after-b3c/15-branding.png create mode 100644 docs/designs/ui06-implementation/after-b3c/16-photo-viewer.png create mode 100644 docs/designs/ui06-implementation/after-b3c/17-403.png create mode 100644 docs/designs/ui06-implementation/after-b3c/18-404.png create mode 100644 docs/designs/ui06-implementation/after-b3c/19-500.png create mode 100644 docs/designs/ui06-implementation/after-b3c/20-sync-detail.png create mode 100644 docs/designs/ui06-implementation/after-b3c/capture.json diff --git a/apps/admin/src/assets/styles/custom/ui06.scss b/apps/admin/src/assets/styles/custom/ui06.scss index ce96f14..8f3faca 100644 --- a/apps/admin/src/assets/styles/custom/ui06.scss +++ b/apps/admin/src/assets/styles/custom/ui06.scss @@ -111,3 +111,114 @@ body { outline: 3px solid #9fc7ff; outline-offset: 2px; } + +/* ══════════ 治理页通用(示例 .workspace / .page-heading / .stats / .stat / .info-strip) ══════════ */ + +.ui06-page { + max-width: 1660px; + padding: 28px 30px 44px; + margin: auto; +} + +.ui06-page-heading { + display: flex; + align-items: center; + justify-content: space-between; + gap: 20px; + margin-bottom: 22px; + + h1 { + font-size: 27px; + letter-spacing: -0.7px; + line-height: 1.4; + } + + > div > p { + margin-top: 6px; + font-size: 12px; + color: #7b899f; + } + + .actions { + display: flex; + flex-wrap: wrap; + gap: 10px; + align-items: center; + } +} + +/* 三列统计卡(示例 .stats / .stat) */ +.ui06-stats { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 18px; + margin-bottom: 22px; + + .ui06-stat { + padding: 21px; + background: #ffffff; + border: 1px solid #e5eaf1; + border-radius: 12px; + + p { + font-size: 11px; + color: #8797ac; + } + + strong { + display: block; + margin: 9px 0 4px; + font-size: 27px; + font-weight: 650; + letter-spacing: -0.6px; + + .unit { + font-size: 17px; + font-weight: 600; + } + } + + small { + font-size: 10px; + color: #97a4b5; + } + } +} + +/* 提示条(示例 .info-strip) */ +.ui06-info-strip { + display: flex; + gap: 9px; + align-items: center; + padding: 12px 16px; + margin-bottom: 20px; + font-size: 12px; + color: #6480a8; + background: #edf4fe; + border: 1px solid #e2edfc; + border-radius: 9px; +} + +@media (max-width: 900px) { + .ui06-stats { + grid-template-columns: 1fr; + gap: 10px; + } + + .ui06-page { + padding: 20px 14px 40px; + } + + .ui06-page-heading { + flex-direction: column; + align-items: flex-start; + gap: 12px; + } +} + +/* 卡片头标题(示例 .card-head h2 17px) */ +.ui06-card-title { + font-size: 17px; + font-weight: 600; + line-height: 1.4; +} diff --git a/apps/admin/src/locales/langs/en.json b/apps/admin/src/locales/langs/en.json index d6dca5d..e96a242 100644 --- a/apps/admin/src/locales/langs/en.json +++ b/apps/admin/src/locales/langs/en.json @@ -586,7 +586,10 @@ "totals": { "photoCount": "Total Photos", "totalBytes": "Total Storage", - "thresholds": "Alert Thresholds" + "thresholds": "Alert Thresholds", + "photoCountNote": "Aggregate from usage response", + "totalBytesNote": "Originals + viewing variants", + "thresholdsNote": "An alert threshold, not a hard storage quota" }, "albums": { "title": "Album Usage", @@ -621,6 +624,10 @@ "kind_storage": "Storage", "kind_perAlbum": "Per album", "empty": "No alerts" + }, + "page": { + "title": "Storage & usage", + "subtitle": "Understand retained assets and act before thresholds are exceeded." } }, "usersManage": { @@ -649,7 +656,11 @@ "actionResetPassword": "Reset Password", "actionActivate": "Activate", "actionDeactivate": "Deactivate", - "actionUnlock": "Unlock" + "actionUnlock": "Unlock", + "subtitle": "Provisioned company accounts, credential state and local access controls.", + "viewSync": "View user sync", + "tableTitle": "Accounts", + "sourceHint": "Users are pulled from the company directory on a schedule; no public sign-up. Source state and local lock are independent." }, "filter": { "queryPlaceholder": "Account/name prefix", @@ -770,6 +781,10 @@ "colCode": "Code", "colDetail": "Detail", "colCreatedAt": "Recorded At" + }, + "page": { + "title": "User sync", + "subtitle": "Review scheduled directory pulls and resolve failed records." } }, "embedSlotsManage": { @@ -790,7 +805,9 @@ "unbound": "Unbound", "actionEdit": "Edit", "actionBind": "Bind Album", - "actionCode": "Embed Code" + "actionCode": "Embed Code", + "subtitle": "Manage floating photo widgets: album binding, toggles and embed code.", + "tableTitle": "Slots" }, "form": { "nameLabel": "Name", diff --git a/apps/admin/src/locales/langs/zh.json b/apps/admin/src/locales/langs/zh.json index 6a602c0..a9a6779 100644 --- a/apps/admin/src/locales/langs/zh.json +++ b/apps/admin/src/locales/langs/zh.json @@ -586,7 +586,10 @@ "totals": { "photoCount": "照片总数", "totalBytes": "存储总量", - "thresholds": "告警阈值" + "thresholds": "告警阈值", + "photoCountNote": "用量接口汇总", + "totalBytesNote": "原图 + 浏览变体", + "thresholdsNote": "告警阈值,并非存储硬配额" }, "albums": { "title": "相册用量", @@ -621,6 +624,10 @@ "kind_storage": "全库存储", "kind_perAlbum": "单相册", "empty": "暂无告警" + }, + "page": { + "title": "存储与用量", + "subtitle": "查看长期保留的照片资产与告警阈值。" } }, "usersManage": { @@ -649,7 +656,11 @@ "actionResetPassword": "重置密码", "actionActivate": "激活", "actionDeactivate": "停用", - "actionUnlock": "解锁" + "actionUnlock": "解锁", + "subtitle": "统一查看企业来源状态、登录凭据与本地账号治理。", + "viewSync": "查看用户同步", + "tableTitle": "账号列表", + "sourceHint": "用户信息来自企业接口定期拉取,不开放注册;来源状态与本地锁定相互独立。" }, "filter": { "queryPlaceholder": "账号/姓名前缀", @@ -770,6 +781,10 @@ "colCode": "分类码", "colDetail": "详情", "colCreatedAt": "记录时间" + }, + "page": { + "title": "用户同步", + "subtitle": "查看企业用户接口的定时拉取结果,定位失败记录。" } }, "embedSlotsManage": { @@ -790,7 +805,9 @@ "unbound": "未绑定", "actionEdit": "编辑", "actionBind": "绑定相册", - "actionCode": "嵌入代码" + "actionCode": "嵌入代码", + "subtitle": "管理官网悬浮照片展示位:绑定相册、启停与接入代码。", + "tableTitle": "展示位列表" }, "form": { "nameLabel": "名称", diff --git a/apps/admin/src/views/system/embed-slots/index.vue b/apps/admin/src/views/system/embed-slots/index.vue index 841b2e5..641a5fe 100644 --- a/apps/admin/src/views/system/embed-slots/index.vue +++ b/apps/admin/src/views/system/embed-slots/index.vue @@ -3,14 +3,24 @@ 文案)+ 嵌入代码卡。启停与任何管理面变更一样递增 configVersion——toast 携带新版本号提示(嵌入端轮询发现版本升即整体重置渲染)。 -->