442 lines
9.6 KiB
Markdown
442 lines
9.6 KiB
Markdown
|
|
# 分销中心用户列表数据对接说明
|
|||
|
|
|
|||
|
|
## 📋 功能说明
|
|||
|
|
|
|||
|
|
小程序分销中心的"绑定用户"列表,包含三个Tab:
|
|||
|
|
1. **绑定中** - 当前活跃的绑定关系
|
|||
|
|
2. **已付款** - 购买过商品的用户
|
|||
|
|
3. **已过期** - 过期或取消的绑定
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🔧 本次修改
|
|||
|
|
|
|||
|
|
### 1. 后端API优化(/api/referral/data)
|
|||
|
|
|
|||
|
|
**文件**: `app/api/referral/data/route.ts`
|
|||
|
|
|
|||
|
|
**修改内容**:
|
|||
|
|
- 在 `convertedUsers` 中添加 `purchaseCount`(购买次数)字段
|
|||
|
|
|
|||
|
|
```typescript
|
|||
|
|
convertedUsers: convertedBindings.map((b: any) => ({
|
|||
|
|
id: b.referee_id,
|
|||
|
|
nickname: b.nickname,
|
|||
|
|
avatar: b.avatar,
|
|||
|
|
commission: parseFloat(b.commission_amount) || 0,
|
|||
|
|
orderAmount: parseFloat(b.order_amount) || 0,
|
|||
|
|
purchaseCount: parseInt(b.purchase_count) || 0, // 新增
|
|||
|
|
conversionDate: b.conversion_date,
|
|||
|
|
status: 'converted'
|
|||
|
|
}))
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 2. 小程序前端优化
|
|||
|
|
|
|||
|
|
#### 2.1 数据格式化(referral.js)
|
|||
|
|
|
|||
|
|
**文件**: `miniprogram/pages/referral/referral.js`
|
|||
|
|
|
|||
|
|
**修改内容**:
|
|||
|
|
```javascript
|
|||
|
|
// formatUser 函数增强
|
|||
|
|
const formatUser = (user, type) => {
|
|||
|
|
return {
|
|||
|
|
id: user.id,
|
|||
|
|
nickname: user.nickname,
|
|||
|
|
avatar: user.avatar,
|
|||
|
|
status: type,
|
|||
|
|
daysRemaining: user.daysRemaining || 0,
|
|||
|
|
bindingDate: this.formatDate(user.bindingDate),
|
|||
|
|
expiryDate: this.formatDate(user.expiryDate), // 新增:过期时间
|
|||
|
|
commission: (user.commission || 0).toFixed(2),
|
|||
|
|
orderAmount: (user.orderAmount || 0).toFixed(2),
|
|||
|
|
purchaseCount: user.purchaseCount || 0, // 新增:购买次数
|
|||
|
|
conversionDate: this.formatDate(user.conversionDate) // 新增:转化时间
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
#### 2.2 UI显示优化(referral.wxml)
|
|||
|
|
|
|||
|
|
**文件**: `miniprogram/pages/referral/referral.wxml`
|
|||
|
|
|
|||
|
|
**旧代码**:
|
|||
|
|
```xml
|
|||
|
|
<view class="user-status">
|
|||
|
|
<block wx:if="{{item.status === 'converted'}}">
|
|||
|
|
<text class="status-amount">+¥{{item.commission}}</text>
|
|||
|
|
<text class="status-order">订单 ¥{{item.orderAmount}}</text>
|
|||
|
|
</block>
|
|||
|
|
<block wx:else>
|
|||
|
|
<text class="status-tag">
|
|||
|
|
{{item.status === 'expired' ? '已过期' : item.daysRemaining + '天'}}
|
|||
|
|
</text>
|
|||
|
|
</block>
|
|||
|
|
</view>
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**新代码**:
|
|||
|
|
```xml
|
|||
|
|
<view class="user-status">
|
|||
|
|
<!-- 已付款:显示佣金 + 购买次数 -->
|
|||
|
|
<block wx:if="{{item.status === 'converted'}}">
|
|||
|
|
<text class="status-amount">+¥{{item.commission}}</text>
|
|||
|
|
<text class="status-order">已购{{item.purchaseCount || 1}}次</text>
|
|||
|
|
</block>
|
|||
|
|
|
|||
|
|
<!-- 已过期:显示过期标签 + 过期时间 -->
|
|||
|
|
<block wx:elif="{{item.status === 'expired'}}">
|
|||
|
|
<text class="status-tag tag-gray">已过期</text>
|
|||
|
|
<text class="status-time">{{item.expiryDate}}</text>
|
|||
|
|
</block>
|
|||
|
|
|
|||
|
|
<!-- 绑定中:显示剩余天数 -->
|
|||
|
|
<block wx:else>
|
|||
|
|
<text class="status-tag {{item.daysRemaining <= 3 ? 'tag-red' : item.daysRemaining <= 7 ? 'tag-orange' : 'tag-green'}}">
|
|||
|
|
{{item.daysRemaining}}天
|
|||
|
|
</text>
|
|||
|
|
</block>
|
|||
|
|
</view>
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📊 数据流向
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
后端 /api/referral/data
|
|||
|
|
↓
|
|||
|
|
返回三类用户数据
|
|||
|
|
├─ activeUsers(绑定中)
|
|||
|
|
│ - daysRemaining(剩余天数)
|
|||
|
|
│ - bindingDate(绑定时间)
|
|||
|
|
│
|
|||
|
|
├─ convertedUsers(已付款)
|
|||
|
|
│ - commission(佣金)
|
|||
|
|
│ - purchaseCount(购买次数)✨ 新增
|
|||
|
|
│ - conversionDate(转化时间)
|
|||
|
|
│
|
|||
|
|
└─ expiredUsers(已过期)
|
|||
|
|
- expiryDate(过期时间)
|
|||
|
|
- bindingDate(绑定时间)
|
|||
|
|
↓
|
|||
|
|
小程序接收并格式化
|
|||
|
|
↓
|
|||
|
|
分Tab显示
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🎨 显示效果
|
|||
|
|
|
|||
|
|
### Tab 1: 绑定中
|
|||
|
|
```
|
|||
|
|
┌─────────────────────────────┐
|
|||
|
|
│ [头像] 张三 │
|
|||
|
|
│ 绑定于 02-01 │
|
|||
|
|
│ [15天]│
|
|||
|
|
└─────────────────────────────┘
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**显示内容**:
|
|||
|
|
- 用户昵称
|
|||
|
|
- 绑定时间
|
|||
|
|
- 剩余天数(颜色标识:绿色>7天,橙色3-7天,红色≤3天)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### Tab 2: 已付款
|
|||
|
|
```
|
|||
|
|
┌─────────────────────────────┐
|
|||
|
|
│ [✓] 李四 │
|
|||
|
|
│ 绑定于 01-20 │
|
|||
|
|
│ +¥0.90 已购1次│
|
|||
|
|
└─────────────────────────────┘
|
|||
|
|
|
|||
|
|
┌─────────────────────────────┐
|
|||
|
|
│ [✓] 王五 │
|
|||
|
|
│ 绑定于 01-15 │
|
|||
|
|
│ +¥2.70 已购3次│
|
|||
|
|
└─────────────────────────────┘
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**显示内容**:
|
|||
|
|
- 用户昵称(头像显示✓)
|
|||
|
|
- 绑定时间
|
|||
|
|
- 累计佣金
|
|||
|
|
- **购买次数**(✨ 新增)
|
|||
|
|
|
|||
|
|
**数据来源**:
|
|||
|
|
```javascript
|
|||
|
|
{
|
|||
|
|
commission: 0.90, // 累计佣金
|
|||
|
|
purchaseCount: 1, // 购买次数 ✨
|
|||
|
|
conversionDate: "2026-01-20"
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### Tab 3: 已过期
|
|||
|
|
```
|
|||
|
|
┌─────────────────────────────┐
|
|||
|
|
│ [⏰] 赵六 │
|
|||
|
|
│ 绑定于 01-05 │
|
|||
|
|
│ [已过期] 02-04│
|
|||
|
|
└─────────────────────────────┘
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**显示内容**:
|
|||
|
|
- 用户昵称(头像显示⏰)
|
|||
|
|
- 绑定时间
|
|||
|
|
- 已过期标签
|
|||
|
|
- **过期时间**(✨ 优化显示)
|
|||
|
|
|
|||
|
|
**数据来源**:
|
|||
|
|
```javascript
|
|||
|
|
{
|
|||
|
|
bindingDate: "2026-01-05",
|
|||
|
|
expiryDate: "2026-02-04" // 显示具体过期日期
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🔍 数据验证
|
|||
|
|
|
|||
|
|
### 测试场景1: 已付款用户(单次购买)
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"nickname": "张三",
|
|||
|
|
"commission": 0.90,
|
|||
|
|
"purchaseCount": 1,
|
|||
|
|
"conversionDate": "2026-02-01"
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**显示**: `+¥0.90 已购1次`
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 测试场景2: 已付款用户(多次购买)
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"nickname": "李四",
|
|||
|
|
"commission": 2.70,
|
|||
|
|
"purchaseCount": 3,
|
|||
|
|
"conversionDate": "2026-01-20"
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**显示**: `+¥2.70 已购3次`
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 测试场景3: 已过期用户
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"nickname": "王五",
|
|||
|
|
"bindingDate": "2026-01-05",
|
|||
|
|
"expiryDate": "2026-02-04"
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**显示**:
|
|||
|
|
- 标签:`已过期`
|
|||
|
|
- 时间:`02-04`
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🎯 优化亮点
|
|||
|
|
|
|||
|
|
### 1. 已付款用户
|
|||
|
|
**旧显示**:
|
|||
|
|
```
|
|||
|
|
+¥0.90
|
|||
|
|
订单 ¥1.00
|
|||
|
|
```
|
|||
|
|
- ❌ 显示订单金额(用户可能多次购买,只显示一个金额不准确)
|
|||
|
|
|
|||
|
|
**新显示**:
|
|||
|
|
```
|
|||
|
|
+¥0.90
|
|||
|
|
已购1次
|
|||
|
|
```
|
|||
|
|
- ✅ 显示购买次数(更直观)
|
|||
|
|
- ✅ 支持多次购买(已购3次)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 2. 已过期用户
|
|||
|
|
**旧显示**:
|
|||
|
|
```
|
|||
|
|
[已过期]
|
|||
|
|
```
|
|||
|
|
- ❌ 只有标签,不知道什么时候过期
|
|||
|
|
|
|||
|
|
**新显示**:
|
|||
|
|
```
|
|||
|
|
[已过期] 02-04
|
|||
|
|
```
|
|||
|
|
- ✅ 显示具体过期时间
|
|||
|
|
- ✅ 用户可以看到过期日期
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📊 后端数据说明
|
|||
|
|
|
|||
|
|
### convertedBindings 查询
|
|||
|
|
```sql
|
|||
|
|
SELECT
|
|||
|
|
rb.referee_id,
|
|||
|
|
rb.purchase_count, -- 购买次数
|
|||
|
|
rb.total_commission, -- 累计佣金
|
|||
|
|
rb.last_purchase_date, -- 最后购买时间
|
|||
|
|
u.nickname, u.avatar
|
|||
|
|
FROM referral_bindings rb
|
|||
|
|
JOIN users u ON rb.referee_id = u.id
|
|||
|
|
WHERE rb.referrer_id = ?
|
|||
|
|
AND rb.status = 'active'
|
|||
|
|
AND rb.purchase_count > 0
|
|||
|
|
ORDER BY rb.last_purchase_date DESC
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**关键字段**:
|
|||
|
|
- `purchase_count` - 购买次数(每次购买 +1)
|
|||
|
|
- `total_commission` - 累计佣金(每次购买累加)
|
|||
|
|
- `last_purchase_date` - 最后购买时间(用于排序)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### expiredBindings 查询
|
|||
|
|
```sql
|
|||
|
|
SELECT
|
|||
|
|
rb.referee_id,
|
|||
|
|
rb.binding_date, -- 绑定时间
|
|||
|
|
rb.expiry_date, -- 过期时间
|
|||
|
|
u.nickname, u.avatar
|
|||
|
|
FROM referral_bindings rb
|
|||
|
|
JOIN users u ON rb.referee_id = u.id
|
|||
|
|
WHERE rb.referrer_id = ?
|
|||
|
|
AND (rb.status = 'expired' OR rb.status = 'cancelled')
|
|||
|
|
ORDER BY rb.expiry_date DESC
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**关键字段**:
|
|||
|
|
- `binding_date` - 绑定时间
|
|||
|
|
- `expiry_date` - 过期时间(显示在前端)
|
|||
|
|
- `status` - expired(自然过期)或 cancelled(被切换)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🚀 部署步骤
|
|||
|
|
|
|||
|
|
### 1. 后端部署
|
|||
|
|
```bash
|
|||
|
|
pnpm build
|
|||
|
|
python devlop.py
|
|||
|
|
pm2 restart soul
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2. 小程序上传
|
|||
|
|
- 在微信开发者工具上传代码
|
|||
|
|
- 提交审核
|
|||
|
|
- 发布新版本
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## ✅ 测试清单
|
|||
|
|
|
|||
|
|
### 已付款用户
|
|||
|
|
- [ ] 显示累计佣金
|
|||
|
|
- [ ] 显示购买次数
|
|||
|
|
- [ ] 单次购买显示"已购1次"
|
|||
|
|
- [ ] 多次购买显示"已购N次"
|
|||
|
|
- [ ] 头像显示✓标记
|
|||
|
|
|
|||
|
|
### 已过期用户
|
|||
|
|
- [ ] 显示"已过期"标签
|
|||
|
|
- [ ] 显示过期时间
|
|||
|
|
- [ ] 头像显示⏰标记
|
|||
|
|
- [ ] 时间格式正确(MM-DD)
|
|||
|
|
|
|||
|
|
### 绑定中用户
|
|||
|
|
- [ ] 显示剩余天数
|
|||
|
|
- [ ] 颜色标识正确(绿/橙/红)
|
|||
|
|
- [ ] 头像显示首字母
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🎨 样式优化(可选)
|
|||
|
|
|
|||
|
|
如果需要调整样式,在 `referral.wxss` 中添加:
|
|||
|
|
|
|||
|
|
```css
|
|||
|
|
/* 已过期时间显示 */
|
|||
|
|
.status-time {
|
|||
|
|
font-size: 22rpx;
|
|||
|
|
color: #999;
|
|||
|
|
margin-top: 4rpx;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/* 灰色标签(已过期) */
|
|||
|
|
.tag-gray {
|
|||
|
|
background: #f5f5f5;
|
|||
|
|
color: #999;
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📝 API 返回数据示例
|
|||
|
|
|
|||
|
|
### 完整响应
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"success": true,
|
|||
|
|
"data": {
|
|||
|
|
"activeUsers": [
|
|||
|
|
{
|
|||
|
|
"id": "user_123",
|
|||
|
|
"nickname": "张三",
|
|||
|
|
"avatar": "https://...",
|
|||
|
|
"daysRemaining": 15,
|
|||
|
|
"bindingDate": "2026-01-20T10:00:00.000Z",
|
|||
|
|
"status": "active"
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"convertedUsers": [
|
|||
|
|
{
|
|||
|
|
"id": "user_456",
|
|||
|
|
"nickname": "李四",
|
|||
|
|
"avatar": "https://...",
|
|||
|
|
"commission": 0.90,
|
|||
|
|
"orderAmount": 1.00,
|
|||
|
|
"purchaseCount": 1,
|
|||
|
|
"conversionDate": "2026-02-01T14:30:00.000Z",
|
|||
|
|
"status": "converted"
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"expiredUsers": [
|
|||
|
|
{
|
|||
|
|
"id": "user_789",
|
|||
|
|
"nickname": "王五",
|
|||
|
|
"avatar": "https://...",
|
|||
|
|
"bindingDate": "2026-01-05T08:00:00.000Z",
|
|||
|
|
"expiryDate": "2026-02-04T08:00:00.000Z",
|
|||
|
|
"status": "expired"
|
|||
|
|
}
|
|||
|
|
]
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
**✅ 分销中心用户列表数据已完全对接!支持显示购买次数和过期时间。**
|