From 8efeb9a5bd45a4e929a8570b49fd3d5f40f62cd9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E8=B5=B5=E5=BF=A0=E6=9E=97?= <170083662@qq.com>
Date: Mon, 18 Aug 2025 21:20:03 +0800
Subject: [PATCH] =?UTF-8?q?feat(dealer):=20=E9=87=8D=E6=9E=84=E5=88=86?=
=?UTF-8?q?=E9=94=80=E4=B8=AD=E5=BF=83=E9=A1=B5=E9=9D=A2?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- 优化了分销中心首页、分销订单、提现申请和团队管理页面的视觉和功能- 新增了渐变设计指南和主题选择器组件
-改进了数据展示、功能导航和用户体验
---
docs/DEALER_OPTIMIZATION.md | 137 ++++++++++
docs/GRADIENT_DESIGN_GUIDE.md | 206 +++++++++++++++
REQUEST_USAGE.md => docs/REQUEST_USAGE.md | 0
src/components/GradientThemeSelector.tsx | 113 ++++++++
src/dealer/index.tsx | 301 ++++++++++++++--------
src/dealer/orders/index.tsx | 139 +++++++++-
src/dealer/team/index.tsx | 252 +++++++++++++++++-
src/dealer/withdraw/index.tsx | 238 +++++++++++++++--
src/styles/gradients.ts | 223 ++++++++++++++++
9 files changed, 1478 insertions(+), 131 deletions(-)
create mode 100644 docs/DEALER_OPTIMIZATION.md
create mode 100644 docs/GRADIENT_DESIGN_GUIDE.md
rename REQUEST_USAGE.md => docs/REQUEST_USAGE.md (100%)
create mode 100644 src/components/GradientThemeSelector.tsx
create mode 100644 src/styles/gradients.ts
diff --git a/docs/DEALER_OPTIMIZATION.md b/docs/DEALER_OPTIMIZATION.md
new file mode 100644
index 0000000..9423e8c
--- /dev/null
+++ b/docs/DEALER_OPTIMIZATION.md
@@ -0,0 +1,137 @@
+# 分销中心页面优化总结
+
+## 🔍 原始问题分析
+
+### 主要问题
+1. **数据展示错误**:成为经销商时间显示的是 `money` 字段
+2. **功能缺失**:缺少导航到其他分销功能的入口
+3. **用户体验差**:页面单调,缺少视觉层次
+4. **代码问题**:路径错误,硬编码数据
+
+## 🚀 优化方案
+
+### 1. 分销中心首页 (`/dealer/index.tsx`)
+
+#### 优化内容
+- **视觉升级**:使用渐变背景和卡片设计
+- **功能导航**:添加4个核心功能的快捷入口
+- **数据可视化**:佣金和团队数据的直观展示
+- **状态区分**:非经销商和经销商状态的不同展示
+
+#### 新增功能
+- 用户头像和基本信息展示
+- 佣金统计(可提现、冻结中、累计收益)
+- 团队统计(一级、二级、三级成员)
+- 功能导航网格(分销订单、提现申请、我的团队、推广二维码)
+
+### 2. 分销订单页面 (`/dealer/orders/index.tsx`)
+
+#### 优化内容
+- **标签页设计**:全部、待结算、已完成
+- **统计面板**:总订单、总佣金、待结算金额
+- **下拉刷新**:支持手动刷新数据
+- **订单卡片**:清晰的订单信息展示
+
+#### 新增功能
+- 订单状态标签和颜色区分
+- 佣金预计和实际到账显示
+- 客户信息和订单时间
+
+### 3. 提现申请页面 (`/dealer/withdraw/index.tsx`)
+
+#### 优化内容
+- **双标签页**:申请提现 + 提现记录
+- **余额卡片**:渐变设计显示可提现余额
+- **快捷金额**:预设金额按钮和全部提现
+- **提现方式**:微信、支付宝、银行卡选择
+
+#### 新增功能
+- 提现规则说明(最低金额、手续费)
+- 提现记录状态跟踪
+- 表单验证和用户体验优化
+
+### 4. 团队管理页面 (`/dealer/team/index.tsx`)
+
+#### 优化内容
+- **团队总览**:统计卡片和层级分布图
+- **成员分级**:按一级、二级、三级分类显示
+- **成员卡片**:头像、等级、贡献数据
+- **进度条**:可视化层级分布比例
+
+#### 新增功能
+- 成员活跃状态标识
+- 贡献佣金和订单数统计
+- 下级成员数量显示
+- 等级图标和颜色区分
+
+## 📊 技术改进
+
+### 1. 数据处理
+```typescript
+// 格式化金额
+const formatMoney = (money?: string) => {
+ if (!money) return '0.00'
+ return parseFloat(money).toFixed(2)
+}
+
+// 格式化时间
+const formatTime = (time?: string) => {
+ if (!time) return '-'
+ return new Date(time).toLocaleDateString()
+}
+```
+
+### 2. 状态管理
+- 使用真实的 `dealerUser` 数据
+- 正确的字段映射和显示
+- 错误处理和加载状态
+
+### 3. 导航优化
+- 修复路径错误:`/dealer/apply/add` 而不是 `/pages/dealer/apply/add`
+- 统一的页面跳转方法
+- 清晰的功能入口
+
+## 🎨 UI/UX 改进
+
+### 1. 视觉设计
+- **渐变背景**:增加视觉吸引力
+- **卡片设计**:信息分组和层次感
+- **图标系统**:统一的图标风格
+- **颜色系统**:语义化的颜色使用
+
+### 2. 交互体验
+- **下拉刷新**:实时数据更新
+- **快捷操作**:减少用户操作步骤
+- **状态反馈**:清晰的状态提示
+- **响应式布局**:适配不同屏幕尺寸
+
+### 3. 信息架构
+- **功能分组**:相关功能集中展示
+- **数据层次**:重要信息突出显示
+- **导航清晰**:明确的页面结构
+
+## 🔧 待完善功能
+
+### 1. 数据接口集成
+- 连接真实的分销订单 API
+- 实现提现申请和记录查询
+- 团队成员数据的实时获取
+
+### 2. 功能增强
+- 推广二维码生成和分享
+- 佣金明细和结算记录
+- 团队成员邀请和管理
+
+### 3. 性能优化
+- 列表虚拟化(大量数据时)
+- 图片懒加载
+- 缓存策略优化
+
+## 📱 移动端适配
+
+- 响应式设计确保各种屏幕尺寸下的良好体验
+- 触摸友好的交互元素
+- 合适的字体大小和间距
+- 底部安全区域处理
+
+这次优化大幅提升了分销中心的用户体验和功能完整性,为后续的功能扩展奠定了良好基础。
diff --git a/docs/GRADIENT_DESIGN_GUIDE.md b/docs/GRADIENT_DESIGN_GUIDE.md
new file mode 100644
index 0000000..926cbf6
--- /dev/null
+++ b/docs/GRADIENT_DESIGN_GUIDE.md
@@ -0,0 +1,206 @@
+# 🎨 渐变设计指南
+
+## 概述
+
+我为你的分销中心设计了一套完整的渐变主题系统,包含多种美观的渐变方案和统一的设计语言。
+
+## 🌈 渐变主题方案
+
+### 1. 预设主题
+
+| 主题名称 | 颜色搭配 | 适用场景 | 视觉效果 |
+|---------|---------|---------|---------|
+| **ocean** | 蓝紫渐变 | 科技、专业 | 🌊 海洋般的深邃感 |
+| **sunset** | 橙红渐变 | 活力、热情 | 🌅 日落般的温暖感 |
+| **fresh** | 蓝绿渐变 | 清新、活力 | 🍃 清新自然的感觉 |
+| **nature** | 绿青渐变 | 生机、成长 | 🌱 生机勃勃的活力 |
+| **warm** | 金粉渐变 | 温馨、友好 | ☀️ 温暖亲和的感觉 |
+| **elegant** | 淡彩渐变 | 优雅、精致 | 💎 优雅精致的品味 |
+| **royal** | 皇家紫蓝 | 高贵、权威 | 👑 高贵典雅的气质 |
+| **fire** | 火焰粉红 | 激情、浪漫 | 🔥 激情浪漫的氛围 |
+
+### 2. 业务场景渐变
+
+```typescript
+// 分销商相关
+dealer: {
+ header: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',
+ card: 'linear-gradient(135deg, #ffffff 0%, #f8fafc 100%)',
+ success: 'linear-gradient(135deg, #10b981 0%, #34d399 100%)',
+ warning: 'linear-gradient(135deg, #f59e0b 0%, #fbbf24 100%)',
+ danger: 'linear-gradient(135deg, #ef4444 0%, #f87171 100%)',
+ info: 'linear-gradient(135deg, #3b82f6 0%, #60a5fa 100%)'
+}
+
+// 金额相关
+money: {
+ available: 'linear-gradient(135deg, #10b981 0%, #059669 100%)', // 可提现 - 绿色
+ frozen: 'linear-gradient(135deg, #3b82f6 0%, #2563eb 100%)', // 冻结中 - 蓝色
+ total: 'linear-gradient(135deg, #f59e0b 0%, #d97706 100%)' // 累计 - 橙色
+}
+```
+
+## 🎯 设计特点
+
+### 1. 视觉层次
+- **主背景**:动态渐变,根据用户ID自动选择
+- **卡片背景**:微妙的白色渐变,增加层次感
+- **装饰元素**:半透明圆形,增加空间感
+
+### 2. 色彩心理学
+- **蓝色系**:信任、专业、稳定
+- **绿色系**:成长、财富、安全
+- **橙色系**:活力、温暖、友好
+- **紫色系**:高贵、创新、神秘
+
+### 3. 交互反馈
+- **悬停效果**:轻微的亮度变化
+- **选中状态**:边框高亮
+- **加载状态**:渐变动画
+
+## 🛠️ 使用方法
+
+### 1. 基础使用
+
+```tsx
+import { businessGradients, cardGradients } from '@/styles/gradients'
+
+// 使用预设的业务渐变
+
+ 内容
+
+
+// 使用卡片渐变
+
+ 卡片内容
+
+```
+
+### 2. 动态主题
+
+```tsx
+import { gradientUtils } from '@/styles/gradients'
+
+// 根据用户ID获取主题
+const userTheme = gradientUtils.getThemeByUserId(userId)
+
+
+ 个性化内容
+
+```
+
+### 3. 自定义渐变
+
+```tsx
+import { gradientUtils } from '@/styles/gradients'
+
+// 创建自定义渐变
+const customGradient = gradientUtils.createGradient('#ff6b6b', '#4ecdc4', '45deg')
+
+
+ 自定义内容
+
+```
+
+## 🎨 设计原则
+
+### 1. 一致性
+- 所有页面使用统一的渐变系统
+- 相同功能使用相同的颜色语义
+- 保持视觉风格的连贯性
+
+### 2. 可访问性
+- 确保文字与背景有足够的对比度
+- 支持深色模式适配
+- 考虑色盲用户的体验
+
+### 3. 性能优化
+- 使用 CSS 渐变而非图片
+- 避免过度复杂的渐变效果
+- 合理使用动画和过渡
+
+## 📱 移动端适配
+
+### 1. 响应式设计
+```css
+/* 小屏幕优化 */
+@media (max-width: 768px) {
+ .gradient-header {
+ background-size: 200% 200%;
+ animation: gradientShift 8s ease infinite;
+ }
+}
+```
+
+### 2. 性能考虑
+- 在低端设备上简化渐变效果
+- 使用 `will-change` 属性优化动画
+- 避免在滚动时使用复杂渐变
+
+## 🔧 高级功能
+
+### 1. 主题切换器
+```tsx
+import GradientThemeSelector from '@/components/GradientThemeSelector'
+
+ setShowThemeSelector(false)}
+ onSelect={handleThemeSelect}
+ currentTheme={currentTheme}
+/>
+```
+
+### 2. 动画渐变
+```tsx
+import { animatedGradients } from '@/styles/gradients'
+
+
+ 动态流动的渐变背景
+
+```
+
+### 3. 玻璃态效果
+```tsx
+import { cardGradients } from '@/styles/gradients'
+
+
+ 毛玻璃效果卡片
+
+```
+
+## 🎯 最佳实践
+
+### 1. 渐变方向
+- **135度**:最常用,自然舒适
+- **90度**:垂直渐变,适合长条内容
+- **45度**:对角渐变,动感活泼
+
+### 2. 颜色选择
+- 选择色相相近的颜色
+- 避免过于强烈的对比
+- 考虑品牌色的融入
+
+### 3. 层次搭配
+- 主背景:鲜艳渐变
+- 卡片背景:淡雅渐变
+- 文字:纯色或微渐变
+
+## 🚀 未来扩展
+
+### 1. 主题商店
+- 更多预设主题
+- 用户自定义主题
+- 主题分享功能
+
+### 2. 智能推荐
+- 基于使用习惯推荐主题
+- 根据时间自动切换主题
+- 情境感知的主题选择
+
+### 3. 高级效果
+- 3D 渐变效果
+- 粒子背景
+- 交互式渐变
+
+这套渐变系统不仅美观,还具有很强的扩展性和可维护性,为你的应用提供了专业级的视觉体验!
diff --git a/REQUEST_USAGE.md b/docs/REQUEST_USAGE.md
similarity index 100%
rename from REQUEST_USAGE.md
rename to docs/REQUEST_USAGE.md
diff --git a/src/components/GradientThemeSelector.tsx b/src/components/GradientThemeSelector.tsx
new file mode 100644
index 0000000..b1900d6
--- /dev/null
+++ b/src/components/GradientThemeSelector.tsx
@@ -0,0 +1,113 @@
+import React, { useState } from 'react'
+import { View, Text } from '@tarojs/components'
+import { Popup, Button } from '@nutui/nutui-react-taro'
+import { gradientThemes, GradientTheme } from '@/styles/gradients'
+
+interface GradientThemeSelectorProps {
+ visible: boolean
+ onClose: () => void
+ onSelect: (theme: GradientTheme) => void
+ currentTheme?: GradientTheme
+}
+
+const GradientThemeSelector: React.FC = ({
+ visible,
+ onClose,
+ onSelect,
+ currentTheme
+}) => {
+ const [selectedTheme, setSelectedTheme] = useState(currentTheme || null)
+
+ const handleThemeSelect = (theme: GradientTheme) => {
+ setSelectedTheme(theme)
+ }
+
+ const handleConfirm = () => {
+ if (selectedTheme) {
+ onSelect(selectedTheme)
+ onClose()
+ }
+ }
+
+ const renderThemeItem = (theme: GradientTheme) => {
+ const isSelected = selectedTheme?.name === theme.name
+
+ return (
+ handleThemeSelect(theme)}
+ >
+ {/* 渐变预览 */}
+
+
+
+ 预览
+
+
+
+
+ {/* 主题信息 */}
+
+
+ {theme.description.split(' - ')[0]}
+
+
+ {theme.description.split(' - ')[1]}
+
+
+
+ {/* 选中标识 */}
+ {isSelected && (
+
+ ✓
+
+ )}
+
+ )
+ }
+
+ return (
+
+
+
+ 选择主题
+
+
+
+
+ 选择您喜欢的渐变主题,让界面更符合您的个人风格
+
+
+ {/* 主题网格 */}
+
+ {gradientThemes.map(renderThemeItem)}
+
+
+ {/* 确认按钮 */}
+
+
+
+ )
+}
+
+export default GradientThemeSelector
diff --git a/src/dealer/index.tsx b/src/dealer/index.tsx
index 14750cd..a029bc0 100644
--- a/src/dealer/index.tsx
+++ b/src/dealer/index.tsx
@@ -1,7 +1,18 @@
import React from 'react'
-import { View, Text } from '@tarojs/components'
-import { Button, Cell, CellGroup, Tag } from '@nutui/nutui-react-taro'
-import { useDealerUser } from '@/hooks/useDealerUser'
+import {View, Text} from '@tarojs/components'
+import {Button, Cell, CellGroup, Tag, Grid, Avatar, Divider} from '@nutui/nutui-react-taro'
+import {
+ User,
+ Shopping,
+ Dongdong,
+ Share,
+ Service,
+ ArrowRight,
+ Purse,
+ People
+} from '@nutui/icons-react-taro'
+import {useDealerUser} from '@/hooks/useDealerUser'
+import { gradientUtils, businessGradients, cardGradients, textGradients } from '@/styles/gradients'
import Taro from '@tarojs/taro'
const DealerIndex: React.FC = () => {
@@ -15,10 +26,39 @@ const DealerIndex: React.FC = () => {
// 跳转到申请页面
const navigateToApply = () => {
Taro.navigateTo({
- url: '/pages/dealer/apply/add'
+ url: '/dealer/apply/add'
})
}
+ // 导航到各个功能页面
+ const navigateToPage = (url: string) => {
+ Taro.navigateTo({url})
+ }
+
+ // 格式化金额
+ const formatMoney = (money?: string) => {
+ if (!money) return '0.00'
+ return parseFloat(money).toFixed(2)
+ }
+
+ // 格式化时间
+ const formatTime = (time?: string) => {
+ if (!time) return '-'
+ return new Date(time).toLocaleDateString()
+ }
+
+ // 获取用户主题
+ const userTheme = gradientUtils.getThemeByUserId(dealerUser?.userId)
+
+ // 获取渐变背景
+ const getGradientBackground = (themeColor?: string) => {
+ if (themeColor) {
+ const darkerColor = gradientUtils.adjustColorBrightness(themeColor, -30)
+ return gradientUtils.createGradient(themeColor, darkerColor)
+ }
+ return userTheme.background
+ }
+
if (error) {
return (
@@ -34,123 +74,178 @@ const DealerIndex: React.FC = () => {
return (
- {/* 页面标题 */}
-
-
- {dealerUser?.realName}
-
- 推荐人ID:{dealerUser?.refereeId}
-
-
- {!dealerUser ? (
- // 非经销商状态
-
-
- 您还不是经销商
-
- 成为经销商后可享受专属价格和佣金收益
-
-
-
-
- ) : (
- // 经销商信息展示
-
- {/* 状态卡片 */}
-
-
- 经销商状态
-
- {dealerUser.realName}
-
-
-
- {/* 基本信息 */}
-
- |
- |
-
+ {/*头部信息*/}
+ {dealerUser && (
+
+ {/* 装饰性背景元素 */}
+
+
+
+
+ }
+ className="mr-4"
+ style={{
+ border: '2px solid rgba(255, 255, 255, 0.3)',
+ boxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)'
+ }}
/>
-
- |
-
- {/* 操作按钮 */}
-
-
+
+
+ {dealerUser?.realName || '分销商'}
+
+
+ ID: {dealerUser.userId} | 推荐人: {dealerUser.refereeId || '无'}
+
+
+
+ 加入时间
+
+ {formatTime(dealerUser.createTime)}
+
+
+ )}
- {/* 经销商权益 */}
-
- 经销商权益
-
-
- • 享受经销商专属价格
-
-
- • 获得推广佣金收益
-
-
- • 优先获得新品信息
-
-
- • 专属客服支持
-
+ {/* 佣金统计卡片 */}
+ {dealerUser && (
+
+ 佣金统计
+
+
+
+ ¥{formatMoney(dealerUser.money)}
+
+ 可提现
+
+
+
+ ¥{formatMoney(dealerUser.freezeMoney)}
+
+ 冻结中
+
+
+
+ ¥{formatMoney(dealerUser.totalMoney)}
+
+ 累计收益
+
+ )}
- {/* 佣金统计 */}
-
- 佣金统计
+ {/* 团队统计 */}
+ {dealerUser && (
+
+
+ 我的团队
+ navigateToPage('/dealer/team/index')}
+ >
+ 查看详情
+
+
- 0
- 今日佣金
+
+ {dealerUser.firstNum || 0}
+
+ 一级成员
- 0
- 本月佣金
+
+ {dealerUser.secondNum || 0}
+
+ 二级成员
- 0
- 累计佣金
+
+ {dealerUser.thirdNum || 0}
+
+ 三级成员
+ )}
+
+ {/* 功能导航 */}
+
+ 分销工具
+
+ navigateToPage('/dealer/orders/index')}>
+
+
+
+
+ 分销订单
+
+
+
+ navigateToPage('/dealer/withdraw/index')}>
+
+
+
+
+ 提现申请
+
+
+
+ navigateToPage('/dealer/team/index')}>
+
+
+
+
+ 我的团队
+
+
+
+ navigateToPage('/dealer/qrcode/index')}>
+
+
+
+
+ 推广二维码
+
+
+
- )}
-
- {/* 刷新按钮 */}
-
-
- 点击刷新数据
-
+
+ {/* 底部安全区域 */}
+
)
}
diff --git a/src/dealer/orders/index.tsx b/src/dealer/orders/index.tsx
index 960a1f8..54dd84e 100644
--- a/src/dealer/orders/index.tsx
+++ b/src/dealer/orders/index.tsx
@@ -1,13 +1,140 @@
-import React from 'react'
+import React, { useState } from 'react'
import { View, Text } from '@tarojs/components'
-import { Cell, Empty } from '@nutui/nutui-react-taro'
+import { Cell, Empty, Tabs, Tag, Button, PullToRefresh } from '@nutui/nutui-react-taro'
const DealerOrders: React.FC = () => {
+ const [activeTab, setActiveTab] = useState('0')
+ const [refreshing, setRefreshing] = useState(false)
+
+ // 模拟订单数据
+ const mockOrders = [
+ {
+ id: '1',
+ orderNo: 'DD202412180001',
+ customerName: '张三',
+ amount: '299.00',
+ commission: '29.90',
+ status: 'completed',
+ createTime: '2024-12-18 10:30:00'
+ },
+ {
+ id: '2',
+ orderNo: 'DD202412180002',
+ customerName: '李四',
+ amount: '599.00',
+ commission: '59.90',
+ status: 'pending',
+ createTime: '2024-12-18 14:20:00'
+ }
+ ]
+
+ const getStatusText = (status: string) => {
+ switch (status) {
+ case 'completed': return '已完成'
+ case 'pending': return '待结算'
+ case 'cancelled': return '已取消'
+ default: return '未知'
+ }
+ }
+
+ const getStatusColor = (status: string) => {
+ switch (status) {
+ case 'completed': return 'success'
+ case 'pending': return 'warning'
+ case 'cancelled': return 'danger'
+ default: return 'default'
+ }
+ }
+
+ const handleRefresh = async () => {
+ setRefreshing(true)
+ // 模拟刷新
+ setTimeout(() => {
+ setRefreshing(false)
+ }, 1000)
+ }
+
+ const renderOrderItem = (order: any) => (
+
+
+
+
+ 订单号:{order.orderNo}
+
+
+ 客户:{order.customerName}
+
+
+
+ {getStatusText(order.status)}
+
+
+
+
+
+
+ 订单金额:¥{order.amount}
+
+
+ 预计佣金:¥{order.commission}
+
+
+
+ {order.createTime}
+
+
+
+ )
+
return (
-
- 分销订单
-
-
+
+ {/* 统计卡片 */}
+
+
+
+ 2
+ 总订单
+
+
+ ¥89.80
+ 总佣金
+
+
+ ¥29.90
+ 待结算
+
+
+
+
+ {/* 订单列表 */}
+
+
+
+
+ {mockOrders.length > 0 ? (
+ mockOrders.map(renderOrderItem)
+ ) : (
+
+ )}
+
+
+
+
+
+
+ {mockOrders.filter(o => o.status === 'pending').map(renderOrderItem)}
+
+
+
+
+
+ {mockOrders.filter(o => o.status === 'completed').map(renderOrderItem)}
+
+
+
)
}
diff --git a/src/dealer/team/index.tsx b/src/dealer/team/index.tsx
index 9291bae..4955023 100644
--- a/src/dealer/team/index.tsx
+++ b/src/dealer/team/index.tsx
@@ -1,13 +1,255 @@
-import React from 'react'
+import React, { useState } from 'react'
import { View, Text } from '@tarojs/components'
-import { Empty } from '@nutui/nutui-react-taro'
+import { Empty, Tabs, Avatar, Tag, Cell, Progress } from '@nutui/nutui-react-taro'
+import { User, Crown, Star } from '@nutui/icons-react-taro'
+import { businessGradients, cardGradients } from '@/styles/gradients'
const DealerTeam: React.FC = () => {
- return (
+ const [activeTab, setActiveTab] = useState('0')
+
+ // 模拟团队数据
+ const teamStats = {
+ total: 28,
+ firstLevel: 12,
+ secondLevel: 10,
+ thirdLevel: 6,
+ monthlyCommission: '2,580.50'
+ }
+
+ const teamMembers = [
+ {
+ id: '1',
+ name: '张小明',
+ level: 1,
+ joinTime: '2024-11-15',
+ orderCount: 15,
+ commission: '580.50',
+ status: 'active',
+ avatar: '',
+ subMembers: 3
+ },
+ {
+ id: '2',
+ name: '李小红',
+ level: 1,
+ joinTime: '2024-12-01',
+ orderCount: 8,
+ commission: '320.00',
+ status: 'active',
+ avatar: '',
+ subMembers: 2
+ },
+ {
+ id: '3',
+ name: '王小华',
+ level: 2,
+ joinTime: '2024-12-10',
+ orderCount: 5,
+ commission: '150.00',
+ status: 'inactive',
+ avatar: '',
+ subMembers: 0
+ }
+ ]
+
+ const getLevelColor = (level: number) => {
+ switch (level) {
+ case 1: return '#f59e0b'
+ case 2: return '#8b5cf6'
+ case 3: return '#ec4899'
+ default: return '#6b7280'
+ }
+ }
+
+ const getLevelIcon = (level: number) => {
+ switch (level) {
+ case 1: return
+ case 2: return
+ case 3: return
+ default: return
+ }
+ }
+
+ const renderMemberItem = (member: any) => (
+
+
+ }
+ className="mr-3"
+ />
+
+
+
+ {member.name}
+
+ {getLevelIcon(member.level)}
+
+ {member.level}级
+
+
+
+ 加入时间:{member.joinTime}
+
+
+
+
+ {member.status === 'active' ? '活跃' : '沉默'}
+
+
+
+
+
+
+
+ {member.orderCount}
+
+ 订单数
+
+
+
+ ¥{member.commission}
+
+ 贡献佣金
+
+
+
+ {member.subMembers}
+
+ 下级成员
+
+
+
+ )
+
+ const renderOverview = () => (
+
+ {/* 团队统计卡片 */}
+
+ {/* 装饰背景 */}
+
+
+
+
+ 团队总览
+
+
+ {teamStats.total}
+ 团队总人数
+
+
+ ¥{teamStats.monthlyCommission}
+ 本月团队佣金
+
+
+
+
+
+ {/* 层级分布 */}
+
+ 层级分布
+
+
+
+
+ 一级成员
+
+
+ {teamStats.firstLevel}
+
+
+
+
+
+
+
+ 二级成员
+
+
+ {teamStats.secondLevel}
+
+
+
+
+
+
+
+ 三级成员
+
+
+ {teamStats.thirdLevel}
+
+
+
+
+
+
+ {/* 最新成员 */}
+
+ 最新成员
+ {teamMembers.slice(0, 3).map(renderMemberItem)}
+
+
+ )
+
+ const renderMemberList = (level?: number) => (
- 我的团队
+ {teamMembers
+ .filter(member => !level || member.level === level)
+ .map(renderMemberItem)}
+
+ {teamMembers.filter(member => !level || member.level === level).length === 0 && (
+
+ )}
+
+ )
+
+ return (
+
+
+
+ {renderOverview()}
+
+
+
+ {renderMemberList(1)}
+
+
+
+ {renderMemberList(2)}
+
-
+
+ {renderMemberList(3)}
+
+
)
}
diff --git a/src/dealer/withdraw/index.tsx b/src/dealer/withdraw/index.tsx
index a2ce148..9d154a8 100644
--- a/src/dealer/withdraw/index.tsx
+++ b/src/dealer/withdraw/index.tsx
@@ -1,35 +1,239 @@
-import React from 'react'
+import React, { useState, useRef } from 'react'
import { View, Text } from '@tarojs/components'
-import { Cell, Button, Form, Input } from '@nutui/nutui-react-taro'
+import {
+ Cell,
+ Button,
+ Form,
+ Input,
+ CellGroup,
+ Radio,
+ Tabs,
+ Tag,
+ Empty
+} from '@nutui/nutui-react-taro'
+import { Money, ArrowRight } from '@nutui/icons-react-taro'
+import { businessGradients, cardGradients } from '@/styles/gradients'
+import Taro from '@tarojs/taro'
const DealerWithdraw: React.FC = () => {
- return (
+ const [activeTab, setActiveTab] = useState('0')
+ const [selectedAccount, setSelectedAccount] = useState('')
+ const formRef = useRef(null)
+
+ // 模拟可提现金额
+ const availableAmount = '1,288.50'
+
+ // 模拟提现记录
+ const withdrawRecords = [
+ {
+ id: '1',
+ amount: '500.00',
+ account: '尾号1234',
+ status: 'completed',
+ createTime: '2024-12-15 10:30:00',
+ completeTime: '2024-12-15 16:20:00'
+ },
+ {
+ id: '2',
+ amount: '300.00',
+ account: '尾号1234',
+ status: 'pending',
+ createTime: '2024-12-18 09:15:00'
+ }
+ ]
+
+ const getStatusText = (status: string) => {
+ switch (status) {
+ case 'completed': return '已到账'
+ case 'pending': return '处理中'
+ case 'rejected': return '已拒绝'
+ default: return '未知'
+ }
+ }
+
+ const getStatusColor = (status: string) => {
+ switch (status) {
+ case 'completed': return 'success'
+ case 'pending': return 'warning'
+ case 'rejected': return 'danger'
+ default: return 'default'
+ }
+ }
+
+ const handleSubmit = (values: any) => {
+ console.log('提现申请:', values)
+ Taro.showToast({
+ title: '提现申请已提交',
+ icon: 'success'
+ })
+ }
+
+ const quickAmounts = ['100', '300', '500', '1000']
+
+ const setQuickAmount = (amount: string) => {
+ formRef.current?.setFieldsValue({ amount })
+ }
+
+ const setAllAmount = () => {
+ formRef.current?.setFieldsValue({ amount: availableAmount.replace(',', '') })
+ }
+
+ const renderWithdrawForm = () => (
- 提现申请
-
-
)
+
+ const renderWithdrawRecords = () => (
+
+ {withdrawRecords.length > 0 ? (
+ withdrawRecords.map(record => (
+
+
+
+
+ 提现金额:¥{record.amount}
+
+
+ 提现账户:{record.account}
+
+
+
+ {getStatusText(record.status)}
+
+
+
+
+ 申请时间:{record.createTime}
+ {record.completeTime && (
+
+ 完成时间:{record.completeTime}
+
+ )}
+
+
+ ))
+ ) : (
+
+ )}
+
+ )
+
+ return (
+
+
+
+ {renderWithdrawForm()}
+
+
+
+ {renderWithdrawRecords()}
+
+
+
+ )
}
export default DealerWithdraw
diff --git a/src/styles/gradients.ts b/src/styles/gradients.ts
new file mode 100644
index 0000000..ff522b9
--- /dev/null
+++ b/src/styles/gradients.ts
@@ -0,0 +1,223 @@
+/**
+ * 渐变主题配置
+ * 提供统一的渐变样式管理
+ */
+
+export interface GradientTheme {
+ name: string
+ primary: string
+ secondary?: string
+ background: string
+ textColor: string
+ description: string
+}
+
+// 预定义渐变主题
+export const gradientThemes: GradientTheme[] = [
+ {
+ name: 'ocean',
+ primary: '#667eea',
+ secondary: '#764ba2',
+ background: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',
+ textColor: '#ffffff',
+ description: '海洋蓝紫 - 科技感与专业感'
+ },
+ {
+ name: 'sunset',
+ primary: '#f093fb',
+ secondary: '#f5576c',
+ background: 'linear-gradient(135deg, #f093fb 0%, #f5576c 100%)',
+ textColor: '#ffffff',
+ description: '日落橙红 - 活力与热情'
+ },
+ {
+ name: 'fresh',
+ primary: '#4facfe',
+ secondary: '#00f2fe',
+ background: 'linear-gradient(135deg, #4facfe 0%, #00f2fe 100%)',
+ textColor: '#ffffff',
+ description: '清新蓝绿 - 清新与活力'
+ },
+ {
+ name: 'nature',
+ primary: '#43e97b',
+ secondary: '#38f9d7',
+ background: 'linear-gradient(135deg, #43e97b 0%, #38f9d7 100%)',
+ textColor: '#ffffff',
+ description: '自然绿青 - 生机与成长'
+ },
+ {
+ name: 'warm',
+ primary: '#fa709a',
+ secondary: '#fee140',
+ background: 'linear-gradient(135deg, #fa709a 0%, #fee140 100%)',
+ textColor: '#ffffff',
+ description: '温暖金粉 - 温馨与友好'
+ },
+ {
+ name: 'elegant',
+ primary: '#a8edea',
+ secondary: '#fed6e3',
+ background: 'linear-gradient(135deg, #a8edea 0%, #fed6e3 100%)',
+ textColor: '#374151',
+ description: '优雅淡彩 - 柔和与精致'
+ },
+ {
+ name: 'royal',
+ primary: '#667eea',
+ secondary: '#764ba2',
+ background: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',
+ textColor: '#ffffff',
+ description: '皇家紫蓝 - 高贵与权威'
+ },
+ {
+ name: 'fire',
+ primary: '#ff9a9e',
+ secondary: '#fecfef',
+ background: 'linear-gradient(135deg, #ff9a9e 0%, #fecfef 100%)',
+ textColor: '#ffffff',
+ description: '火焰粉红 - 激情与浪漫'
+ }
+]
+
+// 业务场景渐变
+export const businessGradients = {
+ // 分销商相关
+ dealer: {
+ header: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',
+ card: 'linear-gradient(135deg, #ffffff 0%, #f8fafc 100%)',
+ success: 'linear-gradient(135deg, #10b981 0%, #34d399 100%)',
+ warning: 'linear-gradient(135deg, #f59e0b 0%, #fbbf24 100%)',
+ danger: 'linear-gradient(135deg, #ef4444 0%, #f87171 100%)',
+ info: 'linear-gradient(135deg, #3b82f6 0%, #60a5fa 100%)'
+ },
+
+ // 订单相关
+ order: {
+ pending: 'linear-gradient(135deg, #fbbf24 0%, #f59e0b 100%)',
+ completed: 'linear-gradient(135deg, #10b981 0%, #059669 100%)',
+ cancelled: 'linear-gradient(135deg, #ef4444 0%, #dc2626 100%)',
+ processing: 'linear-gradient(135deg, #3b82f6 0%, #2563eb 100%)'
+ },
+
+ // 金额相关
+ money: {
+ available: 'linear-gradient(135deg, #10b981 0%, #059669 100%)',
+ frozen: 'linear-gradient(135deg, #3b82f6 0%, #2563eb 100%)',
+ total: 'linear-gradient(135deg, #f59e0b 0%, #d97706 100%)'
+ }
+}
+
+// 卡片渐变样式
+export const cardGradients = {
+ glass: {
+ background: 'linear-gradient(135deg, rgba(255, 255, 255, 0.1) 0%, rgba(255, 255, 255, 0.05) 100%)',
+ border: '1px solid rgba(255, 255, 255, 0.2)',
+ backdropFilter: 'blur(10px)'
+ },
+
+ subtle: {
+ background: 'linear-gradient(135deg, #ffffff 0%, #f8fafc 100%)',
+ border: '1px solid rgba(255, 255, 255, 0.8)',
+ boxShadow: '0 10px 25px rgba(0, 0, 0, 0.1), 0 4px 10px rgba(0, 0, 0, 0.05)'
+ },
+
+ elevated: {
+ background: 'linear-gradient(135deg, #ffffff 0%, #f1f5f9 100%)',
+ border: '1px solid rgba(255, 255, 255, 0.9)',
+ boxShadow: '0 20px 40px rgba(0, 0, 0, 0.1), 0 8px 16px rgba(0, 0, 0, 0.06)'
+ }
+}
+
+// 文字渐变样式
+export const textGradients = {
+ primary: {
+ background: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',
+ WebkitBackgroundClip: 'text',
+ WebkitTextFillColor: 'transparent'
+ },
+
+ success: {
+ background: 'linear-gradient(135deg, #10b981 0%, #059669 100%)',
+ WebkitBackgroundClip: 'text',
+ WebkitTextFillColor: 'transparent'
+ },
+
+ warning: {
+ background: 'linear-gradient(135deg, #f59e0b 0%, #d97706 100%)',
+ WebkitBackgroundClip: 'text',
+ WebkitTextFillColor: 'transparent'
+ },
+
+ danger: {
+ background: 'linear-gradient(135deg, #ef4444 0%, #dc2626 100%)',
+ WebkitBackgroundClip: 'text',
+ WebkitTextFillColor: 'transparent'
+ }
+}
+
+// 工具函数
+export const gradientUtils = {
+ // 根据用户ID获取主题
+ getThemeByUserId: (userId?: number): GradientTheme => {
+ if (!userId) return gradientThemes[0]
+ const index = userId % gradientThemes.length
+ return gradientThemes[index]
+ },
+
+ // 根据主题名获取主题
+ getThemeByName: (name: string): GradientTheme | undefined => {
+ return gradientThemes.find(theme => theme.name === name)
+ },
+
+ // 调整颜色亮度
+ adjustColorBrightness: (color: string, percent: number): string => {
+ const num = parseInt(color.replace("#", ""), 16)
+ const amt = Math.round(2.55 * percent)
+ const R = (num >> 16) + amt
+ const G = (num >> 8 & 0x00FF) + amt
+ const B = (num & 0x0000FF) + amt
+ return "#" + (0x1000000 + (R < 255 ? R < 1 ? 0 : R : 255) * 0x10000 +
+ (G < 255 ? G < 1 ? 0 : G : 255) * 0x100 +
+ (B < 255 ? B < 1 ? 0 : B : 255)).toString(16).slice(1)
+ },
+
+ // 生成自定义渐变
+ createGradient: (color1: string, color2: string, direction = '135deg'): string => {
+ return `linear-gradient(${direction}, ${color1} 0%, ${color2} 100%)`
+ },
+
+ // 获取渐变的主色调
+ getPrimaryColor: (gradient: string): string => {
+ const match = gradient.match(/#[a-fA-F0-9]{6}/)
+ return match ? match[0] : '#667eea'
+ }
+}
+
+// 动画渐变
+export const animatedGradients = {
+ flowing: {
+ background: 'linear-gradient(-45deg, #667eea, #764ba2, #f093fb, #f5576c)',
+ backgroundSize: '400% 400%',
+ animation: 'gradientFlow 15s ease infinite'
+ },
+
+ pulse: {
+ background: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',
+ animation: 'gradientPulse 3s ease-in-out infinite'
+ }
+}
+
+// CSS 动画关键帧(需要在全局样式中定义)
+export const gradientAnimations = `
+@keyframes gradientFlow {
+ 0% { background-position: 0% 50%; }
+ 50% { background-position: 100% 50%; }
+ 100% { background-position: 0% 50%; }
+}
+
+@keyframes gradientPulse {
+ 0%, 100% { opacity: 1; }
+ 50% { opacity: 0.8; }
+}
+`