15 KiB
Design Document: 仪表盘数据看板
Overview
本设计文档描述仪表盘数据看板模块的技术实现方案。该模块是后台管理系统的核心运营分析页面,包含4个主要卡片区域:今日订单、今日货币信息、今日收入汇总、用户数据统计。
需要验证后端API是否已完成,如未完成需要新增对应的接口。
Architecture
┌─────────────────────────────────────────────────────────────────────────────┐
│ Data Stand Page (数据看板) │
│ ┌─────────────────────────────┐ ┌─────────────────────────────┐ │
│ │ Today Order Card │ │ Currency Info Card │ │
│ │ (今日订单卡片) │ │ (今日货币信息卡片) │ │
│ │ - 发起订单数 │ │ - 今日/昨日发放钻石 │ │
│ │ - 支付订单数 │ │ - 今日/昨日消费钻石 │ │
│ │ - 消费人数 │ │ - 今日/昨日发放UU币 │ │
│ │ - 订单总金额 │ │ - 今日/昨日消费UU币 │ │
│ │ - 出货总金额 │ │ - 今日/昨日发放达达券 │ │
│ │ - 各支付方式金额 │ │ - 今日/昨日消费达达券 │ │
│ └─────────────────────────────┘ └─────────────────────────────┘ │
│ ┌─────────────────────────────┐ ┌─────────────────────────────┐ │
│ │ Income Summary Card │ │ User Stats Card │ │
│ │ (今日收入汇总卡片) │ │ (用户数据统计卡片) │ │
│ │ - 订单收入 │ │ - 绑定手机号人数 │ │
│ │ - RMB收入 │ │ - 抽奖人数 │ │
│ │ - 钻石商城收入 │ │ - 用户剩余货币 │ │
│ │ - 其他收入 │ │ - 微信支付金额 │ │
│ │ - 支出/发货金额 │ │ - 订单支付数量 │ │
│ │ - 利润 │ │ - 出货/发货金额 │ │
│ └─────────────────────────────┘ └─────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────────────┐
│ API Layer │
│ src/api/business/statistics.ts │
│ - getTodayOrderStats(): Promise<TodayOrderStats> │
│ - getCurrencyInfoStats(): Promise<CurrencyInfoStats> │
│ - getIncomeSummaryStats(): Promise<IncomeSummaryStats> │
│ - getUserStats(): Promise<UserStats> │
└─────────────────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────────────┐
│ Backend API │
│ GET /api/admin/business/statistics/today-order │
│ GET /api/admin/business/statistics/currency-info │
│ GET /api/admin/business/statistics/income-summary │
│ GET /api/admin/business/statistics/user-stats │
└─────────────────────────────────────────────────────────────────────────────┘
Components and Interfaces
1. 后端API模型
1.1 今日订单数据模型
public class TodayOrderStatsResponse
{
public int InitiateOrderCount { get; set; } // 发起订单数
public int PaidOrderCount { get; set; } // 支付订单数
public int UserCount { get; set; } // 消费人数
public decimal OrderZheTotal { get; set; } // 订单总金额(折后)
public decimal GoodsTotalAmount { get; set; } // 出货总金额
public decimal UseCoupon { get; set; } // 优惠券抵扣
public decimal Price { get; set; } // RMB支付
public decimal UseMoney { get; set; } // 钻石支付
public decimal UseIntegral { get; set; } // UU币支付
public decimal UseMoney2 { get; set; } // 达达券支付
}
1.2 货币信息数据模型
public class CurrencyInfoStatsResponse
{
public decimal TodayAddMoney { get; set; } // 今日发放钻石
public decimal TodayUseMoney { get; set; } // 今日消费钻石
public decimal YesterdayAddMoney { get; set; } // 昨日发放钻石
public decimal YesterdayUseMoney { get; set; } // 昨日消费钻石
public decimal TodayAddIntegral { get; set; } // 今日发放UU币
public decimal TodayUseIntegral { get; set; } // 今日消费UU币
public decimal YesterdayAddIntegral { get; set; }// 昨日发放UU币
public decimal YesterdayUseIntegral { get; set; }// 昨日消费UU币
public decimal TodayAddMoney2 { get; set; } // 今日发放达达券
public decimal TodayUseMoney2 { get; set; } // 今日消费达达券
public decimal YesterdayAddMoney2 { get; set; } // 昨日发放达达券
public decimal YesterdayUseMoney2 { get; set; } // 昨日消费达达券
}
1.3 收入汇总数据模型
public class IncomeSummaryStatsResponse
{
public decimal TodayIncome { get; set; } // 订单收入(RMB+钻石)
public decimal RmbIncome { get; set; } // RMB收入
public decimal DiamondIncome { get; set; } // 钻石商城收入
public decimal OtherIncome { get; set; } // 其他收入
public decimal ShippedToday { get; set; } // 订单出货
public decimal Expenses { get; set; } // 支出
public decimal TodayShipped { get; set; } // 当天发货金额
public decimal RemainingCoupon { get; set; } // 当天用户剩余达达券
public decimal BoxRemaining { get; set; } // 盒柜剩余价值
public decimal Profit { get; set; } // 利润
public string Formula { get; set; } // 利润计算公式
}
1.4 用户统计数据模型
public class UserStatsResponse
{
public int UserRegisterCount { get; set; } // 绑定手机号人数
public int ConsumingUserCount { get; set; } // 抽奖人数
public decimal UserMoney { get; set; } // 用户剩余钻石
public decimal UserIntegral { get; set; } // 用户剩余UU币
public decimal UserMoney2 { get; set; } // 用户剩余达达券
public decimal OrderPriceTotal { get; set; } // 微信支付金额
public int OrderTotalCount { get; set; } // 订单支付数量
public decimal TotalGoodsAmount { get; set; } // 用户出货总金额
public decimal BoxRemainingValue { get; set; } // 用户盒柜剩余价值
public decimal ExchangedCoupon { get; set; } // 用户已兑换的达达券
public decimal ShippedAmount { get; set; } // 用户已发货金额
}
2. 前端API模块
文件: src/api/business/statistics.ts
// 今日订单统计响应接口
export interface TodayOrderStats {
initiateOrderCount: number; // 发起订单数
paidOrderCount: number; // 支付订单数
userCount: number; // 消费人数
orderZheTotal: number; // 订单总金额
goodsTotalAmount: number; // 出货总金额
useCoupon: number; // 优惠券抵扣
price: number; // RMB支付
useMoney: number; // 钻石支付
useIntegral: number; // UU币支付
useMoney2: number; // 达达券支付
}
// 货币信息统计响应接口
export interface CurrencyInfoStats {
todayAddMoney: number; // 今日发放钻石
todayUseMoney: number; // 今日消费钻石
yesterdayAddMoney: number; // 昨日发放钻石
yesterdayUseMoney: number; // 昨日消费钻石
todayAddIntegral: number; // 今日发放UU币
todayUseIntegral: number; // 今日消费UU币
yesterdayAddIntegral: number; // 昨日发放UU币
yesterdayUseIntegral: number; // 昨日消费UU币
todayAddMoney2: number; // 今日发放达达券
todayUseMoney2: number; // 今日消费达达券
yesterdayAddMoney2: number; // 昨日发放达达券
yesterdayUseMoney2: number; // 昨日消费达达券
}
// 收入汇总统计响应接口
export interface IncomeSummaryStats {
todayIncome: number; // 订单收入
rmbIncome: number; // RMB收入
diamondIncome: number; // 钻石商城收入
otherIncome: number; // 其他收入
shippedToday: number; // 订单出货
expenses: number; // 支出
todayShipped: number; // 当天发货金额
remainingCoupon: number; // 当天用户剩余达达券
boxRemaining: number; // 盒柜剩余价值
profit: number; // 利润
formula: string; // 利润计算公式
}
// 用户统计响应接口
export interface UserStats {
userRegisterCount: number; // 绑定手机号人数
consumingUserCount: number; // 抽奖人数
userMoney: number; // 用户剩余钻石
userIntegral: number; // 用户剩余UU币
userMoney2: number; // 用户剩余达达券
orderPriceTotal: number; // 微信支付金额
orderTotalCount: number; // 订单支付数量
totalGoodsAmount: number; // 用户出货总金额
boxRemainingValue: number; // 用户盒柜剩余价值
exchangedCoupon: number; // 用户已兑换的达达券
shippedAmount: number; // 用户已发货金额
}
// API函数
export function getTodayOrderStats(): Promise<TodayOrderStats>;
export function getCurrencyInfoStats(): Promise<CurrencyInfoStats>;
export function getIncomeSummaryStats(): Promise<IncomeSummaryStats>;
export function getUserStats(): Promise<UserStats>;
3. 前端组件结构
views/business/statistics/
├── data-stand.vue # 数据看板主页面
├── components/
│ ├── TodayOrderCard.vue # 今日订单卡片
│ ├── CurrencyInfoCard.vue # 货币信息卡片
│ ├── IncomeSummaryCard.vue # 收入汇总卡片
│ └── UserStatsCard.vue # 用户统计卡片
Data Models
数据库表依赖
| 表名 | 用途 |
|---|---|
| orders | 订单表,存储订单信息 |
| order_list | 订单商品表,存储中奖记录 |
| users | 用户表,存储用户信息 |
| profit_money | 钻石流水表 |
| profit_integral | UU币流水表 |
| profit_money2 | 达达券流水表 |
| diamond_orders | 钻石商城订单表 |
| profit_revenue | 其他收入表 |
| profit_expenses | 支出表 |
Correctness Properties
A property is a characteristic or behavior that should hold true across all valid executions of a system-essentially, a formal statement about what the system should do. Properties serve as the bridge between human-readable specifications and machine-verifiable correctness guarantees.
Property 1: 今日订单数据一致性
For any 今日订单统计数据,支付订单数 SHALL 小于等于发起订单数,消费人数 SHALL 小于等于支付订单数。
Validates: Requirements 1.2, 1.3, 1.4
Property 2: 货币信息数据非负性
For any 货币信息统计数据,所有发放和消费数值 SHALL 大于等于0。
Validates: Requirements 2.2-2.13
Property 3: 利润计算正确性
For any 收入汇总统计数据,利润 SHALL 等于 订单收入 - 当天发货金额 - 当天用户剩余达达券 - 盒柜剩余价值。
Validates: Requirements 3.11
Property 4: 用户统计数据非负性
For any 用户统计数据,所有数值 SHALL 大于等于0。
Validates: Requirements 4.2-4.12
Property 5: API响应格式一致性
For any 有效的API响应,所有统计字段 SHALL 被正确映射到对应的卡片并展示。
Validates: Requirements 5.5
Error Handling
API请求错误
- 网络错误: 显示"网络连接失败,请检查网络"提示
- 服务器错误(5xx): 显示"服务器繁忙,请稍后重试"提示
- 权限错误(403): 显示"无权限访问此页面"提示
- 其他错误: 显示通用错误提示
数据展示降级
当API请求失败时,所有统计数值显示为默认值0或"-",确保页面正常渲染。
Testing Strategy
单元测试
-
API模块测试
- 测试API端点配置正确性
- 测试响应数据类型转换
-
格式化函数测试
- 测试金额格式化函数
- 测试边界值(0、负数、大数值)
属性测试
使用 xUnit + FsCheck 进行属性测试:
- Property 1: 验证今日订单数据一致性
- Property 2: 验证货币信息数据非负性
- Property 3: 验证利润计算正确性
- Property 4: 验证用户统计数据非负性
- Property 5: 验证API响应格式一致性
集成测试
- 测试页面加载时API调用
- 测试错误处理和降级展示
- 测试刷新按钮功能