Selaa lähdekoodia

首页和登录页设计更改

yuan 1 kuukausi sitten
vanhempi
commit
b798f5f3f1
9 muutettua tiedostoa jossa 108 lisäystä ja 125 poistoa
  1. 40 54
      CMS-UI完整设计.html
  2. 3 3
      src/README.md
  3. 5 13
      src/book.js
  4. 13 14
      src/data2.js
  5. 8 18
      src/pages.css
  6. 14 9
      src/pages.js
  7. 1 0
      src/shot.mjs
  8. 19 11
      src/test.mjs
  9. 5 3
      src/使用说明.txt

+ 40 - 54
CMS-UI完整设计.html

@@ -707,7 +707,14 @@ body.bk-solo .bk-host { width: 1440px; }
 .cv .tab .cnt { margin-left: 6px; font-size: 12px; color: var(--t3); font-family: var(--font-num); }
 .cv .tab.on .cnt { color: var(--c-link); }
 
-/* ---------- 首页工作台 ---------- */
+/* ---------- 首页现状版(2026-10-08 按现状内容重画,默认):只有一张问候卡;工作台版的样式在下一段,整套保留 ---------- */
+.hm-now { display: flex; flex-direction: column; gap: 12px; }
+.hm-hello { display: flex; align-items: center; gap: 20px; padding: 24px 28px; }
+.hm-hello-t { min-width: 0; }
+.hm-hello-t b { display: block; font-size: 20px; line-height: 28px; font-weight: 600; color: var(--t1); }
+.hm-hello-t p { margin: 6px 0 0; font-size: 14px; line-height: 22px; color: var(--t2); }
+
+/* ---------- 首页工作台(保留,变体 work) ---------- */
 .hm { display: grid; grid-template-columns: minmax(0, 1fr) 352px; grid-template-rows: auto minmax(0, 1fr); gap: 12px; height: 100%; min-height: 0; }
 .hm .card-hd .sub b { color: var(--t1); font-weight: 600; }
 .hm .card-hd .sub b.hot { color: var(--c-link); }
@@ -876,23 +883,6 @@ body.bk-solo .bk-host { width: 1440px; }
 .lg-c-left { position: absolute; left: 72px; top: 0; bottom: 0; width: 440px; display: flex; flex-direction: column; justify-content: center; gap: 32px; }
 .lg-c-sys { display: block; font-size: 32px; line-height: 40px; font-weight: 600; color: var(--t1); letter-spacing: .02em; }
 .lg-c-ver { margin-top: 4px; font-size: 12px; color: var(--t3); font-family: var(--font-num); }
-.lg-mods-t { display: flex; align-items: center; gap: 8px; margin-bottom: 8px; font-size: 12px; color: var(--t3); }
-.lg-mods-t span { font-family: var(--font-num); }
-.lg-chips { display: flex; flex-wrap: wrap; gap: 6px; }
-.lg-chip { display: inline-flex; align-items: center; height: 24px; padding: 0 10px; border: 1px solid var(--prim-bd); border-radius: var(--r-tag); background: var(--prim-bg); color: var(--prim-t); font-size: 12px; white-space: nowrap; }
-.lg-ents { display: flex; flex-direction: column; gap: 8px; }
-.lg-ents-t { display: flex; align-items: center; gap: 8px; margin-bottom: 2px; font-size: 12px; color: var(--t3); }
-.lg-ents-t span { color: var(--t4); }
-.lg-ent { display: flex; align-items: center; gap: 12px; height: 60px; padding: 0 14px; border-radius: var(--r-card); background: var(--bg-card); border: var(--card-bd); box-shadow: var(--card-sh); color: var(--t1); cursor: pointer; transition: box-shadow .15s, transform .15s; }
-.lg-ent:hover { box-shadow: var(--sh-pop); transform: translateX(2px); }
-.lg-ent.on { cursor: default; outline: 1.5px solid var(--c-primary); outline-offset: -1.5px; }
-.lg-ent.on:hover { box-shadow: var(--card-sh); transform: none; }
-.lg-ent-n { display: flex; flex-direction: column; min-width: 0; line-height: 18px; }
-.lg-ent-n b { font-size: 14px; font-weight: 600; white-space: nowrap; }
-.lg-ent-n small { font-size: 12px; color: var(--t3); white-space: nowrap; }
-.lg-ent-go { margin-left: auto; display: inline-flex; align-items: center; gap: 2px; font-size: 13px; color: var(--c-link); white-space: nowrap; }
-.lg-ent-go .ic { width: 14px; height: 14px; }
-.lg-ent.on .lg-ent-go { color: var(--t3); }
 /* 右侧浮卡 */
 .lg-card { position: relative; width: 440px; padding: 36px 40px 32px; background: var(--bg-dlg); border-radius: var(--r-dlg); box-shadow: var(--sh-dlg); color: var(--t1); }
 .lg-card .lg-brand { margin-bottom: 24px; }
@@ -1596,7 +1586,10 @@ window.SPEC_DATA2 = (function () {
     ],
   };
 
