金久信后台管理系统
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

2430 lines
69 KiB

/**
* 通用公共函数
*/
var pubfn = {};
// 防抖
import debounce from './debounce.js'
// 限流
import throttle from './throttle.js'
// url参数
import queryParams from './queryParams.js'
// H5版本的复制
import setClipboardData from './setClipboardData.js'
// 时间
import timeUtil from './timeUtil.js'
// 树形结构转换
import treeUtil from './treeUtil.js'
/**
* 树形结构转换
*/
pubfn.treeUtil = treeUtil;
/**
* 时间工具类
*/
pubfn.timeUtil = timeUtil;
/**
* 防抖函数
*/
pubfn.debounce = debounce;
/**
* 节流函数
*/
pubfn.throttle = throttle;
/**
* 对象转url参数
* @param {*} data,对象
* @param {*} isPrefix,是否自动加上"?"
* 此函数参考uView
* vk.pubfn.queryParams(json);
*/
pubfn.queryParams = queryParams;
/**
* 设置剪贴板
*/
pubfn.setClipboardData = setClipboardData;
/**
* 休眠,等待(单位毫秒)
* @param {Number} ms 毫秒
* await vk.pubfn.sleep(1000);
*/
pubfn.sleep = ms => new Promise(resolve => setTimeout(resolve, ms));
/**
* 日期格式化
* @param {Date || Number} date 需要格式化的时间
* vk.pubfn.timeFormat(new Date(),"yyyy-MM-dd hh:mm:ss");
*/
pubfn.timeFormat = pubfn.timeUtil.timeFormat;
/**
* 解析日期对象属性
* @param {Date || Number} date 需要转换的时间
* vk.pubfn.getDateInfo(new Date());
*/
pubfn.getDateInfo = pubfn.timeUtil.getDateInfo;
/**
* 日期对象转换(此API已弃用,建议用vk.pubfn.timeFormat代替)
* @param {Date || Number} date 需要转换的时间
* @param {Number} type 转换方式
* type = 0 返回 2020-08-03 12:12:12
* type = 1 返回 20200803121212
* type = 2 返回 { YYYY, MM, DD, hh, mm, ss }
*/
pubfn.getFullTime = pubfn.timeUtil.getFullTime;
/**
* 获取时间范围
* @param {Date} date 日期对象 可以指定时间计算节点,默认使用当前时间进行计算
* 返回的是时间戳(防止时区问题)
* 返回数据如下:
{
todayStart 今日开始时间
todayEnd 今日结束时间
today12End 今日上午结束时间
monthStart 本月开始时间
monthEnd 本月结束时间
yearStart 本年开始时间
yearEnd 本年结束时间
weekStart 本周开始时间
weekEnd 本周结束时间
now 现在的时间点(含月年日时分秒)
months 本年度每月的开始和结束时间 months[1] 代表1月
}
* vk.pubfn.getCommonTime();
*/
pubfn.getCommonTime = pubfn.timeUtil.getCommonTime;
/**
* 获得指定时间偏移 year年 month月 day天 hours时 minutes分 seconds秒前或后的时间戳
* 返回时间戳形式
vk.pubfn.getOffsetTime(new Date(), {
year:0,
month:0,
day:0,
hours:0,
minutes:0,
seconds:0,
mode:"after", // after 之后 before 之前
});
*/
pubfn.getOffsetTime = pubfn.timeUtil.getOffsetTime;
/**
* 获得相对当前时间的偏移 count 小时的起止日期(小时的开始和结束)
* @param {Number} count 默认0 (0代表当前小时 为-1代表上一个小时 为1代表下一个小时以此类推)
* @param {Date || Number} date 指定从哪个时间节点开始计算
* vk.pubfn.getHourOffsetStartAndEnd(0);
*/
pubfn.getHourOffsetStartAndEnd = pubfn.timeUtil.getHourOffsetStartAndEnd;
/**
* 获得相对当前时间的偏移 count 天的起止日期(日的开始和结束)
* @param {Number} count 默认0 (0代表今日 为-1代表昨日 为1代表明日以此类推)
* @param {Date || Number} date 指定从那天开始计算
* vk.pubfn.getDayOffsetStartAndEnd(0);
*/
pubfn.getDayOffsetStartAndEnd = pubfn.timeUtil.getDayOffsetStartAndEnd;
/**
* 获得相对当前周addWeekCount个周的起止日期
* @param {Number} addWeekCount 默认0 (0代表本周 为-1代表上周 为1代表下周以此类推 为2代表下下周)
* vk.pubfn.getWeekOffsetStartAndEnd(0);
*/
pubfn.getWeekOffsetStartAndEnd = pubfn.timeUtil.getWeekOffsetStartAndEnd; // 新版写法
pubfn.getWeekStartAndEnd = pubfn.timeUtil.getWeekOffsetStartAndEnd; // 兼容老版本写法
/**
* 获得相对当前时间的偏移 count 月的起止日期(月的开始和结束)
* @param {Number} count 默认0 (0代表本月 为-1代表上月 为1代表下月以此类推)
* @param {Date || Number} date 指定从那天开始计算
* vk.pubfn.getMonthOffsetStartAndEnd(0);
*/
pubfn.getMonthOffsetStartAndEnd = pubfn.timeUtil.getMonthOffsetStartAndEnd;
/**
* 获得相对当前时间的偏移 count 个季度的起止日期(季度的开始和结束时间戳)
* @param {Number} count 默认0(0代表本季度 -1代表上个季度 1代表下个季度以此类推)
* @param {Date || Number} date 指定从哪个时间节点开始计算
* vk.pubfn.getQuarterOffsetStartAndEnd(0);
*/
pubfn.getQuarterOffsetStartAndEnd = pubfn.timeUtil.getQuarterOffsetStartAndEnd;
/**
* 获得相对当前时间的偏移 count 年的起止日期(年的开始和结束)
* @param {Number} count 默认0 (0代表今年 为-1代表去年 为1代表明年以此类推)
* @param {Date || Number} date 指定从那天开始计算
* vk.pubfn.getYearOffsetStartAndEnd(0);
*/
pubfn.getYearOffsetStartAndEnd = pubfn.timeUtil.getYearOffsetStartAndEnd;
/**
* 获得指定年份和月份后的该月的开始时间和结束时间
* 返回数据如下:(时间戳形式)
{
startTime 该月开始时间
endTime 该月结束时间
}
vk.pubfn.getMonthStartAndEnd({
year:2021
month:1
});
*/
pubfn.getMonthStartAndEnd = pubfn.timeUtil.getMonthStartAndEnd;
/**
* Vue 全局表单验证器扩展
rules: {
receiver_mobile:[
{ validator:vk.pubfn.validator("mobile"), message: '手机号格式错误', trigger: 'blur' }
],
},
*/
pubfn.validator = function(type) {
return function(rule, value, callback) {
let key = pubfn.test(value, type);
if (typeof callback === "function") {
if (key || !value) {
callback();
} else {
return callback(false);
}
} else {
return callback(false);
}
}
};
/**
* 检测文本是否满足指定格式
* @param {String} str 需要检测的文本
* @param {String} type 检测类型(忽略大小写)
* @param {Boolean} allowEmpty 是否允许为空
* 包含
* mobile 手机号码
* tel 座机
* card 身份证
* mobileCode 6位数字验证码
* username 账号以字母开头,长度在3~32之间,只能包含字母、数字和下划线
* pwd 密码长度在6~18之间,只能包含字母、数字和下划线
* password 与pwd效果一致,密码长度在6~18之间,只能包含字母、数字和下划线
* paypwd 支付密码 6位纯数字
* postal 邮政编码
* qq QQ号
* email 邮箱
* money 金额(小数点只允许2位)
* url 网址
* ip IP地址
* date 日期 2020-08-03
* time 时间 12:12:12
* dateTime 日期+时间 2020-08-03 12:12:12
* number 纯数字
* english 纯英文
* chinese 纯中文
* english+number 英文+数字
* english+number+_ 英文+数字+_
* english+number+_- 英文+数字+_-
* lower 小写
* upper 大写
* version 版本号 xx.xx.xx (xx必须是数字)
* html html格式
* image 图片
* video 视频
* audio 音频
* vk.pubfn.test(str, type, allowEmpty);
*/
pubfn.test = function(str, type = "", allowEmpty=false) {
type = type.toLowerCase();
let newStr;
if (allowEmpty && (str === "" || str === null || str === undefined)) {
return true;
}
switch (type) {
case 'mobile': //手机号码
return new RegExp(/^1[3|4|5|6|7|8|9][0-9]{9}$/).test(str);
case 'tel': //座机
return new RegExp(/^(0\d{2,3}-\d{7,8})(-\d{1,4})?$/).test(str);
case 'card': //身份证
return new RegExp(/(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/).test(str);
case 'mobilecode': //6位数字验证码
return new RegExp(/^[0-9]{6}$/).test(str);
case 'username': //账号以字母开头,长度在3~32之间,只能包含字母、数字和下划线
return new RegExp(/^[a-zA-Z]([-_a-zA-Z0-9]{2,31})$/).test(str)
case 'pwd': //密码长度在6~18之间,只能包含字母、数字和下划线和@
return new RegExp(/^([a-zA-Z0-9_@]){6,18}$/).test(str)
case 'password': //密码长度在6~18之间,只能包含字母、数字和下划线和@
return new RegExp(/^([a-zA-Z0-9_@]){6,18}$/).test(str)
case 'paypwd': //支付密码 6位纯数字
return new RegExp(/^[0-9]{6}$/).test(str)
case 'postal': //邮政编码
return new RegExp(/[1-9]\d{5}(?!\d)/).test(str);
case 'qq': //QQ号
return new RegExp(/^[1-9][0-9]{4,9}$/).test(str);
case 'email': //邮箱
return new RegExp(/^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/).test(str);
case 'money': //金额(小数点2位)
return new RegExp(/^\d*(?:\.\d{0,2})?$/).test(str);
case 'url': //网址
return new RegExp(/^(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?/).test(str);
case 'ip': //IP
return new RegExp(/^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/).test(
str);
case 'date': //日期 2014-01-01
return new RegExp(/^[1-9]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/).test(str);
case 'time': //时间 12:00:00
return new RegExp(/^(20|21|22|23|[0-1]\d):[0-5]\d:[0-5]\d$/).test(str);
case 'datetime': //日期+时间 2014-01-01 12:00:00
return new RegExp(/^[1-9]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])\s+(20|21|22|23|[0-1]\d):[0-5]\d:[0-5]\d$/).test(str);
case 'english+number': //英文+数字(空字符串算通过)
return new RegExp(/^[a-zA-Z0-9]+$/).test(str);
case 'english+number+_': //英文+数字+_(空字符串算通过)
return new RegExp(/^[a-zA-Z0-9_]+$/).test(str);
case 'english+number+_-': //英文+数字+_-(空字符串算通过)
return new RegExp(/^[a-zA-Z0-9_-]+$/).test(str);
case 'version': //版本号 xx.xx.xx(xx必须是数字)
return new RegExp(/^([1-9]\d|[1-9])(.([1-9]\d|\d)){2}$/).test(str);
case 'number': //数字(空字符串算通过)
return new RegExp(/^[0-9]+$/).test(str);
case 'english': //英文(空字符串算通过)
return new RegExp(/^[a-zA-Z]+$/).test(str);
case 'chinese': //中文(空字符串算通过)
return new RegExp(/^[\u4e00-\u9fa5]+$/gi).test(str);
case 'lower': //小写(空字符串算通过)
return new RegExp(/^[a-z]+$/).test(str);
case 'upper': //大写(空字符串算通过)
return new RegExp(/^[A-Z]+$/).test(str);
case 'html': //HTML标记
return new RegExp(/<("[^"]*"|'[^']*'|[^'">])*>/).test(str);
case 'image': //是否图片格式
newStr = str.split("?")[0];
return new RegExp(/\.(jpeg|jpg|gif|png|svg|webp|jfif|bmp|dpg)$/).test(newStr);
case 'video': //是否视频格式
newStr = str.split("?")[0];
return new RegExp(/\.(mp4|mpg|mpeg|dat|asf|avi|rm|rmvb|mov|wmv|flv|mkv|m3u8|3gp)$/).test(newStr);
case 'audio': //是否音频格式
newStr = str.split("?")[0];
return new RegExp(/\.(mp3)$/).test(newStr);
default:
return true;
}
};
// 保留之前的函数名
pubfn.checkStr = pubfn.test;
/**
* 删除对象中所有值为无效值的属性(如:undefined)
* @param {Object} obj
* vk.pubfn.objectDeleteInvalid(obj);
*/
pubfn.objectDeleteInvalid = function(obj = {}) {
Object.keys(obj).forEach(item => {
if (obj[item] === undefined) {
delete obj[item];
}
});
return obj;
};
/**
* 对象属性拷贝(浅拷贝)
* @description 将 obj2 的属性赋值给 obj1(如果obj1中有对应的属性,则会被obj2的属性值覆盖)
* @param {Object} obj1
* @param {Object} obj2
* vk.pubfn.objectAssign(obj1, obj2);
* vk.pubfn.objectAssign(obj1, obj2, true);
* vk.pubfn.objectAssign(obj1, obj2, false);
*/
pubfn.objectAssign = function(obj1, obj2, deleteInvalid = true) {
if (deleteInvalid) pubfn.objectDeleteInvalid(obj2);
return Object.assign(obj1, obj2);
};
/**
* 复制一份对象-没有映射关系
* @description 主要用于解除映射关系(不支持克隆函数)
* @param {Object} obj
* let newObj = vk.pubfn.copyObject(obj);
*/
pubfn.copyObject = function(obj) {
if (typeof obj !== "undefined") {
return JSON.parse(JSON.stringify(obj));
} else {
return obj;
}
};
/**
* 深度克隆一个对象-没有映射关系
* @description 主要用于解除映射关系(支持克隆函数)
* @param {Object} obj
* let newObj = vk.pubfn.deepClone(obj);
*/
pubfn.deepClone = function(obj) {
// 对常见的“非”值,直接返回原来值
if ([null, undefined, NaN, false].includes(obj)) return obj;
if (typeof obj !== "object" && typeof obj !== 'function') {
//原始类型直接返回
return obj;
}
let o = Object.prototype.toString.call(obj) === '[object Array]' ? [] : {};
for (let i in obj) {
if (obj.hasOwnProperty(i)) {
o[i] = typeof obj[i] === "object" ? pubfn.deepClone(obj[i]) : obj[i];
}
}
return o;
};
/**
* 表单自动填充数据
* @description 主要用于表单修改时,数据库没有默认字段会报错的问题
* @param {Object} defaultData 默认数据
* @param {Object} itemData 当前数据
* that.form1 = vk.pubfn.formAssign(defaultData,itemData);
*/
pubfn.formAssign = function(defaultData, itemData) {
let newDefaultData = pubfn.copyObject(defaultData);
return pubfn.objectAssign(newDefaultData, itemData);
};
/**
* 两个(元素为对象)的数组合并,并去除重复的数据
* @param {Array} arr1 第一个数组(arr1和aar2没有顺序要求)
* @param {Array} aar2 第二个数组
* @param {String} flag 判断标识,默认用id来判断,若flag传-1,代表不去除重复数据
* let arr = vk.pubfn.arr_concat(arr1, arr2, "_id");
*/
pubfn.arr_concat = function(arr1, arr2, flag) {
if (!flag) flag = "id"; // 默认用id来判断是否是同一个对象元素
if (!arr1) arr1 = [];
if (!arr2) arr2 = [];
let arr3 = arr1.concat(arr2); // 新旧数据合并
let arr = []; // 定义一个临时数组 存放对象
if (flag != -1) {
let arr_id = []; // 定义一个临时数组 存放id
for (let i in arr3) { // 循环遍历当前数组
// 判断当前数组下标为i的元素是否已经保存到临时数组
// 如果已保存,则跳过,否则将此元素保存到临时数组中
if (arr_id.indexOf(arr3[i][flag]) == -1) {
arr_id.push(arr3[i][flag]); // 添加id到数组
arr.push(arr3[i]); // 添加对象到数组
}
}
} else {
arr = arr3;
}
return arr;
};
/**
* 自动根据字符串路径获取对象中的值支持.和[] , 且任意一个值为undefined时,不会报错,会直接返回undefined
* @param {Object} dataObj 数据源
* @param {String} name 支持a.b 和 a[b]
* @param {String} defaultValue undefined时的默认值
* vk.pubfn.getData(dataObj, name);
*/
pubfn.getData = function(dataObj, name, defaultValue) {
let newDataObj;
if (pubfn.isNotNull(dataObj)) {
newDataObj = JSON.parse(JSON.stringify(dataObj));
let k = "",
d = ".",
l = "[",
r = "]";
name = name.replace(/\s+/g, k) + d;
let tstr = k;
for (let i = 0; i < name.length; i++) {
let theChar = name.charAt(i);
if (theChar != d && theChar != l && theChar != r) {
tstr += theChar;
} else if (newDataObj) {
if (tstr != k) newDataObj = newDataObj[tstr];
tstr = k;
}
}
}
if (typeof newDataObj === "undefined" && typeof defaultValue !== "undefined") newDataObj = defaultValue;
return newDataObj;
};
/**
* 自动根据字符串路径设置对象中的值 支持.和[]
* @param {Object} dataObj 数据源
* @param {String} name 支持a.b 和 a[b]
* @param {String} value 值
* vk.pubfn.setData(dataObj, name, value);
*/
pubfn.setData = function(dataObj, name, value) {
// 通过正则表达式 查找路径数据
let dataValue;
if (typeof value === "object") {
dataValue = pubfn.copyObject(value);
} else {
dataValue = value;
}
let regExp = new RegExp("([\\w$-]+)|\\[(:\\d)\\]", "g");
const patten = name.match(regExp);
// 遍历路径 逐级查找 最后一级用于直接赋值
for (let i = 0; i < patten.length - 1; i++) {
let keyName = patten[i];
if (typeof dataObj[keyName] !== "object") dataObj[keyName] = {};
dataObj = dataObj[keyName];
}
// 最后一级
dataObj[patten[patten.length - 1]] = dataValue;
};
/**
* 检测参数是否为空 其中 undefined、null、{}、[]、"" 均为空值 true 空值 false 有值
* vk.pubfn.isNull(value);
*/
pubfn.isNull = function(value) {
let key = false;
if (
typeof value == "undefined" ||
Object.prototype.toString.call(value) == "[object Null]" ||
JSON.stringify(value) == "{}" ||
JSON.stringify(value) == "[]" ||
value === "" ||
JSON.stringify(value) === undefined
) {
key = true;
}
return key;
};
/**
* 检测参数是否不为空 结果与 vk.pubfn.isNull 相反
* vk.pubfn.isNotNull(value);
*/
pubfn.isNotNull = function(value) {
return !pubfn.isNull(value);
};
/**
* 检测所有参数 - 是否至少有一个为空
* vk.pubfn.isNullOne(value1,value2,value3);
*/
pubfn.isNullOne = function(...strS) {
let key = false;
for (let i = 0; i < strS.length; i++) {
let str = strS[i];
if (pubfn.isNull(str)) {
key = true;
break;
}
}
return key;
};
/**
* 检测整个对象是否没有一个属性是空值,如果有空值,则返回首个是空值的属性名
let nullKey = vk.pubfn.isNullOneByObject({ value1,value2,value3 });
if(nullKey) return { code : -1, msg : `${nullKey}不能为空` };
*/
pubfn.isNullOneByObject = function(obj) {
let key;
for (let name in obj) {
let val = obj[name];
if (pubfn.isNull(val)) {
key = name;
break;
}
}
return key;
};
/**
* 检测所有参数 - 是否全部为空
* vk.pubfn.isNullAll(value1,value2,value3);
*/
pubfn.isNullAll = function(...strS) {
let key = true;
for (let i = 0; i < strS.length; i++) {
let str = strS[i];
if (pubfn.isNotNull(str)) {
key = false;
break;
}
}
return key;
};
/**
* 检测所有参数 - 是否全部都不为空
* vk.pubfn.isNotNullAll(value1,value2,value3);
*/
pubfn.isNotNullAll = function(...strS) {
return !pubfn.isNullOne(...strS);
};
/**
* 获取对象数组中的某一个item,根据指定的键名和键值
* @description 主要用于在一个对象数组中快速获取 _id = 1 的对象
* @param {Array} list 数据源
* @param {String} key 键名(不可为空)
* @param {String} value 键值 (不可为空)
* vk.pubfn.getListItem(list, key, value);
*/
pubfn.getListItem = function(list, key, value) {
let item;
for (let i = 0; i < list.length; i++) {
if (list[i][key] === value) {
item = list[i];
break;
}
}
return item;
};
/**
* 获取对象数组中某个元素的index,根据指定的键名和键值
* @description 主要用于在一个对象数组中快速获取 _id = 1 的index
* @param {Array} list 数据源
* @param {String} key 键名
* @param {String} value 键值
* vk.pubfn.getListIndex(list, key, value);
*/
pubfn.getListIndex = function(list, key, value) {
let index = -1;
for (let i = 0; i < list.length; i++) {
if (list[i][key] === value) {
index = i;
break;
}
}
return index;
};
/**
* 获取对象数组中某个元素的index,根据指定的键名和键值
* @description 主要用于在一个对象数组中快速获取 _id = 1 的index
* @param {Array} list 数据源
* @param {String} key 键名
* @param {String} value 键值
* vk.pubfn.getListItemIndex(list, key, value);
*/
pubfn.getListItemIndex = function(list, key, value) {
let obj = {};
let item;
let index = -1;
for (let i = 0; i < list.length; i++) {
if (list[i][key] === value) {
index = i;
item = list[i];
break;
}
}
obj = {
item,
index
}
return obj;
};
/**
* 数组转对象 - 将对象数组转成json
* 如[{"_id":"001","name":"name1","sex":1},{"_id":"002","name":"name2","sex":2}]
* 转成
* {"001",{"_id":"001","name":"name1","sex":1},"002":{"_id":"002","name":"name2","sex":2}}
* vk.pubfn.arrayToJson(list, "_id");
*/
pubfn.arrayToJson = function(list, key) {
let json = {};
for (let i in list) {
let item = list[i];
json[item[key]] = item;
}
return json;
};
pubfn.listToJson = pubfn.arrayToJson;
/**
* 从数组中提取指定字段形式成为新的数组
* 如[{"_id":"001","name":"name1","sex":1},{"_id":"002","name":"name2","sex":2}]
* 提取_id字段转成
* ["001","002"]
* let idArr = vk.pubfn.arrayObjectGetArray(list, "_id");
*/
pubfn.arrayObjectGetArray = function(list, key) {
return list.map(obj => { return obj[key] });
};
/**
* 产生指定位数的随机数(支持任意字符,默认纯数字)
* @param {Number} length 随机数固定位数
* @param {String} range 指定的字符串中随机范围
* @param {Array} arr 产生的随机数不会和此数组的任意一项重复
* vk.pubfn.random(6);
* vk.pubfn.random(6, "abcdefghijklmnopqrstuvwxyz0123456789");
* vk.pubfn.random(1,"12",["1","2"]);
*/
pubfn.random = function(length, range, arr) {
let s;
if (pubfn.isNull(arr)) {
s = pubfn.randomFn(length, range);
} else {
let i = 0;
let maxForCount = 100000;
do {
i++;
s = pubfn.randomFn(length, range);
} while (arr.indexOf(s) > -1 && i < maxForCount);
if (i === maxForCount) {
s = undefined;
}
}
return s;
};
/**
* 产生指定位数的随机数(支持任意字符,默认纯数字)
* @param {Number} length 随机数固定位数
* @param {String} range 指定的字符串中随机范围
* vk.pubfn.random(6);
* vk.pubfn.random(6, "abcdefghijklmnopqrstuvwxyz0123456789");
*/
pubfn.randomFn = function(length, range) {
let s = "";
let list = "123456789";
//0123456789QWERTYUIPASDFGHJKLZXCVBNM
if (pubfn.isNotNull(range)) {
if (range == "a-z,0-9") {
range = "abcdefghijklmnopqrstuvwxyz0123456789";
} else if (range == "A-Z,0-9") {
range = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
} else if (range == "a-z,A-Z,0-9" || range == "A-Z,a-z,0-9") {
range = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
}
list = range;
}
for (let i = 0; i < length; i++) {
let code = list[Math.floor(Math.random() * list.length)];
s += code;
}
return s;
};
/**
* 将字符串id转化为指定位数的纯数字字符串id(会重复)
* vk.pubfn.stringIdToNumberId(uid,8);
*/
pubfn.stringIdToNumberId = function(str, length) {
let s = "";
let list = "0123456789";
for (let i = 0; i < length; i++) {
if (str.length > i) {
let index = str[i].charCodeAt() % 10;
s += list[index];
} else {
s = "0" + s;
}
}
return s;
};
/**
* 将手机号,账号等隐藏中间字段
* @param {String} str 需要转换的字符串
* @param {Number} first 前面显示的字符数量
* @param {Number} last 后面显示的字符数量
* vk.pubfn.hidden(str, first, last);
*/
pubfn.hidden = function(str = "", first = 0, last = 0) {
let len = str.length - first - last;
let xing = '';
for (let i = 0; i < len; i++) {
xing += '*';
}
return str.substring(0, first) + xing + str.substring(str.length - last);
};
/**
* 判断常量数组A是否至少有一个元素在常量数组B中存在(两数组有交集)
* @param {Array} arr1 数组A
* @param {Array} arr2 数组B
* vk.pubfn.checkArrayIntersection(arr1, arr2);
*/
pubfn.checkArrayIntersection = function(arr1 = [], arr2 = []) {
let checkKey = false;
for (let i = 0; i < arr2.length; i++) {
if (arr1.indexOf(arr2[i]) > -1) {
checkKey = true;
}
}
return checkKey;
};
/**
* 检测数据源是否满足表达式规则
* @param {Object} data 数据源
* @param {String} expText 表达式文本
* vk.pubfn.checkDataExpText(data, expText);
*/
pubfn.checkDataExpText = function(data = {}, expText) {
expText = expText.replace(new RegExp("\\s", "g"), "");
//console.log("expText:",expText);
let orArr = expText.split("||");
//console.log("orArr",orArr);
let checkKey = false;
for (let index1 = 0; index1 < orArr.length; index1++) {
let orItem = orArr[index1];
let andArr = orItem.split("&&");
//console.log("andArr",andArr);
let itemKey = true;
for (let index2 = 0; index2 < andArr.length; index2++) {
let andItem = andArr[index2];
//console.log("andItem",andItem);
if (andItem.indexOf("!=") > -1) {
let andItemArr = andItem.split("!=");
let key = andItemArr[0];
let value = andItemArr[1];
let formValue = pubfn.getData(data,key);
itemKey = String(formValue) !== value ? true : false;
} else if (andItem.indexOf("==") > -1) {
let andItemArr = andItem.split("==");
let key = andItemArr[0];
let value = andItemArr[1];
let formValue = pubfn.getData(data,key);
itemKey = String(formValue) == value ? true : false;
} else if (andItem.indexOf(">=") > -1) {
let andItemArr = andItem.split(">=");
let key = andItemArr[0];
let value = andItemArr[1];
let formValue = pubfn.getData(data,key);
if (isNaN(value)) {
if (typeof formValue !== "undefined") itemKey = String(formValue) >= value ? true : false;
if (typeof formValue === "undefined" || formValue === null) itemKey = false;
} else {
if (typeof formValue !== "undefined") itemKey = formValue >= Number(value) ? true : false;
if (typeof formValue === "undefined" || formValue === null) itemKey = false;
}
} else if (andItem.indexOf(">") > -1) {
let andItemArr = andItem.split(">");
let key = andItemArr[0];
let value = andItemArr[1];
let formValue = pubfn.getData(data,key);
if (isNaN(value)) {
if (typeof formValue !== "undefined") itemKey = String(formValue) > value ? true : false;
if (typeof formValue === "undefined" || formValue === null) itemKey = false;
} else {
if (typeof formValue !== "undefined") itemKey = formValue > Number(value) ? true : false;
if (typeof formValue === "undefined" || formValue === null) itemKey = false;
}
} else if (andItem.indexOf("<=") > -1) {
let andItemArr = andItem.split("<=");
let key = andItemArr[0];
let value = andItemArr[1];
if (isNaN(value)) {
if (typeof data[key] !== "undefined") itemKey = String(data[key]) <= value ? true : false;
if (typeof data[key] === "undefined" || data[key] === null) itemKey = false;
} else {
if (typeof data[key] !== "undefined") itemKey = data[key] <= Number(value) ? true : false;
if (typeof data[key] === "undefined" || data[key] === null) itemKey = false;
}
} else if (andItem.indexOf("<") > -1) {
let andItemArr = andItem.split("<");
let key = andItemArr[0];
let value = andItemArr[1];
let formValue = pubfn.getData(data,key);
if (isNaN(value)) {
if (typeof formValue !== "undefined") itemKey = String(formValue) < value ? true : false;
if (typeof formValue === "undefined" || formValue === null) itemKey = false;
} else {
if (typeof formValue !== "undefined") itemKey = formValue < Number(value) ? true : false;
if (typeof formValue === "undefined" || formValue === null) itemKey = false;
}
} else if (andItem.indexOf("{in}") > -1) {
let andItemArr = andItem.split("{in}");
let key = andItemArr[0];
let value = andItemArr[1];
let formValue = pubfn.getData(data,key);
if (Array.isArray(formValue)) {
let index = formValue.findIndex(item => {
return item.toString() === value.toString();
});
itemKey = index > -1 ? true : false;
} else {
itemKey = false;
}
//itemKey = (Array.isArray(formValue) && formValue.indexOf(value) > -1 ) ? true : false;
} else if (andItem.indexOf("{nin}") > -1) {
let andItemArr = andItem.split("{nin}");
let key = andItemArr[0];
let value = andItemArr[1];
let formValue = pubfn.getData(data,key);
if (Array.isArray(formValue)) {
let index = formValue.findIndex(item => {
return item.toString() === value.toString();
});
itemKey = index < 0 ? true : false;
} else {
itemKey = false;
}
//itemKey = (Array.isArray(formValue) && formValue.indexOf(value) < 0 ) ? true : false;
} else {
let andItemArr = andItem.split("=");
let key = andItemArr[0];
let value = andItemArr[1];
let formValue = pubfn.getData(data,key);
itemKey = String(formValue) == value ? true : false;
//console.log("key:",key,"value:",value,"formValue",formValue.toString(),"itemKey:",itemKey);
}
if (!itemKey) {
break;
}
}
if (itemKey) {
checkKey = true;
break;
}
}
return checkKey;
};
/**
* 判断变量是否是数组
* vk.pubfn.isArray(value);
*/
pubfn.isArray = function(value) {
return Object.prototype.toString.call(value) === "[object Array]" ? true : false;
};
/**
* 判断变量是否是对象
* vk.pubfn.isObject(value);
*/
pubfn.isObject = function(value) {
return Object.prototype.toString.call(value) === "[object Object]" ? true : false;
};
/**
* 计算运费
* @param {Object} freightItem 运费模板
{
first_weight Number 首重(KG)
first_weight_price Number 首重 首重价格(100=1元)
continuous_weight Number 续重(KG)
continuous_weight_price Number 续重价格(100=1元)
max_weight Number 重量达到此值时(KG),会多计算首重的价格,并少一次续重的价格 倍乘(相当于拆分多个包裹)
}
* @param {Number} weight 运费重量
* 返回值
* @return {Number} 最终运费金额(100=1元)
* vk.pubfn.calcFreights(freightItem, weight);
*/
pubfn.calcFreights = function(freightItem, weight) {
let freightRes = vk.pubfn.calcFreightDetail(freightItem, weight);
return freightRes.total_amount;
};
/**
* 计算运费,返回细节
* @param {Object} freightItem 运费模板
{
first_weight Number 首重(KG)
first_weight_price Number 首重 首重价格(100=1元)
continuous_weight Number 续重(KG)
continuous_weight_price Number 续重价格(100=1元)
max_weight Number 重量达到此值时(KG),会多计算首重的价格,并少一次续重的价格 倍乘(相当于拆分多个包裹)
}
* @param {Number} weight 需要计算的商品重量
* 返回值
* @return {Number} weight 运费重量(KG)
* @return {Number} first_weight_price 首重金额(100=1元)
* @return {Number} continuous_weight_price 续重金额(100=1元)
* @return {Number} total_amount 最终运费金额(100=1元)
* @return {String} formula 运费计算公式字符串
* let freightRes = vk.pubfn.calcFreightDetail(freightItem, weight);
*/
pubfn.calcFreightDetail = function(freightItem, weight) {
let {
first_weight, // 首重(KG)
first_weight_price, // 首重价格(元)
continuous_weight, // 续重(KG)
continuous_weight_price, // 续重价格(元)
max_weight, // 拆包裹,每个包裹最大重量(KG)
} = freightItem;
if (!max_weight) max_weight = 1000000000;
let originalWeight = weight;
let money = 0; // 运费
let first_weight_count = 0; // 包裹数量
let packagesSurplusWeight = max_weight; // 包裹剩余重量
let first_weight_key = false; // 是否已减过首重
let continuous_weight_count = 0; // 续重次数
let logArr = [];
let logRun = false;
while (weight > 0) {
if (!first_weight_key) {
// 首重
first_weight_key = true;
first_weight_count++;
packagesSurplusWeight = max_weight; // 还原包裹剩余重量
weight -= first_weight;
packagesSurplusWeight -= first_weight;
} else {
// 续重
continuous_weight_count++;
weight -= continuous_weight;
packagesSurplusWeight -= continuous_weight;
}
if (logRun) logArr.push({
"总重量剩余": weight,
"当前包裹重量剩余": packagesSurplusWeight,
"当前第几个包裹": first_weight_count,
"续重计算次数": continuous_weight_count
});
if (packagesSurplusWeight <= 0) {
// 需要增加一个新的包裹
first_weight_key = false; // 新包裹设置没有减过首重
}
}
if (logRun) console.log(JSON.stringify(logArr));
let total_amount = first_weight_price * first_weight_count + continuous_weight_price * continuous_weight_count;
let res = {
weight: originalWeight, // 商品重量(KG)
first_weight, // 首重步长
first_weight_price, // 首重单价
first_weight_count, // 首重计算次数
continuous_weight, // 续重步长
continuous_weight_price, // 续重单价
continuous_weight_count, // 续重计算次数
first_weight_amount: first_weight_count * first_weight_price, // 首重总金额
continuous_weight_amount: continuous_weight_price * continuous_weight_count, // 续重总金额
total_amount, // 最终运费金额
formula: `${first_weight_price} * ${first_weight_count} + ${continuous_weight_price} * ${continuous_weight_count} = ${total_amount}`, // 运费计算公式
};
return res;
};
/**
* 从一个对象中取多个属性,并生成一个全新的对象,会过滤空字符串,空数组,空对象
* @param {Object} obj 对象
* @param {Array<String>} keys 键名数组
* vk.pubfn.getNewObject(obj, keys);
*/
pubfn.getNewObject = function(obj, keys) {
let selectedObj = pubfn.copyObject(obj);
let newObject = {};
if (keys && keys.length > 0) {
for (let i in keys) {
let key = keys[i];
if (pubfn.isNotNull(selectedObj[key])) {
newObject[key] = selectedObj[key];
}
}
} else {
newObject = selectedObj;
}
return newObject;
};
/**
* 对象删除指定的字段,返回新的对象
* @param {Object} data 操作对象
* @param {Array<String>} deleteKeys 需要删除的键名(数组形式)
* vk.pubfn.deleteObjectKeys(data, deleteKeys);
*/
pubfn.deleteObjectKeys = function(data, deleteKeys = []) {
let newData = {};
if (data) {
for (let key in data) {
if (deleteKeys.indexOf(key) == -1) {
newData[key] = data[key];
}
}
}
return newData;
}
/**
* 数组结构转树形结构
* @param {Array} treeData 数据源
* @param {Object} treeProps 树结构配置
* { id:"_id", parent_id:"parent_id", children:"children",need_field:["_id","name"],deleteParentId:true }
* vk.pubfn.arrayToTree(treeData, treeProps);
*/
pubfn.arrayToTree = pubfn.treeUtil.arrayToTree;
/**
* 树形结构转数组结构
* @param {Array} treeData 数据源
* @param {Object} treeProps 树结构配置
* { id:"_id", parent_id:"parent_id", children:"children", deleteChildren:true }
* vk.pubfn.treeToArray(treeData, treeProps);
*/
pubfn.treeToArray = pubfn.treeUtil.treeToArray;
/**
* 通配符匹配
* @param {String} text 被匹配的文本
* @param {String} expText 通配符规则
* vk.pubfn.wildcardTestOne(text, expText);
*/
pubfn.wildcardTestOne = function(text, expText) {
if (!expText) return false;
let regExpText = expText.replace(new RegExp("\\*"), "(.*)");
let startText = expText.indexOf("*") !== 0 ? "^" : "";
let endText = expText[expText.length - 1] !== "*" ? "$" : "";
let regExp = new RegExp(startText + regExpText + endText);
return regExp.test(text);
};
/**
* 通配符匹配 expText支持数组
* @param {String} text 被匹配的文本
* @param {String | Array<String>} expText 通配符规则
* vk.pubfn.wildcardTest(text, expText);
*/
pubfn.wildcardTest = function(text, expText) {
let matchNum = 0; // 被匹配的次数
let regExp1 = new RegExp("\\*");
if (typeof expText === "string") {
// 字符串
if (pubfn.wildcardTestOne(text, expText)) {
matchNum++;
}
} else if (typeof expText === "object") {
// 数组
for (let i = 0; i < expText.length; i++) {
let expTextItem = expText[i];
if (pubfn.wildcardTestOne(text, expTextItem)) {
matchNum++;
}
}
}
return matchNum;
}
/**
* 正则匹配
* @param {String} text 被匹配的文本
* @param {String} expText 正则表达式规则
* vk.pubfn.regExpTestOne(text, expText);
*/
pubfn.regExpTestOne = function(text, expText) {
if (!expText) return false;
let regExp = new RegExp(expText);
return regExp.test(text);
};
/**
* 正则匹配
* @param {String} text 被匹配的文本
* @param {String || Array<String>} wildcardExp 正则表达式规则
* vk.pubfn.regExpTest(text, regExp);
*/
pubfn.regExpTest = function(text, expText) {
let matchNum = 0; // 被匹配的次数
if (typeof expText === "string") {
// 字符串
if (pubfn.regExpTestOne(text, expText)) {
matchNum++;
}
} else if (typeof expText === "object") {
// 数组
for (let i = 0; i < expText.length; i++) {
let expTextItem = expText[i];
if (pubfn.regExpTestOne(text, expTextItem)) {
matchNum++;
}
}
}
return matchNum;
}
/**
* 产生订单号,不依赖数据库,高并发时性能高(理论上会重复,但概率非常非常低)
* @param {String} prefix 前缀
* @param {Number} num 位数,建议在25-30之间,默认25
* vk.pubfn.createOrderNo();
*/
pubfn.createOrderNo = function(prefix = "", num = 25) {
// 获取当前时间字符串格式如20200803093000123
let fullTime = vk.pubfn.timeFormat(new Date(), "yyyyMMddhhmmss");
fullTime = fullTime.substring(2);
let randomNum = num - (prefix + fullTime).length;
return prefix + fullTime + pubfn.random(randomNum);
};
const isSnakeCase = new RegExp('_(\\w)', 'g');
const isCamelCase = new RegExp('[A-Z]', 'g');
function parseObjectKeys(obj, type) {
let parserReg;
let parser;
switch (type) {
case 'snake2camel':
parser = pubfn.snake2camel
parserReg = isSnakeCase
break
case 'camel2snake':
parser = pubfn.camel2snake
parserReg = isCamelCase
break
}
for (const key in obj) {
if (Object.prototype.hasOwnProperty.call(obj, key)) {
if (parserReg.test(key)) {
const keyCopy = parser(key)
obj[keyCopy] = obj[key]
delete obj[key]
if (Object.prototype.toString.call((obj[keyCopy])) === '[object Object]') {
obj[keyCopy] = parseObjectKeys(obj[keyCopy], type)
} else if (Array.isArray(obj[keyCopy])) {
obj[keyCopy] = obj[keyCopy].map((item) => {
return parseObjectKeys(item, type)
})
}
}
}
}
return obj
}
/**
* 字符串 - 蛇形转驼峰
* @param {String} value
* vk.pubfn.snake2camel(value);
*/
pubfn.snake2camel = function(value) {
return value.replace(isSnakeCase, (_, c) => (c ? c.toUpperCase() : ''))
}
/**
* 字符串 - 驼峰转蛇形
* @param {String} value
* vk.pubfn.camel2snake(value);
*/
pubfn.camel2snake = function(value) {
return value.replace(isCamelCase, str => '_' + str.toLowerCase())
}
/**
* 对象内的属性名 - 蛇形转驼峰
* @param {Object} obj
* vk.pubfn.snake2camelJson(obj);
*/
pubfn.snake2camelJson = function(obj) {
return parseObjectKeys(obj, 'snake2camel');
};
/**
* 对象内的属性名 - 驼峰转蛇形
* @param {Object} obj
* vk.pubfn.camel2snakeJson(obj);
*/
pubfn.camel2snakeJson = function(obj) {
return parseObjectKeys(obj, 'camel2snake');
};
/**
* 将能转成数字的字符串转数字(支持字符串、对象、数组)
* @param {Any} obj
* @param {Object} option 哪些格式需要排除
* 默认排除
* mobile:true 手机号,如 15200000001
* idCard:true 身份证,如 330154202109301214
* startFrom0:true 第一位是0,且长度大于1的,同时第二位不是.的字符串 如 01,057189101254
* maxLength:14 超过此长度的字符串排除
* vk.pubfn.string2Number(obj, option);
*/
pubfn.string2Number = function(obj, option = {}) {
const type = Object.prototype.toString.call(obj).slice(8, -1).toLowerCase();
switch (type) {
case 'string':
if (obj && !isNaN(obj)) {
let {
mobile = true,
idCard = true,
startFrom0 = true,
maxLength = 14,
} = option;
if (obj.length > maxLength) {
return obj;
} else if (mobile && pubfn.test(obj, "mobile")) {
return obj;
} else if (idCard && pubfn.test(obj, "card")) {
return obj;
} else if (startFrom0 && obj.length > 1 && obj.indexOf("0") === 0 && obj.indexOf(".") !== 1) {
return obj;
}
return Number(obj);
} else {
return obj;
}
case 'object':
const keys = Object.keys(obj);
for (let i = 0; i < keys.length; i++) {
const key = keys[i];
obj[key] = pubfn.string2Number(obj[key]);
}
return obj;
case 'array':
for (let i = 0; i < obj.length; i++) {
obj[i] = pubfn.string2Number(obj[i]);
}
return obj;
default:
return obj;
}
};
/**
* 保留小数
* @param {Number} val 原值
* @param {Number} precision 精度
* vk.pubfn.toDecimal(val, 2);
*/
pubfn.toDecimal = function(val, precision = 0) {
if (typeof val === "string") val = Number(val);
return parseFloat(val.toFixed(precision));
};
/**
* 判断文件url的类型
* @param {String} url 文件的url路径
* vk.pubfn.getFileType(url);
* 返回值为字符串
* image 图片
* video 视频
* audio 音频
* other 其他
*/
pubfn.getFileType = function(url) {
let fileType;
if (pubfn.checkFileSuffix(url, ["png", "jpg", "jpeg", "gif", "bmp", "svg"])) {
fileType = "image";
} else if (pubfn.checkFileSuffix(url, ["avi", "mp4", "3gp", "mov", "rmvb", "rm", "flv", "mkv"])) {
fileType = "video";
} else if (pubfn.checkFileSuffix(url, ["mp3"])) {
fileType = "audio";
} else {
fileType = "other";
}
return fileType;
};
/**
* 获取文件url的后缀名
* @param {String} url 文件的url路径,必须带
* vk.pubfn.getFileSuffix(url);
*/
pubfn.getFileSuffix = function(url) {
let suffix;
let index = url.lastIndexOf(".");
if (index > -1) {
suffix = url.substring(index + 1);
}
return suffix;
};
/**
* 判断文件url是否在指定后缀名数组内
* @param {String} url 文件的url路径
* @param {Array<String>} list 后缀名列表
* vk.pubfn.checkFileSuffix(url,["png", "jpg", "jpeg", "gif", "bmp", "svg"]);
*/
pubfn.checkFileSuffix = function(url, list) {
let key = false;
let suffix = pubfn.getFileSuffix(url);
for (let i = 0; i < list.length; i++) {
if (list.indexOf(suffix) > -1) {
key = true;
break;
}
}
return key;
};
// 前端专属开始 -----------------------------------------------------------
/**
* 将时间显示成1秒前、1天前
* @description 主要用于 文章最后回复时间: 1分钟前
* @param {String || Number} startTime 需要计算的时间 如文章最后回复时间
* vk.pubfn.dateDiff(startTime);
*/
pubfn.dateDiff = function(startTime, suffix = "前") {
if (!startTime) {
return "";
}
if (typeof startTime === "string" && !isNaN(startTime)) startTime = Number(startTime);
if (typeof startTime == "number") {
if (startTime.toString().length == 10) startTime *= 1000;
startTime = new Date(startTime);
startTime = pubfn.timeFormat(startTime);
}
if (typeof startTime == "string") {
startTime = startTime.replace("T", " ");
startTime = startTime;
startTime = new Date(startTime.replace(/-/g, "/")); //将-转化为/,使用new Date
}
let endTime = new Date(); //获取当前时间
let nd = 1000 * 24 * 60 * 60; //一天的毫秒数
let nh = 1000 * 60 * 60; //一小时的毫秒数
let nm = 1000 * 60; //一分钟的毫秒数
let ns = 1000; //一秒钟的毫秒数long diff;try {
let diff = endTime.getTime() - startTime.getTime();
let day = Math.floor(diff / nd); //计算差多少天
let hour = Math.floor(diff % nd / nh); //计算差多少小时
let min = Math.floor(diff % nd % nh / nm); //计算差多少分钟
let sec = Math.round(diff % nd % nh % nm / ns); //计算差多少秒//输出结果
let showStr = "1 秒";
if (day > 0) {
showStr = day + "天";
} else if (hour > 0) {
showStr = hour + "小时";
} else if (min > 0) {
showStr = min + "分钟";
} else if (sec > 0) {
showStr = sec + "秒";
}
showStr += suffix;
return showStr;
}
/**
* 将时间显示成1秒、1天
* @description 主要用于 到期时间剩余 : 3天 这样的场景
* @param {String || Number} endTime 需要计算的时间 如到期时间
* vk.pubfn.dateDiff2(endTime);
*/
pubfn.dateDiff2 = function(startTime, str = "1秒") {
if (!startTime) {
return "";
}
if (typeof startTime === "string" && !isNaN(startTime)) startTime = Number(startTime);
if (typeof startTime == "number") {
if (startTime.toString().length == 10) startTime *= 1000;
startTime = new Date(startTime);
startTime = pubfn.timeFormat(startTime);
}
if (typeof startTime == "string") {
startTime = startTime.replace("T", " ");
startTime = startTime;
startTime = new Date(startTime.replace(/-/g, "/")); //将-转化为/,使用new Date
}
let endTime = new Date(); //获取当前时间
let nd = 1000 * 24 * 60 * 60; //一天的毫秒数
let nh = 1000 * 60 * 60; //一小时的毫秒数
let nm = 1000 * 60; //一分钟的毫秒数
let ns = 1000; //一秒钟的毫秒数long diff;try {
let diff = startTime.getTime() - endTime.getTime();
let day = Math.floor(diff / nd);
let hour = Math.floor(diff % nd / nh);
let min = Math.floor(diff % nd % nh / nm);
let sec = Math.round(diff % nd % nh % nm / ns);
let showStr = str;
if (day > 0) {
showStr = day + "天";
} else if (hour > 0) {
showStr = hour + "小时";
} else if (min > 0) {
showStr = min + "分钟";
} else if (sec > 0) {
showStr = sec + "秒";
}
return showStr;
};
/**
* 将大数字转中文
* @description 主要用于展示浏览量等不需要非常精确显示的场景
* 如:
* 3210 -> 3千
* 31210 -> 3万
* 1523412 -> 1百万
* 15234120 ->1千万
* @param {Number} n 需要转换的数字
* vk.pubfn.numStr(n);
*/
pubfn.numStr = function(n) {
if (typeof n == "string") {
n = parseFloat(n);
}
let str = n;
if (n < 1000) {
str = n;
} else if (n < 10000) {
let n1 = Math.floor(n / 100);
str = n1 / 10 + "千"
} else if (n < 1000000) {
let n1 = Math.floor(n / 1000);
str = n1 / 10 + "万"
} else if (n < 10000000) {
let n1 = Math.floor(n / 1000000);
str = n1 + "百万"
} else if (n < 100000000) {
let n1 = Math.floor(n / 10000000);
str = n1 + "千万"
} else if (n >= 100000000) {
let n1 = Math.floor(n / 10000000);
str = n1 / 10 + "亿"
}
return str;
};
/**
* 金额显示过滤器(已分为单位,将100 转成 1)
* @param {Number} money 金额
* vk.pubfn.priceFilter(money);
*/
pubfn.priceFilter = function(money, defaultValue = "") {
if (pubfn.isNull(money)) {
return defaultValue;
}
if (isNaN(money)) {
return money;
}
if (typeof money == "string") {
money = parseFloat(money);
}
return (money / 100).toFixed(2);
};
// 金额过滤器 - 只显示小数点左边
pubfn.priceLeftFilter = function(n) {
let s = "";
if (n) {
s = pubfn.priceFilter(n).split(".")[0];
}
return s;
};
// 金额过滤器 - 只显示小数点右边
pubfn.priceRightFilter = function(n) {
let s = "";
if (n) {
s = pubfn.priceFilter(n).split(".")[1];
}
return s;
};
/**
* 百分比过滤器 将 0.01 显示成 1% 1 显示成 100%
* @param {Number} value 百分比值
* @param {Boolean} needShowSymbol 显示 % 这个符号
* @param {String | Number} defaultValue value为空时的默认值
* vk.pubfn.percentageFilter(money);
*/
pubfn.percentageFilter = function(value, needShowSymbol = true, defaultValue = "") {
if (pubfn.isNull(value)) {
return defaultValue;
}
if (isNaN(value)) {
return value;
}
if (typeof value == "string") {
value = parseFloat(value);
}
value = parseFloat((value * 100).toFixed(2));
if (needShowSymbol) {
value += "%";
}
return value;
};
/**
* 折扣过滤器 将 0.1 显示成 1折 1 显示成 原价 0 显示成免费
* @param {Number} value 折扣值
* @param {Boolean} needShowSymbol 显示 折 这个中文字符
* @param {String | Number} defaultValue value为空时的默认值
* vk.pubfn.discountFilter(value);
*/
pubfn.discountFilter = function(value, needShowSymbol = true, defaultValue = "") {
if (pubfn.isNull(value)) {
return defaultValue;
}
if (isNaN(value)) {
return value;
}
if (typeof value == "string") {
value = parseFloat(value);
}
value = parseFloat((value * 10).toFixed(2));
if (value > 10) {
return "折扣不可以大于原价";
}
if (value == 10) {
return "原价";
}
if (value == 0) {
return "免费";
}
if (value < 0) {
return "折扣不可以小于0";
}
if (needShowSymbol) {
value += " 折";
}
return value;
};
/**
* 将字符串格式的时间转为时间戳
* @param {String} dateString 格式为:2020-08-08 12:12:12
*/
pubfn.toTimeLong = function(dateString) {
if (!dateString) {
return "";
}
dateString = dateString.substring(0, 19);
dateString = dateString.replace(new RegExp(/-/, "g"), '/');
let time = new Date(dateString).getTime();
if (isNaN(time)) {
time = "";
}
return time;
};
/**
* 单位进制换算
* length 换算前大小
* arr 进制的数组,如["B","KB","MB","GB"]
* ary 进制,如KB-MB-GB,进制1024
* precision 数值精度
* vk.pubfn.calcSize(length,["B","KB","MB","GB"],1024,3);
*/
pubfn.calcSize = function(length = 0, arr, ary, precision = 2, showType = "auto") {
length = parseFloat(length);
let size = 0;
let type = "";
if (length < ary || arr.length <= 1) {
type = arr[0];
size = parseFloat(length.toFixed(precision));
} else {
for (let i = 1; i < arr.length; i++) {
let currentType = arr[i];
length = length / ary;
if (showType === "auto") {
if (length < ary) {
type = currentType;
size = parseFloat(length.toFixed(precision));
break;
}
} else {
if (showType === currentType) {
type = currentType;
size = parseFloat(length.toFixed(precision));
break;
}
}
}
}
return {
size: size,
type: type,
title: size + " " + type
}
};
/**
* 将一个大数组拆分成N个小数组(分割数组)
* @param {Array} array 大数组
* @param {Number} size 小数组每组最大多少个
* 代码示例
* let newArray = vk.pubfn.splitArray(array, 2);
*/
pubfn.splitArray = function(array, size) {
let data = [];
for (let i = 0; i < array.length; i += size) {
data.push(array.slice(i, i + size))
}
return data
};
/**
* 将对象内的属性按照ASCII字符顺序进行排序,返回排序后的对象
* @param {Object} obj 需要排序对象
* 代码示例
* let newObj = vk.pubfn.objectKeySort(obj);
*/
pubfn.objectKeySort = function(obj) {
let keys = Object.keys(obj).sort();
let newObject = {};
for (let i in keys) {
newObject[keys[i]] = (obj[keys[i]]);
}
return newObject;
};
// 以下是前端专属API-----------------------------------------------------------
/**
* 手机端长列表分页加载数据 2.0版本
* @param {Vue页面对象} that 页面数据对象this
* @param {String} url 请求地址(云函数路径)
* @param {String} listName 后端返回的list数组的字段名称,默认rows(二选一即可)
* @param {String} listKey 后端返回的list数组的字段名称,默认rows(二选一即可)
* @param {String} formKey 表单请求的对象数据源字段名称,默认queryForm1
* @param {Object} data 额外数据
* @param {function} dataPreprocess 数据预处理函数
*
* 代码示例
vk.pubfn.getListData2({
that : this,
url : "template/db_api/pub/select",
data : {
a : 1
},
dataPreprocess : function(list){
return list;
}
});
*/
pubfn.getListData2 = function(obj = {}) {
let vk = uni.vk;
let {
that,
listName,
listKey = "rows",
formKey = "queryForm1",
url,
dataPreprocess,
idKeyName = "_id"
} = obj;
if (listName) listKey = listName;
/**
* 2.0与1.0的区别
* 2.0使用的queryForm1作为查询,而1.0是form1
* 2.0云函数端是getTableData,而1.0是selects
*/
let queryForm1 = that[formKey] || that.queryForm1 || that.queryForm;
// 标记为请求中
that.loading = true;
let hasMore = true;
if (queryForm1.pagination.pageIndex === 1) {
that.firstLoading = true;
}
vk.callFunction({
url: url,
data: queryForm1,
success: function(data) {
let list = data[listKey] || [];
// 数据预处理
if (typeof dataPreprocess == "function") {
list = dataPreprocess(list);
}
if (queryForm1.pagination.pageIndex > 1) {
// 翻页
if (list.length == 0) {
// 无数据时
hasMore = false;
queryForm1.pagination.pageIndex--;
list = that.data.list;
} else {
// 有数据时
if (list.length < queryForm1.pagination.pageSize) {
hasMore = false;
}
// 数据合并
list = vk.pubfn.arr_concat(that.data.list, list, idKeyName);
}
} else if (queryForm1.pagination.pageIndex == 1) {
// 第一页
if (list.length < queryForm1.pagination.pageSize) {
hasMore = false;
}
if (list.length == 0) {
that.state.isEmpty = true;
} else {
that.state.isEmpty = false;
}
}
// 如果后端返回了hasMore,则使用后端的hasMore值
if (typeof data.hasMore !== "undefined") {
hasMore = data.hasMore;
}
data = {
...data,
total: data.total,
list: list,
hasMore: hasMore,
pageIndex: data.pageIndex,
pageSize: data.pageSize
};
that.state.loadmore = hasMore ? "loadmore" : "nomore"; // 更新状态
that.data = vk.pubfn.objectAssign(that.data, data); // 更新数据
if (typeof obj.success == "function") obj.success(data);
},
fail: function(err) {
that.state.loadmore = "loadmore";
if (queryForm1.pagination.pageIndex > 1) {
queryForm1.pagination.pageIndex--;
}
if (typeof obj.fail == "function") {
obj.fail(data);
} else if (err && err.msg) {
vk.toast(err.msg, "none");
}
},
complete: function(res) {
that.loading = false;
if (queryForm1.pagination.pageIndex === 1) {
that.state.firstLoading = false;
}
if (typeof obj.complete == "function") obj.complete(res);
}
});
};
/**
* 手机端长列表分页加载数据(1.0版本)
* @param {Vue页面对象} that 页面数据对象this
* @param {String} url 请求地址(云函数路径)
* @param {String} listName 后端返回的list数组的字段名称,默认rows
* @param {String} listKey 后端返回的list数组的字段名称,默认rows
* @param {String} formKey 表单请求的对象数据源字段名称,默认form1
* @param {Object} data 额外数据
* @param {function} dataPreprocess 数据预处理函数
*
* 代码示例
vk.pubfn.getListData({
that : this,
url : "template/db_api/pub/select",
listKey : "rows",
formKey : "form1",
data : {
a : 1
},
dataPreprocess : function(list){
return list;
}
});
*/
pubfn.getListData = function(obj = {}) {
let {
that,
listName,
listKey = "rows",
formKey = "form1",
url,
dataPreprocess,
loading
} = obj;
let vk = uni.vk;
if (listName) listKey = listName;
let { data = {} } = that;
let form1 = that[formKey] || {};
let { pageKey = true } = data;
if (!form1.pageIndex) form1.pageIndex = 1;
if (!form1.pageSize) form1.pageSize = 20;
let addTime = form1.addTime;
let endTime = form1.endTime;
if (endTime) endTime += " 23:59:59";
if (!pageKey && form1.pageIndex > 1) {
form1.pageIndex--;
return false;
}
if (addTime) form1.addTimeLong = pubfn.toTimeLong(addTime);
if (endTime) form1.endTimeLong = pubfn.toTimeLong(endTime);
if (obj.data && JSON.stringify(obj.data) != "{}") {
pubfn.objectAssign(form1, obj.data);
}
let title = obj.title;
if (typeof obj.title == "undefined" && !loading) {
title = form1.pageIndex == 1 ? "请求中..." : "";
}
vk.callFunction({
url: url,
data: form1,
title: title,
loading: loading,
success: function(data) {
let list = data[listKey] || [];
// 数据预处理
if (typeof dataPreprocess == "function") {
list = dataPreprocess(list);
}
if (form1.pageIndex > 1) {
// 翻页
if (list.length == 0) {
// 无数据时
pageKey = false;
form1.pageIndex--;
list = that.data.list;
} else {
// 有数据时
if (list.length < form1.pageSize) {
pageKey = false;
}
let oldList = that.data.list;
// 数据合并
list = pubfn.arr_concat(oldList, list, "_id");
}
} else if (form1.pageIndex == 1) {
if (list.length < form1.pageSize) {
pageKey = false;
}
}
//console.log(pageKey,list.length,form1.pageSize);
data = {
...data,
total: data.total,
list: list,
pageKey: pageKey,
loadmore: pageKey ? "loadmore" : "nomore" // 更新状态
};
that.data = pubfn.objectAssign(that.data, data); // 更新数据
if (typeof obj.success == "function") obj.success(data);
},
fail: function(err) {
if (form1.pageIndex > 1) { form1.pageIndex--; }
if (typeof obj.fail == "function") {
obj.fail(data);
} else if (err && err.msg) {
vk.toast(err.msg, "none");
}
},
complete: function(res) {
if (typeof obj.complete == "function") obj.complete(res);
},
});
};
/**
* 动态组件数据获取
* @description 主要用于动态组件的数据获取
* @param {Vue页面对象} that 页面数据对象this
* @param {String} ids 动态数据组件的ID
*
* 代码示例
* 如:放置一个动态数据的 公告组件 和 一个轮播图组件
* view 核心:自定义组件接收一个 Object 类型的属性 datas
<vk-u-notice-bar :datas='componentsDynamic["notice-bar-01"]'></vk-u-notice-bar>
<vk-u-swiper :datas='componentsDynamic["index-swiper-01"]' :custom-datas='{
"height":600,
}'></vk-u-swiper>
在页面数据变量中新增 componentsDynamic
data() {
return {
// 动态组件数据集合
componentsDynamic:{}
}
}
在页面初始化方法中执行下面的函数
this.vk.pubfn.getComponentsDynamicData({
that : this,
ids : ["notice-bar-01","index-swiper-01"]
});
*/
pubfn.getComponentsDynamicData = function(obj = {}) {
let {
that,
keyName = "componentsDynamic",
title,
url = "plugs/components_dynamic/client/pub/getComponentsDynamicData",
ids
} = obj;
let vk = uni.vk;
let form1 = {
ids: ids
};
if (obj.data && JSON.stringify(obj.data) != "{}") {
pubfn.objectAssign(form1, obj.data);
}
// 读取缓存开始-----------------------------------------------------------
let cacheKey = "pub-componentsDynamic";
let cacheData = uni.getStorageSync(cacheKey) || {};
let cacheDataKey = JSON.stringify(ids);
if (cacheData[cacheDataKey]) {
// 渲染本地数据
that[keyName] = cacheData[cacheDataKey];
}
// 读取缓存结束-----------------------------------------------------------
vk.callFunction({
url: url,
data: form1,
title: title,
success: function(data) {
if (JSON.stringify(cacheData[cacheDataKey]) !== JSON.stringify(data.componentsDynamic)) {
// 渲染服务器数据
that[keyName] = data.componentsDynamic;
// 同时将组件数据进行缓存
cacheData[cacheDataKey] = data.componentsDynamic;
uni.setStorageSync(cacheKey, cacheData);
}
if (typeof obj.success == "function") obj.success(data);
},
fail: function(err) {
console.error(err);
if (typeof obj.fail == "function") obj.fail(data);
},
complete: function() {
if (typeof obj.complete == "function") obj.complete(data);
},
});
};
/**
* 将../../ 形式的页面相对路径 转成 页面绝对路径
* @param {String} url 需要转换的url
* vk.pubfn.getPageFullPath(url);
*/
pubfn.getPageFullPath = function(url) {
let fullPath = url;
if (fullPath.indexOf("/") !== 0) {
if (fullPath.indexOf("./") === 0) {
//fullPath = "." + fullPath;
fullPath = fullPath.substring(2);
}
let urlSplit = fullPath.split("../");
// 向上目录级数,0:根目录 1:向上1级
let level = urlSplit.length;
// 尾部路径
let urlEnd = urlSplit[level - 1];
// 获取当前页面的页面全路径
let pages = getCurrentPages();
let currentPage = pages[pages.length - 1];
let currentPagePath = currentPage.route;
// 分割成目录,最后一段是页面名称
let urlArr = currentPagePath.split("/");
let urlSplicing = "";
// 开始拼接
for (let i = 0; i < urlArr.length - level; i++) {
urlSplicing += urlArr[i] + "/";
}
// 完整页面路径
fullPath = urlSplicing + urlEnd;
if (fullPath.indexOf("/") != 0) {
fullPath = "/" + fullPath;
}
}
return fullPath;
};
/**
* 获取平台信息
* let platform = vk.pubfn.getPlatform();
*/
pubfn.getPlatform = function() {
let platform;
// #ifdef APP-PLUS || APP-NVUE || APP-PLUS-NVUE
platform = "app-plus";
// #endif
// #ifdef H5
platform = "h5";
// #endif
// #ifdef MP-WEIXIN
platform = "mp-weixin";
// #endif
// #ifdef MP-ALIPAY
platform = "mp-alipay";
// #endif
// #ifdef MP-BAIDU
platform = "mp-baidu";
// #endif
// #ifdef MP-TOUTIAO
platform = "mp-toutiao";
// #endif
// #ifdef MP-QQ
platform = "mp-qq";
// #endif
// #ifdef MP-360
platform = "mp-360";
// #endif
// #ifdef MP-KUAISHOU
platform = "mp-toutiao";
// #endif
return platform;
};
/**
* 获取当前页面实例
* 返回数据
* fullPath 当前打开页面的完整路径(带页面参数)
* pagePath 当前打开页面的路径(不含参数)
* options 当前打开页面的参数
* route 当前打开页面路由地址
* $vm 当前打开页面的vue实例
* vk.pubfn.getCurrentPage();
*/
pubfn.getCurrentPage = function() {
let res = {};
let pages = getCurrentPages();
let page = pages[pages.length - 1];
if (page.route.indexOf("/") == 0) page.route = page.route.substring(1);
let pagePath = `/${page.route}`;
let fullPath = `/${page.route}`;
let options = page.options;
if (page.$page) {
if (typeof page.$page.fullPath !== "undefined") {
fullPath = page.$page.fullPath;
} else if (typeof options === "object") {
let optionsStr = pubfn.queryParams(options);
fullPath = pagePath + optionsStr;
}
}
res.fullPath = fullPath;
res.pagePath = pagePath;
res.options = options;
res.route = page.route;
res.$vm = page.$vm;
return res;
};
/**
* 获取当前页面路由
* vk.pubfn.getCurrentPageRoute();
*/
pubfn.getCurrentPageRoute = function(removeSlash) {
let pages = getCurrentPages();
let page = pages[pages.length - 1];
if (removeSlash) {
return page.route;
} else {
return "/" + page.route;
}
};
/**
* 文件转base64
方式一
vk.pubfn.fileToBase64({
file:res.tempFiles[0],
success:function(base64){
}
});
方式二
vk.pubfn.fileToBase64({ file }).then(base64 => {
});
*/
pubfn.fileToBase64 = function(obj = {}) {
let { file } = obj;
let filePath = typeof file === "object" ? file.path : file;
return new Promise(function(resolve, reject) {
// #ifdef H5
let reader = new FileReader();
reader.readAsDataURL(file);
reader.onload = function(res) {
let base64 = this.result;
if (base64.indexOf(";base64,") == -1) {
base64 = "data:image/jpeg;base64," + base64;
}
if (obj.success) obj.success(base64);
if (obj.complete) obj.complete(base64);
resolve(base64);
};
reader.onerror = function(err) {
if (obj.fail) obj.fail(err);
if (obj.complete) obj.complete(err);
reject(err);
};
// #endif
// #ifdef MP
uni.getFileSystemManager().readFile({
filePath: filePath,
encoding: "base64",
success: function(res) {
let base64 = res.data;
if (base64.indexOf(";base64,") == -1) {
base64 = "data:image/jpeg;base64," + base64;
}
if (obj.success) obj.success(base64);
if (obj.complete) obj.complete(base64);
resolve(base64);
},
fail: function(err) {
if (obj.fail) obj.fail(err);
reject(err);
},
complete: obj.complete
});
// let base64 = uni.getFileSystemManager().readFileSync(file.path, 'base64');
// if(obj.success) obj.success(base64);
// if(obj.complete) obj.complete(base64);
// resolve(base64);
// #endif
// #ifdef APP-PLUS
plus.io.resolveLocalFileSystemURL(pubfn.getLocalFilePath(filePath), function(entry) {
entry.file(function(file) {
let fileReader = new plus.io.FileReader();
fileReader.onload = function(data) {
if (obj.success) obj.success(data.target.result);
if (obj.complete) obj.complete(data.target.result);
resolve(data.target.result);
}
fileReader.onerror = function(err) {
if (obj.fail) obj.fail(err);
reject(err);
}
fileReader.readAsDataURL(file)
}, function(err) {
if (obj.fail) obj.fail(err);
reject(err);
})
}, function(err) {
if (obj.fail) obj.fail(err);
reject(err);
})
// #endif
});
};
/**
* base64转文件
方式一
vk.pubfn.base64ToFile({
base64:base64,
success:function(file){
}
});
方式二
vk.pubfn.base64ToFile({ base64 }).then(file => {
});
*/
pubfn.base64ToFile = function(obj = {}) {
let {
base64 = "",
filePath
} = obj;
let extName = base64.split(',')[0].match(/data\:\S+\/(\S+);/);
if (extName) {
extName = extName[1];
} else {
reject(new Error('base64 error'));
}
if (!filePath) {
filePath = pubfn.random(32, "abcdefghijklmnopqrstuvwxyz0123456789") + '.' + extName;
}
let index = base64.indexOf("base64,");
let base64Data = base64;
if (index > -1) {
base64Data = base64.substring(base64.indexOf("base64,") + 7);
}
let savePath;
return new Promise(function(resolve, reject) {
// #ifdef MP
savePath = wx.env.USER_DATA_PATH + '/' + filePath;
let fs = uni.getFileSystemManager();
fs.writeFile({
filePath: savePath,
data: base64Data,
encoding: "base64",
success: function(res) {
let file = {
path: savePath,
lastModifiedDate: new Date(),
name: filePath
};
if (obj.success) obj.success(file);
resolve(file);
},
fail: function(res) {
if (obj.fail) obj.fail(res);
reject(res);
},
complete: obj.complete
});
// #endif
// #ifdef H5
savePath = filePath;
let blob = pubfn.base64toBlob(base64);
let file = pubfn.blobToFile(blob, savePath);
if (obj.success) obj.success(file);
if (obj.complete) obj.complete(file);
resolve(file);
// #endif
// #ifdef APP-PLUS
let fileName = filePath;
let basePath = '_user_resources';
let dirPath = 'vk_temp';
savePath = basePath + '/' + dirPath + '/' + fileName;
let bitmap = new plus.nativeObj.Bitmap(fileName);
bitmap.loadBase64Data(base64, function() {
bitmap.save(savePath, {}, function() {
bitmap.clear();
let file = {
path: savePath,
lastModifiedDate: new Date(),
name: filePath
};
if (obj.success) obj.success(file);
if (obj.complete) obj.complete(file);
resolve(file);
}, function(error) {
bitmap.clear();
if (obj.fail) obj.fail(error);
reject(error);
})
}, function(error) {
bitmap.clear();
if (obj.fail) obj.fail(error);
reject(error);
})
// #endif
});
};
/**
* 将base64转换为blob (H5独有)
vk.pubfn.base64toBlob(base64);
*/
pubfn.base64toBlob = function(base64) {
let arr = base64.split(',');
let mime = arr[0].match(/:(.*?);/)[1];
let bstr = atob(arr[1]);
let n = bstr.length;
let u8arr = new Uint8Array(n);
while (n--) {
u8arr[n] = bstr.charCodeAt(n);
}
return new Blob([u8arr], { type: mime });
};
/**
* //将blob转换为file
vk.pubfn.blobToFile(base64);
*/
pubfn.blobToFile = function(blob, fileName) {
blob.lastModifiedDate = new Date();
blob.name = fileName;
blob.path = URL.createObjectURL(blob);
return blob;
};
/**
* 小程序订阅消息 前端无需再写 #ifdef MP-WEIXIN
vk.pubfn.requestSubscribeMessage({
tmplIds: ['NcspDBQpH6CGHos3mMADrrQpEv2gHmtfOPa5KTLs92E']
});
*/
pubfn.requestSubscribeMessage = function(obj) {
// #ifdef MP-WEIXIN
return uni.requestSubscribeMessage(obj);
// #endif
};
/**
* 检测是否需要登录 此方法目前为测试版
* vk.pubfn.checkLogin();
*/
pubfn.checkLogin = function(obj = {}) {
let vk = uni.vk;
let loginUrl = vk.getConfig("login.url");
try {
let url;
try {
url = obj.url || vk.pubfn.getCurrentPageRoute();
} catch (err) {
url = vk.getConfig("index.url") || "/pages/index/index";
}
vk.navigate.checkNeedLogin({
url: url,
success: function(res) {
if (res.needLogin) {
// 记录下原本要跳转的页面
url = vk.pubfn.getPageFullPath(obj.fullPath || url);
vk.navigate.setOriginalPage({ url });
if (obj.isOnLaunch) vk.navigate.isOnLaunchToLogin = true; // 标记为首次启动的页面需要登录
uni.reLaunch({
url: loginUrl,
success: () => {
// #ifdef MP-WEIXIN
setTimeout(() => {
uni.hideHomeButton();
}, 400);
// #endif
}
});
} else {
// #ifdef H5
// 解决微信公众号登录无法跳回原页面的问题
if (!obj.options || !obj.options.code || !obj.options.state) {
vk.navigate.setOriginalPage(null);
}
// #endif
// #ifndef H5
vk.navigate.setOriginalPage(null);
// #endif
}
}
});
} catch (err) {
console.error("catch", err);
uni.reLaunch({
url: loginUrl
});
// #ifdef MP-WEIXIN
uni.hideHomeButton();
// #endif
}
};
/**
* 获取文件本地路径
* @param {Object} path
*/
pubfn.getLocalFilePath = function(path) {
if (path.indexOf('_www') === 0 || path.indexOf('_doc') === 0 || path.indexOf('_documents') === 0 || path.indexOf('_downloads') === 0) {
return path
}
if (path.indexOf('file://') === 0) {
return path
}
if (path.indexOf('/storage/emulated/0/') === 0) {
return path
}
if (path.indexOf('/') === 0 && typeof plus !== "undefined") {
let localFilePath = plus.io.convertAbsoluteFileSystem(path)
if (localFilePath !== path) {
return localFilePath
} else {
path = path.substr(1)
}
}
return '_www/' + path
};
/**
* 获取当前支持的应用语言
* let localeList = vk.pubfn.getLocaleList();
*/
pubfn.getLocaleList = function() {
let localeList = [
{ value: "zh-Hans", label: "简体中文" },
{ value: "zh-Hant", label: "繁體中文" },
{ value: "en", label: "English" }
];
return localeList;
};
/**
* 获取当前应用语言
* let locale = vk.pubfn.getLocale();
*/
pubfn.getLocale = function() {
let localeValue;
if (typeof uni.getLocale === "function") {
localeValue = uni.getLocale();
} else {
localeValue = "zh-Hans"; // 默认中文简体
}
let localeObj = {
"zh_CN": "zh-Hans", // 中国大陆(简体)
"zh_HK": "zh-Hant", // 香港(繁体)
"zh_MO": "zh-Hant", // 澳门(繁体)
"zh_SG": "zh-Hans", // 新加坡(简体)
"zh_TW": "zh-Hant", // 台湾(繁体)
};
if (localeObj[localeValue]) localeValue = localeObj[localeValue];
return localeValue;
};
/**
* 获取当前应用语言
* let localeObj = vk.pubfn.getLocaleObject();
*/
pubfn.getLocaleObject = function() {
let value = pubfn.getLocale();
let list = pubfn.getLocaleList();
return pubfn.getListItem(list, "value", value);
};
/**
* 设置当前应用语言
*/
pubfn.setLocale = function(...e) {
return uni.setLocale(...e);
};
/**
* 将obj2的数据赋值给obj1,并使vue双向绑定(vue2对象新增属性不会双向绑定)
* @description 将 obj2 的属性赋值给 obj1 (如果obj1中有对应的属性,则会被obj2的属性值覆盖)
* @param {Object} obj1
* @param {Object} obj2
* @param {Object} that 页面实例
* vk.pubfn.objectAssignForVue(obj1, obj2, that);
*/
pubfn.objectAssignForVue = function(obj1, obj2, that) {
pubfn.objectDeleteInvalid(obj2);
for (let key in obj2) {
that.$set(obj1, key, obj2[key]);
}
};
// 前端专属结束 -----------------------------------------------------------
export default pubfn;