日期:2026-06-20
作者:ZCode(基于与产品负责人 wangkangyjy 的头脑风暴)
状态:待审查
前置规格:2026-06-18-flow-audit-and-medtech-ui-design.md(v1,已完成 token 化与反模式清理)
v1 已完成「表面反模式清理」(去 emoji、去硬编码色、token 化、verify 脚本守卫),两轮 GPT 迭代后验收脚本全部通过。但用户反馈「AI 味基本没改掉」。
根因诊断:AI 味不在代码规范层(那层已经干净),而在信息架构层——营销式 hero 标题区、彩色胶囊徽章、情感化引导卡、低密度卡片堆叠。GPT 迭代只动了视觉层(style),没动信息架构(template 结构),所以效果等于没改。
本规格(v2)是 v1 之后的第二阶段:在已干净的 token 基础上,重构 5 个样板页的信息架构,从「讲故事」转向「看数据」,达成用户选定的 D 风格 = AI 科研外壳 + 临床数据内核。
已确认的决策(来自头脑风暴):
不在本次范围(YAGNI):
| 原则 | 含义 | 反模式(禁止) |
|---|---|---|
| 工具栏顶栏 | 标题降级进顶部工具栏,和周期/状态/操作挤一行 | ❌ 独立的大标题 hero 区 |
| 表格化数据 | O/KR、评分项用表格/网格行展示,一屏看全 | ❌ 大卡片纵向堆叠 |
| 对照式布局 | 评分页三列对照(证据·自评·终评),结果页自评vs终评 | ❌ 左右两栏各说各话 |
| 数字优先 | 进度用 72% + 21600/30000,状态用色点 |
❌ 渐变进度条、彩色胶囊 tag |
| 区段用色带标题 | OKR/绩效区段用 1 行医疗青小标题分隔 | ❌ 大卡片包裹 + section 胶囊徽章 |
| 大写小字标签 | 表头、字段名用 uppercase + letter-spacing 0.5px | ❌ 营销式副标题口号 |
:root {
/* 已有 token 全部保留,以下为 v2 新增 */
/* 数据表格系统 */
--table-row-height: 40px;
--table-row-height-compact: 32px;
--table-header-bg: var(--color-surface-subtle);
--table-row-hover: var(--color-surface-muted);
--table-row-group-bg: var(--color-surface-tint-brand); /* O 分组行浅底 */
--table-border: var(--color-border-soft);
/* 工具栏顶栏 */
--toolbar-height: 48px;
--toolbar-bg: var(--color-surface-subtle);
--toolbar-border: var(--color-border);
/* 状态色点(6px 圆点,替代彩色 tag) */
--dot-size: 6px;
/* 区段色带标题 */
--section-band-bg: var(--color-surface-tint-info);
--section-band-color: var(--color-medical);
--section-band-font-size: 11px;
--section-band-letter-spacing: 0.3px;
/* 大写小字标签(表头/字段名) */
--label-uppercase: uppercase;
--label-letter-spacing: 0.5px;
--label-font-size: 10px;
/* 侧边栏 v2 加深 */
--color-sidebar-bg: #1d166b; /* 从 #2b1f99 加深 */
/* 登录页品牌区渐变 */
--color-login-brand-from: #1d166b;
--color-login-brand-to: #120d4a;
}
.data-toolbar — 工具栏顶栏容器(替代 page-hero).data-table — 表格化数据容器(O 分组行 + KR 缩进子行).section-band — 区段色带标题(替代 section-head 胶囊).status-dot — 6px 状态色点(替代 effect="dark" round tag).metric-bar — 水平数据条(构成展示,如 OKR 81%).uppercase-label — 大写小字标签.side-drawer — 侧边抽屉(KR 详情/进度更新).compare-grid-3 — 三列对照网格(评分页)核心:从「卡片堆叠」改为「工具栏 + 表格化 O/KR 视图」。
当前:page-hero → state-banner → rules-card → section-head(胶囊) → okr-card × N
目标:data-toolbar(标题+周期+状态+操作) → data-table(O分组行+KR缩进行)
→ 空态用工具栏按钮引导(不用大引导卡)
| 列 | 内容 | 宽度 |
|---|---|---|
| 标识 | O1/O2(分组行,accent 色)或 └(KR 缩进行) |
28px |
| 标题 | O 标题(加粗)/ KR 标题(次要色) | flex |
| 权重 | 仅 KR 行(40/35/25) | 44px |
| 进度 | 仅 KR 行,百分比(brand 色 600) | 60px |
| 当前/目标 | 仅 KR 行,21600/30000 |
90px |
| 状态 | 色点(●进行中/●阻塞/●完成) | 56px |
--table-row-group-bg),显示 O 标题 + 整体进度 + 整体状态点└,次要文字色| 周期状态 | 表格内容 | 特殊处理 |
|---|---|---|
| OKR_ALIGN(有 myOkr) | 表格只读展示 | 顶部工具栏「编辑 OKR」按钮 → 现有 dialog |
| OKR_ALIGN(无 myOkr) | 空态 | 工具栏「制定 OKR」按钮,表格区显示极简空态文案(不用大引导卡) |
| EXECUTING | 表格 + KR 可更新进度 | 点 KR 行 → 抽屉内 input-number 更新 |
| ASSESSING | 表格只读 | 工具栏提示「去完成绩效自评」按钮 |
page-hero / hero-infosection-badge.personal/.superior/.review(胶囊徽章)section-head 整个结构hint-card(大图标引导卡)→ 改工具栏按钮 + 表格空态okr-card / okr-grid(卡片容器)effect="dark" round 的 el-tag核心:从「左右两栏分散卡片」改为「三列对照表:证据 · 自评分 · 终评」。
当前:page-hero → review-workbench(evidence-panel | decision-panel)
目标:data-toolbar(考评+员工+周期+提交) → compare-grid-3(证据 | 自评分 | 终评)
→ 区段色带分隔 OKR/绩效/加减分 → 底部固定总览栏
| 左列(证据·员工自评) | 中列(自评分) | 右列(你的终评) |
|---|---|---|
| KR 标题 + 实际进度 + 完成率 + 阻塞天数 | 员工自评分数(13px 700) | 终评下拉(卓越/良好/达标分级) |
1.4fr 70px 1fr--section-band-bg)+ 医疗青字(--color-medical)position: sticky; bottom: 0)page-hero / hero-infoevidence-panel / decision-panel 大卡片容器(改为 compare-grid-3 网格)okr-record-card / orr-kr-card 嵌套卡片self-block / self-total-bar 分散块(合并进对照表)result-preview 渐变卡(改底部总览栏)effect="dark" round 的 el-tag核心:删 conic-gradient 等级圆环,改为「数据卡 + 构成条 + 历史趋势」。
注意:自评表单态(showSelfForm 为 true 时)保持现状不动,本规格只改结果展示态。
当前:page-hero → score-hero(grade-ring + 渐变) → score-breakdown 卡片 → 操作按钮(✓💬)
目标:data-toolbar → result-grid(左大数字+等级 | 右构成条)
→ 自评vs终评对照行 → 操作栏 → 历史趋势条形图
scoreApi.getMyResult(periodId)(单期)和 getKrHistory(KR 进度历史),无「我的历史绩效列表」接口。scoreApi.getMyResult(periodId),需要历史周期 ID 列表 → 由 periodApi.list() 取最近 4 个已归档周期,逐个查 getMyResult。N+1 查询但数据量小(最多 4 次),可接受。page-hero / hero-infoscore-hero 整个区(含 conic-gradient grade-ring + linear-gradient 背景)grade-ring / grade-letter 圆环组件score-breakdown 卡片(改 metric-bar)effect="dark" round 的 el-tag核心:去 emoji、细化选中态、加深背景、强化分组标签。
#2b1f99 → #1d166b(--color-sidebar-bg)round → 方角(radius 4px)核心:从「浅底居中两栏」改为「全屏左深色品牌区 + 右白表单」,输入框改下划线式。
当前:浅底 grid(品牌区 | 表单卡) 居中
目标:全屏 grid(左深色品牌区 1.2fr | 右白表单 1fr) 撑满
linear-gradient(135deg, #1d166b, #120d4a)border-bottom: 1px solid var(--color-border)).underline-input :deep(.el-input__wrapper) {
background: transparent;
box-shadow: none;
border-radius: 0;
border-bottom: 1px solid var(--color-border);
padding: 4px 0;
}
.underline-input :deep(.el-input__wrapper.is-focus) {
border-bottom-color: var(--color-accent);
box-shadow: none;
}
.underline-input :deep(.el-input__wrapper:hover) {
border-bottom-color: var(--color-accent);
}
verify-medtech-theme.mjs 新增断言// 新增工具栏/表格/对照类检查
const layoutChecks = new Map([
['src/views/okr/MyOkrView.vue', 'data-toolbar'], // 替代 page-hero
['src/views/okr/MyOkrView.vue', 'data-table'], // 新增表格
['src/views/scoring/ScoringEditView.vue', 'compare-grid-3'], // 三列对照
['src/views/scoring/ScoringEditView.vue', 'section-band'], // 区段色带
['src/views/scoring/MyResultView.vue', 'metric-bar'], // 数据条
['src/components/MainLayout.vue', 'clinical-sidebar'], // 已有,保留
])
// 禁用类检查(新增)
const bannedPatterns = [
{ pattern: /page-hero/, message: '禁止 page-hero(改用 data-toolbar)' },
{ pattern: /section-badge/, message: '禁止 section-badge 胶囊徽章' },
{ pattern: /grade-ring/, message: '禁止 grade-ring 圆环' },
{ pattern: /score-hero/, message: '禁止 score-hero 渐变区' },
{ pattern: /hint-card/, message: '禁止 hint-card 大引导卡' },
{ pattern: /conic-gradient/, message: '禁止 conic-gradient' },
]
verify-scoring-contract.mjs 保留不动评分口径(OKR 60 + 绩效 40)已在 v1 确认正确,本次不改口径,契约脚本无需动。
npm run build + 复制到 backend/staticpage-hero / section-badge / grade-ring / score-hero / hint-card / conic-gradientdata-toolbar + data-table,KR 进度更新走侧边抽屉compare-grid-3 三列对照 + section-band 区段 + 底部总览栏(含自评差异)metric-bar 构成条 + 历史趋势,无圆环verify-scoring-contract.mjs 通过)verify-medtech-theme.mjs 通过(含新增断言)verify-scoring-contract.mjs 通过npm run build 成功backend/src/main/resources/static/| 风险 | 影响 | 缓解 |
|---|---|---|
| 表格化后小屏(<1280px)挤压 | 评分页三列对照降级 | 预设响应式降级方案(第 2 节页面 2) |
| 历史趋势数据接口不存在 | MyResultView 趋势图空 | 隐藏趋势区 + 显示空态文案,不阻塞 |
| 侧边抽屉与现有 dialog 冲突 | MyOkrView 编辑流程 | 抽屉只承载进度更新,编辑 OKR 仍走现有 dialog |
| 其余 ~10 页视觉脱节 | 全站一致性 | 本次不处理,样板页验收后再评估套用 |
回退:所有改动在 5 个样板页 + theme.css + components.css + verify 脚本范围内,git revert 对应 commit 即可完整回退,不影响后端与业务逻辑。