diff --git a/README-AGENT-SYSTEM.md b/README-AGENT-SYSTEM.md
index 2a0c89c..c90d9d5 100644
--- a/README-AGENT-SYSTEM.md
+++ b/README-AGENT-SYSTEM.md
@@ -24,7 +24,7 @@ pnpm dev:h5
http://localhost:5173/
```
-**默认入口页面**: `pages/agent-system/index`
+**默认入口页面**: `pages/agent-system/home/index`
---
@@ -85,7 +85,10 @@ http://localhost:5173/
```
src/pages/agent-system/
-└── index.vue # 主页面 (所有功能都在这里)
+├── home/index.vue # 当前首页入口
+├── commission-center/index.vue # 佣金中心
+├── withdraw/index.vue # 提现管理
+└── ... # 其他独立业务页面
.claude/
├── AGENT-SYSTEM-DESIGN.md # 完整设计规范 (50+ 页)
@@ -135,7 +138,7 @@ src/pages/agent-system/
### 添加新菜单项
-修改 `src/pages/agent-system/index.vue`:
+当前实现已拆分为多页面,请修改对应业务页,例如 `src/pages/agent-system/home/index.vue`:
```vue
+
+
+
+
+
+
+
+
+ 可提现佣金
+
+
+ {{ formatAmountDisplay(summary?.available_commission) }}
+
+
+
+
+
+
+
+
+
+ {{ metric.label }}
+
+
+ {{ formatAmountDisplay(metric.amount) }}
+
+
+
+
+
diff --git a/src/pages/agent-system/asset-search/index.vue b/src/pages/agent-system/asset-search/index.vue
index 28df4cb..5df940f 100644
--- a/src/pages/agent-system/asset-search/index.vue
+++ b/src/pages/agent-system/asset-search/index.vue
@@ -340,14 +340,6 @@
-
-
- 运营商ID
-
- {{ cardInfo.carrier_id }}
-
-
-
卡类型
diff --git a/src/pages/agent-system/commission-center/index.vue b/src/pages/agent-system/commission-center/index.vue
index b8c1f8d..fcac6f9 100644
--- a/src/pages/agent-system/commission-center/index.vue
+++ b/src/pages/agent-system/commission-center/index.vue
@@ -2,6 +2,7 @@
import { ref, computed, onMounted } from 'vue'
import { getFundSummary, getCommissionRecords, getCommissionStats } from '@/api/commission'
import type { FundSummary, CommissionRecord, CommissionStats } from '@/api/commission'
+import AgentFundSummaryCard from '@/components/AgentFundSummaryCard.vue'
import SimplePicker from '@/components/SimplePicker.vue'
type LoginUserInfo = {
@@ -13,7 +14,6 @@ const commissionSummary = ref(null)
const shopId = ref(0)
const commissionRecords = ref([])
const commissionStats = ref(null)
-const loading = ref(false)
const loadingRecords = ref(false)
const page = ref(1)
const pageSize = 20
@@ -86,7 +86,7 @@ onMounted(() => {
async function loadCommissionSummary() {
try {
const userInfo = getLoginUserInfo()
- commissionSummary.value = await getFundSummary(userInfo?.username ? { shop_name: userInfo.username } : undefined)
+ commissionSummary.value = await getFundSummary(userInfo?.username ? { username: userInfo.username } : undefined)
} catch (error) {
console.error('加载佣金概览失败:', error)
}
@@ -153,12 +153,6 @@ function loadMore() {
}
}
-function onScroll(e: any) {
- const { scrollTop, scrollHeight, clientHeight } = e.target
- if (scrollHeight - scrollTop - clientHeight < 100) {
- loadMore()
- }
-}
@@ -205,37 +199,7 @@ function onScroll(e: any) {
-
-
-
- 可提现佣金
-
- {{ commissionSummary ? formatAmount(commissionSummary.available_commission) : '--' }}
-
-
-
-
-
-
- 累计佣金
-
- {{ commissionSummary ? formatAmount(commissionSummary.total_commission) : '--' }}
-
-
-
- 已提现
-
- {{ commissionSummary ? formatAmount(commissionSummary.withdrawn_commission) : '--' }}
-
-
-
- 冻结
-
- {{ commissionSummary ? formatAmount(commissionSummary.frozen_commission) : '--' }}
-
-
-
-
+
diff --git a/src/pages/agent-system/home/index.vue b/src/pages/agent-system/home/index.vue
index 3b9b540..b76fe6a 100644
--- a/src/pages/agent-system/home/index.vue
+++ b/src/pages/agent-system/home/index.vue
@@ -5,6 +5,7 @@
import type { UserInfo } from '@/api/auth'
import { getFundSummary, getCommissionDailyStats } from '@/api/commission'
import type { FundSummary, DailyCommissionStats } from '@/api/commission'
+ import AgentFundSummaryCard from '@/components/AgentFundSummaryCard.vue'
// 用户信息
@@ -36,10 +37,6 @@
return `¥${parts.join('.')}`
}
- function formatAmountDisplay(amount?: number | null) {
- return typeof amount === 'number' ? formatAmount(amount) : '--'
- }
-
// 格式化日期 (MM-DD)
// 根据用户类型动态生成菜单
function formatDate(dateStr : string) {
@@ -49,72 +46,15 @@
return `${month}-${day}`
}
- function getTodayDate() {
- const today = new Date()
- const year = today.getFullYear()
- const month = String(today.getMonth() + 1).padStart(2, '0')
- const day = String(today.getDate()).padStart(2, '0')
- return `${year}-${month}-${day}`
- }
-
- const menuItems = computed(() => {
- const menus = [
- {
- title: '资产列表',
- desc: userInfo.value?.user_type === 3 ? '代理资产列表' : '企业资产列表',
- icon: '/static/icons/资产列表.png',
- path: '/pages/agent-system/assets/index',
- },
- ]
-
- // 企业端显示授权卡和授权设备 (仅 user_type === 4)
- if (userInfo.value?.user_type === 4) {
- menus.push(
- {
- title: '授权卡列表',
- desc: '企业授权IoT卡',
- icon: '/static/icons/授权卡列表.png',
- path: '/pages/agent-system/enterprise-cards/index',
- },
- {
- title: '授权设备列表',
- desc: '企业授权设备',
- icon: '/static/icons/授权设备列表.png',
- path: '/pages/agent-system/enterprise-devices/index',
- }
- )
- }
-
- // 仅代理端显示佣金和提现
- if (userInfo.value?.user_type === 3) {
- menus.push(
- {
- title: '佣金中心',
- desc: '收益统计',
- icon: '/static/icons/佣金中心.png',
- path: '/pages/agent-system/commission-center/index',
- },
- {
- title: '提现管理',
- desc: '申请提现',
- icon: '/static/icons/提现管理.png',
- path: '/pages/agent-system/withdraw/index',
- }
- )
- }
-
- return menus
- })
-
// 加载佣金数据
- async function loadCommissionData(shopName?: string) {
+ async function loadCommissionData(username?: string) {
if (!isAgent.value) return
loadingCommission.value = true
try {
// 1. 加载佣金概览 (新接口 /shops/fund-summary)
- const summary = await getFundSummary(shopName ? { shop_name: shopName } : undefined)
+ const summary = await getFundSummary(username ? { username } : undefined)
commissionSummary.value = summary
if (!shopId.value) {
@@ -122,11 +62,8 @@
return
}
- const today = getTodayDate()
const todayStats = await getCommissionDailyStats(shopId.value, {
days: 1,
- start_date: today,
- end_date: today,
})
dailyStats.value = todayStats || []
return
@@ -155,19 +92,20 @@
// 设置店铺ID
const loginUserInfo = getLoginUserInfo()
shopId.value = user.shop_id || loginUserInfo?.shop_id || 0
- const fundSummaryShopName = loginUserInfo?.username || user.username
+ const fundSummaryUsername = loginUserInfo?.username || user.username
console.log('首页数据加载成功:', { user })
// 如果是代理账号,加载佣金数据
if (user.user_type === 3) {
- await loadCommissionData(fundSummaryShopName)
+ await loadCommissionData(fundSummaryUsername)
}
}
catch (error : any) {
console.error('加载首页数据失败:', error)
// 如果是前端逻辑错误(非 API 错误),需要手动显示提示
- if (error instanceof Error && error.message && !error.statusCode) {
+ const errorWithStatus = error as { statusCode?: number } | undefined
+ if (error instanceof Error && error.message && !errorWithStatus?.statusCode) {
uni.$u.toast(error.message)
}
// API 请求错误已由拦截器统一处理
@@ -253,54 +191,16 @@
-
-
-
- 可提现佣金
-
- {{ formatAmountDisplay(commissionSummary?.available_commission) }}
-
-
- 当前可直接发起提现的佣金金额
-
-
-
-
-
- 佣金中心
-
-
-
-
-
-
- 累计佣金
-
- {{ formatAmountDisplay(commissionSummary?.total_commission) }}
-
-
-
- 已提现
-
- {{ formatAmountDisplay(commissionSummary?.withdrawn_commission) }}
-
-
-
- 冻结
-
- {{ formatAmountDisplay(commissionSummary?.frozen_commission) }}
-
-
-
-
+ />
-
+
- 今日佣金
+ 最近一天佣金
明细
@@ -325,7 +225,7 @@
- 今日暂无佣金数据
+ 最近一天暂无佣金数据
diff --git a/src/pages/agent-system/index.vue b/src/pages/agent-system/index.vue
deleted file mode 100644
index a60276b..0000000
--- a/src/pages/agent-system/index.vue
+++ /dev/null
@@ -1,1512 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 可提现佣金
-
-
- ¥{{ formatAmount(commissionOverview.available_commission) }}
-
-
-
-
- 累计佣金
- ¥{{ formatAmount(commissionOverview.total_commission) }}
-
-
-
- 已提现
- ¥{{ formatAmount(commissionOverview.withdrawn_commission) }}
-
-
-
-
-
-
-
-
-
- 提现中
- ¥{{ formatAmount(commissionOverview.withdrawing_commission) }}
-
-
- 冻结中
- ¥{{ formatAmount(commissionOverview.frozen_commission) }}
-
-
- 未提现
- ¥{{ formatAmount(commissionOverview.unwithdraw_commission) }}
-
-
-
-
-
- 佣金统计
-
-
-
-
-
- 总收入
- {{ commissionStats.total_count }} 笔
-
-
- ¥{{ formatAmount(commissionStats.total_amount) }}
-
-
-
-
-
-
-
- 成本价差
-
- {{ (commissionStats.cost_diff_percent / 10).toFixed(1) }}%
-
-
- {{ commissionStats.cost_diff_count }} 笔
-
-
- ¥{{ formatAmount(commissionStats.cost_diff_amount) }}
-
-
-
-
-
-
-
- 一次性佣金
-
- {{ (commissionStats.one_time_percent / 10).toFixed(1) }}%
-
-
- {{ commissionStats.one_time_count }} 笔
-
-
- ¥{{ formatAmount(commissionStats.one_time_amount) }}
-
-
-
-
-
-
-
-
- 每日收入
- 近7日
-
-
-
-
-
- {{ item.date }}
- {{ item.total_count }} 笔
-
-
- +¥{{ formatAmount(item.total_amount) }}
-
-
-
-
-
-
-
-
- 佣金明细
-
-
-
-
-
-
-
-
- 订单 #{{ detail.order_id }}
-
-
- {{ detail.status_name }}
-
-
-
- {{ commissionSourceMap[detail.commission_source] }}
- {{ formatDateTime(detail.created_at) }}
-
-
-
- +¥{{ formatAmount(detail.amount) }}
-
-
-
-
-
-
-
-
-
-
- 套餐总计
-
-
-
- {{ formatDataSize(myPackageUsage.total.used_mb) }}
-
-
- / {{ formatDataSize(myPackageUsage.total.total_mb) }}
-
-
-
-
-
-
-
-
-
-
- 使用率: {{ calcUsagePercent(myPackageUsage.total.used_mb, myPackageUsage.total.total_mb) }}%
- 剩余: {{ formatDataSize(myPackageUsage.total.total_mb - myPackageUsage.total.used_mb) }}
-
-
-
-
-
- 主套餐
-
-
-
-
- {{ myPackageUsage.main_package.package_name }}
-
-
- {{ myPackageUsage.main_package.status_text }}
-
-
-
-
-
-
- 流量使用
-
- {{ formatDataSize(myPackageUsage.main_package.used_mb) }} /
- {{ formatDataSize(myPackageUsage.main_package.total_mb) }}
-
-
-
-
-
-
-
-
-
-
-
- 激活: {{ formatDate(myPackageUsage.main_package.activated_at) }}
-
-
-
- 到期: {{ formatDate(myPackageUsage.main_package.expires_at) }}
-
-
- (剩{{ calcRemainingDays(myPackageUsage.main_package.expires_at) }}天)
-
-
-
-
-
-
-
-
-
-
- 加油包
-
- {{ myPackageUsage.addon_packages.length }} 个
-
-
-
-
-
-
-
-
- {{ addon.package_name }}
-
-
- 优先级: {{ addon.priority }}
-
-
-
- {{ addon.status_text }}
-
-
-
-
-
-
- 流量
-
- {{ formatDataSize(addon.used_mb) }} / {{ formatDataSize(addon.total_mb) }}
-
-
-
-
-
-
-
-
-
- 激活: {{ formatDate(addon.activated_at) }}
- 到期: {{ formatDate(addon.expires_at) }}
-
- 等待激活
-
-
-
-
-
-
-
- 暂无加油包
-
-
-
-
-
-
-
-
-
-
- {{ stat.label }}
-
-
-
-
-
-
- {{ stat.value }}
-
- {{ stat.unit }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{ pkg.package_name }}
-
-
-
- {{ packageTypeMap[pkg.package_type] }}
-
-
- 优先级: {{ pkg.priority }}
-
-
-
-
-
- {{ pkg.status_name }}
-
-
-
-
-
-
-
-
- 虚流量使用
-
- {{ formatDataSize(pkg.virtual_used_mb) }} / {{ formatDataSize(pkg.virtual_limit_mb) }}
-
-
-
-
-
-
-
-
-
- 真流量
-
- {{ formatDataSize(pkg.data_usage_mb) }} / {{ formatDataSize(pkg.data_limit_mb) }}
-
-
-
-
-
-
-
-
- 激活: {{ formatDate(pkg.activated_at) }}
-
-
-
- 到期: {{ formatDate(pkg.expires_at) }}
-
-
- (剩{{ calcRemainingDays(pkg.expires_at) }}天)
-
-
-
-
-
-
-
-
-
-
- 暂无套餐数据
-
-
-
-
-
-
-
-
-
-
- {{ stat.label }}
-
-
-
-
-
-
- {{ stat.value }}
-
- {{ stat.unit }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{ asset.name }}
-
-
- 编号: {{ asset.code }}
-
-
-
-
-
-
- {{ tag }}
-
-
- 激活
-
-
- 未激活
-
-
-
-
-
-
-
-
-
-
-
- {{ asset.package_count }} 个套餐
-
-
-
- {{ formatDataSize(asset.total_data_mb) }}
-
-
-
-
-
-
-
-
-
-
- 暂无资产数据
-
-
-
-
-
-
-
-
-
- {{ tagList.length }}
- 标签总数
-
-
-
- {{ tagList.reduce((sum, t) => sum + t.asset_count, 0) }}
-
- 已分配资产
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{ tag.name }}
-
-
- {{ tag.description }}
-
-
-
-
- 已分配 {{ tag.asset_count }} 个资产
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{ selectedTag.name }}
-
-
- {{ selectedTag.description }}
-
-
-
-
-
-
-
- 选择要分配的资产 ({{ assetList.filter(a => a.tags.includes(selectedTag.name)).length }}/{{ assetList.length }})
-
-
-
-
-
-
-
-
-
-
-
-
- {{ asset.name }}
-
-
- 编号: {{ asset.code }}
-
-
-
-
-
- 激活
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{ selectedPackage.package_name }}
-
-
- {{ selectedPackage.status_name }}
-
-
-
-
-
-
-
- 套餐类型: {{ packageTypeMap[selectedPackage.package_type] }}
-
-
-
-
-
- 优先级: {{ selectedPackage.priority }}
-
-
-
-
-
- 主套餐ID: {{ selectedPackage.master_usage_id }}
-
-
-
-
-
-
-
- 流量使用
-
-
-
-
- 虚流量使用
-
- {{ calcUsagePercent(selectedPackage.virtual_used_mb, selectedPackage.virtual_limit_mb) }}%
-
-
-
-
-
-
-
-
-
- 已用
- {{ formatDataSize(selectedPackage.virtual_used_mb) }}
-
-
- 剩余
- {{ formatDataSize(selectedPackage.virtual_remain_mb) }}
-
-
- 总量
- {{ formatDataSize(selectedPackage.virtual_limit_mb) }}
-
-
-
-
-
-
-
- 真流量使用
-
- {{ formatDataSize(selectedPackage.data_usage_mb) }} / {{ formatDataSize(selectedPackage.data_limit_mb) }}
-
-
-
-
-
-
-
-
-
-
-
-
- 虚流量比例
-
-
- 1 : {{ (1 / selectedPackage.virtual_ratio).toFixed(1) }}
-
-
-
-
-
-
- 时间信息
-
-
-
-
-
- 创建时间
-
-
- {{ formatDateTime(selectedPackage.created_at) }}
-
-
-
-
-
-
- 激活时间
-
-
- {{ formatDateTime(selectedPackage.activated_at) }}
-
-
-
-
-
-
- 到期时间
-
-
-
- {{ formatDateTime(selectedPackage.expires_at) }}
-
-
- 剩余 {{ calcRemainingDays(selectedPackage.expires_at) }} 天
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/pages/agent-system/withdraw/index.vue b/src/pages/agent-system/withdraw/index.vue
index 1543685..26e4233 100644
--- a/src/pages/agent-system/withdraw/index.vue
+++ b/src/pages/agent-system/withdraw/index.vue
@@ -26,6 +26,7 @@ const pageSize = 20
const total = ref(0)
const statusFilter = ref(undefined)
const showStatusPicker = ref(false)
+const MIN_WITHDRAW_AMOUNT = 100
const statusOptions = [
{ label: '全部状态', value: undefined },
@@ -41,7 +42,7 @@ const selectedStatusName = computed(() => {
return option?.label || '状态'
})
-const tabs = [
+const tabs: Array<{ key: 'apply' | 'records', label: string }> = [
{ key: 'apply', label: '申请提现' },
{ key: 'records', label: '提现记录' },
]
@@ -51,6 +52,8 @@ const availableAmount = computed(() => {
return commissionSummary.value.available_commission / 100
})
+const canWithdrawByMinAmount = computed(() => availableAmount.value >= MIN_WITHDRAW_AMOUNT)
+
function formatAmount(amount: number) {
const yuan = (amount / 100).toFixed(2)
const parts = yuan.split('.')
@@ -95,7 +98,7 @@ async function loadCommissionSummary() {
loading.value = true
try {
const userInfo = getLoginUserInfo()
- commissionSummary.value = await getFundSummary(userInfo?.username ? { shop_name: userInfo.username } : undefined)
+ commissionSummary.value = await getFundSummary(userInfo?.username ? { username: userInfo.username } : undefined)
withdrawAmount.value = availableAmount.value.toFixed(2)
} catch (error) {
console.error('加载佣金概览失败:', error)
@@ -144,6 +147,10 @@ async function handleSubmit() {
uni.$u.toast('请输入提现金额')
return
}
+ if (amount < MIN_WITHDRAW_AMOUNT) {
+ uni.$u.toast(`满${MIN_WITHDRAW_AMOUNT}元才可提现`)
+ return
+ }
if (amount > availableAmount.value) {
uni.$u.toast('提现金额超过可用余额')
return
@@ -200,12 +207,6 @@ function loadMore() {
}
}
-function onScroll(e: any) {
- const { scrollTop, scrollHeight, clientHeight } = e.target
- if (scrollHeight - scrollTop - clientHeight < 100) {
- loadMore()
- }
-}
@@ -293,10 +294,17 @@ function onScroll(e: any) {
/>
+
+
+
+ 满100元才可提现
+
+
+
{{ submitting ? '提交中...' : '确认提现' }}
diff --git a/src/static/styles/theme.scss b/src/static/styles/theme.scss
index 53a2779..e6a8cc3 100644
--- a/src/static/styles/theme.scss
+++ b/src/static/styles/theme.scss
@@ -6,47 +6,49 @@
:root,
page {
/* === 品牌色 Brand Colors === */
- --brand-primary: #1677ff; /* 主色 - 蓝色 */
- --brand-primary-light: #4096ff; /* 主色浅 */
- --brand-primary-dark: #0958d9; /* 主色深 */
- --brand-secondary: #1e293b; /* 辅色 - 深灰/黑色 */
- --brand-accent: #ffffff; /* 强调 - 白色 */
+ --brand-primary: #2f7d32; /* 主色 */
+ --brand-primary-light: #5a9f5d; /* 主色浅 */
+ --brand-primary-dark: #245f27; /* 主色深 */
+ --brand-secondary: #1f2937; /* 辅色 */
+ --brand-tertiary: #f4fbf5; /* 次色 */
+ --brand-accent: #ffffff; /* 强调白 */
/* === 语义色 Semantic Colors === */
- --color-success: #52c41a; /* 成功 - Green */
- --color-success-bg: #f6ffed; /* 成功背景 */
- --color-warning: #faad14; /* 警告 - Amber */
- --color-warning-bg: #fffbe6; /* 警告背景 */
- --color-error: #ff4d4f; /* 错误 - Red */
- --color-error-bg: #fff2f0; /* 错误背景 */
- --color-info: #1677ff; /* 信息 - Blue(同主色) */
- --color-info-bg: #e6f7ff; /* 信息背景 */
+ --color-success: #2f7d32;
+ --color-success-bg: #edf7ee;
+ --color-warning: #b7791f;
+ --color-warning-bg: #fff7e6;
+ --color-error: #c24141;
+ --color-error-bg: #fdf1f1;
+ --color-info: var(--brand-primary);
+ --color-info-bg: var(--brand-tertiary);
/* === 文字色阶 Text Colors === */
- --text-primary: #212121; /* 标题/重要文字 */
- --text-secondary: #666666; /* 正文 */
- --text-tertiary: #999999; /* 辅助信息 */
- --text-quaternary: #cccccc; /* 禁用/占位符 */
- --text-inverse: #ffffff; /* 反色文字 */
+ --text-primary: #1f2937;
+ --text-secondary: #4b5563;
+ --text-tertiary: #6b7280;
+ --text-quaternary: #9ca3af;
+ --text-inverse: #ffffff;
/* === 背景色 Background Colors === */
- --bg-page: #faf0f5; /* 页面背景 */
- --bg-container: #ffffff; /* 容器/卡片背景 */
- --bg-elevated: #ffffff; /* 悬浮层背景 */
- --bg-muted: #f5f5f5; /* 静音背景 */
- --bg-overlay: rgba(0, 0, 0, 0.45); /* 遮罩层 */
+ --bg-page: var(--brand-tertiary);
+ --bg-container: #ffffff;
+ --bg-elevated: #ffffff;
+ --bg-muted: #f8faf8;
+ --bg-overlay: rgba(31, 41, 55, 0.45);
/* === 边框色 Border Colors === */
- --border-primary: #e8e8e8; /* 主边框 */
- --border-secondary: #f0f0f0; /* 次边框 */
- --border-light: #fafafa; /* 浅边框 */
+ --border-primary: #e3ece4;
+ --border-secondary: #edf2ee;
+ --border-light: #f7faf7;
/* === 阴影 Shadows === */
- --shadow-sm: 0 1px 3px 0 rgba(0, 0, 0, 0.06);
- --shadow-md: 0 2px 8px 0 rgba(0, 0, 0, 0.08);
- --shadow-lg: 0 4px 16px 0 rgba(0, 0, 0, 0.12);
- --shadow-xl: 0 8px 24px 0 rgba(0, 0, 0, 0.15);
- --shadow-brand: 0 4px 12px 0 rgba(22, 119, 255, 0.2);
+ --shadow-xs: 0 1px 2px 0 rgba(31, 41, 55, 0.04);
+ --shadow-sm: 0 1px 3px 0 rgba(31, 41, 55, 0.06);
+ --shadow-md: 0 4px 12px 0 rgba(31, 41, 55, 0.08);
+ --shadow-lg: 0 8px 20px 0 rgba(31, 41, 55, 0.12);
+ --shadow-xl: 0 12px 28px 0 rgba(31, 41, 55, 0.16);
+ --shadow-brand: 0 6px 18px 0 rgba(47, 125, 50, 0.18);
/* === 圆角 Radius === */
--radius-xs: 4px;
@@ -96,38 +98,53 @@ page {
--z-popover: 1060;
--z-tooltip: 1070;
--z-toast: 1080;
+
+ /* === 兼容主题别名 Compatibility Theme Aliases === */
+ --theme-primary: var(--brand-primary);
+ --theme-primary-light: var(--brand-primary-light);
+ --theme-primary-dark: var(--brand-primary-dark);
+ --theme-success: var(--color-success);
+ --theme-warning: var(--color-warning);
+ --theme-error: var(--color-error);
+ --theme-main-color: var(--text-primary);
+ --theme-content-color: var(--text-secondary);
+ --theme-tips-color: var(--text-tertiary);
+ --theme-light-color: var(--text-quaternary);
+ --theme-disabled-color: var(--text-quaternary);
+ --theme-bg-color: var(--bg-page);
+ --theme-bg-color-secondary: var(--bg-container);
+ --theme-border-color: var(--border-primary);
}
/* === 暗色主题 Dark Theme === */
.theme-dark {
- --brand-primary: #4b9cff; /* 暗色下蓝色更柔和 */
- --brand-primary-light: #69b1ff;
- --brand-primary-dark: #1668dc;
- --color-success: #73d13d;
- --color-warning: #ffc53d;
- --color-error: #ff7875;
- --color-info: #4b9cff;
+ --brand-primary-light: #74b377;
+ --brand-primary-dark: #245f27;
+ --color-warning: #f0b451;
+ --color-error: #ef7f7f;
- --text-primary: #ffffff;
- --text-secondary: #b0b8c1;
- --text-tertiary: #8a8f95;
- --text-quaternary: #6c757d;
- --text-inverse: #1a1a1a;
+ --text-primary: #f8fafc;
+ --text-secondary: #cbd5e1;
+ --text-tertiary: #94a3b8;
+ --text-quaternary: #64748b;
+ --text-inverse: #111827;
- --bg-page: #1a1a1a;
- --bg-container: #2d2d2d;
- --bg-elevated: #3a3a3a;
- --bg-muted: #242424;
+ --bg-page: #111827;
+ --bg-container: #1f2937;
+ --bg-elevated: #273548;
+ --bg-muted: #182232;
--bg-overlay: rgba(0, 0, 0, 0.65);
- --border-primary: #3a3a3a;
- --border-secondary: #2d2d2d;
- --border-light: #242424;
+ --border-primary: #314155;
+ --border-secondary: #273548;
+ --border-light: #1f2937;
+ --shadow-xs: 0 1px 2px 0 rgba(0, 0, 0, 0.2);
--shadow-sm: 0 1px 3px 0 rgba(0, 0, 0, 0.3);
- --shadow-md: 0 2px 8px 0 rgba(0, 0, 0, 0.4);
- --shadow-lg: 0 4px 16px 0 rgba(0, 0, 0, 0.5);
- --shadow-xl: 0 8px 24px 0 rgba(0, 0, 0, 0.6);
+ --shadow-md: 0 4px 12px 0 rgba(0, 0, 0, 0.35);
+ --shadow-lg: 0 8px 20px 0 rgba(0, 0, 0, 0.45);
+ --shadow-xl: 0 12px 28px 0 rgba(0, 0, 0, 0.55);
+ --shadow-brand: 0 6px 18px 0 rgba(47, 125, 50, 0.22);
}
/* === 全局重置 Global Resets === */
@@ -144,7 +161,9 @@ page {
.text-primary { color: var(--text-primary); }
.text-secondary { color: var(--text-secondary); }
.text-tertiary { color: var(--text-tertiary); }
+.text-quaternary { color: var(--text-quaternary); }
.text-brand { color: var(--brand-primary); }
+.text-brand-secondary { color: var(--brand-secondary); }
.text-success { color: var(--color-success); }
.text-warning { color: var(--color-warning); }
.text-error { color: var(--color-error); }
@@ -153,13 +172,15 @@ page {
.bg-container { background-color: var(--bg-container); }
.bg-muted { background-color: var(--bg-muted); }
.bg-brand { background-color: var(--brand-primary); }
+.bg-brand-secondary { background-color: var(--brand-secondary); }
+.bg-brand-tertiary { background-color: var(--brand-tertiary); }
.bg-brand-light { background-color: var(--brand-primary-light); }
.bg-brand-dark { background-color: var(--brand-primary-dark); }
.bg-gradient-brand { background: linear-gradient(135deg, var(--brand-primary), var(--brand-primary-light)); }
-.shadow-brand-colored { box-shadow: 0 4px 16px rgba(22, 119, 255, 0.3); }
-.shadow-brand-sm { box-shadow: 0 2px 12px rgba(22, 119, 255, 0.15); }
-.shadow-brand-xs { box-shadow: 0 2px 8px rgba(22, 119, 255, 0.2); }
+.shadow-brand-colored { box-shadow: 0 8px 22px rgba(47, 125, 50, 0.22); }
+.shadow-brand-sm { box-shadow: 0 4px 14px rgba(47, 125, 50, 0.14); }
+.shadow-brand-xs { box-shadow: 0 2px 8px rgba(47, 125, 50, 0.16); }
.border-brand { border-color: var(--brand-primary); }
@@ -241,7 +262,7 @@ page {
.input:focus {
border-color: var(--brand-primary);
outline: none;
- box-shadow: 0 0 0 3px rgba(22, 119, 255, 0.1);
+ box-shadow: 0 0 0 3px rgba(47, 125, 50, 0.12);
}
.input::placeholder {
diff --git a/src/uni.scss b/src/uni.scss
index 695ed14..659ca87 100644
--- a/src/uni.scss
+++ b/src/uni.scss
@@ -4,24 +4,24 @@
/* 颜色变量 - 使用CSS变量支持主题切换 */
/* 行为相关颜色 */
-$u-primary: var(--theme-primary);
-$u-primary-dark: var(--theme-primary-dark);
-$u-success: var(--theme-success);
-$u-warning: var(--theme-warning);
-$u-error: var(--theme-error);
+$u-primary: var(--brand-primary);
+$u-primary-dark: var(--brand-primary-dark);
+$u-success: var(--color-success);
+$u-warning: var(--color-warning);
+$u-error: var(--color-error);
/* 文字基本颜色 */
-$u-main-color: var(--theme-main-color);
-$u-content-color: var(--theme-content-color);
-$u-tips-color: var(--theme-tips-color);
-$u-light-color: var(--theme-light-color);
-$u-disabled-color: var(--theme-disabled-color);
+$u-main-color: var(--text-primary);
+$u-content-color: var(--text-secondary);
+$u-tips-color: var(--text-tertiary);
+$u-light-color: var(--text-quaternary);
+$u-disabled-color: var(--text-quaternary);
/* 背景颜色 */
-$u-bg-color: var(--theme-bg-color);
+$u-bg-color: var(--bg-page);
/* 边框颜色 */
-$u-border-color: var(--theme-border-color);
+$u-border-color: var(--border-primary);
/* 尺寸变量 */
diff --git a/types/components.d.ts b/types/components.d.ts
index 46ae5ef..6ff5ea7 100644
--- a/types/components.d.ts
+++ b/types/components.d.ts
@@ -8,6 +8,7 @@ export {}
/* prettier-ignore */
declare module 'vue' {
export interface GlobalComponents {
+ AgentFundSummaryCard: typeof import('./../src/components/AgentFundSummaryCard.vue')['default']
AgreePrivacy: typeof import('./../src/components/agree-privacy/index.vue')['default']
LangSelect: typeof import('./../src/components/lang-select/index.vue')['default']
RouterLink: typeof import('vue-router')['RouterLink']
diff --git a/uno.config.ts b/uno.config.ts
index 37f6875..c5c3aaa 100644
--- a/uno.config.ts
+++ b/uno.config.ts
@@ -44,7 +44,7 @@ export default defineConfig({
* @see https://github.com/unocss/unocss#shortcuts
*/
shortcuts: {
- 'border-base': 'border border-gray-500_10',
+ 'border-base': 'border border-[var(--border-primary)]',
'center': 'flex justify-center items-center',
},
rules: [
@@ -53,21 +53,25 @@ export default defineConfig({
theme: {
colors: {
// 主题颜色
- 'primary': 'var(--theme-primary)',
- 'success': 'var(--theme-success)',
- 'warning': 'var(--theme-warning)',
- 'error': 'var(--theme-error)',
+ 'primary': 'var(--brand-primary)',
+ 'secondary': 'var(--brand-secondary)',
+ 'tertiary': 'var(--brand-tertiary)',
+ 'success': 'var(--color-success)',
+ 'warning': 'var(--color-warning)',
+ 'error': 'var(--color-error)',
// 文字颜色
- 'text-main': 'var(--theme-main-color)',
- 'text-content': 'var(--theme-content-color)',
- 'text-tips': 'var(--theme-tips-color)',
- 'text-light': 'var(--theme-light-color)',
- 'text-disabled': 'var(--theme-disabled-color)',
+ 'text-main': 'var(--text-primary)',
+ 'text-content': 'var(--text-secondary)',
+ 'text-tips': 'var(--text-tertiary)',
+ 'text-light': 'var(--text-quaternary)',
+ 'text-disabled': 'var(--text-quaternary)',
// 背景颜色
- 'bg-main': 'var(--theme-bg-color)',
- 'bg-secondary': 'var(--theme-bg-color-secondary)',
+ 'bg-main': 'var(--bg-page)',
+ 'bg-secondary': 'var(--bg-container)',
+ 'bg-muted': 'var(--bg-muted)',
// 边框颜色
- 'border-main': 'var(--theme-border-color)',
+ 'border-main': 'var(--border-primary)',
+ 'border-secondary': 'var(--border-secondary)',
},
},
transformers: [