-  /* ---------- 首页(工作台):数字为示例,上线需要后端提供按状态汇总的接口。字段全部来自各端列表页 ---------- */
+  /* ---------- 首页 ----------
+   * 现状版(默认):只有一张问候卡,文案取自改版前的 views/dashboard/index.vue(问候语按时段 + 昵称;天气那句是模板写死的)。
+   * 工作台版 home:2026-10-08 本稿首版的首页设计,整套保留(变体 work),等首页汇总接口完善后再切回去;数字为示例,字段全部来自各端列表页 */
+  const homeNow = { greeting: "下午好,系统管理员!", weather: "今日天气晴朗,气温在15℃至25℃之间,东南风。" };
   const home = {
     issue: {
       noun: "订单", dictKey: "note_order_status", listKey: "共赢票据管理/订单管理",
@@ -1631,14 +1624,10 @@ window.SPEC_DATA2 = (function () {
     pwdForm: [{ label: "原密码", type: "password", req: true, ph: "请输入原密码" }, { label: "新密码", type: "password", req: true, ph: "6~20 位,至少两类字符" }, { label: "确认密码", type: "password", req: true, ph: "请再次输入新密码" }],
   };
 
-  /* ---------- 登录页(views/login):文案取自 lang/package/zh-cn.json;三端入口的一句话职责取自各端菜单 ---------- */
+  /* ---------- 登录页(views/login):文案取自 lang/package/zh-cn.json ---------- */
   const login = {
     copy: { username: "用户名", password: "密码", captcha: "验证码", remember: "记住我", forget: "忘记密码?", login: "登 录", reset: "重置密码", email: "邮箱", enterEmail: "请输入您的邮箱地址", sendReset: "发送重置链接", think: "想起密码?", back: "返回登录", theme: "主题切换", lang: "语言切换" },
     version: "v3.4.2",
-    // 三端入口卡片上的系统名和一句话职责
-    nodes: { sales: ["销售管理系统", "投资者 · 订单 · 资金"], issue: ["发行管理系统", "票据 · 对冲 · 清算"], trs: ["TRS管理系统", "通道 · 委托 · 风控"] },
-    // 登录页上列出的本系统业务模块:取各端菜单的业务分组(运维与配置类不列)
-    opsGroups: ["系统设置", "机构系统设置", "常驻工作进程", "计划任务中心", "通知和告警管理"],
   };
 
   /* ---------- 反馈类:文案尽量取自真实代码(command-result.ts、各页 ElMessageBox / el-empty / el-alert) ---------- */
@@ -1676,14 +1665,14 @@ window.SPEC_DATA2 = (function () {
     { key: "spec", group: "总览", title: "规范摘要", kind: "spec", sub: "选型结果、尺寸、颜色、12 类对应关系、待确认清单" },
     { key: "kit", group: "总览", title: "组件总览", kind: "kit", sub: "两套皮肤(浅色 F、深色 B 石墨灰)下的全部基础组件,顶栏「皮肤」切换",
       src: "分项选型 · 基础视觉 F(晴空蓝 #3C8CFF、文字链接 #1668DC)", points: ["颜色、文字、按钮、输入控件、状态标签、表格、提示、键值、弹窗外观,全部读同一份令牌;换肤只换令牌取值,尺寸、圆角、字体、排布不变。", "深色皮肤 B 石墨灰(10-08 从三版候选里选定):中性灰、扁平、1px 描边、无渐变无投影,主按钮实心蓝,状态标签只描边。对照见「规范摘要 → 换肤」。", "主按钮是左上浅、右下深的渐变,下面有一层淡蓝投影;页面底色是蓝白渐变,右上角一团浅蓝光晕;卡片白底、14px 圆角、淡蓝投影。", "表头很淡的蓝底,行高 40px;状态是无描边的浅色圆角标签;中性色带蓝调;数字用 Inter。"], todo: ["深色默认跟随系统还是手动切换;切换后的选择记在账号还是本机。"] },
-    { key: "login", group: "全局", title: "登录页", kind: "login", sub: "分项选型登录页 C:右侧浮卡·全幅底图 + 左侧三端入口", variants: [["login", "登录"], ["reset", "重置密码"]], ends: true,
+    { key: "login", group: "全局", title: "登录页", kind: "login", sub: "分项选型登录页 C:右侧浮卡·全幅底图;左侧只有系统名和版本号", variants: [["login", "登录"], ["reset", "重置密码"]], ends: true,
       src: "分项选型 · 登录页 C(2026-10-07 选定);views/login/index.vue、components/Login.vue、ResetPwd.vue;文案取自 lang/package/zh-cn.json",
-      points: ["整页是视觉 F 的蓝白渐变底色,叠一层很淡的网格、几条主色曲线和右上角两个圆(内联 SVG,不用图片文件)。", "左侧一列(垂直居中,和卡片对齐):系统名 32px 和版本号、本系统业务模块(取自本系统菜单的业务分组,不列运维配置类)、「三端系统」三张入口卡片——当前系统标「当前」,另外两个点一下跳到对应系统的登录页。", "右侧 440px 浮卡,离右边 96px:小标志+系统名、「登录」标题、用户名/密码/验证码标签在上,输入框按代码现状 40px(登录页 size=large),其余页面仍是 32px;记住我、忘记密码;登录按钮通宽。", "宽屏:左列和浮卡成一组,组宽按 1440 基准(左 72、列 440、间距 392、卡 440、右 96),窗口更宽时整组居中,两块间距保持 392px 不变;底图和右上角按钮仍铺满整屏。窗口放不下左列(1100 以下)时只留卡片居中。(2026-10-08 定)", "右上角的主题按钮可以点:在浅色和最近看过的深色皮肤之间来回切(月亮/太阳);语言切换只保留入口;「注册」组件代码里存在但登录页没有入口,本稿不画。", "画面里可以点:三端入口(切到那个系统)、忘记密码/返回登录、换一张验证码、显示密码、记住我。"],
-      todo: ["验证码图片是示意;登录页的控件要不要也统一成 32px。", "三端入口是跳到各系统各自的登录地址,三个地址要放在前端配置里维护;跳转时要不要带上当前输入的用户名。", "三端登录页只换系统名、标志、模块清单和入口里的高亮,其余完全一样——是否需要三端不同的底色做区分(口径是三端完全一致,本稿没有区分)。"] },
-    { key: "home", group: "全局", title: "整体框架 · 首页", kind: "shell", active: "首页", ends: true, sub: "框架 A 经典三段 + 首页工作台",
-      src: "layouts/(侧栏、标签页、菜单搜索、通知、用户菜单、交易日);views/dashboard/index.vue 现状只有问候语",
-      points: ["框架 A:浅色侧栏 220px 通高(白底微透、深灰字、选中项淡蓝块,标志是晴空蓝渐变;深色皮肤下是近黑侧栏),收起后是 64px 图标栏,悬停弹出二级菜单。白色顶栏 52px:折叠按钮、面包屑|营业日与两个 A 股交易日、菜单搜索、全屏、通知、用户(界面设置收进用户菜单)。标签页栏 38px,卡片式页签,右键有刷新、关闭其它、关闭所有。内容区四周留 16px。", "首页改成工作台:今日订单按状态的数字(需要处理的高亮)、待人工处理的订单表、快捷入口(取自本端菜单)。问候语保留,天气那句是模板里写死的假内容,去掉。", "三端同一结构:发行端看订单,销售端看订单,TRS 看委托;数字是示例,上线要后端提供按状态汇总的接口。", "面包屑和标签页都显示页面名(这是框架 A 的特点);页面内不再放标题。"],
-      todo: ["「界面尺寸」切换已去掉(密度已锁定);「界面设置」收进用户菜单——请确认。", "首页的数字口径(今日=营业日当天?)和表格条数(本稿取前 6 条)。"] },
+      points: ["整页是视觉 F 的蓝白渐变底色,叠一层很淡的网格、几条主色曲线和右上角两个圆(内联 SVG,不用图片文件)。", "左侧一列(垂直居中,和卡片对齐):只有系统名 32px 和版本号。原来的「本系统业务模块」标签和「三端系统」三张入口卡片按 2026-10-08 的意见去掉,三端登录页之间不再互相链接。", "右侧 440px 浮卡,离右边 96px:小标志+系统名、「登录」标题、用户名/密码/验证码标签在上,输入框按代码现状 40px(登录页 size=large),其余页面仍是 32px;记住我、忘记密码;登录按钮通宽。", "宽屏:左列和浮卡成一组,组宽按 1440 基准(左 72、列 440、间距 392、卡 440、右 96),窗口更宽时整组居中,两块间距保持 392px 不变;底图和右上角按钮仍铺满整屏。窗口放不下左列(1100 以下)时只留卡片居中。(2026-10-08 定)", "右上角的主题按钮可以点:在浅色和最近看过的深色皮肤之间来回切(月亮/太阳);语言切换只保留入口;「注册」组件代码里存在但登录页没有入口,本稿不画。", "画面里可以点:忘记密码/返回登录、换一张验证码、显示密码、记住我。"],
+      todo: ["验证码图片是示意;登录页的控件要不要也统一成 32px。", "三端登录页只换系统名和标志,其余完全一样——是否需要三端不同的底色做区分(口径是三端完全一致,本稿没有区分)。"] },
+    { key: "home", group: "全局", title: "整体框架 · 首页", kind: "shell", active: "首页", ends: true, sub: "框架 A 经典三段 + 首页现状(问候卡);工作台版保留在变体里", variants: [["now", "现状首页"], ["work", "工作台(保留,待接口)"]],
+      src: "框架:分项选型框架 A。首页现状版:改版前的 views/dashboard/index.vue(头像、按时段的问候语 + 昵称、天气一句);工作台版:本稿 2026-10-08 首版的首页设计,整套保留",
+      points: ["框架 A:浅色侧栏 220px 通高(白底微透、深灰字、选中项淡蓝块,标志是晴空蓝渐变;深色皮肤下是近黑侧栏),收起后是 64px 图标栏,悬停弹出二级菜单。白色顶栏 52px:折叠按钮、面包屑|营业日与两个 A 股交易日、菜单搜索、全屏、通知、用户(界面设置收进用户菜单)。标签页栏 38px,卡片式页签,右键有刷新、关闭其它、关闭所有。内容区四周留 16px。", "首页按 2026-10-08 的现状内容重画(默认看到的就是这版):内容区只有一张问候卡——左边大头像(和个人中心同一个 88px 头像),右边问候语(按时段「上午好/下午好/晚上好」+ 昵称)和天气那句;卡片之下留空,不放数字、表格和入口。", "「工作台」版(今日订单按状态的数字、待人工处理的订单表、快捷入口)整套保留,在上方「工作台(保留,待接口)」里看;等首页汇总接口完善后再切回去。两版的侧栏、顶栏、标签页完全相同,只换内容区。", "三端同一结构:现状版三端只差系统名和菜单;工作台版发行端看订单,销售端看订单,TRS 看委托,数字是示例。", "面包屑和标签页都显示页面名(这是框架 A 的特点);页面内不再放标题。"],
+      todo: ["「界面尺寸」切换已去掉(密度已锁定);「界面设置」收进用户菜单——请确认。", "现状首页的天气那句是模板里写死的假内容,本稿按现状保留;要不要去掉,或换成营业日/交易日的一句提示——请确认。", "工作台版的数字口径(今日=营业日当天?)和表格条数(本稿取前 6 条),等接口完善、切回工作台时一并确认。"] },
     { key: "list", group: "全局", title: "列表页 · 搜索区 + 表格", kind: "shell", active: "home", ends: true, sub: "发行端订单管理、销售端订单管理、TRS 委托查询",
       src: "views/issue/order、views/sales/order、views/trs/order;SearchForm 组件(固定 3 列、超过 2 行折叠)",
       points: ["搜索区一张卡片:标签在左、3 列等宽,标签宽度按本页最长标签统一;条件超过两行时折叠,「展开」在按钮组末尾。查找是主按钮,重置、导出是次按钮。", "表格一张卡片:勾选列和操作列固定在左;表头 40px、行高 40px;数字右对齐;状态用字典标签;空值显示「--」。", "勾选后表格顶部出现浅蓝选择条,显示已选条数和「清空」。分页固定在卡片底部,左边是总数。", "点「详情」打开订单详情抽屉(抽屉 E);在抽屉里点「补录」会叠开补录弹窗(弹窗 J)。"],
@@ -1734,7 +1723,7 @@ window.SPEC_DATA2 = (function () {
       todo: [] },
   ];
 
-  return { dict, noteDetail, clearing, risk, home, profile, login, feedback, pages };
+  return { dict, noteDetail, clearing, risk, homeNow, home, profile, login, feedback, pages };
 })();
 
 </script>
@@ -2514,8 +2503,15 @@ window.UI = (function () {
   const U = window.UI;
   const { D, D2: P, T, esc, ic, CHECK, EMPTY, tag, ENDS, kv, tableHTML, btn, item, dgWrap, dgCard, sfDialog, stepper, closeX, btnCancel, drCard } = U;
 
-  /* ================= 首页(工作台) ================= */
-  U.pageRenderers.__home = function (st) {
+  /* ================= 首页 =================
+   * 现状版(默认):按 2026-10-08 的现状内容只画一张问候卡(头像、问候语、天气一句),卡片之下留空。
+   * 工作台版:本稿首版的首页设计整套保留(st.variant === "work",设计稿上方的变体按钮切),等首页汇总接口完善后切回去。
+   */
+  function homeNowHTML() {
+    const N = P.homeNow;
+    return `<div class="hm-now"><div class="card hm-hello"><span class="ava big">A</span><div class="hm-hello-t"><b>${esc(N.greeting)}</b><p>${esc(N.weather)}</p></div></div></div>`;
+  }
+  function homeWorkHTML(st) {
     const e = ENDS[st.end];
     const H = P.home[st.end];
     const total = H.status.reduce((n, s) => n + s[1], 0);
@@ -2537,7 +2533,8 @@ window.UI = (function () {
     };
     const tblCard = `<div class="card tb-card hm-tb"><div class="tb-bar"><span class="ttl">${H.manualTitle}</span><span class="t3" style="font-size:12px">${H.manualSub};按下单时间倒序,最多 6 条</span><span class="sp"></span><span class="btn txt" data-act="leaf" data-k="${H.listKey}">查看全部${ic("right")}</span></div>${tableHTML(cols, rows, { cell, keep: "hm-tbl", empty: "没有需要处理的" + H.noun })}</div>`;
     return `<div class="hm">${statusCard}${scCard}${tblCard}</div>`;
-  };
+  }
+  U.pageRenderers.__home = (st) => (st.variant === "work" ? homeWorkHTML(st) : homeNowHTML(st));
 
   /* ================= 页内标签页 ================= */
   // 页面级(ptabs)或卡片内(tabs)的页签条;选中项记在 st.tab[g]
@@ -2719,7 +2716,7 @@ window.UI = (function () {
   U.pageRenderers["401"] = (st) => errHTML("401", st);
 
   /* ================= 登录页:分项选型登录页 C「右侧浮卡·全幅底图」(2026-10-07 选定) =================
-   * 整页是视觉 F 的渐变底色叠一层淡线条装饰;左侧一列:系统名、本系统业务模块、三端入口;右侧 440px 浮卡放表单。
+   * 整页是视觉 F 的渐变底色叠一层淡线条装饰;左侧一列只有系统名和版本号(10-08 去掉了业务模块和三端入口);右侧 440px 浮卡放表单。
    * 画布规格 sp 上记临时状态:cap(验证码种子)、showPw、remember。
    */
   const CAPCH = "ABCDEFGHJKLMNPQRSTUVWXYZ23456789";
@@ -2742,11 +2739,8 @@ window.UI = (function () {
     const L = P.login;
     const c = L.copy;
     const v = sp.v || "login";
-    const groups = D.menus[end].map((g) => g[0]).filter((n) => !L.opsGroups.includes(n));
-    const mods = `<div class="lg-mods"><div class="lg-mods-t">本系统业务模块<span>${groups.length}</span></div><div class="lg-chips">${groups.map((n) => `<span class="lg-chip">${esc(n)}</span>`).join("")}</div></div>`;
-    // 三端入口:当前系统标「当前」,另外两个点一下跳到对应系统的登录页(本稿里是切到那个系统)
-    const ents = `<div class="lg-ents"><div class="lg-ents-t">三端系统<span>点击前往对应系统的登录页</span></div>${Object.entries(ENDS).map(([x, ex]) => `<div class="lg-ent ${x === end ? "on" : ""}" data-act="sys" data-end="${x}"${x === end ? "" : ` title="跳到${esc(ex.sys)}的登录地址"`}><span class="lg-logo sm">${ex.logo}</span><span class="lg-ent-n"><b>${esc(ex.sys)}</b><small>${L.nodes[x][1]}</small></span><span class="lg-ent-go">${x === end ? "当前系统" : `前往登录${ic("right")}`}</span></div>`).join("")}</div>`;
-    const left = `<div class="lg-c-left"><div><b class="lg-c-sys">${esc(e.sys)}</b><div class="lg-c-ver">${L.version}</div></div>${mods}${ents}</div>`;
+    // 左侧一列只放系统名和版本号(2026-10-08 去掉了「本系统业务模块」和「三端系统」入口)
+    const left = `<div class="lg-c-left"><div><b class="lg-c-sys">${esc(e.sys)}</b><div class="lg-c-ver">${L.version}</div></div></div>`;
     const field = (label, inner) => `<div class="lg-fi"><label>${label}</label>${inner}</div>`;
     const pw = sp.showPw ? "123456" : "••••••";
     let form;
@@ -2887,6 +2881,7 @@ window.UI = (function () {
       const st = U.newCanvasState(end, p.key === "err" ? v : p.active);
       st.ovls = [...(p.ovl || [])];
       if (p.key === "profile" && v === "pwd") st.ovls = ["pwd"];
+      if (p.key === "home") st.variant = v; // 首页:now 现状问候卡(默认)/work 工作台(保留,待接口)
       CS[key] = st;
     }
     return CS[key];
@@ -2914,15 +2909,6 @@ window.UI = (function () {
     writeHash(); renderAll();
     return false;
   };
-  // 登录页左侧三端入口:点了切到那个系统(相当于跳到对应系统的登录页),同步上方「看哪一端」
-  U.extraActions.sys = (host, sp, el) => {
-    if (el.dataset.end === curEnd(page())) return false;
-    S.end = el.dataset.end;
-    if (!$("#bkBar")) { sp.end = S.end; return true; } // 单独模式:没有外壳,直接改画布
-    writeHash(); renderBar(); renderStage();
-    if (!$("#bkFull").hidden) renderFull();
-    return false;
-  };
 
   /* ---------------- 规范摘要 ---------------- */
   function specHTML() {
@@ -2931,7 +2917,7 @@ window.UI = (function () {
       ["整体框架", "A", "经典三段", "浅色侧栏 220px 通高(白底微透、深灰字,深色皮肤下近黑);白色顶栏 52px 放折叠按钮、面包屑、营业日与两个 A 股交易日、菜单搜索、全屏、通知、用户;下面 38px 卡片式标签页;内容区四周留 16px。", "home"],
       ["弹窗", "J", "卡片分区", "长表单 920px:内容区灰底,每一组一张白卡片,标签在上、双列,卡片标题右侧显示已填/必填。短表单改按 10-08 给的下单弹窗布局:标签在左、单列,顶部高亮信息块,底部灰色结果块(补录 640px、修改密码 480px、TRS 下单 880px 加右侧行情栏)。", "dlg-fill"],
       ["抽屉", "E", "卡片+描述表", "宽 1040px;头部是编号、状态标签和一行关键信息;灰底上排卡片,键值用带边框的描述表(灰底标签格,一行 3 对);汇总做成数字卡片。", "drawer"],
-      ["登录页", "C", "右侧浮卡·全幅底图", "整页蓝白渐变底色叠淡线条装饰;表单卡片 440px 靠右浮着,输入框按代码现状 40px;左侧一列是系统名、本系统业务模块和三张三端入口卡片,点入口跳到对应系统的登录页。(10-07 追加的分项选型类别,选 C。)", "login"],
+      ["登录页", "C", "右侧浮卡·全幅底图", "整页蓝白渐变底色叠淡线条装饰;表单卡片 440px 靠右浮着,输入框按代码现状 40px;左侧只放系统名和版本号(10-08 去掉了本系统业务模块和三端入口)。(10-07 追加的分项选型类别,选 C。)", "login"],
       ["深色皮肤", "B", "石墨灰", "中性暗灰不偏蓝;扁平,卡片靠 1px 描边分区,没有渐变、光晕和投影;主按钮实心蓝;状态标签只描边不铺底。尺寸、圆角、字体、排布和浅色完全相同,只换令牌取值。(10-08 三版深色候选里选 B;A 夜空蓝、C 极光玻璃未选。)", "kit"],
     ];
     const dims = [
@@ -2941,15 +2927,15 @@ window.UI = (function () {
       ["侧栏与顶栏", "侧栏 220px 浅色(深色皮肤下近黑),收起后 64px;顶栏 52px;标签页栏 38px;内容区四周留 16px,卡片间距 12px"], ["页签", "框架标签页 28px 卡片式,当前页带主色圆点;页面级页签 40px 无底色;卡片内页签 48px 在卡片标题栏里;抽屉内页签 42px"],
       ["弹窗宽度", "短表单 640px、长表单 920px、确认框 420px、修改密码 480px、TRS 下单 880px"], ["抽屉宽度", "1040px(订单详情、票据详情)"],
       ["搜索区", "一张卡片,3 列等宽,标签在左、按本页最长标签统一宽度;超过 2 行折叠"], ["描述表", "标签格 116px 灰底,一行 3 对;标签长的分组一行 2 对(标签格 190px);单列 132px"],
-      ["不放的东西", "页面标题(面包屑和标签页已有页面名)、天气问候、界面尺寸切换"],
+      ["不放的东西", "页面标题(面包屑和标签页已有页面名)、界面尺寸切换;首页现状版按现状保留了天气那句(待确认),工作台版不放"],
     ];
     const swatches = T.palette.map(([g, items]) => `<div class="sp-grp"><h4>${g}</h4><div class="sp-sw">${items.map(([l, k]) => `<div class="sp-swc"><i style="background:${T.tokens[k]}"></i><b>${l}</b><span>${T.tokens[k]}</span></div>`).join("")}</div></div>`).join("");
     const map = [
-      ["基础视觉", "F 晴空渐变", ["kit"]], ["整体框架", "A 经典三段", ["home", "list"]], ["登录页", "C 右侧浮卡·全幅底图 + 左侧三端入口", ["login"]],
+      ["基础视觉", "F 晴空渐变", ["kit"]], ["整体框架", "A 经典三段", ["home", "list"]], ["登录页", "C 右侧浮卡·全幅底图;左侧只有系统名和版本号", ["login"]],
       ["搜索区", "3 列标签在左,可折叠;无标签时只放占位", ["list", "tabs"]], ["表格", "固定列、选择条、分页、空状态、加载态", ["list", "clearing", "drawer-note", "feedback"]],
       ["弹窗", "长表单 J 卡片分区;短表单标签在左+信息块+结果块(10-08 布局);TRS 下单同一布局加行情栏", ["dlg-fill", "dlg-investor", "dlg-trs", "profile"]], ["抽屉", "E 卡片+描述表", ["drawer", "drawer-note"]],
       ["详情展示", "带边框描述表 + 数字卡片", ["drawer", "drawer-note", "profile", "dlg-trs"]], ["页内标签页", "页面级/卡片内/抽屉内三种位置", ["tabs", "clearing", "drawer-note", "dlg-trs"]],
-      ["反馈类", "确认框、提示、通知、空状态、加载、结果、校验", ["confirm", "feedback"]], ["首页", "工作台:状态数字、待处理表、快捷入口", ["home"]], ["其他页", "个人中心、404 / 401", ["profile", "err"]],
+      ["反馈类", "确认框、提示、通知、空状态、加载、结果、校验", ["confirm", "feedback"]], ["首页", "现状:一张问候卡(头像、问候语、天气一句);工作台版(状态数字、待处理表、快捷入口)整套保留在变体里,等首页接口完善后切回", ["home"]], ["其他页", "个人中心、404 / 401", ["profile", "err"]],
     ];
     const go = (k) => `<a class="sp-go" href="#p/${k}">${esc(byKey[k].title)}</a>`;
     const themes = T.order.map((k) => T.all[k]);

+ 3 - 3
src/README.md

@@ -1,12 +1,12 @@
 # 源码说明
 
-`../CMS-UI完整设计.html` 由这里的文件生成,单文件、离线可用。基于 2026-10-08 第一批分项选型的评审结果(最终:基础视觉 F、框架 A、长表单弹窗 J、抽屉 E;短表单弹窗按发起人给的布局;登录页按 10-07 追加的分项选型登录页 C「右侧浮卡·全幅底图」,左侧有三端入口)。
+`../CMS-UI完整设计.html` 由这里的文件生成,单文件、离线可用。基于 2026-10-08 第一批分项选型的评审结果(最终:基础视觉 F、框架 A、长表单弹窗 J、抽屉 E;短表单弹窗按发起人给的布局;登录页按 10-07 追加的分项选型登录页 C「右侧浮卡·全幅底图」;10-08 去掉了左侧的本系统业务模块和三端入口,左侧只剩系统名和版本号)。
 
 | 文件 | 内容 |
 | --- | --- |
 | `tokens.js` | 两套皮肤的设计令牌:浅色 F 晴空渐变(默认)+ 深色 B 石墨灰(2026-10-08 从三版候选里选定;未选的 A、C 在 `归档/tokens-深色候选AC.js`,不参与构建)。运行时每套生成为 `.cv[data-v=皮肤]` 上的 CSS 变量;`window.TOKENS` 是当前皮肤,`TOKENS.use(key)` 原地切换;`palette`/`strip` 给规范摘要的色板用。换肤只改颜色与质感,尺寸、圆角、字体不变 |
 | `data.js` | 三端菜单、字典、列表、订单详情、补录、新建投资者、TRS 下单(沿用分项选型,从代码提取) |
-| `data2.js` | 本稿补充:票据详情、清算、风险监控、首页、个人中心、登录、反馈类文案;`pages` 是设计稿目录(来源、设计要点、待确认) |
+| `data2.js` | 本稿补充:票据详情、清算、风险监控、首页(现状问候卡文案 `homeNow`;工作台版数据 `home` 整套保留,2026-10-08 起等首页接口完善后再切回)、个人中心、登录、反馈类文案;`pages` 是设计稿目录(来源、设计要点、待确认) |
 | `kit.css` | 画布内组件样式(按钮、输入、标签、表格、卡片、提示、弹窗外观),全部读令牌 |
 | `frame.css` | 框架 A 的布局与收起态(取自分项选型 frames.css 的通用部分 + A) |
 | `overlay.css` | 弹窗骨架、表单项、弹窗 J 的卡片分区、抽屉骨架、描述表、数字卡片、抽屉 E |
@@ -24,6 +24,6 @@
 - `node shot.mjs [前缀]`:按原尺寸截图到 `../shots/`(可用 `SHOT_DIR`、`SHOT_DPR` 改)。
 - `python3 pack.py`:构建 → 测试 → 打包到 `../发给同事/`,测试不通过不出包。
 
-页面地址:`#p/<页面>[/<端>][/<变体>][/t=<皮肤>]`,例如 `#p/login/trs/reset`、`#p/err/issue/401`、`#p/home/issue/t=db`;皮肤 `f`/`db`,不带时沿用当前皮肤。单独模式 `#solo/<页面>[/<端>][/<变体>][/t=<皮肤>]` 只渲染一张原尺寸画布。截图:`SHOT_THEME=db node shot.mjs` 按指定皮肤截,文件名带皮肤前缀。
+页面地址:`#p/<页面>[/<端>][/<变体>][/t=<皮肤>]`,例如 `#p/login/trs/reset`、`#p/err/issue/401`、`#p/home/issue/work`(首页保留的工作台版)、`#p/home/issue/t=db`;皮肤 `f`/`db`,不带时沿用当前皮肤。单独模式 `#solo/<页面>[/<端>][/<变体>][/t=<皮肤>]` 只渲染一张原尺寸画布。截图:`SHOT_THEME=db node shot.mjs` 按指定皮肤截,文件名带皮肤前缀。
 
 `node_modules` 是指向本机已有 playwright 的软链接,只供测试和截图使用。

+ 5 - 13
src/book.js

@@ -21,6 +21,7 @@
       const st = U.newCanvasState(end, p.key === "err" ? v : p.active);
       st.ovls = [...(p.ovl || [])];
       if (p.key === "profile" && v === "pwd") st.ovls = ["pwd"];
+      if (p.key === "home") st.variant = v; // 首页:now 现状问候卡(默认)/work 工作台(保留,待接口)
       CS[key] = st;
     }
     return CS[key];
@@ -48,15 +49,6 @@
     writeHash(); renderAll();
     return false;
   };
-  // 登录页左侧三端入口:点了切到那个系统(相当于跳到对应系统的登录页),同步上方「看哪一端」
-  U.extraActions.sys = (host, sp, el) => {
-    if (el.dataset.end === curEnd(page())) return false;
-    S.end = el.dataset.end;
-    if (!$("#bkBar")) { sp.end = S.end; return true; } // 单独模式:没有外壳,直接改画布
-    writeHash(); renderBar(); renderStage();
-    if (!$("#bkFull").hidden) renderFull();
-    return false;
-  };
 
   /* ---------------- 规范摘要 ---------------- */
   function specHTML() {
@@ -65,7 +57,7 @@
       ["整体框架", "A", "经典三段", "浅色侧栏 220px 通高(白底微透、深灰字,深色皮肤下近黑);白色顶栏 52px 放折叠按钮、面包屑、营业日与两个 A 股交易日、菜单搜索、全屏、通知、用户;下面 38px 卡片式标签页;内容区四周留 16px。", "home"],
       ["弹窗", "J", "卡片分区", "长表单 920px:内容区灰底,每一组一张白卡片,标签在上、双列,卡片标题右侧显示已填/必填。短表单改按 10-08 给的下单弹窗布局:标签在左、单列,顶部高亮信息块,底部灰色结果块(补录 640px、修改密码 480px、TRS 下单 880px 加右侧行情栏)。", "dlg-fill"],
       ["抽屉", "E", "卡片+描述表", "宽 1040px;头部是编号、状态标签和一行关键信息;灰底上排卡片,键值用带边框的描述表(灰底标签格,一行 3 对);汇总做成数字卡片。", "drawer"],
-      ["登录页", "C", "右侧浮卡·全幅底图", "整页蓝白渐变底色叠淡线条装饰;表单卡片 440px 靠右浮着,输入框按代码现状 40px;左侧一列是系统名、本系统业务模块和三张三端入口卡片,点入口跳到对应系统的登录页。(10-07 追加的分项选型类别,选 C。)", "login"],
+      ["登录页", "C", "右侧浮卡·全幅底图", "整页蓝白渐变底色叠淡线条装饰;表单卡片 440px 靠右浮着,输入框按代码现状 40px;左侧只放系统名和版本号(10-08 去掉了本系统业务模块和三端入口)。(10-07 追加的分项选型类别,选 C。)", "login"],
       ["深色皮肤", "B", "石墨灰", "中性暗灰不偏蓝;扁平,卡片靠 1px 描边分区,没有渐变、光晕和投影;主按钮实心蓝;状态标签只描边不铺底。尺寸、圆角、字体、排布和浅色完全相同,只换令牌取值。(10-08 三版深色候选里选 B;A 夜空蓝、C 极光玻璃未选。)", "kit"],
     ];
     const dims = [
@@ -75,15 +67,15 @@
       ["侧栏与顶栏", "侧栏 220px 浅色(深色皮肤下近黑),收起后 64px;顶栏 52px;标签页栏 38px;内容区四周留 16px,卡片间距 12px"], ["页签", "框架标签页 28px 卡片式,当前页带主色圆点;页面级页签 40px 无底色;卡片内页签 48px 在卡片标题栏里;抽屉内页签 42px"],
       ["弹窗宽度", "短表单 640px、长表单 920px、确认框 420px、修改密码 480px、TRS 下单 880px"], ["抽屉宽度", "1040px(订单详情、票据详情)"],
       ["搜索区", "一张卡片,3 列等宽,标签在左、按本页最长标签统一宽度;超过 2 行折叠"], ["描述表", "标签格 116px 灰底,一行 3 对;标签长的分组一行 2 对(标签格 190px);单列 132px"],
-      ["不放的东西", "页面标题(面包屑和标签页已有页面名)、天气问候、界面尺寸切换"],
+      ["不放的东西", "页面标题(面包屑和标签页已有页面名)、界面尺寸切换;首页现状版按现状保留了天气那句(待确认),工作台版不放"],
     ];
     const swatches = T.palette.map(([g, items]) => `<div class="sp-grp"><h4>${g}</h4><div class="sp-sw">${items.map(([l, k]) => `<div class="sp-swc"><i style="background:${T.tokens[k]}"></i><b>${l}</b><span>${T.tokens[k]}</span></div>`).join("")}</div></div>`).join("");
     const map = [
-      ["基础视觉", "F 晴空渐变", ["kit"]], ["整体框架", "A 经典三段", ["home", "list"]], ["登录页", "C 右侧浮卡·全幅底图 + 左侧三端入口", ["login"]],
+      ["基础视觉", "F 晴空渐变", ["kit"]], ["整体框架", "A 经典三段", ["home", "list"]], ["登录页", "C 右侧浮卡·全幅底图;左侧只有系统名和版本号", ["login"]],
       ["搜索区", "3 列标签在左,可折叠;无标签时只放占位", ["list", "tabs"]], ["表格", "固定列、选择条、分页、空状态、加载态", ["list", "clearing", "drawer-note", "feedback"]],
       ["弹窗", "长表单 J 卡片分区;短表单标签在左+信息块+结果块(10-08 布局);TRS 下单同一布局加行情栏", ["dlg-fill", "dlg-investor", "dlg-trs", "profile"]], ["抽屉", "E 卡片+描述表", ["drawer", "drawer-note"]],
       ["详情展示", "带边框描述表 + 数字卡片", ["drawer", "drawer-note", "profile", "dlg-trs"]], ["页内标签页", "页面级/卡片内/抽屉内三种位置", ["tabs", "clearing", "drawer-note", "dlg-trs"]],
-      ["反馈类", "确认框、提示、通知、空状态、加载、结果、校验", ["confirm", "feedback"]], ["首页", "工作台:状态数字、待处理表、快捷入口", ["home"]], ["其他页", "个人中心、404 / 401", ["profile", "err"]],
+      ["反馈类", "确认框、提示、通知、空状态、加载、结果、校验", ["confirm", "feedback"]], ["首页", "现状:一张问候卡(头像、问候语、天气一句);工作台版(状态数字、待处理表、快捷入口)整套保留在变体里,等首页接口完善后切回", ["home"]], ["其他页", "个人中心、404 / 401", ["profile", "err"]],
     ];
     const go = (k) => `<a class="sp-go" href="#p/${k}">${esc(byKey[k].title)}</a>`;
     const themes = T.order.map((k) => T.all[k]);

+ 13 - 14
src/data2.js

@@ -153,7 +153,10 @@ window.SPEC_DATA2 = (function () {
     ],
   };
 
-  /* ---------- 首页(工作台):数字为示例,上线需要后端提供按状态汇总的接口。字段全部来自各端列表页 ---------- */
+  /* ---------- 首页 ----------
+   * 现状版(默认):只有一张问候卡,文案取自改版前的 views/dashboard/index.vue(问候语按时段 + 昵称;天气那句是模板写死的)。
+   * 工作台版 home:2026-10-08 本稿首版的首页设计,整套保留(变体 work),等首页汇总接口完善后再切回去;数字为示例,字段全部来自各端列表页 */
+  const homeNow = { greeting: "下午好,系统管理员!", weather: "今日天气晴朗,气温在15℃至25℃之间,东南风。" };
   const home = {
     issue: {
       noun: "订单", dictKey: "note_order_status", listKey: "共赢票据管理/订单管理",
@@ -188,14 +191,10 @@ window.SPEC_DATA2 = (function () {
     pwdForm: [{ label: "原密码", type: "password", req: true, ph: "请输入原密码" }, { label: "新密码", type: "password", req: true, ph: "6~20 位,至少两类字符" }, { label: "确认密码", type: "password", req: true, ph: "请再次输入新密码" }],
   };
 
-  /* ---------- 登录页(views/login):文案取自 lang/package/zh-cn.json;三端入口的一句话职责取自各端菜单 ---------- */
+  /* ---------- 登录页(views/login):文案取自 lang/package/zh-cn.json ---------- */
   const login = {
     copy: { username: "用户名", password: "密码", captcha: "验证码", remember: "记住我", forget: "忘记密码?", login: "登 录", reset: "重置密码", email: "邮箱", enterEmail: "请输入您的邮箱地址", sendReset: "发送重置链接", think: "想起密码?", back: "返回登录", theme: "主题切换", lang: "语言切换" },
     version: "v3.4.2",
-    // 三端入口卡片上的系统名和一句话职责
-    nodes: { sales: ["销售管理系统", "投资者 · 订单 · 资金"], issue: ["发行管理系统", "票据 · 对冲 · 清算"], trs: ["TRS管理系统", "通道 · 委托 · 风控"] },
-    // 登录页上列出的本系统业务模块:取各端菜单的业务分组(运维与配置类不列)
-    opsGroups: ["系统设置", "机构系统设置", "常驻工作进程", "计划任务中心", "通知和告警管理"],
   };
 
   /* ---------- 反馈类:文案尽量取自真实代码(command-result.ts、各页 ElMessageBox / el-empty / el-alert) ---------- */
@@ -233,14 +232,14 @@ window.SPEC_DATA2 = (function () {
     { key: "spec", group: "总览", title: "规范摘要", kind: "spec", sub: "选型结果、尺寸、颜色、12 类对应关系、待确认清单" },
     { key: "kit", group: "总览", title: "组件总览", kind: "kit", sub: "两套皮肤(浅色 F、深色 B 石墨灰)下的全部基础组件,顶栏「皮肤」切换",
       src: "分项选型 · 基础视觉 F(晴空蓝 #3C8CFF、文字链接 #1668DC)", points: ["颜色、文字、按钮、输入控件、状态标签、表格、提示、键值、弹窗外观,全部读同一份令牌;换肤只换令牌取值,尺寸、圆角、字体、排布不变。", "深色皮肤 B 石墨灰(10-08 从三版候选里选定):中性灰、扁平、1px 描边、无渐变无投影,主按钮实心蓝,状态标签只描边。对照见「规范摘要 → 换肤」。", "主按钮是左上浅、右下深的渐变,下面有一层淡蓝投影;页面底色是蓝白渐变,右上角一团浅蓝光晕;卡片白底、14px 圆角、淡蓝投影。", "表头很淡的蓝底,行高 40px;状态是无描边的浅色圆角标签;中性色带蓝调;数字用 Inter。"], todo: ["深色默认跟随系统还是手动切换;切换后的选择记在账号还是本机。"] },
-    { key: "login", group: "全局", title: "登录页", kind: "login", sub: "分项选型登录页 C:右侧浮卡·全幅底图 + 左侧三端入口", variants: [["login", "登录"], ["reset", "重置密码"]], ends: true,
+    { key: "login", group: "全局", title: "登录页", kind: "login", sub: "分项选型登录页 C:右侧浮卡·全幅底图;左侧只有系统名和版本号", variants: [["login", "登录"], ["reset", "重置密码"]], ends: true,
       src: "分项选型 · 登录页 C(2026-10-07 选定);views/login/index.vue、components/Login.vue、ResetPwd.vue;文案取自 lang/package/zh-cn.json",
-      points: ["整页是视觉 F 的蓝白渐变底色,叠一层很淡的网格、几条主色曲线和右上角两个圆(内联 SVG,不用图片文件)。", "左侧一列(垂直居中,和卡片对齐):系统名 32px 和版本号、本系统业务模块(取自本系统菜单的业务分组,不列运维配置类)、「三端系统」三张入口卡片——当前系统标「当前」,另外两个点一下跳到对应系统的登录页。", "右侧 440px 浮卡,离右边 96px:小标志+系统名、「登录」标题、用户名/密码/验证码标签在上,输入框按代码现状 40px(登录页 size=large),其余页面仍是 32px;记住我、忘记密码;登录按钮通宽。", "宽屏:左列和浮卡成一组,组宽按 1440 基准(左 72、列 440、间距 392、卡 440、右 96),窗口更宽时整组居中,两块间距保持 392px 不变;底图和右上角按钮仍铺满整屏。窗口放不下左列(1100 以下)时只留卡片居中。(2026-10-08 定)", "右上角的主题按钮可以点:在浅色和最近看过的深色皮肤之间来回切(月亮/太阳);语言切换只保留入口;「注册」组件代码里存在但登录页没有入口,本稿不画。", "画面里可以点:三端入口(切到那个系统)、忘记密码/返回登录、换一张验证码、显示密码、记住我。"],
-      todo: ["验证码图片是示意;登录页的控件要不要也统一成 32px。", "三端入口是跳到各系统各自的登录地址,三个地址要放在前端配置里维护;跳转时要不要带上当前输入的用户名。", "三端登录页只换系统名、标志、模块清单和入口里的高亮,其余完全一样——是否需要三端不同的底色做区分(口径是三端完全一致,本稿没有区分)。"] },
-    { key: "home", group: "全局", title: "整体框架 · 首页", kind: "shell", active: "首页", ends: true, sub: "框架 A 经典三段 + 首页工作台",
-      src: "layouts/(侧栏、标签页、菜单搜索、通知、用户菜单、交易日);views/dashboard/index.vue 现状只有问候语",
-      points: ["框架 A:浅色侧栏 220px 通高(白底微透、深灰字、选中项淡蓝块,标志是晴空蓝渐变;深色皮肤下是近黑侧栏),收起后是 64px 图标栏,悬停弹出二级菜单。白色顶栏 52px:折叠按钮、面包屑|营业日与两个 A 股交易日、菜单搜索、全屏、通知、用户(界面设置收进用户菜单)。标签页栏 38px,卡片式页签,右键有刷新、关闭其它、关闭所有。内容区四周留 16px。", "首页改成工作台:今日订单按状态的数字(需要处理的高亮)、待人工处理的订单表、快捷入口(取自本端菜单)。问候语保留,天气那句是模板里写死的假内容,去掉。", "三端同一结构:发行端看订单,销售端看订单,TRS 看委托;数字是示例,上线要后端提供按状态汇总的接口。", "面包屑和标签页都显示页面名(这是框架 A 的特点);页面内不再放标题。"],
-      todo: ["「界面尺寸」切换已去掉(密度已锁定);「界面设置」收进用户菜单——请确认。", "首页的数字口径(今日=营业日当天?)和表格条数(本稿取前 6 条)。"] },
+      points: ["整页是视觉 F 的蓝白渐变底色,叠一层很淡的网格、几条主色曲线和右上角两个圆(内联 SVG,不用图片文件)。", "左侧一列(垂直居中,和卡片对齐):只有系统名 32px 和版本号。原来的「本系统业务模块」标签和「三端系统」三张入口卡片按 2026-10-08 的意见去掉,三端登录页之间不再互相链接。", "右侧 440px 浮卡,离右边 96px:小标志+系统名、「登录」标题、用户名/密码/验证码标签在上,输入框按代码现状 40px(登录页 size=large),其余页面仍是 32px;记住我、忘记密码;登录按钮通宽。", "宽屏:左列和浮卡成一组,组宽按 1440 基准(左 72、列 440、间距 392、卡 440、右 96),窗口更宽时整组居中,两块间距保持 392px 不变;底图和右上角按钮仍铺满整屏。窗口放不下左列(1100 以下)时只留卡片居中。(2026-10-08 定)", "右上角的主题按钮可以点:在浅色和最近看过的深色皮肤之间来回切(月亮/太阳);语言切换只保留入口;「注册」组件代码里存在但登录页没有入口,本稿不画。", "画面里可以点:忘记密码/返回登录、换一张验证码、显示密码、记住我。"],
+      todo: ["验证码图片是示意;登录页的控件要不要也统一成 32px。", "三端登录页只换系统名和标志,其余完全一样——是否需要三端不同的底色做区分(口径是三端完全一致,本稿没有区分)。"] },
+    { key: "home", group: "全局", title: "整体框架 · 首页", kind: "shell", active: "首页", ends: true, sub: "框架 A 经典三段 + 首页现状(问候卡);工作台版保留在变体里", variants: [["now", "现状首页"], ["work", "工作台(保留,待接口)"]],
+      src: "框架:分项选型框架 A。首页现状版:改版前的 views/dashboard/index.vue(头像、按时段的问候语 + 昵称、天气一句);工作台版:本稿 2026-10-08 首版的首页设计,整套保留",
+      points: ["框架 A:浅色侧栏 220px 通高(白底微透、深灰字、选中项淡蓝块,标志是晴空蓝渐变;深色皮肤下是近黑侧栏),收起后是 64px 图标栏,悬停弹出二级菜单。白色顶栏 52px:折叠按钮、面包屑|营业日与两个 A 股交易日、菜单搜索、全屏、通知、用户(界面设置收进用户菜单)。标签页栏 38px,卡片式页签,右键有刷新、关闭其它、关闭所有。内容区四周留 16px。", "首页按 2026-10-08 的现状内容重画(默认看到的就是这版):内容区只有一张问候卡——左边大头像(和个人中心同一个 88px 头像),右边问候语(按时段「上午好/下午好/晚上好」+ 昵称)和天气那句;卡片之下留空,不放数字、表格和入口。", "「工作台」版(今日订单按状态的数字、待人工处理的订单表、快捷入口)整套保留,在上方「工作台(保留,待接口)」里看;等首页汇总接口完善后再切回去。两版的侧栏、顶栏、标签页完全相同,只换内容区。", "三端同一结构:现状版三端只差系统名和菜单;工作台版发行端看订单,销售端看订单,TRS 看委托,数字是示例。", "面包屑和标签页都显示页面名(这是框架 A 的特点);页面内不再放标题。"],
+      todo: ["「界面尺寸」切换已去掉(密度已锁定);「界面设置」收进用户菜单——请确认。", "现状首页的天气那句是模板里写死的假内容,本稿按现状保留;要不要去掉,或换成营业日/交易日的一句提示——请确认。", "工作台版的数字口径(今日=营业日当天?)和表格条数(本稿取前 6 条),等接口完善、切回工作台时一并确认。"] },
     { key: "list", group: "全局", title: "列表页 · 搜索区 + 表格", kind: "shell", active: "home", ends: true, sub: "发行端订单管理、销售端订单管理、TRS 委托查询",
       src: "views/issue/order、views/sales/order、views/trs/order;SearchForm 组件(固定 3 列、超过 2 行折叠)",
       points: ["搜索区一张卡片:标签在左、3 列等宽,标签宽度按本页最长标签统一;条件超过两行时折叠,「展开」在按钮组末尾。查找是主按钮,重置、导出是次按钮。", "表格一张卡片:勾选列和操作列固定在左;表头 40px、行高 40px;数字右对齐;状态用字典标签;空值显示「--」。", "勾选后表格顶部出现浅蓝选择条,显示已选条数和「清空」。分页固定在卡片底部,左边是总数。", "点「详情」打开订单详情抽屉(抽屉 E);在抽屉里点「补录」会叠开补录弹窗(弹窗 J)。"],
@@ -291,5 +290,5 @@ window.SPEC_DATA2 = (function () {
       todo: [] },
   ];
 
-  return { dict, noteDetail, clearing, risk, home, profile, login, feedback, pages };
+  return { dict, noteDetail, clearing, risk, homeNow, home, profile, login, feedback, pages };
 })();

+ 8 - 18
src/pages.css

@@ -25,7 +25,14 @@
 .cv .tab .cnt { margin-left: 6px; font-size: 12px; color: var(--t3); font-family: var(--font-num); }
 .cv .tab.on .cnt { color: var(--c-link); }
 
-/* ---------- 首页工作台 ---------- */
+/* ---------- 首页现状版(2026-10-08 按现状内容重画,默认):只有一张问候卡;工作台版的样式在下一段,整套保留 ---------- */
+.hm-now { display: flex; flex-direction: column; gap: 12px; }
+.hm-hello { display: flex; align-items: center; gap: 20px; padding: 24px 28px; }
+.hm-hello-t { min-width: 0; }
+.hm-hello-t b { display: block; font-size: 20px; line-height: 28px; font-weight: 600; color: var(--t1); }
+.hm-hello-t p { margin: 6px 0 0; font-size: 14px; line-height: 22px; color: var(--t2); }
+
+/* ---------- 首页工作台(保留,变体 work) ---------- */
 .hm { display: grid; grid-template-columns: minmax(0, 1fr) 352px; grid-template-rows: auto minmax(0, 1fr); gap: 12px; height: 100%; min-height: 0; }
 .hm .card-hd .sub b { color: var(--t1); font-weight: 600; }
 .hm .card-hd .sub b.hot { color: var(--c-link); }
@@ -194,23 +201,6 @@
 .lg-c-left { position: absolute; left: 72px; top: 0; bottom: 0; width: 440px; display: flex; flex-direction: column; justify-content: center; gap: 32px; }
 .lg-c-sys { display: block; font-size: 32px; line-height: 40px; font-weight: 600; color: var(--t1); letter-spacing: .02em; }
 .lg-c-ver { margin-top: 4px; font-size: 12px; color: var(--t3); font-family: var(--font-num); }
-.lg-mods-t { display: flex; align-items: center; gap: 8px; margin-bottom: 8px; font-size: 12px; color: var(--t3); }
-.lg-mods-t span { font-family: var(--font-num); }
-.lg-chips { display: flex; flex-wrap: wrap; gap: 6px; }
-.lg-chip { display: inline-flex; align-items: center; height: 24px; padding: 0 10px; border: 1px solid var(--prim-bd); border-radius: var(--r-tag); background: var(--prim-bg); color: var(--prim-t); font-size: 12px; white-space: nowrap; }
-.lg-ents { display: flex; flex-direction: column; gap: 8px; }
-.lg-ents-t { display: flex; align-items: center; gap: 8px; margin-bottom: 2px; font-size: 12px; color: var(--t3); }
-.lg-ents-t span { color: var(--t4); }
-.lg-ent { display: flex; align-items: center; gap: 12px; height: 60px; padding: 0 14px; border-radius: var(--r-card); background: var(--bg-card); border: var(--card-bd); box-shadow: var(--card-sh); color: var(--t1); cursor: pointer; transition: box-shadow .15s, transform .15s; }
-.lg-ent:hover { box-shadow: var(--sh-pop); transform: translateX(2px); }
-.lg-ent.on { cursor: default; outline: 1.5px solid var(--c-primary); outline-offset: -1.5px; }
-.lg-ent.on:hover { box-shadow: var(--card-sh); transform: none; }
-.lg-ent-n { display: flex; flex-direction: column; min-width: 0; line-height: 18px; }
-.lg-ent-n b { font-size: 14px; font-weight: 600; white-space: nowrap; }
-.lg-ent-n small { font-size: 12px; color: var(--t3); white-space: nowrap; }
-.lg-ent-go { margin-left: auto; display: inline-flex; align-items: center; gap: 2px; font-size: 13px; color: var(--c-link); white-space: nowrap; }
-.lg-ent-go .ic { width: 14px; height: 14px; }
-.lg-ent.on .lg-ent-go { color: var(--t3); }
 /* 右侧浮卡 */
 .lg-card { position: relative; width: 440px; padding: 36px 40px 32px; background: var(--bg-dlg); border-radius: var(--r-dlg); box-shadow: var(--sh-dlg); color: var(--t1); }
 .lg-card .lg-brand { margin-bottom: 24px; }

+ 14 - 9
src/pages.js

@@ -6,8 +6,15 @@
   const U = window.UI;
   const { D, D2: P, T, esc, ic, CHECK, EMPTY, tag, ENDS, kv, tableHTML, btn, item, dgWrap, dgCard, sfDialog, stepper, closeX, btnCancel, drCard } = U;
 
-  /* ================= 首页(工作台) ================= */
-  U.pageRenderers.__home = function (st) {
+  /* ================= 首页 =================
+   * 现状版(默认):按 2026-10-08 的现状内容只画一张问候卡(头像、问候语、天气一句),卡片之下留空。
+   * 工作台版:本稿首版的首页设计整套保留(st.variant === "work",设计稿上方的变体按钮切),等首页汇总接口完善后切回去。
+   */
+  function homeNowHTML() {
+    const N = P.homeNow;
+    return `<div class="hm-now"><div class="card hm-hello"><span class="ava big">A</span><div class="hm-hello-t"><b>${esc(N.greeting)}</b><p>${esc(N.weather)}</p></div></div></div>`;
+  }
+  function homeWorkHTML(st) {
     const e = ENDS[st.end];
     const H = P.home[st.end];
     const total = H.status.reduce((n, s) => n + s[1], 0);
@@ -29,7 +36,8 @@
     };
     const tblCard = `<div class="card tb-card hm-tb"><div class="tb-bar"><span class="ttl">${H.manualTitle}</span><span class="t3" style="font-size:12px">${H.manualSub};按下单时间倒序,最多 6 条</span><span class="sp"></span><span class="btn txt" data-act="leaf" data-k="${H.listKey}">查看全部${ic("right")}</span></div>${tableHTML(cols, rows, { cell, keep: "hm-tbl", empty: "没有需要处理的" + H.noun })}</div>`;
     return `<div class="hm">${statusCard}${scCard}${tblCard}</div>`;
-  };
+  }
+  U.pageRenderers.__home = (st) => (st.variant === "work" ? homeWorkHTML(st) : homeNowHTML(st));
 
   /* ================= 页内标签页 ================= */
   // 页面级(ptabs)或卡片内(tabs)的页签条;选中项记在 st.tab[g]
@@ -211,7 +219,7 @@
   U.pageRenderers["401"] = (st) => errHTML("401", st);
 
   /* ================= 登录页:分项选型登录页 C「右侧浮卡·全幅底图」(2026-10-07 选定) =================
-   * 整页是视觉 F 的渐变底色叠一层淡线条装饰;左侧一列:系统名、本系统业务模块、三端入口;右侧 440px 浮卡放表单。
+   * 整页是视觉 F 的渐变底色叠一层淡线条装饰;左侧一列只有系统名和版本号(10-08 去掉了业务模块和三端入口);右侧 440px 浮卡放表单。
    * 画布规格 sp 上记临时状态:cap(验证码种子)、showPw、remember。
    */
   const CAPCH = "ABCDEFGHJKLMNPQRSTUVWXYZ23456789";
@@ -234,11 +242,8 @@
     const L = P.login;
     const c = L.copy;
     const v = sp.v || "login";
-    const groups = D.menus[end].map((g) => g[0]).filter((n) => !L.opsGroups.includes(n));
-    const mods = `<div class="lg-mods"><div class="lg-mods-t">本系统业务模块<span>${groups.length}</span></div><div class="lg-chips">${groups.map((n) => `<span class="lg-chip">${esc(n)}</span>`).join("")}</div></div>`;
-    // 三端入口:当前系统标「当前」,另外两个点一下跳到对应系统的登录页(本稿里是切到那个系统)
-    const ents = `<div class="lg-ents"><div class="lg-ents-t">三端系统<span>点击前往对应系统的登录页</span></div>${Object.entries(ENDS).map(([x, ex]) => `<div class="lg-ent ${x === end ? "on" : ""}" data-act="sys" data-end="${x}"${x === end ? "" : ` title="跳到${esc(ex.sys)}的登录地址"`}><span class="lg-logo sm">${ex.logo}</span><span class="lg-ent-n"><b>${esc(ex.sys)}</b><small>${L.nodes[x][1]}</small></span><span class="lg-ent-go">${x === end ? "当前系统" : `前往登录${ic("right")}`}</span></div>`).join("")}</div>`;
-    const left = `<div class="lg-c-left"><div><b class="lg-c-sys">${esc(e.sys)}</b><div class="lg-c-ver">${L.version}</div></div>${mods}${ents}</div>`;
+    // 左侧一列只放系统名和版本号(2026-10-08 去掉了「本系统业务模块」和「三端系统」入口)
+    const left = `<div class="lg-c-left"><div><b class="lg-c-sys">${esc(e.sys)}</b><div class="lg-c-ver">${L.version}</div></div></div>`;
     const field = (label, inner) => `<div class="lg-fi"><label>${label}</label>${inner}</div>`;
     const pw = sp.showPw ? "123456" : "••••••";
     let form;

+ 1 - 0
src/shot.mjs

@@ -16,6 +16,7 @@ const jobs = [
   ["kit", "#solo/kit", true], ["feedback", "#solo/feedback", true],
   ["login-issue", "#solo/login/issue"], ["login-sales", "#solo/login/sales"], ["login-trs", "#solo/login/trs"], ["login-reset", "#solo/login/issue/reset"],
   ["home-issue", "#solo/home/issue"], ["home-sales", "#solo/home/sales"], ["home-trs", "#solo/home/trs"],
+  ["home-work-issue", "#solo/home/issue/work"], ["home-work-sales", "#solo/home/sales/work"], ["home-work-trs", "#solo/home/trs/work"],
   ["list-issue", "#solo/list/issue"], ["list-sales", "#solo/list/sales"], ["list-trs", "#solo/list/trs"],
   ["drawer", "#solo/drawer"], ["dlg-fill", "#solo/dlg-fill"], ["dlg-investor", "#solo/dlg-investor"], ["dlg-trs", "#solo/dlg-trs"], ["dlg-trs-sell", "#solo/dlg-trs/trs/sell"], ["drawer-note", "#solo/drawer-note"],
   ["tabs", "#solo/tabs"], ["clearing", "#solo/clearing"], ["profile", "#solo/profile"], ["profile-pwd", "#solo/profile/issue/pwd"],

+ 19 - 11
src/test.mjs

@@ -31,11 +31,15 @@ section("外壳:目录、路由、端切换、变体、全屏");
 ok((await S()).page === "spec" && (await visible("#bkSpec")), "默认打开规范摘要");
 ok((await count(".bk-item")) === 16, "目录 16 个页面");
 await goPage("home");
-ok((await S()).page === "home" && (await page.evaluate(() => location.hash)) === "#p/home/issue", "点目录到首页,hash 带端");
+ok((await S()).page === "home" && (await page.evaluate(() => location.hash)) === "#p/home/issue/now", "点目录到首页,hash 带端和变体(默认现状版)");
 ok((await visible(`${cv}.shell`)) && (await visible(`${cv} .nb .crumb`)) && (await visible(`${cv} .nb .td`)), "首页是外壳画布:顶栏有面包屑和交易日");
 await page.click('.bk-seg[data-seg="end"] button[data-v="trs"]');
 ok((await text(`${cv} .brand .nm`)).includes("TRS"), "切到 TRS 端后系统名变化");
-ok((await text(`${cv} .hm-st .card-hd`)).includes("委托"), "TRS 首页看的是委托");
+ok((await visible(`${cv} .hm-hello`)) && (await text(`${cv} .hm-hello-t`)).includes("下午好") && !(await has(`${cv} .hm-st`)), "首页默认是现状版:只有问候卡,没有工作台");
+await page.click('.bk-seg[data-seg="variant"] button[data-v="work"]');
+ok((await has(`${cv} .hm-st`)) && (await text(`${cv} .hm-st .card-hd`)).includes("委托") && (await page.evaluate(() => location.hash)) === "#p/home/trs/work", "切到工作台版:TRS 首页看的是委托,地址带 /work");
+await page.click('.bk-seg[data-seg="variant"] button[data-v="now"]');
+ok((await visible(`${cv} .hm-hello`)) && !(await has(`${cv} .hm-st`)), "切回现状版");
 await page.click('.bk-seg[data-seg="end"] button[data-v="issue"]');
 await page.keyboard.press("ArrowRight");
 ok((await S()).page === "list", "按 → 到下一页(列表页)");
@@ -53,8 +57,8 @@ ok((await S()).page === "login", "规范摘要里的链接跳到登录页");
 
 /* ---------- 登录页 ---------- */
 section("登录页:C 右侧浮卡·全幅底图,变体与画面里的交互");
-ok((await visible(`${cv}.login .lg-card`)) && (await visible(`${cv} .lg-deco`)) && (await count(`${cv} .lg-ent`)) === 3, "登录页画布:右侧浮卡、底图、三张三端入口");
-ok((await text(`${cv} .lg-ent.on`)).includes("发行管理系统") && (await text(`${cv} .lg-c-sys`)).includes("发行管理系统") && (await count(`${cv} .lg-chip`)) === 6, "发行端:入口高亮发行端,左侧系统名和 6 个业务模块");
+ok((await visible(`${cv}.login .lg-card`)) && (await visible(`${cv} .lg-deco`)) && (await count(`${cv} .lg-ent, ${cv} .lg-chip, ${cv} .lg-mods, ${cv} .lg-ents`)) === 0, "登录页画布:右侧浮卡、底图;左侧没有三端入口和业务模块(10-08 去掉)");
+ok((await text(`${cv} .lg-c-sys`)).includes("发行管理系统") && (await text(`${cv} .lg-c-ver`)).startsWith("v") && (await count(`${cv} .lg-c-left > *`)) === 1, "发行端:左侧只有系统名和版本号");
 ok(await page.$eval(`${cv} .lg-card`, (el) => { const r = el.getBoundingClientRect(), c = el.closest(".cv").getBoundingClientRect(), z = c.width / 1440; return Math.round((c.right - r.right) / z) === 96 && Math.round(r.width / z) === 440; }), "浮卡 440px、离右边 96px");
 ok((await page.$eval(`${cv} .lg-ipt`, (el) => el.offsetHeight)) === 40, "登录页输入框 40px");
 await page.click(`${cv} [data-act="lv"][data-v="reset"]`);
@@ -73,11 +77,10 @@ await page.click(`${cv} [data-act="rem"]`);
 ok((await count(`${cv} [data-act="rem"] .ck.on`)) === 0, "取消「记住我」");
 await page.click(`${cv} [data-act="rem"]`);
 ok((await count(`${cv} [data-act="rem"] .ck.on`)) === 1, "再点勾上「记住我」");
-await page.click(`${cv} .lg-ent[data-end="sales"]`);
-ok((await page.$eval('.bk-seg[data-seg="end"] button.on', (b) => b.dataset.v)) === "sales" && (await text(`${cv} .lg-brand`)).includes("销售") && (await text(`${cv} .lg-ent.on`)).includes("销售管理系统"), "点三端入口「前往登录」切到销售端,上方「看哪一端」同步");
-ok((await count(`${cv} .lg-chip`)) === 7 && (await page.evaluate(() => location.hash)) === "#p/login/sales/login", "销售端 7 个业务模块,地址栏同步");
+await page.click('.bk-seg[data-seg="end"] button[data-v="sales"]');
+ok((await text(`${cv} .lg-brand`)).includes("销售") && (await text(`${cv} .lg-c-sys`)).includes("销售管理系统") && (await page.evaluate(() => location.hash)) === "#p/login/sales/login", "切到销售端:浮卡标志和左侧系统名都变,地址栏同步");
 await page.click('.bk-seg[data-seg="end"] button[data-v="trs"]');
-ok((await text(`${cv} .lg-c-sys`)).includes("TRS") && (await count(`${cv} .lg-chip`)) === 8, "切到 TRS 端:左侧系统名和 8 个业务模块");
+ok((await text(`${cv} .lg-c-sys`)).includes("TRS") && (await text(`${cv} .lg-brand`)).includes("TRS"), "切到 TRS 端:左侧系统名和浮卡标志都变");
 await page.click(`${cv} .lg-btn`);
 ok(await visible(`${cv} > .toast`), "点登录出现提示");
 await page.click('.bk-seg[data-seg="end"] button[data-v="issue"]');
@@ -86,6 +89,8 @@ await page.click('.bk-seg[data-seg="end"] button[data-v="issue"]');
 section("首页与外壳:菜单、标签页、收起、搜索、通知、用户菜单");
 await goPage("home");
 ok((await st()).active === "首页", "首页画布 active=首页");
+await page.click('.bk-seg[data-seg="variant"] button[data-v="work"]'); // 状态数字、快捷入口在保留的工作台版里
+ok((await has(`${cv} .hm-tile`)) && (await page.evaluate(() => location.hash)) === "#p/home/issue/work", "切到工作台版做首页交互");
 await page.click(`${cv} .hm-tile`);
 ok((await st()).active === "共赢票据管理/订单管理", "点状态数字进入订单管理");
 ok(await visible(`${cv} .pg-list .sf`), "订单管理显示搜索区");
@@ -253,13 +258,14 @@ const cvVar = (name) => page.$eval(cv, (el, n) => getComputedStyle(el).getProper
 const cvTheme = () => page.$eval(cv, (el) => el.dataset.v);
 ok((await count("#bkTheme .bk-seg button")) === 2 && (await page.$eval("#bkTheme .bk-seg button.on", (b) => b.dataset.v)) === "f", "顶栏皮肤 2 项(浅色 F、深色 B),默认浅色");
 await goPage("home");
+await page.click('.bk-seg[data-seg="variant"] button[data-v="now"]'); // 回到默认的现状版,后面核对地址
 const light = { bg: await cvVar("--bg-page"), sd: await cvVar("--sd-bg"), pri: await cvVar("--pri-bg") };
 ok((await cvTheme()) === "f" && !(await has(`${cv}[data-dark]`)) && (await cvVar("--grad")).includes("gradient"), "浅色画布 data-v=f,无 data-dark,主色渐变令牌是渐变");
 if (!(await st()).open.includes("清算管理")) await page.click(`${cv} .mg-t[data-g="清算管理"]`); // 首页画布状态是缓存的,前面可能已展开
 await page.click(`${cv} .mi[data-k="清算管理/共赢票据清算"]`);
 await page.click('#bkTheme button[data-v="db"]');
 ok((await cvTheme()) === "db" && (await has(`${cv}[data-dark]`)) && (await cvVar("--bg-page")) === "#141518" && (await cvVar("--grad")) === "#4A8CF7", "切到深色 B:data-v=db、有 data-dark、底色石墨灰、主色令牌实色");
-ok((await page.evaluate(() => location.hash)) === "#p/home/issue/t=db", "地址带 /t=db");
+ok((await page.evaluate(() => location.hash)) === "#p/home/issue/now/t=db", "地址带 /t=db");
 ok((await st()).active === "清算管理/共赢票据清算" && (await visible(`${cv} .clr .ctabs`)), "换肤后画布状态不丢:仍在清算页");
 const noShadow = (v) => v === "none" || /^rgba\(0, 0, 0, 0\) 0px 0px 0px 0px$/.test(v); // 令牌里用「0 0 0 0 transparent」代替 none
 const cs = (sel, prop) => page.$eval(sel, (el, pr) => getComputedStyle(el)[pr], prop);
@@ -267,7 +273,7 @@ ok(!(await cs(`${cv} .btn.pri`, "backgroundImage")).includes("gradient") && noSh
 ok((await cs(`${cv} .tg`, "backgroundColor")) === "rgba(0, 0, 0, 0)" && (await cs(`${cv} .tg`, "borderTopColor")) !== "rgba(0, 0, 0, 0)", "深色 B 的状态标签只描边不铺底");
 ok(parseFloat(await cs(`${cv} .card`, "borderTopWidth")) > 0 && noShadow(await cs(`${cv} .card`, "boxShadow")), "深色 B 的卡片有描边、无投影(画布有 zoom,描边宽度按比例算)");
 await page.click('.bk-seg[data-seg="end"] button[data-v="trs"]');
-ok((await cvTheme()) === "db" && (await page.evaluate(() => location.hash)) === "#p/home/trs/t=db", "切端后皮肤保持,地址同步");
+ok((await cvTheme()) === "db" && (await page.evaluate(() => location.hash)) === "#p/home/trs/now/t=db", "切端后皮肤保持,地址同步");
 await page.click('.bk-seg[data-seg="end"] button[data-v="issue"]');
 await page.click("[data-full]");
 ok((await count("#bkFullBar .bk-seg[data-seg=theme] button")) === 2 && (await page.$eval("#bkFullStage .cv", (el) => el.dataset.v)) === "db", "全屏条也有皮肤切换,全屏画布是深色 B");
@@ -305,7 +311,7 @@ ok((await cvTheme()) === "f" && (await cvVar("--sd-bg")) === light.sd && (await
 
 /* ---------- 单独模式 ---------- */
 section("单独模式");
-for (const h of ["#solo/login/trs/reset", "#solo/home/sales", "#solo/dlg-fill", "#solo/err/issue/401", "#solo/feedback", "#solo/home/issue/t=db", "#solo/dlg-trs/trs/sell/t=db", "#solo/kit/t=db"]) {
+for (const h of ["#solo/login/trs/reset", "#solo/home/sales", "#solo/home/issue/work", "#solo/dlg-fill", "#solo/err/issue/401", "#solo/feedback", "#solo/home/issue/t=db", "#solo/dlg-trs/trs/sell/t=db", "#solo/kit/t=db"]) {
   const p2 = await ctx.newPage();
   p2.on("pageerror", (e) => errs.push(e.message));
   await p2.goto(url + h);
@@ -313,6 +319,8 @@ for (const h of ["#solo/login/trs/reset", "#solo/home/sales", "#solo/dlg-fill",
   ok(await p2.isVisible("#solo .cv"), `单独模式 ${h} 有画布`);
   const want = (h.match(/\/t=([a-z]+)/) || [])[1] || "f";
   ok((await p2.$eval("#solo .cv", (el) => el.dataset.v)) === want, `单独模式 ${h} 皮肤是 ${want}`);
+  if (h === "#solo/home/sales") ok((await p2.isVisible("#solo .hm-hello")) && !(await p2.$("#solo .hm-st")), "单独模式首页默认是现状版");
+  if (h === "#solo/home/issue/work") ok((await p2.isVisible("#solo .hm-st")) && !(await p2.$("#solo .hm-hello")), "单独模式 /work 是保留的工作台版");
   if (h.startsWith("#solo/home/issue/t=db")) {
     await p2.click("#solo .user");
     await p2.click('#solo .pop-i[data-act="theme"]');

+ 5 - 3
src/使用说明.txt

@@ -9,7 +9,7 @@
 二、看什么
   左侧目录 16 项,分五组:
     总览  规范摘要(选型结果、尺寸、颜色、12 类对应关系、待确认清单)、组件总览
-    全局  登录页(右侧浮卡 + 左侧三端入口)、整体框架·首页、列表页(搜索区 + 表格)
+    全局  登录页(右侧浮卡;左侧只有系统名和版本号)、整体框架·首页(现状问候卡;上方可切到保留的工作台版)、列表页(搜索区 + 表格)
     弹层  订单详情抽屉、补录弹窗、新建投资者弹窗、TRS 下单弹窗、票据详情抽屉
     页面  页内标签页·风险监控、清算管理、个人中心、404 / 401
     反馈  确认框(在页面里)、反馈类总览
@@ -21,12 +21,14 @@
 三、怎么看
   - 每个页面是 1440×900 的真实尺寸,缩放显示;画面可以直接点:菜单、标签页(含右键)、收起侧栏、
     菜单搜索、通知、用户菜单、搜索展开、勾选表格行、点「详情」打开抽屉、在抽屉里点「补录」叠开弹窗、
-    切换页签、切换买卖方向和价格。登录页里可以点三端入口切到对应系统、换一张验证码、显示密码、记住我、忘记密码。
+    切换页签、切换买卖方向和价格。登录页里可以换一张验证码、显示密码、记住我、忘记密码。
   - 上方可以切换看发行/销售/TRS 哪一端,以及页面的变体(登录/重置密码、404/401、几种确认框)。
   - 每个页面下方有「来源」「设计要点」「待确认」。待确认的问题汇总在「规范摘要」最后一节,请逐条回复。
 
 四、需要知道的
-  - 菜单、字段、列名取自三端真实代码;表里的数值是示例;首页的数字需要后端提供汇总接口。
+  - 菜单、字段、列名取自三端真实代码;表里的数值是示例。
+  - 首页:默认看到的是按 10-08 现状内容重画的版本(只有问候卡)。原来的工作台版(状态数字、待处理表、快捷入口)
+    整套保留,在页面上方「工作台(保留,待接口)」里看;它的数字需要后端提供汇总接口,接口完善后再切回去。
   - 控件 32px、表格行高 40px、正文 14px;三端完全一致;不放页面标题;只有单一左侧栏。
   - 换肤:两套皮肤——浅色 F 晴空渐变(默认)、深色 B 石墨灰(10-08 从三版候选里选定)。
     顶栏右侧「皮肤」可以切着看每个页面;登录页右上角的月亮/太阳按钮、用户菜单里的「界面设置」在画面里也能切。