Files
template-10584/src/api/invite/index.ts
赵忠林 0b83e67ac1 refactor(invite): 重构邀请二维码生成逻辑
- 优化了 generateMiniProgramCode 函数,直接返回完整的二维码 URL
- 移除了未使用的 getInviteStats 函数调用
- 增加了二维码加载失败时的错误处理和重新生成逻辑
-调整了页面布局,隐藏了邀请统计数据部分
2025-08-23 05:54:10 +08:00

238 lines
5.1 KiB
TypeScript
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.

import request from '@/utils/request';
import type { ApiResult, PageResult } from '@/api';
/**
* 小程序码生成参数
*/
export interface MiniProgramCodeParam {
// 小程序页面路径
page?: string;
// 场景值最大32个可见字符
scene: string;
// 二维码宽度,单位 px最小 280px最大 1280px
width?: number;
// 是否检查页面是否存在
checkPath?: boolean;
// 环境版本
envVersion?: 'release' | 'trial' | 'develop';
}
/**
* 邀请关系参数
*/
export interface InviteRelationParam {
// 邀请人ID
inviterId: number;
// 被邀请人ID
inviteeId: number;
// 邀请来源
source: string;
// 场景值
scene?: string;
// 邀请时间
inviteTime?: string;
}
/**
* 邀请统计数据
*/
export interface InviteStats {
// 总邀请数
totalInvites: number;
// 成功注册数
successfulRegistrations: number;
// 转化率
conversionRate: number;
// 今日邀请数
todayInvites: number;
// 本月邀请数
monthlyInvites: number;
// 邀请来源统计
sourceStats: InviteSourceStat[];
}
/**
* 邀请来源统计
*/
export interface InviteSourceStat {
source: string;
count: number;
successCount: number;
conversionRate: number;
}
/**
* 邀请记录
*/
export interface InviteRecord {
id?: number;
inviterId?: number;
inviteeId?: number;
inviterName?: string;
inviteeName?: string;
source?: string;
scene?: string;
status?: 'pending' | 'registered' | 'activated';
inviteTime?: string;
registerTime?: string;
activateTime?: string;
}
/**
* 邀请记录查询参数
*/
export interface InviteRecordParam {
page?: number;
limit?: number;
inviterId?: number;
status?: string;
source?: string;
startTime?: string;
endTime?: string;
}
/**
* 生成小程序码
*/
export async function generateMiniProgramCode(data: MiniProgramCodeParam) {
try {
const url = '/wx-login/getOrderQRCodeUnlimited/' + data.scene;
// 由于接口直接返回图片buffer我们直接构建完整的URL
return `${API_BASE_URL}${url}`;
} catch (error: any) {
throw new Error(error.message || '生成小程序码失败');
}
}
/**
* 生成邀请小程序码
*/
export async function generateInviteCode(inviterId: number) {
const scene = `uid_${inviterId}`;
return generateMiniProgramCode({
page: 'pages/index/index',
scene: scene,
width: 180,
checkPath: true,
envVersion: 'trial'
});
}
/**
* 建立邀请关系
*/
export async function createInviteRelation(data: InviteRelationParam) {
const res = await request.post<ApiResult<unknown>>(
'/invite/create-relation',
data
);
if (res.code === 0) {
return res.message;
}
return Promise.reject(new Error(res.message));
}
/**
* 处理邀请场景值
*/
export async function processInviteScene(scene: string, userId: number) {
const res = await request.post<ApiResult<unknown>>(
'/invite/process-scene',
{ scene, userId }
);
if (res.code === 0) {
return res.data;
}
return Promise.reject(new Error(res.message));
}
/**
* 获取邀请统计数据
*/
export async function getInviteStats(inviterId: number) {
const res = await request.get<ApiResult<InviteStats>>(
`/invite/stats/${inviterId}`
);
if (res.code === 0) {
return res.data;
}
return Promise.reject(new Error(res.message));
}
/**
* 分页查询邀请记录
*/
export async function pageInviteRecords(params: InviteRecordParam) {
const res = await request.get<ApiResult<PageResult<InviteRecord>>>(
'/invite/records/page',
params
);
if (res.code === 0) {
return res.data;
}
return Promise.reject(new Error(res.message));
}
/**
* 获取我的邀请记录
*/
export async function getMyInviteRecords(params: InviteRecordParam) {
const res = await request.get<ApiResult<PageResult<InviteRecord>>>(
'/invite/my-records',
params
);
if (res.code === 0) {
return res.data;
}
return Promise.reject(new Error(res.message));
}
/**
* 验证邀请码有效性
*/
export async function validateInviteCode(scene: string) {
const res = await request.post<ApiResult<{ valid: boolean; inviterId?: number; source?: string }>>(
'/invite/validate-code',
{ scene }
);
if (res.code === 0) {
return res.data;
}
return Promise.reject(new Error(res.message));
}
/**
* 更新邀请状态
*/
export async function updateInviteStatus(inviteId: number, status: 'registered' | 'activated') {
const res = await request.put<ApiResult<unknown>>(
`/invite/update-status/${inviteId}`,
{ status }
);
if (res.code === 0) {
return res.message;
}
return Promise.reject(new Error(res.message));
}
/**
* 获取邀请排行榜
*/
export async function getInviteRanking(params?: { limit?: number; period?: 'day' | 'week' | 'month' }) {
const res = await request.get<ApiResult<Array<{
inviterId: number;
inviterName: string;
inviteCount: number;
successCount: number;
conversionRate: number;
}>>>(
'/invite/ranking',
params
);
if (res.code === 0) {
return res.data;
}
return Promise.reject(new Error(res.message));
}