// 判断活动是否结束
var initPageTime = new Date().getTime()
var initActiveOverCheck = -1
function activeOverCheck (endTime, callback) {
if (initPageTime >= endTime) {
return callback()
}
clearTimeout(initActiveOverCheck)
var reloadTime = endTime - new Date().getTime()
if (reloadTime <= (10 * 60 * 1000) ) {
initActiveOverCheck = setTimeout(function (){
callback()
}, reloadTime)
}
}
// 注册埋点
function trackClick (c_type) {
if (!c_type) return
try {
clab_tracker.track('c_202402_activity', {
c_platform: 'pc',
c_type: c_type,
date: new Date()
})
} catch (error) {
console.dir(error)
}
}
// toast上限提示
function toastFn (text, duration) {
if (!duration) {
duration = 1000
}
var _html = ""
_html+='
'
$('body').append(_html)
setTimeout(function(){
$(".custom-toast").fadeOut().remove();
},duration)
}
// 展示弹窗
function showDialogOfType (type) {
// $('#active-tip-modal').attr('data-modal-type', 'success').modal('show')
// $('#active-tip-modal').attr('data-modal-type', 'over').modal('show')
// $('#active-tip-modal').attr('data-modal-type', 'code').modal('show')
var modal = $('#active-tip-modal')
modal.attr('data-modal-type', type).modal('show')
if (type === 'over') {
modal.off('click')
} else if (type === 'success') {
// 点击按钮关闭
$('.close-dialog-icon-bottom').show().off('click').on('click', function () {
modal.modal('hide')
})
} else {
modal.off('click').on('click', function () {
modal.modal('hide')
})
}
}
function closeDialog () {
var modal = $('#active-tip-modal')
modal.modal('hide')
}
function loginCallback (r) {
// task.hasLogin = loginflag
var hasLogin = !!r
task.hasLogin = hasLogin
if (hasLogin) {
task.ajaxCoinCount()
task.getCoinMissionComplete()
}
}
// 固定事件
$(function () {
// 弹窗按钮事件
$('#dialog-button--over').on('click', function () {
window.open('/swordfish/frontPage/share/sess/index')
})
$('#dialog-button--success').on('click', function () {})
})
var task = new Vue({
el: '#main-app',
delimiters: ['${', '}'],
data: {
conf: {
now: Date.now(),
header_pic: '',
},
loading: false,
confLoaded: false,
coinCount: 0, // 剑鱼币剩余数量
activityId: '',
hasLogin: false,
hasCoinMission: false, // 是否有剑鱼币任务
isPersonalIdentity: false, // 是否是个人版身份
activityConf: {
name: '天天抢会员,助力复工免费领会员', // 活动名称
active_start_time: 1707926400, // 活动开始时间 2024.2.15
active_end_time: 1708358400, // 活动结束时间
lottery_start_time: 10, // 抽奖开始时间(活动期间内的某个整点)
lottery_end_time: 24, // 抽奖结束时间(活动期间内的某个整点)
lottery_start_unix: 0, // 当天抽奖时间
cost: 100, // 抽奖花费:默X个剑鱼币兑换1次抽奖机会
rule: [], // 活动规则
share_copy: {}, // 分享文案
prize: [], // 奖品图片列表
prompt_msg: '',
status: 0, // 状态 0-抽奖状态 1-未开始(倒计时) 2-根据prompt_msg展示文案
now_unix: 0,
},
shareInfo: {},
rewardList: [],
rulesList: [
// {
// text: '活动时间:2024.2.15-2024.2.20,活动期间每天10:00开始抢会员。'
// },
// {
// text: '活动对象:仅限已注册“剑鱼标讯”的用户。'
// },
// {
// text: '活动介绍:用户进入天天抢会员活动页面,使用100剑鱼币即可获得1次抽奖机会,每天仅限100个中奖名额,每人每天每个身份仅有1次抽奖机会,中奖之后在活动页面“我的奖励”中查看兑换码进行兑换。'
// },
// {
// text: '免费订阅需设置"活动福利:超级订阅周卡/月卡、WPS会员月卡、网易云音乐黑胶VIP月卡、喜马拉雅会员2个月、腾讯视频会员周卡、120剑鱼币。'
// },
// {
// text: '兑换方式:打开链接(https://22233.cn/2258)输入兑换码和手机号,即可兑换使用,兑换成功后可用充值的账号登录官方APP进行查询,每个兑换码只能兑换1次且兑换过程中不可更换充值账号,请确认充值账号无误后进行兑换。'
// },
// {
// text: '本活动最终解释权归剑鱼标讯所有。'
// },
],
tipInfo: {
timerId: '',
countdown: false,
countdownText: '',
text: '', // 内容
},
dialog: {
confirm: false,
},
timerId: null,
animateMinDelay: 2000,
animateDebounce: false,
animateTimestamp: 0,
ballList: [],
pageDOM: {
ratio: 1,
},
},
computed: {
now: function () {
var now = this.conf.now
// console.log(new Date(now).pattern('yyyy.MM.dd HH:mm:ss'))
return now
},
coinMissionCompleted: function () {
if (this.isPersonalIdentity) {
return !this.hasCoinMission
} else {
return true
}
},
shareInfoPlatform: function () {
if (this.shareInfo && this.shareInfo.PC) {
return this.shareInfo.PC
} else {
return {}
}
},
copyLinkText: function () {
if (this.shareInfoPlatform.href) {
return location.origin + this.shareInfoPlatform.href
} else {
return location.href
}
},
pointerShow: function () {
return this.activityConf.status === 0
},
activeStartTime: function () {
var conf = this.activityConf
return new Date(conf.active_start_time * 1000).pattern('yyyy.MM.dd')
},
activeEndTime: function () {
var conf = this.activityConf
return new Date(conf.active_end_time * 1000).pattern('yyyy.MM.dd')
},
},
created: function () {
var activityId = getParam('id')
if (activityId) {
this.activityId = activityId
}
this.ajaxActiveStatus()
this.ajaxList()
},
mounted: function () {
this.bindCalcScale()
},
methods: {
add0: function (t) {
return t < 10 ? ('0' + t) : t
},
toLogin: function () {
$('#header-login-btn').trigger('click')
},
doCopy: function () {
trackClick('点击复制链接')
var shareText = this.shareInfoPlatform.subtitle || ''
var copyLinkText = this.copyLinkText
this.copyText(shareText + '\n' + copyLinkText)
toastFn('复制成功', 2000)
},
copyText: function (text) {
const input = document.createElement('textarea') // js创建一个input输入框
input.value = text // 将需要复制的文本赋值到创建的input输入框中
document.body.appendChild(input) // 将输入框暂时创建到实例里面
input.select() // 选中输入框中的内容
document.execCommand('copy') // 执行复制操作
document.body.removeChild(input) // 最后删除实例中临时创建的input输入框,完成复制操作
},
onClickListItem: function (item) {
var delay = 0
if (item.attribute > 0) {
// 第三方。复制兑换码
if (item.code) {
// 复制成功2s后跳转
this.copyText(item.code)
delay = 1000
toastFn('复制成功', delay)
}
}
setTimeout(function () {
if (item.url) {
window.open(item.url)
}
}, delay)
},
calcTimeString: function (t) {
return new Date(t).pattern('yyyy.MM.dd HH:mm:ss')
},
calcLastTimeDiff: function (timestamp) {
var diff = moment.duration(Math.abs(timestamp))
var days = diff.days()
var hours = diff.hours()
var minutes = diff.minutes()
var seconds = diff.seconds()
return {
days: days,
hours: hours,
minutes: minutes,
seconds: seconds
}
},
getCoinMissionComplete: function () {
var _this = this
$.ajax({
url: '/jyActivity/task',
type: 'POST',
success: function (res) {
if (res && res.data) {
if (!$.isArray(res.data.limitedTask)) {
res.data.limitedTask = []
}
if (!$.isArray(res.data.newbieTask)) {
res.data.newbieTask = []
}
var statusArr = []
var missionList = res.data.limitedTask.concat(res.data.newbieTask)
missionList.forEach(function (item) {
// status是否完成 0未完成 1完成
statusArr.push(item.status == 1)
})
_this.hasCoinMission = statusArr.indexOf(false) !== -1
}
}
})
// 获取当前身份
$.ajax({
url: '/publicapply/identity/list',
type: 'POST',
success: function (res) {
if (res && $.isArray(res.data)) {
var list = res.data
for (var i = 0; i < list.length; i++) {
if (list[i].checked == 1 && list[i].positionType == 0) {
_this.isPersonalIdentity = true
break
}
}
}
}
})
},
ajaxCoinCount: function () {
var _this = this
$.ajax({
url: '/jyintegral/getList',
type: 'POST',
data: {
B: true
},
success: function (res) {
if (res && res.data && res.data.points) {
_this.coinCount = res.data.points.balance || 0
}
}
})
},
toEarnCoin: function () {
if (this.coinMissionCompleted) {
// 充值剑鱼币
window.open('/swordfish/integral/index/recharge')
} else {
// 赚剑鱼币
window.open('/page_workDesktop/work-bench/app/points/earn')
}
},
ajaxActiveStatus: function () {
var _this = this
$.ajax({
url: '/publicapply/activity/day/info',
type: 'post',
async: false,
data: {
id: this.activityId
},
success: function (res) {
if (res && res.data) {
_this.$set(_this, 'activityConf', res.data)
// 数据赋值
if ($.isArray(res.data.rule)) {
_this.rulesList = res.data.rule
}
if (res.data.now_unix) {
_this.conf.now = res.data.now_unix * 1000
}
_this.shareInfo = res.data.share_copy
activeOverCheck(res.data.active_end_time * 1000, function () {
_this.activeOver()
})
_this.initActivity()
} else {
_this.activeOver()
}
},
complete: function () {
_this.confLoaded = true
}
})
},
activeOver: function () {
var conf = this.activityConf
conf.status = 2
conf.prompt_msg = '活动已结束'
},
startNowTimer: function () {
var _this = this
if (this.timerId) {
clearInterval(this.timerId)
}
var func = function () {
_this.conf.now = _this.conf.now + 1000
}
func()
this.timerId = setInterval(func, 1000)
},
// 初始化
initActivity: function () {
var _this = this
this.startNowTimer()
var conf = this.activityConf
var now = this.now
console.log('活动时间:', this.calcTimeString(conf.active_start_time * 1000), '-->', this.calcTimeString(conf.active_end_time * 1000))
this.calcTipInfoText()
this.calcBallList()
document.title = conf.name
this.conf.header_pic = conf.pic || '/frontRouter/pc/activity/image/202402/header-banner-title@2x.png'
setTimeout(function () {
_this.resizeCallback()
}, 100)
},
calcCountdownText: function (t) {
var diff = 0
if (this.now < t) {
// 计算倒数计
diff = t - this.now
var lastTimeConf = this.calcLastTimeDiff(diff)
var days = lastTimeConf.days
var hours = lastTimeConf.hours
var minutes = lastTimeConf.minutes
var seconds = lastTimeConf.seconds
var hms = [this.add0(hours), this.add0(minutes), this.add0(seconds)].join(':')
var r = ''
if (days > 0) {
r = days + '天 ' + hms
} else {
r = hms
}
}
this.tipInfo.countdownText = r
return diff
},
calcTipInfoText: function () {
var _this = this
var conf = this.activityConf
var status = conf.status // 状态 0-抽奖状态 1-未开始(倒计时) 2-根据prompt_msg展示文案
if (this.tipInfo.timerId) {
clearInterval(this.tipInfo.timerId)
}
if (status === 1) {
var func = function () {
var diff = _this.calcCountdownText(conf.lottery_start_unix * 1000)
if (diff <= 0) {
clearInterval(_this.tipInfo.timerId)
_this.activityConf.status = 0
_this.calcTipInfoText()
}
}
func()
this.tipInfo.timerId = setInterval(func, 1000)
this.tipInfo.countdown = true
} else {
this.tipInfo.countdown = false
}
this.tipInfo.text = conf.prompt_msg
},
startChou: function () {
var conf = this.activityConf
if (!this.hasLogin) {
return this.toLogin()
}
if (conf.status === 1) {
return toastFn('活动未开始', 2000)
}
if (conf.status >= 2) {
return
}
if (this.coinCount < conf.cost) {
return toastFn('剑鱼币余额不足', 2000)
}
// 二次确认
this.dialog.confirm = true
},
confirmChou: function () {
var _this = this
this.loading = true
this.dialog.confirm = false
this.startAnimate()
$.ajax({
url: '/publicapply/activity/day/raffle',
type: 'post',
data: {
id: this.activityId
},
success: function (res) {
if (res && res.error_code === 0 && res.data) {
// 动画最少执行3s
_this.stopAnimateDelay(_this.animateMinDelay, function () {
_this.showSuccessDialog(res.data)
_this.ajaxActiveStatus()
_this.ajaxList()
_this.ajaxCoinCount()
})
} else {
_this.stopAnimateDelay(_this.animateMinDelay, function () {
toastFn(res.error_msg || '请求失败', 2000)
})
}
},
error: function () {
_this.stopAnimateDelay(_this.animateMinDelay)
},
complete: function () {
_this.loading = false
}
})
},
ajaxList: function () {
var _this = this
$.ajax({
url: '/publicapply/activity/day/list',
type: 'POST',
data: {
id: this.activityId
},
success: function (res) {
if (res && $.isArray(res.data)) {
_this.rewardList = res.data.map(function (v) {
var desc = ''
if (v.attribute > 0) {
// 第三方
desc += '兑换码:'+ v.code +'
'
desc += '兑换截止日期:'+ v.ex_end_time.split(' ')[0] +'
'
} else {
desc += v.notes
}
return {
attribute: v.attribute,
code: v.code,
create_time: v.create_time,
ex_end_time: v.ex_end_time,
name: v.name,
url: v.url,
pic: v.pic,
rewardText: v.name,
receiveTime: v.create_time,
desc: desc,
}
})
}
}
})
},
showSuccessDialog: function (info) {
var _this = this
$('.reward-img > img').attr('src', info.pic)
var textArr = []
textArr.push('恭喜您成功获得' + info.name)
if (info.attribute > 0) {
// 第三方
textArr.push('兑换码:' + info.redeemCode)
textArr.push('兑换截止日期: ' + info.redeemDeadline)
$('.active-tip-success-content .activity-red-button').text('复制兑换码,去兑换').on('click', function () {
closeDialog()
toastFn('复制成功', 1000)
_this.copyText(info.redeemCode)
setTimeout(function () {
window.open(info.url)
}, 1000)
})
} else {
textArr.push(info.subtitle)
$('.active-tip-success-content .activity-red-button').text('去查看').on('click', function () {
closeDialog()
window.open(info.url)
})
}
$('.reward-float-tip').show().find('.float-tip-content').text(info.label)
$('.reward-success-text').html(textArr.join('
'))
showDialogOfType('success')
},
startAnimate: function () {
console.time('动画执行时间')
this.animateTimestamp = Date.now()
this.animateDebounce = true
},
stopAnimate: function () {
this.animateDebounce = false
},
// 最少动画执行delay毫秒
stopAnimateDelay: function (delay, callback) {
if (!delay) {
delay = 3000
}
console.log('动画最小执行时间:%sms', delay)
var _this = this
var now = Date.now()
var diff = now - this.animateTimestamp
var timeDelay = delay - diff
if (diff >= delay) {
this.stopAnimate()
console.timeEnd('动画执行时间')
console.log('距离动画开始时间:%sms,动画已执行时间大于最小执行时间,直接结束动画', diff)
callback && callback()
} else {
console.log('距离动画开始时间:%sms,需要补充动画时间:%sms', diff, timeDelay)
setTimeout(function () {
console.timeEnd('动画执行时间')
_this.stopAnimate()
callback && callback()
}, timeDelay)
}
},
calcBallList: function () {
var conf = this.activityConf
var prizeList = conf.prize
var ballConf = {
ballWidth: 80,
ballHeight: 80
}
if (!$.isArray(prizeList)) return
var calcBallList = ballUtils.init(prizeList, ballConf)
this.ballList = calcBallList
},
getScreenWidth: function () {
var width = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
return width;
},
calcScale: function () {
var screenWidth = this.getScreenWidth()
// scale计算
var scale = 1
if (screenWidth < 1920) {
scale = screenWidth/1920
}
if (scale < 0.85) {
scale = 0.85
}
if (scale > 1) {
scale = 1
}
this.pageDOM.ratio = scale
var contentWrapper = $('.page-container-content')
contentWrapper.css({ transform: 'scale('+scale+')' })
},
// 外层盒子高度和内容缩放后的实际高度相同
calcMainAppHeight: function () {
var mainApp = $('#main-app')
var contentWrapper = $('.page-container-content')
var ratio = this.pageDOM.ratio
mainApp.css({ height: contentWrapper.height()*ratio })
},
resizeCallback: function () {
this.calcScale()
this.calcMainAppHeight()
},
bindCalcScale: function () {
var _this = this
this.resizeCallback()
window.addEventListener('resize', function () {
_this.resizeCallback()
})
},
}
})