Ai_GirlFriend/xuniYou/pages/mine/member.vue

463 lines
10 KiB
Vue
Raw Normal View History

2026-01-31 19:15:41 +08:00
<template>
<view>
<uni-nav-bar fixed statusBar left-icon="left" right-icon="gear" background-color="transparent" :border="false"
:style="{ '--right-padding': getMenuInfoList + 'px' }" @clickLeft="back" @clickRight="tosetUp"
title="开通会员"></uni-nav-bar>
<view class="back"></view>
<view class="body">
<view class="user fa">
<image :src="userInfo.avatar ? userInfo.avatar : '/static/images/avatar.png'" mode="aspectFill"></image>
<view class="user_content f1">
<view class="user_name">{{ userInfo.nickname }}</view>
<view class="user_text">{{ userInfo.vip == 0 ? '会员未开通' : '会员已开通' }}</view>
</view>
</view>
<view class="module" v-if="userInfo.vip_endtime">
<view>到期时间 {{ formatTime(userInfo.vip_endtime) }}</view>
</view>
<view class="list">
<view class="list_head fa">
<image src="/static/images/member_logo.png" mode="widthFix"></image>
无线畅聊+无线语音
</view>
<view class="list_content fa sb">
<view class="list_member" v-for="(item, index) in memberList" :key="index"
@click="memberClick(index, item.id)" :class="memberIndex == index ? 'list_active' : ''">
<view class="list_first" :style="memberIndex == index ? 'color: #FF51B3;' : ''">{{ item.title }}
</view>
<view class="list_price fx" :style="memberIndex == index ? 'color: #FF51B3;' : ''">
¥<text>{{ item.money }}</text></view>
<view class="list_break" :style="memberIndex == index ? 'color: #FF51B3;' : ''">{{ item.desc }}
</view>
<image class="list_tag" v-if="memberIndex == index" src="/static/images/member_tag.png"></image>
</view>
</view>
<view class="list_module">
<view class="list_title">权益对比</view>
<view class="list_detail fa sb">
<view class="list_item">
<view class="list_item_title faj">权益名称</view>
<view class="list_item_title faj">聊天条数</view>
<view class="list_item_title faj">免广告权益</view>
<view class="list_item_title faj">语音时长</view>
<view class="list_item_title faj">视频生成</view>
</view>
<view class="list_item">
<view class="list_item_title faj">非VIP会员</view>
<view class="list_item_title faj">聊天100次/</view>
<view class="list_item_title faj">不免广告</view>
<view class="list_item_title faj">不可语音</view>
<view class="list_item_title faj">无法生成视频</view>
</view>
<view class="list_items faj fc">
<view class="list_item_titles faj">VIP</view>
<view class="list_item_titles faj">无限聊天</view>
<view class="list_item_titles faj">全站免广告</view>
<view class="list_item_titles faj">无限语音</view>
<view class="list_item_titles faj">2/</view>
</view>
</view>
</view>
<view class="list_btn faj" @click="toOpenMember">确认协议并开通</view>
<view class="list_text faj">阅读并确认同意<text>会员服务协议</text></view>
</view>
</view>
</view>
</template>
<script>
import {
VipPackageApi,
CreateVipOrderApi,
VipPayApi,
} from '@/utils/api.js'
import notHave from '@/components/not-have.vue';
import topSafety from '@/components/top-safety.vue';
import tabBar from '@/components/tab-bar.vue';
export default {
components: {
notHave,
topSafety,
tabBar,
},
data() {
return {
memberList: [
{
id: 0,
name: '首次包月',
price: '14',
text: '首月享7折',
},
{
id: 1,
name: '首次包季',
price: '36',
text: '首季享7折',
},
{
id: 2,
name: '首次包年',
price: '120',
text: '首年享7折',
},
],
memberIndex: 0,
userInfo: uni.getStorageSync('userinfo'),
vip_package_id: '',
avatar: '',
nickname: '',
getMenuInfoList: '',
}
},
onShow() {
this.getRechargePackage()
// #ifdef MP-WEIXIN
this.getMenuInfo()
// #endif
},
methods: {
//充值套餐列表
getRechargePackage() {
VipPackageApi({}).then(res => {
if (res.code == 1) {
this.memberList = res.data
this.vip_package_id = res.data[0].id
}
})
},
memberClick(index, id) {
this.memberIndex = index
this.vip_package_id = id
},
toOpenMember() {
CreateVipOrderApi({
vip_package_id: this.vip_package_id,
pay_type: 'miniWechat'
}).then(res => {
if (res.code == 1) {
VipPayApi({
out_trade_no: res.data.out_trade_no
}).then(res => {
if (res.code == 1) {
uni.showModal({
title: '提示',
content: '会员开通成功!',
showCancel: false,
success: () => {
uni.navigateBack({
delta: 1
});
}
});
}
})
}
})
},
formatTime(timestamp) {
// 检查是否为时间戳(数字)
if (typeof timestamp === 'number') {
// 时间戳转为日期格式
const date = new Date(timestamp * 1000); // 注意JavaScript需要毫秒所以可能需要 * 1000
return this.formatDate(date);
}
// 如果已经是字符串格式,直接返回
return timestamp;
},
formatDate(date) {
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, '0');
const day = String(date.getDate()).padStart(2, '0');
const hours = String(date.getHours()).padStart(2, '0');
const minutes = String(date.getMinutes()).padStart(2, '0');
const seconds = String(date.getSeconds()).padStart(2, '0');
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
},
back() {
uni.navigateBack({
delta: 1,
});
},
tosetUp() {
uni.navigateTo({
url: '/pages/mine/setUp'
})
},
getMenuInfo() {
const menuButtonInfo = uni.getMenuButtonBoundingClientRect();
const systemInfo = uni.getSystemInfoSync();
console.log('胶囊信息:', menuButtonInfo);
// 胶囊宽度
const capsuleWidth = menuButtonInfo.width;
// 胶囊距离右侧的距离 = 屏幕宽度 - 胶囊右边界的x坐标
const distanceFromRight = systemInfo.windowWidth - menuButtonInfo.right;
console.log('胶囊宽度:', capsuleWidth);
console.log('胶囊距离右侧的距离:', distanceFromRight);
this.getMenuInfoList = capsuleWidth + distanceFromRight;
return {
width: capsuleWidth,
distanceFromRight: distanceFromRight,
menuButtonInfo: menuButtonInfo
};
},
}
}
</script>
<style>
page {
background: #F7F7F7;
}
</style>
<style>
.body {
position: relative;
padding: 30rpx 0 0 0;
}
.back {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 596rpx;
background: linear-gradient(180deg, #FFE3E9 0%, #F7F7F7 100%);
}
.user {
position: relative;
padding: 0 40rpx;
}
.user image {
width: 120rpx;
height: 120rpx;
display: block;
border-radius: 100rpx;
flex-shrink: 0;
}
.user_content {
position: relative;
margin: 0 0 0 30rpx;
}
.user_name {
font-weight: 500;
font-size: 36rpx;
color: #000000;
line-height: 50rpx;
}
.user_text {
font-weight: 400;
font-size: 28rpx;
color: #9E9E9E;
line-height: 50rpx;
}
.module {
position: relative;
margin: 40rpx 40rpx 0 40rpx;
padding: 44rpx 40rpx;
background: #FFFFFF;
border-radius: 32rpx;
}
.list {
position: relative;
margin: 40rpx 0 0 0;
padding: 44rpx 40rpx;
background: #FFFFFF;
border-radius: 32rpx 32rpx 0 0;
}
.list_head {
position: relative;
margin: 0 0 0 20rpx;
font-weight: 400;
font-size: 28rpx;
color: #9E9E9E;
line-height: 50rpx;
}
.list_head image {
margin: 0 26rpx 0 0;
width: 102rpx;
height: 50rpx;
display: block;
}
.list_content {
position: relative;
margin: 38rpx 0 0 0;
}
.list_member {
position: relative;
padding: 20rpx 40rpx;
background: #FFFFFF;
box-shadow: 0rpx 8rpx 20rpx 0rpx rgba(194, 194, 194, 0.3);
border-radius: 26rpx;
border: 2rpx solid #FFFFFF;
}
.list_active {
color: #FF51B3 !important;
background: #FFEBF6;
box-shadow: 0rpx 8rpx 20rpx 0rpx rgba(194, 194, 194, 0.3);
border: 2rpx solid #FF51B3;
}
.list_first {
font-weight: 400;
font-size: 28rpx;
color: #333333;
line-height: 50rpx;
}
.list_price {
margin: 10rpx 0 0 0;
font-weight: 700;
font-size: 28rpx;
color: #222222;
line-height: 50rpx;
}
.list_price text {
font-size: 52rpx;
line-height: 30rpx;
}
.list_break {
margin: 12rpx 0 0 0;
font-weight: 400;
font-size: 24rpx;
color: #9E9E9E;
line-height: 50rpx;
}
.list_tag {
position: absolute;
left: -2rpx;
top: -11rpx;
width: 48rpx;
height: 50rpx;
display: block;
}
.list_module {
position: relative;
margin: 40rpx 0 0 0;
}
.list_title {
font-weight: 500;
font-size: 32rpx;
color: #222222;
line-height: 50rpx;
}
.list_detail {
position: relative;
margin: 46rpx 0 0 0;
}
.list_item {
position: relative;
}
.list_item_title {
padding: 20rpx 100rpx 18rpx 48rpx;
font-weight: 500;
font-size: 30rpx;
color: #9E9E9E;
line-height: 50rpx;
background: #FAFAFA;
border-radius: 12rpx 12rpx 0rpx 0rpx;
}
.list_item:nth-child(2) .list_item_title {
padding: 20rpx 28rpx 18rpx 100rpx;
}
.list_item:nth-child(1) .list_item_title:nth-child(2n) {
background: #FFFFFF;
}
.list_item:nth-child(2) .list_item_title:nth-child(2n) {
background: #FFFFFF;
}
.list_items {
position: absolute;
left: 0;
right: 0;
top: -25rpx;
margin: auto 0;
}
.list_item_titles {
padding: 20rpx 18rpx;
font-weight: 500;
font-size: 30rpx;
color: #FF51B3;
line-height: 50rpx;
background: #FFEBF6;
width: 150rpx;
}
.list_items .list_item_titles:nth-child(1) {
padding: 45rpx 18rpx 20rpx 18rpx;
border-radius: 12rpx 12rpx 0rpx 0rpx;
}
.list_items .list_item_titles:nth-child(5) {
padding: 15rpx 18rpx 35rpx 18rpx;
border-radius: 0rpx 0rpx 12rpx 12rpx;
}
.list_btn {
margin: 76rpx 0 0 0;
padding: 24rpx 0;
font-weight: 400;
font-size: 32rpx;
color: #FFFFFF;
line-height: 50rpx;
background: linear-gradient(135deg, #9F47FF 0%, #FF51B3 100%);
border-radius: 12rpx;
}
.list_text {
position: relative;
margin: 50rpx 0 0 0;
font-weight: 400;
font-size: 28rpx;
color: #9E9E9E;
line-height: 50rpx;
}
.list_text text {
color: #8449FE;
}
.uni-navbar__header-btns {
padding-right: var(--right-padding, 0);
}
.uni-navbar__header-btns-right.data-v-26544265 {
width: 60rpx !important;
}
</style>