2025-08-01 11:39:06 +08:00

451 lines
13 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<view class="xilu">
<view class="page-foot">
<Footer :identity="1" :footState="3"></Footer>
</view>
<view class="container plr25">
<view class="ptb30 flex-box">
<view class="flex-grow-1 fs30 col9">预约记录</view>
<image src="@/static/images/xilu_icon18.png" mode="aspectFill" class="ico24"></image>
<view @click.stop="cms_detail(4)" class="pl10 fs28 col2">退款须知</view>
</view>
<view class="mt30 xilu_data_link">
<image v-if="web_url" :src="web_url+'/uniapp_image/xilu_bg_booking.png'" mode="aspectFill" class="xilu_data_link_cover"></image>
<view class="xilu_data_link_view flex-box plr30 flex-between">
<view class="tc">
<view class="fs40 colf fw500 lh56">{{userInfo.train_day || 0}}</view>
<view class="mt10 col9 fs26 lh36">累计天数</view>
</view>
<view class="tc">
<view class="fs40 colf fw500 lh56">{{userInfo.train_count || 0}}</view>
<view class="mt10 col9 fs26 lh36">训练次数</view>
</view>
<view class="tc">
<view class="fs40 colf fw500 lh56">{{userInfo.train_duration || 0}}</view>
<view class="mt10 col9 fs26 lh36">训练时长</view>
</view>
</view>
</view>
<view class="ptb30">
<view class="xilu_tab_item" :class="nindex==1?'active':''" @click="chooseNav(1)">团课</view>
<view class="xilu_tab_item" :class="nindex==2?'active':''" @click="chooseNav(2)">私教</view>
<view class="xilu_tab_item" :class="nindex==3?'active':''" @click="chooseNav(3)">活动</view>
</view>
<template v-if="nindex==1">
<template v-if="list.length > 0">
<view class="xilu_tk_item" v-for="(vo,index) in list">
<view class="flex-box" @click="detail(vo.id)">
<image :src="vo.goods.course_camp.coach.xilufitness_urls.coach_avatar || vo.goods.xilufitness_urls.thumb_image" mode="aspectFill"
class="xilu_tk_item_cover">
</image>
<view class="flex-grow-1 pl20">
<view class="fs32 fw500 colf lh46 m-ellipsis">{{vo.goods.goods_name || ''}}</view>
<view class="mt15 lh32 fs24 col2">{{vo.goods.course_camp.class_time_txt || ''}}
{{vo.goods.course_camp.start_at || ''}}{{vo.goods.course_camp.end_at || ''}}
</view>
<view class="flex-box mt15" @tap.stop="openLocation(vo.shop.lat,vo.shop.lng)">
<image src="@/static/images/xilu_icon_address_gray.png" mode="aspectFill"
class="ico28">
</image>
<view class="m-ellipsis flex-grow-1 pl10 pr20 fs28 col9 lh40">
{{vo.shop.address || ''}}
</view>
<image src="@/static/images/xilu_guide.png" mode="aspectFill" class="ico30"></image>
</view>
</view>
</view>
<view class="flex-box flex-end mt30">
<view v-if="vo.show_cancel == 1 && vo.order_status == 1" @click="cancelOrder(vo.id)"
class="xilu_btn1">取消预约</view>
<view @click="detail(vo.id)" class="xilu_btn1">查看详情</view>
<view v-if="vo.order_status == 1 || vo.order_status == 2" @click="codeOpen(vo)"
class="xilu_btn2">查看签到码</view>
<view v-if="vo.order_status == 3" @click="to_comment(vo.id)" class="xilu_btn1">去评价</view>
<view class="xilu_btn3" v-if="vo.order_status == 6">课时已完成</view>
<view class="xilu_btn3" v-if="vo.order_status == 5">已过期</view>
</view>
</view>
</template>
<template v-else>
<empty-data :tips="'暂无预约记录'" :lineHeight="100"></empty-data>
</template>
</template>
<template v-if="nindex==2">
<template v-if="list.length > 0">
<view class="xilu_tk_item" v-for="(vo,index) in list">
<view class="flex-box" @click="detail(vo.id)">
<image :src="vo.goods.course_camp.coach.xilufitness_urls.coach_avatar || vo.goods.xilufitness_urls.thumb_image" mode="aspectFill"
class="xilu_tk_item_cover">
</image>
<view class="flex-grow-1 pl20">
<view class="fs32 fw500 colf lh46 m-ellipsis">{{vo.goods.goods_name || ''}}</view>
<view class="mt15 fs24 col9 lh32">已签到<text
class="col2">{{vo.code_num || 0}}</text>/{{vo.code_total_num || 0}}</view>
<view class="flex-box mt15" @tap.stop="openLocation(vo.shop.lat,vo.shop.lng)">
<image src="@/static/images/xilu_icon_address_gray.png" mode="aspectFill"
class="ico28">
</image>
<view class="m-ellipsis flex-grow-1 pl10 pr20 fs28 col9 lh40">
{{vo.shop.address || ''}}
</view>
<image src="@/static/images/xilu_guide.png" mode="aspectFill" class="ico30"></image>
</view>
</view>
</view>
<view class="flex-box flex-end mt20">
<view @click="detail(vo.id)" class="xilu_btn1">查看详情</view>
<view v-if="vo.order_status == 1 || vo.order_status == 2" @click="codeOpen(vo)"
class="xilu_btn2">查看签到码</view>
<view v-if="vo.order_status == 3" @click="to_comment(vo.id)" class="xilu_btn1">去评价</view>
<view class="xilu_btn3" v-if="vo.order_status == 6">课时已完成</view>
<view class="xilu_btn3" v-if="vo.order_status == 5">已过期</view>
</view>
</view>
</template>
<template v-else>
<empty-data :tips="'暂无预约记录'" :lineHeight="100"></empty-data>
</template>
</template>
<template v-if="nindex==3">
<template v-if="list.length > 0">
<view class="xilu_tk_item" v-for="(vo,index) in list">
<view class="flex-box" @click="detail(vo.id)">
<image :src="vo.goods.course_camp.coach.xilufitness_urls.coach_avatar || vo.goods.xilufitness_urls.thumb_image" mode="aspectFill"
class="xilu_tk_item_cover">
</image>
<view class="flex-grow-1 pl20">
<view class="fs32 fw500 colf lh46 m-ellipsis">{{vo.goods.goods_name || ''}}</view>
<view class="mt15 lh32 fs24 col2">
{{vo.goods.course_camp.start_at || ''}}{{vo.goods.course_camp.end_at || ''}}</view>
<view class="mt15 fs24 col9 lh32">已签到<text
class="col2">{{vo.code_num || 0}}</text>/{{vo.code_total_num || 0}}</view>
</view>
</view>
<view class="flex-box mt15" @tap.stop="openLocation(vo.shop.lat,vo.shop.lng)">
<image src="@/static/images/xilu_icon_address_gray.png" mode="aspectFill" class="ico28">
</image>
<view class="m-ellipsis flex-grow-1 pl10 pr20 fs28 col9 lh40">{{vo.shop.address || ''}}
</view>
<image src="@/static/images/xilu_guide.png" mode="aspectFill" class="ico30"></image>
</view>
<view class="flex-box flex-end mt20">
<view v-if="vo.show_cancel == 1 && vo.order_status == 1" @click="cancelOrder(vo.id)"
class="xilu_btn1">取消预约</view>
<view @click="detail(vo.id)" class="xilu_btn1">查看详情</view>
<view v-if="vo.order_status == 1 || vo.order_status == 2" @click="codeOpen(vo)"
class="xilu_btn2">查看签到码</view>
<view v-if="vo.order_status == 3" @click="to_comment(vo.id)" class="xilu_btn1">去评价</view>
<view class="xilu_btn3" v-if="vo.order_status == 6">课时已完成</view>
<view class="xilu_btn3" v-if="vo.order_status == 5">已过期</view>
</view>
</view>
</template>
<template v-else>
<empty-data :tips="'暂无预约记录'" :lineHeight="100"></empty-data>
</template>
</template>
</view>
<u-popup :show="showCode" mode="center" bgColor="transparent" @open="codeOpen" @close="codeClose"
:safeAreaInsetBottom="false">
<view class="xilu_code_popup pr pt40">
<view class="tc fs34 col9 lh40">已签到<text
class="col2">{{code_info.code_num || 0}}</text>/{{code_info.code_total_num || 1}}</view>
<image @click="codeClose()" src="@/static/images/xilu_close.png" mode="aspectFill" class="xilu_close">
</image>
<image :src="code_info.code_url" mode="aspectFill" class="xilu_code"></image>
<view class="tc fs34 colf lh40">出示二维码核销</view>
</view>
</u-popup>
</view>
</template>
<script>
const app = getApp();
const webConfig = require("@/util/config");
export default {
data() {
return {
nindex: 1,
auth_status: false,
code_info: null,
showCode: false,
userInfo: null,
list: [],
page: 1,
total_count: 0,
web_url:'',
}
},
methods: {
chooseNav(e) {
this.nindex = e
this.clearData();
},
//显示核销二维码
codeOpen(info) {
this.code_info = info;
this.showCode = true
},
codeClose() {
this.showCode = false
},
//打开地图
openLocation(lat, lng) {
this.$api.openLocation(lat, lng);
},
//授权取消
onAuthCancel(e) {
this.auth_status = false;
this.$api.toast('取消授权,可能会使部分服务不能用,或页面信息不完整')
},
//授权成功
onAuthConfirm(e) {
this.auth_status = false;
this.getUserInfo();
this.getLists();
},
//清空数据
clearData() {
this.page = 1;
this.list = [];
this.total_count = 0;
this.getLists();
},
//订单列表
getLists() {
let _this = this;
this.$http({
url: '/addons/xilufitness/order/getOrderList',
data: {
page: _this.page,
order_type: _this.nindex,
},
method: 'get'
}).then(res => {
if (res.code == 1 && res.data.list.length > 0) {
if (_this.page > 1) {
_this.list.push(...res.data.list)
} else {
_this.list = res.data.list || [];
}
_this.total_count = res.data.total_count;
}
}).catch(error => {
console.log('orderListError', error);
})
},
//获取用户详情
getUserInfo() {
let _this = this;
this.$http({
url: '/addons/xilufitness/user/index',
method: 'get'
}).then(res => {
if (res.code == 1) {
_this.userInfo = res.data.info;
}
}).catch(error => {
console.log('userInfoError', error);
})
},
// 订单详情
detail(id) {
this.$api.navigate('../booking_info/booking_info?id=' + id);
},
//取消预约
cancelOrder(id) {
let _this = this;
this.$api.modal('温馨提示', '确定取消么?', function(res) {
if (res.confirm) {
_this.$http({
url: '/addons/xilufitness/order/cancelOrder',
data: {
id: id
},
method: 'post'
}).then(res => {
if (res.code == 1) {
_this.clearData();
} else {
_this.$api.toast(res.msg || '取消失败');
}
}).catch(error => {
console.log('orderCancelError', error);
});
}
})
},
//退款须知
cms_detail(is_type) {
this.$api.navigate('../about_us/about_us?is_type=' + is_type);
},
//去评价
to_comment(id) {
let _this = this;
this.$api.navigate('../white_appraise/white_appraise?id=' + id,function(res){
res.eventChannel.on('reloadOrder',function(){
_this.clearData();
});
});
}
},
onLoad() {
this.web_url = webConfig.base_url || '';
let token = this.$api.getCache('token');
if (!token) {
this.auth_status = true;
} else {
this.getUserInfo();
this.getLists();
}
},
onReachBottom() {
let _this = this;
if (this.total_count > this.list.length) {
this.page = this.page + 1
this.getLists();
}
}
}
</script>
<style lang="scss" scoped>
.xilu {
&_data_link {
width: 700rpx;
height: 207rpx;
position: relative;
&_cover {
width: 700rpx;
height: 207rpx;
position: relative;
z-index: 1;
}
&_view {
width: 700rpx;
height: 207rpx;
position: absolute;
z-index: 2;
top: 0;
left: 0;
right: 0;
}
}
&_tab_item {
margin-right: 40rpx;
font-size: 34rpx;
font-weight: 500;
color: #999999;
line-height: 48rpx;
display: inline-block;
vertical-align: top;
&.active {
font-size: 34rpx;
font-weight: 500;
color: #FFFFFF;
}
}
&_tk_item {
width: 700rpx;
margin-bottom: 30rpx;
background: #292B2C;
border-radius: 20rpx;
padding: 20rpx 20rpx 30rpx;
&_cover {
width: 150rpx;
height: 150rpx;
border-radius: 20rpx;
}
}
&_btn1 {
width: 206rpx;
height: 70rpx;
line-height: calc(70rpx - 2px);
text-align: center;
font-size: 28rpx;
font-weight: 400;
color: #FFFFFF;
border-radius: 20rpx;
border: 1px solid #999999;
}
&_btn1+&_btn1 {
margin-left: 20rpx;
}
&_btn2 {
width: 206rpx;
height: 70rpx;
line-height: 70rpx;
text-align: center;
font-size: 28rpx;
font-weight: 400;
color: #0E0E0F;
background: #FFCF00;
border-radius: 20rpx;
margin-left: 20rpx;
}
&_btn1+&_btn3 {
margin-left: 20rpx;
}
&_btn3 {
width: 206rpx;
height: 70rpx;
line-height: 70rpx;
text-align: center;
font-size: 28rpx;
font-weight: 400;
color: #0E0E0F;
background: #999999;
border-radius: 20rpx;
}
&_code_popup {
width: 600rpx;
background: #404243;
border-radius: 20rpx;
border: 1px solid #454545;
padding: 40rpx 0 50rpx;
}
&_close {
width: 30rpx;
height: 30rpx;
position: absolute;
top: 45rpx;
right: 47rpx;
}
&_code {
width: 405rpx;
height: 400rpx;
display: block;
margin: 40rpx auto;
}
}
</style>