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 @@