Files

398 lines
9.2 KiB
Vue
Raw Normal View History

<template>
<view class="mine-container">
<Header :show-return="false">我的</Header>
2024-02-22 18:37:23 +08:00
<view class="user-top">
<!-- user info -->
<view class="userinfo-box">
<!-- 未登录 -->
<view
2024-02-22 18:37:23 +08:00
class="userinfo-box__inner no-login"
v-if="!(user && user.id)"
@click="toLogin"
>
<view class="flex flex-ai__center">
<image
class="head"
:src="defaultAvatarIcon"
/>
<view class="user-info">
点击登录
</view>
</view>
</view>
2024-02-22 18:37:23 +08:00
<!-- 已登录 -->
<view
2024-02-22 18:37:23 +08:00
class="userinfo-box__inner"
@click="toUserCenter"
v-else
>
<view class="flex flex-ai__center">
<image
class="head"
:src="user.avatar"
/>
<view class="user-info">
{{ user.nickname }}
</view>
</view>
2024-02-22 18:37:23 +08:00
<view
class="sign-box"
@click.stop="goSignIn">
<image :src="mySignIn" />
签到
</view>
</view>
2024-02-22 18:37:23 +08:00
</view>
2024-02-22 18:37:23 +08:00
<!-- 账户信息 -->
<view class="account-box">
<template
v-for="item in accountList"
:key="item.id">
<view
v-if="user"
class="account-item"
@click.stop="handleJump(item)">
<view class="count">
{{ user[item.field] || 0 }}
</view>
<view class="title">
{{ item.field === 'integral' ? `我的${ integralName }` : item.label }}
</view>
</view>
</template>
</view>
2024-02-22 18:37:23 +08:00
<!-- VIP 信息 未激活 -->
<view
2024-02-22 18:37:23 +08:00
class="vip-box vip-none"
@click="goMemberCenter"
v-if="!memberLeverInfo.currentLevel">
<view
class="vip-box__inner flex flex-ai__center flex-jc__sb"
:style="{backgroundImage:`url(${myVip1})`}">
<image
class="icon"
2024-02-22 18:37:23 +08:00
:src="noneVip" />
<view class="vip-text">
开通享更多特权省钱又省心
</view>
<view class="vip-button">
2024-02-22 18:37:23 +08:00
立即激活
</view>
</view>
2024-02-22 18:37:23 +08:00
</view>
<!-- VIP 信息 激活 -->
<view
class="vip-box"
@click="goMemberCenter"
v-else>
<view
class="vip-box__inner "
:style="{backgroundImage:`url(${myVip1})`}">
<view class="flex flex-ai__center flex-jc__sb">
<image
class="icon"
:src="memberLeverInfo.currentLevel.iconUrl" />
<view class="vip-text flex flex-ai__center">
{{ memberLeverInfo.currentLevel.levelName }}
<view class="process">
<view
class="schedule"
:style="{width: `${memberLeverInfo.needGrowthValue/memberLeverInfo.nextLevel.growthValue}%`}"></view>
</view>
</view>
<view class="vip-button">
查看权益 >
</view>
</view>
<view class="tips">
再获取{{ memberLeverInfo.needGrowthValue }}经验可升级为{{ memberLeverInfo.nextLevel.levelName }}会员
</view>
</view>
</view>
</view>
<!-- 大卡片 -->
<view class="big-card">
<!-- order card -->
<GridCard
:list="orderIconList"
:dot-info="orderUserCountData"
title="我的订单"
button-text="查看所有订单"
@button-click="toAllOrder"
/>
<!-- footprint card -->
<GridCard
:list="cardOneList"
:dot-info="orderUserCountData"
/>
<GridCard
:list="filterCardTwo"
:dot-info="orderUserCountData"
/>
</view>
</view>
</template>
<script setup>
import { computed, ref } from 'vue'
import Header from '@/components/Header/index.vue'
import { orderUserCount } from '@/api/order'
import { onShow } from '@dcloudio/uni-app'
2024-02-22 18:37:23 +08:00
import { useMainStore } from '@/store/modules/useMainStore'
import { useRouter } from "@/hooks/useRouter";
import { storeToRefs } from "pinia";
import GridCard from "@/root/user/components/GridCard.vue";
import { accountList, cardOneList, cardTwoList, orderIconList } from "@/root/user/index.data";
import { defaultAvatarIcon, mySignIn, myVip1, myVipNone, noneVip } from "@/utils/images";
import { useInterface } from "@/hooks/useInterface";
import { useJump } from "@/hooks/useJump";
2024-02-22 18:37:23 +08:00
import { getIntegralName, getUserMemberLevel } from "@/api/member";
const mainStore = useMainStore()
2024-02-22 18:37:23 +08:00
const {user, integralName} = storeToRefs(mainStore);
const {push} = useRouter()
const {toast} = useInterface();
const {goSignIn, goMemberCenter} = useJump()
const orderUserCountData = ref(null)
const filterCardTwo = computed(() => {
if (!user.value) return []
// 判断是否又核销权限
if (user.value.writeOffAuthority) {
return cardTwoList
} else {
return cardTwoList.filter(item => item.label !== '订单核销')
}
})
function toAllOrder() {
if (!user.value) return toast({title: '请先登录'})
push({url: '/pages/orderList/orderList'}, {data: {type: -1}})
}
function toUserCenter() {
if (!user.value) return toast({title: '请先登录'})
push({url: '/pages/userInfo/index'})
}
function toLogin() {
push({url: '/pages/login/guid'})
}
const handleOrderUserCount = async () => {
orderUserCountData.value = await orderUserCount()
}
// =============================== 会员信息 ====================================
const memberLeverInfo = ref({
currentGrowthValue: 0,
currentLevel: null,
needGrowthValue: 0,
nextLevel: null
})
async function doGetUserMemberLevel() {
memberLeverInfo.value = await getUserMemberLevel()
}
2024-02-22 18:37:23 +08:00
function handleJump(item) {
if (!item.path) return toast({title: '暂未开放~'})
if (typeof item.path === 'function') {
item.path()
}
}
onShow(() => {
mainStore.getUserInfo()
handleOrderUserCount()
doGetUserMemberLevel()
})
</script>
<style
lang="scss"
scoped
>
.mine-container {
2024-02-22 18:37:23 +08:00
background-color: #ffffff;
.user-top {
padding-bottom: 22rpx;
background: url("https://b2c-pro-static-dev.zkthink.com/static/my/bg-top.png") no-repeat bottom center / 100% auto;
}
.userinfo-box {
@include usePadding(32, 0);
width: 100%;
margin: 50rpx 0 0 0;
&__inner {
@include useFlex(space-between, center);
.head {
width: 120rpx;
height: 120rpx;
border-radius: 50%;
border: 5rpx solid #fff;
}
.user-info {
@include useFlex(space-between, center);
padding-left: 30rpx;
font-size: 34rpx;
}
.sign-box {
@include useFlex(center, center);
@include usePadding(16, 12);
border: 1rpx solid #E5E5E5;
font-weight: bold;
font-size: 24rpx;
border-radius: 50rpx;
image {
width: 40rpx;
height: 40rpx;
}
}
&.no-login {
}
}
}
.account-box {
width: 100%;
display: grid;
grid-template-columns: repeat(3, 1fr);
margin: 32rpx 0;
.account-item {
@include useFlex(center, center, column);
font-weight: bold;
font-size: 32rpx;
color: #333;
position: relative;
&:after {
content: '';
position: absolute;
right: 0;
top: 50%;
transform: translateY(-50%);
width: 1rpx;
height: 50%;
background: $tips-color;
}
&:last-child {
&:after {
width: 0;
}
}
.title {
color: $tips-color;
font-size: 24rpx;
font-weight: normal;
}
}
}
.vip-box {
width: 100%;
height: 132rpx;
@include usePadding(32, 0);
&__inner {
@include usePadding(32, 25);
width: 100%;
height: 100%;
background-repeat: no-repeat;
background-size: 100% 100%;
.icon {
width: 56rpx;
height: 56rpx;
}
.vip-text {
width: 60%;
color: #FFF8E8;
font-weight: bold;
font-size: 28rpx;
.process {
flex-grow: 1;
height: 10rpx;
margin-left: 12rpx;
border-radius: 10rpx;
overflow: hidden;
background: rgba(255, 255, 255, 0.1);
position: relative;
.schedule {
height: 100%;
background: #FFF8E8;
border-radius: 10rpx;
left: 0;
top: 0;
}
}
}
.vip-button {
@include usePadding(0, 10);
color: #FFF8E8;
font-size: 24rpx;
border-radius: 8rpx;
}
.tips {
margin-top: 10rpx;
color: #FFF8E8;
font-size: 20rpx
}
}
}
.vip-none {
.vip-button {
@include usePadding(24, 10);
background: linear-gradient(45deg, #FAEECB, #F2D7A9);
color: #272A3F;
font-size: 24rpx;
border-radius: 8rpx;
}
}
.big-card {
width: 100%;
background: #f6f6f6;
2024-02-22 18:37:23 +08:00
border-radius: 30rpx 30rpx 0 0;
margin-top: -22rpx;
@include usePadding(32, 32);
}
}
</style>