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

@@ -6,15 +6,15 @@ import Taro from '@tarojs/taro'
import dayjs from 'dayjs'
import {getShopGiftByCode, updateShopGift} from "@/api/shop/shopGift";
interface VerificationData {
type: string
giftId: number
giftCode: string
verificationCode: string
faceValue: string
timestamp: number
expireTime?: string
}
// interface VerificationData {
// type: string
// giftId: number
// giftCode: string
// verificationCode: string
// faceValue: string
// timestamp: number
// expireTime?: string
// }
interface GiftCardInfo {
id: number
@@ -40,7 +40,8 @@ const StoreVerification: React.FC = () => {
success: (res) => {
console.log('扫码结果:', res.result)
setScanResult(res.result)
parseQRCode(res.result)
verificationQRCode(res.result)
// parseQRCode(res.result)
},
fail: (err) => {
console.error('扫码失败:', err)
@@ -53,41 +54,57 @@ const StoreVerification: React.FC = () => {
}
// 解析二维码数据
const parseQRCode = (qrData: string) => {
try {
const data: VerificationData = JSON.parse(qrData)
// const parseQRCode = (qrData: string) => {
// try {
// const data: VerificationData = JSON.parse(qrData)
//
// if (data.type === 'gift_card_verification') {
// setVerificationCode(data.verificationCode)
// console.log(data.verificationCode,'...vaerrr')
// } else {
// throw new Error('无效的二维码格式')
// }
// } catch (error) {
// console.error('解析二维码失败:', error)
// Taro.showToast({
// title: '无效的二维码',
// icon: 'error'
// })
// }
// }
if (data.type === 'gift_card_verification') {
setVerificationCode(data.verificationCode)
// 模拟获取礼品卡信息
mockGetGiftInfo(data)
} else {
throw new Error('无效的二维码格式')
}
} catch (error) {
console.error('解析二维码失败:', error)
Taro.showToast({
title: '无效的二维码',
// 扫码核销操作
const verificationQRCode = async (code:string) => {
const gift = await getShopGiftByCode(code)
if(gift.status == 1){
return Taro.showToast({
title: '此礼品码已使用',
icon: 'error'
})
}
}
// 模拟获取礼品卡信息实际应该调用API
const mockGetGiftInfo = (data: VerificationData) => {
// 这里应该调用后端API验证礼品卡信息
const mockGiftInfo: GiftCardInfo = {
id: data.giftId,
name: '礼品卡',
goodsName: '星巴克咖啡券',
faceValue: data.faceValue,
type: 20,
status: 0,
expireTime: data.expireTime,
code: data.giftCode
if(gift.status == 2){
return Taro.showToast({
title: '此礼品码已失效',
icon: 'error'
})
}
setGiftInfo(mockGiftInfo)
if(gift.userId == 0){
return Taro.showToast({
title: '此礼品码未认领',
icon: 'error'
})
}
updateShopGift({
...gift,
status: 1,
takeTime: dayjs.unix(Date.now() / 1000).format('YYYY-MM-DD HH:mm:ss')
}).then(() => {
Taro.showToast({
title: '核销成功',
icon: 'success'
})
})
}
// 手动输入核销码验证
@@ -106,7 +123,8 @@ const StoreVerification: React.FC = () => {
const giftCard = await getShopGiftByCode(verificationCode.trim())
await updateShopGift({
...giftCard,
status: 1
status: 1,
takeTime: dayjs.unix(Date.now() / 1000).format('YYYY-MM-DD HH:mm:ss')
})
Taro.showToast({
title: '核销成功',