488 lines
13 KiB
Vue
Raw Normal View History

2025-08-01 11:39:06 +08:00
<template>
<view class="xilu">
<!-- <view class="page-foot bg-normal">
<view class="p30">
<view class="xilu_foot_btn1">查看签到码</view>
<view class="xilu_foot_btn2">已签到</view>
</view>
</view> -->
<view class="container">
<view class="pr">
<swiper class="xilu_swiper_info" @change="swiperTab" :current="current" :circular="true"
:autoplay="true" :interval="3000" :duration="1000">
<swiper-item v-for="(vo,index) in thumb_images">
<image :src="vo" mode="aspectFill"></image>
</swiper-item>
</swiper>
<view class="xilu_swiper_dot">{{ current + 1 }}/{{ thumb_images.length }}</view>
<image v-if="web_url" :src="web_url+'/uniapp_image/xilu_mask.png'" mode="aspectFill" class="xilu_mask"></image>
</view>
<view class="pr mt_132 z5 plr25 pb40">
<view class="flex-box">
<view class="col2 fs36 fw500 lh50 flex-grow-1">{{info.camp.title || ''}}</view>
<view @click="user_invite()">
<image src="@/static/images/xilu_icon9.png" mode="aspectFill" class="ico24"></image>
<text class="ml10 fs28 colf">分享有礼</text>
</view>
</view>
<view class="mt15 fs30 colf lh42" v-if="info && info.camp.lable_list.length > 0">
{{info.camp.lable_list.join(' | ')}}</view>
<view class="xilu_box" style="margin-top: 24rpx;padding-top: 20rpx;">
<view class="bb pb20 fs30 colf lh42" v-if="info">
最近开营{{info.start_at || 0}}{{info.current_camp_list.length || 0}}个活动报名中</view>
<view class="pt20 fs30 col9 lh42" v-if="info.camp.description">{{info.camp.description || ''}}
</view>
</view>
<view class="pr z2 mt30" v-if="info.shop" @tap="openLocation(info.shop.lat,info.shop.lng)">
<image v-if="web_url" :src="web_url + '/uniapp_image/xilu_bg_info.png'" mode="aspectFill" class="xilu_bg_info"></image>
<view class="xilu_bg_view flex-box plr30">
<image src="@/static/images/xilu_icon_address_gray.png" mode="aspectFill" class="ico28 mb40">
</image>
<view class="flex-grow-1">
<view class="w460 m-ellipsis-l2 mlr10 fs28 colf lh40">{{info.shop.address || ''}}</view>
</view>
<view class="tc">
<image src="@/static/images/xilu_guide.png" mode="aspectFill" class="ico30"></image>
<view class="fs24 col9 lh32 mt10">导航</view>
</view>
</view>
</view>
<view class="fs36 fw500 colf lh50 mt30">营期</view>
<view class="xilu_info_item flex-box" v-for="(vo,keys) in info.current_camp_list" @tap="chooseCamp(vo)">
<image :src="vo.camp.xilufitness_urls.thumb_image" mode="aspectFill" class="xilu_info_item_cover">
</image>
<view class="flex-grow-1 pl10">
<view class="fs30 col2 fw500 lh42">{{vo.start_at || ''}}-{{vo.end_at || ''}}</view>
<view class="flex flex-align-end">
<view class="flex-grow-1 m-ellipsis fs24 colf lh34">
<template v-for="(vv,key) in vo.plans">
{{vv.week || ''}} {{vv.day_start_at || ''}}{{vv.day_end_at || ''}}
</template>
</view>
<view v-if="vo.user_signed == 0" class="xilu_btn">报名</view>
<view v-else class="xilu_btn" style="background-color: #ccc;">已报名</view>
</view>
<view class="fs24 colf lh34 mt15 m-ellipsis">
<text>¥{{info.camp_price || 0}}</text>
<text class="col9 tdl fs20 ml5" v-if="info.market_price > 0">¥{{info.market_price || 0}}</text>
<text class="xilu_textsq">{{info.class_count || 0}}课时</text>
<text class="xilu_textsq">{{info.class_duration || 0}}分钟/课时</text>
</view>
</view>
</view>
<view class="xilu_box" style="padding-left: 28rpx;padding-right: 28rpx;" v-if="sign_list.list && sign_list.list.length > 0">
<view class="colf fs36 fw500 lh50">本期报名{{sign_list.user_count || 0}}</view>
<view style="font-size: 0;">
<image :src="vo.user.xilufitness_urls.avatar || '../../static/images/avatar.png' " mode="aspectFill" class="xilu_mini_head"
v-for="(vo,index) in sign_list.list"></image>
</view>
</view>
<view class="xilu_box" v-if="info.camp.content">
<view class="pb30 mb30 fs36 fw500 colf lh50 bb">活动详情</view>
<mp-html class="colf" :content="info.camp.content"></mp-html>
</view>
<view class="xilu_box" v-if="info.camp.tip_content">
<view class="pb30 mb30 fs36 fw500 colf lh50 bb">注意事项</view>
<mp-html class="colf" :content="info.camp.tip_content"></mp-html>
</view>
<u-authorize @onAuthCancel="onAuthCancel($event)" @onAuthConfirm="onAuthConfirm($event)"
:popupStatus="auth_status" :isAuth="2"></u-authorize>
</view>
<u-popup :show="show" mode="bottom" @close="close" @open="open">
<view class="xilu_popup pr pt30">
<view class="tc fs34 colf pb30">{{camp_info.camp.title || ''}}</view>
<image src="@/static/images/xilu_close.png" mode="aspectFill" class="xilu_popup_close"
@tap="close()"></image>
<scroll-view scroll-y="true" class="xilu_popup_scroll plr25">
<view class="xilu_popup_box">
<view class="flex-box mb40">
<image src="@/static/images/xilu_icon10.png" mode="aspectFill" class="ico28"></image>
<view class="flex-grow-1 pl10 fs28 colf">教练{{camp_info.coach.coach_name || ''}}</view>
</view>
<view class="flex mb40">
<image src="@/static/images/xilu_icon15.png" mode="aspectFill" class="ico28 mt6">
</image>
<view class="flex-grow-1 pl10 fs28 colf">日期{{camp_info.start_at || ''}}-{{camp_info.end_at || ''}}
</view>
</view>
<view class="flex mb40">
<image src="@/static/images/xilu_icon16.png" mode="aspectFill" class="ico28 mt6">
</image>
<view class="flex-grow-1 pl10 fs28 colf">时长{{camp_info.class_duration || 0}}分钟/课时</view>
</view>
<view class="flex mb40">
<image src="@/static/images/xilu_icon12.png" mode="aspectFill" class="ico28 mt6">
</image>
<view class="flex-grow-1 pl10 fs28 colf">地址{{camp_info.shop.address || ''}}</view>
</view>
<view class="flex">
<image src="@/static/images/xilu_icon17.png" mode="aspectFill" class="ico28 mt6">
</image>
<view class="flex-grow-1 pl10 fs28 colf">
人数{{camp_info.camp_count || 0}}人开营{{camp_info.total_count || 0}}人满员</view>
</view>
</view>
<view class="xilu_popup_box" style="padding: 30rpx;">
<view class="fs36 fw500 colf lh50">训练计划</view>
<view class="xilu_popup_box_label" v-for="(vo,keys) in camp_info.plans">{{vo.week}}
{{vo.day_start_at || ''}}{{vo.day_end_at || ''}}</view>
</view>
<view class="xilu_popup_box" style="padding: 30rpx;" v-if="camp_info.description">
<view class="fs32 fw500 colf lh46">其他说明</view>
<view class="pt60 fs28 col9 lh40">{{camp_info.description || ''}}</view>
</view>
</scroll-view>
<view class="plr25 ptb30">
<view v-if="camp_info.user_signed == 0" @click.stop="campSign(camp_info)" class="btn1">报名</view>
<view v-else class="btn1" style="background-color: #ccc;">已报名</view>
</view>
</view>
</u-popup>
</view>
<u-popup :show="showAttendance" mode="center" bgColor="transparent" @open="attendanceOpen"
@close="attendanceClose" :safeAreaInsetBottom="false">
<view class="xilu_code_popup pr pt40">
<view class="tc fs34 col9 lh40">已签到<text class="col2">2</text>/10</view>
<image src="@/static/images/xilu_close.png" mode="aspectFill" class="xilu_close"
@click="attendanceClose"></image>
<image src="@/static/logo.png" 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 {
current: 0,
thumb_images: [],
show: false,
showAttendance: false,
auth_status: false,
info: null,
camp_info: null,
sign_list:[],
web_url:''
}
},
methods: {
swiperTab(e) {
this.current = Number(e.target.current)
console.log(this.current);
},
open() {
this.show = true
},
close() {
this.show = false
},
attendanceOpen() {
this.showAttendance = true
},
attendanceClose() {
this.showAttendance = false
},
//选择活动
chooseCamp(info) {
this.show = true;
this.camp_info = info || null;
},
// 获取活动详情
getDetail(id) {
let _this = this;
this.$http({
url: 'addons/xilufitness/course/getCampDetail',
data: {
id: id
},
method: 'get'
}).then(res => {
if (res.code == 1) {
_this.info = res.data.info;
_this.thumb_images = res.data.info.camp.xilufitness_urls.thumb_images || [];
_this.sign_list = res.data.userList || [];
}
}).catch(error => {
console.log('campdetailError', error);
})
},
//打开地图
openLocation(lat, lng) {
this.$api.openLocation(lat, lng);
},
//活动报名
campSign(camp_info) {
let _this = this;
let token = this.$api.getCache('token');
if (!token) {
this.show = false;
this.auth_status = true;
} else {
this.$api.navigate('../pay_order/pay_order?id=' + camp_info.id + '&is_type=3');
}
},
//授权取消
onAuthCancel(e) {
this.auth_status = false;
this.$api.toast('取消授权,可能会使部分服务不能用,或页面信息不完整')
},
//授权成功
onAuthConfirm(e) {
this.auth_status = false;
this.campSign(this.camp_info);
},
//邀请有礼
user_invite() {
let token = this.$api.getCache('token');
if (!token) {
this.auth_status = true;
} else {
this.$api.navigate('../invite/invite')
}
}
},
onLoad(options) {
this.web_url = webConfig.base_url || '';
this.getDetail(options.id || 0);
},
onShareAppMessage() {
}
}
</script>
<style lang="scss" scoped>
.xilu {
&_swiper_info {
width: 100%;
height: 750rpx;
position: relative;
image {
width: 100%;
height: 100%;
display: block;
}
}
&_mask {
width: 100%;
height: 380rpx;
position: absolute;
bottom: 0;
z-index: 3;
left: 0;
}
&_swiper_dot {
display: inline-block;
height: 39rpx;
line-height: 39rpx;
background: rgba(0, 0, 0, 0.25);
border-radius: 20rpx;
position: absolute;
font-size: 24rpx;
font-weight: 400;
color: #FFFFFF;
right: 25rpx;
bottom: 194rpx;
padding-left: 15rpx;
padding-right: 15rpx;
z-index: 4;
}
&_box {
background: #292B2C;
border-radius: 20rpx;
width: 100%;
margin-top: 30rpx;
padding: 30rpx;
}
&_bg_info {
width: 700rpx;
height: 140rpx;
position: relative;
z-index: 1;
}
&_bg_view {
width: 700rpx;
height: 140rpx;
position: absolute;
z-index: 2;
top: 0;
left: 0;
}
&_info_item {
width: 700rpx;
padding: 20rpx;
background: #404243;
border-radius: 20rpx;
margin-top: 30rpx;
&_cover {
width: 150rpx;
height: 150rpx;
border-radius: 20rpx;
display: block;
}
}
&_btn {
width: 118rpx;
height: 57rpx;
line-height: 57rpx;
text-align: center;
font-size: 28rpx;
font-weight: 400;
color: #0E0E0F;
background: #FFCF00;
border-radius: 10rpx;
}
&_textsq::before {
content: '|';
display: inline-block;
vertical-align: middle;
font-size: 24rpx;
color: #999999;
margin: 0 5rpx;
}
&_mini_head {
width: 90rpx;
height: 90rpx;
border: 2rpx solid #FFFFFF;
position: relative;
margin-top: 30rpx;
margin-left: -12rpx;
display: inline-block;
vertical-align: top;
border-radius: 50%;
&:first-child,
&:nth-of-type(9n) {
margin-left: 0;
}
}
&_popup {
width: 100%;
background: #292B2C;
&_scroll {
max-height: 60vh;
width: 100%;
}
&_close {
width: 30rpx;
height: 30rpx;
top: 39rpx;
right: 25rpx;
position: absolute;
}
&_box+&_box {
margin-top: 30rpx;
}
&_box {
background: #404243;
border-radius: 20rpx;
padding: 30rpx 8rpx 30rpx 30rpx;
}
&_box_label {
font-size: 28rpx;
font-weight: 400;
color: #FFFFFF;
line-height: 40rpx;
margin-top: 30rpx;
&:before {
width: 10rpx;
height: 10rpx;
background: #999999;
content: '';
display: inline-block;
vertical-align: middle;
border-radius: 50%;
margin-right: 20rpx;
}
}
&_box_label:first-child {
margin-top: 20rpx;
}
}
&_foot_btn1 {
width: 690rpx;
height: 90rpx;
line-height: 90rpx;
text-align: center;
font-size: 30rpx;
font-weight: 400;
color: #0E0E0F;
background: #FFCF00;
border-radius: 20rpx;
}
&_foot_btn2 {
width: 690rpx;
height: 90rpx;
line-height: 90rpx;
text-align: center;
font-size: 30rpx;
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;
}
}
.mt_132 {
margin-top: -132rpx;
}
</style>