diff --git a/docs/dev-plan.md b/docs/dev-plan.md index 0149594..dff89e6 100644 --- a/docs/dev-plan.md +++ b/docs/dev-plan.md @@ -6,21 +6,22 @@ 2. **每完成一项立即打 `[x]`**(开发结束标记),不得批量补标。 3. **之后只做未完成(`[ ]`/`[~]`/`[!]`)的部分**,已完成项不再重做,除非回归失败。 4. 每个模块收尾必须过 `pnpm build`(vue-tsc 零错误)才算可打 `[x]`。 -5. 当前约束:**无蓝湖设计稿、无接口文档** → 阶段二/接口细节 `[!]` 阻塞中;页面代码按 PRD + 原型降级开发(结构/交互先行,视觉参数用 `styles/variables.less` 近似值,接口用 store 层 mock 临时实现并集中标注 `// TODO(api)`,文档到位后仅替换 api 层)。 +5. 当前约束:**无接口文档** → 接口细节 `[!]` 阻塞中;页面代码按 PRD + 原型降级开发(结构/交互先行,视觉参数用 `styles/variables.less` 近似值,接口用 store 层 mock 临时实现并集中标注 `// TODO(api)`,文档到位后仅替换 api 层)。 +6. 蓝湖设计稿已到位(2026-09-30):pid `b0052b6c-4eaa-4709-b2d1-32cf4c1fe53b`,共 55 张设计图(因 UI 失误全部命名为「首页」,已按标注图层文字 + 像素取证完成「设计图 → 路由」映射);阶段二与「蓝湖视觉补齐」已完成。 ## 阶段总览 | 阶段 | 内容 | 状态 | | --- | --- | --- | | 阶段一 | PRD 生成(`docs/PRD.md`) | [x] | -| 阶段二 | 蓝湖 MCP 设计稿读取(标注参数/切图) | [!] 无设计稿,阻塞 | +| 阶段二 | 蓝湖 MCP 设计稿读取(标注参数/切图) | [x](55 张标注已落盘 `specs/*.ann.txt`;`lanhu_get_design_overview/export_design_assets` 因 `UnsupportedCoordinates` 不可用,切图改由 2× 封面按标注坐标裁剪) | | 阶段三 | 页面结构规划(`docs/page-architecture.md`) | [x] | | 阶段四 | 页面代码生成 + 组件拆分 | [x] | | 阶段五 | API + Store 逻辑层 | [x] | | 阶段六 | 公共组件提取 | [x] | | 阶段七 | 自动验证与修正(`pnpm build` 零错误) | [x] | | 补齐 | 接口文档落地后替换 mock api 层 | [!] 无接口文档,阻塞 | -| 补齐 | 蓝湖到位后校准视觉(色值/间距/字号/切图) | [!] 无设计稿,阻塞 | +| 补齐 | 蓝湖到位后校准视觉(色值/间距/字号/切图) | [x] | ## P0 基础工程(全模块前置) @@ -146,7 +147,8 @@ - [x] 阶段六:全局扫描,跨页面重复 UI 上移 components/,更新 components/index.ts barrel - [x] 阶段七:逐页对照 PRD/原型自检(布局/交互/字段/组件拆分/规范合规:无 as any、页面不直接 import api) - [x] `pnpm build`(vue-tsc)全量零错误 -- [ ] 蓝湖到位后:校准 variables.less 色值/字号/间距,替换切图,逐页对照设计稿修正 → 补打 [x] +- [x] 蓝湖到位后:校准 variables.less 色值/字号/间距,替换切图,逐页对照设计稿修正(主色 `#276fff→#1f67ef`、内容强调 `#024fff`、灰阶对齐 `#1f2937/#4b5563/#6b7280/#9ca3af`、危险 `#ef4444`、成功 `#16a34a`、顶栏 `#f4f5f9`+`#d8d8d8`、页脚 `#0c1321`;AppHeader/AppFooter 按设计重写;10 个模块页面视觉按标注补齐,` diff --git a/src/views/finance/invoice-titles.vue b/src/views/finance/invoice-titles.vue index 85c2c1b..0e6455a 100644 --- a/src/views/finance/invoice-titles.vue +++ b/src/views/finance/invoice-titles.vue @@ -146,24 +146,52 @@ onMounted(() => { diff --git a/src/views/finance/invoices.vue b/src/views/finance/invoices.vue index bbb27aa..106bb83 100644 --- a/src/views/finance/invoices.vue +++ b/src/views/finance/invoices.vue @@ -213,12 +213,21 @@ onMounted(() => { diff --git a/src/views/finance/pay.vue b/src/views/finance/pay.vue index 8b30f87..ffda28c 100644 --- a/src/views/finance/pay.vue +++ b/src/views/finance/pay.vue @@ -74,29 +74,42 @@ onMounted(() => { 扫码支付 -
-
- -

- 安全提示:本页面已通过安全验证,请勿向他人泄露付款码 -

- - 切换支付方式 - -
+ +
+
+
+

+ {{ methodLabel }} · 请使用手机微信 [扫一扫] 扫描下方二维码完成支付 +

+ + 切换支付方式 + +
-

支付金额

¥{{ formatMoney(payment?.amount ?? currentBill?.amount ?? 0) }}

-

- {{ methodLabel }} · 请使用手机微信 [扫一扫] 扫描下方二维码完成支付 -

+
+ + +
+ +
+
+

+ 扫码支付操作步骤 +

+
    +
  1. + {{ index + 1 }} + {{ step }} +
  2. +
@@ -123,29 +136,22 @@ onMounted(() => {
-
-

- 扫码支付操作步骤 -

-
    -
  1. - {{ index + 1 }} - {{ step }} -
  2. -
-
- - +

+ 安全提示:本页面已通过安全验证,请勿向他人泄露付款码 +

+ + + { diff --git a/src/views/home/cpns/HomeAppDialog.vue b/src/views/home/cpns/HomeAppDialog.vue index 6e429cc..80dff70 100644 --- a/src/views/home/cpns/HomeAppDialog.vue +++ b/src/views/home/cpns/HomeAppDialog.vue @@ -161,7 +161,7 @@ function onClose(): void { z-index: 1000; .flex(row, center); padding: @spacing-base; - background: rgba(0, 0, 0, 0.45); + background: fade(@black, 45%); &__panel { .flex(column, flex-start, stretch); @@ -248,28 +248,29 @@ function onClose(): void { box-shadow: @shadow-base; } + // tone 底色与首页快捷入口一致(按蓝湖设计稿采样) &--purple { - background: #f0eaff; + background: @home-quick-purple; } &--green { - background: #e7f8ec; + background: @home-quick-green; } &--blue { - background: @primary-light; + background: @home-quick-peach; } &--amber { - background: #fff3e0; + background: @home-quick-pink; } &--red { - background: #ffeceb; + background: fade(@danger-color, 15%); } &--cyan { - background: #e4f6fa; + background: @home-quick-blue; } } diff --git a/src/views/home/cpns/HomeBanner.vue b/src/views/home/cpns/HomeBanner.vue index d27a61b..1417937 100644 --- a/src/views/home/cpns/HomeBanner.vue +++ b/src/views/home/cpns/HomeBanner.vue @@ -78,6 +78,16 @@ onBeforeUnmount(stop) > › + + +
+ +
@@ -85,11 +95,10 @@ onBeforeUnmount(stop) diff --git a/src/views/home/cpns/HomeBusinessCards.vue b/src/views/home/cpns/HomeBusinessCards.vue index 91e2a31..4a772d4 100644 --- a/src/views/home/cpns/HomeBusinessCards.vue +++ b/src/views/home/cpns/HomeBusinessCards.vue @@ -30,10 +30,12 @@ defineProps() {{ line.name.slice(0, 2) }} -

- {{ line.name }} -

+ +
+

+ {{ line.name }} +

{{ line.desc }}

@@ -45,15 +47,25 @@ defineProps() diff --git a/src/views/home/cpns/HomeQuickEntries.vue b/src/views/home/cpns/HomeQuickEntries.vue index b272177..4e2fb04 100644 --- a/src/views/home/cpns/HomeQuickEntries.vue +++ b/src/views/home/cpns/HomeQuickEntries.vue @@ -87,14 +87,16 @@ function onMore(): void { diff --git a/src/views/home/cpns/HomeWelcome.vue b/src/views/home/cpns/HomeWelcome.vue index 3ab3181..a6896db 100644 --- a/src/views/home/cpns/HomeWelcome.vue +++ b/src/views/home/cpns/HomeWelcome.vue @@ -37,23 +37,26 @@ const greeting = computed(() => { &__greeting { .flex(row, flex-start); gap: @spacing-sm; - font-size: @font-size-xxl; - font-weight: 600; - color: @white; + // 设计稿「中午好」52 设计px / 700 / #2C2C2C + font-size: 40px; + font-weight: 700; + color: @home-welcome; } &__wave { .flex(row, center); - width: 32px; - height: 32px; + width: 36px; + height: 36px; border-radius: @radius-round; - background: rgba(255, 255, 255, 0.25); + background: fade(@black, 4%); font-size: @font-size-lg; } &__summary { - font-size: @font-size-lg; - color: rgba(255, 255, 255, 0.9); + // 设计稿副文案 24 设计px / 400 / #2C2C2C + font-size: 18px; + font-weight: 400; + color: @home-welcome; } } diff --git a/src/views/home/detail.vue b/src/views/home/detail.vue index 68f1738..62f0c24 100644 --- a/src/views/home/detail.vue +++ b/src/views/home/detail.vue @@ -73,44 +73,55 @@ onMounted(load) padding-bottom: @spacing-xxl; &__breadcrumb { - margin-bottom: @spacing-base; - font-size: @font-size-base; + margin-bottom: 36px; + // 设计稿面包屑 24 设计px / 500 / #666666 + font-size: 18px; + font-weight: 500; + color: @home-breadcrumb; + + .link { + color: @home-breadcrumb; + } } + // 设计稿头图卡 1780×219 设计px:浅蓝渐变底、左上图标块 + 标题 + 副标题 &__hero { - .flex(row, flex-start); - gap: @spacing-base; - margin-bottom: @spacing-xl; - padding: @spacing-xl; + .flex(column, flex-start); + gap: 18px; + margin-bottom: @spacing-base; + padding: 19px 22px 24px; border-radius: @radius-lg; - background: @white; - box-shadow: @shadow-base; + background: @home-detail-hero-bg; } &__logo { .flex(row, center); - width: 56px; - height: 56px; + width: 62px; + height: 62px; border-radius: @radius-lg; - background: @primary-light; - color: @primary-color; + background: @home-detail-logo-bg; + color: @primary-strong; font-size: @font-size-xl; font-weight: 600; } &__intro { .flex(column, flex-start); - gap: @spacing-xs; + gap: 6px; } &__name { - font-size: @font-size-xxl; + // 设计稿详情标题 26 设计px / #333333 + font-size: @font-size-xl; font-weight: 600; - color: @heading-color; + color: @home-body; } &__slogan { - font-size: @font-size-base; + // 设计稿副标题 14 设计px → 可读下限 11px / #333333 + font-size: 11px; + font-weight: 400; + color: @home-body; } &__cta { diff --git a/src/views/home/index.vue b/src/views/home/index.vue index cb5af3a..2340263 100644 --- a/src/views/home/index.vue +++ b/src/views/home/index.vue @@ -27,9 +27,8 @@ onMounted(() => { diff --git a/src/views/profile/address.vue b/src/views/profile/address.vue index 9d142d0..2b79f8b 100644 --- a/src/views/profile/address.vue +++ b/src/views/profile/address.vue @@ -83,10 +83,10 @@ onMounted(() => { -