<template>
<view :class="theme_view">
<view v-if="show && data.length > 1" class="start page-width-max">
<view class="skip round br" :style="skip_position_style" @tap.stop="skip_event">{{$t('common.skip')}} {{skip_time}}</view>
<swiper class="swiper" autoplay circular :interval="interval_time" @change="swiper_change_event">
<swiper-item v-for="(item, index) in data" :key="index">
<view class="swiper-item" :style="((item.bg_color || null) == null ? '' : 'background-color:'+item.bg_color)" :data-value="item.event_value" :data-type="item.event_type" @tap="swiper_tap_event">
<image class="image" :src="item.images_url" mode="widthFix"></image>
</view>
</swiper-item>
</swiper>
<view class="swiper-dot">
<block v-for="(item, index) in data" :key="index">
<view class="view" :style="index == current ? 'background-color:'+theme_color : ''" :class="{'active': index == current}"></view>
</block>
</view>
</view>
</view>
</template>
<script>
const app = getApp();
export default {
props: {
// 页面是否包含navbar
propHasNavbar: {
type: Boolean,
default: false,
}
},
data() {
return {
theme_view: app.globalData.get_theme_value_view(),
theme_color: app.globalData.get_theme_color(),
cache_key: 'plugins_startad_cache_key',
// 列表数据
data: [],
// 当前轮播位置
current: 0,
// 是否显示
show: false,
// 定时任务记录
timer: null,
// 倒计时跳过
skip_time: 6,
// 轮播自动播放时间
interval_time: 3000,
}
},
computed: {
// 跳过样式
skip_position_style() {
const {
statusBarHeight
} = uni.getSystemInfoSync();
if (!this.propHasNavbar) {
return this.obj_to_style({
'top': `${statusBarHeight*2 + 88 + 30}rpx`,
});
}
return this.obj_to_style({
'top': '30rpx'
});
}
},
created: function () {
if(app.globalData.data.common_data_init_status == 1) {
this.init();
} else {
this.init_config();
}
},
methods: {
// 初始化配置
init_config(status) {
if ((status || false) == true) {
this.init();
} else {
app.globalData.is_config(this, 'init_config');
}
},
// 初始化
init() {
let key = this.cache_key;
let status = parseInt(uni.getStorageSync(key) || 0);
if(status == 0) {
let pages = app.globalData.app_tabbar_pages() || [];
let current_page = '/'+app.globalData.current_page(false);
if(pages.length > 0 && pages[0] == current_page) {
let base = app.globalData.get_config('plugins_base.startad.data') || {};
this.setData({
data: app.globalData.get_config('plugins_startad_list') || [],
skip_time: parseInt(base.skip_time || 6),
interval_time: parseInt(base.interval_time || 3)*1000,
show: parseInt(base.is_status || 0) == 1,
});
if(this.show) {
if (app.globalData.data.is_use_native_tabbar == 1) {
uni.hideTabBar();
}
let self = this;
self.timer = setInterval(() => {
self.skip_time--;
if(self.skip_time <= 0) {
self.skip_event();
}
}, 1000);
uni.setStorage({
key: key,
data: 1,
});
}
}
}
},
// 样式转换处理
obj_to_style(obj) {
let style = '';
for (let key in obj) {
style += `${key}:${obj[key]};`;
}
return style;
},
// 结束事件
skip_event() {
// 清除定时任务并关闭显示
clearTimeout(this.timer);
this.setData({
show: false,
});
// 是否显示系统菜单
if (app.globalData.data.is_use_native_tabbar == 1) {
uni.showTabBar();
}
},
// 切换改变事件
swiper_change_event(e) {
// 手动滑操作最后一个,自动结束
if(e.detail.source == 'touch' && this.current == this.data.length-1 && e.detail.current == 0) {
this.skip_event();
} else {
this.setData({
current: e.detail.current,
});
}
},
// 切换点击事件
swiper_tap_event(e) {
app.globalData.operation_event(e);
}
}
}
</script>
<style scoped>
.start {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
z-index: 9999;
}
.skip {
position: absolute;
z-index: 2;
background-color: rgba(0, 0, 0, 0.6);
color: #fff;
right: 30rpx;
font-size: 28rpx;
width: 140rpx;
height: 52rpx;
line-height: 52rpx;
display: flex;
align-items: center;
justify-content: center;
}
.swiper {
height: 100vh;
width: 100%;
}
.swiper-item {
height: 100vh;
width: 100%;
display: flex;
justify-content: center;
align-items: center;
overflow: hidden;
background-color: transparent;
}
.swiper-item .image {
height: 100vh;
width: 100%;
display: block;
position: relative;
z-index: 2;
}
.swiper-dot {
position: absolute;
width: 100%;
left: 0;
bottom: 100rpx;
z-index: 3;
display: flex;
justify-content: center;
}
.swiper-dot .view {
width: 16rpx;
height: 16rpx;
border-radius: 100%;
background-color: rgba(0, 0, 0, 0.2);
margin: 0 12rpx;
}
.swiper-dot .view.active {
width: 30rpx;
border-radius: 24rpx;
}
</style>