feat(coupon): 添加优惠券领取中心功能

- 新增优惠券领取中心页面,包含热门优惠券轮播、优惠券列表、筛选功能等
- 实现优惠券数据加载、搜索、下拉刷新、加载更多等功能
- 添加优惠券领取逻辑,支持用户领取优惠券
- 优化邀请小程序码生成和分享功能
-调整首页和用户订单组件的样式
This commit is contained in:
2025-08-22 11:46:12 +08:00
parent 40e282cf8f
commit 46761bdacd
14 changed files with 695 additions and 162 deletions

View File

@@ -1,19 +1,19 @@
import React, { useState, useEffect } from 'react'
import { View, Text, Image } from '@tarojs/components'
import { Button, Loading } from '@nutui/nutui-react-taro'
import { Share, Download, Copy, QrCode } from '@nutui/icons-react-taro'
import React, {useState, useEffect} from 'react'
import {View, Text, Image} from '@tarojs/components'
import {Button, Loading} from '@nutui/nutui-react-taro'
import {Share, Download, Copy, QrCode} from '@nutui/icons-react-taro'
import Taro from '@tarojs/taro'
import { useDealerUser } from '@/hooks/useDealerUser'
import { generateInviteCode, getInviteStats } from '@/api/invite'
import type { InviteStats } from '@/api/invite'
import { businessGradients } from '@/styles/gradients'
import {useDealerUser} from '@/hooks/useDealerUser'
import {generateInviteCode, getInviteStats} from '@/api/invite'
import type {InviteStats} from '@/api/invite'
import {businessGradients} from '@/styles/gradients'
const DealerQrcode: React.FC = () => {
const [miniProgramCodeUrl, setMiniProgramCodeUrl] = useState<string>('')
const [loading, setLoading] = useState<boolean>(false)
const [inviteStats, setInviteStats] = useState<InviteStats | null>(null)
const [statsLoading, setStatsLoading] = useState<boolean>(false)
const { dealerUser } = useDealerUser()
const {dealerUser} = useDealerUser()
// 生成小程序码
const generateMiniProgramCode = async () => {
@@ -23,8 +23,8 @@ const DealerQrcode: React.FC = () => {
setLoading(true)
// 生成邀请小程序码
const codeUrl = await generateInviteCode(dealerUser.userId, 'qrcode')
const codeUrl = await generateInviteCode(dealerUser.userId)
console.log('小程序码生成成功:', codeUrl)
if (codeUrl) {
setMiniProgramCodeUrl(codeUrl)
}
@@ -160,7 +160,7 @@ const DealerQrcode: React.FC = () => {
if (!dealerUser) {
return (
<View className="bg-gray-50 min-h-screen flex items-center justify-center">
<Loading />
<Loading/>
<Text className="text-gray-500 mt-2">...</Text>
</View>
)
@@ -179,7 +179,7 @@ const DealerQrcode: React.FC = () => {
right: '-16px'
}}></View>
<View className="relative z-10">
<View className="relative z-10 flex flex-col">
<Text className="text-2xl font-bold mb-2 text-white"></Text>
<Text className="text-white text-opacity-80">
@@ -189,11 +189,16 @@ const DealerQrcode: React.FC = () => {
<View className="px-4">
{/* 小程序码展示区 */}
{/*<Image*/}
{/* src={'http://127.0.0.1:9200/api/wx-login/getOrderQRCodeUnlimited/33103'}*/}
{/* className="w-full h-full"*/}
{/* mode="aspectFit"*/}
{/*/>*/}
<View className="bg-white rounded-2xl p-6 mb-6 shadow-sm">
<View className="text-center">
{loading ? (
<View className="w-48 h-48 mx-auto mb-4 flex items-center justify-center bg-gray-50 rounded-xl">
<Loading />
<Loading/>
<Text className="text-gray-500 mt-2">...</Text>
</View>
) : miniProgramCodeUrl ? (
@@ -219,48 +224,52 @@ const DealerQrcode: React.FC = () => {
</View>
)}
<Text className="text-lg font-semibold text-gray-800 mb-2">
<View className="text-lg font-semibold text-gray-800 mb-2">
</Text>
<Text className="text-sm text-gray-500 mb-6">
</View>
<View className="text-sm text-gray-500 mb-6">
</Text>
</View>
</View>
</View>
{/* 操作按钮 */}
<View className="space-y-3">
<Button
type="primary"
size="large"
block
icon={<Download />}
onClick={saveMiniProgramCode}
disabled={!miniProgramCodeUrl || loading}
>
</Button>
<Button
size="large"
block
icon={<Copy />}
onClick={copyInviteInfo}
disabled={!dealerUser?.userId || loading}
>
</Button>
<Button
size="large"
block
fill="outline"
icon={<Share />}
onClick={shareMiniProgramCode}
disabled={!dealerUser?.userId || loading}
>
</Button>
<View className={'gap-2'}>
<View className={'my-2'}>
<Button
type="primary"
size="large"
block
icon={<Download/>}
onClick={saveMiniProgramCode}
disabled={!miniProgramCodeUrl || loading}
>
</Button>
</View>
<View className={'my-2 bg-white'}>
<Button
size="large"
block
icon={<Copy/>}
onClick={copyInviteInfo}
disabled={!dealerUser?.userId || loading}
>
</Button>
</View>
<View className={'my-2 bg-white'}>
<Button
size="large"
block
fill="outline"
icon={<Share/>}
onClick={shareMiniProgramCode}
disabled={!dealerUser?.userId || loading}
>
</Button>
</View>
</View>
{/* 推广说明 */}
@@ -293,7 +302,7 @@ const DealerQrcode: React.FC = () => {
<Text className="font-semibold text-gray-800 mb-3"></Text>
{statsLoading ? (
<View className="flex items-center justify-center py-8">
<Loading />
<Loading/>
<Text className="text-gray-500 mt-2">...</Text>
</View>
) : inviteStats ? (
@@ -353,7 +362,7 @@ const DealerQrcode: React.FC = () => {
</View>
) : (
<View className="text-center py-8">
<Text className="text-gray-500"></Text>
<View className="text-gray-500"></View>
<Button
size="small"
type="primary"