Files
wangxiaowei f59ed2e36d 完善功能
2025-12-04 17:30:32 +08:00

722 lines
17 KiB
Vue

<template>
<view :data-theme='theme()' :class="theme() || ''" :style="'background-image: url(https://xh.stnav.com/uploads/sport/ground1.png); background-repeat: no-repeat; background-size:100% auto;background-color:#F6F7F9;padding-bottom: 40rpx;'">
<!-- #ifdef APP-PLUS -->
<header-bar></header-bar>
<!-- #endif -->
<view class="top_head pr">
<view class="head_top" :style="'height:' + topBarTop() + 'px;'"></view>
<view class="title" :style="topBarHeight() == 0 ? '' : 'height:' + topBarHeight() + 'px;'">
</view>
</view>
<view class="user-index" v-if="!loadding">
<!--个人信息-->
<view class="user-header">
<view class="user-header-inner">
<view class="user-info">
<view class="photo">
<image :src="detail.avatarUrl" mode="aspectFill"></image>
</view>
<view class="info">
<view class="d-c-c mb23">
<view class="name">{{ detail.nickName }}</view>
<text class="ml20 grade" v-if="detail.grade_id > 0">
{{ detail.grade.name }}
</text>
</view>
<view class="tel d-s-c">
<text class="f26 id-number">{{ detail.mobile || 'ID:' + detail.user_id }}</text>
</view>
</view>
</view>
</view>
<!--我的订单-->
<!-- <view class="my-order">
<view class="list d-a-c flex-1">
<view class="item d-c-c d-c" @click="jumpPage('/pages/user/my-wallet/my-wallet')">
<view class=" red_mini">{{ detail.balance }}</view>
<text class="pt16 f24 gray3">账号余额</text>
</view>
<view class="item order_center d-c-c d-c" @click="jumpPage('/pages/user/points/points')">
<view class=" red_mini">{{ detail.points }}</view>
<text class="pt16 f24 gray3">{{points_name()}}</text>
</view>
<view class="item d-c-c d-c" @click="jumpPage('/pages/user/my-coupon/my-coupon')">
<view class="red_mini">{{ coupon }}</view>
<text class="pt16 f24 gray3">优惠券</text>
</view>
</view>
</view> -->
<!-- 我的场馆订单 -->
<view class="my-cg-order my-assets">
<view class="my-assets-all">
<view class="f30 fb">我的场馆订单</view>
<view class="gray9 f26" @click="jumpPage('/pages/order/cg-my-order?dataType=all')">全部订单<text
class="icon iconfont icon-jiantou"></text></view>
</view>
<view class="d-b-c w100">
<view class="item" @click="jumpPage('/pages/order/cg-my-order?dataType=payment')">
<view class="icon-box pr">
<image src="/static/icon/dfk.png" mode=""></image>
<text class="dot d-c-c"
v-if="orderCount.payment != null && orderCount.payment > 0">{{ orderCount.payment }}</text>
</view>
<text>待付款</text>
</view>
<view class="item" @click="jumpPage('/pages/order/cg-my-order?dataType=reserve')">
<view class="icon-box pr">
<image src="/static/icon/yyy.png" mode=""></image>
<text class="dot d-c-c"
v-if="orderCount.reserve != null && orderCount.reserve > 0">{{ orderCount.reserve }}</text>
</view>
<text class="">已预约</text>
</view>
<view class="item" @click="jumpPage('/pages/order/cg-my-order?dataType=completed')">
<view class="icon-box pr">
<image src="/static/icon/ywc.png" mode=""></image>
<text class="dot d-c-c"
v-if="orderCount.completed != null && orderCount.completed > 0">{{ orderCount.completed }}</text>
</view>
<text>已完成</text>
</view>
<view class="item" @click="jumpPage('/pages/order/refund/index/index')">
<view class="icon-box pr">
<image src="/static/icon/tk.png" mode=""></image>
<text class="dot d-c-c"
v-if="orderCount.refund != null && orderCount.refund > 0">{{ orderCount.refund }}</text>
</view>
<text>退款/售后</text>
</view>
</view>
</view>
</view>
<view class="bind_phone" v-if="!detail.mobile">
<view class="bind_content">
<view class="bind_txt">确保账户安全,请绑定手机号</view>
<!-- #ifdef MP-WEIXIN -->
<button open-type="getPhoneNumber" class="bind_btn" @getphonenumber="getPhoneNumber">去绑定</button>
<!-- #endif -->
<!-- #ifndef MP-WEIXIN -->
<button class="bind_btn" @click="bindMobile">去绑定</button>
<!-- #endif -->
</view>
</view>
<!--我的资产-->
<view class="my-assets">
<view class="my-assets-all">
<view class="f30 fb">我的订单</view>
<view class="gray9 f26" @click="jumpPage('/pages/order/myorder?dataType=all')">全部订单<text
class="icon iconfont icon-jiantou"></text></view>
</view>
<view class="d-b-c w100">
<view class="item" @click="jumpPage('/pages/order/myorder?dataType=payment')">
<view class="icon-box pr">
<image src="/static/icon/dfk.png" mode=""></image>
<text class="dot d-c-c"
v-if="orderCount.payment != null && orderCount.payment > 0">{{ orderCount.payment }}</text>
</view>
<text>待付款</text>
</view>
<view class="item" @click="jumpPage('/pages/order/myorder?dataType=delivery')">
<view class="icon-box pr">
<image src="/static/icon/dfh.png" mode=""></image>
<text class="dot d-c-c"
v-if="orderCount.delivery != null && orderCount.delivery > 0">{{ orderCount.delivery }}</text>
</view>
<text class="">待发货</text>
</view>
<view class="item" @click="jumpPage('/pages/order/myorder?dataType=received')">
<view class="icon-box pr">
<image src="/static/icon/dsh.png" mode=""></image>
<text class="dot d-c-c"
v-if="orderCount.received != null && orderCount.received > 0">{{ orderCount.received }}</text>
</view>
<text>待收货</text>
</view>
<!-- <view class="item" @click="jumpPage('/pages/order/myorder?dataType=comment')">
<view class="icon-box pr">
<image src="/static/icon/icon-quanbudingdan.png" mode=""></image>
<text class="dot d-c-c"
v-if="orderCount.comment != null && orderCount.comment > 0">{{ orderCount.comment }}</text>
</view>
<text>待评价</text>
</view> -->
<view class="item" @click="jumpPage('/pages/order/refund/index/index')">
<view class="icon-box pr">
<image src="/static/icon/tk.png" mode=""></image>
<text class="dot d-c-c"
v-if="orderCount.refund != null && orderCount.refund > 0">{{ orderCount.refund }}</text>
</view>
<text>退款/售后</text>
</view>
</view>
</view>
<!--菜单-->
<view class="menu-wrap">
<view class="my-assets-all p-0-30">
<view class="f30 fb">我的服务</view>
</view>
<view class="group-bd f-w" style="padding: 0 30rpx;">
<view :class="'item ' + item.icon + '-box'" v-for="(item, index) in menus" :key="index"
@click="jumpPage(item.path)" style="margin-bottom: 30rpx;">
<view class="d-b-c" style="width: 100%;">
<view class="d-f">
<view class="icon-round d-c-c">
<image class="icon-round" :src="item.icon" mode="" style="width: 40rpx; height: 40rpx;"></image>
</view>
<view class="name">{{ item.name }}</view>
</view>
<view class="gray9 f26" @click="jumpPage('/pages/order/myorder?dataType=all')"><text
class="icon iconfont icon-jiantou" style="color: #BFC2CC;font-size: 26rpx; "></text></view>
</view>
<view class="line" v-if="index !== menus.length - 1"></view>
</view>
</view>
</view>
<view v-if="invitation.is_open && invitation.invitation_id > 0">
<view class="activity_img" @click="toinvitation(invitation.invitation_id)">
<image :src="invitation.image" mode=""></image>
</view>
</view>
<!--推荐-->
<!-- <view>
<recommendProduct :location="20"></recommendProduct>
</view> -->
</view>
<tabBar></tabBar>
</view>
</template>
<script>
import recommendProduct from '@/components/recommendProduct/recommendProduct.vue';
export default {
components: {
recommendProduct
},
data() {
return {
/*签到数据*/
sign: {},
/*是否加载完成*/
loadding: true,
indicatorDots: true,
autoplay: true,
interval: 2000,
duration: 500,
/*菜单*/
menus: [],
invitation: {},
detail: {
balance: 0,
points: 0,
grade: {
name: ''
},
},
orderCount: {},
coupon: 0,
setting: {},
user_type: '', //用户状态
sessionKey: ''
};
},
onShow() {
/*获取个人中心数据*/
this.getData();
this.getTabBarLinks();
},
onLoad(e) {
let self = this;
if (e.invitation_id) {
uni.setStorageSync('invitation_id', e.invitation_id);
}
if (e.referee_id) {
uni.setStorageSync('referee_id', e.referee_id);
}
//#ifdef MP-WEIXIN
wx.login({
success(res) {
// 发送用户信息
self._post('user.user/getSession', {
code: res.code
}, result => {
self.sessionKey = result.data.session_key;
});
}
});
//#endif
},
methods: {
/*获取数据*/
getData() {
let self = this;
uni.showLoading({
title: '加载中'
});
self._post('user.index/detail', {
source: self.getPlatform()
}, function(res) {
//#ifdef MP-WEIXIN
if (res.data.getPhone) {
//#ifdef MP-WEIXIN
self.gotoPage('/pages/login/bindmobile');
//#endif
//#ifndef MP-WEIXIN
self.bindMobile();
//#endif
return;
}
//#endif
self.detail = res.data.userInfo;
self.sign = res.data.sign;
self.coupon = res.data.coupon;
self.orderCount = res.data.orderCount;
self.menus = res.data.menus;
self.invitation = res.data.invitation;
self.setting = res.data.setting;
self.loadding = false;
uni.hideLoading();
});
},
bindMobile() {
this.gotoPage("/pages/user/modify-phone/modify-phone");
},
/*跳转页面*/
jumpPage(path) {
this.gotoPage(path);
},
toinvitation(id) {
if (id == 0) {
uni.showToast({
title: '暂无活动'
})
} else {
this.gotoPage('/pages/user/invite/invite?invitation_gift_id=' + id);
}
},
getPhoneNumber(e) {
var self = this;
console.log(e.detail);
if (e.detail.errMsg !== 'getPhoneNumber:ok') {
return false;
}
uni.showLoading({
title: "正在提交",
mask: true
});
// 发送用户信息
self._post('user.user/bindMobile', {
session_key: self.sessionKey,
encrypted_data: e.detail.encryptedData,
iv: e.detail.iv,
}, result => {
uni.showToast({
title: '绑定成功'
});
// 执行回调函数
self.detail.mobile = result.data.mobile;
}, false, () => {
uni.hideLoading();
});
},
}
};
</script>
<style lang="scss">
page {
background-color: #EBEBEB;
}
.w100 {
width: 100%;
}
.foot_ {
height: 98rpx;
width: 100%;
}
.user-header {
position: relative;
// @include background_color('background_color');
}
.user-header .user-header-inner {
position: relative;
padding: 30rpx 30rpx 0;
display: flex;
justify-content: space-between;
align-items: center;
overflow: hidden;
margin-bottom: 20rpx;
}
.user-header .user-header-inner::after,
.user-header .user-header-inner::before {
display: block;
content: '';
position: absolute;
border-radius: 50%;
z-index: 0;
}
.user-header .user-header-inner::after {
width: 400rpx;
height: 400rpx;
right: -100rpx;
bottom: -200rpx;
background-image: radial-gradient(90deg, rgba(255, 255, 255, 0.2) 10%, rgba(255, 255, 255, 0));
}
.user-header .user-header-inner::before {
width: 200rpx;
height: 200rpx;
left: -60rpx;
top: -20rpx;
background-image: radial-gradient(-90deg, rgba(255, 255, 255, 0.2) 10%, rgba(255, 255, 255, 0));
}
.user-header .user-info {
display: flex;
justify-content: flex-start;
align-items: center;
}
.user-header .photo,
.user-header .photo image {
width: 100rpx;
height: 100rpx;
border-radius: 50%;
}
.user-header .photo {
border: 4rpx solid #ffffff;
}
.user-header .info {
padding-left: 20rpx;
box-sizing: border-box;
overflow: hidden;
color: #ffffff;
}
.user-header .info .name {
font-size: 36rpx;
color: #303133;
line-height: 50rpx;
}
.user-header .info .id-number {
font-size: 24rpx;
color: #606266;
line-height: 34rpx;
}
.user-header .info .tel {
font-size: 26rpx;
}
.user-header .info .grade {
display: block;
padding: 0 16rpx;
font-size: 22rpx;
/* height: 36rpx; */
line-height: 36rpx;
border-radius: 40rpx;
background-color:rgba($color: #000000, $alpha: 0.1);
color: #ffffff;
}
.user-header .sign-box {
position: absolute;
right: 20rpx;
padding: 0 10rpx;
height: 50rpx;
border: 1px solid #ffe300;
border-radius: 25rpx;
font-size: 24rpx;
color: #ffe300;
z-index: 10;
}
.user-header .sign-box .iconfont {
color: #ffe300;
}
.user-header .my-order {
position: absolute;
padding: 0 30rpx;
/* height: 240rpx; */
right: 20rpx;
bottom: -75rpx;
left: 20rpx;
box-sizing: border-box;
border-radius: 16rpx;
/* box-shadow: 0 0 6rpx 0 rgba(0, 0, 0, 0.1); */
background: #ffffff;
z-index: 10;
}
.my-cg-order {
margin: 0 20rpx 20rpx !important;
padding: 30rpx;
background: #ffffff;
border-radius: 12rpx;
}
.my-cg-order .title {
font-size: 30rpx;
color: #303133;
line-height: 42rpx;
}
.my-cg-order .title2 {
font-size: 24rpx;
color: #606266;
line-height: 34rpx;
}
.order_center {
border-left: 1rpx solid #D9D9D9;
border-right: 1rpx solid #D9D9D9;
}
.my-order .item {
display: flex;
margin: 20rpx 0;
flex-direction: column;
justify-content: center;
align-items: center;
font-size: 26rpx;
flex: 1;
}
.my-assets .icon-box image {
width: 48rpx;
height: 48rpx;
margin-bottom: 16rpx;
}
.my-order .icon-box,
.my-assets .icon-box {
width: 60rpx;
height: 60rpx;
}
.my-order .icon-box .iconfont,
.my-assets .icon-box .iconfont {
font-size: 50rpx;
color: #333333;
}
.my-assets .icon-box .dot {
position: absolute;
top: -13rpx;
right: -8rpx;
height: 25rpx;
min-width: 25rpx;
padding: 4rpx;
border-radius: 20rpx;
font-size: 20rpx;
background: linear-gradient(180deg, #FC4133, #FF7A04);
color: #ffffff;
}
.my-assets {
margin: 0 20rpx;
padding: 30rpx;
padding-top: 0;
background: #ffffff;
border-radius: 12rpx;
}
.my-assets .item {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
}
.my-wallet {
position: relative;
width: 200rpx;
border-left: 1px solid #dddddd;
}
.my-wallet::after {
position: absolute;
display: block;
content: '';
left: 0;
border: 8rpx solid transparent;
border-left-color: #dddddd;
}
.menu-wrap {
margin: 0 20rpx;
margin-top: 30rpx;
background: #ffffff;
/* box-shadow: 0 0 6rpx 0 rgba(0, 0, 0, 0.1); */
border-radius: 12rpx;
padding-bottom: 20rpx;
}
.menu-wrap .group-bd {
// display: flex;
// justify-content: flex-start;
// align-items: flex-start;
}
.menu-wrap .item {
// display: flex;
// justify-content: center;
// align-items: center;
// flex-direction: column;
// width: 142rpx;
// height: 150rpx;
// font-size: 24rpx;
}
.menu-wrap .icon-round {
width: 56rpx;
height: 56rpx;
color: #ffffff;
}
.menu-wrap .item .iconfont {
font-size: 40rpx;
color: #ffffff;
}
.menu-wrap .item .name {
margin-top: 19rpx;
}
.bind_phone {
width: 100%;
height: 80rpx;
padding: 0 20rpx;
box-sizing: border-box;
margin-bottom: 30rpx;
}
.bind_content {
display: flex;
justify-content: space-between;
align-items: center;
background: #ffffff;
/* box-shadow: 0 0 6rpx 0 rgba(0, 0, 0, 0.1); */
border-radius: 16rpx;
height: 100%;
padding: 0 20rpx;
}
.bind_txt {}
.bind_btn {
width: 134rpx;
height: 50rpx;
line-height: 50rpx;
font-size: 22rpx;
border-radius: 25rpx;
text-align: center;
color: #FFFFFF;
background-color: $dominant-color;
}
.vertical {
position: absolute;
top: 10px;
right: 53px;
z-index: 100000;
}
.vertical_img {
width: 100rpx;
height: 100rpx;
}
.f20 {
margin-left: 5rpx;
font-size: 19rpx;
}
.red_mini {
color: #333333;
font-size: 36rpx;
font-weight: bold;
}
.icon-zhuanshutequan {
color: #f5dca6;
margin-right: 3px;
}
.news {
position: absolute;
top: 40rpx;
right: 20rpx;
z-index: 100;
}
.news .chat {
width: 40rpx;
height: 40rpx;
}
.news .icon-xiaoxi {
font-size: 50rpx;
color: #FFFFFF;
}
.news_num {
position: absolute;
top: 24rpx;
right: 44rpx;
z-index: 100;
border-radius: 50%;
width: 25rpx;
height: 25rpx;
text-align: center;
line-height: 25rpx;
color: #FFFFFF;
background-color: #ff6633;
padding: 5rpx;
font-size: 20rpx;
}
.activity_img {}
.activity_img image {
width: 710rpx;
height: 302rpx;
margin: 0 auto;
margin-top: 15rpx;
border-radius: 12rpx;
}
.my-assets-all {
display: flex;
justify-content: space-between;
align-items: center;
height: 90rpx;
line-height: 90rpx;
}
.my-assets-all .icon.icon-jiantou {
font-size: 12px;
color: #999999;
}
.line {
height: 2rpx;
background: #E5E5E5;
margin-top: 32rpx;
}
</style>