推拿小程序前端代码仓库
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

500 lines
12 KiB

<template>
<view class="page">
<view class="flex flex-column header">
<!-- 未登录显示 -->
<view v-if="!isLogin" class="flex flex-column no-login">
<view class="no-login-text">登录后查看个人信息</view>
<button class="no-login-btn" @click="$utils.toLogin">立即登录</button>
</view>
<!-- 登录后显示用户信息 -->
<view v-else class="flex flex-column user">
<image class="user-avatar" :src="userInfo.headImage" mode="aspectFill"></image>
<view class="user-name">{{ userInfo.nickName }}</view>
</view>
<view class="member">
<view class="flex member-overview" :class="[role ? 'is-member' : '']">
<template v-if="role">
<!-- todo: 缺切图 "皇冠" -->
<image class="icon icon-crown" src="" mode="widthFix"></image>
<image v-if="role" class="icon icon-role" :src="vipInfo.massageVipCombo.imageVip" mode="widthFix"></image>
<text v-if="vipInfo.validTime" class="member-tips">{{ `将于${$dayjs(vipInfo.validTime).format('YYYY-MM-DD')}到期` }}</text>
</template>
<template v-else>
<view class="flex">
<!-- todo: 缺切图 "皇冠" -->
<image class="icon icon-crown" src="" mode="widthFix"></image>
<!-- todo: 缺切图 "会员" -->
<image class="icon icon-member" src="" mode="widthFix"></image>
<text class="member-tips">成为会员可获得会员卡,享受会员福利哟~</text>
</view>
<button plain class="btn member-btn" @click="$utils.navigateTo('/pages_order/mine/memberCenter')">立即开通</button>
</template>
</view>
<view class="member-rights">
<image class="member-rights-bg" src="@/pages_order/static/center/member-bg.png" mode="top" ></image>
<view class="flex member-rights-content">
<view class="flex">
<image class="icon icon-rights" src="@/static/image/center/icon-member-weal.png" mode="widthFix"></image>
<view>
<view class="member-rights-label">会员福利</view>
<view class="member-rights-value">会员折扣</view>
</view>
</view>
<view class="flex">
<!-- todo: 缺切图 -->
<image class="icon icon-rights" src="@/static/image/center/icon-member-weal.png" mode="widthFix"></image>
<view>
<view class="member-rights-label">会员积分</view>
<view class="member-rights-value">兑换礼品</view>
</view>
</view>
<!-- todo: 缺切图 -->
<view class="flex">
<image class="icon icon-rights" src="@/static/image/center/icon-member-weal.png" mode="widthFix"></image>
<view>
<view class="member-rights-label">会员优惠券</view>
<view class="member-rights-value">满减折扣</view>
</view>
</view>
</view>
</view>
</view>
</view>
<!-- 账户信息 - 登录后显示 -->
<view class="card flex account">
<view class="flex flex-column">
<view class="account-value">{{ userInfo.price || 0 }}<text class="account-unit">元</text></view>
<view class="account-label">我的余额</view>
</view>
<view class="flex flex-column">
<!-- todo: 字段对接 -->
<view class="account-value">{{ riceInfo.balance || 0 }}</view>
<view class="account-label">我的积分</view>
</view>
<view class="flex flex-column">
<view class="account-value">{{ riceInfo.canWithdraw || 0 }}<text class="account-unit">元</text></view>
<view class="account-label">推广佣金</view>
</view>
<view class="flex flex-column">
<!-- todo: 字段对接 -->
<view class="account-value">{{ riceInfo.balance || 0 }}<text class="account-unit">张</text></view>
<view class="account-label">优惠券</view>
</view>
</view>
<view class="card fun-common">
<view v-if="isMerchants" class="fun-header">
<cardTitle>常用功能</cardTitle>
</view>
<view class="fun-content fun-common-content">
<view class="flex flex-column" @click="$utils.navigateTo('/pages_order/mine/memberCenter')">
<image class="fun-common-icon" src="@/static/image/center/icon-member-center.png" mode="widthFix"></image>
<text class="fun-common-label">会员中心</text>
</view>
<view class="flex flex-column" @click="$utils.navigateTo('/pages_order/mine/partner')">
<image class="fun-common-icon" src="@/static/image/center/icon-team.png" mode="widthFix"></image>
<text class="fun-common-label">我的团队</text>
</view>
<view class="flex flex-column" @click="$utils.navigateTo('/pages_order/mine/promotion')">
<image class="fun-common-icon" src="@/static/image/center/icon-invite.png" mode="widthFix"></image>
<text class="fun-common-label">邀请好友</text>
</view>
<view class="flex flex-column" @click="$utils.navigateTo('/pages_order/mine/coupon')">
<image class="fun-common-icon" src="@/static/image/center/icon-coupon.png" mode="widthFix"></image>
<text class="fun-common-label">优惠券</text>
</view>
<view class="flex flex-column" @click="$utils.navigateTo('/pages_order/mine/voucher')">
<image class="fun-common-icon" src="@/static/image/center/icon-voucher.png" mode="widthFix"></image>
<text class="fun-common-label">代金券</text>
</view>
<!-- todo: check -> @click="openServicePopup" -->
<view class="flex flex-column" @click="$utils.navigateTo('/pages_order/home/contact')">
<image class="fun-common-icon" src="@/static/image/center/icon-service.png" mode="widthFix"></image>
<text class="fun-common-label">联系客服</text>
</view>
<view class="flex flex-column" @click="$utils.navigateTo('/pages_order/mine/signIn')">
<image class="fun-common-icon" src="@/static/image/center/icon-sign-in.png" mode="widthFix"></image>
<text class="fun-common-label">每日签到</text>
</view>
<view class="flex flex-column" @click="$utils.navigateTo('/pages_order/mine/cooperation')">
<image class="fun-common-icon" src="@/static/image/center/icon-cooperation.png" mode="widthFix"></image>
<text class="fun-common-label">商家合作</text>
</view>
</view>
</view>
<view v-if="isMerchants" class="card fun-merchant">
<view class="fun-header">
<cardTitle>商家功能</cardTitle>
</view>
<view class="flex fun-content fun-merchant-content">
<view class="left" @click="$utils.navigateTo('/pages_order/mine/verifyRecord')">
<image class="left-bg" src="@/static/image/center/bg-verify.png"></image>
<view class="flex left-content">
<text>核销明细</text>
<image class="left-icon" src="@/static/image/center/icon-arrow.png" mode="widthFix"></image>
</view>
</view>
<!-- todo -->
<view class="right" @click="onScan">
<image class="right-bg" src="@/static/image/center/bg-scan.png"></image>
</view>
</view>
</view>
<customerServicePopup ref="customerServicePopup" />
<tabber select="center" />
</view>
</template>
<script>
import cardTitle from '@/components/base/cardTitle.vue'
import tabber from '@/components/base/tabbar.vue'
import { mapGetters, mapState } from 'vuex'
import customerServicePopup from '@/components/config/customerServicePopup.vue'
export default {
components: {
cardTitle,
tabber,
customerServicePopup,
},
computed: {
...mapGetters(['role']),
...mapState(['userInfo', 'vipInfo', 'riceInfo']),
isMerchants() {
return this.userInfo.isMerchants === '1'
},
isLogin() {
return this.userInfo && this.userInfo.id
}
},
data() {
return {
}
},
onShow() {
if(this.isLogin){
this.$store.commit('getUserInfo')
this.$store.commit('getUserCenterInfo')
this.$store.commit('getRiceInfo')
}
},
methods: {
clickNo() {
uni.showModal({
title: '暂未开放',
})
},
logout(){
uni.showModal({
title: '确认退出登录吗',
success : (r) => {
if (r.confirm) {
this.$store.commit('logout', true)
}
}
})
},
openServicePopup(phone, title) {
// todo
this.$refs.customerServicePopup.open(phone, title)
},
onScan() {
// todo check
uni.scanCode({
success: (res) => {
console.log(res);
if (res.result) {
// 处理扫码结果
console.log('扫码结果:', res.result);
this.$fetch('overOrder', {
orderId : res.result
}).then(() => {
uni.showToast({
title: '核销成功',
icon: 'none'
})
})
}
},
fail: (err) => {
console.error('扫码失败:', err);
uni.showToast({
title: '扫码失败',
icon: 'none'
})
}
});
},
}
}
</script>
<style scoped lang="scss">
.page {
background-color: #F5F5F5;
.header {
height: 550rpx;
background-image: linear-gradient(#84A73F, #D8FF8F);
justify-content: flex-start;
position: relative;
}
}
.user {
margin-top: 123rpx;
&-avatar {
width: 115rpx;
height: 115rpx;
border-radius: 50%;
}
&-name {
margin-top: 4rpx;
color: $uni-text-color-inverse;
font-size: 30rpx;
text-align: center;
}
}
.no-login {
margin-top: 123rpx;
align-items: center;
&-img {
width: 115rpx;
height: auto;
margin-bottom: 20rpx;
}
&-text {
color: #FFFFFF;
font-size: 28rpx;
margin-bottom: 40rpx;
}
&-btn {
padding: 16rpx 60rpx;
background-color: #FFFFFF;
color: #84A73F;
font-size: 28rpx;
font-weight: bold;
border-radius: 40rpx;
box-shadow: 0 4rpx 8rpx rgba(0, 0, 0, 0.1);
}
}
.member {
width: calc(100vw - 13rpx*2);
position: absolute;
bottom: 0;
left: 13rpx;
color: #F5F5F5;
font-size: 22rpx;
background-color: #2B2C30;
border-top-left-radius: 20rpx;
border-top-right-radius: 20rpx;
&-overview {
min-height: 81rpx;
justify-content: space-between;
&.is-member {
justify-content: flex-start;
}
}
.icon {
height: auto;
&-crown {
width: 35rpx;
margin-left: 20rpx;
}
&-member {
width: 62rpx;
}
&-role {
width: 156rpx;
margin-right: 15rpx;
}
&-rights {
width: 56rpx;
margin-right: 11rpx;
}
}
&-btn {
padding: 9rpx 17rpx;
color: #000000;
font-size: 22rpx;
background-image: linear-gradient(131deg, #F8EDE1, #B3997E);
box-shadow: 0rpx 3rpx 6rpx 0rpx rgba(0,0,0,0.16);
border-radius: 24rpx;
margin-right: 18rpx;
}
&-tips {
margin-left: 6rpx;
}
&-rights {
background-color: #37393D;
position: relative;
width: 100%;
height: 142rpx;
box-sizing: border-box;
&-bg {
width: 100%;
height: 100%;
}
&-content {
position: absolute;
bottom: 0;
width: 100%;
height: 100%;
box-sizing: border-box;
padding: 0 35rpx 6rpx 35rpx;
justify-content: space-between;
}
&-label {
color: #CBAD8F;
font-size: 22rpx;
font-weight: 700;
}
&-value {
color: #F5F5F5;
font-size: 18rpx;
}
}
}
.card {
margin: 20rpx 13rpx 0 13rpx;
}
.account {
padding: 40rpx 40rpx 23rpx 40rpx;
justify-content: space-between;
&-label {
color: #666666;
font-size: 28rpx;
margin-top: 9rpx;
}
&-value {
color: #000000;
font-size: 32rpx;
}
&-unit {
color: #666666;
font-size: 18rpx;
margin-left: 2rpx;
}
}
.fun {
&-header {
text-align: left;
padding-left: 12rpx;
margin-bottom: 19rpx;
/deep/ .title__view {
display: inline-flex;
}
}
&-content {
margin-top: 24rpx;
}
&-common {
padding: 30rpx 40rpx 67rpx 40rpx;
&-content {
display: grid;
grid-template-columns: repeat(4, 1fr);
grid-column-gap: 71rpx;
grid-row-gap: 81rpx;
}
&-icon {
width: 66rpx;
height: auto;
}
&-label {
color: #000000;
font-size: 28rpx;
margin-top: 5rpx;
}
}
&-merchant {
padding: 33rpx 30rpx 28rpx 30rpx;
margin-bottom: 10rpx;
&-content {
justify-content: space-between;
}
.left {
width: 198rpx;
height: 139rpx;
position: relative;
&-bg {
width: 100%;
height: 100%;
}
&-content {
position: absolute;
top: 13rpx;
left: 14rpx;
color: $uni-text-color-inverse;
font-size: 28rpx;
}
&-icon {
width: 23rpx;
height: auto;
margin-left: 9rpx;
}
}
.right {
width: 429rpx;
height: 164rpx;
margin-top: -25rpx;
&-bg {
width: 100%;
height: 100%;
}
}
}
}
</style>