183 lines
5.8 KiB
JavaScript
183 lines
5.8 KiB
JavaScript
// pages/promoter/index/index.js
|
|
import { fetchPromoterInfo, fetchPromoterOrders, fetchPromoterQrcode } from '../../../services/promoter/fetchPromoter';
|
|
import { fetchConfig } from '../../../services/home/home';
|
|
import { withPromoter } from '../../../utils/promoter';
|
|
|
|
const PAGE_SIZE = 10;
|
|
|
|
Page({
|
|
data: {
|
|
// 推广概览:enabled 是否开启分佣、soft_ratio_percent 软件订单佣金比例(%)、
|
|
// demand_ratio_percent 需求订单佣金比例(%)、invite_count 推广用户数、
|
|
// order_count 推广订单数、settled_amount 累计已结算佣金(元)、pending_count 待结算订单数
|
|
overview: {},
|
|
overviewStatus: 'loading', // 概览加载状态 loading=加载中 success=成功 failed=失败
|
|
overviewError: '', // 概览加载失败原因
|
|
list: [], // 推广订单列表
|
|
page: 1, // 下一次请求的页码
|
|
hasMore: true, // 是否还有更多数据
|
|
isEmpty: false, // 列表是否为空
|
|
loadMoreStatus: 0, // 加载状态 0=空闲 1=加载中 2=没有更多 3=失败
|
|
showQrcode: false, // 是否展示推广码弹窗
|
|
qrcode: '', // 推广小程序码 data URL
|
|
qrcodeLoading: false, // 推广码生成中
|
|
saving: false, // 保存推广码中
|
|
shareImage: '', // 分享卡片预览图(后台配置 site.promotion_share_image),为空时微信默认截取当前页
|
|
},
|
|
|
|
onLoad() {
|
|
this.loadOverview();
|
|
this.loadList(true);
|
|
this.loadShareImage();
|
|
},
|
|
|
|
async loadShareImage() {
|
|
try {
|
|
const res = await fetchConfig();
|
|
if (res.code === 1 && res.data?.promotion_share_image) {
|
|
this.setData({ shareImage: res.data.promotion_share_image });
|
|
}
|
|
} catch (err) {
|
|
console.error('loadShareImage failed:', err);
|
|
}
|
|
},
|
|
|
|
async onPullDownRefresh() {
|
|
await Promise.all([this.loadOverview(), this.loadList(true)]);
|
|
wx.stopPullDownRefresh();
|
|
},
|
|
|
|
onReachBottom() {
|
|
if (this.data.hasMore && this.data.loadMoreStatus !== 1) {
|
|
this.loadList();
|
|
}
|
|
},
|
|
|
|
onShareAppMessage() {
|
|
const share = {
|
|
title: '代码邦 - 软件商城与定制开发平台',
|
|
path: withPromoter('/pages/home/home'),
|
|
};
|
|
if (this.data.shareImage) {
|
|
share.imageUrl = this.data.shareImage;
|
|
}
|
|
return share;
|
|
},
|
|
|
|
async loadOverview() {
|
|
try {
|
|
const res = await fetchPromoterInfo();
|
|
if (res.code !== 1) {
|
|
this.setData({ overviewStatus: 'failed', overviewError: res.msg || '推广信息加载失败' });
|
|
return;
|
|
}
|
|
this.setData({ overview: res.data, overviewStatus: 'success', overviewError: '' });
|
|
} catch (err) {
|
|
console.error('fetchPromoterInfo failed:', err);
|
|
this.setData({ overviewStatus: 'failed', overviewError: '网络异常,请下拉刷新重试' });
|
|
}
|
|
},
|
|
|
|
async loadList(fresh = false) {
|
|
const page = fresh ? 1 : this.data.page;
|
|
this.setData({ loadMoreStatus: 1 });
|
|
try {
|
|
const res = await fetchPromoterOrders({ page, pageSize: PAGE_SIZE });
|
|
if (res.code !== 1) {
|
|
this.setData({ loadMoreStatus: 3 });
|
|
return;
|
|
}
|
|
const { data = [], current_page: currentPage, last_page: lastPage } = res.data;
|
|
const list = fresh ? data : this.data.list.concat(data);
|
|
const hasMore = currentPage < lastPage;
|
|
this.setData({
|
|
list,
|
|
page: currentPage + 1,
|
|
hasMore,
|
|
isEmpty: list.length === 0,
|
|
loadMoreStatus: hasMore ? 0 : 2,
|
|
});
|
|
} catch (err) {
|
|
console.error('fetchPromoterOrders failed:', err);
|
|
this.setData({ loadMoreStatus: 3 });
|
|
}
|
|
},
|
|
|
|
onRetryLoad() {
|
|
this.loadList();
|
|
},
|
|
|
|
async onShowQrcode() {
|
|
this.setData({ showQrcode: true });
|
|
if (this.data.qrcode || this.data.qrcodeLoading) {
|
|
return;
|
|
}
|
|
this.setData({ qrcodeLoading: true });
|
|
try {
|
|
const res = await fetchPromoterQrcode({ envVersion: wx.$api.envVersion });
|
|
if (res.code !== 1) {
|
|
wx.showToast({ title: res.msg || '推广码生成失败', icon: 'none' });
|
|
return;
|
|
}
|
|
this.setData({ qrcode: res.data.qrcode });
|
|
} catch (err) {
|
|
console.error('fetchPromoterQrcode failed:', err);
|
|
wx.showToast({ title: '网络异常,请重试', icon: 'none' });
|
|
} finally {
|
|
this.setData({ qrcodeLoading: false });
|
|
}
|
|
},
|
|
|
|
onQrcodeVisibleChange(e) {
|
|
this.setData({ showQrcode: e.detail.visible });
|
|
},
|
|
|
|
onCloseQrcode() {
|
|
this.setData({ showQrcode: false });
|
|
},
|
|
|
|
/** 保存推广码到相册:data URL 需先写入本地文件 */
|
|
async onSaveQrcode() {
|
|
const { qrcode, saving } = this.data;
|
|
if (!qrcode || saving) {
|
|
return;
|
|
}
|
|
this.setData({ saving: true });
|
|
try {
|
|
const [meta, base64] = qrcode.split(',');
|
|
const ext = meta.indexOf('png') > -1 ? 'png' : 'jpg';
|
|
const filePath = `${wx.env.USER_DATA_PATH}/promoter_qrcode.${ext}`;
|
|
wx.getFileSystemManager().writeFileSync(filePath, base64, 'base64');
|
|
await this.saveImage(filePath);
|
|
wx.showToast({ title: '已保存到相册', icon: 'success' });
|
|
} catch (err) {
|
|
console.error('saveQrcode failed:', err);
|
|
if (err && err.errMsg && err.errMsg.indexOf('auth') > -1) {
|
|
this.guideAlbumSetting();
|
|
} else if (!(err && err.errMsg && err.errMsg.indexOf('cancel') > -1)) {
|
|
wx.showToast({ title: '保存失败,请重试', icon: 'none' });
|
|
}
|
|
} finally {
|
|
this.setData({ saving: false });
|
|
}
|
|
},
|
|
|
|
saveImage(filePath) {
|
|
return new Promise((resolve, reject) => {
|
|
wx.saveImageToPhotosAlbum({ filePath, success: resolve, fail: reject });
|
|
});
|
|
},
|
|
|
|
guideAlbumSetting() {
|
|
wx.showModal({
|
|
title: '提示',
|
|
content: '需要授权保存到相册,是否前往设置开启?',
|
|
success: (res) => {
|
|
if (res.confirm) {
|
|
wx.openSetting();
|
|
}
|
|
},
|
|
});
|
|
},
|
|
});
|