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.

620 lines
16 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<view class="content">
<view class="box-top">
<image src="../../static/img/index_bg.jpg" class="index_bg"></image>
</view>
<view class="box-notice">
<u-notice-bar @click="openInfo" :text="list" direction="column" color="#9E8F8B"></u-notice-bar>
</view>
<view class="box-body">
<view class="box-body-title">
<image src="../../static/img/index_name.png" class="box-body-title-img"></image>
<view class="box-body-sub-title">开馆时间{{info.sub_title||""}}</view>
</view>
<view style="margin-top: 56rpx;">
<view class="box-row">
<view class="box-col" @click="handleBook(1)">
<image src="../../static/img/index_icon_1.png" class="box-body-icon"></image>
</view>
<view class="box-col" @click="handleBook(2)">
<image src="../../static/img/index_icon_2.png" class="box-body-icon"></image>
</view>
<view class="box-col" @click="handleBook(3)">
<image src="../../static/img/index_icon_3.png" class="box-body-icon"></image>
</view>
</u-row>
</view>
</view>
</view>
<view class="box-footer-banner" @click="togame" style="height: 210rpx; width: 100%;">
<div style="padding: 0rpx 37rpx;
box-sizing: border-box;width: 100%;height: 100%;">
<image src="../../static/img/gamebutton.png" style="width: 100%;height: 100%;" />
</div>
</view>
<view class="box-footer"
style="position: fixed;bottom: -60rpx;left: 0;text-align: center;width: 100%;z-index: -1;">
<image src="../../static/img/footer_logo.png" class="footer-img"></image>
</view>
<u-popup :show="showBook" mode="bottom" @close="closeBook" :round="10" closeable>
<view class="mpopup">
<view class="mpopup-title">
服务预约
</view>
<view class="mpopup-content">
<view class="book-box">
<view class="book-box-card">
<view class="book-box-title">
日期
</view>
<view class="book-box-row">
<view class="book-box-row-date">
<block v-for="(item,index) in listDatePrice" :key="index">
<view class="book-box-row-dateitem" :class="{'book-box-row-dateitem-on':item.checked,
'book-box-row-dateitem-none':item.is_open==0,
'book-box-row-dateitem-none':item.remain_count==0}" @click="handleDate(index)">
<view class="book-box-row-dateitem-status">
<u-icon name="checkmark" color="#fff" size="20rpx" v-if="item.checked">
</u-icon>
<view v-else>
<text
v-if="item.is_open==1">{{item.remain_count==0?"不可预约":"可预约"}}</text>
<text v-else>闭馆</text>
</view>
</view>
<view>{{item.week}}</view>
<view>{{item.datef}}</view>
</view>
</block>
</view>
<view class="book-box-row-select" @click="openCalendar">
<view>
<view>指定</view>
<view>日期</view>
</view>
<view class="book-box-row-select-more">
<u-icon name="arrow-right" color="#EF9525" size="20rpx"></u-icon>
</view>
</view>
</view>
</view>
<view class="book-box-card">
<view class="book-box-title">
进馆时间
</view>
<view class="book-box-timerow">
<view class="book-box-row-timeitem" v-for="(item,index) in currentDate.rules"
:class="{'book-box-row-timeitem-on':item.checked,'timeitem-none':item.remain_count==0,'timeitem-none':item.isCanbook==false}"
:key="index" @click="handleSelectTime(index)">
<view class="book-box-row-timeitem-status" v-if="item.checked">
<u-icon name="checkmark" color="#fff" size="20rpx"></u-icon>
</view>
<view class="book-box-row-timeitem-txt">{{item.start_time+'-'+item.end_time}}</view>
<block v-if="item.isCanbook">
<view class="book-box-row-timeitem-txt"
v-if="item.remain_count>0&&item.remain_count<=50">
{{item.remain_count}}张
</view>
<!-- <view class="book-box-row-timeitem-txt" v-else-if="item.remain_count>50">
余票充足
</view> -->
<view class="book-box-row-timeitem-txt" v-if="item.remain_count<=0">已约满</view>
</block>
<block v-else>
<view class="book-box-row-timeitem-txt">不可预约</view>
</block>
</view>
</view>
</view>
</view>
</view>
<view class="book-box-selectInfo">
<view class="book-box-selectInfo-left">已选:{{currentDate.datef||""}}
{{(currentTime.start_time||"")+"-"+(currentTime.end_time||"")}}
</view>
<view class="book-box-selectInfo-right">
</view>
</view>
<view class="mpopup-footer">
<view style="margin-right: 0rpx;flex: 1;">
<u-button type="primary" @click="tobook('team')">团体服务预约</u-button>
</view>
<!-- <view style="margin-left: 14rpx;flex: 1;">
<u-button type="primary" @click="tobook('user')">个人预约</u-button>
</view> -->
</view>
</view>
</u-popup>
<u-calendar ref="calendar" :show-confirm="false" :show="showCalendar" :minDate="minDate" :maxDate="maxDate"
color="#EF9525" round="20" defaultDate="2022-02-15" @confirm="handleSelectDate" @close="closecalendar">
</u-calendar>
<u-popup :show="showInfo" mode="center" @close="closeInfo" :round="10" closeable>
<view class="mpopup">
<view class="mpopup-title">
{{currentNotice.name}}
</view>
<view class="mpopup-content" style="padding: 40rpx 20rpx;">
<view v-html="currentNotice.content" style="font-size:32rpx;line-height: 50rpx;text-indent: 2em;">
</view>
<!-- <rich-text :nodes="currentNotice.content"></rich-text> -->
</view>
</view>
</u-popup>
<u-popup :show="showAuthorization" closeable mode="bottom" @close="closePhone" :round="10">
<view class="box">
<view class="box-title" style="text-align: center;padding: 20rpx 0;font-size: 32rpx;">
请授权您的手机号
</view>
<view class="box-content" style="padding: 20px;">
<u-button type="primary" open-type="getPhoneNumber" @getphonenumber="getPhoneNumber">
</u-button>
</view>
</view>
</u-popup>
</view>
</template>
<script>
export default {
data() {
const d = new Date()
const year = d.getFullYear()
let month = d.getMonth() + 1
month = month < 10 ? `0${month}` : month
const date = d.getDate()
return {
showInfo: false,
showBook: false,
minDate: `${year}-${month}-${date + 1}`,
maxDate: `${year}-${month}-${date + 7}`,
showCalendar: false,
list: ["暂无通知通告"],
info: {},
listDatePrice: [],
currentDate: {},
currentTime: {},
currentIndex: 0,
listCalendar: [],
listNotice: [],
currentNotice: {},
showAuthorization: false,
openType: 1
}
},
onShareAppMessage() {
return this.util.shareInfo
},
onLoad() {
this.loadInfo();
this.loadNotice();
},
onReady() {
// 如果需要兼容微信小程序的话,需要用此写法
this.$refs.calendar.setFormatter(this.formatter)
},
onHide() {
this.showBook = false;
},
methods: {
togame() {
uni.navigateToMiniProgram({
appId: 'wx3aafff78f8750c1d',
success(res) {
// 打开成功
}
})
},
closePhone() {
this.showAuthorization = false
},
getPhoneNumber(e) {
var that = this;
this.util.request({
api: '/api/mobile/user/mobile',
data: {
code: e.detail.code
},
utilSuccess: function(res) {
that.util.getUserInfo(function(r) {
that.checkUser();
}, true)
},
utilFail: function(res) {
}
})
},
closecalendar() {
this.showCalendar = false;
},
handleSelectDate(e) {
let that = this;
if (e.length != 0) {
var date = e[0]
var mod = this.listCalendar.filter((p) => {
return p.is_open == 1 && p.remain_count != 0 && p.date == date;
})
if (mod.length != 0) {
this.load3Day(date, function(isCanbook) {
if (isCanbook) {
that.showCalendar = false;
} else {
that.util.toast("您选择的日期不可预约")
}
});
} else {
that.util.toast("您选择的日期不可预约")
}
}
},
openCalendar() {
var that = this;
var edate = this.$moment().add('days', 7).format("yyyy-MM-DD");
var ndate = this.$moment().add('days', 1).format("yyyy-MM-DD")
this.loadCalendar(ndate, edate, function(res) {
that.listCalendar = res;
that.showCalendar = true;
});
},
formatter(day) {
for (var m of this.listCalendar) {
let date = this.$moment(day.date).format("yyyy-MM-DD");
if (date == m.date) {
if (m.is_open == 1)
if (m.remain_count == 0) {
day.bottomInfo = '不可预约'
} else {
day.bottomInfo = '可预约'
}
else {
day.bottomInfo = '闭馆'
}
}
}
return day
},
handleDate(index) {
var nt = this.$moment().format("yyyy-MM-DD");
let list = this.listDatePrice;
let cdate = list[index];
if (cdate.is_open === 0) {
uni.showToast({
icon: "none",
title: "该日期已经闭馆"
})
return;
}
if (cdate.remain_count === 0) {
uni.showToast({
icon: "none",
title: "该日期已不可预约"
})
return;
}
for (var m of list) {
m.checked = false;
}
cdate.checked = true;
this.currentDate = cdate;
this.loadDefaultTime(cdate.rules);
this.listDatePrice = list;
this.$forceUpdate();
},
handleSelectTime(index) {
var mod = this.currentDate.rules[index];
if (!mod.isCanbook) {
return false
}
if (mod.remain_count == 0) {
this.util.toast("该时段已约满了");
return false
}
for (var m of this.currentDate.rules) {
m.checked = false;
}
mod.checked = true;
this.currentTime = mod;
this.$forceUpdate();
},
openActivity() {
uni.navigateTo({
url: "../activity/index"
})
},
openPark() {
uni.navigateTo({
url: "/pages/park/index"
})
},
openInfo(e) {
this.currentNotice = this.listNotice[e];
this.currentNotice.content = this.currentNotice.content.replace(/\<p/gi, "<p class='richp'");
this.showInfo = true;
},
closeInfo() {
this.showInfo = false;
},
loadUser(cb) {
var that = this;
this.util.getOpenidInfo(function(res) {
that.util.getUserInfo(function(r) {
cb(r);
}, true)
}, true);
},
handleBook(type) {
this.openType = type;
uni.$u.throttle(this.checkUser, 1500)
},
checkUser() {
let type = this.openType;
var that = this;
that.loadUser(function(res) {
if (that.util.isNull(res.mobile)) {
that.showAuthorization = true;
} else {
that.showAuthorization = false;
if (type == 1) that.openBook();
else if (type == 2) that.openActivity()
else if (type == 3) that.openPark()
}
})
},
openBook() {
var that = this;
this.currentTime = this.currentDate = {};
var sdate = that.$moment().format("yyyy-MM-DD");
that.showBook = true;
that.load3Day(sdate)
},
closeBook() {
this.showBook = false;
},
tobook(type) {
if (this.util.isNull(this.currentDate.date)) {
this.util.toast("请选择预约的日期");
return false;
}
if (this.util.isNull(this.currentTime.id)) {
this.util.toast("请选择预约的时段");
return false;
}
uni.navigateTo({
url: "/pages/visit/book?from=" + type + "&currentDate=" + JSON.stringify(this.currentDate) +
"&currentTime=" + JSON.stringify(this.currentTime)
})
},
loadInfo() {
var that = this;
this.util.request({
api: '/api/mobile/visit/introduce',
utilSuccess: function(res) {
console.log(res);
that.info = res;
},
utilFail: function(res) {
}
})
},
loadNotice() {
var that = this;
this.util.request({
api: '/api/mobile/other/notice-index',
utilSuccess: function(res) {
let arr = [];
for (var m of res.data) {
arr.push(m.name)
}
that.listNotice = res.data;
that.list = arr;
},
utilFail: function(res) {
}
})
},
load3Day(sdate, callbak) { //加载7天数据
var that = this;
that.listDatePrice = [];
var edate = this.$moment(sdate).add('days', 2).format("yyyy-MM-DD");
var ndate = this.$moment(sdate).add('days', 0).format("yyyy-MM-DD")
var nt = this.$moment().format("yyyy-MM-DD");
var mt = this.$moment().add('days', 1).format("yyyy-MM-DD");
var ht = this.$moment().add('days', 2).format("yyyy-MM-DD");
var selectDate = (nt == sdate) ? ndate : sdate;
this.loadCalendar(sdate, edate, function(res) {
that.listDatePrice = res;
var i = 0;
let isOpenDate = false;
for (var m of that.listDatePrice) {
m.checked = false;
m.datef = that.$moment(m.date).format("MM月DD日");
var week = that.$moment(m.date).format("dddd");
if (m.date == nt)
m.week = "今天";
else if (m.date == mt) {
m.week = "明天";
} else if (m.date == ht) {
m.week = "后天";
} else {
m.week = week;
}
if (m.date == selectDate) {
if (m.is_open == 1 && m.remain_count > 0) {
m.checked = true;
that.currentDate = m;
that.currentIndex = i;
that.loadDefaultTime(m.rules);
isOpenDate = true;
} else {
isOpenDate = false;
/* uni.showToast({
icon: "none",
title: selectDate + "不可以预约",
complete() {
setTimeout(function() {
that.load3Day(that.$moment(selectDate).add('days', 1)
.format("yyyy-MM-DD"))
}, 2000)
}
}, 2000) */
}
}
i++;
}
if (callbak)
callbak(isOpenDate);
})
},
loadDefaultTime(rules) {
var that = this;
var nt = new Date();
that.currentTime = {};
let isDefault = false;
for (var mod of rules) {
mod.checked = false;
mod.endtime = that.currentDate.date + " " + mod.end_time;
var isCanbook = that.$moment(nt).isBefore(mod.endtime);
mod.isCanbook = isCanbook;
if (!isDefault && mod.remain_count > 0 && isCanbook) {
isDefault = true;
mod.checked = true;
that.currentTime = mod;
}
}
},
loadCalendar(sdate, edate, cb) {
var that = this;
this.util.request({
api: '/api/mobile/visit/get-calendar',
data: {
start_date: sdate,
end_date: edate
},
utilSuccess: function(res) {
cb(res);
},
utilFail: function(res) {
}
})
}
}
}
</script>
<style>
@import url("@/static/css/bookbox.css");
.timeitem-none {
color: #ccc;
}
.content {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
.box-row {
display: flex;
justify-content: space-around;
padding: 0rpx 37rpx;
}
.box-top {
width: 100%;
}
.index_bg {
width: 100%;
height: 613rpx;
}
.box-notice {
width: 100%;
background-color: #F9F7F3;
height: 63rpx;
margin-top: -30rpx;
border-top-left-radius: 15rpx !important;
border-top-right-radius: 15rpx !important;
}
.u-notice-bar {
border-top-left-radius: 15rpx !important;
border-top-right-radius: 15rpx !important;
}
.box-body {
width: 100%;
padding: 52rpx 0;
}
.box-body-title {
padding: 0rpx 37rpx;
}
.box-body-title-img {
height: 36rpx;
width: 329rpx;
}
.box-body-sub-title {
font-size: 24rpx;
font-family: PingFang SC;
font-weight: 400;
color: #8A8A8A;
margin-top: 20rpx;
}
.box-body-icon {
width: 217rpx;
height: 230rpx;
}
.footer-img {
width: 421rpx;
height: 364rpx;
}
.richp {
margin-bottom: 10rpx;
}
.book-box-row-timeitem {
display: flex;
align-items: center;
flex-wrap: wrap;
width: 32%;
padding: 19rpx 21rpx!important;
}
.book-box-row-timeitem-txt {
width:100%
}
</style>