UNPKG

xx-common

Version:

the functions of yd common

765 lines (753 loc) 24.5 kB
import * as config from "../config/env"; // import store from "@/store/index"; import urls from "../server/urls"; import html2canvas from "html2canvas"; import axios from "axios"; const tool: any = { timeSpace: 0, //本地和服务器的时间间隔 version: "", fetchSKtime: 0, //获取sessionkey超时的重试次数 const: {}, // 运行时的一些常量 getUrlParam: function (name: string) { const reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)"); if (location.href.indexOf("?") < 0) return ""; let r = location.href.split("?")[1].match(reg); if (r != null) { let d = decodeURIComponent(r[2]); return tool.getIntValue(d); } return ""; }, getCookieValue: function (name: string) { let nameEQ = name + "="; let ca = document.cookie.split(";"); for (let i = 0; i < ca.length; i++) { let c = ca[i]; while (c.charAt(0) == " ") c = c.substring(1, c.length); if (c.indexOf(nameEQ) == 0) { return c.substring(nameEQ.length, c.length); } } return ""; }, getIntValue(value: string | null | undefined) { if ( value === "null" || value === "undefined" || value === null || value === undefined ) { return ""; } else if (value === "0") { return 0; } return value; }, createCookie(name: string, value: string | number | boolean, days: number) { let expires = ""; if (days) { var date: any = new Date(); date.setTime(date.getTime() + days * 24 * 60 * 60 * 1000); expires = "; expires=" + date.toGMTString(); } let cookieDomain = ""; if (name == "user_id" || name == "xyy") { cookieDomain = "; domain=51yund.com"; } document.cookie = name + "=" + encodeURIComponent(value) + expires + cookieDomain + "; path=/"; }, getYdUserKey: function (key: string) { let val = ""; val = _getLocalStorage(key) || sessionStorage.getItem(key); val = tool.getIntValue(val); if (["user_id", "xyy"].indexOf(key) > -1) { let _key = key == "xyy" ? "sid" : key; let ck_val = tool.getIntValue(tool.getCookieValue(_key)); if (ck_val && ck_val != val) { val = ck_val; localStorage.removeItem(key); } } if (!val) { val = tool.getUrlParam(key); } return val; }, // 本地持久化存储 setStorage(name: string, value: string, expires: any) { if (window.ydStorage) { window.ydStorage.setItem(name, value, expires); } else { localStorage.setItem(name, value); } }, //获取公共数据来源 getCommonValue: function (str: string) { if (!tool[str]) { let u: any = window.navigator.userAgent.toLocaleLowerCase(); tool[str] = "other"; if (str === "appSource") { //app来源(Android/ios/other) if (u.indexOf("android") > -1 || u.indexOf("adr") > -1) { tool[str] = "android"; } else if (u.indexOf("iphone") != -1 || u.indexOf("ipad") != -1) { tool[str] = "ios"; } } else if (str === "appType") { //app类型(wx/qq/yuedong/other) if (u.indexOf("yuedong") != -1) { tool[str] = "yuedong"; } else if (u.indexOf("micromessenger") != -1) { tool[str] = "wx"; } else if (u.indexOf("qq") != -1) { tool[str] = "qq"; } } else if (str === "sysVersion") { //操作系统版本 if (u.indexOf("android") != -1) { tool[str] = u.match(/android\s([0-9.]*)/)[1]; } else if (u.indexOf("iphone") != -1 || u.indexOf("ipad") != -1) { tool[str] = u.match(/cpu iphone os (.*?) like mac os/)[1]; } } } return tool[str]; }, /** * 检查ua中是否存在某些值 * @param {String} source 唯一标识字段 * @param {Long String} params 长参数 * */ checkUserAgent: function (source: string | number, ...params: any[]) { if (tool.const[source] != undefined) return tool.const[source]; tool.const.USER_AGENT = tool.const.USER_AGENT || window.navigator.userAgent.toLocaleLowerCase(); tool.const[source] = params.some((item) => { return tool.const.USER_AGENT.indexOf(String(item)) != -1; }); return tool.const[source]; }, isYuedong: function () { return tool.checkUserAgent("isYuedong", "yuedong"); }, isAndroidWeb: function () { return tool.checkUserAgent("isAndroidWeb", "android"); }, isIosWeb: function () { return tool.checkUserAgent("isIosWeb", "iphone", "ipad"); }, isWeixin: function () { return tool.checkUserAgent("isWeixin", "micromessenger"); }, // 是否在悦健身 isYdFitness: function () { return tool.checkUserAgent("isYdFitness", "yd_fitness"); }, // 微信小程序 isWxMiniApp: function () { if (window.__wxjs_environment === "miniprogram") { return true; } return tool.checkUserAgent("isWxMiniApp", "miniProgram"); }, // getSessionKey: function ( // userId: string | number, // xyy: string, // cb: (arg0: boolean) => void // ) { // var param = { user_id: userId, xyy: xyy }; // return window.$http // .post(urls.getsskey, param, true) // .then(function (res: { // code: number; // session_key: any; // session_ttl: any; // }) { // if (res.code === 0) { // let sessionkey = res.session_key; // if (sessionkey) { // tool.fetchSKtime = 0; //获取成功之后把fetchSKtime还原 // //存值的时候先存store,再存localStorage,存store为了取值更快,存storage为了看方便 // store.dispatch("saveCommonValue", { // key: "session_key", // value: sessionkey, // }); // tool.setStorage("session_key", sessionkey, res.session_ttl); // store.dispatch("saveCommonValue", { // key: "user_id", // value: userId, // }); // localStorage.setItem("user_id", userId); // store.dispatch("saveCommonValue", { key: "xyy", value: xyy }); // localStorage.setItem("xyy", xyy); // } // let hasLogin = userId == 0 ? false : true; // if (cb) cb(hasLogin); // return sessionkey; // } else if (res.code !== 7007) { // //userId和xyy不匹配或其它异常情况,最常见的场景是首次进来时,用户之前本地存储的xyy过期,7007的情况在http层统一处理 // tool.toLogin(); // } // }); // }, //简化版js节流,默认2s内只能点击一次 throttle: function (callback: () => void, duration = 2000) { let lastTime = tool.lastTime || 0; let now = new Date().getTime(); if (now - lastTime > duration) { callback(); tool.lastTime = now; } }, //记录上报(访问来源上报、错误上报) reportCmd: function (data: any) { window.$http.postOnly(config.logPath + "/sport/report", data); }, // 上报错误信息 postErrLog( data: { platform?: string; app_source?: any; app_type?: any; local_path: string; local_url: string; package_name: string; app_version?: string; system_version?: any; err_msg?: string; req_params?: any; req_uri?: any; }, cmdName: string ) { let hosts = location.host; if ( (hosts.indexOf("localhost") > -1 || hosts.indexOf("test") > -1) && !config.logFlag.dev ) { return; } let param = { user_id: tool.getYdUserKey("user_id") || 0, cmd: cmdName, device_id: "yuedongweb", data: JSON.stringify(data), }; tool.reportCmd(param); }, $throwJS(data: any) { //抛出js异常 let obj: any = { //公共部分 platform: "web", app_source: tool.getCommonValue("appSource"), app_type: tool.getCommonValue("appType"), local_path: location.pathname, local_url: location.href, package_name: config.logFlag.packageName, app_version: tool.version, system_version: tool.getCommonValue("sysVersion"), }; Object.assign(obj, data); let filterJsErr = []; if (config.filterErr && config.filterErr.length > 0) { filterJsErr.push(...config.filterErr); } if (filterJsErr.indexOf(obj.err_msg) > -1) return; let cmd_name = "vue_jserr"; if (obj.err_msg && obj.err_msg.indexOf("http") > -1) { cmd_name = "vue_reserr"; //reserr表示资源加载异常(resource error) } tool.postErrLog(obj, cmd_name); }, // 抛出请求异常 $throw(err: string, info: any, uri: any, response: any) { let obj: any = { local_url: location.href, local_path: location.pathname, err_msg: err + "", package_name: config.logFlag.packageName, req_params: info, req_uri: uri, }; if (response) { //返回值结构体异常 obj.response = response; } let filterErr = config.filterErr; if (filterErr && filterErr.indexOf(obj.err_msg) > -1) return; tool.postErrLog(obj, "vue_reqerr"); }, //事件上报(比如记录某个按钮点击了多少次,某个页面访问了多少次) eventBiz: function (data: any) { let param = { detail: data }; return window.$http.post(config.logPath + "/ydlog/event", param, true); }, //去登录 toLogin: function (backUrl: any) { localStorage.removeItem("session_key"); localStorage.removeItem("xyy"); tool.createCookie("user_id", "", -1); tool.createCookie("xyy", "", -1); tool.createCookie("sid", "", -1); let envAgent = ""; let userAgent: any = window.navigator.userAgent; userAgent = userAgent.toLocaleLowerCase(); if (userAgent.indexOf("yuedong") != -1) { envAgent = "app"; } else if (userAgent.indexOf("micromessenger") != -1) { envAgent = "wx"; } else { envAgent = "qq"; } if (envAgent === "app") { //判断是否悦动app tool.eventBiz("188:3:1").then(() => { //跳转客户端登录上报 let jumpUrl = config.jumpPath + "/local_call?local_action=login"; location.href = jumpUrl; }); } else { //跳转授权登录 let cbUrl = backUrl ? backUrl : location.href; cbUrl = encodeURIComponent(cbUrl); // cbUrl = _clearUlrData(cbUrl); if (userAgent.match(/WeiBo/i) == "weibo") { location.href = `${config.ssoPath}/v${ config.appVersion || 1 }/user/login?appid=102&cburl=${cbUrl}`; return; } if (config.appId) { //如果配置了appid就走新的sso登录,否则还是走老的 location.href = `${config.ssoPath}/v${ config.appVersion || 1 }/user/login?appid=${config.appId}&cburl=${cbUrl}`; } else { location.href = config.ssoPath + "/get_tickets?cburl=" + cbUrl + "&lg_way=" + envAgent; } } }, iframeLocalCall(url: string) { /** * ios 如果我们连续 2 个 js 调 native,连续2次改document.location的话,在app中, * 只能截获后面那次请求,前一次请求由于很快被替换掉,所以被忽略掉了,前一次请求返回数据丢失。 * 故换成iframe 来实现调用 * */ var iFrame: any; iFrame = document.createElement("iframe"); iFrame.setAttribute("src", url); iFrame.setAttribute("style", "display:none;"); iFrame.setAttribute("height", "0px"); iFrame.setAttribute("width", "0px"); iFrame.setAttribute("frameborder", "0"); document.body.appendChild(iFrame); // 发起请求后这个 iFrame 就没用了,所以把它从 dom 上移除掉 iFrame.parentNode.removeChild(iFrame); iFrame = null; }, // 获取浏览器定位 // getBrowserPosition(callback: (arg0: string) => void) { // if (!AMap) { // callback("定位发生未知错误"); // } // const map = new AMap.Map("container", { // resizeEnable: true, // }); // map.plugin("AMap.Geolocation", function () { // const geolocation = new AMap.Geolocation({ // enableHighAccuracy: true, //是否使用高精度定位,默认:true // timeout: 10000, //超过10秒后停止定位,默认:无穷大 // zoomToAccuracy: true, // buttonPosition: "RB", // }); // map.addControl(geolocation); // geolocation.getCurrentPosition(); // AMap.event.addListener( // geolocation, // "complete", // (data: { position: { getLng: () => any; getLat: () => any } }) => { // let obj = { // lng: data.position.getLng(), // lat: data.position.getLat(), // }; // callback(obj); // } // ); // AMap.event.addListener(geolocation, "error", (data: { message: any }) => { // let str = ""; // switch (data.message) { // case "Geolocation permission denied.": // str = "浏览器阻止了定位操作"; // break; // case "Get geolocation failed": // str = "无法获得当前位置"; // break; // case "Get geolocation time out": // str = "定位超时,请重试"; // break; // default: // str = "定位发生未知错误,请检查您的设备"; // break; // } // callback(str); // }); // }); // }, //yd支付 ydPay: function (param: any) { // 使用方法: // let obj = { // m_iUserId:'', //非必填,若无时不传 // m_sWxPayAuthUrl: '', //非必填,若无时不传 // m_iPayId:'', // m_sPaySource:'', // m_iPayFee:'', // m_sPayTitle:'', // m_sPayCbUrl:'', // } // tool.ydPay(obj); let obj: any = { m_iPayCheeck: 0, m_iNoCredit: 0, m_CbShowYdCash: 1, m_CbBusiness: "", m_iUserId: tool.getYdUserKey("user_id"), m_sWxPayAuthUrl: "http://payapi.51yund.com/wx_pay/wxpublic/php/api/wxpay_auth.php", }; if (!obj.m_iUserId) { tool.toLogin(); return window.global.toast("登录失效,请重新登录再试"); } Object.assign(obj, param); var payUrl = "https://circle.51yund.com/pay/index"; var params = "?user_id=" + obj.m_iUserId + "&order_id=" + obj.m_iPayId + "&pay_source=" + obj.m_sPaySource + "&fee=" + obj.m_iPayFee + "&title=" + encodeURIComponent(obj.m_sPayTitle) + "&cb_url=" + encodeURIComponent(obj.m_sPayCbUrl) + "&pay_check=" + obj.m_iPayCheeck; params = params + "&no_credit=" + obj.m_iNoCredit; params = params + "&business=" + obj.m_CbBusiness; params = params + "&show_yd_cash=" + obj.m_CbShowYdCash; var isShare = tool.getUrlParam("is_share") || tool.getCookieValue("is_share"); var isPlatFormLogin = tool.getUrlParam("is_platform_login"); if (isShare || isPlatFormLogin) { params = params + "&is_share=true"; } //添加协议 let curProtocol = document.location.protocol; if (curProtocol.indexOf("https") != -1) { //https params = params + "&https=1"; } else { params = params + "&https=0"; } if (tool.isWeixin()) { var wxPayUrl = obj.m_sWxPayAuthUrl + params; window.location.href = wxPayUrl; return; } // PC扫码支付 if ( !navigator.userAgent.match( /Android|BlackBerry|iPhone|iPad|iPod|Opera Mini|IEMobile/i ) ) { var pcUrl = "https://circle.51yund.com/pay/pc"; window.location.href = pcUrl + params; return; } window.location.href = payUrl + params; }, /** * 上传base64图片到七牛 * @param {String} data.base64 base64图片 * @param {String} data.origin 七牛地址 * @param {String} data.source 图片source * @param {Function} data.success 成功回调 * @param {Function} data.fail 失败回调 */ uploadQiniuBase64: function (data: { base64: string; source: any; fail: () => void; success: (arg0: { orig_url: any; thumb_url: any; name: any }) => void; origin: any; }) { // 去base64逗号之后的内容 if (data.base64.indexOf("base64,") !== -1) { data.base64 = data.base64.split("base64,")[1]; } const getToken = function () { let param = { source: data.source }; window.$http .post("/sport/qiniu_uptoken", param) .then((res: { code: number; up_token: any; photo_id: any }) => { if (res.code === 0) { let upToken = res.up_token; let photoId = res.photo_id; let obj = { name: photoId + ".jpg", token: upToken, file: data.base64, }; uploadFile(obj); } else { data.fail(); } }); }; const getPicUrl = function (obj: { name: any }) { let param = { user_id: tool.getYdUserKey("user_id"), filename: obj.name, source: data.source, }; window.$http .post("/sport/get_qiniu_url", param) .then((res: { code: number; orig_url: any; thumb_url: any }) => { if (res.code === 0) { let imgdata = { orig_url: res.orig_url, thumb_url: res.thumb_url, name: obj.name, }; data.success(imgdata); } else { data.fail(); } }); }; const uploadFile = function (obj: any) { axios({ url: `https://${data.origin}/putb64/-1`, data: obj.file, method: "POST", headers: { "Content-Type": "application/octet-stream", Authorization: `UpToken ${obj.token}`, }, }).then((res: { data: { code: number } }) => { if (res.data.code === 0) { getPicUrl(obj); } else { data.fail(); window.global.toast("图片上传失败,请重试"); } }); }; getToken(); }, /** * 比较版本号大小 * @param {String} v1 v1版本号 * @param {String} v2 v2版本号 * @param {object} options {lexicographical: true, zeroExtend: true}; * lexicographical 按字典顺序而不是按顺序比较版本字符串的每个部分,这允许后缀如“ b”或“ dev”,但将导致“ 1.10”被认为小于“ 1.2” * zeroExtend 如果一个版本字符串的部分少于另一版本,则更改结果。 在这种情况下,较短的字符串将用“零”部分填充,而不是被认为较小 * @returns {number} -1: (v1<v2), 0: (v1=v2), 1: (v1>v2) */ versionCompare: function ( v1: string, v2: string, options: { lexicographical: any; zeroExtend: any } ) { let lexicographical = options && options.lexicographical, zeroExtend = (options && options.zeroExtend) || true, v1parts: any = v1.split("."), v2parts: any = v2.split("."); function isValidPart(x: string) { return (lexicographical ? /^\d+[A-Za-z]*$/ : /^\d+$/).test(x); } if (!v1parts.every(isValidPart) || !v2parts.every(isValidPart)) { return -1; } if (zeroExtend) { while (v1parts.length < v2parts.length) v1parts.push("0"); while (v2parts.length < v1parts.length) v2parts.push("0"); } if (!lexicographical) { v1parts = v1parts.map(Number); v2parts = v2parts.map(Number); } for (let i = 0; i < v1parts.length; ++i) { if (v2parts.length == i) { return 1; } if (v1parts[i] == v2parts[i]) { continue; } else if (v1parts[i] > v2parts[i]) { return 1; } else { return -1; } } if (v1parts.length != v2parts.length) { return -1; } return 0; }, html2base64Img(node: any) { function uploadBase64(base64: string) { return new Promise((resolve, reject) => { tool.uploadQiniuBase64({ base64: base64, origin: "upload.qiniup.com", source: "topic_photo", success: (res: { orig_url: any }) => { let url = res.orig_url; setTimeout(() => resolve({ url, base64 })); }, fail: () => { reject(); }, }); }); } function initBase64Img(el: any) { let node = el; let w = node.clientWidth; let h = node.clientHeight; let canvas = document.createElement("canvas"); let canvasRadio = 2; canvas.width = w * canvasRadio; canvas.height = h * canvasRadio; canvas.style.width = w * canvasRadio + "px"; canvas.style.height = h * canvasRadio + "px"; let context = canvas.getContext("2d"); let top = node.offsetTop; //然后将画布缩放,将图像放大2倍画到画布上 context && context.scale(canvasRadio, canvasRadio); return html2canvas(node, { canvas: canvas, allowTaint: false, taintTest: true, useCORS: true, dpi: window.devicePixelRatio, width: w, height: h, top, background: "#fff", scale: 4, } as any).then((canvas) => { let context: any = canvas.getContext("2d"); // 【重要】关闭抗锯齿 context.mozImageSmoothingEnabled = false; context.webkitImageSmoothingEnabled = false; context.msImageSmoothingEnabled = false; context.imageSmoothingEnabled = false; // document.documentElement.style.position = ''; let dataUrl = canvas.toDataURL("image/png"); return Promise.resolve(dataUrl); }); } return initBase64Img(node).then((base64) => uploadBase64(base64)); }, }; export const injectTool = () => { let timeSpace = localStorage.getItem("timeSpace"); if (timeSpace) { tool.timeSpace = parseInt(timeSpace); } tool.version = _getVersion(); tool.supportWebpFlag = _webpSupportHander(); if (typeof window.tool == "undefined") { window.tool = tool; } }; function _getVersion() { //客户端首次进来会在url上带V,ios同时还会在cookie上存V(ios老版本存version) // 兼容Android 版本号为ver let version = tool.getUrlParam("v") || tool.getCookieValue("v") || tool.getUrlParam("ver"); if (!version || version == "null") { version = tool.getUrlParam("version") || tool.getCookieValue("version"); if (!version || version == "null") { version = ""; } } return version; } // 判断是否支持webp格式 function _webpSupportHander() { let supportWebp = false; try { document.createElement("canvas").getContext("2d"); supportWebp = document .createElement("canvas") .toDataURL("image/webp") .indexOf("data:image/webp") == 0; } catch (e) { let image = new Image(); image.onload = function () { // 图片加载成功且宽度为1,那么就代表支持webp了,因为这张base64图是webp格式。如果不支持会触发image.error方法 if (image.width == 1) { supportWebp = true; } }; // 一张支持alpha透明度的webp的图片,使用base64编码 image.src = "data:image/webp;base64,UklGRkoAAABXRUJQVlA4WAoAAAAQAAAAAAAAAAAAQUxQSAwAAAARBxAR/Q9ERP8DAABWUDggGAAAABQBAJ0BKgEAAQAAAP4AAA3AAP7mtQAAAA=="; } return supportWebp; } //跳转登录时去掉url上的user_id、xyy和is_login function _clearUlrData(cbUrl: string) { if (cbUrl.indexOf("?") == -1) return encodeURIComponent(cbUrl); let [url, query] = cbUrl.split("?"); let arr = ["user_id", "xyy", "is_login"]; for (let i = 0; i < arr.length; i++) { if (query.indexOf(arr[i]) > -1) { let reg = new RegExp("(^|&)" + arr[i] + "=[^&]*", "g"); query = query.replace(reg, ""); } } if (query) { if (query.indexOf("&") === 0) { //最开始一位是&时去掉 query = query.slice(1); } url += "?" + query; } return encodeURIComponent(url); } function _getLocalStorage(name: string) { if (window.ydStorage) { return window.ydStorage.getItem(name); } else { let data = localStorage.getItem(name) || ""; let obj: any = {}; try { obj = JSON.parse(data); } catch (err) { return data; } return obj && obj.value ? obj.value : data; } }