feat(admin): 完成门店核销功能

- 新增管理员页面和相关组件
- 实现用户认证和权限控制
- 添加用户订单、积分等功能
- 优化用户卡片和用户页面布局
- 实现礼品卡核销功能
This commit is contained in:
2025-08-17 15:00:58 +08:00
parent 79aeca87cc
commit 591df84568
13 changed files with 920 additions and 67 deletions

View File

@@ -1,5 +1,6 @@
import {Button} from '@nutui/nutui-react-taro'
import {Avatar, Tag} from '@nutui/nutui-react-taro'
import {Scan} from '@nutui/icons-react-taro';
import {getUserInfo, getWxOpenId} from '@/api/layout';
import Taro from '@tarojs/taro';
import {useEffect, useState} from "react";
@@ -10,6 +11,9 @@ import {getMyAvailableCoupons} from "@/api/shop/shopUserCoupon";
import {useUser} from "@/hooks/useUser";
function UserCard() {
const {
isAdmin
} = useUser();
const {getDisplayName, getRoleName} = useUser();
const [IsLogin, setIsLogin] = useState<boolean>(false)
const [userInfo, setUserInfo] = useState<User>()
@@ -46,6 +50,7 @@ function UserCard() {
// 加载积分数量
console.log(userId)
setPointsCount(0)
// getUserPointsStats(userId)
// .then((res: any) => {
// setPointsCount(res.currentPoints || 0)
@@ -61,7 +66,6 @@ function UserCard() {
}
const reload = () => {
setPointsCount(0)
Taro.getUserInfo({
success: (res) => {
const avatar = res.userInfo.avatarUrl;
@@ -214,7 +218,8 @@ function UserCard() {
) : ''}
</div>
</div>
<div className={'mx-4 text-sm px-3 py-1 text-black border-gray-400 border-solid border-2 rounded-3xl'}
{isAdmin() && <Scan onClick={() => navTo('/user/store/verification', true)} />}
<div className={'mr-4 text-sm px-3 py-1 text-black border-gray-400 border-solid border-2 rounded-3xl'}
onClick={() => navTo('/user/profile/profile', true)}>
{'个人资料'}
</div>
@@ -223,7 +228,11 @@ function UserCard() {
<div className={'item flex justify-center flex-col items-center'}
onClick={() => navTo('/user/wallet/wallet', true)}>
<span className={'text-sm text-gray-500'}></span>
<span className={'text-xl'}>¥ {userInfo?.balance || '0.00'}</span>
<span className={'text-xl'}>{userInfo?.balance || '0.00'}</span>
</div>
<div className={'item flex justify-center flex-col items-center'}>
<span className={'text-sm text-gray-500'}></span>
<span className={'text-xl'}>{pointsCount}</span>
</div>
<div className={'item flex justify-center flex-col items-center'}
onClick={() => navTo('/user/coupon/index', true)}>
@@ -235,10 +244,6 @@ function UserCard() {
<span className={'text-sm text-gray-500'}></span>
<span className={'text-xl'}>{giftCount}</span>
</div>
<div className={'item flex justify-center flex-col items-center'}>
<span className={'text-sm text-gray-500'}></span>
<span className={'text-xl'}>{pointsCount}</span>
</div>
</div>
</div>
</div>

View File

@@ -2,20 +2,42 @@ import {useEffect} from 'react'
import UserCard from "./components/UserCard";
import UserOrder from "./components/UserOrder";
import UserCell from "./components/UserCell";
import './user.scss'
import UserFooter from "./components/UserFooter";
import {useUser} from "@/hooks/useUser";
import './user.scss'
function User() {
const {
isAdmin
} = useUser();
useEffect(() => {
}, []);
/**
* 门店核销管理
*/
if (isAdmin()) {
return <>
<div className={'w-full'} style={{
background: 'linear-gradient(to bottom, #e9fff2, #f9fafb)'
}}>
<UserCard/>
<UserOrder/>
<UserCell/>
<UserFooter/>
</div>
</>
}
return (
<>
<div className={'w-full'} style={{
background: 'linear-gradient(to bottom, #e9fff2, #f9fafb)'
}}>
<UserCard />
<UserOrder />
<UserCell />
<UserCard/>
<UserOrder/>
<UserCell/>
<UserFooter/>
</div>
</>