From ce10f1df6004cdd7d5656c90762b5cdd5a8f4766 Mon Sep 17 00:00:00 2001 From: MaDaLei Date: Sun, 19 Apr 2026 14:54:38 +0800 Subject: [PATCH] deploy: rebuild 202604191454 --- src/assets/global.css | 55 +++++++++++-------- src/components/AppPageState.vue | 4 +- src/components/TabBar.vue | 6 +- src/components/report/BeforeAfterSlider.vue | 4 +- src/components/report/DuringMediaGrid.vue | 2 +- src/components/report/ReminderCard.vue | 44 ++++++++------- .../report/ReportHighlightBlock.vue | 24 ++++---- src/components/report/ReportShareModal.vue | 6 +- src/components/report/TestimonialModal.vue | 2 +- src/constants/designTokens.js | 6 ++ src/pages/appointment/AppointmentDetail.vue | 2 +- .../appointment/CustAppointmentCreate.vue | 8 +-- src/pages/home/Home.vue | 26 ++++----- src/pages/login/Login.vue | 16 +++--- src/pages/mine/Leads.vue | 10 ++-- src/pages/mine/Mine.vue | 8 +-- src/pages/mine/MyOrders.vue | 2 +- src/pages/mine/MyPets.vue | 12 ++-- src/pages/mine/MyReports.vue | 6 +- src/pages/mine/PetHistory.vue | 8 +-- src/pages/mine/Profile.vue | 4 +- src/pages/mine/Schedule.vue | 7 ++- src/pages/mine/Staff.vue | 8 +-- src/pages/mine/Store.vue | 11 ++-- src/pages/report-view/reportView.vue | 12 ++-- src/pages/report/Report.vue | 10 ++-- src/pages/unsubscribe/Unsubscribe.vue | 6 +- src/utils/reportPosterDraw.js | 6 +- src/views/ReportView.vue | 4 +- 29 files changed, 172 insertions(+), 147 deletions(-) create mode 100644 src/constants/designTokens.js diff --git a/src/assets/global.css b/src/assets/global.css index f055081..20e203f 100644 --- a/src/assets/global.css +++ b/src/assets/global.css @@ -15,6 +15,15 @@ --c-brand: #2db96d; --c-brand-light: #eaf8f0; --c-brand-dark: #1e9a55; + /** 渐变 / 描边用辅色(与主色同系,业务页请用 var 引用) */ + --c-brand-soft: #86efac; + --c-brand-mid: #22c55e; + --c-brand-accent: #16a34a; + --c-brand-glow: #3dd68c; + --c-brand-bright: #32c877; + /** 浅底上的深绿标题字(Tailwind green-800 / green-700 系) */ + --c-brand-heading: #166534; + --c-brand-heading-2: #15803d; --c-orange: #f5913e; --c-orange-light: #fef5ec; --c-red: #e5534b; @@ -63,50 +72,50 @@ page { display: block; font-size: 13px; font-weight: 600; - color: #666660; + color: var(--c-text-2); margin-bottom: 6px; } .app-form-input { - background: #f5f5f2; + background: var(--c-surface-alt); border: 1.5px solid transparent; border-radius: 12px; padding: 11px 14px; font-size: 15px; - color: #1a1a1a; + color: var(--c-text); width: 100%; box-sizing: border-box; min-height: 44px; } .app-form-input:focus { - border-color: #2db96d; - background: #ffffff; + border-color: var(--c-brand); + background: var(--c-surface); } .app-form-picker { display: flex; align-items: center; justify-content: space-between; } -.app-form-placeholder { color: #bbbbb5; } +.app-form-placeholder { color: var(--c-text-4); } .app-form-arrow { - color: #bbbbb5; + color: var(--c-text-4); font-size: 18px; font-weight: 300; } .app-form-textarea { - background: #f5f5f2; + background: var(--c-surface-alt); border: 1.5px solid transparent; border-radius: 12px; padding: 12px 14px; font-size: 14px; - color: #1a1a1a; + color: var(--c-text); width: 100%; box-sizing: border-box; min-height: 100px; line-height: 1.6; } .app-form-textarea:focus { - border-color: #2db96d; - background: #fff; + border-color: var(--c-brand); + background: var(--c-surface); } /* ---- 按钮 ---- @@ -127,8 +136,8 @@ page { .van-button:active { opacity: 0.85; transform: scale(0.98); } .van-button--primary, button.van-button--primary { - background-color: #2db96d !important; - background: #2db96d !important; + background-color: var(--c-brand) !important; + background: var(--c-brand) !important; border: none !important; color: #ffffff !important; box-shadow: none !important; @@ -147,8 +156,8 @@ button.van-button--primary { } .van-button--small.van-button--primary, button.van-button--small.van-button--primary { - background-color: #2db96d !important; - background: #2db96d !important; + background-color: var(--c-brand) !important; + background: var(--c-brand) !important; color: #ffffff !important; border: none !important; } @@ -195,15 +204,15 @@ button.app-btn-sm { } .app-btn-primary, button.app-btn-primary { - background: linear-gradient(135deg, #32c877 0%, #2db96d 100%) !important; + background: linear-gradient(135deg, var(--c-brand-bright) 0%, var(--c-brand) 100%) !important; color: #ffffff !important; box-shadow: 0 4px 12px rgba(45, 185, 109, 0.28); } .app-btn-outline, button.app-btn-outline { background: transparent !important; - color: #999993 !important; - border: 1.5px solid #ebebea !important; + color: var(--c-text-3) !important; + border: 1.5px solid var(--c-border) !important; } .app-btn-danger-outline, button.app-btn-danger-outline { @@ -279,14 +288,14 @@ button.app-btn-code { } .app-btn-code--neutral, button.app-btn-code--neutral { - background: #f5f5f2 !important; - color: #2db96d !important; + background: var(--c-surface-alt) !important; + color: var(--c-brand) !important; border: none !important; } .app-btn-code--brand, button.app-btn-code--brand { background: #f0fcf5 !important; - color: #2db96d !important; + color: var(--c-brand) !important; border: 1.5px solid #c0f0d8 !important; } .app-btn-code--neutral[disabled], @@ -450,8 +459,8 @@ button.app-btn-code--neutral[disabled] { } .nav-back:active { opacity: 0.7; } .nav-gradient { - background-color: #2db96d !important; - background: #2db96d !important; + background-color: var(--c-brand) !important; + background: var(--c-brand) !important; } /* ---- 空状态 ---- */ diff --git a/src/components/AppPageState.vue b/src/components/AppPageState.vue index 76b83e2..c361e3f 100644 --- a/src/components/AppPageState.vue +++ b/src/components/AppPageState.vue @@ -69,7 +69,7 @@ defineEmits(['retry']) width: 36px; height: 36px; border: 3px solid #e8edf4; - border-top-color: #2db96d; + border-top-color: var(--c-brand); border-radius: 50%; animation: aps-spin 0.75s linear infinite; } @@ -116,7 +116,7 @@ defineEmits(['retry']) font-size: 15px; font-weight: 600; color: #fff; - background: linear-gradient(135deg, #3dd68c, #2db96d); + background: linear-gradient(135deg, var(--c-brand-glow), var(--c-brand)); border-radius: 999px; border: none; } diff --git a/src/components/TabBar.vue b/src/components/TabBar.vue index 1ca0669..d44dc26 100644 --- a/src/components/TabBar.vue +++ b/src/components/TabBar.vue @@ -8,7 +8,7 @@ @click="switchTab(tab.key)" > - + {{ tab.label }} @@ -58,11 +58,11 @@ function switchTab(pageName) { align-items: center; justify-content: center; gap: 2px; - color: #999993; + color: var(--c-text-3); transition: color 0.2s; } .tabbar-item.active { - color: #2db96d; + color: var(--c-brand); } .tabbar-icon-wrap { width: 24px; diff --git a/src/components/report/BeforeAfterSlider.vue b/src/components/report/BeforeAfterSlider.vue index f3e6782..38ac9d4 100644 --- a/src/components/report/BeforeAfterSlider.vue +++ b/src/components/report/BeforeAfterSlider.vue @@ -194,7 +194,7 @@ function onMouseDown(e) { border-radius: 50%; background: rgba(255, 255, 255, 0.95); box-shadow: 0 2px 12px rgba(15, 23, 42, 0.2); - border: 2px solid #16a34a; + border: 2px solid var(--c-brand-accent); display: flex; align-items: center; justify-content: center; @@ -204,7 +204,7 @@ function onMouseDown(e) { .ba-arrows { font-size: 14px; font-weight: 700; - color: #15803d; + color: var(--c-brand-heading-2); letter-spacing: -2px; } .ba-tags { diff --git a/src/components/report/DuringMediaGrid.vue b/src/components/report/DuringMediaGrid.vue index 7bc9809..5d15b0e 100644 --- a/src/components/report/DuringMediaGrid.vue +++ b/src/components/report/DuringMediaGrid.vue @@ -154,7 +154,7 @@ function closeVideo() { text-align: center; border-radius: 50%; background: rgba(255, 255, 255, 0.95); - color: #16a34a; + color: var(--c-brand-accent); font-size: 14px; padding-left: 3px; } diff --git a/src/components/report/ReminderCard.vue b/src/components/report/ReminderCard.vue index 1785575..83c7d8d 100644 --- a/src/components/report/ReminderCard.vue +++ b/src/components/report/ReminderCard.vue @@ -245,9 +245,15 @@ async function onSubmit() { if (res && res.code === 200 && res.data && res.data.ok) { savedDate.value = res.data.remindDate || suggestion.value.remindDate wechatBound.value = !!res.data.wechatBound - repeatSubmit.value = !!res.data.repeatSubmit + const dup = + !!res.data.repeatSubmit || + !!res.data.alreadySubmitted + repeatSubmit.value = dup submitted.value = true persistToStorage() + if (dup && res.message) { + uni.showToast({ title: res.message, icon: 'none', duration: 2200 }) + } } else { errorMsg.value = (res && res.message) || '提交失败,请稍后再试' } @@ -267,7 +273,7 @@ onMounted(async () => { diff --git a/src/pages/mine/Leads.vue b/src/pages/mine/Leads.vue index 12577a4..73ee24b 100644 --- a/src/pages/mine/Leads.vue +++ b/src/pages/mine/Leads.vue @@ -302,7 +302,7 @@ onShow(() => { line-height: 1.6; } .hero-count { - color: #16a34a; + color: var(--c-brand-accent); font-weight: 700; font-size: 18px; margin: 0 2px; @@ -327,8 +327,8 @@ onShow(() => { font-weight: 600; } .tab-item.active { - background: #ecfdf5; - color: #16a34a; + background: var(--c-brand-light); + color: var(--c-brand-accent); } .list { padding: 0 16px; } @@ -361,7 +361,7 @@ onShow(() => { color: #2563eb; font-weight: 600; } -.lead-status.sent { background: #ecfdf5; color: #16a34a; } +.lead-status.sent { background: var(--c-brand-light); color: var(--c-brand-accent); } .lead-status.unsub { background: #f3f4f6; color: #94a3b8; } .lead-body { padding: 8px 0; border-top: 1px solid #f1f5f9; } @@ -400,7 +400,7 @@ onShow(() => { font-weight: 600; } .lead-btn.primary { - background: linear-gradient(135deg, #22c55e, #16a34a); + background: linear-gradient(135deg, var(--c-brand-mid), var(--c-brand-accent)); color: #fff; } .lead-btn.ghost { diff --git a/src/pages/mine/Mine.vue b/src/pages/mine/Mine.vue index 63d1e78..cae1a16 100644 --- a/src/pages/mine/Mine.vue +++ b/src/pages/mine/Mine.vue @@ -140,7 +140,7 @@ const initials = computed(() => { const avatarBg = computed(() => { if (userInfo.avatar) return {} - const colors = ['#f5913e', '#2db96d', '#5090d0', '#e06050', '#8b6914'] + const colors = ['#f5913e', 'var(--c-brand)', '#5090d0', '#e06050', '#8b6914'] const idx = (userInfo.name?.charCodeAt(0) || 0) % colors.length return { background: colors[idx] } }) @@ -207,7 +207,7 @@ const logout = () => { } .user-phone { font-size: 13px; - color: #999993; + color: var(--c-text-3); margin-top: 2px; } .role-tag { @@ -215,8 +215,8 @@ const logout = () => { border-radius: 8px; font-size: 12px; font-weight: 700; - background: #eaf8f0; - color: #2db96d; + background: var(--c-brand-light); + color: var(--c-brand); flex-shrink: 0; } diff --git a/src/pages/mine/MyOrders.vue b/src/pages/mine/MyOrders.vue index 71e3d3f..331e89a 100644 --- a/src/pages/mine/MyOrders.vue +++ b/src/pages/mine/MyOrders.vue @@ -206,7 +206,7 @@ onMounted(() => fetchOrders()) border-radius: 14px; background: linear-gradient(135deg, #f3fff7 0%, #ecfbf3 100%); } -.hero-title { font-size: 16px; font-weight: 700; color: #166534; } +.hero-title { font-size: 16px; font-weight: 700; color: var(--c-brand-heading); } .hero-sub { margin-top: 4px; font-size: 12px; color: #4b5563; line-height: 1.45; } .orders-nav { padding: 14px 16px; diff --git a/src/pages/mine/MyPets.vue b/src/pages/mine/MyPets.vue index eb2ae50..82f852d 100644 --- a/src/pages/mine/MyPets.vue +++ b/src/pages/mine/MyPets.vue @@ -411,7 +411,7 @@ onShow(() => loadPets()) border: 1px solid #dcefe3; background: linear-gradient(135deg, #f3fff7 0%, #ecfbf3 100%); } -.hero-title { font-size: 16px; font-weight: 700; color: #166534; display: block; } +.hero-title { font-size: 16px; font-weight: 700; color: var(--c-brand-heading); display: block; } .hero-sub { display: block; margin-top: 6px; @@ -482,7 +482,7 @@ onShow(() => loadPets()) } .pet-avatar-ph { background: #e8f5ef; - color: #2db96d; + color: var(--c-brand); font-size: 22px; font-weight: 700; display: flex; @@ -491,14 +491,14 @@ onShow(() => loadPets()) } .pet-info { flex: 1; min-width: 0; } .pet-name { font-size: 16px; font-weight: 700; color: #1a1a1a; display: block; } -.pet-meta { font-size: 12px; color: #999993; display: block; margin-top: 4px; } +.pet-meta { font-size: 12px; color: var(--c-text-3); display: block; margin-top: 4px; } .pet-remark { font-size: 12px; color: #666660; display: block; margin-top: 6px; } .pet-history-link { display: block; margin-top: 8px; font-size: 13px; font-weight: 600; - color: #2db96d; + color: var(--c-brand); } .fab-pet { @@ -508,7 +508,7 @@ onShow(() => loadPets()) width: 56px; height: 56px; border-radius: 28px; - background: #2db96d; + background: var(--c-brand); box-shadow: 0 6px 20px rgba(45, 185, 109, 0.42); display: flex; align-items: center; @@ -562,5 +562,5 @@ onShow(() => loadPets()) overflow: hidden; } .avatar-prev { width: 100%; height: 100%; } -.avatar-tap-text { font-size: 12px; color: #999993; } +.avatar-tap-text { font-size: 12px; color: var(--c-text-3); } diff --git a/src/pages/mine/MyReports.vue b/src/pages/mine/MyReports.vue index 784fe77..439be89 100644 --- a/src/pages/mine/MyReports.vue +++ b/src/pages/mine/MyReports.vue @@ -152,9 +152,9 @@ onShow(() => loadReports()) border-radius: 14px; background: linear-gradient(135deg, #f3fff7 0%, #ecfbf3 100%); } -.hero-title { font-size: 16px; font-weight: 700; color: #166534; } +.hero-title { font-size: 16px; font-weight: 700; color: var(--c-brand-heading); } .hero-sub { margin-top: 4px; font-size: 12px; color: #4b5563; line-height: 1.45; } -.hero-count { font-weight: 700; color: #2db96d; } +.hero-count { font-weight: 700; color: var(--c-brand); } .placeholder-icon { width: 36px; height: 36px; @@ -245,7 +245,7 @@ onShow(() => loadReports()) width: 56px; height: 56px; border-radius: 28px; - background: #2db96d; + background: var(--c-brand); box-shadow: 0 6px 20px rgba(45, 185, 109, 0.42); display: flex; align-items: center; diff --git a/src/pages/mine/PetHistory.vue b/src/pages/mine/PetHistory.vue index 559f62e..e50137c 100644 --- a/src/pages/mine/PetHistory.vue +++ b/src/pages/mine/PetHistory.vue @@ -196,7 +196,7 @@ onLoad((options) => { width: 10px; height: 10px; border-radius: 50%; - background: #2db96d; + background: var(--c-brand); margin-top: 8px; } .ph-line { @@ -237,8 +237,8 @@ onLoad((options) => { color: #f5913e; } .ph-tag--doing { - background: #ecfdf5; - color: #16a34a; + background: var(--c-brand-light); + color: var(--c-brand-accent); } .ph-tag--done { background: #f1f5f9; @@ -267,6 +267,6 @@ onLoad((options) => { .ph-link { font-size: 14px; font-weight: 600; - color: #2db96d; + color: var(--c-brand); } diff --git a/src/pages/mine/Profile.vue b/src/pages/mine/Profile.vue index 4467f61..e413df5 100644 --- a/src/pages/mine/Profile.vue +++ b/src/pages/mine/Profile.vue @@ -178,7 +178,7 @@ const initials = computed(() => { return userInfo.value.name.slice(0, 1).toUpperCase() }) -const COLORS = ['#f5913e', '#2db96d', '#8b6914', '#e06050', '#5090d0'] +const COLORS = ['#f5913e', 'var(--c-brand)', '#8b6914', '#e06050', '#5090d0'] const avatarBg = computed(() => { const idx = (userInfo.value.name?.charCodeAt(0) || 0) % COLORS.length return { background: COLORS[idx] } @@ -402,7 +402,7 @@ onUnmounted(() => { .role-pill.hero-role.role-staff, .role-pill.role-staff { background: #ecfdf3; - color: #166534; + color: var(--c-brand-heading); } .role-pill.hero-role.role-customer, .role-pill.role-pill-compact.role-customer { diff --git a/src/pages/mine/Schedule.vue b/src/pages/mine/Schedule.vue index 3a83ec1..65ed7d0 100644 --- a/src/pages/mine/Schedule.vue +++ b/src/pages/mine/Schedule.vue @@ -13,7 +13,7 @@ 时段一览 @@ -68,6 +68,7 @@