|
|
|
@ -8,7 +8,7 @@ |
|
|
|
<uni-icons v-if="detailMsg.isHot ==='0'" class="tool-bar-icon" custom-prefix="iconfont" :type="'icon-hot'" size="24" ></uni-icons> |
|
|
|
<uni-icons v-else class="tool-bar-icon" custom-prefix="iconfont" :type="'icon-hot'" size="24" :color="likeColor"></uni-icons> |
|
|
|
</view> |
|
|
|
<view class="toolbar-box" @click="isShowDownLoadBox()"> |
|
|
|
<view class="toolbar-box" @click="$noMultipleClicks(clickDownload,detailMsg.imgUrl)"> |
|
|
|
<uni-icons v-if="isDownload" class="tool-bar-icon" custom-prefix="iconfont" :type="'icon-xiazai'" size="24" ></uni-icons> |
|
|
|
<uni-icons v-else class="tool-bar-icon" custom-prefix="iconfont" :type="'icon-xiazai'" size="24" ></uni-icons> |
|
|
|
<text>下载</text> |
|
|
|
@ -30,15 +30,18 @@ |
|
|
|
</button> |
|
|
|
</view> |
|
|
|
</view> |
|
|
|
<view v-if="!showDownLoad" class="downLoad-wrap"> |
|
|
|
<view class="ad_button" @click="$noMultipleClicks(authDownload,detailMsg.imgUrl)"></view> |
|
|
|
<view v-if="showDownLoad" class="downLoad-wrap"> |
|
|
|
<view class="ad_button" @click="authDownload(detailMsg.imgUrl)"></view> |
|
|
|
<view class="vip_button" @click="goOpenVip()"></view> |
|
|
|
<view class="close_button" @click="isShowDownLoadBox()"></view> |
|
|
|
<view class="restNum">今日剩余还可下载 {{canDownloadNum}}次</view> |
|
|
|
</view> |
|
|
|
</view> |
|
|
|
</template> |
|
|
|
|
|
|
|
<script> |
|
|
|
|
|
|
|
var videoAd = null; |
|
|
|
import { |
|
|
|
detailsTiktokImg, // 获取图片详情 |
|
|
|
judgeTiktokLike, // 查询是否点赞过 |
|
|
|
@ -53,6 +56,8 @@ |
|
|
|
checkUserCanDownload// 检查某平台用户当日下载次数是否超标 |
|
|
|
} from '@/api/creator.js' |
|
|
|
import {loginTiktok} from '@/api/auth.js' |
|
|
|
import {checkVip} from "@/api/paint"; |
|
|
|
import {getRestNum} from "@/api/userInfo.js"; |
|
|
|
export default { |
|
|
|
data() { |
|
|
|
return { |
|
|
|
@ -73,21 +78,30 @@ |
|
|
|
urlParamId: undefined, |
|
|
|
isplayOver: false, |
|
|
|
downloadUrl: undefined, |
|
|
|
isVip: false, |
|
|
|
canDownloadNum: 0, //可下载图片次数 |
|
|
|
canRewardNum: 0, //可获取奖励次数 |
|
|
|
userInfo:{}, |
|
|
|
adList:['0qfnoa4053uwkefbas','2v63zq5hvfclpxmurl','d4ltbnxa23zp2hhqwe'] //激励视频广告列表 |
|
|
|
} |
|
|
|
}, |
|
|
|
onLoad(option){ |
|
|
|
async onLoad(option){ |
|
|
|
await this.checkIsVip(); |
|
|
|
console.log('vip状态为',this.isVip); |
|
|
|
if (option?.id) { |
|
|
|
this.urlParamId = option.id; |
|
|
|
} |
|
|
|
//如果是非会员才做如下操作 |
|
|
|
if(this.isVip === false){ |
|
|
|
this.isplayOver = false; |
|
|
|
//随机选择一个激励视频广告初始化 |
|
|
|
let num = Math.floor(Math.random() * this.adList.length + 1)-1; |
|
|
|
//console.log('随机激励视频id为:',this.adList[num]) |
|
|
|
console.log('随机激励视频id为:',this.adList[num]) |
|
|
|
this.loadAdvertise(this.adList[num]); |
|
|
|
} |
|
|
|
}, |
|
|
|
onShow() { |
|
|
|
//this.achieveSaveImg(); |
|
|
|
this.userInfo = uni.getStorageSync('userInfo') |
|
|
|
}, |
|
|
|
onHide() { |
|
|
|
console.log('进入onHide') |
|
|
|
@ -121,34 +135,123 @@ |
|
|
|
} |
|
|
|
}, |
|
|
|
methods: { |
|
|
|
//点击下载按钮 |
|
|
|
async clickDownload(url){ |
|
|
|
let that = this; |
|
|
|
if(that.isVip == 1) { |
|
|
|
//是会员的话,点击下载的时候不弹窗,直接下载图片;不写入广告次数,不做下载次数判断 |
|
|
|
that.vipSaveImg(url); |
|
|
|
} else { |
|
|
|
//获取可下载图片次数
await this.getRestNum("0"); |
|
|
|
//不是会员就弹窗引导其去开会员,看了广告写入广告次数,要做下载图片次数检查 |
|
|
|
that.isShowDownLoadBox(); |
|
|
|
} |
|
|
|
}, |
|
|
|
//检查是否开通了vip |
|
|
|
async checkIsVip() { |
|
|
|
let that = this; |
|
|
|
const data = { |
|
|
|
userId: that.userInfo.id, |
|
|
|
userClientType: 10 |
|
|
|
} |
|
|
|
const res = await checkVip(data); |
|
|
|
console.log('res===', res); |
|
|
|
if (res.data.code === 200) { |
|
|
|
if(res.data.data.isVip == '1') { |
|
|
|
that.isVip = true; |
|
|
|
}else{ |
|
|
|
that.isVip = false; |
|
|
|
} |
|
|
|
}else { |
|
|
|
uni.showModal({ |
|
|
|
content: '网络错误,请稍后再试~', |
|
|
|
showCancel: false |
|
|
|
}); |
|
|
|
} |
|
|
|
}, |
|
|
|
|
|
|
|
//获取某平台用户当日下载/绘画奖励剩余次数 |
|
|
|
async getRestNum(adType) { |
|
|
|
const params = { |
|
|
|
userId: this.userInfo.id, |
|
|
|
appType: '0', |
|
|
|
platform: '0' ,//此处0代表抖音 |
|
|
|
adType: adType |
|
|
|
} |
|
|
|
const res = await getRestNum(params); |
|
|
|
if (res.data.code === 200) { |
|
|
|
console.log("当日非会员用户可下载/奖励结果为", res.data.data) |
|
|
|
if(adType === '0'){ |
|
|
|
//下载图片 |
|
|
|
this.canDownloadNum = res.data.data |
|
|
|
console.log('this.canDownloadNum',this.canDownloadNum) |
|
|
|
}else{ |
|
|
|
//获取奖励 |
|
|
|
this.canRewardNum = res.data.data |
|
|
|
console.log('this.canRewardNum',this.canRewardNum) |
|
|
|
} |
|
|
|
} else { |
|
|
|
uni.showToast({ |
|
|
|
title: '获取下载/绘画奖励剩余次数失败!', |
|
|
|
icon: 'none' |
|
|
|
}) |
|
|
|
} |
|
|
|
}, |
|
|
|
|
|
|
|
//唤起广告会员界面 |
|
|
|
isShowDownLoadBox() { |
|
|
|
console.log('11111111'); |
|
|
|
console.log('this.showDownLoad',this.showDownLoad); |
|
|
|
this.showDownLoad = !this.showDownLoad |
|
|
|
//如果不是会员,点击下载的时候弹窗引导它去开会员 |
|
|
|
}, |
|
|
|
//跳转开通VIP界面 |
|
|
|
goOpenVip() { |
|
|
|
this.isShowDownLoadBox() |
|
|
|
let that = this; |
|
|
|
//判断是否为ios,ios则提示不支持 |
|
|
|
uni.getSystemInfo({
success(res) {
console.log(res.osName) |
|
|
|
if(res.osName === 'ios'){ |
|
|
|
return uni.showToast({ |
|
|
|
title: 'ios暂不支持.如已开通请关联绑定会员卡', |
|
|
|
duration: 2500, |
|
|
|
icon: 'none', |
|
|
|
success() { |
|
|
|
that.isShowDownLoadBox(); |
|
|
|
} |
|
|
|
}) |
|
|
|
}else{ |
|
|
|
that.isShowDownLoadBox() |
|
|
|
uni.navigateTo({ |
|
|
|
url:'/pages/userInfo/vip/vip' |
|
|
|
}) |
|
|
|
}
}
}); |
|
|
|
}, |
|
|
|
|
|
|
|
//加载激励视频广告 |
|
|
|
loadAdvertise(adId){ |
|
|
|
// 在页面中定义激励视频广告 |
|
|
|
let videoAd = null |
|
|
|
var that = this |
|
|
|
// 在页面onLoad回调事件中创建激励视频广告实例 |
|
|
|
if (tt.createRewardedVideoAd) { |
|
|
|
videoAd = tt.createRewardedVideoAd({ |
|
|
|
adUnitId: adId |
|
|
|
}) |
|
|
|
that.videoAd = videoAd |
|
|
|
}); |
|
|
|
//解决重复发放奖励BUG |
|
|
|
try{ |
|
|
|
if (videoAd.closeHandler) { |
|
|
|
videoAd.offClose(videoAd.closeHandler); |
|
|
|
console.log("videoAd.offClose卸载成功"); |
|
|
|
} |
|
|
|
}catch(e){ |
|
|
|
console.log("videoAd.offClose 卸载失败"); |
|
|
|
console.error(e); |
|
|
|
} |
|
|
|
videoAd.onLoad(() => { |
|
|
|
//console.log('激励视频广告'+adId+'加载成功') |
|
|
|
console.log('激励视频广告'+adId+'加载成功') |
|
|
|
}) |
|
|
|
videoAd.onError((err) => { |
|
|
|
that.err() |
|
|
|
}) |
|
|
|
videoAd.onClose((res) => { |
|
|
|
videoAd.closeHandler = (res) =>{ |
|
|
|
if (res && res.isEnded || res === undefined) { |
|
|
|
// 正常播放结束,可以下发游戏奖励 |
|
|
|
that.isplayOver = true; |
|
|
|
@ -156,19 +259,22 @@ |
|
|
|
that.achieveSaveImg(); |
|
|
|
}else{ |
|
|
|
that.isplayOver = false; |
|
|
|
//console.log('激励视频广告尚未看完',that.isplayOver) |
|
|
|
uni.showToast({ |
|
|
|
title: '您还没有看完视频,无法下载图片', |
|
|
|
icon: 'none' |
|
|
|
}) |
|
|
|
} |
|
|
|
}) |
|
|
|
} |
|
|
|
videoAd.onClose(videoAd.closeHandler); |
|
|
|
} |
|
|
|
}, |
|
|
|
|
|
|
|
//展示激励视频广告 |
|
|
|
showAdvertise(url){ |
|
|
|
let videoAd = this.videoAd |
|
|
|
uni.hideLoading(); |
|
|
|
//关闭弹窗 |
|
|
|
this.isShowDownLoadBox(); |
|
|
|
//let videoAd = this.videoAd |
|
|
|
this.downloadUrl = url; |
|
|
|
//console.log('看广告时传入进来的url',url); |
|
|
|
//console.log('this.downloadUrl看广告时',this.downloadUrl); |
|
|
|
@ -216,7 +322,7 @@ |
|
|
|
this.userInfo = res.data |
|
|
|
this.searchIsLike() |
|
|
|
this.searchisCollect() |
|
|
|
this.checkUserDownload() |
|
|
|
//this.checkUserDownload() |
|
|
|
} |
|
|
|
}) |
|
|
|
} else { |
|
|
|
@ -365,7 +471,7 @@ |
|
|
|
TiktokAuthorization: res.data.data.access_token, |
|
|
|
platform: res.data.data.platform |
|
|
|
} |
|
|
|
this.checkUserDownload(headers) |
|
|
|
//this.checkUserDownload(headers) |
|
|
|
callBack && callBack(headers) |
|
|
|
this.searchIsLike(headers) |
|
|
|
this.searchisCollect(headers) |
|
|
|
@ -434,7 +540,7 @@ |
|
|
|
scanCode: that.scanCode, |
|
|
|
userId: that.userInfo.id, |
|
|
|
appType: '0', |
|
|
|
platform: '0' |
|
|
|
platform: '0' //此处0代表抖音 |
|
|
|
} |
|
|
|
const res = await insertOrUpdatePreAdProfit(params); |
|
|
|
if (res.data.code === 200) { |
|
|
|
@ -456,7 +562,7 @@ |
|
|
|
creatorId: that.detailMsg.creatorId, |
|
|
|
scanCode: that.scanCode, |
|
|
|
appType: '0', |
|
|
|
platform: '0' |
|
|
|
platform: '0' //此处0代表抖音 |
|
|
|
} |
|
|
|
const res = await insertOrUpdatePreInviteProfit(params) |
|
|
|
if (res.data.code === 200) { |
|
|
|
@ -471,15 +577,16 @@ |
|
|
|
}, |
|
|
|
|
|
|
|
//检查某平台用户当日下载次数是否超标 |
|
|
|
async checkUserDownload(token) { |
|
|
|
async checkUserDownload(adType) { |
|
|
|
const params = { |
|
|
|
userId: this.userInfo.id, |
|
|
|
appType: '0', |
|
|
|
platform: '0' |
|
|
|
platform: '0' ,//此处0代表抖音 |
|
|
|
adType: adType |
|
|
|
} |
|
|
|
const res = await checkUserCanDownload(params,token); |
|
|
|
const res = await checkUserCanDownload(params); |
|
|
|
if (res.data.code === 200) { |
|
|
|
console.log("当日下载结果为", res.data.data) |
|
|
|
console.log("当日非会员用户是否可下载/奖励结果为", res.data.data) |
|
|
|
this.canDownload = res.data.data; |
|
|
|
} else { |
|
|
|
uni.showToast({ |
|
|
|
@ -488,7 +595,10 @@ |
|
|
|
}) |
|
|
|
} |
|
|
|
}, |
|
|
|
authDownload(url) { |
|
|
|
|
|
|
|
async authDownload(url) { |
|
|
|
//检查非会员用户是否达到可下载次数上限, 传0代表是下载图片检查 |
|
|
|
await this.checkUserDownload("0"); |
|
|
|
if (!this.userInfo) { |
|
|
|
this.getUserInfoLogin(() => { |
|
|
|
this.download(url) |
|
|
|
@ -498,10 +608,155 @@ |
|
|
|
} |
|
|
|
}, |
|
|
|
|
|
|
|
//是会员,直接保存图片,不记录下载图片次数数据 |
|
|
|
vipSaveImg(imgUrl){ |
|
|
|
let that = this; |
|
|
|
let url = imgUrl; |
|
|
|
//console.log('需要下载图片路径为',url) |
|
|
|
that.isDownload = true; |
|
|
|
uni.showLoading({ |
|
|
|
title: '正在保存图片...', |
|
|
|
success() { |
|
|
|
//获取用户的当前设置。获取相册权限 |
|
|
|
uni.getSetting({ |
|
|
|
success(res){ |
|
|
|
//console.log('授权res',res) |
|
|
|
//如果没有相册权限 |
|
|
|
if (!res.authSetting["scope.album"]) { |
|
|
|
//向用户发起授权请求 |
|
|
|
uni.authorize({ |
|
|
|
scope: "scope.album", |
|
|
|
success: () => { |
|
|
|
//授权成功保存图片到系统相册 |
|
|
|
uni.downloadFile({ |
|
|
|
url, |
|
|
|
success: (res) => { |
|
|
|
//console.log('图片下载res',res) |
|
|
|
if (res.statusCode === 200) { |
|
|
|
uni.saveImageToPhotosAlbum({ |
|
|
|
//图片路径,不支持网络图片路径 |
|
|
|
filePath: res.tempFilePath, |
|
|
|
success: (res) => { |
|
|
|
|
|
|
|
}, |
|
|
|
fail: (res) => { |
|
|
|
return uni.showToast({ |
|
|
|
title: res.errMsg, |
|
|
|
icon: 'none' |
|
|
|
}); |
|
|
|
}, |
|
|
|
complete: (res) => { |
|
|
|
uni.hideLoading(); |
|
|
|
if (res.errMsg !== "saveImageToPhotosAlbum:ok") { |
|
|
|
return uni.showToast({ |
|
|
|
title: "下载失败!", |
|
|
|
icon: 'none' |
|
|
|
}); |
|
|
|
} else { |
|
|
|
return uni |
|
|
|
.showToast({ |
|
|
|
title: "下载成功!", |
|
|
|
icon: 'none', |
|
|
|
success() { |
|
|
|
that.isDownload = false; |
|
|
|
} |
|
|
|
}); |
|
|
|
} |
|
|
|
}, |
|
|
|
}); |
|
|
|
} else { |
|
|
|
uni.showToast({ |
|
|
|
title: "下载失败!", |
|
|
|
icon: 'none' |
|
|
|
}); |
|
|
|
} |
|
|
|
} |
|
|
|
}) |
|
|
|
}, |
|
|
|
//授权失败 |
|
|
|
fail: () => { |
|
|
|
uni.hideLoading(); |
|
|
|
uni.showModal({ |
|
|
|
title: "您已拒绝获取相册权限", |
|
|
|
content: "是否进入权限管理,调整授权?", |
|
|
|
success: (res) => { |
|
|
|
if (res.confirm) { |
|
|
|
//调起客户端小程序设置界面,返回用户设置的操作结果。(重新让用户授权) |
|
|
|
uni.openSetting({ |
|
|
|
success: (res) => { |
|
|
|
|
|
|
|
}, |
|
|
|
}); |
|
|
|
} else if (res.cancel) { |
|
|
|
return uni.showToast({ |
|
|
|
title: "已取消!", |
|
|
|
icon: 'none' |
|
|
|
}); |
|
|
|
} |
|
|
|
}, |
|
|
|
}); |
|
|
|
}, |
|
|
|
}); |
|
|
|
} else { |
|
|
|
//如果已有相册权限,直接保存图片到系统相册 |
|
|
|
//console.log('已有相册权限,开始保存图片',url); |
|
|
|
//授权成功保存图片到系统相册 |
|
|
|
uni.downloadFile({ |
|
|
|
url, |
|
|
|
success: (res) => { |
|
|
|
//console.log('进入图片下载',res); |
|
|
|
if (res.statusCode === 200) { |
|
|
|
uni.saveImageToPhotosAlbum({ |
|
|
|
//图片路径,不支持网络图片路径 |
|
|
|
filePath: res.tempFilePath, |
|
|
|
success: (res) => { |
|
|
|
//console.log('保存图片状态',res); |
|
|
|
}, |
|
|
|
fail: (res) => { |
|
|
|
return uni.showToast({ |
|
|
|
title: res.errMsg, |
|
|
|
icon: 'none' |
|
|
|
}); |
|
|
|
}, |
|
|
|
complete: (res) => { |
|
|
|
uni.hideLoading(); |
|
|
|
if (res.errMsg !== "saveImageToPhotosAlbum:ok") { |
|
|
|
return uni.showToast({ |
|
|
|
title: "下载失败!", |
|
|
|
icon: 'none' |
|
|
|
}); |
|
|
|
} else { |
|
|
|
return uni.showToast({ |
|
|
|
title: "下载成功!", |
|
|
|
icon: 'none', |
|
|
|
success() { |
|
|
|
that.isDownload = false; |
|
|
|
} |
|
|
|
}); |
|
|
|
} |
|
|
|
}, |
|
|
|
}); |
|
|
|
} else { |
|
|
|
uni.showToast({ |
|
|
|
title: "下载失败!", |
|
|
|
icon: 'none' |
|
|
|
}); |
|
|
|
} |
|
|
|
} |
|
|
|
}) |
|
|
|
} |
|
|
|
}, |
|
|
|
fail: (res) => {}, |
|
|
|
}); |
|
|
|
} |
|
|
|
}); |
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
//观看完广告,保存图片 |
|
|
|
achieveSaveImg(){ |
|
|
|
let that = this; |
|
|
|
console.log('广告状态',that.isplayOver) |
|
|
|
//console.log('广告状态',that.isplayOver) |
|
|
|
if(that.isplayOver){ |
|
|
|
//观看完广告,可下载图片 |
|
|
|
let url = that.downloadUrl; |
|
|
|
@ -554,6 +809,8 @@ |
|
|
|
that.insertPreAdProfit(); |
|
|
|
that.insertPreInviteProfit(); |
|
|
|
that.isplayOver = false; |
|
|
|
//重置已下载状态 |
|
|
|
that.isDownload = false; |
|
|
|
} |
|
|
|
}); |
|
|
|
} |
|
|
|
@ -629,6 +886,8 @@ |
|
|
|
that.insertPreAdProfit(); |
|
|
|
that.insertPreInviteProfit(); |
|
|
|
that.isplayOver = false; |
|
|
|
//重置已下载状态 |
|
|
|
that.isDownload = false; |
|
|
|
} |
|
|
|
}); |
|
|
|
} |
|
|
|
@ -656,27 +915,26 @@ |
|
|
|
// 下载 |
|
|
|
download(url) { |
|
|
|
let that = this; |
|
|
|
//console.log('that.canDownload',that.canDownload) |
|
|
|
uni.showLoading({ |
|
|
|
title: '加载中' |
|
|
|
}); |
|
|
|
//满足可下载条件 为false |
|
|
|
if (that.canDownload !== true) { |
|
|
|
//满足可下载条件 |
|
|
|
//修改当前下载状态 |
|
|
|
that.isDownload = true |
|
|
|
//console.log('res123',123) |
|
|
|
uni.showModal({ |
|
|
|
title: '提示', |
|
|
|
content: '看一段广告解锁图片下载', |
|
|
|
success: function (res) { |
|
|
|
//console.log('res',res) |
|
|
|
if(res.confirm){ |
|
|
|
//展示激励视频广告 |
|
|
|
that.showAdvertise(url); |
|
|
|
} |
|
|
|
} |
|
|
|
}); |
|
|
|
|
|
|
|
} else { |
|
|
|
//不满足可下载条件 canDownload为true状态 |
|
|
|
return uni.showToast({ |
|
|
|
title: '当日下载次数已用完,请明日再来!', |
|
|
|
icon: 'none' |
|
|
|
icon: 'none', |
|
|
|
success() { |
|
|
|
//关闭弹窗 |
|
|
|
that.isShowDownLoadBox(); |
|
|
|
} |
|
|
|
}) |
|
|
|
} |
|
|
|
|
|
|
|
@ -701,7 +959,7 @@ |
|
|
|
transform: translate(-50%, -50%); |
|
|
|
width: 80%; |
|
|
|
height: 1000rpx; |
|
|
|
background-image: url('https://vediocnd.corpring.com/AIDrawCYYJ/vip_box_bg1.png'); |
|
|
|
background-image: url('https://img.bnyer.cn/vip_box_bg1%20%281%29.png'); |
|
|
|
background-size: 100% 100%; |
|
|
|
padding: 40rpx; |
|
|
|
box-sizing: border-box; |
|
|
|
@ -712,7 +970,7 @@ |
|
|
|
right: 20rpx; |
|
|
|
width: 60rpx; |
|
|
|
height: 60rpx; |
|
|
|
background-image: url('https://vediocnd.corpring.com/AIDrawCYYJ/down_box_close.png'); |
|
|
|
background-image: url('https://img.bnyer.cn/down_box_close.png'); |
|
|
|
background-size: 100% 100%; |
|
|
|
} |
|
|
|
.vip_button { |
|
|
|
@ -722,7 +980,7 @@ |
|
|
|
transform: translateX(-50%); |
|
|
|
width: 310rpx; |
|
|
|
height: 100rpx; |
|
|
|
background-image: url('https://vediocnd.corpring.com/AIDrawCYYJ/down_box_vip.png'); |
|
|
|
background-image: url('https://img.bnyer.cn/down_box_vip.png'); |
|
|
|
background-size: 100% 100%; |
|
|
|
} |
|
|
|
.ad_button { |
|
|
|
@ -732,9 +990,16 @@ |
|
|
|
// transform: translateX(-50%); |
|
|
|
width: 190rpx; |
|
|
|
height: 80rpx; |
|
|
|
background-image: url('https://vediocnd.corpring.com/AIDrawCYYJ/ad_button1.png'); |
|
|
|
background-image: url('https://img.bnyer.cn/ad_button1.png'); |
|
|
|
background-size: 100% 100%; |
|
|
|
} |
|
|
|
.restNum{ |
|
|
|
position: absolute; |
|
|
|
top: 430rpx; |
|
|
|
color: red; |
|
|
|
font-size: 30rpx; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
.imgDetail { |
|
|
|
height: 100vh; |
|
|
|
|