|
@@ -0,0 +1,303 @@
|
|
|
|
+<template>
|
|
|
|
+ <view>
|
|
|
|
+ <view class="vipBox">
|
|
|
|
+ <view class="avatar">
|
|
|
|
+ <img :src="getUserAvatar(baseInfo?.avatar, baseInfo?.sex)" alt="" class="img-box">
|
|
|
|
+ <image src="/static/svg/vip.svg" class="vipIcon"></image>
|
|
|
|
+ </view>
|
|
|
|
+ <view class="nameBox">
|
|
|
|
+ <view class="name font-weight-bold font-size-16">{{ baseInfo?.name || userInfo?.phone }}</view>
|
|
|
|
+ <view class="vipInfo font-size-14" v-if="remaining">
|
|
|
|
+ {{ pName }}
|
|
|
|
+ <view>将于{{ remaining }}后过期</view>
|
|
|
|
+ </view>
|
|
|
|
+ </view>
|
|
|
|
+ </view>
|
|
|
|
+ <view>
|
|
|
|
+ <swiper class="swiper-box" :current="current">
|
|
|
|
+ <swiper-item v-for="(item, index) in memberListLength" :key="index" class="swiper-items">
|
|
|
|
+ <view class="swiper-item" v-for="val in item" :key="val.id">
|
|
|
|
+ <view
|
|
|
|
+ class="card"
|
|
|
|
+ :class="{ recommend: val.recommend, vipFlag: val.my, active: val.id === chooseId}"
|
|
|
|
+ @tap="handleChoose(val.id)"
|
|
|
|
+ >
|
|
|
|
+ <text>{{ val.name }}</text>
|
|
|
|
+ <view>
|
|
|
|
+ <uni-icons color="#f30" type="icon-renminbi1688" size="16" custom-prefix="iconfont"></uni-icons>
|
|
|
|
+ <text>{{ val.price }}</text>
|
|
|
|
+ </view>
|
|
|
|
+ </view>
|
|
|
|
+ </view>
|
|
|
|
+ </swiper-item>
|
|
|
|
+ </swiper>
|
|
|
|
+ <view v-if="typeof chooseId === 'number'" class="itemBox">
|
|
|
|
+ 套餐权益 ( {{ list.name }} )
|
|
|
|
+ <uni-section
|
|
|
|
+ v-for="item in list.list"
|
|
|
|
+ :key="item.id"
|
|
|
|
+ class="item"
|
|
|
|
+ :class="{ active: item.active }"
|
|
|
|
+ titleColor="#774e20"
|
|
|
|
+ subTitleColor="#774e20"
|
|
|
|
+ :title="item.text"
|
|
|
|
+ >
|
|
|
|
+ <template v-slot:right>
|
|
|
|
+ <uni-icons color="#774e20" :type="item.active ? 'checkmarkempty' : 'closeempty'" size="20"/>
|
|
|
|
+ </template>
|
|
|
|
+ </uni-section>
|
|
|
|
+ </view>
|
|
|
|
+ </view>
|
|
|
|
+ <view class="pay">
|
|
|
|
+ <view class="pay-box">
|
|
|
|
+ <view class="price">
|
|
|
|
+ <uni-icons color="#e68735" type="icon-renminbi1688" size="16" custom-prefix="iconfont"></uni-icons>
|
|
|
|
+ {{ list.price }}
|
|
|
|
+ </view>
|
|
|
|
+ <view class="btn">
|
|
|
|
+ 立刻升级
|
|
|
|
+ </view>
|
|
|
|
+ </view>
|
|
|
|
+ </view>
|
|
|
|
+ </view>
|
|
|
|
+</template>
|
|
|
|
+
|
|
|
|
+<script setup>
|
|
|
|
+import { ref, computed, watch } from 'vue'
|
|
|
|
+
|
|
|
|
+import { getUserAvatar } from '@/utils/avatar'
|
|
|
|
+import { userStore } from '@/store/user'
|
|
|
|
+import { getMembershipPackageList } from '@/api/vip'
|
|
|
|
+const useUserStore = userStore()
|
|
|
|
+
|
|
|
|
+const baseInfo = computed(() => useUserStore?.baseInfo)
|
|
|
|
+const userInfo = computed(() => useUserStore?.userInfo)
|
|
|
|
+
|
|
|
|
+const memberList = ref([])
|
|
|
|
+const recommend = ref(null)
|
|
|
|
+const chooseId = ref(null)
|
|
|
|
+
|
|
|
|
+const memberListLength = computed(() => {
|
|
|
|
+ const result = [];
|
|
|
|
+ for (let i = 0; i < memberList.value.length; i += 2) {
|
|
|
|
+ const pair = memberList.value.slice(i, i + 2)
|
|
|
|
+ result.push(pair)
|
|
|
|
+ }
|
|
|
|
+ return result
|
|
|
|
+})
|
|
|
|
+
|
|
|
|
+const pName = computed(() => {
|
|
|
|
+ return memberList.value.find(item => +item.id === +userInfo.value?.vipFlag)?.name
|
|
|
|
+})
|
|
|
|
+
|
|
|
|
+const remaining = computed(() => {
|
|
|
|
+ if (!userInfo.value?.vipExpireDate) return null
|
|
|
|
+ const diffInMs = userInfo.value?.vipExpireDate - new Date().getTime()
|
|
|
|
+ const day = diffInMs / (1000 * 60 * 60 * 24)
|
|
|
|
+ return day < 1 ? '今天' : Math.floor(day) + '天'
|
|
|
|
+})
|
|
|
|
+
|
|
|
|
+const list = computed(() => {
|
|
|
|
+ const item = memberList.value.find(item => item.id === chooseId.value)
|
|
|
|
+ return item ?? {}
|
|
|
|
+})
|
|
|
|
+
|
|
|
|
+const current = ref(0)
|
|
|
|
+
|
|
|
|
+const handleChoose = (id) => {
|
|
|
|
+ chooseId.value = id
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+const getMemberList = async () => {
|
|
|
|
+ try {
|
|
|
|
+ const { data } = await getMembershipPackageList()
|
|
|
|
+ if (!data || data.length === 0) {
|
|
|
|
+ return
|
|
|
|
+ }
|
|
|
|
+ // memberList.value = data
|
|
|
|
+ let vipFlagIndex = null
|
|
|
|
+ const list = data.map((item, index) => {
|
|
|
|
+ if (+item.id === +userInfo.value?.vipFlag) {
|
|
|
|
+ vipFlagIndex = index // 低于当前套餐的(套餐)不展示
|
|
|
|
+ }
|
|
|
|
+ if (item.recommend) {
|
|
|
|
+ recommend.value = index // 推荐套餐
|
|
|
|
+ }
|
|
|
|
+ return {
|
|
|
|
+ ...item,
|
|
|
|
+ my: vipFlagIndex === index,
|
|
|
|
+ list: JSON.parse(item.text),
|
|
|
|
+ type: 3, // 订单类型 0平台订单|1求职端订单|2招聘端订单|3会员套餐
|
|
|
|
+ loading: false
|
|
|
|
+ }
|
|
|
|
+ })
|
|
|
|
+ // 低于当前套餐的(套餐)不展示
|
|
|
|
+ memberList.value = vipFlagIndex ? list.slice(vipFlagIndex) : list
|
|
|
|
+ if ((!userInfo.value?.vipFlag || userInfo.value?.vipExpireDate - new Date().getTime() > 0 ) && typeof recommend.value === 'number') {
|
|
|
|
+ current.value = parseInt(recommend.value / 2)
|
|
|
|
+ chooseId.value = memberList.value[recommend.value]?.id
|
|
|
|
+ }
|
|
|
|
+ } catch (error) {
|
|
|
|
+ uni.showToast({ title: '查询数据失败,请重试', icon: 'none' })
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+getMemberList()
|
|
|
|
+</script>
|
|
|
|
+
|
|
|
|
+<style lang="scss" scoped>
|
|
|
|
+.vipBox {
|
|
|
|
+ // color: #a18a0f;
|
|
|
|
+ padding: 80rpx 50rpx;
|
|
|
|
+ display: flex;
|
|
|
|
+ background: linear-gradient(121deg,#fde2c2 29.02%,#c19164 104.03%);
|
|
|
|
+ .avatar{
|
|
|
|
+ position: relative;
|
|
|
|
+ width: 100rpx;
|
|
|
|
+ height: 100rpx;
|
|
|
|
+ margin: 0;
|
|
|
|
+ .img-box {
|
|
|
|
+ width: 100%;
|
|
|
|
+ height: 100%;
|
|
|
|
+ border: 2rpx solid #ccc;
|
|
|
|
+ border-radius: 50%;
|
|
|
|
+ border: 1px solid gold;
|
|
|
|
+ }
|
|
|
|
+ .vipIcon {
|
|
|
|
+ position: absolute;
|
|
|
|
+ width: 50%;
|
|
|
|
+ height: 50%;
|
|
|
|
+ bottom: 0;
|
|
|
|
+ right: 0;
|
|
|
|
+ transform: translate(0, 30%);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ .nameBox {
|
|
|
|
+ display: flex;
|
|
|
|
+ flex-direction: column;
|
|
|
|
+ justify-content: space-around;
|
|
|
|
+ margin-left: 30rpx;
|
|
|
|
+ .name {
|
|
|
|
+ color: #724d2b;
|
|
|
|
+ }
|
|
|
|
+ .vipInfo {
|
|
|
|
+ color: #572a00;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+.swiper-box {
|
|
|
|
+ height: 200rpx;
|
|
|
|
+ .swiper-items {
|
|
|
|
+ display: grid;
|
|
|
|
+ grid-template-columns: 1fr 1fr;
|
|
|
|
+ }
|
|
|
|
+ .swiper-item {
|
|
|
|
+ display: flex;
|
|
|
|
+ flex-direction: column;
|
|
|
|
+ justify-content: center;
|
|
|
|
+ align-items: center;
|
|
|
|
+ height: 200rpx;
|
|
|
|
+ padding: 20rpx 10rpx;
|
|
|
|
+ box-sizing: border-box;
|
|
|
|
+ .card {
|
|
|
|
+ color: #774e20;
|
|
|
|
+ background-color: rgb(255, 251, 248);
|
|
|
|
+ border: 1px solid #f1b17a;
|
|
|
|
+ width: 100%;
|
|
|
|
+ height: 100%;
|
|
|
|
+ border-radius: 10rpx;
|
|
|
|
+ padding: 0 20rpx;
|
|
|
|
+ box-sizing: border-box;
|
|
|
|
+ display: flex;
|
|
|
|
+ justify-content: space-between;
|
|
|
|
+ align-items: center;
|
|
|
|
+ position: relative;
|
|
|
|
+ overflow: hidden;
|
|
|
|
+ &.recommend {
|
|
|
|
+ &::after {
|
|
|
|
+ content: '推荐';
|
|
|
|
+ position: absolute;
|
|
|
|
+ right: 0;
|
|
|
|
+ top: 0;
|
|
|
|
+ padding: 6rpx 10rpx;
|
|
|
|
+ font-size: 28rpx;
|
|
|
|
+ background: linear-gradient(121deg,#fde2c2 29.02%,#c19164 104.03%);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ &.vipFlag {
|
|
|
|
+ &::before {
|
|
|
|
+ content: '我的套餐';
|
|
|
|
+ position: absolute;
|
|
|
|
+ left: 0;
|
|
|
|
+ top: 0;
|
|
|
|
+ padding: 6rpx 10rpx;
|
|
|
|
+ font-size: 28rpx;
|
|
|
|
+ background: linear-gradient(121deg,#fde2c2 29.02%,#c19164 104.03%);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ &.active {
|
|
|
|
+ box-shadow: 0 0 18rpx 0 rgb(216 160 82);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+.itemBox {
|
|
|
|
+ padding: 20rpx 40rpx;
|
|
|
|
+ .item {
|
|
|
|
+ // padding: 10rpx 0;
|
|
|
|
+ margin-top: 20rpx;
|
|
|
|
+ // color: rgba(119,78,32,.5);
|
|
|
|
+ // &.active {
|
|
|
|
+ color:#774e20;
|
|
|
|
+ // }
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+.pay {
|
|
|
|
+ position: sticky;
|
|
|
|
+ bottom: 0;
|
|
|
|
+ padding: 0 40rpx 100rpx 40rpx;
|
|
|
|
+ box-sizing: border-box;
|
|
|
|
+ &-box {
|
|
|
|
+ width: 100%;
|
|
|
|
+ background: linear-gradient(121deg,#fde2c2 29.02%,#c19164 104.03%);
|
|
|
|
+ border-radius: 180rpx 0 180rpx 0;
|
|
|
|
+ box-shadow: 3rpx 6rpx 10rpx 0rpx rgb(216 160 82);
|
|
|
|
+ display: flex;
|
|
|
|
+ justify-content: space-between;
|
|
|
|
+ align-items: center;
|
|
|
|
+ height: 100rpx;
|
|
|
|
+ .price {
|
|
|
|
+ padding: 0 40rpx;
|
|
|
|
+ font-size: 40rpx;
|
|
|
|
+ font-weight: 600;
|
|
|
|
+ color: #e68735;
|
|
|
|
+ }
|
|
|
|
+ .btn {
|
|
|
|
+ height: 100%;
|
|
|
|
+ display: flex;
|
|
|
|
+ align-items: center;
|
|
|
|
+ padding: 0 40rpx;
|
|
|
|
+ border: 2rpx solid #00897B;
|
|
|
|
+ background: #00897B;
|
|
|
|
+ color: #FFF;
|
|
|
|
+ border-radius: 180rpx 0 180rpx 0;
|
|
|
|
+ position: relative;
|
|
|
|
+ // &::after {
|
|
|
|
+ // content: '';
|
|
|
|
+ // position: absolute;
|
|
|
|
+ // width: 50rpx;
|
|
|
|
+ // height: 50rpx;
|
|
|
|
+ // background: radial-gradient(top right, transparent 50%, #00897B 50%);
|
|
|
|
+ // left: 0;
|
|
|
|
+ // top: 0;
|
|
|
|
+ // margin-left: -25rpx;
|
|
|
|
+ // border-radius: 180rpx;
|
|
|
|
+ // }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+</style>
|