shop-wx/src/pages/me/index.vue

382 lines
11 KiB
Vue
Raw Normal View History

<script lang="ts" setup>
import { useUserStore } from '@/store/user'
import { ICOBalanceRecharge,ICOMyCoupon,ICOMyRights,ICOMyOrder } from '@/components/icons'
import { generateQRCode, getCurrentPagePath } from '@/utils/qrcode'
definePage({
style: {
navigationBarTitleText: '我的',
// navigationStyle: 'custom',
},
})
const userStore = useUserStore();
/** 登录用户信息 */
const loginUser:any = computed(() => userStore.info ?? {});
console.log(loginUser.value,'用户信息')
const itemClick = (url:string) => {
uni.navigateTo({
url: url,
})
}
const showQrcode = ref(false)
const qrcodeData = ref('')
// 生成二维码
const generateUserQRCode = async () => {
console.log('开始生成二维码');
try {
// 生成包含用户ID和页面路径的二维码
const qrContent = `${loginUser.value?.idnum || 'guest'}`;
console.log('二维码内容:', qrContent);
// 调用二维码生成工具
const qrDataUrl = await generateQRCode(qrContent, {
size: 200,
margin: 1,
color: {
dark: '#000000',
light: '#FFFFFF'
}
});
console.log('二维码生成成功:', qrDataUrl.substring(0, 100) + '...');
qrcodeData.value = qrDataUrl;
showQrcode.value = true;
} catch (error) {
console.error('生成二维码失败:', error);
uni.showToast({
title: '生成二维码失败',
icon: 'none'
});
}
}
</script>
<template>
<view class="profile-container">
<!-- 二维码 -->
<wd-popup v-model="showQrcode" custom-style="border-radius:16rpx; padding: 0;" position="center" >
<view class="qrcode-wrapper">
<view class="qrcode-header">
<view class="qrcode-title">{{ loginUser.name || '用户' }}的二维码</view>
<!-- <view class="qrcode-close" @click="showQrcode = false">-->
<!-- <wd-icon name="close" size="20px"></wd-icon>-->
<!-- </view>-->
</view>
<view class="qrcode-content">
<view class="qrcode-image-container" v-if="qrcodeData">
<image :src="qrcodeData" mode="aspectFit" class="qrcode-image"></image>
</view>
<view class="qrcode-info">
<!-- <view class="qrcode-desc">扫描二维码分享给好友</view>-->
<view class="qrcode-user">
<wd-img :width="40" :height="40" round :src="loginUser.avatar" />
<view class="user-name">{{ loginUser.name || '用户' }}</view>
</view>
</view>
</view>
</view>
</wd-popup>
<view class="user-info-section">
<view class="avatar-wrapper">
<wd-img :width="60" :height="60" round :src="loginUser.avatar" :enable-preview="true" />
<view class="user-details">
<view class="username">
<view style="margin-right: 8px">{{ loginUser.name }}</view>
<wd-icon @click="itemClick('/pages/me/personal-profile/index')" name="edit-outline" size="16px"></wd-icon>
</view>
<view class="user-card">
<wd-tag custom-class="space" mark use-icon-slot>
<text>普卡会员</text>
<template #icon>
<wd-icon name="creditcard" />
</template>
</wd-tag>
<!-- <wd-tag >卡号: {{ 10022342348 }}</wd-tag>-->
</view>
</view>
<view class="user-right" @click="generateUserQRCode">
<wd-icon name="qrcode" size="30px"></wd-icon>
</view>
</view>
<view class="user-bottom">
<wd-grid bg-color="#F5F7FA" :column="4">
<wd-grid-item custom-class="custom-item" icon="picture" text="余额(元)" >
<template #icon>
<view class="balance">{{ 0 }}</view>
</template>
</wd-grid-item>
<wd-grid-item custom-class="custom-item" icon="picture" text="积分" >
<template #icon>
<view class="balance">{{ 0 }}</view>
</template>
</wd-grid-item>
<wd-grid-item custom-class="custom-item" icon="picture" text="卡项" >
<template #icon>
<view class="balance">{{ 0 }}</view>
</template>
</wd-grid-item>
<wd-grid-item custom-class="custom-item" icon="picture" text="优惠卷" >
<template #icon>
<view class="balance">{{ 0 }}</view>
</template>
</wd-grid-item>
</wd-grid>
</view>
</view>
<view class="user-container">
<view class="body-card-style-radius-padding" style="padding: 4px">
<wd-grid :column="4">
<wd-grid-item icon="picture" text="余额充值" >
<template #icon>
<ICOBalanceRecharge style="width: 35px; height: 35px" />
</template>
</wd-grid-item>
<wd-grid-item icon="picture" text="我的优惠卷" >
<template #icon>
<ICOMyCoupon style="width: 35px; height: 35px" />
</template>
</wd-grid-item>
<wd-grid-item icon="picture" text="我的权益" >
<template #icon>
<ICOMyRights style="width: 35px; height: 35px" />
</template>
</wd-grid-item>
<wd-grid-item icon="picture" text="我的订单" >
<template #icon>
<ICOMyOrder style="width: 35px; height: 35px" />
</template>
</wd-grid-item>
</wd-grid>
</view>
<view class="body-card-style-radius-padding">
<view class="body-card-style-head">
我的订单
<view class="right text-right">
<wd-icon name="arrow-right" size="16px"></wd-icon>
全部
</view>
</view>
<wd-grid :column="5">
<wd-grid-item icon="wallet" text="待付款" />
<wd-grid-item icon="bags" text="待发货" />
<wd-grid-item text="待收货" >
<template #icon>
<view style="width: 26px; height: 26px; color: #000000" class="i-carbon:arrival"></view>
</template>
</wd-grid-item>
<wd-grid-item icon="dong" text="待评价" />
<wd-grid-item icon="money-circle" text="退款/售后" />
</wd-grid>
</view>
<view class="body-card-style-radius-padding" style="margin-bottom: 0">
<view class="body-card-style-head">
我的功能
</view>
<wd-grid :column="4">
<wd-grid-item icon="gift" @click="itemClick('/pages/me/promote-with-courtesy/index')" text="推广有礼" />
<wd-grid-item icon="picture" text="我的预约" />
<wd-grid-item icon="picture" text="购物车" />
<wd-grid-item icon="picture" text="我的地点" />
<wd-grid-item icon="picture" text="我的拼团" />
<wd-grid-item icon="picture" text="我的表单" />
<wd-grid-item icon="picture" text="我的消息" />
<wd-grid-item icon="picture" text="服务日志" />
<wd-grid-item icon="picture" text="待评价" />
<wd-grid-item icon="picture" text="积分商城" />
<wd-grid-item icon="picture" text="我的会员卡" />
<wd-grid-item icon="picture" text="公众号通知" />
</wd-grid>
</view>
</view>
</view>
</template>
<style lang="scss" scoped>
.qrcode-wrappe{
}
/* 二维码弹框样式 */
.qrcode-wrapper {
width: 560rpx;
background: #fff;
border-radius: 24rpx;
overflow: hidden;
.qrcode-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 32rpx 32rpx 16rpx;
border-bottom: 1px solid #f5f5f5;
.qrcode-title {
font-size: 36rpx;
font-weight: 600;
color: #333;
}
.qrcode-close {
width: 60rpx;
height: 60rpx;
display: flex;
align-items: center;
justify-content: center;
border-radius: 50%;
background-color: #f5f5f5;
color: #999;
transition: all 0.3s;
&:active {
background-color: #e8e8e8;
transform: scale(0.95);
}
}
}
.qrcode-content {
padding: 32rpx;
display: flex;
flex-direction: column;
align-items: center;
.qrcode-image-container {
width: 400rpx;
height: 400rpx;
padding: 20rpx;
background: #fff;
border-radius: 16rpx;
box-shadow: 0 8rpx 30rpx rgba(0, 0, 0, 0.1);
margin-bottom: 32rpx;
display: flex;
align-items: center;
justify-content: center;
.qrcode-image {
width: 360rpx;
height: 360rpx;
}
}
.qrcode-info {
width: 100%;
.qrcode-desc {
text-align: center;
font-size: 28rpx;
color: #666;
margin-bottom: 24rpx;
}
.qrcode-user {
display: flex;
align-items: center;
justify-content: center;
padding: 20rpx;
background-color: #f9f9f9;
border-radius: 50rpx;
.user-name {
margin-left: 16rpx;
font-size: 28rpx;
color: #333;
font-weight: 500;
}
}
}
}
}
/* 基础样式 */
.profile-container {
overflow-y: auto;
font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', sans-serif;
.user-info-section{
background: #ffffff;
.avatar-wrapper{
padding: 15px;
display: flex;
align-items: center;
.user-details{
margin-left: 16px;
flex: 1;
.username{
display: flex;
align-items: center;
margin-bottom: 4px;
font-size: 18px;
font-weight: 500;
}
.user-card-number{
font-size: 14px;
color: #999999;
}
}
.user-right{
flex: 1;
display: flex;
justify-content: flex-end;
}
}
.user-bottom{
padding: 0 9px 15px 9px;
}
}
.user-container{
padding: 12px;
.text-right{
display: flex;
align-items: center;
flex-direction: row-reverse;
font-size: 14px;
font-weight: 400;
color: #cccccc;
}
.body-card-style-radius-padding {
background: #ffffff;
border-radius: 12px;
padding: 16px;
margin-bottom: 12px;
.body-card-style-head {
display: flex;
justify-content: space-between;
align-items: center;
font-size: 16px;
font-weight: 500;
margin-bottom: 16px;
color: #333333;
}
}
}
}
/* 移除:deep()选择器,直接使用类名 */
:deep(.custom-item) {
border-radius: 12px;
margin: 0 6px;
width: calc(100% / 4 - 12px) !important;
height: 70px !important;
.balance{
font-size: 16px;
font-weight: bold;
}
}
</style>