UNPKG

gxd-vue-library

Version:

依赖与element Ui插件库,聚福宝福利PC端插件库

914 lines (835 loc) 25.7 kB
'use strict'; const settings = require('./../../settings'); export const baseEnvTypeReg = /^(localhost)|(sandbox-)|(192\.168\.).*$/; import _ from "lodash" /** * @description 设置vuex缓存 * @param state * @param attr * @returns {*} */ export function setVuexCache(state, attr) { return new Promise((resolve, reject) => { if (state[attr] !== null) { if (settings['isOpenNoResultKey']) { resolve({data: state[attr]}) } else { resolve(state[attr]) } } else { let time = setInterval(() => { if (state[attr] !== null) { if (settings['isOpenNoResultKey']) { resolve({data: state[attr]}) } else { resolve(state[attr]) } clearInterval(time); } }, 100) } }); } /** * @description 获取host */ export function baseGetHost(){ let host = window.location.host; //设置开发环境 if (baseEnvTypeReg.test(host)) { host = settings.getBrandHost; } return host; } /** * @description 返回配置信息 * @param key {String|null} 查询关键字 * @returns {{any | null | Object}} */ export function getSetting(key=null){ if(!key) return settings; return settings[key] || null } /** * @description 检查变量类型 * @param obj * @returns {*} */ export function baseCheckVarType(obj) { let toString = Object.prototype.toString; let map = { '[object Boolean]': 'boolean', '[object Number]': 'number', '[object String]': 'string', '[object Function]': 'function', '[object Array]': 'array', '[object Date]': 'date', '[object RegExp]': 'regExp', '[object Undefined]': 'undefined', '[object Null]': 'null', '[object Object]': 'object', '[object Error]': 'error', '[object Promise]': 'promise' }; return map[toString.call(obj)]; } /** * @description 初始化请求对象 * @param obj * @returns {*|URLSearchParams} */ export function baseFormDataSendParam(obj) { let params = new URLSearchParams(); if (baseCheckVarType(obj) === 'object') { Object.keys(obj).map((key) => { if (baseCheckVarType(obj[key]) === 'object' || baseCheckVarType(obj[key]) === 'array' ) { params.append(key, JSON.stringify(obj[key])); } else { params.append(key, obj[key]); } }); return params; } return obj; } /** * @description 简单深拷贝 * @param json * @returns {any} */ export function baseCloneDeep(json) { if (baseCheckVarType(json) === 'object' || baseCheckVarType(json) === 'array' ) { return JSON.parse(JSON.stringify(json)); } return json; } /** * @description 检查对象或者数组是否为空 * @param obj * @return boolean */ export function baseIsEmpty(obj) { if (baseCheckVarType(obj) === 'array' || baseCheckVarType(obj) === 'object' ) { let str = JSON.stringify(obj); return str === '{}' || str === '[]'; } else { console.log('isEmpty.error', obj); throw new Error('只支持数组与JSON对象格式'); } } /** * @description 时间戳转年月日 * @param time {String|Number} 时间戳 (秒) */ export function baseJsDateToTime(time) { let date = new Date(Number(time) * 1000); let y = date.getFullYear(); let m = date.getMonth() + 1; m = m < 10 ? ('0' + m) : m; let d = date.getDate(); d = d < 10 ? ('0' + d) : d; let h = date.getHours(); h = h < 10 ? ('0' + h) : h; let minute = date.getMinutes(); let second = date.getSeconds(); minute = minute < 10 ? ('0' + minute) : minute; second = second < 10 ? ('0' + second) : second; return y + '-' + m + '-' + d + ' ' + h + ':' + minute + ':' + second; } /** * @description 检测查找数组是否在原数组中 * @param sourceArray 原数组 * @param findArray 查找数组 * @returns {boolean} */ export function baseInArray(sourceArray = [], findArray = []) { if (baseCheckVarType(sourceArray) === 'array' && baseCheckVarType(findArray) === 'array' ) { let temp = []; let finds = JSON.parse(JSON.stringify(findArray)); let findLen = finds.length; sourceArray.map(item => { if (baseCheckVarType(item) === 'array' || baseCheckVarType(item) === 'object') { item = JSON.stringify(item); } for (let i = 0; i < findLen; i++) { let find = finds[i]; if (baseCheckVarType(find) === 'array' || baseCheckVarType(find) === 'object') { find = JSON.stringify(find); } if (strict) { if (find === item) { temp.push(true); finds.splice(i, 1); break; } } else { if (find == item) { temp.push(true); finds.splice(i, 1); break; } } } }); return findArray.length === temp.length; } else { return false; } } /** * @description 计算两个小数相乘 * @param currentNum * @param targetNum * @returns {number} */ export function multiplyFloatNumber(currentNum, targetNum) { let m = 0, s1 = currentNum.toString(), s2 = targetNum.toString(); try {m += s1.split(".")[1].length;}catch (e) {} try {m += s2.split(".")[1].length;} catch (e) {} return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m); } /** * @description 计算两个小数相除 * @param currentNum * @param targetNum * @returns {number} */ export function divisionFloatNumber(currentNum, targetNum) { let t1 = 0, t2 = 0, r1, r2; try {t1 = currentNum.toString().split(".")[1].length} catch (e) {} try {t2 = targetNum.toString().split(".")[1].length} catch (e) {} r1 = Number(currentNum.toString().replace(".", "")); r2 = Number(targetNum.toString().replace(".", "")); return multiplyFloatNumber(r1 / r2, Math.pow(10, t2 - t1)); } /** * @description 把特定数组键值对中的值转化为真实值 * @example [{key: 'key1', value: '2341', value_type: 'number'},{key: 'key1', value: 'true', value_type: 'boolean'}] * @param items {Array} * @return {Array} */ export function AttrToTargetValues(items) { return items.map(item => { return AttrToTargetValue(item); }) } /** * @description 把特定键值对中的值转化为真实值 * @example {key: 'key1', value: '2341', value_type: 'number'} =》{key: 'key1', value_type: 2341, value_type: 'number'} * @param item {Object} * @param item.key {String} 键值 * @param item.value {String} 值 * @param item.value_type {String} 值类型,其值:number|object|array|string|null|boolean * @return {Object} */ export function AttrToTargetValue(item) { const toHandle = (data, type) => { let typeStr = '数组'; if (type === 'object') typeStr = '对象'; try { let json = JSON.parse(data.value); if (baseCheckVarType(json) === type) { return json; } else throw new Error(`数据类型不是${typeStr},你给的数据是:${data.value},期望的数据为:${typeStr}`); } catch (e) { throw new Error(`数据类型不是${typeStr},你给的数据是:${data.value},期望的数据为:${typeStr}`); } }; let temp = {key: item.key, value_type: item.value_type,}; switch (item.value_type) { case 'number': if (isNaN(Number(item.value))) throw new Error(`数据类型不是number,你给的数据是:${item.value},期望的数据为:'number'`); else temp['value'] = Number(item.value); break; case 'object': temp['value'] = toHandle(item, 'object'); break; case 'array': temp['value'] = toHandle(item, 'array'); break; case 'null': if (/^(null)$/.test(item.value)) temp['value'] = null; else throw new Error(`数据类型不是null,你给的数据是:${item.value},期望的数据为:'null'`); break; case 'boolean': if (/^(true|false)$/.test(item.value)) temp['value'] = item.value === 'true'; else throw new Error(`数据类型不是boolean,你给的数据是:${item.value},期望的数据为:'true|false'`); break; case 'string': temp['value'] = item['value']; break; default: temp['value'] = item['value']; } return temp } /** * @description 获取特定数组键值队的真实值 * @example items = [{key: 'key1', value: '2341', value_type: 'number'}, {key: 'key2', value: 'true', value_type: 'booleab'}] * @param items {Array} * @param key * @return {Object|null} */ export function getAttrKeyForValue(items, key) { let data = AttrToTargetValue(items); let select = data.filter(item => { return item.key === key; }) if (select.length > 0) return select[0]; else return null } /** * @description 把特定键值对中的值转化为字符串 * @example {key: 'key1', value: 234, value_type: 'number'} =》{key: 'key1', value_type: '234', value_type: 'number'} * @param item {Object} * @param item.key {String} 键值 * @param item.value {String} 值 * @param item.value_type {String} 值 * @return {Object} */ export function setAttrToValue(item) { switch (item.value_type) { case 'number': if (baseCheckVarType(item.value) !== 'number') throw new Error(`数据类型不是number,你给的数据是:${item.value},期望的数据为:'number'`); else item['value'] = String(item.value); break; case 'object': if (baseCheckVarType(item.value) === 'object') item['value'] = JSON.stringify(item['value']); else throw new Error(`数据类型不是object,你给的数据是:${item.value},期望的数据为:object`); break; case 'array': if (baseCheckVarType(item.value) === 'array') item['value'] = JSON.stringify(item['value']); else throw new Error(`数据类型不是array,你给的数据是:${item.value},期望的数据为:array`); break; case 'null': if (item['value'] === null) item['value'] = 'null'; else throw new Error(`数据类型不是null,你给的数据是:${item.value},期望的数据为:null`); break; case 'boolean': if (baseCheckVarType(item.value) === 'boolean') item['value'] = item['value'] ? 'true' : 'false'; else throw new Error(`数据类型不是boolean,你给的数据是:${item.value},期望的数据为:boolean`); break; case 'string': if (baseCheckVarType(item.value) !== 'string') { throw new Error(`数据类型不是string,你给的数据是:${item.value},期望的数据为:string`) } break; default: } return item } /** * @description 把特定数组键值对中的值转化为字符串 * @example [{key: 'key1', value: 2341, value_type: 'number'},{key: 'key1', value: true, value_type: 'boolean'}] * @param items {Object} * @return {Array} */ export function setAttrToValues(items){ return items.map(item => { return setAttrToValue(item); }) } /** * @description 点击列表某种图片进行预览共,改变当前预览列表位置从索引位开始 * @param images {Array} 图片数组 * @param index {Number} 索引值 * @return {Array} */ export function getForIndexPreviewImage(images, index) { let arr = baseCloneDeep(images) || []; let end = arr.splice(0, index); let temp = []; arr.concat(end).map(item => { temp.push(item) }); return temp } /** * @description 跳转打开新页面 * @param path {String} 路径 * @param $vm {Vue} Vue实例对象 */ export function toLink(path, $vm) { const routeUrl = $vm.$router.resolve({ path: path }); window.open(routeUrl.href, "_blank"); } /** * @description 支持EditX页面树转化为选中链接组件共功能 * @param data {Array} EditX 接口返回页面树 * @param appName {String} 应用名称 * @param appValue {String} 应用ID * @param appPath {String} 应用ID部署目录 * @param appCode {String} 小程序AP_ID * @param fixed_business_code {String} 应用使用模版信息 * @param appType {String} 平台类型 * 接口地址:http://sandbox-partners-apis.jufubao.cn/editx/v1/a3e8b499a07507a2/templates/tpX6OCiR8QvcU_bEVGgYs/pages/tree * @returns {{children: *, label: string, value: string}[]} */ export function getEditPagesTreeToPathArr( data, appName = '', appValue = '', appPath = '', appCode = '', fixed_business_code='', appType='' ) { let parentName = ''; let iconClassName = ''; if(appType === 'h5') iconClassName = 'iconH5'; if(appType === 'wxmp') iconClassName = 'iconWXMP'; return [{ label: appName, value: appValue, css:iconClassName, children: data.filter(item => { return item.children && item.children.length > 0 }).map(item => { let temp = []; let children = item.children.filter(one => { return one.children && one.children.length > 0 }); //文件夹 children.map(two => { if (two.children && two.children.length > 0) { if(two.name) parentName = two.name; else { parentName = two.label.split(' ')[0]; } two.children.map(three => { let path = `${three.route}`; if (path.indexOf('/') !== 0) { path = `/${path}`; } let file = three.label.split(' ')[0]; let reg = new RegExp(`/${file}/${file}`); path = path.replace(reg, `/${file}`); let val = path; let frontPath = path; if(appValue !== '0') { val = `@site_domain@/${appPath}${path}` frontPath = `/${appPath}${path}`; } let tData = { label: `${three.name || three.label.split(' ')[0]}`, value: `${val}`, page_id: three.value, //页面ID rootId: item.value, //文件包ID rootName: item.name || (item.label&&item.label.split(' ')[0]), parentId: two.value, //文件夹ID parentName: parentName, path: path, //页面访问路径 dir: appPath, //应用路径 appName, //应用名称 appValue, //应用ID aopen_app_code: appCode, //应用CODE frontPath: frontPath, //签订访问路径 fixed_business_code: fixed_business_code, //业务线(包含文件夹设置业务线和页面设置业务线) appType, // platform_id: appValue === '0'? -1: Number(appValue), //-1表示当前模版 platform_type: appType === 'h5'? 9 : (appType==='wxmp' ? 8:-1) //-1表示当前模版 } //通过应用ID或者模版ID获取组件设置参数 if(three.template_id) tData['ext_template_id'] = three.template_id; if(three.platform_id) tData['ext_platform_id'] = three.platform_id; temp.push(tData) }); } }); return { label: item.name || item.label.split(' ')[0], value: item.value, children: temp }; }), }]; } /** * @description 封装获取站点应用路由地址 * @param $vm {Vue} * @param $vm.getAllPlatformCatelogs {Function} 获取分类接口方法 * @param $vm.$message {Function} 提示方法 * @param cb {Function} 回调函数 * @param params {Object} 请求参数 */ export function getSiteRouter($vm, cb, params) { $vm.getAllPlatformCatelogs(params) .then(res => { let itemData = null; if(res.items) { itemData = res.items; } if(res.data && res.data.items) { itemData = res.data.items; } if (!itemData) { $vm.$message({ message: '您选择的站点无应用数据,请发布应用之后在进行配置!', type: 'error' }); cb([]); return } //有数据 let routerData = [] itemData.map(item => { if (item['children']) { let type = ''; if(item['type'] === 8) type = 'wxmp'; if(item['type'] === 9) type = 'h5'; routerData = routerData.concat(getEditPagesTreeToPathArr( item['children'], item['label'], item['value'], item['route'], item['aopen_app_code'], item['business_code'] || '', type )); } }); cb(routerData) }) .catch(res => { console.error(res); cb([]) }) } /** * @description 获取业务插件对象属性值 * @param attr {Array} 对象属性数组 * @param key {String} 键值名称 * @returns {null|*} */ export function getComponentAttr(attr = [], key) { if (baseCheckVarType(attr) !== 'array') return null; if (attr.length === 0) return null; let temp = attr.filter(item => { return item['key'] === key; }); if (temp.length === 0) return null; else return temp[0].value; } /** * @description json字符串转json对象 * @param str {String} */ export function stringJonsToJson(str) { if(baseCheckVarType(str) !== 'string') { console.error(`参数值:${str}, 非字符串json数据`); return {} } else { if(str === ''){ console.error(`参数值:${str}, 非字符串json数据`); return {}; } try{ return JSON.parse(str) } catch (e) { console.error(`参数值:${str}, 非字符串json数据`); return {} } } } /** * @description 自定义深拷贝 * @param any {Object|Array|Function|Date|RegExp|Map|Set|String} * @param isReference {Boolean} 方法是否进行引用 * @returns {*} */ export function customClone(any, isReference = true) { if (baseCheckVarType(any) === 'object') { // 拷贝对象 let o = {}; for (let key in any) { o[key] = customClone(any[key]) } return o; } else if (baseCheckVarType(any) === 'array') { // 拷贝数组 let arr = [] for (let i = 0, leng = any.length; i < leng; i++) { arr[i] = customClone(any[i]) } return arr; } else if (baseCheckVarType(any) === 'function') { // 拷贝函数 if(isReference) return any else return new Function('return ' + any.toString()).call(this) } else if (baseCheckVarType(any) === 'date') { // 拷贝日期 return new Date(any.valueOf()) } else if (baseCheckVarType(any) === 'regExp') { // 拷贝正则 return new RegExp(any) } else if (baseCheckVarType(any) === 'map') { // 拷贝Map 集合 let m = new Map(); any.forEach((v, k) => { m.set(k, this.customClone(v)) }); return m } else if (baseCheckVarType(any) === 'set') { // 拷贝Set 集合 let s = new Set(); for (let val of any.values()) { s.add(this.customClone(val)) } return s } return any; } /** * @description 获取所有扩张参数 * @param extPrefix {String} 扩张前缀字符串 * @param extKey {String} 返回键值 * @param params {Object} 提交数据 * @return {Object} */ export function getExtrasParams(extPrefix, extKey, params) { let extrasParamsReg = new RegExp(`^(${extPrefix}_)+.+$`); let temp = baseCloneDeep(params); temp[extKey] = {}; Object.keys(params).map(key=>{ if(extrasParamsReg.test(key)) { let k = key.replace(extPrefix + '_',''); temp[extKey][k] = params[key]; delete temp[key]; } }); temp[extKey] = JSON.stringify(temp[extKey]); return temp; } /** * @description 设置所有扩张参数 * @param extPrefix {String} 扩张前缀字符串 * @param extKey {String} 需要重置的对象键值 * @param params {Object} 提交数据 * @return {Object} */ export function setExtrasParams(extPrefix, extKey, params) { let temp = baseCloneDeep(params); if(params[extKey]) { let data = {}; try { data = JSON.parse(params[extKey]); }catch (e) {} Object.keys(data).map(key=>{ let k = `${extPrefix}_${key}`; temp[k] = data[key]; }) delete temp[extKey]; } return temp; } /** * @description 解析插件库名称 * @param appName {String} 插件库名称 * @param flag {Boolean} 是否返回业务组件标识 * @returns {string|[]} */ export function parsePackName(appName, flag = true) { let appNameArr = appName.split(''); let reg = /[A-Z]/; let temp = ''; let arr = []; appNameArr.map((item, index) => { if (reg.test(item)) { if (index === 0) temp = item; else { arr.push(temp); temp = item; } } else { temp += item; } if ((appName.length - 1) === index) arr.push(temp); }); if (flag) return `jufubao-${arr[1].toLocaleLowerCase()}`; else return arr; } /** * @description 动态加载vue文件 * @param asyncModule * @param name */ export function setModuleName(asyncModule, name) { return asyncModule.then((module) => { module.default.name = name; return _.cloneDeep(module.default) }) } export function isPlatform() { let ua = navigator.userAgent let isWindowsPhone = /(?:Windows Phone)/.test(ua) let isSymbian = /(?:SymbianOS)/.test(ua) || isWindowsPhone let isAndroid = /(?:Android)/.test(ua) let isFireFox = /(?:Firefox)/.test(ua) let isChrome = /(?:Chrome|CriOS)/.test(ua) let isTablet = /(?:iPad|PlayBook)/.test(ua) || (isAndroid && !/(?:Mobile)/.test(ua)) || (isFireFox && /(?:Tablet)/.test(ua)) let isPhone = /(?:iPhone)/.test(ua) && !isTablet var isHM = ua.indexOf('OpenHarmony') !== -1; var isPc = !isPhone && !isAndroid && !isSymbian && !isHM return { isTablet, isPhone, isAndroid, isPc, isChrome } } /** * @description 生产密码规则 * @param len {number} 生成密码长度 * @param specialLen {number} 使用N个特殊字符 * @param numLen {number} 使用N个数字字符 * @return {string} 返回随机密码字符串 */ export function createPwd(len=20 ,specialLen=0, numLen=0){ let num = '3456789'.split(''); let special = '#%@$&*-+_'.split(''); let letter = 'qwertyupasdfghjkmnbvcxQWERTYUPASDFGHJKLXCVBNM'.split(''); const random = (min, max)=> { let Range = max - min; let Rand = Math.random(); return (min + Math.round(Rand * Range)); }; const randomNoRepeat = (arr, len)=>{ if(len === 0) return [] arr = JSON.parse(JSON.stringify(arr)); let str = []; let next = ''; for (let i = 0; i < len; i++) { let max = arr.length -1 let idx = random(0,max); let s = arr[idx]; arr.splice(idx,1); if(i > 0) { arr.push(next); } str.push(s); next = s; } return str }; const merge = (letterStr, target)=>{ target.map(item=>{ let max = letterStr.length - 1; let index = random(0,max); letterStr.splice(index,0,item); }) } let numStr = randomNoRepeat(num, numLen); let specialStr = randomNoRepeat(special, specialLen); let letterStr = randomNoRepeat(letter, len-specialLen-numLen); merge(letterStr,numStr); merge(letterStr,specialStr); return letterStr.join('') } /** * @description 获取元素滚动滚动高度 * @example * let elx = document.getElementById('xd-edit-layout'); * elx.addEventListener('scroll',()=>{ * let top = this.getScrollTop(elx) * }) * @param element * @return {number|*} */ export function getElementScrollTop(element){ if (element.scrollTop !== undefined) { return element.scrollTop; } else { let rect = element.getBoundingClientRect(); let scrollTop = window.pageYOffset || document.documentElement.scrollTop; return rect.top + scrollTop; } } /** * @description 调整地址判断 * @param url * @param $route * @param isRefresh */ export function windowHref(url='', $route = null, isRefresh = true){ let isHttp = /^(http:\/\/)|(https:\/\/)|(\/\/).+$/; console.warn(`WindowHref跳转地址:${url}`); //http|https|// if(isHttp.test(url)){ if(isRefresh) window.location.href = url; else window.location.replace(url); } //没有$route对象 else if($route === null) { let newStr = `${url}`; if(JFB_ENV.service === 'build' && JFB_CONFIG.custom_project_root){ newStr = `/${JFB_CONFIG.custom_project_root}/#${url}`; } if(isRefresh) window.location.href = newStr; else window.location.replace(newStr); } else { $route.push(url); } } /** * @description 接管输入值定义数字规则验证 * @param value * @param min * @param fnName * @param cb */ export function checkValueValidator(value, min= 0, fnName, cb){ //debugger let reg = /^(\d+(\.\d*)?|\.\d+)([eE][-+]?\d+)?$/; if(min < 0) { reg = /^-??(\d+(\.\d*)?|\.\d+)([eE][-+]?\d+)?$/; } if(typeof value === 'string' || typeof value === 'number') { if(typeof value === 'string') { if(value === '') cb(`${fnName}不能为空`); else if(reg.test(value)) { value = Number(value); if(value <= min ) cb(`${fnName}不能小于等于${min}`); else cb() } else cb(`${fnName}格式错误`); } else { if(value <= min ) cb(`${fnName}不能小于等于${min}`); else cb(); } } else cb(`${fnName}格式错误`); } /** * @description 判断输入值进行判断 * @param value * @param min * @param max */ export function checkValueValidatorStatus(value,min, max){ let reg = /^(\d+(\.\d*)?|\.\d+)([eE][-+]?\d+)?$/; if(min < 0) { reg = /^-??(\d+(\.\d*)?|\.\d+)([eE][-+]?\d+)?$/; } if(typeof value === 'string' || typeof value === 'number'){ if(typeof value === 'string') { if(value === '') return false; else if(reg.test(value)) { value = Number(value); return value > min; } else return false; } else { return value > min; } } else return false; }