From 9ab6253c812df035d2cf675b1210c9a0588f0bb7 Mon Sep 17 00:00:00 2001 From: Ironsp <1522278303@qq.com> Date: Wed, 30 Sep 2026 15:55:36 +0800 Subject: [PATCH] =?UTF-8?q?feat=20ui=E8=AE=BE=E8=AE=A1=E7=A8=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/dev-plan.md | 12 +- src/assets/icons/online-service.png | Bin 0 -> 422 bytes src/assets/icons/quick-report.png | Bin 0 -> 407 bytes src/components/AppFooter.vue | 60 ++-- src/components/AppHeader.vue | 66 ++-- src/components/CaseCard.vue | 46 +-- src/components/ConfirmDialog.vue | 60 ++-- src/components/FileList.vue | 9 +- src/components/FilterPanel.vue | 75 ++-- src/components/PaginationBar.vue | 24 +- src/components/PasswordStrength.vue | 38 +-- src/components/QrCodePanel.vue | 39 ++- src/components/SmsCodeInput.vue | 32 +- src/components/StatusTag.vue | 15 +- src/components/StepForm.vue | 64 ++-- src/components/UploadArea.vue | 19 +- src/styles/reset.less | 2 +- src/styles/variables.less | 222 ++++++++++-- src/views/cases/cpns/CasesFilter.vue | 155 +++++---- src/views/cases/cpns/CasesGrid.vue | 8 +- src/views/cases/cpns/CasesSearchBar.vue | 51 +-- src/views/cases/index.vue | 19 +- src/views/contract/cpns/ContractInfoCard.vue | 128 ++++--- src/views/contract/cpns/ContractSignPanel.vue | 14 +- src/views/contract/cpns/ContractTable.vue | 68 +++- src/views/contract/cpns/SignSteps.vue | 36 +- src/views/contract/detail.vue | 77 +++-- src/views/contract/index.vue | 207 +++++++++-- src/views/contract/sign.vue | 78 +++-- src/views/demand/cpns/DemandActionBar.vue | 36 +- src/views/demand/cpns/DemandAttachments.vue | 35 +- src/views/demand/cpns/DemandBizTypes.vue | 54 +-- src/views/demand/cpns/DemandConfirmForm.vue | 37 +- src/views/demand/cpns/DemandInfoForm.vue | 56 ++- src/views/demand/index.vue | 76 +++-- src/views/finance/bill-detail.vue | 115 +++++-- src/views/finance/bills.vue | 210 +++++++++--- src/views/finance/cpns/BillSummaryBar.vue | 78 ++++- src/views/finance/cpns/BillTable.vue | 75 ++-- src/views/finance/cpns/FinanceChart.vue | 103 +++++- src/views/finance/cpns/FinanceOverview.vue | 68 ++-- src/views/finance/cpns/InvoiceTitleCard.vue | 159 +++++---- src/views/finance/cpns/WechatQrDialog.vue | 25 +- src/views/finance/index.vue | 98 ++++-- src/views/finance/invoice-titles.vue | 75 +++- src/views/finance/invoices.vue | 17 +- src/views/finance/pay-result.vue | 141 +++++--- src/views/finance/pay.vue | 320 +++++++++++------- src/views/home/cpns/HomeAppDialog.vue | 15 +- src/views/home/cpns/HomeBanner.vue | 43 ++- src/views/home/cpns/HomeBusinessCards.vue | 137 +++++--- src/views/home/cpns/HomeCaseShowcase.vue | 117 ++++--- src/views/home/cpns/HomeQuickEntries.vue | 69 ++-- src/views/home/cpns/HomeServiceContents.vue | 39 +-- src/views/home/cpns/HomeServiceTypes.vue | 74 ++-- src/views/home/cpns/HomeStats.vue | 27 +- src/views/home/cpns/HomeWelcome.vue | 19 +- src/views/home/detail.vue | 43 ++- src/views/home/index.vue | 24 +- src/views/login/cpns/LoginForm.vue | 41 ++- src/views/login/cpns/SmsLoginForm.vue | 41 ++- src/views/login/index.vue | 100 +++--- src/views/login/register.vue | 120 ++++--- src/views/login/reset.vue | 117 ++++--- src/views/message/cpns/MessageItem.vue | 41 ++- src/views/message/cpns/MessageList.vue | 20 +- src/views/message/cpns/MessageTabs.vue | 48 +-- src/views/message/detail.vue | 119 +++++-- src/views/message/index.vue | 222 +++++++++--- src/views/profile/about.vue | 24 +- src/views/profile/address.vue | 148 ++++++-- src/views/profile/cpns/AboutPanel.vue | 49 +-- src/views/profile/cpns/AddressDialog.vue | 85 ++++- src/views/profile/cpns/BindContactDialog.vue | 120 +++++-- .../profile/cpns/ChangePasswordDialog.vue | 104 ++++-- src/views/profile/cpns/FeedbackForm.vue | 96 ++++-- src/views/profile/cpns/HelpFaq.vue | 47 ++- src/views/profile/cpns/HotlinePanel.vue | 57 +++- src/views/profile/cpns/ProfileSider.vue | 38 +-- src/views/profile/cpns/ProfileUserCard.vue | 49 +-- src/views/profile/cpns/QualificationCard.vue | 62 +++- .../profile/cpns/QualificationDialog.vue | 82 ++++- src/views/profile/cpns/SecurityPanel.vue | 149 ++++++-- src/views/profile/favorites.vue | 34 +- src/views/profile/feedback.vue | 26 +- src/views/profile/help.vue | 26 +- src/views/profile/index.vue | 29 +- src/views/profile/qualifications.vue | 56 ++- src/views/project/after-sales.vue | 233 ++++++++++--- src/views/project/cpns/ProjectAfterSales.vue | 158 ++++++--- src/views/project/cpns/ProjectFiles.vue | 45 ++- src/views/project/cpns/ProjectFinance.vue | 128 +++---- src/views/project/cpns/ProjectInfoCard.vue | 55 +-- src/views/project/cpns/ProjectMilestones.vue | 51 +-- src/views/project/cpns/ProjectProgress.vue | 44 ++- src/views/project/cpns/ProjectTeam.vue | 40 ++- src/views/project/detail.vue | 22 +- src/views/service/cpns/ChatFileCard.vue | 40 ++- src/views/service/cpns/ChatInput.vue | 65 ++-- src/views/service/cpns/ChatMessageItem.vue | 74 ++-- src/views/service/cpns/ChatWindow.vue | 67 ++-- src/views/service/index.vue | 33 +- 102 files changed, 4855 insertions(+), 2359 deletions(-) create mode 100644 src/assets/icons/online-service.png create mode 100644 src/assets/icons/quick-report.png 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(() => { -