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.

488 lines
13 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"
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}" @click="handleDate(index)">
<view class="book-box-row-dateitem-status">
<u-icon name="checkmark" color="#fff" size="20rpx" v-if="item.checked">
</u-icon>
<text v-else>{{item.is_open==1?'余票':"售罄"}}</text>
</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}" :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>
<view class="book-box-row-timeitem-txt">{{item.total}}张</view>
</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: 14rpx;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;">
<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
}
},
onLoad() {
this.loadInfo();
this.loadNotice();
},
onReady() {
// 如果需要兼容微信小程序的话,需要用此写法
this.$refs.calendar.setFormatter(this.formatter)
},
methods: {
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) {
console.log(e)
if (e.length != 0 && (e[0] != this.currentDate.date)) {
this.load3Day(e[0]);
this.showCalendar = false;
}
},
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)
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 (nt == cdate.date) {
this.util.toast("请提前一天预约");
return;
}
for (var m of list) {
m.checked = false;
}
cdate.checked = true;
let i = 0;
for (var m of cdate.rules) {
m.checked = false;
m.checked = i == 0
if (m.checked) {
this.currentTime = m;
}
i++;
}
this.currentDate = cdate;
this.listDatePrice = list;
this.$forceUpdate();
},
handleSelectTime(index) {
for (var m of this.currentDate.rules) {
m.checked = false;
}
this.currentDate.rules[index].checked = true;
this.currentTime = this.currentDate.rules[index];
this.$forceUpdate();
},
openActivity() {
uni.navigateTo({
url: "../activity/index"
})
},
openPark() {
uni.navigateTo({
url: "/pages/park/index"
})
},
openInfo(e) {
this.currentNotice = this.listNotice[e];
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;
var sdate = that.$moment().format("yyyy-MM-DD");
that.showBook = true;
that.load3Day(sdate)
},
closeBook() {
this.showBook = false;
},
tobook(type) {
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) { //加载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', 1).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;
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) {
m.checked = true;
that.currentDate = m;
that.currentIndex = i;
let idx = 0;
for (var mod of m.rules) {
mod.checked = false;
mod.checked = idx == 0;
if (mod.checked) {
that.currentTime = mod;
}
idx++;
}
}
i++;
}
})
},
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");
.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: -20rpx;
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: 82rpx 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;
}
</style>