From 4397a0ad6b2e62111d5621aba4ac3a898605d88e Mon Sep 17 00:00:00 2001 From: archer <545436317@qq.com> Date: Fri, 21 Apr 2023 22:23:19 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A5=BD=E5=8F=8B=E9=82=80=E8=AF=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/imgs/wx300-2.jpg | Bin 0 -> 60644 bytes src/api/response/user.d.ts | 8 + src/api/user.ts | 14 +- src/components/Icon/icons/promotion.svg | 1 + src/components/Icon/icons/withdraw.svg | 1 + src/components/Icon/index.tsx | 4 +- src/components/Layout/index.tsx | 6 + src/constants/user.ts | 12 ++ src/hooks/usePagination.tsx | 2 +- src/pages/api/user/checkPayResult.ts | 25 ++- src/pages/api/user/getPayOrders.ts | 3 +- .../api/user/promotion/getPromotionData.ts | 70 +++++++ src/pages/api/user/promotion/getPromotions.ts | 48 +++++ src/pages/number/components/BillTable.tsx | 7 +- src/pages/number/setting.tsx | 20 +- src/pages/promotion/index.tsx | 179 ++++++++++++++++++ src/service/models/promotionRecord.ts | 31 +++ src/service/models/user.ts | 5 - src/service/mongo.ts | 1 + src/service/utils/promotion.ts | 36 ++++ src/types/mongoSchema.d.ts | 12 ++ src/types/user.d.ts | 3 + 22 files changed, 471 insertions(+), 17 deletions(-) create mode 100644 public/imgs/wx300-2.jpg create mode 100644 src/components/Icon/icons/promotion.svg create mode 100644 src/components/Icon/icons/withdraw.svg create mode 100644 src/pages/api/user/promotion/getPromotionData.ts create mode 100644 src/pages/api/user/promotion/getPromotions.ts create mode 100644 src/pages/promotion/index.tsx create mode 100644 src/service/models/promotionRecord.ts create mode 100644 src/service/utils/promotion.ts diff --git a/public/imgs/wx300-2.jpg b/public/imgs/wx300-2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..32623b1710f8bef902e1a2448e88e42be87be5c9 GIT binary patch literal 60644 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 rkSYx`_f( GET('/user/tokenLogin'); +/* get promotion init data */ +export const getPromotionInitData = () => + GET<{ + invitedAmount: number; + historyAmount: number; + residueAmount: number; + }>('/user/promotion/getPromotionData'); + export const postRegister = ({ username, password, @@ -73,3 +81,7 @@ export const getPayCode = (amount: number) => }>(`/user/getPayCode?amount=${amount}`); export const checkPayResult = (payId: string) => GET(`/user/checkPayResult?payId=${payId}`); + +/* promotion records */ +export const getPromotionRecords = (data: RequestPaging) => + GET(`/user/promotion/getPromotions?${Obj2Query(data)}`); diff --git a/src/components/Icon/icons/promotion.svg b/src/components/Icon/icons/promotion.svg new file mode 100644 index 000000000..b132c3ae4 --- /dev/null +++ b/src/components/Icon/icons/promotion.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/components/Icon/icons/withdraw.svg b/src/components/Icon/icons/withdraw.svg new file mode 100644 index 000000000..c7cc52da5 --- /dev/null +++ b/src/components/Icon/icons/withdraw.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/components/Icon/index.tsx b/src/components/Icon/index.tsx index a5be36b50..a9ba353d4 100644 --- a/src/components/Icon/index.tsx +++ b/src/components/Icon/index.tsx @@ -14,7 +14,9 @@ const map = { develop: require('./icons/develop.svg').default, user: require('./icons/user.svg').default, chatting: require('./icons/chatting.svg').default, - delete: require('./icons/delete.svg').default + promotion: require('./icons/promotion.svg').default, + delete: require('./icons/delete.svg').default, + withdraw: require('./icons/withdraw.svg').default }; export type IconName = keyof typeof map; diff --git a/src/components/Layout/index.tsx b/src/components/Layout/index.tsx index 3f3afdf44..aea56cfd4 100644 --- a/src/components/Layout/index.tsx +++ b/src/components/Layout/index.tsx @@ -32,6 +32,12 @@ const navbarList = [ link: '/number/setting', activeLink: ['/number/setting'] }, + { + label: '邀请', + icon: 'promotion', + link: '/promotion', + activeLink: ['/promotion'] + }, { label: '开发', icon: 'develop', diff --git a/src/constants/user.ts b/src/constants/user.ts index 11e039135..bd204bd59 100644 --- a/src/constants/user.ts +++ b/src/constants/user.ts @@ -20,3 +20,15 @@ export const BillTypeMap: Record<`${BillTypeEnum}`, string> = { [BillTypeEnum.vector]: '索引生成', [BillTypeEnum.return]: '退款' }; + +export enum PromotionEnum { + invite = 'invite', + shareModel = 'shareModel', + withdraw = 'withdraw' +} + +export const PromotionTypeMap = { + [PromotionEnum.invite]: '好友充值', + [PromotionEnum.shareModel]: '模型分享', + [PromotionEnum.withdraw]: '提现' +}; diff --git a/src/hooks/usePagination.tsx b/src/hooks/usePagination.tsx index 0f0439445..651db61d2 100644 --- a/src/hooks/usePagination.tsx +++ b/src/hooks/usePagination.tsx @@ -18,7 +18,7 @@ export const usePagination = ({ const [pageNum, setPageNum] = useState(1); const [total, setTotal] = useState(0); const [data, setData] = useState([]); - const maxPage = useMemo(() => Math.ceil(total / pageSize), [pageSize, total]); + const maxPage = useMemo(() => Math.ceil(total / pageSize) || 1, [pageSize, total]); const { mutate, isLoading } = useMutation({ mutationFn: async (num: number = pageNum) => { diff --git a/src/pages/api/user/checkPayResult.ts b/src/pages/api/user/checkPayResult.ts index 8fc6906a6..c4eb3678b 100644 --- a/src/pages/api/user/checkPayResult.ts +++ b/src/pages/api/user/checkPayResult.ts @@ -2,9 +2,11 @@ import type { NextApiRequest, NextApiResponse } from 'next'; import { jsonRes } from '@/service/response'; import { connectToDatabase, User, Pay } from '@/service/mongo'; import { authToken } from '@/service/utils/tools'; -import { PaySchema } from '@/types/mongoSchema'; +import { PaySchema, UserModelSchema } from '@/types/mongoSchema'; import dayjs from 'dayjs'; import { getPayResult } from '@/service/utils/wxpay'; +import { pushPromotionRecord } from '@/service/utils/promotion'; +import { PRICE_SCALE } from '@/constants/common'; /* 校验支付结果 */ export default async function handler(req: NextApiRequest, res: NextApiResponse) { @@ -26,6 +28,17 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) throw new Error('订单已结算'); } + // 获取当前用户 + const user = await User.findById(userId); + if (!user) { + throw new Error('找不到用户'); + } + // 获取邀请者 + let inviter: UserModelSchema | null = null; + if (user.inviterId) { + inviter = await User.findById(user.inviterId); + } + const payRes = await getPayResult(payOrder.orderId); // 校验下是否超过一天 @@ -50,6 +63,16 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) await User.findByIdAndUpdate(userId, { $inc: { balance: payOrder.price } }); + // 推广佣金发放 + if (inviter) { + pushPromotionRecord({ + userId: inviter._id, + objUId: userId, + type: 'invite', + // amount 单位为元,需要除以缩放比例,最后乘比例 + amount: (payOrder.price / PRICE_SCALE) * inviter.promotion.rate * 0.01 + }); + } jsonRes(res, { data: '支付成功' }); diff --git a/src/pages/api/user/getPayOrders.ts b/src/pages/api/user/getPayOrders.ts index 892fcd706..ebe00fa3c 100644 --- a/src/pages/api/user/getPayOrders.ts +++ b/src/pages/api/user/getPayOrders.ts @@ -15,7 +15,8 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) await connectToDatabase(); const records = await Pay.find({ - userId + userId, + status: { $ne: 'CLOSED' } }).sort({ createTime: -1 }); jsonRes(res, { diff --git a/src/pages/api/user/promotion/getPromotionData.ts b/src/pages/api/user/promotion/getPromotionData.ts new file mode 100644 index 000000000..ec2f790a5 --- /dev/null +++ b/src/pages/api/user/promotion/getPromotionData.ts @@ -0,0 +1,70 @@ +// Next.js API route support: https://nextjs.org/docs/api-routes/introduction +import type { NextApiRequest, NextApiResponse } from 'next'; +import { jsonRes } from '@/service/response'; +import { connectToDatabase, User, promotionRecord } from '@/service/mongo'; +import { authToken } from '@/service/utils/tools'; +import mongoose from 'mongoose'; + +export default async function handler(req: NextApiRequest, res: NextApiResponse) { + try { + const { authorization } = req.headers; + + if (!authorization) { + throw new Error('缺少登录凭证'); + } + + const userId = await authToken(authorization); + + await connectToDatabase(); + + const invitedAmount = await User.countDocuments({ + inviterId: userId + }); + + // 计算累计合 + const countHistory: { totalAmount: number }[] = await promotionRecord.aggregate([ + { $match: { userId: new mongoose.Types.ObjectId(userId), amount: { $gt: 0 } } }, + { + $group: { + _id: null, // 分组条件,这里使用 null 表示不分组 + totalAmount: { $sum: '$amount' } // 计算 amount 字段的总和 + } + }, + { + $project: { + _id: false, // 排除 _id 字段 + totalAmount: true // 只返回 totalAmount 字段 + } + } + ]); + // 计算剩余金额 + const countResidue: { totalAmount: number }[] = await promotionRecord.aggregate([ + { $match: { userId: new mongoose.Types.ObjectId(userId) } }, + { + $group: { + _id: null, // 分组条件,这里使用 null 表示不分组 + totalAmount: { $sum: '$amount' } // 计算 amount 字段的总和 + } + }, + { + $project: { + _id: false, // 排除 _id 字段 + totalAmount: true // 只返回 totalAmount 字段 + } + } + ]); + + jsonRes(res, { + data: { + invitedAmount, + historyAmount: countHistory[0]?.totalAmount || 0, + residueAmount: countResidue[0]?.totalAmount || 0 + } + }); + } catch (err) { + jsonRes(res, { + code: 500, + error: err + }); + } +} diff --git a/src/pages/api/user/promotion/getPromotions.ts b/src/pages/api/user/promotion/getPromotions.ts new file mode 100644 index 000000000..536276d81 --- /dev/null +++ b/src/pages/api/user/promotion/getPromotions.ts @@ -0,0 +1,48 @@ +// Next.js API route support: https://nextjs.org/docs/api-routes/introduction +import type { NextApiRequest, NextApiResponse } from 'next'; +import { jsonRes } from '@/service/response'; +import { connectToDatabase, promotionRecord } from '@/service/mongo'; +import { authToken } from '@/service/utils/tools'; + +export default async function handler(req: NextApiRequest, res: NextApiResponse) { + try { + const { authorization } = req.headers; + let { pageNum = 1, pageSize = 10 } = req.query as { pageNum: string; pageSize: string }; + pageNum = +pageNum; + pageSize = +pageSize; + if (!authorization) { + throw new Error('缺少登录凭证'); + } + + const userId = await authToken(authorization); + + await connectToDatabase(); + + const data = await promotionRecord + .find( + { + userId + }, + '_id createTime type amount' + ) + .sort({ _id: -1 }) + .skip((pageNum - 1) * pageSize) + .limit(pageSize); + + jsonRes(res, { + data: { + pageNum, + pageSize, + data, + total: await promotionRecord.countDocuments({ + userId + }) + } + }); + } catch (err) { + jsonRes(res, { + code: 500, + error: err + }); + } +} diff --git a/src/pages/number/components/BillTable.tsx b/src/pages/number/components/BillTable.tsx index 61eb80056..aa1ba74ba 100644 --- a/src/pages/number/components/BillTable.tsx +++ b/src/pages/number/components/BillTable.tsx @@ -45,11 +45,12 @@ const BillTable = () => { ))} - - - + + + + ); }; diff --git a/src/pages/number/setting.tsx b/src/pages/number/setting.tsx index 1650c5fb6..df646d654 100644 --- a/src/pages/number/setting.tsx +++ b/src/pages/number/setting.tsx @@ -7,7 +7,8 @@ import { useToast } from '@/hooks/useToast'; import { useGlobalStore } from '@/store/global'; import { useUserStore } from '@/store/user'; import { UserType } from '@/types/user'; - +import { clearToken } from '@/utils/user'; +import { useRouter } from 'next/router'; import { useQuery } from '@tanstack/react-query'; import dynamic from 'next/dynamic'; @@ -16,6 +17,7 @@ const BilTable = dynamic(() => import('./components/BillTable')); const PayModal = dynamic(() => import('./components/PayModal')); const NumberSetting = () => { + const router = useRouter(); const { userInfo, updateUserInfo, initUserInfo } = useUserStore(); const { setLoading } = useGlobalStore(); const { register, handleSubmit } = useForm({ @@ -43,13 +45,23 @@ const NumberSetting = () => { useQuery(['init'], initUserInfo); + const onclickLogOut = useCallback(() => { + clearToken(); + router.replace('/login'); + }, [router]); + return ( <> {/* 核心信息 */} - - 账号信息 - + + + 账号信息 + + + 账号: {userInfo?.username} diff --git a/src/pages/promotion/index.tsx b/src/pages/promotion/index.tsx new file mode 100644 index 000000000..2563700dd --- /dev/null +++ b/src/pages/promotion/index.tsx @@ -0,0 +1,179 @@ +import React, { useState } from 'react'; +import Link from 'next/link'; +import { + Card, + Box, + Button, + Flex, + Table, + Thead, + Tbody, + Tr, + Th, + Td, + TableContainer, + Modal, + ModalOverlay, + ModalContent, + ModalHeader, + ModalBody, + ModalCloseButton, + useColorModeValue, + ModalFooter, + useDisclosure +} from '@chakra-ui/react'; +import { useQuery } from '@tanstack/react-query'; +import { useLoading } from '@/hooks/useLoading'; +import dayjs from 'dayjs'; +import { useCopyData } from '@/utils/tools'; +import { useUserStore } from '@/store/user'; +import MyIcon from '@/components/Icon'; +import { getPromotionRecords } from '@/api/user'; +import { usePagination } from '@/hooks/usePagination'; +import { PromotionRecordType } from '@/api/response/user'; +import { PromotionTypeMap } from '@/constants/user'; +import { getPromotionInitData } from '@/api/user'; +import Image from 'next/image'; + +const OpenApi = () => { + const { Loading } = useLoading(); + const { userInfo, initUserInfo } = useUserStore(); + const { copyData } = useCopyData(); + const { + isOpen: isOpenWithdraw, + onClose: onCloseWithdraw, + onOpen: onOpenWithdraw + } = useDisclosure(); + + useQuery(['init'], initUserInfo); + const { data: { invitedAmount = 0, historyAmount = 0, residueAmount = 0 } = {} } = useQuery( + ['getInvitedCountAmount'], + getPromotionInitData + ); + + const { + data: promotionRecords, + isLoading, + Pagination, + total + } = usePagination({ + api: getPromotionRecords + }); + + return ( + <> + + + 我的邀请 + + + 你可以通过邀请链接邀请好友注册 FastGpt 账号。好友在 FastGpt + 平台的每次充值,你都会获得一定比例的佣金。 + + + 当前剩余佣金: ¥ + + {residueAmount} + + + + + + + + + + 佣金比例 + {userInfo?.promotion.rate || 15}% + + + 已注册用户数 + {invitedAmount}人 + + + 累计佣金 + ¥ {historyAmount} + + + + + 佣金记录 ({total}) + + + + + + + + + + + + {promotionRecords.map((item) => ( + + + + + + ))} + +
时间类型金额
+ {item.createTime ? dayjs(item.createTime).format('YYYY/MM/DD HH:mm:ss') : '-'} + {PromotionTypeMap[item.type]}{item.amount}
+ + +
+ + + +
+ + + + 提现联系 + + + + + 微信号: + + YNyiqi + + + 发送你的邀请链接和需要提现的金额 + + + + + + + + + ); +}; + +export default OpenApi; diff --git a/src/service/models/promotionRecord.ts b/src/service/models/promotionRecord.ts new file mode 100644 index 000000000..6906c4432 --- /dev/null +++ b/src/service/models/promotionRecord.ts @@ -0,0 +1,31 @@ +import { Schema, model, models, Model } from 'mongoose'; +import { PromotionRecordSchema as PromotionRecordType } from '@/types/mongoSchema'; + +const PromotionRecordSchema = new Schema({ + userId: { + type: Schema.Types.ObjectId, + ref: 'user', + required: true + }, + objUId: { + type: Schema.Types.ObjectId, + ref: 'user', + required: false + }, + createTime: { + type: Date, + default: () => new Date() + }, + type: { + type: String, + required: true, + enum: ['invite', 'shareModel', 'withdraw'] + }, + amount: { + type: Number, + required: true + } +}); + +export const promotionRecord: Model = + models['promotionRecord'] || model('promotionRecord', PromotionRecordSchema); diff --git a/src/service/models/user.ts b/src/service/models/user.ts index 43878bcf4..34e389ab1 100644 --- a/src/service/models/user.ts +++ b/src/service/models/user.ts @@ -31,11 +31,6 @@ const UserSchema = new Schema({ // 返现比例 type: Number, default: 15 - }, - amount: { - // 推广金额 - type: Number, - default: 0 } }, openaiKey: { diff --git a/src/service/mongo.ts b/src/service/mongo.ts index 0aa947895..9902441e0 100644 --- a/src/service/mongo.ts +++ b/src/service/mongo.ts @@ -62,3 +62,4 @@ export * from './models/data'; export * from './models/dataItem'; export * from './models/splitData'; export * from './models/openapi'; +export * from './models/promotionRecord'; diff --git a/src/service/utils/promotion.ts b/src/service/utils/promotion.ts new file mode 100644 index 000000000..6790439e0 --- /dev/null +++ b/src/service/utils/promotion.ts @@ -0,0 +1,36 @@ +import { promotionRecord } from '../mongo'; + +export const pushPromotionRecord = async ({ + userId, + objUId, + type, + amount +}: { + userId: string; + objUId: string; + type: 'invite' | 'shareModel'; + amount: number; +}) => { + try { + await promotionRecord.create({ + userId, + objUId, + type, + amount + }); + } catch (error) { + console.log('创建推广记录异常', error); + } +}; + +export const withdrawRecord = async ({ userId, amount }: { userId: string; amount: number }) => { + try { + await promotionRecord.create({ + userId, + type: 'withdraw', + amount + }); + } catch (error) { + console.log('提现记录异常', error); + } +}; diff --git a/src/types/mongoSchema.d.ts b/src/types/mongoSchema.d.ts index 3ee2b7673..3103665f0 100644 --- a/src/types/mongoSchema.d.ts +++ b/src/types/mongoSchema.d.ts @@ -18,6 +18,9 @@ export interface UserModelSchema { promotionAmount: number; openaiKey: string; createTime: number; + promotion: { + rate: number; + }; } export interface AuthCodeSchema { @@ -162,3 +165,12 @@ export interface OpenApiSchema { lastUsedTime?: Date; apiKey: String; } + +export interface PromotionRecordSchema { + _id: string; + userId: string; // 收益人 + objUId?: string; // 目标对象(如果是withdraw则为空) + type: 'invite' | 'shareModel' | 'withdraw'; + createTime: Date; // 记录时间 + amount: number; +} diff --git a/src/types/user.d.ts b/src/types/user.d.ts index a17df20b3..a842ab16c 100644 --- a/src/types/user.d.ts +++ b/src/types/user.d.ts @@ -3,6 +3,9 @@ export interface UserType { username: string; openaiKey: string; balance: number; + promotion: { + rate: number; + }; } export interface UserUpdateParams {