232 lines
5.5 KiB
Markdown
232 lines
5.5 KiB
Markdown
|
|
# 小程序调整说明 - 新分销逻辑
|
|||
|
|
|
|||
|
|
## ✅ 已完成的调整
|
|||
|
|
|
|||
|
|
### 1. UI修改
|
|||
|
|
**文件**: `miniprogram/pages/referral/referral.wxml`
|
|||
|
|
**修改**: 删除"我的邀请码"卡片
|
|||
|
|
|
|||
|
|
```xml
|
|||
|
|
<!-- ✅ 已删除 -->
|
|||
|
|
<!-- <view class="invite-card">
|
|||
|
|
<text class="invite-title">我的邀请码</text>
|
|||
|
|
<text class="invite-code">{{referralCode}}</text>
|
|||
|
|
</view> -->
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## ✅ 无需调整的部分
|
|||
|
|
|
|||
|
|
### 1. 绑定逻辑(app.js)
|
|||
|
|
**文件**: `miniprogram/app.js`
|
|||
|
|
**当前逻辑**: ✅ 完全兼容新逻辑
|
|||
|
|
|
|||
|
|
```javascript
|
|||
|
|
// 点击推荐链接时
|
|||
|
|
handleReferralCode(options) {
|
|||
|
|
// 1. 记录访问
|
|||
|
|
this.recordReferralVisit(refCode)
|
|||
|
|
|
|||
|
|
// 2. 保存推荐码
|
|||
|
|
wx.setStorageSync('referral_code', refCode)
|
|||
|
|
|
|||
|
|
// 3. 如果已登录,立即绑定
|
|||
|
|
if (this.globalData.isLoggedIn) {
|
|||
|
|
this.bindReferralCode(refCode) // 调用 /api/referral/bind
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**为什么无需调整**:
|
|||
|
|
- 小程序只负责调用 `/api/referral/bind`
|
|||
|
|
- 后端API已实现"立即切换"逻辑
|
|||
|
|
- 无论是新绑定、续期还是切换,小程序无需感知
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 2. 支付逻辑(pages/read/read.js)
|
|||
|
|
**文件**: `miniprogram/pages/read/read.js`
|
|||
|
|
**当前逻辑**: ✅ 完全兼容新逻辑
|
|||
|
|
|
|||
|
|
```javascript
|
|||
|
|
// 支付时
|
|||
|
|
const referralCode = wx.getStorageSync('referral_code') || ''
|
|||
|
|
await app.request('/api/miniprogram/pay', {
|
|||
|
|
data: {
|
|||
|
|
amount, // 原价(如 1.00)
|
|||
|
|
referralCode: referralCode || undefined
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**为什么无需调整**:
|
|||
|
|
- 小程序传递原价和推荐码
|
|||
|
|
- 后端自动计算折扣(如 5% off)
|
|||
|
|
- 微信支付弹窗会显示折后价(无需小程序干预)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 3. 分销中心数据展示(pages/referral/referral.js)
|
|||
|
|
**文件**: `miniprogram/pages/referral/referral.js`
|
|||
|
|
**当前逻辑**: ✅ 完全兼容新逻辑
|
|||
|
|
|
|||
|
|
```javascript
|
|||
|
|
// 数据来源
|
|||
|
|
const res = await app.request('/api/referral/data?userId=' + userInfo.id)
|
|||
|
|
|
|||
|
|
// 展示数据
|
|||
|
|
setData({
|
|||
|
|
bindingCount, // 绑定中的人数
|
|||
|
|
paidCount, // 已付款的人数
|
|||
|
|
activeBindings, // 绑定中的用户列表
|
|||
|
|
convertedBindings, // 已付款的用户列表
|
|||
|
|
expiredBindings // 已过期的用户列表
|
|||
|
|
})
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**为什么无需调整**:
|
|||
|
|
- 后端API `/api/referral/data` 已适配新逻辑
|
|||
|
|
- `convertedBindings` 现在返回 `status = 'active' AND purchase_count > 0`
|
|||
|
|
- 小程序只是展示后端数据,无需改代码
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🆕 可选增强功能
|
|||
|
|
|
|||
|
|
### 建议1: 显示购买次数
|
|||
|
|
|
|||
|
|
**当前显示**:
|
|||
|
|
```
|
|||
|
|
用户A +¥0.90
|
|||
|
|
已付款
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**增强后显示**:
|
|||
|
|
```
|
|||
|
|
用户A +¥1.80
|
|||
|
|
已购2次
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**实现方式**(可选):
|
|||
|
|
|
|||
|
|
#### 修改 WXML
|
|||
|
|
```xml
|
|||
|
|
<!-- 在 pages/referral/referral.wxml 的用户状态区域 -->
|
|||
|
|
<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>
|
|||
|
|
</view>
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 修改 JS
|
|||
|
|
```javascript
|
|||
|
|
// 在 pages/referral/referral.js 的 formatUser 函数中
|
|||
|
|
const formatUser = (user, type) => {
|
|||
|
|
return {
|
|||
|
|
id: user.id,
|
|||
|
|
nickname: user.nickname,
|
|||
|
|
commission: (user.commission || 0).toFixed(2),
|
|||
|
|
purchaseCount: user.purchaseCount || 0, // 新增
|
|||
|
|
// ...
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**是否需要**:根据产品需求决定
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 建议2: 显示"切换提示"
|
|||
|
|
|
|||
|
|
当用户点击新的推荐链接时,弹窗提示:
|
|||
|
|
|
|||
|
|
```javascript
|
|||
|
|
// 在 app.js 的 bindReferralCode 函数中
|
|||
|
|
async bindReferralCode(refCode) {
|
|||
|
|
const res = await this.request('/api/referral/bind', {
|
|||
|
|
method: 'POST',
|
|||
|
|
data: { userId, referralCode: refCode }
|
|||
|
|
})
|
|||
|
|
|
|||
|
|
// 新增:切换提示
|
|||
|
|
if (res.success && res.action === 'switch') {
|
|||
|
|
wx.showToast({
|
|||
|
|
title: '已切换推荐人',
|
|||
|
|
icon: 'success'
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**是否需要**:可以让用户明确知道绑定关系已切换
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 建议3: 价格显示优化
|
|||
|
|
|
|||
|
|
**当前**:章节价格固定显示 1.00 元
|
|||
|
|
|
|||
|
|
**优化**:根据是否有推荐码,显示折后价
|
|||
|
|
|
|||
|
|
```javascript
|
|||
|
|
// 在 pages/read/read.js 的 onLoad 或 onShow 中
|
|||
|
|
async loadPriceWithDiscount() {
|
|||
|
|
const referralCode = wx.getStorageSync('referral_code')
|
|||
|
|
let displayPrice = this.data.section.price // 原价 1.00
|
|||
|
|
|
|||
|
|
if (referralCode) {
|
|||
|
|
// 从配置获取折扣
|
|||
|
|
const res = await app.request('/api/db/config?key=referral_config')
|
|||
|
|
if (res.success && res.config?.userDiscount) {
|
|||
|
|
const discount = res.config.userDiscount / 100
|
|||
|
|
displayPrice = this.data.section.price * (1 - discount)
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
this.setData({
|
|||
|
|
displayPrice: displayPrice.toFixed(2),
|
|||
|
|
hasDiscount: referralCode ? true : false
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**WXML显示**:
|
|||
|
|
```xml
|
|||
|
|
<view class="price">
|
|||
|
|
<text wx:if="{{hasDiscount}}" class="original-price">¥1.00</text>
|
|||
|
|
<text class="current-price">¥{{displayPrice}}</text>
|
|||
|
|
<text wx:if="{{hasDiscount}}" class="discount-tag">推荐优惠</text>
|
|||
|
|
</view>
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**是否需要**:可以让用户看到优惠,提升转化率
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📋 小程序调整总结
|
|||
|
|
|
|||
|
|
### 必须调整(已完成)
|
|||
|
|
- ✅ 删除"我的邀请码"卡片
|
|||
|
|
|
|||
|
|
### 无需调整(后端已兼容)
|
|||
|
|
- ✅ 绑定逻辑(app.js)
|
|||
|
|
- ✅ 支付逻辑(pages/read/read.js)
|
|||
|
|
- ✅ 分销中心展示(pages/referral/referral.js)
|
|||
|
|
|
|||
|
|
### 可选增强(看产品需求)
|
|||
|
|
- ⏸️ 显示购买次数
|
|||
|
|
- ⏸️ 显示切换提示
|
|||
|
|
- ⏸️ 显示折后价格
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## ✅ 结论
|
|||
|
|
|
|||
|
|
**小程序端只需要已完成的1处修改(删除邀请码卡片),其他功能都通过后端API自动适配新逻辑,无需额外调整!**
|
|||
|
|
|
|||
|
|
如果你想要可选增强功能,告诉我具体要加哪个,我来帮你实现。
|