// 常用的方法 import gsap from 'gsap' import { Howl, Howler } from 'howler'; import { createVNode, render } from 'vue' // 初始化 const btnEnable = ref(true) //按钮可点击状态 // 音效初始化 const sound = new Howl({ src: [new URL(`@/assets/media/click.mp3`, import.meta.url).href] }); // 背景音乐 export function createBGM() { const musicNode = createVNode( 'div', { class: 'music-icon', id: 'musicBtn', onClick: () => { let auduoEle = document.querySelector("#audio") let musicBox = document.querySelector("#musicBtn") if (auduoEle.paused) { auduoEle.play() audioAni.play() musicBox.classList.add('music-on') musicBox.classList.remove('music-off') } else { gsap.set('#musicBtn', { rotation: '0deg' }) auduoEle.pause() audioAni.pause() musicBox.classList.add('music-off') musicBox.classList.remove('music-on') } }, }, ) const audioNode = createVNode( 'audio', { class: 'audio-icon', id: 'audio', src: new URL(`@/assets/media/bgm.mp3`, import.meta.url).href, autoPlay: true, loop: true, }, ) render(musicNode, document.body); render(audioNode, document.querySelector("#musicBtn")); document.querySelector("#musicBtn").classList.add('music-on') let audioAni = gsap.timeline({ paused: true }) audioAni.to('#musicBtn', { duration: 10, rotation: "+=360", repeat: -1, ease: 'none' }) setTimeout(() => { audioAni.play() }, 1000) } //是否在微信环境 export function isWX() { var ua = window.navigator.userAgent.toLowerCase(); if (ua.match(/MicroMessenger/i) == 'micromessenger') { return true; } else { return false; } } // 判断是否移动端 export function isMobile() { let userAgentInfo = navigator.userAgent; let Agents = ['Android', 'iPhone', 'SymbianOS', 'Windows Phone', 'iPad', 'iPod']; let getArr = Agents.filter(i => userAgentInfo.includes(i)); return getArr.length ? true : false; } // 判断微博环境 export function isWeibo() { var ua = window.navigator.userAgent.toLowerCase(); if (ua.match(/WeiBo/i) == "weibo") { console.log("微博环境"); return true; } else { console.log("非微博环境"); return false; } } // 判断Safari环境 export function isSafari() { var ua = window.navigator.userAgent.toLowerCase(); if ((/Safari/.test(navigator.userAgent) && !/Chrome/.test(navigator.userAgent))) { console.log("Safari环境"); return true; } else { console.log("非Safari环境"); return false; } } //是否为安卓 export function isAndriod() { var naviga = navigator.userAgent; if (naviga.indexOf('Android') > -1 || naviga.indexOf('Adr') > -1) { console.log("Andriod环境"); return true; } else { console.log("非Andriod环境"); return false; } } //路径获取关键字 export function getQueryString(name) { //截取页面传递字符串 var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)"); var r = window.location.search.substr(1).match(reg); if (r != null) return unescape(r[2]); return null; } // 判断全面屏和非全面屏,true为全面屏 export function judgeBigScreen() { let result = false; const rate = window.screen.height / window.screen.width; let limit = window.screen.height == window.screen.availHeight ? 1.8 : 1.65; // 临界判断值 // window.screen.height为屏幕高度 // window.screen.availHeight 为浏览器 可用高度 if (rate > limit) { // console.log("全面屏"); result = true; return result; } // console.log("非面屏"); return result; } // 获取url html名称 export function getUrlHtml() { //获取url地址 var ts_href = window.location.href; var ts_mainText = ""; //获取地址最后一个“/”的下标 var ts_indexof = ts_href.lastIndexOf("/"); //获取地址“/”之后的的内容 var ts_indexText = ts_href.substring(ts_indexof + 1); //获取地址“.html”的下标 var ts_htmlBeforeText = ts_indexText.indexOf(".html"); //获取 “/”到".html"之间的内容 ts_mainText = ts_indexText.substring(0, ts_htmlBeforeText); console.log("当前入口:", ts_mainText); return ts_mainText; } // 获取cookie中的值 export function getSetCookie(name, value, options) { if (typeof value != 'undefined') { options = options || {}; if (value === null) { value = ''; options = this._extend({}, options, true); options.expires = -1; } var expires = ''; if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) { var date; if (typeof options.expires == 'number') { date = new Date(); date.setTime(date.getTime() + options.expires * 24 * 60 * 60 * 1000); } else { date = options.expires; } expires = '; expires=' + date.toUTCString(); } var path = options.path ? '; path=' + options.path : ''; var domain = options.domain ? '; domain=' + options.domain : ''; var secure = options.secure ? '; secure' : ''; document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join(''); } else { var cookieValue = null; if (document.cookie && document.cookie != '') { var cookies = document.cookie.split(';'); for (var i = 0; i < cookies.length; i++) { // var cookie = $.trim(cookies[i]); var cookie = cookies[i].trim(); if (cookie.substring(0, name.length + 1) == name + '=') { cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); break; } } } return cookieValue; } } // 安卓机型自动播放音乐 export function BGMAutoPlayMgr(url) { this.audioContext = new (window.AudioContext || window.webkitAudioContext || window.mozAudioContext)(); this.sourceNode = null; this.buffer = null; this.isPlayingBGM = false; this.toggleBGM = function () { if (typeof this.sourceNode == 'object') { if (this.isPlayingBGM) { this.sourceNode.stop(); this.isPlayingBGM = false; } else this._playSourceNode(); } } this._playSourceNode = function () { const audioContext = this.audioContext; audioContext.resume(); const _sourceNode = audioContext.createBufferSource(); _sourceNode.buffer = this.buffer; _sourceNode.loop = true; _sourceNode.connect(audioContext.destination); _sourceNode.start(0); this.sourceNode = _sourceNode; this.isPlayingBGM = true; } let loadAndAutoPlay = (audioUrl) => { const audioContext = this.audioContext; const xhr = new XMLHttpRequest(); xhr.open('GET', audioUrl, true); xhr.responseType = 'arraybuffer'; xhr.onreadystatechange = () => { if (xhr.status < 400 && xhr.status >= 200 && xhr.readyState === 4) { audioContext.decodeAudioData(xhr.response, buffer => { this.buffer = buffer; WeixinJSBridge.invoke("getNetworkType", {}, () => this._playSourceNode()); }); } } xhr.send(); } loadAndAutoPlay(url); loadAndAutoPlay = null; } // 金管家获取openid及openToken export function getJGJId() { return new Promise(resolve => { // 获取openid PALifeOpen.getOpenId( { appId: '1aeedce2a31340e591a5d64080d6105b' // 商户编号,区分⽣产和测试环境商户编号 }, rsp => { // 调⽤接⼝成功后的回调函数 console.log('success', rsp.data); store.state.openId = rsp.data.openId store.state.openToken = rsp.data.openToken if (rsp.ret == 0) { store.state.openId = rsp.data.openId store.state.openToken = rsp.data.openToken const data = { id: store.state.openId, token: store.state.openToken }; resolve(data); // console.log(`获取到金管家openid时间:${Math.abs(s_t - new Date().getTime())}`); } if (rsp.ret == -1) { console.log(JSON.stringify(rsp)); } }, e => { // 调⽤接⼝异常的回调函数 console.log('failed', e); } ) }) } // 金管家内部埋点 export function addPoint(page, spage, des = {}) { const activityId = process.env.VUE_APP_ACTIVITYID; PALifeOpen.invoke( "device", "addRecord", { eventId: `499${page}-${activityId}`, //必填,根据需求 labelId: `499${page}${spage}-${activityId}`, //必填,根据需求 // 扩展参数 parameters: { ext: JSON.stringify(des) } }, // 调用接口成功后的回调函数 // alert(JSON.stringify(rsp)) rsp => console.debug("success ", rsp), // 调用接口异常的回调函数 e => console.debug("failed ", e), { timeout: 86400000 } ); return this; } // 百度统计埋点 export function addPointByBd(des) { _hmt && _hmt.push(["_trackEvent", `${des}`, `${des} success`]); return this; } // 防抖函数 export function debounceTap(target, callbacks, timeScale = 1) { if (!btnEnable.value) return false btnEnable.value = false; let createAni = () => { let timeline = new gsap.timeline({ onStart: () => { sound.play() }, onComplete: () => { callbacks && callbacks(); btnEnable.value = true; timeline.kill(); } }); timeline .to(target, { duration: timeScale * 0.2, scale: 0.8, }) .to(target, { duration: timeScale * 0.5, scale: 1, }) } createAni(); } // 节流函数 export function throttle(fn, wait) { let inThrottle = false return (...args) => { // @ts-ignore const context = this if (!inThrottle) { inThrottle = true fn.apply(context, args) setTimeout(() => { inThrottle = false }, wait) } } } // vite环境引用图片 export function imgUrl(url) { return new URL(`../assets/images/${url}`, import.meta.url).href } // 计算两个日期之间的天数(开始日期,结束日期) export function getDaysBetween(date1, date2) { let day1 = new Date(date1.join('-')) let day2 = new Date(date2.join('-')) let oneDay = 24 * 60 * 60 * 1000; let diffDays = Math.round(Math.abs((day2 - day1) / oneDay)); return diffDays; } // 计算星座 export function getAstro(month, day) { var s = "魔羯水瓶双鱼牡羊金牛双子巨蟹狮子处女天秤天蝎射手魔羯"; var arr = [20, 19, 21, 21, 21, 22, 23, 23, 23, 23, 22, 22]; return s.substr(month * 2 - (day < arr[month - 1] ? 2 : 0), 2); } // 洗牌算法:打乱数组顺序 export function FYShuffle(arr) { let len = arr.length; while (len > 1) { let rand = Math.floor(Math.random() * len); len--; [arr[len], arr[rand]] = [arr[rand], arr[len]] // 采用的数组的结构赋值 } return arr; } // 选出数组中出现次数最多的值 export function mostValue(arr) { // 创建一个空对象用于存储值及其出现的次数 let counter = {}; // 遍历数组中的每个元素 for (let i = 0; i < arr.length; i++) { // 如果值已经在counter对象中,增加其计数 // 如果值不在counter对象中,设置计数为1 if (counter[arr[i]]) { counter[arr[i]]++; } else { counter[arr[i]] = 1; } } // 找出出现次数最多的值及其出现的次数 let mostFrequentValue = null; let maxCount = 0; for (let key in counter) { if (counter[key] > maxCount) { mostFrequentValue = key; maxCount = counter[key]; } } // 返回出现次数最多的值和其出现的次数 return { value: mostFrequentValue, count: maxCount }; } // export h5plugin;