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

488 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 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>