Commit 327fb627 authored by youjie's avatar youjie

no message

parent cbe2dfab
<template>
<div
class="u-mask"
:style="[maskStyle]"
:class="[show ? 'u-mask-show' : '']"
@click="click"
@touchmove.stop.prevent
>
<slot />
</div>
</template>
<script>
/**
* mask 遮罩
* @description 创建一个遮罩层,用于强调特定的页面元素,并阻止用户对遮罩下层的内容进行操作,一般用于弹窗场景
* @tutorial https://www.uviewui.com/components/mask.html
* @property {Boolean} show 是否显示遮罩(默认false)
* @property {String Number} z-index z-index 层级(默认1070)
* @property {Object} custom-style 自定义样式对象,见上方说明
* @property {String Number} duration 动画时长,单位毫秒(默认300)
* @property {Boolean} zoom 是否使用scale对这招进行缩放(默认true)
* @property {Boolean} mask-click-able 遮罩是否可点击,为false时点击不会发送click事件(默认true)
* @event {Function} click mask-click-able为true时,点击遮罩发送此事件
* @example <u-mask :show="show" @click="show = false"></u-mask>
*/
export default {
name: "u-mask",
props: {
// 是否显示遮罩
show: {
type: Boolean,
default: false
},
// 层级z-index
zIndex: {
type: [Number, String],
default: 98
},
// 用户自定义样式
customStyle: {
type: Object,
default() {
return {};
}
},
// 遮罩的动画样式, 是否使用使用zoom进行scale进行缩放
zoom: {
type: Boolean,
default: true
},
// 遮罩的过渡时间,单位为ms
duration: {
type: [Number, String],
default: 300
},
// 是否可以通过点击遮罩进行关闭
maskClickAble: {
type: Boolean,
default: true
}
},
computed: {
maskStyle() {
let style = {};
style.backgroundColor = "rgba(0, 0, 0, 0.6)";
style.zIndex = this.zIndex ? this.zIndex : this.$u.zIndex.mask;
style.transition = `all ${this.duration / 1000}s ease-in-out`;
// 缩放
if (this.zoom == true) style.transform = "scale(1.2, 1.2)";
// 判断用户传递的对象是否为空
if (Object.keys(this.customStyle).length)
style = { ...style, ...this.customStyle };
// 合并自定义的样式
//Object.assign(style, customStyle);
return style;
}
},
methods: {
click() {
if (!this.maskClickAble) return;
this.$emit("click");
}
}
};
</script>
<style lang="scss" scoped>
.u-mask {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
opacity: 0;
visibility: hidden;
}
.u-mask-show {
opacity: 1;
visibility: visible;
transform: scale(1);
}
</style>
This diff is collapsed.
......@@ -129,7 +129,7 @@
if(h && h.length>0){
let g = groupBy(h,(x)=>{return x.star})
g.forEach(x=>{
data.hotel+=`${x.data.length}晚${data.stars[parseInt(x.key)-1]};`
data.hotel+=`${x.data.length}晚${data.stars[parseInt(x.key)-1]?data.stars[parseInt(x.key)-1]:''};`
})
}
}
......
<style>
.Style_main_Top {
height: 460px;
overflow: hidden;
}
.Style_main_Top .detOne_top {
display: inline-block;
width: calc(100% + 20px);
height: 100%;
margin-left: -10px;
background-size: cover;
background-position: center center;
background-repeat: no-repeat;
z-index: 0;
filter: blur(5px);
}
.Style_main_Top .detOneModel {
position: absolute;
left: 0;
top: 0;
display: inline-block;
z-index: 2;
width: 50%;
height: 450px;
float: left;
text-align: center;
}
.detOneModel label {
position: relative;
display: inline-block;
width: 400px;
height: 100%;
background-color: rgba(255, 255, 255, .55);
padding: 60px 40px 40px;
text-align: left;
}
.detOneModel>* {
display: inline-block;
letter-spacing: 2px;
}
.Style_main_Top .main-title {
font-size: 55px;
font-weight: bold;
color: #000;
/* -webkit-writing-mode: vertical-lr;
writing-mode: vertical-lr; */
height: 100%;
width:82px;
display:inline-block;
word-wrap: break-word;
line-height: 55px;
}
.Style_main_Top .sub-title {
font-size: 24px;
font-weight: lighter;
/* padding-top: 74px; */
/* -webkit-writing-mode: vertical-lr;
writing-mode: vertical-lr; */
height: 100%;
display: inline-block;
width:36px;
word-wrap: break-word;
position: absolute;
top:85px;
}
@media only screen and (max-width: 768px) {
.Style_main_Top .detOneModel {
width: 100%;
height: 280px;
top:80px;
}
.Style_main_Top .main-title{
font-size:30px;
width:36px;
line-height: 30px;
position:absolute;
top:40px;
}
.Style_main_Top .sub-title{
font-size:15px;
width:22px;
position: absolute;
top: 65px;
left: 80px;
}
.detOneModel label {
width: 100%;
padding-top: 50px;
}
}
</style>
<template>
<div class="Style_main_Top">
<div class="detOne_top" v-if="imgCover.length>0"
:style="{backgroundImage:'url('+imgCover[0].Url+')'}">
</div>
<div class="detOneModel">
<label>
<span class="main-title">{{dataList.countryName}}</span>
<span class="sub-title">{{dataList.placeName}}</span>
</label>
</div>
</div>
</template>
<script>
import { reactive, toRefs, defineComponent } from 'vue';
import { useI18n } from 'vue-i18n'
export default defineComponent({
components: { },
props: ['dataList'],
setup(props) {
const { t } = useI18n()
const data= reactive({
imgCover:[],
dataList: props.dataList
})
const methods = {
}
data.imgCover = JSON.parse(data.dataList.imgCover);
return {
...toRefs(data),
...methods,
}
}
})
</script>
<style>
.Style2_main {
position: relative;
margin-top: -10px;
padding: 40px 0;
background-color: #fff;
border-bottom: 1px solid #e5e5e5;
z-index: 3;
}
.Style2_main .wl-section-block {
width: 100%;
max-width: 1200px;
margin: 0 auto;
padding: 0 20px;
display: flex;
}
.Style2_main .wl-section-block>* {
flex: 1;
}
.Style2_main .tour-intro {
padding:0 30px;
}
.Style2_main .tour_Nmae {
margin-bottom: 10px;
font-size: 24px;
font-weight: bold;
}
.Style2_main .drop-wrap {
position: relative;
margin-bottom: 10px;
display: inline-block;
vertical-align: middle;
}
.drop-wrap a,
.print_box {
margin-right: 10px;
margin-bottom: 10px;
display: inline-block;
font-size: 14px;
color: #006be2;
padding: 4px 8px;
transition: .15s ease-in;
}
.Style2_main .tour-detail-list {
padding: 0 0 20px;
font-size: 16px;
color: #999;
list-style: none;
}
.Style2_main .tour-detail-list li {
line-height: 2;
}
.Style2_main .tour-cover2 img {
width: 100%;
height: auto;
}
@media only screen and (max-width: 768px) {
.Style2_main .wl-section-block {
padding: 0;
display: block;
}
.Style2_main {
padding: 0;
}
}
</style>
<template>
<div class="Style2_main">
<div class="wl-section-block">
<div class="tour-cover2" v-if="imgCover.length>0">
<div class="q-pa-md">
<q-carousel
animated
v-model="slide"
navigation
height="400px"
infinite
autoplay
transition-prev="slide-right"
transition-next="slide-left"
>
<q-carousel-slide v-for="(x, i) in imgCover" :name="i" :key="i" :img-src="x.Url" />
</q-carousel>
</div>
</div>
<div class="tour-intro">
<div class="tour_Nmae">{{dataList.title}}</div>
<div class="drop-wrap">
<a>分享</a>
<a class="print_box" @click="window.print()">打印</a>
</div>
<ul class="tour-detail-list">
<li>行程編號:
<template v-if="dataList.currentPriceInfo&&dataList.currentPriceInfo.tcnum">
{{dataList.currentPriceInfo.tcnum.toUpperCase()}}
</template></li>
<li>旅遊地點:{{dataList.countryName}}</li>
<li>旅遊天數:{{dataList.dayNum}}天</li>
<li>出團日期:
<template v-if="dataList.currentPriceInfo&&dataList.currentPriceInfo.startDate">
{{dataList.currentPriceInfo.startDate}}
</template>
</li>
<li style="margin-top:30px;">
<q-btn v-if="dataList.currentPriceInfo&&dataList.currentPriceInfo.tcnum" style="width:115px;" type="a" label="立即预定" color="primary" @click="buyNow()" />
</li>
</ul>
</div>
</div>
</div>
</template>
<script>
import { reactive, toRefs, defineComponent } from 'vue';
import { useI18n } from 'vue-i18n'
export default defineComponent({
components: { },
props: ['dataList'],
setup(props, context) {
const { t } = useI18n()
const data= reactive({
slide: 1,
imgCover: [],
dataList: props.dataList
})
const methods = {
buyNow(){
context.emit('showDialog')
}
}
data.imgCover = JSON.parse(data.dataList.imgCover);
return {
...toRefs(data),
...methods,
}
}
})
</script>
This diff is collapsed.
<style>
.wl-section-block {
width: 100%;
max-width: 1200px;
margin: 0 auto;
}
.section-tour {
margin-bottom: 30px !important;
padding: 30px 30px 0;
border: 1px solid #e5e5e5;
background-color: #fff;
}
.section-tour .isHiden4 {
height: 450px;
overflow: hidden;
}
.toggle_down:before {
content: "";
width: 100%;
position: absolute;
top: -100px;
left: 0;
z-index: 2;
height: 100px;
background-image: -webkit-linear-gradient(-90deg, rgba(255, 255, 255, 0), #fff);
background-image: -moz-linear-gradient(-90deg, rgba(255, 255, 255, 0), #fff);
background-image: -o-linear-gradient(-90deg, rgba(255, 255, 255, 0), #fff);
background-image: linear-gradient(180deg, rgba(255, 255, 255, 0), #fff);
}
</style>
<template>
<div>
<section class="section-tour wl-section-block">
<div class="todayTitle">行程特色</div>
<div class="featureBox">
<template v-if="showType==3">
<div class="feature-inner" v-html="htmlData" :class="{'isHiden4':isShow}"></div>
</template>
<template v-if="showType>=4">
<div class="feature-inner" v-html="htmlData" :class="{'isHiden4':isShow}"></div>
</template>
<div class="collapse_toggle" v-if="!isShow">
<i class="iconfont iconarrow-top" @click="isShow=true"></i>
</div>
<div class="collapse_toggle toggle_down" v-else>
<i class="iconfont iconarrowdown" @click="isShow=false"></i>
</div>
</div>
</section>
</div>
</template>
<script>
import { reactive, toRefs, defineComponent } from 'vue';
import { useI18n } from 'vue-i18n'
import { GetHtml } from 'src/utils/tools'
export default defineComponent({
components: { },
props: ['dataList'],
setup(props) {
const { t } = useI18n()
const data= reactive({
TripConfig: {},
isShow: false,
showType:-1,
dataList: props.dataList,
htmlData: ''
})
const methods = {
}
if (localStorage.baseifo) {
data.TripConfig = JSON.parse(localStorage.getItem('baseifo'));
}
if (data.TripConfig.TripConfig.TripFeatureIsOpen == 1) {
data.isShow = false
} else {
data.isShow = true;
}
data.showType= data.dataList.feature.featureType;
if(data.dataList.feature.featureContent==3){
data.htmlData = GetHtml(data.dataList.feature.featureContent)
}
if(data.dataList.feature.featureContent>=4){
data.htmlData = GetHtml(data.dataList.feature.featureHtml)
}
return {
...toRefs(data),
...methods,
}
}
})
</script>
<style>
.wl-section-block {
width: 100%;
max-width: 1200px;
margin: 0 auto;
}
.section-tour {
margin-bottom: 30px !important;
padding: 30px 30px 0;
border: 1px solid #e5e5e5;
background-color: #fff;
}
.style5_item_title {
padding: 20px 0;
text-align: center;
width: 100%;
}
.fee_title {
color: #333;
font-size: 18px;
font-family: PingFangR;
}
.fee_line {
text-align: center;
color: #ccc;
font-size: 12px;
width: 100%;
}
.fee_line {
width: 32px;
height: 2px;
background: #ee4454;
display: inline-block;
}
.expense {
/* display: flex; */
margin: 30px auto;
width: 100%;
}
.detail-box .expense .left {
width: 100%;
text-align: center;
font-size: 17px;
margin-bottom:20px;
font-family: PingFangR;
}
.detail-box .expense .right {
/* -webkit-box-flex: 1;
flex: 1; */
overflow: hidden;
font-size: 16px;
line-height: 25px;
color: #666;
text-align: left;
}
.section-tour .isHiden5 {
height: 450px;
overflow: hidden;
}
.toggle_down:before {
content: "";
width: 100%;
position: absolute;
top: -100px;
left: 0;
z-index: 2;
height: 100px;
background-image: -webkit-linear-gradient(-90deg, rgba(255, 255, 255, 0), #fff);
background-image: -moz-linear-gradient(-90deg, rgba(255, 255, 255, 0), #fff);
background-image: -o-linear-gradient(-90deg, rgba(255, 255, 255, 0), #fff);
background-image: linear-gradient(180deg, rgba(255, 255, 255, 0), #fff);
}
</style>
<template>
<div>
<section class="section-tour wl-section-block">
<div class="style5_item_title detail-box">
<div :class="{'isHiden5':isShow}">
<div class="fee_title">费用</div>
<div class="fee_line">
<small class="s"></small>
</div>
<div style="color:#ccc">Expense</div>
<div class="expense">
<div class="left">费用包含</div>
<div class="right">
<div v-html="htmlData1"></div>
</div>
</div>
<div class="expense">
<div class="left">自理费用</div>
<div class="right">
<div v-html="htmlData2"></div>
</div>
</div>
<div class="fee_title">购物说明</div>
<div class="fee_line">
<small class="s"></small>
</div>
<div style="color:#ccc">Expense</div>
<div class="expense">
<div class="left"></div>
<div class="right">
<div v-html="htmlData3"></div>
</div>
</div>
<div class="fee_title">预订须知</div>
<div class="fee_line">
<small class="s"></small>
</div>
<div style="color:#ccc">Tips</div>
<div class="expense">
<div class="left">重要提示</div>
<div class="right">
<div v-html="htmlData4"></div>
</div>
</div>
<div class="expense">
<div class="left">{{$t('v103.scheduledTripDetails.style.d4')}}</div>
<div class="right">
<div v-html="htmlData5"></div>
</div>
</div>
<div class="fee_title">签证</div>
<div class="fee_line">
<small class="s"></small>
</div>
<div style="color:#ccc">Visa</div>
<div class="expense">
<div class="left">签证须知</div>
<div class="right">
<div v-html="dataList.feature.visaRemark"></div>
</div>
</div>
<div class="fee_title">同行备注</div>
<div class="fee_line">
<small class="s"></small>
</div>
<div style="color:#ccc">Remark</div>
<div class="expense">
<div class="left"></div>
<div class="right">
<div v-html="dataList.feature.b2BRemark"></div>
</div>
</div>
</div>
<div class="collapse_toggle" v-if="!isShow">
<i class="iconfont iconarrow-top" @click="isShow=true"></i>
</div>
<div class="collapse_toggle toggle_down" v-else>
<i class="iconfont iconarrowdown" @click="isShow=false"></i>
</div>
</div>
</section>
</div>
</template>
<script>
import { reactive, toRefs, defineComponent, } from 'vue';
import { useI18n } from 'vue-i18n'
import { GetHtml } from 'src/utils/tools'
export default defineComponent({
components: { },
props: ['dataList'],
setup(props) {
const { t } = useI18n()
const data= reactive({
TripConfig: {},
isShow: false,
dataList: props.dataList,
htmlData1: '',
htmlData2: '',
htmlData3: '',
htmlData4: '',
htmlData5: '',
})
const methods = {
}
if (localStorage.baseifo) {
data.TripConfig = JSON.parse(localStorage.getItem('baseifo'));
}
if (data.TripConfig.TripConfig.NoticeItemIsOpen == 1) {
data.isShow = false;
} else {
data.isShow = true;
}
data.htmlData1 = GetHtml(data.dataList.feature.feeInclude)
data.htmlData2 = GetHtml(data.dataList.feature.feeNonInclude)
data.htmlData3 = GetHtml(data.dataList.feature.shopRemark)
data.htmlData4 = GetHtml(data.dataList.feature.importantTip)
data.htmlData5 = GetHtml(data.dataList.feature.warmTip)
return {
...toRefs(data),
...methods,
}
}
})
</script>
This diff is collapsed.
<template>
<div class="q-mt-lg q-mb-lg">
<div class="section-block download1">
<!-- <div class="group-title">{{plugData.Title}}</div> -->
<q-table v-if="plugData&&plugData.length>0 && !$q.screen.xs" :pagination.sync="paginationDesktop" :data="plugData"
:columns="columns" row-key="id" :filter="filter" table-header-class="travel-list" card-class="travel-list"
:pagination-label="formatLabel" rows-per-page-label=" " :rows-per-page-options="[]" TCNUM-data-labe="沒有找到適合的團期">
<template v-slot:body="props">
<q-tr :props="props">
<q-td key="startDate" :props="props">
<span class="text-red">{{ props.row.startDate }}</span>
</q-td>
<q-td key="title" :props="props">
<div style="max-width:435px;white-space: pre-wrap;">
<a>{{ props.row.title }}</a>
</div>
</q-td>
<q-td key="dayNum" :props="props">{{ props.row.dayNum }}</q-td>
<q-td key="FlightStatus" :props="props">
<q-icon color="grey" name="iconfont iconhangbanxinxicopy" class="cursor-pointer" size="14">
<q-popup-proxy :offset="[260, 3]">
<q-banner class="bg-black text-white">
<table class="tripDetails_table">
<tr>
<th>出發時間</th>
<th>抵達時間</th>
<th>出發地點</th>
<th>抵達地點</th>
<th>航空公司</th>
</tr>
<tr v-for="(item,index) in props.row.priceFlight" :key="index">
<td>{{item.startDate.substring(5).replace('-','/')}} {{item.departureTime}}</td>
<td>{{item.arriveDate.substring(5).replace('-','/')}} {{item.arrivalTime}}</td>
<td>{{item.departureAirPortName}}</td>
<td>{{item.arrivalAirPortName}}</td>
<td>{{item.alName}}</td>
</tr>
</table>
</q-banner>
</q-popup-proxy>
</q-icon>
</q-td>
<q-td key="b2BPrice" :props="props">
<span caption>$</span>
<span class="text-subtitle2 text-weight-medium">{{ props.row.b2BPrice }}</span>
</q-td>
<q-td key="totalSeat" :props="props">
<span>{{ props.row.totalSeat }}</span>
</q-td>
<q-td key="seat" :props="props">
<span>{{ props.row.seat }}</span>
</q-td>
<q-td key="isSubstitution" :props="props">
<span
:class="{'text-orange':props.row.seat>0,'text-pink':(props.row.seat==0 && props.row.isSubstitution),'text-red':(props.row.seat==0 && !props.row.isSubstitution)}">{{ props.row.seat>0?'有名額':(props.row.seat==0 && props.row.isSubstitution?'可候補':'名額已滿') }}</span>
</q-td>
<q-td key="tcid" :props="props">
<q-btn type="a" :label="props.row.seat>0||props.row.isSubstitution?'報名GO!':'無法預訂'"
:color="props.row.seat>0||props.row.isSubstitution?'indigo':'grey'" rounded unelevated
:disable="props.row.seat==0&&props.row.isSubstitution" @click="goSignUp(props.row.seat)" />
</q-td>
</q-tr>
</template>
</q-table>
<q-table :pagination.sync="pagination" v-if="plugData&&plugData.length>0 && $q.screen.xs" grid :data="plugData"
:columns="columns" row-key="id" :filter="filter" table-header-class="travel-list" card-class="travel-list"
:pagination-label="formatLabel" rows-per-page-label=" " :rows-per-page-options="[]" TCNUM-data-labe="沒有找到適合的團期">
<template v-slot:item="props">
<div class="col-xs-12 col-sm-6 col-md-4 col-lg-3 grid-style-transition">
<q-card class="q-mb-md q-pt-xs q-pb-xs" flat>
<q-list>
<q-item>
<q-item-section>
<q-item-label class="text-grey">出發日期</q-item-label>
<q-item-label class="text-red">{{props.row.startDate}}</q-item-label>
</q-item-section>
</q-item>
<q-item>
<q-item-section>
<q-item-label class="text-grey">團體名稱</q-item-label>
<q-item-label>{{props.row.title}}</q-item-label>
</q-item-section>
</q-item>
<q-item>
<q-item-section>
<q-item-label class="text-grey">天數</q-item-label>
<q-item-label>{{props.row.dayNum}}</q-item-label>
</q-item-section>
</q-item>
<q-item>
<q-item-section>
<q-item-label class="text-grey">交通</q-item-label>
<q-item-label>
<!--v-if="props.row.FlightStatus"-->
<q-icon color="grey" name="iconfont iconhangbanxinxicopy" size="14" />
</q-item-label>
</q-item-section>
</q-item>
<q-item>
<q-item-section>
<q-item-label class="text-grey">售價</q-item-label>
<q-item-label>
<span caption>$</span>
<span class="text-subtitle2 text-weight-medium">{{ props.row.b2BPrice }}</span>
<span></span>
</q-item-label>
</q-item-section>
</q-item>
<q-item>
<q-item-section>
<q-item-label class="text-grey">狀態</q-item-label>
<q-item-label>
<span
:class="{'text-orange':props.row.seat>0,'text-pink':(props.row.seat==0 && props.row.isSubstitution),'text-red':(props.row.seat==0 && !props.row.isSubstitution)}">{{ props.row.seat>0?'有名額':(props.row.seat==0 && props.row.isSubstitution?'可候補':'名額已滿') }}</span>
</q-item-label>
</q-item-section>
</q-item>
<q-item>
<q-item-section>
<q-btn type="a" :label="props.row.seat>0||props.row.isSubstitution?'報名GO!':'無法預訂'"
:color="props.row.seat>0||props.row.isSubstitution?'indigo':'grey'" rounded unelevated
:disable="props.row.seat==0&&props.row.isSubstitution" @click="goSignUp(props.row.seat)" />
</q-item-section>
</q-item>
</q-list>
</q-card>
</div>
</template>
</q-table>
</div>
</div>
</template>
<script>
export default {
props: ["plugData"],
data() {
return {
pagination: {
sortBy: "id",
descending: false,
page: 1,
rowsPerPage: 1
},
paginationDesktop: {
sortBy: "id",
descending: false,
page: 1,
rowsPerPage: 5
},
filter: "",
columns: [{
name: "startDate",
required: true,
label: "出發日期",
align: "left",
sortable: true
},
{
name: "title",
label: "團體名稱",
align: "left",
field: "title"
},
{
name: "dayNum",
label: "天數",
align: "left",
field: "dayNum"
},
{
name: "FlightStatus",
label: "交通",
align: "left",
field: "FlightStatus"
},
{
name: "b2BPrice",
label: "售價",
align: "left",
field: "b2BPrice"
},
{
name: "totalSeat",
label: "位數",
align: "left",
field: "totalSeat"
},
{
name: "seat",
label: "可報名",
align: "left",
field: "seat"
},
{
name: "isSubstitution",
label: "狀態",
align: "left",
field: "isSubstitution"
},
{
name: "tcid",
label: "報名",
align: "left",
field: "tcid"
}
],
};
},
methods: {
formatLabel(firstRowIndex, endRowIndex, totalRowsNumber) {
return "";
},
//报名
goSignUp(seat){
if(seat>0){
this.$emit('showDialog');
}
}
},
mounted() {
}
};
</script>
<style>
.my-th-head {
font-size: 18px !important;
font-weight: 600 !important;
}
.download1 .group-title {
margin: 0;
padding: 0;
line-height: unset;
margin-bottom: 20px;
font-size: 24px;
text-align: center;
font-weight: 600;
text-align: center;
}
.travel-list th {
font-size: 16px !important;
}
.travel-list td {
font-size: 14px !important;
}
.tripDetails_table td{
text-align:center;
padding:6px;
}
.tripDetails_table th{
width:100px;
}
</style>
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment