gxd-vue-library
Version:
依赖与element Ui插件库,聚福宝福利PC端插件库
914 lines (835 loc) • 25.7 kB
JavaScript
;
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;
}