rwadurian/frontend/temp_backup/RWADURIAN-ADMIN-WEB-SPEC.md

1710 lines
46 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 榴莲认种管理后台 (RWADurian Admin Web) - 前端开发规范文档
> **项目名称**: RWADurian Admin Web
> **版本**: 1.0.0
> **目标路径**: `rwadurian/frontend/admin-web`
> **文档用途**: 供 Claude Code 阅读并指导完成项目开发
---
## 目录
1. [项目概述](#1-项目概述)
2. [技术架构](#2-技术架构)
3. [目录结构](#3-目录结构)
4. [功能模块详解](#4-功能模块详解)
5. [UI/UX 设计规范](#5-uiux-设计规范)
6. [组件设计指南](#6-组件设计指南)
7. [状态管理方案](#7-状态管理方案)
8. [API 集成规范](#8-api-集成规范)
9. [开发规范与约定](#9-开发规范与约定)
10. [开发优先级与里程碑](#10-开发优先级与里程碑)
---
## 1. 项目概述
### 1.1 项目背景
榴莲认种管理后台是一个面向管理员的 Web 应用系统,用于管理榴莲树认种业务的全流程,包括用户管理、排名龙虎榜、省市公司授权、数据统计分析等核心功能。
### 1.2 核心功能模块
| 模块名称 | 路由路径 | 功能描述 |
|---------|---------|---------|
| 登录认证 | `/login` | 管理员登录、忘记密码、注册入口 |
| 仪表板 | `/dashboard` | 数据概览、趋势图表、最近活动 |
| 用户管理 | `/users` | 用户列表、搜索筛选、批量操作 |
| 龙虎榜管理 | `/leaderboard` | 日/周/月榜配置、虚拟排名设置 |
| 授权管理 | `/authorization` | 省/市公司授权、考核规则配置 |
| 数据统计 | `/statistics` | 多维度数据分析、报表导出 |
| 系统设置 | `/settings` | 结算参数、限额、安全配置 |
| 帮助中心 | `/help` | 文档、FAQ、联系支持 |
### 1.3 目标用户
- **超级管理员**: 拥有全部权限,可管理其他管理员账号
- **运营管理员**: 日常运营操作,无敏感设置权限
- **数据分析员**: 只读权限,专注数据查看和报表导出
---
## 2. 技术架构
### 2.1 技术栈
```yaml
核心框架:
- React: 18.x
- Next.js: 15.x (App Router)
- TypeScript: 5.x
状态管理:
- Redux Toolkit: 全局状态(用户认证、系统配置)
- Zustand: 局部状态表单、UI临时状态
样式方案:
- 纯 CSS/SCSS Modules (无第三方 UI 库)
- CSS Variables 主题系统
- Figma 导出的自定义设计
数据可视化:
- Recharts 或 ECharts (图表库)
- D3.js (复杂可视化需求)
网络请求:
- Axios + React Query (TanStack Query)
工具链:
- ESLint + Prettier
- Husky + lint-staged
- Jest + React Testing Library
```
### 2.2 Clean Architecture 分层
```
┌─────────────────────────────────────────────────────────────┐
│ Presentation Layer │
│ (Pages, Components, Hooks) │
├─────────────────────────────────────────────────────────────┤
│ Application Layer │
│ (Use Cases, Services, State Management) │
├─────────────────────────────────────────────────────────────┤
│ Domain Layer │
│ (Entities, Value Objects, Domain Services) │
├─────────────────────────────────────────────────────────────┤
│ Infrastructure Layer │
│ (API Clients, Storage, External Services) │
└─────────────────────────────────────────────────────────────┘
```
---
## 3. 目录结构
```
admin-web/
├── public/
│ ├── assets/
│ │ ├── images/
│ │ │ ├── logo.svg
│ │ │ └── icons/
│ │ └── fonts/
│ └── locales/
│ └── zh-CN.json
├── src/
│ ├── app/ # Next.js App Router
│ │ ├── (auth)/
│ │ │ ├── login/
│ │ │ │ └── page.tsx
│ │ │ ├── forgot-password/
│ │ │ │ └── page.tsx
│ │ │ └── layout.tsx
│ │ │
│ │ ├── (dashboard)/
│ │ │ ├── dashboard/
│ │ │ │ └── page.tsx
│ │ │ ├── users/
│ │ │ │ ├── page.tsx
│ │ │ │ └── [id]/
│ │ │ │ └── page.tsx
│ │ │ ├── leaderboard/
│ │ │ │ └── page.tsx
│ │ │ ├── authorization/
│ │ │ │ └── page.tsx
│ │ │ ├── statistics/
│ │ │ │ └── page.tsx
│ │ │ ├── settings/
│ │ │ │ └── page.tsx
│ │ │ ├── help/
│ │ │ │ └── page.tsx
│ │ │ └── layout.tsx
│ │ │
│ │ ├── layout.tsx
│ │ ├── page.tsx
│ │ └── globals.css
│ │
│ ├── components/ # UI 组件
│ │ ├── common/ # 通用基础组件
│ │ │ ├── Button/
│ │ │ │ ├── Button.tsx
│ │ │ │ ├── Button.module.scss
│ │ │ │ └── index.ts
│ │ │ ├── Input/
│ │ │ ├── Select/
│ │ │ ├── Table/
│ │ │ ├── Modal/
│ │ │ ├── Card/
│ │ │ ├── Badge/
│ │ │ ├── Avatar/
│ │ │ ├── Pagination/
│ │ │ ├── Toggle/
│ │ │ ├── Dropdown/
│ │ │ ├── Tabs/
│ │ │ ├── Tooltip/
│ │ │ ├── Loading/
│ │ │ └── Toast/
│ │ │
│ │ ├── layout/ # 布局组件
│ │ │ ├── Sidebar/
│ │ │ ├── Header/
│ │ │ ├── Breadcrumb/
│ │ │ └── PageContainer/
│ │ │
│ │ ├── charts/ # 图表组件
│ │ │ ├── LineChart/
│ │ │ ├── BarChart/
│ │ │ ├── PieChart/
│ │ │ └── DonutChart/
│ │ │
│ │ └── features/ # 业务组件
│ │ ├── dashboard/
│ │ │ ├── StatCard/
│ │ │ ├── TrendChart/
│ │ │ ├── RegionDistribution/
│ │ │ └── RecentActivity/
│ │ ├── users/
│ │ │ ├── UserTable/
│ │ │ ├── UserFilters/
│ │ │ └── UserDetailModal/
│ │ ├── leaderboard/
│ │ │ ├── RankingTable/
│ │ │ ├── BoardSettings/
│ │ │ └── VirtualRankPreview/
│ │ ├── authorization/
│ │ │ ├── CompanyTable/
│ │ │ ├── AssessmentRules/
│ │ │ └── LadderTargetTable/
│ │ ├── statistics/
│ │ │ ├── TrendAnalysis/
│ │ │ ├── RegionStats/
│ │ │ ├── CompanyOperations/
│ │ │ └── RevenueDetails/
│ │ ├── settings/
│ │ │ ├── SettlementConfig/
│ │ │ ├── LeaderboardConfig/
│ │ │ ├── QuotaConfig/
│ │ │ ├── AssessmentConfig/
│ │ │ ├── DisplayConfig/
│ │ │ └── SecurityConfig/
│ │ └── help/
│ │ ├── DocumentCard/
│ │ ├── DocumentList/
│ │ ├── FAQSection/
│ │ └── ContactSupport/
│ │
│ ├── domain/ # 领域层
│ │ ├── entities/
│ │ │ ├── User.ts
│ │ │ ├── Company.ts
│ │ │ ├── Ranking.ts
│ │ │ ├── Statistics.ts
│ │ │ └── Settings.ts
│ │ ├── value-objects/
│ │ │ ├── UserId.ts
│ │ │ ├── Province.ts
│ │ │ └── Currency.ts
│ │ └── interfaces/
│ │ ├── IUserRepository.ts
│ │ ├── ICompanyRepository.ts
│ │ └── IStatisticsRepository.ts
│ │
│ ├── application/ # 应用层
│ │ ├── use-cases/
│ │ │ ├── auth/
│ │ │ │ ├── LoginUseCase.ts
│ │ │ │ └── LogoutUseCase.ts
│ │ │ ├── users/
│ │ │ │ ├── GetUsersUseCase.ts
│ │ │ │ ├── UpdateUserUseCase.ts
│ │ │ │ └── ExportUsersUseCase.ts
│ │ │ ├── leaderboard/
│ │ │ │ ├── GetRankingsUseCase.ts
│ │ │ │ └── UpdateBoardSettingsUseCase.ts
│ │ │ └── ...
│ │ │
│ │ ├── services/
│ │ │ ├── AuthService.ts
│ │ │ ├── UserService.ts
│ │ │ ├── LeaderboardService.ts
│ │ │ ├── AuthorizationService.ts
│ │ │ ├── StatisticsService.ts
│ │ │ └── SettingsService.ts
│ │ │
│ │ └── dto/
│ │ ├── UserDTO.ts
│ │ ├── CompanyDTO.ts
│ │ └── StatisticsDTO.ts
│ │
│ ├── infrastructure/ # 基础设施层
│ │ ├── api/
│ │ │ ├── client.ts # Axios 实例配置
│ │ │ ├── endpoints.ts # API 端点定义
│ │ │ └── repositories/
│ │ │ ├── UserRepository.ts
│ │ │ ├── CompanyRepository.ts
│ │ │ └── StatisticsRepository.ts
│ │ │
│ │ ├── storage/
│ │ │ ├── localStorage.ts
│ │ │ └── sessionStorage.ts
│ │ │
│ │ └── external/
│ │ └── exportService.ts # Excel 导出等
│ │
│ ├── store/ # 状态管理
│ │ ├── redux/
│ │ │ ├── store.ts
│ │ │ ├── rootReducer.ts
│ │ │ └── slices/
│ │ │ ├── authSlice.ts
│ │ │ ├── settingsSlice.ts
│ │ │ └── notificationSlice.ts
│ │ │
│ │ └── zustand/
│ │ ├── useUserFiltersStore.ts
│ │ ├── useLeaderboardStore.ts
│ │ └── useModalStore.ts
│ │
│ ├── hooks/ # 自定义 Hooks
│ │ ├── useAuth.ts
│ │ ├── useUsers.ts
│ │ ├── useLeaderboard.ts
│ │ ├── useStatistics.ts
│ │ ├── usePagination.ts
│ │ ├── useDebounce.ts
│ │ └── useExport.ts
│ │
│ ├── utils/ # 工具函数
│ │ ├── formatters.ts # 数字、日期格式化
│ │ ├── validators.ts # 表单验证
│ │ ├── constants.ts # 常量定义
│ │ └── helpers.ts # 通用辅助函数
│ │
│ ├── styles/ # 全局样式
│ │ ├── variables.scss # CSS 变量
│ │ ├── mixins.scss # SCSS Mixins
│ │ ├── typography.scss # 字体样式
│ │ ├── animations.scss # 动画定义
│ │ └── reset.scss # 样式重置
│ │
│ └── types/ # TypeScript 类型
│ ├── api.types.ts
│ ├── user.types.ts
│ ├── company.types.ts
│ ├── statistics.types.ts
│ └── common.types.ts
├── .env.local
├── .env.development
├── .env.production
├── .eslintrc.json
├── .prettierrc
├── next.config.js
├── tsconfig.json
├── package.json
└── README.md
```
---
## 4. 功能模块详解
### 4.1 登录认证模块 (`/login`)
#### 页面布局
- 居中卡片式设计,浅灰色背景 (`#F5F5F5`)
- Logo + 系统名称 "榴莲认种管理后台"
- 欢迎语 "欢迎回来"
#### 功能点
| 功能 | 描述 | 交互 |
|-----|------|------|
| 邮箱输入 | 邮箱格式验证 | 失焦验证 |
| 密码输入 | 密码强度提示 | 实时验证 |
| 忘记密码 | 跳转密码重置页 | 链接跳转 |
| 登录按钮 | 提交登录请求 | Loading 状态 |
| 注册入口 | 跳转注册页面 | 链接跳转 |
#### 表单验证规则
```typescript
interface LoginForm {
email: string; // 必填,邮箱格式
password: string; // 必填6-20位
}
```
---
### 4.2 仪表板模块 (`/dashboard`)
#### 页面结构
```
┌─────────────────────────────────────────────────────────────┐
│ [Sidebar] │ [Header: 面包屑 + 操作按钮 + 用户信息] │
│ ├─────────────────────────────────────────────────┤
│ │ [统计卡片区: 4个卡片横向排列] │
│ ├───────────────────────────┬─────────────────────┤
│ │ [认种趋势图] │ [最近活动] │
│ ├───────────────────────────┤ │
│ │ [月度增长图] │ │
│ ├───────────────────────────┤ │
│ │ [区域分布饼图] │ │
└───────────┴───────────────────────────┴─────────────────────┘
```
#### 统计卡片数据
| 卡片名称 | 数据字段 | 增长指标 |
|---------|---------|---------|
| 总认种量 | `totalAdoptions` | 百分比增长 |
| 活跃用户 | `activeUsers` | 百分比增长 |
| 省级公司 | `provincialCompanies` | 百分比增长 |
| 市级公司 | `cityCompanies` | 百分比增长 |
#### 图表组件
**认种趋势折线图**
```typescript
interface TrendChartData {
date: string;
value: number;
}
// 支持时间范围切换: 7天/30天/90天
```
**月度增长柱状图**
```typescript
interface MonthlyGrowthData {
month: string;
adoptions: number;
growth: number; // 环比增长
}
```
**区域分布环形图**
```typescript
interface RegionDistributionData {
region: string;
percentage: number;
color: string;
}
```
#### 最近活动列表
```typescript
interface ActivityItem {
id: string;
type: 'user_register' | 'company_activity' | 'system_update' | 'report_generated';
icon: string;
title: string;
description: string;
timestamp: string; // "5分钟前", "2小时前", "昨天"
}
```
#### 顶部操作按钮
- **添加用户**: 打开添加用户弹窗
- **授权管理**: 跳转授权管理页
- **查看报表**: 跳转数据统计页(主按钮样式)
---
### 4.3 用户管理模块 (`/users`)
#### 页面功能
**搜索与筛选**
```typescript
interface UserFilters {
keyword: string; // 账户ID、昵称搜索
advancedFilters: {
province?: string; // 省份筛选
city?: string; // 城市筛选
rankRange?: [number, number]; // 排名范围
adoptionRange?: [number, number]; // 认种量范围
status?: 'active' | 'inactive';
};
}
```
**用户表格列定义**
| 列名 | 字段 | 宽度 | 排序 | 说明 |
|-----|------|------|------|------|
| 复选框 | - | 48px | - | 批量选择 |
| 账户序号 | `accountId` | 100px | ✓ | 唯一标识 |
| 头像 | `avatar` | 60px | - | 圆形头像+在线状态指示 |
| 昵称 | `nickname` | 80px | ✓ | - |
| 账户认种量 | `personalAdoptions` | 100px | ✓ | - |
| 团队总注册地址量 | `teamAddresses` | 120px | ✓ | - |
| 团队总认种量 | `teamAdoptions` | 100px | ✓ | - |
| 团队本省认种量及占比 | `provincialAdoptions` | 140px | ✓ | 显示数量(占比%) |
| 团队本市认种量及占比 | `cityAdoptions` | 140px | ✓ | 显示数量(占比%) |
| 推荐人序列号 | `referrerId` | 100px | - | - |
| 龙虎榜排名 | `ranking` | 80px | ✓ | 显示"-"表示未上榜 |
| 操作 | - | 120px | - | 查看详情、编辑 |
**批量操作**
- 导出 Excel (选中项/全部)
- 批量编辑(修改状态等)
**分页配置**
```typescript
interface PaginationConfig {
pageSize: 10 | 20 | 50 | 100;
current: number;
total: number;
}
```
---
### 4.4 龙虎榜管理模块 (`/leaderboard`)
#### 页面布局
```
┌─────────────────────────────────────────────────────────────┐
│ [页面标题] [导出排名数据按钮] │
├─────────────────────────────────┬───────────────────────────┤
│ │ │
│ ┌─────────────────────────┐ │ 榜单设置 │
│ │ 日榜 [开关] │ │ ┌───────────────────┐ │
│ │ 排名表格... │ │ │ 虚拟排名设置 │ │
│ └─────────────────────────┘ │ │ - 启用开关 │ │
│ │ │ - 虚拟账户数量 │ │
│ ┌─────────────────────────┐ │ │ - 规则说明 │ │
│ │ 周榜 [开关] │ │ │ - 实时预览 │ │
│ │ 榜单未开启/排名表格 │ │ └───────────────────┘ │
│ └─────────────────────────┘ │ ┌───────────────────┐ │
│ │ │ 显示设置 │ │
│ ┌─────────────────────────┐ │ │ - 前端显示数量 │ │
│ │ 月榜 [开关] │ │ └───────────────────┘ │
│ │ 榜单未开启/排名表格 │ │ │
│ └─────────────────────────┘ │ [保存设置按钮] │
│ │ │
└─────────────────────────────────┴───────────────────────────┘
```
#### 排名表格
```typescript
interface RankingItem {
rank: number; // 1, 2, 3 显示奖牌图标
avatar: string;
nickname: string;
isVirtual: boolean; // 虚拟用户标签
adoptionCount: number; // X 棵
teamData: string; // 团队标识 (A队, B队, C队)
}
```
#### 榜单设置
```typescript
interface BoardSettings {
virtualRanking: {
enabled: boolean;
virtualAccountCount: number; // 滑块 0-10
ruleDescription: string;
};
displaySettings: {
frontendDisplayCount: 10 | 20 | 50; // 下拉选择
};
}
```
#### 榜单开关状态
- **已开启**: 显示排名表格
- **未开启**: 显示空状态图标 + "榜单未开启" + "待激活"
---
### 4.5 授权管理模块 (`/authorization`)
#### 页面分区
**1. 授权省公司管理**
```typescript
interface ProvinceCompanyFilter {
province: string;
authStatus: 'authorized' | 'pending' | 'all';
keyword: string;
}
interface ProvinceCompanyItem {
avatar: string;
nickname: string;
accountId: string;
province: string;
teamAdoptions: number;
authStatus: 'authorized' | 'pending';
actions: ['authorize' | 'revoke'];
}
```
**2. 省公司团队权益考核规则**
```typescript
interface ProvinceAssessmentRules {
firstTriggerThreshold: number; // 首次考核触发门槛 (棵)
stageUnitBenefit: number; // 考核阶段单棵权益 (USDT)
incrementalBenefit: number; // 达标后每新增1棵获得 (USDT)
assessmentCycle: 'monthly' | 'quarterly';
failureResetEnabled: boolean; // 未达成目标时权益失效并重置
}
```
**3. 授权市公司管理**
- 结构同省公司,增加城市筛选
**4. 市公司团队权益考核规则**
- 结构同省公司规则,阈值和权益数值不同
**5. 正式省/市公司授权管理**
- 通过全部阶梯性考核后的正式公司列表
**6. 授权限制规则**
```typescript
interface AuthorizationLimits {
oneProvinceOneCompany: boolean; // 每省份仅授权1个
oneCityOneCompany: boolean; // 每城市仅授权1个
topRankingRequired: number; // 排名前N才具备资格
specialCityRules: {
beijing: boolean; // 北京特例
shanghai: boolean; // 上海特例
};
}
```
**7. 阶梯性考核目标表**
```typescript
interface LadderTarget {
assessmentMonth: number; // 考核月 (1-9)
provinceMonthlyTarget: number; // 省代当月目标
provinceCumulativeTarget: number; // 省代累计目标
cityMonthlyTarget: number; // 市代当月目标
cityCumulativeTarget: number; // 市代累计目标
}
```
---
### 4.6 数据统计模块 (`/statistics`)
#### 页面分区
**1. 顶部统计概览**
```typescript
interface StatisticsOverview {
totalAdoptions: number; // 榴莲树认种总量
todayAdoptions: number; // 今日认种数量
monthlyAdoptions: number; // 本月认种数量
}
```
**2. 认种数量趋势**
- 时间维度切换: 日 / 周 / 月 / 季度 / 年度
- 折线图展示
**3. 龙虎榜与排名统计**
```typescript
interface LeaderboardStats {
activeTab: 'daily' | 'weekly' | 'monthly';
rankings: Array<{
rank: number;
account: string;
adoptionCount: number;
province: string;
city: string;
}>;
topProvince: {
name: string;
completionData: number;
};
topCity: {
name: string;
completionData: number;
};
}
```
**4. 区域认种数据统计**
- 按省统计 / 按市统计 切换
- 柱状图 + 详情表格
```typescript
interface RegionStats {
region: string;
period: string; // 2023-10
adoptionCount: number;
percentage: number;
}
```
**5. 省/市公司运营统计**
```typescript
interface OperationStats {
summary: {
monthlyHashRate: string; // "1,200 TH/s"
cumulativeHashRate: string; // "15,000 TH/s"
monthlyMining: string; // "5.6 BTC"
cumulativeMining: string; // "67.8 BTC"
monthlyCommission: number; // ¥12,345
cumulativeCommission: number; // ¥150,000
monthlyAdoptionBonus: number; // ¥8,900
};
details: Array<{
accountType: 'province' | 'city';
accountName: string;
statMonth: string;
hashRate: string;
miningAmount: string;
commission: number;
}>;
}
```
**6. 收益明细与来源**
```typescript
interface RevenueDetail {
timestamp: string;
account: string;
source: 'mining' | 'adoption_completion' | 'share';
amount: number; // 带+号显示正数
relatedAddress: string; // bc1...xyz
transactionId: string; // TXN1234567890
}
```
---
### 4.7 系统设置模块 (`/settings`)
#### 设置分区
**1. 结算参数设置**
```typescript
interface SettlementConfig {
availableCurrencies: Array<'BNB' | 'OG' | 'USDT' | 'DST'>;
defaultCurrency: string;
}
```
**2. 龙虎榜设置**
```typescript
interface LeaderboardConfig {
virtualAccountEnabled: boolean;
virtualAccountCount: number;
boardSwitches: {
daily: boolean;
weekly: boolean;
monthly: boolean;
};
frontendDisplayCount: string; // "10, 20, 31"
}
```
**3. 认种限额设置**
```typescript
interface QuotaConfig {
singleAccountQuota: {
enabled: boolean;
days: number;
maxCount: number;
};
networkTotalQuota: {
enabled: boolean;
days: number;
maxCount: number;
};
}
```
**4. 考核规则设置**
```typescript
interface AssessmentConfig {
localUserPercentageThreshold: number; // 5%
exemptionEnabled: boolean; // 允许豁免
ladderTargets: LadderTarget[];
}
```
**5. 前端展示设置**
```typescript
interface DisplayConfig {
allowNonAdopterViewHeatmap: boolean;
heatmapDisplayMode: 'exact_count' | 'level'; // 高/中/低
}
```
**6. 后台账号与安全**
```typescript
interface SecurityConfig {
accounts: Array<{
username: string;
role: '超级管理员' | '运营人员';
status: 'active' | 'disabled';
lastLogin: string;
}>;
sensitiveOperationApprovers: number; // 审批人数
sensitiveOperations: string[]; // 需审批的操作
operationLogs: Array<{
timestamp: string;
operator: string;
type: string;
description: string;
approvalResult: 'approved' | 'pending' | 'rejected';
}>;
}
```
---
### 4.8 帮助中心模块 (`/help`)
#### 页面分区
**1. 搜索区**
- 搜索文档或问题的输入框
**2. 推荐文档卡片**
```typescript
interface RecommendedDoc {
title: string;
description: string;
helpfulCount: number;
notHelpfulCount: number;
}
```
固定展示3个推荐文档
**3. 文档列表**
```typescript
interface DocumentItem {
title: string;
category: '系统设置' | '账号安全' | '数据统计' | '授权管理';
lastUpdated: string;
rating: {
helpful: boolean | null;
};
}
```
**4. 常见问题 (FAQ)**
```typescript
interface FAQItem {
question: string;
answer: string;
expanded: boolean;
}
```
**5. 联系支持**
```typescript
interface SupportInfo {
phone: string; // "400-123-4567"
workingHours: string; // "工作日 9:00 - 18:00"
email: string; // "support@durian-adopt.com"
onlineChat: boolean; // 在线客服入口
}
```
---
## 5. UI/UX 设计规范
### 5.1 色彩系统
```scss
// 主色调
$primary-color: #1565C0; // 主蓝色 - 按钮、链接、激活状态
$primary-light: #1E88E5; // 浅蓝色 - Hover 状态
$primary-dark: #0D47A1; // 深蓝色 - 点击状态
// 辅助色
$success-color: #4CAF50; // 成功绿
$warning-color: #F5A623; // 警告黄/金色
$error-color: #E53935; // 错误红
$info-color: #2196F3; // 信息蓝
// 中性色
$text-primary: #212121; // 主要文字
$text-secondary: #757575; // 次要文字
$text-disabled: #BDBDBD; // 禁用文字
$border-color: #E0E0E0; // 边框色
$background-color: #F5F5F5; // 页面背景
$card-background: #FFFFFF; // 卡片背景
$sidebar-background: #1565C0; // 侧边栏背景
// 语义色
$increase-color: #4CAF50; // 增长 (+5.6%)
$decrease-color: #E53935; // 下降
```
### 5.2 字体系统
```scss
// 字体族
$font-family-base: 'PingFang SC', 'Microsoft YaHei', -apple-system, BlinkMacSystemFont, sans-serif;
$font-family-number: 'DIN Alternate', 'Roboto', $font-family-base;
// 字号
$font-size-xs: 12px; // 辅助文字、标签
$font-size-sm: 13px; // 表格内容
$font-size-base: 14px; // 正文
$font-size-md: 16px; // 小标题
$font-size-lg: 18px; // 二级标题
$font-size-xl: 20px; // 页面标题
$font-size-xxl: 24px; // 大数字
$font-size-display: 32px; // 统计数字
// 行高
$line-height-tight: 1.25;
$line-height-base: 1.5;
$line-height-loose: 1.75;
// 字重
$font-weight-regular: 400;
$font-weight-medium: 500;
$font-weight-semibold: 600;
$font-weight-bold: 700;
```
### 5.3 间距系统
```scss
// 基础间距 (4px 为基础单位)
$spacing-xs: 4px;
$spacing-sm: 8px;
$spacing-md: 12px;
$spacing-base: 16px;
$spacing-lg: 20px;
$spacing-xl: 24px;
$spacing-xxl: 32px;
$spacing-xxxl: 48px;
// 组件内间距
$padding-card: 24px;
$padding-modal: 24px;
$padding-input: 12px 16px;
$padding-button: 10px 24px;
// 页面边距
$page-padding: 24px;
$sidebar-width: 240px;
$sidebar-collapsed-width: 64px;
```
### 5.4 圆角系统
```scss
$border-radius-sm: 4px; // 小按钮、标签
$border-radius-base: 8px; // 输入框、卡片
$border-radius-lg: 12px; // 大卡片、弹窗
$border-radius-xl: 16px; // 特殊组件
$border-radius-round: 50%; // 圆形头像
$border-radius-pill: 999px; // 药丸形状
```
### 5.5 阴影系统
```scss
$shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.05);
$shadow-base: 0 2px 8px rgba(0, 0, 0, 0.08);
$shadow-md: 0 4px 12px rgba(0, 0, 0, 0.1);
$shadow-lg: 0 8px 24px rgba(0, 0, 0, 0.12);
$shadow-xl: 0 16px 48px rgba(0, 0, 0, 0.15);
```
### 5.6 动画系统
```scss
// 时长
$duration-fast: 150ms;
$duration-base: 250ms;
$duration-slow: 350ms;
// 缓动函数
$ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);
$ease-out: cubic-bezier(0, 0, 0.2, 1);
$ease-in: cubic-bezier(0.4, 0, 1, 1);
// 常用动画
@mixin transition-base {
transition: all $duration-base $ease-in-out;
}
@mixin hover-lift {
transition: transform $duration-fast $ease-out, box-shadow $duration-fast $ease-out;
&:hover {
transform: translateY(-2px);
box-shadow: $shadow-md;
}
}
```
---
## 6. 组件设计指南
### 6.1 基础组件清单
#### Button 按钮
```typescript
interface ButtonProps {
variant: 'primary' | 'secondary' | 'outline' | 'ghost' | 'danger';
size: 'sm' | 'md' | 'lg';
icon?: ReactNode;
iconPosition?: 'left' | 'right';
loading?: boolean;
disabled?: boolean;
fullWidth?: boolean;
children: ReactNode;
onClick?: () => void;
}
```
**样式规范**:
- Primary: 蓝色填充背景 `#1565C0`,白色文字
- Secondary: 白色背景,蓝色边框和文字
- Outline: 透明背景,灰色边框
- Ghost: 无边框,悬停显示背景
- Danger: 红色填充背景
#### Input 输入框
```typescript
interface InputProps {
type: 'text' | 'password' | 'email' | 'number';
size: 'sm' | 'md' | 'lg';
placeholder?: string;
prefix?: ReactNode; // 前置图标
suffix?: ReactNode; // 后置图标/清除按钮
error?: string;
disabled?: boolean;
value: string;
onChange: (value: string) => void;
}
```
#### Select 下拉选择
```typescript
interface SelectProps<T> {
options: Array<{ label: string; value: T }>;
value: T;
onChange: (value: T) => void;
placeholder?: string;
multiple?: boolean;
searchable?: boolean;
disabled?: boolean;
}
```
#### Table 表格
```typescript
interface TableProps<T> {
columns: Array<{
key: string;
title: string;
width?: number;
sortable?: boolean;
render?: (value: any, record: T) => ReactNode;
}>;
data: T[];
loading?: boolean;
pagination?: PaginationConfig;
rowSelection?: {
selectedRowKeys: string[];
onChange: (keys: string[]) => void;
};
onRowClick?: (record: T) => void;
}
```
#### Modal 弹窗
```typescript
interface ModalProps {
visible: boolean;
title: string;
width?: number;
onClose: () => void;
onConfirm?: () => void;
confirmText?: string;
cancelText?: string;
loading?: boolean;
children: ReactNode;
}
```
#### Card 卡片
```typescript
interface CardProps {
title?: string;
extra?: ReactNode; // 右上角操作区
padding?: boolean;
shadow?: boolean;
children: ReactNode;
}
```
### 6.2 布局组件
#### Sidebar 侧边栏
```typescript
interface SidebarProps {
collapsed: boolean;
onCollapse: (collapsed: boolean) => void;
activeKey: string;
menuItems: Array<{
key: string;
icon: ReactNode;
label: string;
path: string;
badge?: number;
}>;
}
```
**菜单项结构**:
```typescript
const menuItems = [
{ key: 'dashboard', icon: <DashboardIcon />, label: '仪表板', path: '/dashboard' },
{ key: 'users', icon: <UsersIcon />, label: '用户管理', path: '/users' },
{ key: 'leaderboard', icon: <TrophyIcon />, label: '龙虎榜', path: '/leaderboard' },
{ key: 'authorization', icon: <AuthIcon />, label: '授权管理', path: '/authorization' },
{ key: 'statistics', icon: <ChartIcon />, label: '数据统计', path: '/statistics' },
{ key: 'settings', icon: <SettingsIcon />, label: '系统设置', path: '/settings' },
// 底部固定
{ key: 'help', icon: <HelpIcon />, label: '帮助中心', path: '/help', position: 'bottom' },
{ key: 'logout', icon: <LogoutIcon />, label: '退出登录', path: '/logout', position: 'bottom' },
];
```
#### Header 顶部栏
```typescript
interface HeaderProps {
title: string;
breadcrumb: Array<{ label: string; path?: string }>;
actions?: ReactNode;
user: {
name: string;
role: string;
avatar: string;
};
notifications?: number;
}
```
### 6.3 图表组件
#### StatCard 统计卡片
```typescript
interface StatCardProps {
title: string;
value: number | string;
suffix?: string; // "棵", "人"
change?: {
value: number;
trend: 'up' | 'down';
};
icon?: ReactNode;
color?: string;
}
```
**视觉规范**:
- 卡片白色背景8px 圆角
- 数字使用 `$font-family-number`32px 字号
- 增长指标使用绿色,下降使用红色
-`+``-` 前缀
#### LineChart 折线图
```typescript
interface LineChartProps {
data: Array<{ x: string; y: number }>;
xAxisKey: string;
yAxisKey: string;
color?: string;
gradient?: boolean; // 面积渐变填充
height?: number;
}
```
#### BarChart 柱状图
```typescript
interface BarChartProps {
data: Array<{ category: string; value: number }>;
colors?: string[];
horizontal?: boolean;
showLabels?: boolean;
height?: number;
}
```
#### DonutChart 环形图
```typescript
interface DonutChartProps {
data: Array<{ name: string; value: number; color: string }>;
innerRadius?: number;
outerRadius?: number;
centerContent?: ReactNode; // 中心显示内容
}
```
---
## 7. 状态管理方案
### 7.1 Redux Toolkit (全局状态)
用于管理需要跨页面持久化的状态:
```typescript
// store/redux/slices/authSlice.ts
interface AuthState {
user: User | null;
token: string | null;
isAuthenticated: boolean;
permissions: string[];
}
// store/redux/slices/settingsSlice.ts
interface SettingsState {
sidebarCollapsed: boolean;
theme: 'light' | 'dark';
language: 'zh-CN' | 'en-US';
}
// store/redux/slices/notificationSlice.ts
interface NotificationState {
unreadCount: number;
notifications: Notification[];
}
```
### 7.2 Zustand (局部状态)
用于管理页面级别的临时状态:
```typescript
// store/zustand/useUserFiltersStore.ts
interface UserFiltersStore {
keyword: string;
province: string;
city: string;
status: string;
setKeyword: (keyword: string) => void;
setFilters: (filters: Partial<UserFilters>) => void;
resetFilters: () => void;
}
// store/zustand/useLeaderboardStore.ts
interface LeaderboardStore {
activeBoard: 'daily' | 'weekly' | 'monthly';
virtualSettings: VirtualSettings;
setActiveBoard: (board: string) => void;
updateVirtualSettings: (settings: Partial<VirtualSettings>) => void;
}
// store/zustand/useModalStore.ts
interface ModalStore {
activeModal: string | null;
modalData: any;
openModal: (name: string, data?: any) => void;
closeModal: () => void;
}
```
### 7.3 React Query (服务端状态)
用于管理 API 数据缓存:
```typescript
// hooks/useUsers.ts
export const useUsers = (filters: UserFilters) => {
return useQuery({
queryKey: ['users', filters],
queryFn: () => userService.getUsers(filters),
staleTime: 5 * 60 * 1000, // 5分钟缓存
});
};
// hooks/useStatistics.ts
export const useStatistics = (period: string) => {
return useQuery({
queryKey: ['statistics', period],
queryFn: () => statisticsService.getOverview(period),
refetchInterval: 30 * 1000, // 30秒自动刷新
});
};
```
---
## 8. API 集成规范
### 8.1 API 客户端配置
```typescript
// infrastructure/api/client.ts
import axios from 'axios';
const apiClient = axios.create({
baseURL: process.env.NEXT_PUBLIC_API_BASE_URL,
timeout: 30000,
headers: {
'Content-Type': 'application/json',
},
});
// 请求拦截器
apiClient.interceptors.request.use((config) => {
const token = store.getState().auth.token;
if (token) {
config.headers.Authorization = `Bearer ${token}`;
}
return config;
});
// 响应拦截器
apiClient.interceptors.response.use(
(response) => response.data,
(error) => {
if (error.response?.status === 401) {
store.dispatch(logout());
router.push('/login');
}
return Promise.reject(error);
}
);
```
### 8.2 API 端点定义
```typescript
// infrastructure/api/endpoints.ts
export const API_ENDPOINTS = {
// 认证
AUTH: {
LOGIN: '/auth/login',
LOGOUT: '/auth/logout',
REFRESH: '/auth/refresh',
FORGOT_PASSWORD: '/auth/forgot-password',
},
// 用户管理
USERS: {
LIST: '/users',
DETAIL: (id: string) => `/users/${id}`,
UPDATE: (id: string) => `/users/${id}`,
EXPORT: '/users/export',
},
// 龙虎榜
LEADERBOARD: {
RANKINGS: '/leaderboard/rankings',
SETTINGS: '/leaderboard/settings',
EXPORT: '/leaderboard/export',
},
// 授权管理
AUTHORIZATION: {
PROVINCE_COMPANIES: '/authorization/province-companies',
CITY_COMPANIES: '/authorization/city-companies',
ASSESSMENT_RULES: '/authorization/assessment-rules',
LADDER_TARGETS: '/authorization/ladder-targets',
},
// 数据统计
STATISTICS: {
OVERVIEW: '/statistics/overview',
TREND: '/statistics/trend',
REGION: '/statistics/region',
OPERATIONS: '/statistics/operations',
REVENUE: '/statistics/revenue',
},
// 系统设置
SETTINGS: {
ALL: '/settings',
SETTLEMENT: '/settings/settlement',
LEADERBOARD: '/settings/leaderboard',
QUOTA: '/settings/quota',
ASSESSMENT: '/settings/assessment',
DISPLAY: '/settings/display',
SECURITY: '/settings/security',
},
// 帮助中心
HELP: {
DOCUMENTS: '/help/documents',
FAQ: '/help/faq',
SEARCH: '/help/search',
},
};
```
### 8.3 通用响应格式
```typescript
// types/api.types.ts
interface ApiResponse<T> {
code: number;
message: string;
data: T;
}
interface PaginatedResponse<T> {
code: number;
message: string;
data: {
list: T[];
pagination: {
current: number;
pageSize: number;
total: number;
};
};
}
```
---
## 9. 开发规范与约定
### 9.1 命名规范
```typescript
// 文件命名
components/Button/Button.tsx // PascalCase 组件
components/Button/Button.module.scss // 样式模块
hooks/useAuth.ts // camelCase hooks
utils/formatters.ts // camelCase 工具
types/user.types.ts // kebab-case 类型文件
// 变量命名
const userName = 'admin'; // camelCase 变量
const MAX_RETRY_COUNT = 3; // UPPER_SNAKE_CASE 常量
const UserRole = { ADMIN: 'admin' }; // PascalCase 枚举
// 组件命名
const UserListPage = () => {}; // PascalCase 组件
const useUserData = () => {}; // use 前缀 hooks
// CSS 类命名 (BEM 风格)
.button {}
.button--primary {}
.button--disabled {}
.button__icon {}
```
### 9.2 代码组织
```typescript
// 组件文件结构
// components/Button/Button.tsx
import { FC } from 'react';
import styles from './Button.module.scss';
import type { ButtonProps } from './Button.types';
// 1. 类型定义 (或单独文件)
// 2. 常量定义
// 3. 辅助函数
// 4. 组件定义
// 5. 导出
export const Button: FC<ButtonProps> = ({
variant = 'primary',
size = 'md',
children,
...props
}) => {
return (
<button
className={`${styles.button} ${styles[`button--${variant}`]} ${styles[`button--${size}`]}`}
{...props}
>
{children}
</button>
);
};
```
### 9.3 Git 提交规范
```bash
# 格式: <type>(<scope>): <subject>
feat(users): 添加用户列表分页功能
fix(auth): 修复登录token失效问题
style(button): 调整按钮hover状态样式
refactor(api): 重构API请求拦截器
docs(readme): 更新项目说明文档
test(users): 添加用户服务单元测试
chore(deps): 更新依赖版本
```
### 9.4 注释规范
```typescript
/**
* 用户服务类
* 处理所有用户相关的业务逻辑
*/
class UserService {
/**
* 获取用户列表
* @param filters - 筛选条件
* @param pagination - 分页参数
* @returns 用户列表响应
*/
async getUsers(
filters: UserFilters,
pagination: PaginationParams
): Promise<PaginatedResponse<User>> {
// TODO: 添加缓存优化
// FIXME: 处理边界情况
return apiClient.get(API_ENDPOINTS.USERS.LIST, {
params: { ...filters, ...pagination },
});
}
}
```
---
## 10. 开发优先级与里程碑
### Phase 1: 基础框架搭建 (Week 1-2)
**目标**: 完成项目基础架构和核心组件库
```
├── 项目初始化
│ ├── Next.js 15 项目创建
│ ├── TypeScript 配置
│ ├── ESLint + Prettier 配置
│ ├── 目录结构创建
│ └── 环境变量配置
├── 样式系统
│ ├── CSS 变量定义
│ ├── SCSS Mixins
│ ├── 全局样式重置
│ └── 字体引入
├── 基础组件 (10个)
│ ├── Button
│ ├── Input
│ ├── Select
│ ├── Table (基础版)
│ ├── Modal
│ ├── Card
│ ├── Badge
│ ├── Avatar
│ ├── Loading
│ └── Toast
└── 布局组件
├── Sidebar
├── Header
└── PageContainer
```
### Phase 2: 认证与仪表板 (Week 3)
**目标**: 完成登录流程和仪表板页面
```
├── 登录模块
│ ├── 登录页面 UI
│ ├── 表单验证
│ ├── 登录 API 集成
│ ├── Token 管理
│ └── 路由守卫
├── 仪表板模块
│ ├── 统计卡片组件
│ ├── 折线图组件
│ ├── 柱状图组件
│ ├── 环形图组件
│ ├── 最近活动列表
│ └── 数据获取与展示
└── 状态管理
├── Redux Store 配置
├── Auth Slice
└── React Query 配置
```
### Phase 3: 用户管理 (Week 4)
**目标**: 完成用户管理全部功能
```
├── 用户列表
│ ├── 表格组件完善
│ ├── 搜索功能
│ ├── 高级筛选
│ ├── 分页功能
│ └── 排序功能
├── 用户操作
│ ├── 查看详情弹窗
│ ├── 编辑用户
│ ├── 批量选择
│ └── 导出 Excel
└── Zustand 集成
└── 用户筛选状态管理
```
### Phase 4: 龙虎榜与授权 (Week 5-6)
**目标**: 完成龙虎榜和授权管理模块
```
├── 龙虎榜模块
│ ├── 日/周/月榜切换
│ ├── 排名表格
│ ├── 榜单开关
│ ├── 虚拟排名设置
│ ├── 显示设置
│ └── 导出功能
└── 授权管理模块
├── 省公司管理
├── 市公司管理
├── 考核规则配置
├── 限制规则设置
└── 阶梯目标表格
```
### Phase 5: 数据统计 (Week 7)
**目标**: 完成数据统计全部图表和报表
```
├── 统计概览
│ ├── 顶部统计卡片
│ └── 趋势图表
├── 详细统计
│ ├── 龙虎榜统计
│ ├── 区域数据统计
│ ├── 公司运营统计
│ └── 收益明细
└── 导出功能
├── 运营报表导出
└── 明细数据导出
```
### Phase 6: 系统设置与帮助 (Week 8)
**目标**: 完成系统设置和帮助中心
```
├── 系统设置
│ ├── 结算参数
│ ├── 龙虎榜设置
│ ├── 认种限额
│ ├── 考核规则
│ ├── 前端展示
│ └── 账号与安全
├── 帮助中心
│ ├── 搜索功能
│ ├── 推荐文档
│ ├── 文档列表
│ ├── FAQ
│ └── 联系支持
└── 全局功能
├── 通知系统
└── 操作日志
```
### Phase 7: 测试与优化 (Week 9-10)
**目标**: 完成测试、性能优化和上线准备
```
├── 测试
│ ├── 单元测试
│ ├── 集成测试
│ └── E2E 测试
├── 性能优化
│ ├── 代码分割
│ ├── 图片优化
│ ├── 缓存策略
│ └── Bundle 分析
└── 部署准备
├── CI/CD 配置
├── 环境配置
└── 监控接入
```
---
## 附录
### A. 图标资源
建议使用以下图标来源:
- 侧边栏菜单图标: 自定义 SVG 或 Lucide Icons
- 操作图标: 保持与 Figma 设计一致
### B. 第三方库版本
```json
{
"dependencies": {
"react": "^18.2.0",
"next": "^15.0.0",
"typescript": "^5.0.0",
"@reduxjs/toolkit": "^2.0.0",
"zustand": "^4.4.0",
"@tanstack/react-query": "^5.0.0",
"axios": "^1.6.0",
"recharts": "^2.10.0",
"xlsx": "^0.18.5",
"dayjs": "^1.11.0",
"clsx": "^2.0.0"
}
}
```
### C. 环境变量
```bash
# .env.local
NEXT_PUBLIC_API_BASE_URL=http://localhost:8080/api
NEXT_PUBLIC_APP_NAME=榴莲认种管理后台
NEXT_PUBLIC_VERSION=1.0.0
```
---
**文档版本**: 1.0.0
**最后更新**: 2024年
**维护者**: Claude Code