diff --git a/docs/V0.2/界面设计.html b/docs/V0.2/界面设计.html index 3ca0a4e..1ace70a 100644 --- a/docs/V0.2/界面设计.html +++ b/docs/V0.2/界面设计.html @@ -187,8 +187,94 @@ .empty .ico{width:64px;height:64px;margin:0 auto 12px;border-radius:50%;background:#f2f3f5;display:flex;align-items:center;justify-content:center;color:#c4c8ce;font-size:30px} .empty p{font-size:13px;margin-bottom:12px} - /* ---------- 表格 ---------- */ - table{width:100%;border-collapse:collapse;background:#fff;border:1px solid #e6e8eb;border-radius:10px;overflow:hidden;font-size:13px} + /* ---------- 统一主 Tab 头部(V0.2.1 调整:高度减半,标题主色小字) ---------- */ + .navbar-sm{height:23px;margin-top:28px;flex-shrink:0;display:flex;align-items:center;justify-content:center; + font-size:12px;font-weight:600;letter-spacing:1px;color:var(--primary);background:var(--bg)} + /* 「我」页:不设头部,头像区直接顶到状态栏下方 */ + .me-head.flush{padding-top:24px} + + /* ---------- 打卡 · 日历与打卡合并视图(V0.2.1 草案) ---------- */ + .mv-cal{background:#fff;border-radius:10px;margin:8px 12px 0;padding:6px 6px 8px;box-shadow:0 1px 2px rgba(0,0,0,.04)} + .mv-month{display:flex;align-items:center;gap:8px;padding:2px 4px 6px} + .mv-month b{font-size:14px} + .mv-month .arrow{font-size:17px;color:var(--muted);line-height:1;padding:0 3px} + .mv-month .today{margin-left:auto;font-size:11px;color:var(--primary)} + .mv-grid{display:grid;grid-template-columns:repeat(7,1fr)} + .mv-wd span{text-align:center;font-size:10px;color:var(--muted);padding:1px 0 3px;display:block} + .mv-day{height:31px;margin:1px 0;display:flex;flex-direction:column;align-items:center;justify-content:center; + border-radius:6px;font-size:12px;line-height:1.15;color:var(--text)} + .mv-day.out{color:#c8c8c8} + .mv-day.future{color:#b0b0b0} + .mv-day.today{color:var(--primary);font-weight:700} + .mv-day.sel{background:var(--primary);color:#fff;font-weight:600} + .mv-day i{width:4px;height:4px;border-radius:50%;margin-top:2px} + .mv-day i.partial{background:var(--warn)} .mv-day i.full{background:var(--success)} .mv-day i.over{background:var(--over)} + .mv-day.sel i{background:#fff} + .mv-rate{display:flex;justify-content:space-between;align-items:center;font-size:11px;color:var(--muted);padding:7px 6px 0} + .mv-rate b{color:var(--primary)} + .mv-daybar{display:flex;align-items:center;gap:8px;padding:10px 14px 2px;font-size:13px;font-weight:600} + .mv-daybar .badge{font-weight:400} + .mv-daybar .sum{margin-left:auto;font-size:11px;color:var(--muted);font-weight:400} + .mv-groups{padding-bottom:12px} + .mv-ghead{display:flex;align-items:center;gap:6px;padding:9px 14px 5px;font-size:11px;font-weight:600;color:var(--muted)} + .mv-ghead::before{content:"";width:3px;height:11px;border-radius:2px;background:var(--primary)} + .mv-ghead .cnt{margin-left:auto;font-weight:400;color:var(--weak)} + .mv-card{position:relative;display:flex;align-items:center;gap:9px;background:#fff;border-radius:9px; + padding:8px 10px;margin:0 12px 7px;box-shadow:0 1px 2px rgba(0,0,0,.04)} + .mv-card.done{background:#f7fbf8} + .mv-ring{width:42px;height:42px;position:relative;display:flex;align-items:center;justify-content:center;flex-shrink:0} + .mv-ring svg{display:block} + .mv-ring .c{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:700} + .mv-ring .c em{font-style:normal;font-size:9px;color:var(--muted);font-weight:400} + .mv-ring .ov{position:absolute;top:-3px;right:-5px;font-size:9px;color:#fff;background:var(--orange);border-radius:999px;padding:0 4px} + .mv-main{flex:1;min-width:0} + .mv-name{font-size:14px;font-weight:600;line-height:1.25;white-space:nowrap;overflow:hidden;text-overflow:ellipsis} + .mv-meta{font-size:10px;color:var(--muted);margin-top:2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis} + .mv-meta .st{color:var(--orange);background:rgba(255,143,31,.12);border-radius:3px;padding:0 4px;margin-left:5px} + .mv-btn{font-size:11px;border-radius:999px;padding:4px 12px;background:var(--primary);color:#fff;flex-shrink:0;white-space:nowrap} + .mv-btn.grey{background:#f2f3f5;color:var(--muted)} + .mv-more{color:#c0c4cc;font-size:15px;line-height:1;padding:4px 2px 4px 6px;flex-shrink:0} + /* 操作面板(⋯ 触发) */ + .mv-sheet .sheet-title{font-size:15px;margin-bottom:8px} + .mv-sheet-row{display:flex;align-items:center;justify-content:space-between;padding:12px 4px;border-top:1px solid var(--line);font-size:14px} + .mv-sheet-row.danger{color:var(--danger)} + .mv-sheet-row .k{font-size:11px;color:var(--weak)} + + /* ---------- 清单 · 模板分类(V0.2.1 草案) ---------- */ + .tpl-card{background:#fff;border-radius:10px;padding:11px 12px;margin:0 12px 10px;box-shadow:0 1px 2px rgba(0,0,0,.04)} + .tpl-row{display:flex;align-items:center;gap:7px} + .tpl-name{font-size:14px;font-weight:600} + .tpl-badge{font-size:10px;color:var(--muted);background:#f2f3f5;border-radius:4px;padding:1px 5px} + .tpl-num{margin-left:auto;font-size:11px;color:var(--muted)} + .tpl-chips{display:flex;flex-wrap:wrap;gap:5px;margin-top:7px} + .tpl-chip{font-size:10px;color:var(--muted);background:#f7f8fa;border-radius:4px;padding:2px 6px} + .tpl-chip.more{color:var(--primary);background:#f0f5ff} + .tpl-acts{display:flex;gap:14px;margin-top:9px;padding-top:7px;border-top:1px dashed var(--line)} + /* 新建清单(无场景,模板从右侧滑出选择) */ + .pick-row{display:flex;align-items:center;gap:8px;border:1px solid var(--line);border-radius:8px;padding:8px 10px;font-size:14px;color:var(--weak)} + .pick-row .meta{margin-left:auto;display:flex;align-items:center;gap:4px;font-size:11px;color:var(--muted)} + .side-panel{position:absolute;top:28px;right:0;bottom:0;width:78%;background:#fff;z-index:11; + box-shadow:-6px 0 18px rgba(15,23,42,.12);display:flex;flex-direction:column;padding:14px 0 0} + .side-head{display:flex;align-items:center;padding:0 16px 4px} + .side-head b{font-size:16px} + .side-head .x{margin-left:auto;font-size:20px;color:#c8c8c8;line-height:1} + .side-tip{font-size:11px;color:var(--muted);padding:0 16px 8px} + .side-item{display:flex;align-items:baseline;gap:8px;padding:11px 16px} + .side-item.on{background:#f0f5ff} + .side-item .nm{flex:1;font-size:14px;font-weight:600;display:flex;align-items:center;gap:6px} + .side-item.on .nm{color:var(--primary)} + .side-item .sub{font-size:11px;color:var(--muted)} + + /* ---------- 宏观 · tab 溢出提示(V0.2.1 草案) ---------- */ + .mtabs-wrap{position:relative;background:#fff;border-bottom:1px solid var(--line)} + .mtabs-wrap .mtabs{border-bottom:none} + .mtabs-fade{position:absolute;top:0;right:0;bottom:0;width:52px;display:flex;align-items:center;justify-content:flex-end; + padding-right:8px;background:linear-gradient(to right,rgba(255,255,255,0),#fff 55%,#fff)} + .mtabs-fade .hint{width:19px;height:19px;border-radius:50%;background:#fff;border:1px solid #e3e6ea; + display:flex;align-items:center;justify-content:center;color:var(--primary);font-size:13px;font-weight:700; + box-shadow:0 1px 4px rgba(0,0,0,.14)} + + /* ---------- 表格 ---------- */ table{width:100%;border-collapse:collapse;background:#fff;border:1px solid #e6e8eb;border-radius:10px;overflow:hidden;font-size:13px} th,td{border-bottom:1px solid var(--line);padding:9px 12px;text-align:left;vertical-align:middle} th{background:#fafbfc;font-weight:600;color:#444;white-space:nowrap} tr:last-child td{border-bottom:none} @@ -244,7 +330,7 @@
打卡 / 日历 / 清单 —— 移动端静态高保真原型(设计基线 420 × 820,适配 375~430px)
@@ -297,14 +383,14 @@ -「首页」Tab 取消,报警与新闻成为宏观的第 5、6 个子 Tab(/macro/alerts、/macro/news),共 6 个子 Tab 可横向滚动,当前项底部有 3px 主色指示条;报警数量以红色角标挂在子 Tab 上。新闻详情改为 /macro/news/:id,底部「宏观」保持高亮。
「首页」Tab 取消,报警与新闻并入宏观。2026-10-23 调整:两者移到最左(报警 → 新闻 → 油价 → 经济数据 → 策略研究 → 经济文章),默认选中「新闻」;共 6 个子 Tab 可横向滚动,当前项底部有 3px 主色指示条;报警数量以红色角标挂在子 Tab 上。tab 条右侧增加渐变遮罩 + 箭头,提示还有未展示的 tab(详见 2.12 ④)。新闻详情为 /macro/news/:id,底部「宏观」保持高亮。
本节为 2026-10-23 提出的调整方案。其中 ①头部统一 / ③模板分类 / ④宏观 tab 溢出 已按本节实现; + ②日历与打卡合并 为待确认草案,确认后再改代码。
+ +| 页 | 调整前 | 调整后 |
|---|---|---|
| 打卡 | NavBar 45px,标题「打卡」17px 深色 | 23px,标题「打卡」12px 主色加粗,字距 1px |
| 宏观 | NavBar 45px,无标题(空白) | 23px + 标题「宏观」(同打卡规格) |
| 监控 | NavBar 45px,无标题(空白) | 23px + 标题「监控」(同打卡规格) |
| 我 | NavBar 45px 空白条 | 整条去掉,蓝色头像区直接顶到状态栏下方 |
实现为独立组件 PageHeader,只被打卡 / 宏观 / 监控 引用;「我」页不引用,因此三者互不影响。
+ 头部背景取页面底色 #f5f5f5(不再是卡片白),视觉上更轻。
原 45px 白色 NavBar 换成 23px 底色条 + 主色标题,页面上移,首屏多出一张卡片的高度。
+顺序:报警 → 新闻 → 油价 → 经济数据 → 策略研究 → 经济文章,默认选中「新闻」(/macro 自动跳 /macro/news)。
+ 溢出提示:tab 条仍可向右滚动时,右边缘出现白色渐变遮罩 + 主色圆底箭头「›」(1.5s 轻微左右摆动,可点击向右翻页),滚到末尾自动消失;切换 tab 时自动把激活项滚到可视区中间。
+ antd-mobile Tabs 自带的右侧渐变遮罩只有 30px 且无箭头,用户难以察觉,故叠加此提示层。
把原来的「打卡」「日历」两个 tab 合成一个:上半部日历,下半部打卡卡片。取舍按下述规则:
+| 项 | 规则 |
|---|---|
| 页面结构 | SwipeTabs 从 3 个减为 2 个:日历(含打卡) / 清单 |
| 上方日历 | 保留月历网格 + 月份左右切换 + 「回到今天」;去掉「昨天 / 今天 / 明天」分段控件(点日期即可,节省 38px 高度) |
| 日历高度 | 日期格子 38px → 31px,去掉 6 行补位中的空行;整块约 240px |
| 下方打卡 | 沿用现有打卡卡片样式,但紧凑化:内边距 12px → 8px,环形 58px → 42px(环宽 6 → 5),行高压缩,卡片间距 10 → 7px |
| 卡片内容 | 保留环形进度(含达标对勾 / 超额 +n)、名称、周期与目标、连续天数、打卡按钮;撤销 / 编辑 / 归档收进「⋯」,减少一行高度 |
| 分组 | 按周期类型分组:每天 → 每周 → 每月,每组一个小标题(左侧主色竖条 + 组名 + 条数);去掉「每年」分组(已有年目标项并入「每月」区末尾的「其他周期」小标题,或建议直接隐藏年视图) |
| 联动 | 点日历某日 → 下方卡片即该日数据(进度仍按该日所属周期算);未来日期只读,按钮变灰显示「计划」 |
| 空态 | 日历下方直接显示「该日没有打卡项」+「+ 新建」引导 |
卡片整体压缩:环形 42px、内边距 8px、行距 7px,单卡高度约 58px(原 92px),一屏可看 4~5 项。分组顺序固定为 每天 → 每周 → 每月, + 组标题左侧 3px 主色竖条;无「每年」分组。日历顶部的「昨天 / 今天 / 明天」分段已去掉,直接点日期切换,选中日靠「今天」主色数字与蓝色实心块识别。
+选中未来日期时,打卡按钮统一变灰显示「计划」,点击不生效;环形仍显示该日所属周期的既有进度(此处举例为周期初)。 + 补打窗口仍是最近 7 天,超出时同样只读。
+紧凑化后卡片不再常显三个文字链接,改由右上角「⋯」唤出底部面板:撤销 / 编辑 / 归档。面板项 44px 高, + 「归档」用危险色;撤销仅在当日有记录时可用,否则置灰。
+清单页分段从 2 个变为 3 个:进行中 / 已归档 / 模板。模板拥有独立的增删改查,按名称字母顺序(中文按拼音、数字按数值)排序; + 新建清单时只保留名称,去掉场景,模板改为点击后在右侧滑出的面板里选择。
+ +模板卡片:名称 + 「预置」标记 + 项数;下方最多展示 4 个检查项摘要(超出折叠为 +n);底部操作「由此新建 / 编辑 / 删除」。
+ 系统预置模板不可编辑、不可删除(只保留「由此新建」)。右上角按钮随分段切换:模板页为「+ 新建模板」,其余为「+ 新建」。
表单只剩两项:名称(≤20 字,必填)与 模板(可空)。场景选择器已移除——场景不再由用户填写,新建时沿用所选模板自带的场景(无模板则为空),历史数据仍正常展示场景标签。
+ 点模板行从右侧滑出 78% 宽面板:首项固定为「不使用模板」,其后按字母顺序列出全部模板(预置带标记、右侧显示项数),选中项主色高亮,点遮罩或 × 关闭。
新建 / 编辑共用同一弹层:模板名称(≤20 字)+ 检查项列表(逐条 ≤40 字,可删除、可追加)。保存时至少需 1 条有效检查项,名称为空或全空则拦截并 Toast 提示。 + 删除模板需二次确认,且不影响已用该模板创建过的清单。
+| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /api/checklists/templates | 模板列表(含预置),服务端按名称字母顺序排序 |
| GET | /api/checklists/templates/:id | 模板详情 |
| POST | /api/checklists/templates | 新建模板 { name, items[] } |
| PUT | /api/checklists/templates/:id | 改名称 / 检查项(预置模板拒绝) |
| DELETE | /api/checklists/templates/:id | 删自建模板(预置模板拒绝) |
排序口径:Intl.Collator('zh-Hans-CN', { numeric: true, sensitivity: 'base' }),中文按拼音、数字按数值比较,前后端一致。
| 项 | 取值 |
|---|---|
| 高度 | 23px(原 NavBar 45px 的一半),flex: 0 0 23px 不参与压缩 |
| 标题字号 / 字重 | 12px / 600 |
| 标题颜色 | 主色 #1677ff |
| 背景 | 页面底色 #f5f5f5 |
| 适用范围 | 打卡 / 宏观 / 监控;「我」页不使用 |
实现为独立组件 src/components/PageHeader.jsx,三页各自引用、互不影响;「我」页移除 NavBar 后头像区直接贴顶。
| 状态 | 条件 | 环形 | 中心 | 卡片底 | 按钮 |
|---|