代码格式修改
This commit is contained in:
@@ -12,7 +12,7 @@ export const StrUtil = {
|
||||
* @return boolean 是否为空
|
||||
*/
|
||||
isBlank: function (str) {
|
||||
return str === undefined || str == null || this.trim(str) === "";
|
||||
return str === undefined || str == null || this.trim(str) === ''
|
||||
|
||||
},
|
||||
/**
|
||||
@@ -26,7 +26,7 @@ export const StrUtil = {
|
||||
*/
|
||||
isNotBlank: function (str) {
|
||||
// == 代表相同,=== 代表严格相同
|
||||
return false === StrUtil.isBlank(str);
|
||||
return false === StrUtil.isBlank(str)
|
||||
},
|
||||
/**
|
||||
* 字符串是否为空,空的定义如下:<br>
|
||||
@@ -37,7 +37,7 @@ export const StrUtil = {
|
||||
* @return boolean 是否为空
|
||||
*/
|
||||
isEmpty: function (str) {
|
||||
return str == null || str === "";
|
||||
return str == null || str === ''
|
||||
|
||||
},
|
||||
/**
|
||||
@@ -49,7 +49,7 @@ export const StrUtil = {
|
||||
* @return boolean 是否为非空
|
||||
*/
|
||||
isNotEmpty: function (str) {
|
||||
return !StrUtil.isEmpty(str);
|
||||
return !StrUtil.isEmpty(str)
|
||||
},
|
||||
/**
|
||||
* 空对象转字符串
|
||||
@@ -59,9 +59,9 @@ export const StrUtil = {
|
||||
*/
|
||||
nullToStr: function (str) {
|
||||
if (StrUtil.isEmpty(str)) {
|
||||
return "";
|
||||
return ''
|
||||
}
|
||||
return str;
|
||||
return str
|
||||
},
|
||||
/**
|
||||
* 空格截取
|
||||
@@ -71,9 +71,9 @@ export const StrUtil = {
|
||||
*/
|
||||
trim: function (str) {
|
||||
if (str == null) {
|
||||
return "";
|
||||
return ''
|
||||
}
|
||||
return str.toString().replace(/(^\s*)|(\s*$)|\r|\n/g, "");
|
||||
return str.toString().replace(/(^\s*)|(\s*$)|\r|\n/g, '')
|
||||
},
|
||||
/**
|
||||
* 比较两个字符串(大小写敏感)
|
||||
@@ -83,7 +83,7 @@ export const StrUtil = {
|
||||
* @return boolean
|
||||
*/
|
||||
equals: function (str, that) {
|
||||
return str === that;
|
||||
return str === that
|
||||
},
|
||||
/**
|
||||
* 比较两个字符串(大小写不敏感)
|
||||
@@ -93,7 +93,7 @@ export const StrUtil = {
|
||||
* @return boolean
|
||||
*/
|
||||
equalsIgnoreCase: function (str, that) {
|
||||
return String(str).toUpperCase() === String(that).toUpperCase();
|
||||
return String(str).toUpperCase() === String(that).toUpperCase()
|
||||
},
|
||||
/**
|
||||
* 将字符串按指定字符分割
|
||||
@@ -105,10 +105,10 @@ export const StrUtil = {
|
||||
*/
|
||||
split: function (str, sep, maxLen) {
|
||||
if (StrUtil.isEmpty(str)) {
|
||||
return null;
|
||||
return null
|
||||
}
|
||||
const value = String(str).split(sep);
|
||||
return maxLen ? value.slice(0, maxLen - 1) : value;
|
||||
const value = String(str).split(sep)
|
||||
return maxLen ? value.slice(0, maxLen - 1) : value
|
||||
},
|
||||
/**
|
||||
* 字符串格式化(%s )
|
||||
@@ -117,16 +117,16 @@ export const StrUtil = {
|
||||
* @return 格式化后的字符串
|
||||
*/
|
||||
sprintf: function (str) {
|
||||
let args = arguments, flag = true, i = 1;
|
||||
let args = arguments, flag = true, i = 1
|
||||
str = str.replace(/%s/g, function () {
|
||||
const arg = args[i++];
|
||||
const arg = args[i++]
|
||||
if (typeof arg === 'undefined') {
|
||||
flag = false;
|
||||
return '';
|
||||
flag = false
|
||||
return ''
|
||||
}
|
||||
return arg;
|
||||
});
|
||||
return flag ? str : '';
|
||||
return arg
|
||||
})
|
||||
return flag ? str : ''
|
||||
},
|
||||
/**
|
||||
* 判断字符串是否是以start开头
|
||||
@@ -136,8 +136,8 @@ export const StrUtil = {
|
||||
* @return boolean
|
||||
*/
|
||||
startWith: function (str, start) {
|
||||
const reg = new RegExp("^" + start);
|
||||
return reg.test(str);
|
||||
const reg = new RegExp('^' + start)
|
||||
return reg.test(str)
|
||||
},
|
||||
/**
|
||||
* 判断字符串是否是以end结尾
|
||||
@@ -147,152 +147,152 @@ export const StrUtil = {
|
||||
* @return boolean
|
||||
*/
|
||||
endWith: function (str, end) {
|
||||
const reg = new RegExp(end + "$");
|
||||
return reg.test(str);
|
||||
const reg = new RegExp(end + '$')
|
||||
return reg.test(str)
|
||||
},
|
||||
containsWhitespace: function (input) {
|
||||
return this.contains(input, ' ');
|
||||
return this.contains(input, ' ')
|
||||
},
|
||||
//生成指定个数的字符
|
||||
repeat: function (ch, repeatTimes) {
|
||||
let result = "";
|
||||
let result = ''
|
||||
for (let i = 0; i < repeatTimes; i++) {
|
||||
result += ch;
|
||||
result += ch
|
||||
}
|
||||
return result;
|
||||
return result
|
||||
},
|
||||
deleteWhitespace: function (input) {
|
||||
return input.replace(/\s+/g, '');
|
||||
return input.replace(/\s+/g, '')
|
||||
},
|
||||
rightPad: function (input, size, padStr) {
|
||||
return input + this.repeat(padStr, size);
|
||||
return input + this.repeat(padStr, size)
|
||||
},
|
||||
leftPad: function (input, size, padStr) {
|
||||
return this.repeat(padStr, size) + input;
|
||||
return this.repeat(padStr, size) + input
|
||||
},
|
||||
//首小写字母转大写
|
||||
capitalize: function (input) {
|
||||
let strLen = 0;
|
||||
let strLen = 0
|
||||
if (input == null || (strLen = input.length) === 0) {
|
||||
return input;
|
||||
return input
|
||||
}
|
||||
return input.replace(/^[a-z]/, function (matchStr) {
|
||||
return matchStr.toLocaleUpperCase();
|
||||
});
|
||||
return matchStr.toLocaleUpperCase()
|
||||
})
|
||||
},
|
||||
//首大写字母转小写
|
||||
uncapitalize: function (input) {
|
||||
let strLen = 0;
|
||||
let strLen = 0
|
||||
if (input == null || (strLen = input.length) === 0) {
|
||||
return input;
|
||||
return input
|
||||
}
|
||||
return input.replace(/^[A-Z]/, function (matchStr) {
|
||||
return matchStr.toLocaleLowerCase();
|
||||
});
|
||||
return matchStr.toLocaleLowerCase()
|
||||
})
|
||||
},
|
||||
//大写转小写,小写转大写
|
||||
swapCase: function (input) {
|
||||
return input.replace(/[a-z]/ig, function (matchStr) {
|
||||
if (matchStr >= 'A' && matchStr <= 'Z') {
|
||||
return matchStr.toLocaleLowerCase();
|
||||
return matchStr.toLocaleLowerCase()
|
||||
} else if (matchStr >= 'a' && matchStr <= 'z') {
|
||||
return matchStr.toLocaleUpperCase();
|
||||
return matchStr.toLocaleUpperCase()
|
||||
}
|
||||
});
|
||||
})
|
||||
},
|
||||
//统计含有的子字符串的个数
|
||||
countMatches: function (input, sub) {
|
||||
if (this.isEmpty(input) || this.isEmpty(sub)) {
|
||||
return 0;
|
||||
return 0
|
||||
}
|
||||
let count = 0;
|
||||
let index = 0;
|
||||
let count = 0
|
||||
let index = 0
|
||||
while ((index = input.indexOf(sub, index)) !== -1) {
|
||||
index += sub.length;
|
||||
count++;
|
||||
index += sub.length
|
||||
count++
|
||||
}
|
||||
return count;
|
||||
return count
|
||||
},
|
||||
//只包含字母
|
||||
isAlpha: function (input) {
|
||||
return /^[a-z]+$/i.test(input);
|
||||
return /^[a-z]+$/i.test(input)
|
||||
},
|
||||
//只包含字母、空格
|
||||
isAlphaSpace: function (input) {
|
||||
return /^[a-z\s]*$/i.test(input);
|
||||
return /^[a-z\s]*$/i.test(input)
|
||||
},
|
||||
//只包含字母、数字
|
||||
isAlphanumeric: function (input) {
|
||||
return /^[a-z0-9]+$/i.test(input);
|
||||
return /^[a-z0-9]+$/i.test(input)
|
||||
},
|
||||
//只包含字母、数字和空格
|
||||
isAlphanumericSpace: function (input) {
|
||||
return /^[a-z0-9\s]*$/i.test(input);
|
||||
return /^[a-z0-9\s]*$/i.test(input)
|
||||
},
|
||||
//数字
|
||||
isNumeric: function (input) {
|
||||
return /^(?:[1-9]\d*|0)(?:\.\d+)?$/.test(input);
|
||||
return /^(?:[1-9]\d*|0)(?:\.\d+)?$/.test(input)
|
||||
},
|
||||
//小数
|
||||
isDecimal: function (input) {
|
||||
return /^[-+]?(?:0|[1-9]\d*)\.\d+$/.test(input);
|
||||
return /^[-+]?(?:0|[1-9]\d*)\.\d+$/.test(input)
|
||||
},
|
||||
//负小数
|
||||
isNegativeDecimal: function (input) {
|
||||
return /^\-?(?:0|[1-9]\d*)\.\d+$/.test(input);
|
||||
return /^\-?(?:0|[1-9]\d*)\.\d+$/.test(input)
|
||||
},
|
||||
//正小数
|
||||
isPositiveDecimal: function (input) {
|
||||
return /^\+?(?:0|[1-9]\d*)\.\d+$/.test(input);
|
||||
return /^\+?(?:0|[1-9]\d*)\.\d+$/.test(input)
|
||||
},
|
||||
//整数
|
||||
isInteger: function (input) {
|
||||
return /^[-+]?(?:0|[1-9]\d*)$/.test(input);
|
||||
return /^[-+]?(?:0|[1-9]\d*)$/.test(input)
|
||||
},
|
||||
//正整数
|
||||
isPositiveInteger: function (input) {
|
||||
return /^\+?(?:0|[1-9]\d*)$/.test(input);
|
||||
return /^\+?(?:0|[1-9]\d*)$/.test(input)
|
||||
},
|
||||
//负整数
|
||||
isNegativeInteger: function (input) {
|
||||
return /^\-?(?:0|[1-9]\d*)$/.test(input);
|
||||
return /^\-?(?:0|[1-9]\d*)$/.test(input)
|
||||
},
|
||||
//只包含数字和空格
|
||||
isNumericSpace: function (input) {
|
||||
return /^[\d\s]*$/.test(input);
|
||||
return /^[\d\s]*$/.test(input)
|
||||
},
|
||||
isWhitespace: function (input) {
|
||||
return /^\s*$/.test(input);
|
||||
return /^\s*$/.test(input)
|
||||
},
|
||||
isAllLowerCase: function (input) {
|
||||
return /^[a-z]+$/.test(input);
|
||||
return /^[a-z]+$/.test(input)
|
||||
},
|
||||
isAllUpperCase: function (input) {
|
||||
return /^[A-Z]+$/.test(input);
|
||||
return /^[A-Z]+$/.test(input)
|
||||
},
|
||||
defaultString: function (input, defaultStr) {
|
||||
return input == null ? defaultStr : input;
|
||||
return input == null ? defaultStr : input
|
||||
},
|
||||
defaultIfBlank: function (input, defaultStr) {
|
||||
return this.isBlank(input) ? defaultStr : input;
|
||||
return this.isBlank(input) ? defaultStr : input
|
||||
},
|
||||
defaultIfEmpty: function (input, defaultStr) {
|
||||
return this.isEmpty(input) ? defaultStr : input;
|
||||
return this.isEmpty(input) ? defaultStr : input
|
||||
},
|
||||
//字符串反转
|
||||
reverse: function (input) {
|
||||
if (this.isBlank(input)) {
|
||||
input;
|
||||
input
|
||||
}
|
||||
return input.split("").reverse().join("");
|
||||
return input.split('').reverse().join('')
|
||||
},
|
||||
//删掉特殊字符(英文状态下)
|
||||
removeSpecialCharacter: function (input) {
|
||||
return input.replace(/[!-/:-@\[-`{-~]/g, "");
|
||||
return input.replace(/[!-/:-@\[-`{-~]/g, '')
|
||||
},
|
||||
//只包含特殊字符、数字和字母(不包括空格,若想包括空格,改为[ -~])
|
||||
isSpecialCharacterAlphanumeric: function (input) {
|
||||
return /^[!-~]+$/.test(input);
|
||||
return /^[!-~]+$/.test(input)
|
||||
},
|
||||
/**
|
||||
* 校验时排除某些字符串,即不能包含某些字符串
|
||||
@@ -311,96 +311,96 @@ export const StrUtil = {
|
||||
*/
|
||||
isPatternMustExcludeSomeStr: function (input, conditions) {
|
||||
//参数
|
||||
const matcherFlag = conditions.matcherFlag;
|
||||
const excludeStrArr = conditions.excludeStrArr;
|
||||
const length = conditions.length;
|
||||
const ignoreCase = conditions.ignoreCase;
|
||||
const matcherFlag = conditions.matcherFlag
|
||||
const excludeStrArr = conditions.excludeStrArr
|
||||
const length = conditions.length
|
||||
const ignoreCase = conditions.ignoreCase
|
||||
//拼正则
|
||||
const size = excludeStrArr.length;
|
||||
let regex = (size === 0) ? "^" : "^(?!.*(?:{0}))";
|
||||
let subPattern = "";
|
||||
const size = excludeStrArr.length
|
||||
let regex = (size === 0) ? '^' : '^(?!.*(?:{0}))'
|
||||
let subPattern = ''
|
||||
for (let i = 0; i < size; i++) {
|
||||
excludeStrArr[i] = Bee.StringUtils.escapeMetacharacterOfStr(excludeStrArr[i]);
|
||||
subPattern += excludeStrArr[i];
|
||||
excludeStrArr[i] = Bee.StringUtils.escapeMetacharacterOfStr(excludeStrArr[i])
|
||||
subPattern += excludeStrArr[i]
|
||||
if (i !== size - 1) {
|
||||
subPattern += "|";
|
||||
subPattern += '|'
|
||||
}
|
||||
}
|
||||
regex = this.format(regex, [subPattern]);
|
||||
regex = this.format(regex, [subPattern])
|
||||
switch (matcherFlag) {
|
||||
case '0':
|
||||
regex += "\\d";
|
||||
break;
|
||||
regex += '\\d'
|
||||
break
|
||||
case '1':
|
||||
regex += "[a-zA-Z]";
|
||||
break;
|
||||
regex += '[a-zA-Z]'
|
||||
break
|
||||
case '2':
|
||||
regex += "[a-z]";
|
||||
break;
|
||||
regex += '[a-z]'
|
||||
break
|
||||
case '3':
|
||||
regex += "[A-Z]";
|
||||
break;
|
||||
regex += '[A-Z]'
|
||||
break
|
||||
case '4':
|
||||
regex += "[!-/:-@\[-`{-~]";
|
||||
break;
|
||||
regex += '[!-/:-@\[-`{-~]'
|
||||
break
|
||||
case '5':
|
||||
regex += "[\u4E00-\u9FA5]";
|
||||
break;
|
||||
regex += '[\u4E00-\u9FA5]'
|
||||
break
|
||||
case '6':
|
||||
regex += "[a-zA-Z0-9]";
|
||||
break;
|
||||
regex += '[a-zA-Z0-9]'
|
||||
break
|
||||
case '7':
|
||||
regex += "[a-z0-9]";
|
||||
break;
|
||||
regex += '[a-z0-9]'
|
||||
break
|
||||
case '8':
|
||||
regex += "[A-Z0-9]";
|
||||
break;
|
||||
regex += '[A-Z0-9]'
|
||||
break
|
||||
case '9':
|
||||
regex += "[!-~]";
|
||||
break;
|
||||
regex += '[!-~]'
|
||||
break
|
||||
case '10':
|
||||
regex += "[0-9\u4E00-\u9FA5]";
|
||||
break;
|
||||
regex += '[0-9\u4E00-\u9FA5]'
|
||||
break
|
||||
case '11':
|
||||
regex += "[a-z!-/:-@\[-`{-~]";
|
||||
break;
|
||||
regex += '[a-z!-/:-@\[-`{-~]'
|
||||
break
|
||||
case '12':
|
||||
regex += "[A-Z!-/:-@\[-`{-~]";
|
||||
break;
|
||||
regex += '[A-Z!-/:-@\[-`{-~]'
|
||||
break
|
||||
case '13':
|
||||
regex += "[a-zA-Z!-/:-@\[-`{-~]";
|
||||
break;
|
||||
regex += '[a-zA-Z!-/:-@\[-`{-~]'
|
||||
break
|
||||
case '14':
|
||||
regex += "[a-z\u4E00-\u9FA5]";
|
||||
break;
|
||||
regex += '[a-z\u4E00-\u9FA5]'
|
||||
break
|
||||
case '15':
|
||||
regex += "[A-Z\u4E00-\u9FA5]";
|
||||
break;
|
||||
regex += '[A-Z\u4E00-\u9FA5]'
|
||||
break
|
||||
case '16':
|
||||
regex += "[a-zA-Z\u4E00-\u9FA5]";
|
||||
break;
|
||||
regex += '[a-zA-Z\u4E00-\u9FA5]'
|
||||
break
|
||||
case '17':
|
||||
regex += "[\u4E00-\u9FA5!-/:-@\[-`{-~]";
|
||||
break;
|
||||
regex += '[\u4E00-\u9FA5!-/:-@\[-`{-~]'
|
||||
break
|
||||
case '18':
|
||||
regex += "[\u4E00-\u9FA5!-~]";
|
||||
break;
|
||||
regex += '[\u4E00-\u9FA5!-~]'
|
||||
break
|
||||
case '19':
|
||||
regex += "[a-z\u4E00-\u9FA5!-/:-@\[-`{-~]";
|
||||
break;
|
||||
regex += '[a-z\u4E00-\u9FA5!-/:-@\[-`{-~]'
|
||||
break
|
||||
case '20':
|
||||
regex += "[A-Z\u4E00-\u9FA5!-/:-@\[-`{-~]";
|
||||
break;
|
||||
regex += '[A-Z\u4E00-\u9FA5!-/:-@\[-`{-~]'
|
||||
break
|
||||
case '100':
|
||||
regex += "[\s\S]";
|
||||
break;
|
||||
regex += '[\s\S]'
|
||||
break
|
||||
default:
|
||||
alert(matcherFlag + ":This type is not supported!");
|
||||
alert(matcherFlag + ':This type is not supported!')
|
||||
}
|
||||
regex += this.isNotBlank(length) ? "{" + length + "}" : "+";
|
||||
regex += "$";
|
||||
const pattern = new RegExp(regex, ignoreCase ? "i" : "");
|
||||
return pattern.test(input);
|
||||
regex += this.isNotBlank(length) ? '{' + length + '}' : '+'
|
||||
regex += '$'
|
||||
const pattern = new RegExp(regex, ignoreCase ? 'i' : '')
|
||||
return pattern.test(input)
|
||||
},
|
||||
/**
|
||||
* @param {String} message
|
||||
@@ -409,8 +409,8 @@ export const StrUtil = {
|
||||
*/
|
||||
format: function (message, arr) {
|
||||
return message.replace(/{(\d+)}/g, function (matchStr, group1) {
|
||||
return arr[group1];
|
||||
});
|
||||
return arr[group1]
|
||||
})
|
||||
},
|
||||
/**
|
||||
* 把连续出现多次的字母字符串进行压缩。如输入:aaabbbbcccccd 输出:3a4b5cd
|
||||
@@ -418,10 +418,10 @@ export const StrUtil = {
|
||||
* @param {Boolean} ignoreCase : true or false
|
||||
*/
|
||||
compressRepeatedStr: function (input, ignoreCase) {
|
||||
const pattern = new RegExp("([a-z])\\1+", ignoreCase ? "ig" : "g");
|
||||
const pattern = new RegExp('([a-z])\\1+', ignoreCase ? 'ig' : 'g')
|
||||
return input.replace(pattern, function (matchStr, group1) {
|
||||
return matchStr.length + group1;
|
||||
});
|
||||
return matchStr.length + group1
|
||||
})
|
||||
},
|
||||
/**
|
||||
* 校验必须同时包含某些字符串
|
||||
@@ -442,112 +442,112 @@ export const StrUtil = {
|
||||
*/
|
||||
isPatternMustContainSomeStr: function (input, conditions) {
|
||||
//参数
|
||||
const matcherFlag = conditions.matcherFlag;
|
||||
const containStrArr = conditions.containStrArr;
|
||||
const length = conditions.length;
|
||||
const ignoreCase = conditions.ignoreCase;
|
||||
const matcherFlag = conditions.matcherFlag
|
||||
const containStrArr = conditions.containStrArr
|
||||
const length = conditions.length
|
||||
const ignoreCase = conditions.ignoreCase
|
||||
//创建正则
|
||||
const size = containStrArr.length;
|
||||
let regex = "^";
|
||||
let subPattern = "";
|
||||
const size = containStrArr.length
|
||||
let regex = '^'
|
||||
let subPattern = ''
|
||||
for (let i = 0; i < size; i++) {
|
||||
containStrArr[i] = Bee.StringUtils.escapeMetacharacterOfStr(containStrArr[i]);
|
||||
subPattern += "(?=.*" + containStrArr[i] + ")";
|
||||
containStrArr[i] = Bee.StringUtils.escapeMetacharacterOfStr(containStrArr[i])
|
||||
subPattern += '(?=.*' + containStrArr[i] + ')'
|
||||
}
|
||||
regex += subPattern;
|
||||
regex += subPattern
|
||||
switch (matcherFlag) {
|
||||
case '0':
|
||||
regex += "\\d";
|
||||
break;
|
||||
regex += '\\d'
|
||||
break
|
||||
case '1':
|
||||
regex += "[a-zA-Z]";
|
||||
break;
|
||||
regex += '[a-zA-Z]'
|
||||
break
|
||||
case '2':
|
||||
regex += "[a-z]";
|
||||
break;
|
||||
regex += '[a-z]'
|
||||
break
|
||||
case '3':
|
||||
regex += "[A-Z]";
|
||||
break;
|
||||
regex += '[A-Z]'
|
||||
break
|
||||
case '4':
|
||||
regex += "[!-/:-@\[-`{-~]";
|
||||
break;
|
||||
regex += '[!-/:-@\[-`{-~]'
|
||||
break
|
||||
case '5':
|
||||
regex += "[\u4E00-\u9FA5]";
|
||||
break;
|
||||
regex += '[\u4E00-\u9FA5]'
|
||||
break
|
||||
case '6':
|
||||
regex += "[a-zA-Z0-9]";
|
||||
break;
|
||||
regex += '[a-zA-Z0-9]'
|
||||
break
|
||||
case '7':
|
||||
regex += "[a-z0-9]";
|
||||
break;
|
||||
regex += '[a-z0-9]'
|
||||
break
|
||||
case '8':
|
||||
regex += "[A-Z0-9]";
|
||||
break;
|
||||
regex += '[A-Z0-9]'
|
||||
break
|
||||
case '9':
|
||||
regex += "[!-~]";
|
||||
break;
|
||||
regex += '[!-~]'
|
||||
break
|
||||
case '10':
|
||||
regex += "[0-9\u4E00-\u9FA5]";
|
||||
break;
|
||||
regex += '[0-9\u4E00-\u9FA5]'
|
||||
break
|
||||
case '11':
|
||||
regex += "[a-z!-/:-@\[-`{-~]";
|
||||
break;
|
||||
regex += '[a-z!-/:-@\[-`{-~]'
|
||||
break
|
||||
case '12':
|
||||
regex += "[A-Z!-/:-@\[-`{-~]";
|
||||
break;
|
||||
regex += '[A-Z!-/:-@\[-`{-~]'
|
||||
break
|
||||
case '13':
|
||||
regex += "[a-zA-Z!-/:-@\[-`{-~]";
|
||||
break;
|
||||
regex += '[a-zA-Z!-/:-@\[-`{-~]'
|
||||
break
|
||||
case '14':
|
||||
regex += "[a-z\u4E00-\u9FA5]";
|
||||
break;
|
||||
regex += '[a-z\u4E00-\u9FA5]'
|
||||
break
|
||||
case '15':
|
||||
regex += "[A-Z\u4E00-\u9FA5]";
|
||||
break;
|
||||
regex += '[A-Z\u4E00-\u9FA5]'
|
||||
break
|
||||
case '16':
|
||||
regex += "[a-zA-Z\u4E00-\u9FA5]";
|
||||
break;
|
||||
regex += '[a-zA-Z\u4E00-\u9FA5]'
|
||||
break
|
||||
case '17':
|
||||
regex += "[\u4E00-\u9FA5!-/:-@\[-`{-~]";
|
||||
break;
|
||||
regex += '[\u4E00-\u9FA5!-/:-@\[-`{-~]'
|
||||
break
|
||||
case '18':
|
||||
regex += "[\u4E00-\u9FA5!-~]";
|
||||
break;
|
||||
regex += '[\u4E00-\u9FA5!-~]'
|
||||
break
|
||||
case '19':
|
||||
regex += "[a-z\u4E00-\u9FA5!-/:-@\[-`{-~]";
|
||||
break;
|
||||
regex += '[a-z\u4E00-\u9FA5!-/:-@\[-`{-~]'
|
||||
break
|
||||
case '20':
|
||||
regex += "[A-Z\u4E00-\u9FA5!-/:-@\[-`{-~]";
|
||||
break;
|
||||
regex += '[A-Z\u4E00-\u9FA5!-/:-@\[-`{-~]'
|
||||
break
|
||||
case '100':
|
||||
regex += "[\s\S]";
|
||||
break;
|
||||
regex += '[\s\S]'
|
||||
break
|
||||
default:
|
||||
alert(matcherFlag + ":This type is not supported!");
|
||||
alert(matcherFlag + ':This type is not supported!')
|
||||
}
|
||||
regex += this.isNotBlank(length) ? "{" + length + "}" : "+";
|
||||
regex += "$";
|
||||
const pattern = new RegExp(regex, ignoreCase ? "i" : "");
|
||||
return pattern.test(input);
|
||||
regex += this.isNotBlank(length) ? '{' + length + '}' : '+'
|
||||
regex += '$'
|
||||
const pattern = new RegExp(regex, ignoreCase ? 'i' : '')
|
||||
return pattern.test(input)
|
||||
},
|
||||
//中文校验
|
||||
isChinese: function (input) {
|
||||
return /^[\u4E00-\u9FA5]+$/.test(input);
|
||||
return /^[\u4E00-\u9FA5]+$/.test(input)
|
||||
},
|
||||
//去掉中文字符
|
||||
removeChinese: function (input) {
|
||||
return input.replace(/[\u4E00-\u9FA5]+/gm, "");
|
||||
return input.replace(/[\u4E00-\u9FA5]+/gm, '')
|
||||
},
|
||||
//转义元字符
|
||||
escapeMetacharacter: function (input) {
|
||||
const metacharacter = "^$()*+.[]|\\-?{}|";
|
||||
const metacharacter = '^$()*+.[]|\\-?{}|'
|
||||
if (metacharacter.indexOf(input) >= 0) {
|
||||
input = "\\" + input;
|
||||
input = '\\' + input
|
||||
}
|
||||
return input;
|
||||
return input
|
||||
},
|
||||
//转义字符串中的元字符
|
||||
escapeMetacharacterOfStr: function (input) {
|
||||
return input.replace(/[\^\$\*\+\.\|\\\-\?\{\}\|]/gm, "\\$&");
|
||||
return input.replace(/[\^\$\*\+\.\|\\\-\?\{\}\|]/gm, '\\$&')
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
export const initCoze = async function (userInfo) {
|
||||
return new CozeWebSDK.WebChatClient({
|
||||
config: {
|
||||
bot_id: "7517200991494717475",
|
||||
bot_id: '7517200991494717475',
|
||||
botInfo: {
|
||||
parameters: {
|
||||
user_role: userInfo.roleGroup,
|
||||
@@ -12,10 +12,10 @@ export const initCoze = async function (userInfo) {
|
||||
},
|
||||
},
|
||||
auth: {
|
||||
type: "token",
|
||||
type: 'token',
|
||||
token: userInfo.accessToken,
|
||||
onRefreshToken: async () => {
|
||||
return userInfo.userInfo.accessToken;
|
||||
return userInfo.userInfo.accessToken
|
||||
},
|
||||
},
|
||||
userInfo: {
|
||||
@@ -25,13 +25,13 @@ export const initCoze = async function (userInfo) {
|
||||
},
|
||||
ui: {
|
||||
base: {
|
||||
icon: "https://p3-flow-imagex-sign.byteimg.com/ocean-cloud-tos/FileBizType.BIZ_BOT_ICON/4185184193750220_1751011524142392616_RI5wYOximW.jpg~tplv-a9rns2rl98-image-qvalue.jpeg?rk3s=bbd3e7ed&x-expires=1753606533&x-signature=OxWu7ZE9AsolGXHOZGxYQf36bt4%3D",
|
||||
layout: "pc",
|
||||
lang: "zh-CN",
|
||||
icon: 'https://p3-flow-imagex-sign.byteimg.com/ocean-cloud-tos/FileBizType.BIZ_BOT_ICON/4185184193750220_1751011524142392616_RI5wYOximW.jpg~tplv-a9rns2rl98-image-qvalue.jpeg?rk3s=bbd3e7ed&x-expires=1753606533&x-signature=OxWu7ZE9AsolGXHOZGxYQf36bt4%3D',
|
||||
layout: 'pc',
|
||||
lang: 'zh-CN',
|
||||
zIndex: 1000,
|
||||
},
|
||||
chatBot: {
|
||||
title: "“智水”AI辅导员",
|
||||
title: '“智水”AI辅导员',
|
||||
uploadable: true,
|
||||
width: 500,
|
||||
},
|
||||
@@ -44,14 +44,14 @@ export const initCoze = async function (userInfo) {
|
||||
},
|
||||
footer: {
|
||||
isShow: false,
|
||||
expressionText: "智能体由 {{name}}提供技术支持",
|
||||
expressionText: '智能体由 {{name}}提供技术支持',
|
||||
linkvars: {
|
||||
name: {
|
||||
text: "广西厚溥",
|
||||
link: "http://www.gxxdit.com/",
|
||||
text: '广西厚溥',
|
||||
link: 'http://www.gxxdit.com/',
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
});
|
||||
};
|
||||
})
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import axios from "axios";
|
||||
import { getTokenKeySessionStorage } from "./auth";
|
||||
import { useRouter } from "vue-router";
|
||||
import { showToast } from "@/utils/toast"; // 请替换为你的Toast组件
|
||||
import axios from 'axios'
|
||||
import { getTokenKeySessionStorage } from './auth'
|
||||
import { useRouter } from 'vue-router'
|
||||
import { showToast } from '@/utils/toast' // 请替换为你的Toast组件
|
||||
|
||||
// 创建axios实例
|
||||
const service = axios.create({
|
||||
@@ -9,47 +9,47 @@ const service = axios.create({
|
||||
baseURL: process.env.VUE_APP_BASE_API,
|
||||
timeout: 15000,
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
});
|
||||
})
|
||||
|
||||
// 请求拦截器
|
||||
service.interceptors.request.use(
|
||||
(config) => {
|
||||
// 从本地存储获取token
|
||||
const token = getTokenKeySessionStorage();
|
||||
const token = getTokenKeySessionStorage()
|
||||
if (token) {
|
||||
config.headers.Authorization = `Bearer ${token}`;
|
||||
config.headers.Authorization = `Bearer ${token}`
|
||||
}
|
||||
return config;
|
||||
return config
|
||||
},
|
||||
(error) => {
|
||||
return Promise.reject(error);
|
||||
return Promise.reject(error)
|
||||
}
|
||||
);
|
||||
)
|
||||
|
||||
// 响应拦截器
|
||||
service.interceptors.response.use(
|
||||
(response) => {
|
||||
// 对响应数据做处理
|
||||
return response.data;
|
||||
return response.data
|
||||
},
|
||||
(error) => {
|
||||
const router = useRouter();
|
||||
const router = useRouter()
|
||||
|
||||
// 处理401未授权
|
||||
if (error.response?.status === 401) {
|
||||
showToast("登录已过期,请重新登录", "error");
|
||||
router.push("/login");
|
||||
showToast('登录已过期,请重新登录', 'error')
|
||||
router.push('/login')
|
||||
}
|
||||
|
||||
// 处理其他错误状态码
|
||||
if (error.response?.status === 500) {
|
||||
showToast("服务器错误,请稍后再试", "error");
|
||||
showToast('服务器错误,请稍后再试', 'error')
|
||||
}
|
||||
|
||||
return Promise.reject(error);
|
||||
return Promise.reject(error)
|
||||
}
|
||||
);
|
||||
)
|
||||
|
||||
export default service;
|
||||
export default service
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { getTokenKeySessionStorage } from "@/utils/auth";
|
||||
import { getTokenKeySessionStorage } from '@/utils/auth'
|
||||
/**
|
||||
* 创建聊天流式连接
|
||||
* @param {Object} params 请求参数
|
||||
@@ -11,53 +11,53 @@ import { getTokenKeySessionStorage } from "@/utils/auth";
|
||||
export function createChatStream(params) {
|
||||
const requestId = `req-${Date.now()}-${Math.random()
|
||||
.toString(36)
|
||||
.slice(2, 8)}`;
|
||||
const url = `${process.env.VUE_APP_BASE_API}/aitutor/aichat/stream`;
|
||||
const token = getTokenKeySessionStorage();
|
||||
.slice(2, 8)}`
|
||||
const url = `${process.env.VUE_APP_BASE_API}/aitutor/aichat/stream`
|
||||
const token = getTokenKeySessionStorage()
|
||||
|
||||
if (!token) {
|
||||
throw new Error("请先登录");
|
||||
throw new Error('请先登录')
|
||||
}
|
||||
|
||||
const controller = new AbortController();
|
||||
const controller = new AbortController()
|
||||
|
||||
const fetchPromise = fetch(url, {
|
||||
method: "POST",
|
||||
method: 'POST',
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
'Content-Type': 'application/json',
|
||||
Authorization: `Bearer ${token}`,
|
||||
"X-Request-ID": requestId,
|
||||
'X-Request-ID': requestId,
|
||||
},
|
||||
body: JSON.stringify({
|
||||
query: params.prompt,
|
||||
user_id: params.userId,
|
||||
user_name: params.userName,
|
||||
user_token: params.user_token || "123",
|
||||
user_role: "student",
|
||||
user_token: params.user_token || '123',
|
||||
user_role: 'student',
|
||||
conversation_id: params.conversationId || null,
|
||||
}),
|
||||
signal: controller.signal,
|
||||
}).then((response) => {
|
||||
if (!response.ok) {
|
||||
throw new Error(`HTTP ${response.status}`);
|
||||
throw new Error(`HTTP ${response.status}`)
|
||||
}
|
||||
if (!response.body) {
|
||||
throw new Error("Response body is null");
|
||||
throw new Error('Response body is null')
|
||||
}
|
||||
return {
|
||||
reader: response.body.getReader(),
|
||||
decoder: new TextDecoder("utf-8"),
|
||||
};
|
||||
});
|
||||
decoder: new TextDecoder('utf-8'),
|
||||
}
|
||||
})
|
||||
|
||||
return {
|
||||
stream: fetchPromise,
|
||||
cancel: (reason) => {
|
||||
if (!controller.signal.aborted) {
|
||||
controller.abort(reason);
|
||||
controller.abort(reason)
|
||||
}
|
||||
},
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -73,39 +73,39 @@ export async function processStream(
|
||||
decoder,
|
||||
{ onMessage, onError, onComplete }
|
||||
) {
|
||||
let buffer = "";
|
||||
let buffer = ''
|
||||
|
||||
try {
|
||||
while (true) {
|
||||
const { done, value } = await reader.read();
|
||||
if (done) break;
|
||||
const { done, value } = await reader.read()
|
||||
if (done) break
|
||||
|
||||
buffer += decoder.decode(value, { stream: true });
|
||||
const lines = buffer.split("\n");
|
||||
buffer = lines.pop() || "";
|
||||
buffer += decoder.decode(value, { stream: true })
|
||||
const lines = buffer.split('\n')
|
||||
buffer = lines.pop() || ''
|
||||
|
||||
for (const line of lines) {
|
||||
if (!line.trim()) continue;
|
||||
if (!line.trim()) continue
|
||||
|
||||
try {
|
||||
const data = JSON.parse(line);
|
||||
if (typeof onMessage === "function") {
|
||||
onMessage(data);
|
||||
const data = JSON.parse(line)
|
||||
if (typeof onMessage === 'function') {
|
||||
onMessage(data)
|
||||
}
|
||||
} catch (e) {
|
||||
console.warn("解析消息失败:", line, e);
|
||||
console.warn('解析消息失败:', line, e)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (typeof onComplete === "function") {
|
||||
onComplete();
|
||||
if (typeof onComplete === 'function') {
|
||||
onComplete()
|
||||
}
|
||||
} catch (error) {
|
||||
if (error.name !== "AbortError" && typeof onError === "function") {
|
||||
onError(error);
|
||||
if (error.name !== 'AbortError' && typeof onError === 'function') {
|
||||
onError(error)
|
||||
}
|
||||
} finally {
|
||||
reader.releaseLock();
|
||||
reader.releaseLock()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import Vue from 'vue'
|
||||
import { mergeRecursive } from "@/utils/ruoyi";
|
||||
import { mergeRecursive } from '@/utils/ruoyi'
|
||||
import DictMeta from './DictMeta'
|
||||
import DictData from './DictData'
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { mergeRecursive } from "@/utils/ruoyi";
|
||||
import { mergeRecursive } from '@/utils/ruoyi'
|
||||
import DictOptions from './DictOptions'
|
||||
|
||||
/**
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { mergeRecursive } from "@/utils/ruoyi";
|
||||
import { mergeRecursive } from '@/utils/ruoyi'
|
||||
import dictConverter from './DictConverter'
|
||||
|
||||
export const options = {
|
||||
|
||||
@@ -2,129 +2,129 @@ import HTML2canvas from 'html2canvas'
|
||||
import JSPDF from 'jspdf'
|
||||
|
||||
export default {
|
||||
install(Vue) {
|
||||
Vue.prototype.htmlToPdf = function (ele, title) {
|
||||
const dom = document.querySelector('#' + ele)
|
||||
HTML2canvas(dom, {
|
||||
useCORS: true,//解决网络图片跨域问题
|
||||
width: dom.width,
|
||||
height: dom.height,
|
||||
windowWidth: dom.scrollWidth,
|
||||
dpi: window.devicePixelRatio * 4, // 将分辨率提高到特定的DPI 提高四倍
|
||||
scale: 4, // 按比例增加分辨率
|
||||
}).then((canvas) => {
|
||||
// eslint-disable-next-line new-cap
|
||||
const pdf = new JSPDF('p', 'mm', 'a4'); // A4纸,纵向
|
||||
const ctx = canvas.getContext('2d');
|
||||
const a4w = 170;
|
||||
const a4h = 250; // A4大小,210mm x 297mm,四边各保留20mm的边距,显示区域170x257
|
||||
const imgHeight = Math.floor(a4h * canvas.width / a4w); // 按A4显示比例换算一页图像的像素高度
|
||||
let renderedHeight = 0;
|
||||
install(Vue) {
|
||||
Vue.prototype.htmlToPdf = function (ele, title) {
|
||||
const dom = document.querySelector('#' + ele)
|
||||
HTML2canvas(dom, {
|
||||
useCORS: true,//解决网络图片跨域问题
|
||||
width: dom.width,
|
||||
height: dom.height,
|
||||
windowWidth: dom.scrollWidth,
|
||||
dpi: window.devicePixelRatio * 4, // 将分辨率提高到特定的DPI 提高四倍
|
||||
scale: 4, // 按比例增加分辨率
|
||||
}).then((canvas) => {
|
||||
// eslint-disable-next-line new-cap
|
||||
const pdf = new JSPDF('p', 'mm', 'a4') // A4纸,纵向
|
||||
const ctx = canvas.getContext('2d')
|
||||
const a4w = 170
|
||||
const a4h = 250 // A4大小,210mm x 297mm,四边各保留20mm的边距,显示区域170x257
|
||||
const imgHeight = Math.floor(a4h * canvas.width / a4w) // 按A4显示比例换算一页图像的像素高度
|
||||
let renderedHeight = 0
|
||||
|
||||
while (renderedHeight < canvas.height) {
|
||||
const page = document.createElement('canvas');
|
||||
page.width = canvas.width;
|
||||
page.height = Math.min(imgHeight, canvas.height - renderedHeight);// 可能内容不足一页
|
||||
while (renderedHeight < canvas.height) {
|
||||
const page = document.createElement('canvas')
|
||||
page.width = canvas.width
|
||||
page.height = Math.min(imgHeight, canvas.height - renderedHeight)// 可能内容不足一页
|
||||
|
||||
// 用getImageData剪裁指定区域,并画到前面创建的canvas对象中
|
||||
page.getContext('2d').putImageData(ctx.getImageData(0, renderedHeight, canvas.width, Math.min(imgHeight, canvas.height - renderedHeight)), 0, 0);
|
||||
pdf.addImage(page.toDataURL('image/jpeg', 1.0), 'JPEG', 20, 20, a4w, Math.min(a4h, a4w * page.height / page.width)); // 添加图像到页面,保留10mm边距
|
||||
// 用getImageData剪裁指定区域,并画到前面创建的canvas对象中
|
||||
page.getContext('2d').putImageData(ctx.getImageData(0, renderedHeight, canvas.width, Math.min(imgHeight, canvas.height - renderedHeight)), 0, 0)
|
||||
pdf.addImage(page.toDataURL('image/jpeg', 1.0), 'JPEG', 20, 20, a4w, Math.min(a4h, a4w * page.height / page.width)) // 添加图像到页面,保留10mm边距
|
||||
|
||||
renderedHeight += imgHeight;
|
||||
if (renderedHeight < canvas.height) {
|
||||
pdf.addPage();// 如果后面还有内容,添加一个空页
|
||||
}
|
||||
// 预览pdf(这里我用的是事件总线把canvas传递过去展示,达到模拟pdf预览的效果,有用但效果不是很好,有需要的可以自行修改)
|
||||
//this.$EventBus.$emit('open-pdf', canvas);
|
||||
renderedHeight += imgHeight
|
||||
if (renderedHeight < canvas.height) {
|
||||
pdf.addPage()// 如果后面还有内容,添加一个空页
|
||||
}
|
||||
// 保存文件
|
||||
pdf.save(`${title}.pdf`);
|
||||
});
|
||||
};
|
||||
},
|
||||
// 预览pdf(这里我用的是事件总线把canvas传递过去展示,达到模拟pdf预览的效果,有用但效果不是很好,有需要的可以自行修改)
|
||||
//this.$EventBus.$emit('open-pdf', canvas);
|
||||
}
|
||||
// 保存文件
|
||||
pdf.save(`${title}.pdf`)
|
||||
})
|
||||
}
|
||||
},
|
||||
|
||||
// install(Vue) {
|
||||
// Vue.prototype.htmlToPdf = function (name, title) {
|
||||
// html2Canvas(document.querySelector('#' + name), {
|
||||
// // allowTaint: true,
|
||||
// useCORS: true,
|
||||
// scale: 2, // 提升画面质量,但是会增加文件大小
|
||||
// dpi: window.devicePixelRatio * 1,
|
||||
// }).then((canvas) => {
|
||||
// const contentWidth = canvas.width
|
||||
// const contentHeight = canvas.height
|
||||
// install(Vue) {
|
||||
// Vue.prototype.htmlToPdf = function (name, title) {
|
||||
// html2Canvas(document.querySelector('#' + name), {
|
||||
// // allowTaint: true,
|
||||
// useCORS: true,
|
||||
// scale: 2, // 提升画面质量,但是会增加文件大小
|
||||
// dpi: window.devicePixelRatio * 1,
|
||||
// }).then((canvas) => {
|
||||
// const contentWidth = canvas.width
|
||||
// const contentHeight = canvas.height
|
||||
|
||||
// /* 导出不分页处理 */
|
||||
// const pageData = canvas.toDataURL('image/jpeg', 1.0)
|
||||
// /* 导出不分页处理 */
|
||||
// const pageData = canvas.toDataURL('image/jpeg', 1.0)
|
||||
|
||||
// const pdfWidth = (contentWidth + 10) / 2 * 0.75
|
||||
// const pdfHeight = (contentHeight + 200) / 2 * 0.75 // 500为底部留白
|
||||
// const pdfWidth = (contentWidth + 10) / 2 * 0.75
|
||||
// const pdfHeight = (contentHeight + 200) / 2 * 0.75 // 500为底部留白
|
||||
|
||||
// const imgWidth = pdfWidth
|
||||
// const imgHeight = (contentHeight / 2 * 0.75) // 内容图片这里不需要留白的距离
|
||||
// const imgWidth = pdfWidth
|
||||
// const imgHeight = (contentHeight / 2 * 0.75) // 内容图片这里不需要留白的距离
|
||||
|
||||
// const PDF = new JsPDF('', 'pt', [ pdfWidth + 50, pdfHeight + 100, ])
|
||||
// PDF.addImage(pageData, 'jpeg', 33, 33, imgWidth, imgHeight)
|
||||
// PDF.save(title + '.pdf')
|
||||
// })
|
||||
// };
|
||||
// },
|
||||
// const PDF = new JsPDF('', 'pt', [ pdfWidth + 50, pdfHeight + 100, ])
|
||||
// PDF.addImage(pageData, 'jpeg', 33, 33, imgWidth, imgHeight)
|
||||
// PDF.save(title + '.pdf')
|
||||
// })
|
||||
// };
|
||||
// },
|
||||
|
||||
// install(Vue) {
|
||||
// Vue.prototype.htmlToPdf = async function (name, title) {
|
||||
// const ele = document.querySelector('#' + name)
|
||||
// const eleW = ele.offsetWidth// 获得该容器的宽
|
||||
// const eleH = ele.offsetHeight// 获得该容器的高
|
||||
// install(Vue) {
|
||||
// Vue.prototype.htmlToPdf = async function (name, title) {
|
||||
// const ele = document.querySelector('#' + name)
|
||||
// const eleW = ele.offsetWidth// 获得该容器的宽
|
||||
// const eleH = ele.offsetHeight// 获得该容器的高
|
||||
|
||||
// const eleOffsetTop = ele.offsetTop // 获得该容器到文档顶部的距离
|
||||
// const eleOffsetLeft = ele.offsetLeft // 获得该容器到文档最左的距离
|
||||
// const eleOffsetTop = ele.offsetTop // 获得该容器到文档顶部的距离
|
||||
// const eleOffsetLeft = ele.offsetLeft // 获得该容器到文档最左的距离
|
||||
|
||||
// var canvas = document.createElement('canvas')
|
||||
// var abs = 0
|
||||
// var canvas = document.createElement('canvas')
|
||||
// var abs = 0
|
||||
|
||||
// const win_in = document.documentElement.clientWidth || document.body.clientWidth // 获得当前可视窗口的宽度(不包含滚动条)
|
||||
// const win_out = window.innerWidth // 获得当前窗口的宽度(包含滚动条)
|
||||
// const win_in = document.documentElement.clientWidth || document.body.clientWidth // 获得当前可视窗口的宽度(不包含滚动条)
|
||||
// const win_out = window.innerWidth // 获得当前窗口的宽度(包含滚动条)
|
||||
|
||||
// if (win_out > win_in) {
|
||||
// // abs = (win_o - win_i)/2; // 获得滚动条长度的一半
|
||||
// abs = (win_out - win_in) / 2 // 获得滚动条宽度的一半
|
||||
// // console.log(a, '新abs');
|
||||
// }
|
||||
// if (win_out > win_in) {
|
||||
// // abs = (win_o - win_i)/2; // 获得滚动条长度的一半
|
||||
// abs = (win_out - win_in) / 2 // 获得滚动条宽度的一半
|
||||
// // console.log(a, '新abs');
|
||||
// }
|
||||
|
||||
// canvas.width = eleW * 2 // 将画布宽&&高放大两倍
|
||||
// canvas.height = eleH * 2
|
||||
// canvas.width = eleW * 2 // 将画布宽&&高放大两倍
|
||||
// canvas.height = eleH * 2
|
||||
|
||||
// var context = canvas.getContext('2d')
|
||||
// var context = canvas.getContext('2d')
|
||||
|
||||
// context.scale(2, 2)
|
||||
// context.scale(2, 2)
|
||||
|
||||
// context.translate(-eleOffsetLeft - abs, -eleOffsetTop)
|
||||
// // 这里默认横向没有滚动条的情况,因为offset.left(),有无滚动条的时候存在差值,因此
|
||||
// // translate的时候,要把这个差值去掉
|
||||
// context.translate(-eleOffsetLeft - abs, -eleOffsetTop)
|
||||
// // 这里默认横向没有滚动条的情况,因为offset.left(),有无滚动条的时候存在差值,因此
|
||||
// // translate的时候,要把这个差值去掉
|
||||
|
||||
// var pdf = new JsPDF('', 'pt', 'a4')
|
||||
// const childrenBox = ele.children
|
||||
// for (let i = 0; i < childrenBox.length; i++) { // 循环传过来的Dom的字节点 每个子节点打印成一页pdf A4纸那么大
|
||||
// console.log(childrenBox,'childrenBox');
|
||||
// console.log(1111);
|
||||
// const res = await html2Canvas(childrenBox[i], {
|
||||
// dpi: 300,
|
||||
// // allowTaint: true, //允许 canvas 污染, allowTaint参数要去掉,否则是无法通过toDataURL导出canvas数据的
|
||||
// useCORS: true, // 允许canvas画布内 可以跨域请求外部链接图片, 允许跨域请求。
|
||||
// scale: 4, // 提升导出的文件的分辨率
|
||||
// })
|
||||
// var pageData = res.toDataURL('image/jpeg', 1.0)
|
||||
// var contentWidth = res.width
|
||||
// var contentHeight = res.height
|
||||
// var imgWidth = 555.28
|
||||
// var imgHeight = 552.28 / contentWidth * contentHeight
|
||||
// pdf.addImage(pageData, 'JPEG', 20, 20, imgWidth, imgHeight)
|
||||
// if (i < childrenBox.length - 1) {
|
||||
// pdf.addPage() // 避免最后多一个空白页
|
||||
// }
|
||||
// }
|
||||
// pdf.save(`${title}.pdf`);
|
||||
// };
|
||||
// },
|
||||
}
|
||||
// var pdf = new JsPDF('', 'pt', 'a4')
|
||||
// const childrenBox = ele.children
|
||||
// for (let i = 0; i < childrenBox.length; i++) { // 循环传过来的Dom的字节点 每个子节点打印成一页pdf A4纸那么大
|
||||
// console.log(childrenBox,'childrenBox');
|
||||
// console.log(1111);
|
||||
// const res = await html2Canvas(childrenBox[i], {
|
||||
// dpi: 300,
|
||||
// // allowTaint: true, //允许 canvas 污染, allowTaint参数要去掉,否则是无法通过toDataURL导出canvas数据的
|
||||
// useCORS: true, // 允许canvas画布内 可以跨域请求外部链接图片, 允许跨域请求。
|
||||
// scale: 4, // 提升导出的文件的分辨率
|
||||
// })
|
||||
// var pageData = res.toDataURL('image/jpeg', 1.0)
|
||||
// var contentWidth = res.width
|
||||
// var contentHeight = res.height
|
||||
// var imgWidth = 555.28
|
||||
// var imgHeight = 552.28 / contentWidth * contentHeight
|
||||
// pdf.addImage(pageData, 'JPEG', 20, 20, imgWidth, imgHeight)
|
||||
// if (i < childrenBox.length - 1) {
|
||||
// pdf.addPage() // 避免最后多一个空白页
|
||||
// }
|
||||
// }
|
||||
// pdf.save(`${title}.pdf`);
|
||||
// };
|
||||
// },
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@ import { parseTime } from './ruoyi'
|
||||
* 表格时间格式化
|
||||
*/
|
||||
export function formatDate(cellValue) {
|
||||
if (cellValue == null || cellValue == "") return "";
|
||||
if (cellValue == null || cellValue == '') return ''
|
||||
var date = new Date(cellValue)
|
||||
var year = date.getFullYear()
|
||||
var month = date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1
|
||||
@@ -16,7 +16,7 @@ export function formatDate(cellValue) {
|
||||
}
|
||||
|
||||
export function formatDateByYearMonthDay(cellValue) {
|
||||
if (cellValue == null || cellValue == "") return "";
|
||||
if (cellValue == null || cellValue == '') return ''
|
||||
var date = new Date(cellValue)
|
||||
var year = date.getFullYear()
|
||||
var month = date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1
|
||||
@@ -69,9 +69,9 @@ export function formatTime(time, option) {
|
||||
}
|
||||
|
||||
export function nowTime(time, fmt) {
|
||||
if (!time) return '';
|
||||
if (!time) return ''
|
||||
else {
|
||||
const date = new Date(time);
|
||||
const date = new Date(time)
|
||||
const o = {
|
||||
'M+': date.getMonth() + 1,
|
||||
'd+': date.getDate(),
|
||||
@@ -80,12 +80,12 @@ export function nowTime(time, fmt) {
|
||||
's+': date.getSeconds(),
|
||||
'q+': Math.floor((date.getMonth() + 3) / 3),
|
||||
S: date.getMilliseconds(),
|
||||
};
|
||||
}
|
||||
if (/(y+)/.test(fmt))
|
||||
fmt = fmt.replace(
|
||||
RegExp.$1,
|
||||
(date.getFullYear() + '').substr(4 - RegExp.$1.length)
|
||||
);
|
||||
)
|
||||
for (const k in o) {
|
||||
if (new RegExp('(' + k + ')').test(fmt)) {
|
||||
fmt = fmt.replace(
|
||||
@@ -93,10 +93,10 @@ export function nowTime(time, fmt) {
|
||||
RegExp.$1.length === 1
|
||||
? o[k]
|
||||
: ('00' + o[k]).substr(('' + o[k]).length)
|
||||
);
|
||||
)
|
||||
}
|
||||
}
|
||||
return fmt;
|
||||
return fmt
|
||||
}
|
||||
}
|
||||
/**
|
||||
@@ -435,15 +435,15 @@ export function isNumberStr(str) {
|
||||
* @returns {Date}
|
||||
*/
|
||||
export function excelDateToJSDate(serial) {
|
||||
const utc_days = Math.floor(serial - 25569); // 转换为 Unix 天数
|
||||
const utc_value = utc_days * 86400; // 秒数
|
||||
const date_info = new Date(utc_value * 1000); // 得到 UTC 时间
|
||||
const utc_days = Math.floor(serial - 25569) // 转换为 Unix 天数
|
||||
const utc_value = utc_days * 86400 // 秒数
|
||||
const date_info = new Date(utc_value * 1000) // 得到 UTC 时间
|
||||
|
||||
const fractional_day = serial % 1;
|
||||
const total_seconds = Math.floor(86400 * fractional_day);
|
||||
const seconds = total_seconds % 60;
|
||||
const minutes = Math.floor(total_seconds / 60) % 60;
|
||||
const hours = Math.floor(total_seconds / 3600);
|
||||
const fractional_day = serial % 1
|
||||
const total_seconds = Math.floor(86400 * fractional_day)
|
||||
const seconds = total_seconds % 60
|
||||
const minutes = Math.floor(total_seconds / 60) % 60
|
||||
const hours = Math.floor(total_seconds / 3600)
|
||||
|
||||
// 使用 setUTCFullYear 避免本地时区干扰
|
||||
const result = new Date(Date.UTC(
|
||||
@@ -453,8 +453,8 @@ export function excelDateToJSDate(serial) {
|
||||
hours,
|
||||
minutes,
|
||||
seconds
|
||||
));
|
||||
))
|
||||
|
||||
return result;
|
||||
return result
|
||||
}
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@ export function checkPermi(value) {
|
||||
if (value && value instanceof Array && value.length > 0) {
|
||||
const permissions = store.getters && store.getters.permissions
|
||||
const permissionDatas = value
|
||||
const all_permission = "*:*:*";
|
||||
const all_permission = '*:*:*'
|
||||
|
||||
const hasPermission = permissions.some(permission => {
|
||||
return all_permission === permission || permissionDatas.includes(permission)
|
||||
@@ -20,7 +20,7 @@ export function checkPermi(value) {
|
||||
}
|
||||
return true
|
||||
} else {
|
||||
console.error(`need roles! Like checkPermi="['system:user:add','system:user:edit']"`)
|
||||
console.error('need roles! Like checkPermi="[\'system:user:add\',\'system:user:edit\']"')
|
||||
return false
|
||||
}
|
||||
}
|
||||
@@ -34,7 +34,7 @@ export function checkRole(value) {
|
||||
if (value && value instanceof Array && value.length > 0) {
|
||||
const roles = store.getters && store.getters.roles
|
||||
const permissionRoles = value
|
||||
const super_admin = "admin";
|
||||
const super_admin = 'admin'
|
||||
|
||||
const hasRole = roles.some(role => {
|
||||
return super_admin === role || permissionRoles.includes(role)
|
||||
@@ -45,7 +45,7 @@ export function checkRole(value) {
|
||||
}
|
||||
return true
|
||||
} else {
|
||||
console.error(`need roles! Like checkRole="['admin','editor']"`)
|
||||
console.error('need roles! Like checkRole="[\'admin\',\'editor\']"')
|
||||
return false
|
||||
}
|
||||
}
|
||||
@@ -2,14 +2,14 @@ import cache from '@/plugins/cache'
|
||||
import store from '@/store'
|
||||
import { getTokenKeySessionStorage } from '@/utils/auth'
|
||||
import errorCode from '@/utils/errorCode'
|
||||
import { blobValidate, tansParams } from "@/utils/ruoyi"
|
||||
import { blobValidate, tansParams } from '@/utils/ruoyi'
|
||||
import axios from 'axios'
|
||||
import { Loading, Message, MessageBox, Notification } from 'element-ui'
|
||||
import { saveAs } from 'file-saver'
|
||||
|
||||
let downloadLoadingInstance;
|
||||
let downloadLoadingInstance
|
||||
// 是否显示重新登录
|
||||
export let isRelogin = { show: false };
|
||||
export let isRelogin = { show: false }
|
||||
|
||||
axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'
|
||||
const defaultSettings = require('@/settings')
|
||||
@@ -32,10 +32,10 @@ service.interceptors.request.use(config => {
|
||||
}
|
||||
// get请求映射params参数
|
||||
if (config.method === 'get' && config.params) {
|
||||
let url = config.url + '?' + tansParams(config.params);
|
||||
url = url.slice(0, -1);
|
||||
config.params = {};
|
||||
config.url = url;
|
||||
let url = config.url + '?' + tansParams(config.params)
|
||||
url = url.slice(0, -1)
|
||||
config.params = {}
|
||||
config.url = url
|
||||
}
|
||||
if (!isRepeatSubmit && (config.method === 'post' || config.method === 'put')) {
|
||||
const requestObj = {
|
||||
@@ -47,12 +47,12 @@ service.interceptors.request.use(config => {
|
||||
if (sessionObj === undefined || sessionObj === null || sessionObj === '') {
|
||||
cache.session.setJSON('sessionObj', requestObj)
|
||||
} else {
|
||||
const s_url = sessionObj.url; // 请求地址
|
||||
const s_data = sessionObj.data; // 请求数据
|
||||
const s_time = sessionObj.time; // 请求时间
|
||||
const interval = 1000; // 间隔时间(ms),小于此时间视为重复提交
|
||||
const s_url = sessionObj.url // 请求地址
|
||||
const s_data = sessionObj.data // 请求数据
|
||||
const s_time = sessionObj.time // 请求时间
|
||||
const interval = 1000 // 间隔时间(ms),小于此时间视为重复提交
|
||||
if (s_data === requestObj.data && requestObj.time - s_time < interval && s_url === requestObj.url && s_url !=='/affix/upload') {
|
||||
const message = '数据正在处理,请勿重复提交';
|
||||
const message = '数据正在处理,请勿重复提交'
|
||||
console.log(`[${s_url}]: ` + message)
|
||||
return Promise.reject(new Error(message))
|
||||
} else {
|
||||
@@ -62,119 +62,119 @@ service.interceptors.request.use(config => {
|
||||
}
|
||||
return config
|
||||
}, error => {
|
||||
console.log(65,error)
|
||||
return Promise.reject(error)
|
||||
console.log(65,error)
|
||||
return Promise.reject(error)
|
||||
})
|
||||
|
||||
// 响应拦截器
|
||||
service.interceptors.response.use(res => {
|
||||
// 未设置状态码则默认成功状态
|
||||
const code = res.data.code || 200;
|
||||
// 获取错误信息
|
||||
const msg = errorCode[code] || res.data.msg || errorCode['default']
|
||||
// 二进制数据则直接返回
|
||||
if (res.request.responseType === 'blob' || res.request.responseType === 'arraybuffer') {
|
||||
return res.data
|
||||
}
|
||||
if (code === 401) {
|
||||
if (!isRelogin.show) {
|
||||
isRelogin.show = true;
|
||||
if(!defaultSettings.casEnable)
|
||||
{
|
||||
MessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', { confirmButtonText: '重新登录', cancelButtonText: '取消', type: 'warning' }).then(() => {
|
||||
isRelogin.show = false;
|
||||
store.dispatch('LogOut').then(() => {
|
||||
sessionStorage.clear();
|
||||
if (!defaultSettings.casEnable) {
|
||||
location.href = '/srs';
|
||||
}else{
|
||||
location.href = '/cas';
|
||||
}
|
||||
})
|
||||
}).catch(() => {
|
||||
isRelogin.show = false;
|
||||
});
|
||||
}
|
||||
// 未设置状态码则默认成功状态
|
||||
const code = res.data.code || 200
|
||||
// 获取错误信息
|
||||
const msg = errorCode[code] || res.data.msg || errorCode['default']
|
||||
// 二进制数据则直接返回
|
||||
if (res.request.responseType === 'blob' || res.request.responseType === 'arraybuffer') {
|
||||
return res.data
|
||||
}
|
||||
if (code === 401) {
|
||||
if (!isRelogin.show) {
|
||||
isRelogin.show = true
|
||||
if(!defaultSettings.casEnable)
|
||||
{
|
||||
MessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', { confirmButtonText: '重新登录', cancelButtonText: '取消', type: 'warning' }).then(() => {
|
||||
isRelogin.show = false
|
||||
store.dispatch('LogOut').then(() => {
|
||||
sessionStorage.clear()
|
||||
if (!defaultSettings.casEnable) {
|
||||
location.href = '/srs'
|
||||
}else{
|
||||
location.href = '/cas'
|
||||
}
|
||||
})
|
||||
}).catch(() => {
|
||||
isRelogin.show = false
|
||||
})
|
||||
}
|
||||
return Promise.reject('无效的会话,或者会话已过期,请重新登录。')
|
||||
} else if (code === 500) {
|
||||
Message({ message: msg, type: 'error',duration:5000 })
|
||||
return res.data
|
||||
} else if (code === 601) {
|
||||
Message({ message: msg, type: 'warning' })
|
||||
return Promise.reject('error')
|
||||
} else if (code !== 200) {
|
||||
Notification.error({ title: msg })
|
||||
return Promise.reject('error')
|
||||
} else {
|
||||
return res.data
|
||||
}
|
||||
},
|
||||
error => {
|
||||
console.log('err' + error)
|
||||
return Promise.reject('无效的会话,或者会话已过期,请重新登录。')
|
||||
} else if (code === 500) {
|
||||
Message({ message: msg, type: 'error',duration:5000 })
|
||||
return res.data
|
||||
} else if (code === 601) {
|
||||
Message({ message: msg, type: 'warning' })
|
||||
return Promise.reject('error')
|
||||
} else if (code !== 200) {
|
||||
Notification.error({ title: msg })
|
||||
return Promise.reject('error')
|
||||
} else {
|
||||
return res.data
|
||||
}
|
||||
},
|
||||
error => {
|
||||
console.log('err' + error)
|
||||
|
||||
// 判断是否是请求取消错误
|
||||
const isCanceled = error && (
|
||||
error.code === 'ERR_CANCELED' ||
|
||||
// 判断是否是请求取消错误
|
||||
const isCanceled = error && (
|
||||
error.code === 'ERR_CANCELED' ||
|
||||
error.code === 'ECONNABORTED' ||
|
||||
error.message === 'canceled' ||
|
||||
error.message === 'Cancel' ||
|
||||
error.__CANCEL__ === true ||
|
||||
(typeof error.message === 'string' && /cancel/i.test(error.message))
|
||||
);
|
||||
)
|
||||
|
||||
// 如果是请求取消,直接返回,不显示错误消息
|
||||
if (isCanceled) {
|
||||
console.log('请求被取消,忽略该错误');
|
||||
return Promise.reject(error);
|
||||
}
|
||||
|
||||
let { message } = error;
|
||||
if (message == "Network Error") {
|
||||
// 进一步判断是否真的是网络错误,还是页面卸载导致的
|
||||
if (window.performance && window.performance.navigation.type === 1) {
|
||||
// 页面刷新导致的,忽略
|
||||
console.log('页面刷新导致的网络错误,已忽略');
|
||||
return Promise.reject(error);
|
||||
}
|
||||
message = "后端接口连接异常";
|
||||
Message({ message: message, type: 'error', duration: 5 * 1000 })
|
||||
} else if (message.includes("timeout")) {
|
||||
message = "系统接口请求超时";
|
||||
Message({ message: message, type: 'error', duration: 5 * 1000 })
|
||||
} else if (message.includes("Request failed with status code")) {
|
||||
message = "系统接口" + message.substr(message.length - 3) + "异常";
|
||||
}
|
||||
console.log("接口请求错误:"+message);
|
||||
//Message({ message: message, type: 'error', duration: 5 * 1000 })
|
||||
// 如果是请求取消,直接返回,不显示错误消息
|
||||
if (isCanceled) {
|
||||
console.log('请求被取消,忽略该错误')
|
||||
return Promise.reject(error)
|
||||
}
|
||||
|
||||
let { message } = error
|
||||
if (message == 'Network Error') {
|
||||
// 进一步判断是否真的是网络错误,还是页面卸载导致的
|
||||
if (window.performance && window.performance.navigation.type === 1) {
|
||||
// 页面刷新导致的,忽略
|
||||
console.log('页面刷新导致的网络错误,已忽略')
|
||||
return Promise.reject(error)
|
||||
}
|
||||
message = '后端接口连接异常'
|
||||
Message({ message: message, type: 'error', duration: 5 * 1000 })
|
||||
} else if (message.includes('timeout')) {
|
||||
message = '系统接口请求超时'
|
||||
Message({ message: message, type: 'error', duration: 5 * 1000 })
|
||||
} else if (message.includes('Request failed with status code')) {
|
||||
message = '系统接口' + message.substr(message.length - 3) + '异常'
|
||||
}
|
||||
console.log('接口请求错误:'+message)
|
||||
//Message({ message: message, type: 'error', duration: 5 * 1000 })
|
||||
return Promise.reject(error)
|
||||
}
|
||||
)
|
||||
|
||||
// 通用下载方法
|
||||
export function download(url, params, filename, config) {
|
||||
downloadLoadingInstance = Loading.service({ text: "正在下载数据,请稍候", spinner: "el-icon-loading", background: "rgba(0, 0, 0, 0.7)", })
|
||||
downloadLoadingInstance = Loading.service({ text: '正在下载数据,请稍候', spinner: 'el-icon-loading', background: 'rgba(0, 0, 0, 0.7)', })
|
||||
return service.post(url, params, {
|
||||
transformRequest: [(params) => { return tansParams(params) }],
|
||||
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
|
||||
responseType: 'blob',
|
||||
...config
|
||||
}).then(async (data) => {
|
||||
const isBlob = blobValidate(data);
|
||||
const isBlob = blobValidate(data)
|
||||
if (isBlob) {
|
||||
const blob = new Blob([data])
|
||||
saveAs(blob, filename)
|
||||
} else {
|
||||
const resText = await data.text();
|
||||
const rspObj = JSON.parse(resText);
|
||||
const resText = await data.text()
|
||||
const rspObj = JSON.parse(resText)
|
||||
const errMsg = errorCode[rspObj.code] || rspObj.msg || errorCode['default']
|
||||
Message.error(errMsg);
|
||||
Message.error(errMsg)
|
||||
}
|
||||
downloadLoadingInstance.close();
|
||||
downloadLoadingInstance.close()
|
||||
}).catch((r) => {
|
||||
console.error(r)
|
||||
Message.error('下载文件出现错误,请联系管理员!')
|
||||
downloadLoadingInstance.close();
|
||||
downloadLoadingInstance.close()
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
@@ -17,7 +17,7 @@ export function parseTime(time, pattern) {
|
||||
if ((typeof time === 'string') && (/^[0-9]+$/.test(time))) {
|
||||
time = parseInt(time)
|
||||
} else if (typeof time === 'string') {
|
||||
time = time.replace(new RegExp(/-/gm), '/').replace('T', ' ').replace(new RegExp(/\.[\d]{3}/gm), '');
|
||||
time = time.replace(new RegExp(/-/gm), '/').replace('T', ' ').replace(new RegExp(/\.[\d]{3}/gm), '')
|
||||
}
|
||||
if ((typeof time === 'number') && (time.toString().length === 10)) {
|
||||
time = time * 1000
|
||||
@@ -48,89 +48,89 @@ export function parseTime(time, pattern) {
|
||||
// 表单重置
|
||||
export function resetForm(refName) {
|
||||
if (this.$refs[refName]) {
|
||||
this.$refs[refName].resetFields();
|
||||
this.$refs[refName].resetFields()
|
||||
}
|
||||
}
|
||||
|
||||
// 添加日期范围
|
||||
export function addDateRange(params, dateRange, propName) {
|
||||
let search = params;
|
||||
search.params = typeof (search.params) === 'object' && search.params !== null && !Array.isArray(search.params) ? search.params : {};
|
||||
dateRange = Array.isArray(dateRange) ? dateRange : [];
|
||||
let search = params
|
||||
search.params = typeof (search.params) === 'object' && search.params !== null && !Array.isArray(search.params) ? search.params : {}
|
||||
dateRange = Array.isArray(dateRange) ? dateRange : []
|
||||
if (typeof (propName) === 'undefined') {
|
||||
search.params['beginTime'] = dateRange[0];
|
||||
search.params['endTime'] = dateRange[1];
|
||||
search.params['beginTime'] = dateRange[0]
|
||||
search.params['endTime'] = dateRange[1]
|
||||
} else {
|
||||
search.params['begin' + propName] = dateRange[0];
|
||||
search.params['end' + propName] = dateRange[1];
|
||||
search.params['begin' + propName] = dateRange[0]
|
||||
search.params['end' + propName] = dateRange[1]
|
||||
}
|
||||
return search;
|
||||
return search
|
||||
}
|
||||
|
||||
// 回显数据字典
|
||||
export function selectDictLabel(datas, value) {
|
||||
if (value === undefined) {
|
||||
return "";
|
||||
return ''
|
||||
}
|
||||
var actions = [];
|
||||
var actions = []
|
||||
Object.keys(datas).some((key) => {
|
||||
if (datas[key].value == ('' + value)) {
|
||||
actions.push(datas[key].label);
|
||||
return true;
|
||||
actions.push(datas[key].label)
|
||||
return true
|
||||
}
|
||||
})
|
||||
if (actions.length === 0) {
|
||||
actions.push(value);
|
||||
actions.push(value)
|
||||
}
|
||||
return actions.join('');
|
||||
return actions.join('')
|
||||
}
|
||||
|
||||
// 回显数据字典(字符串、数组)
|
||||
export function selectDictLabels(datas, value, separator) {
|
||||
if (value === undefined || value.length ===0) {
|
||||
return "";
|
||||
return ''
|
||||
}
|
||||
if (Array.isArray(value)) {
|
||||
value = value.join(",");
|
||||
value = value.join(',')
|
||||
}
|
||||
var actions = [];
|
||||
var currentSeparator = undefined === separator ? "," : separator;
|
||||
var temp = value.split(currentSeparator);
|
||||
var actions = []
|
||||
var currentSeparator = undefined === separator ? ',' : separator
|
||||
var temp = value.split(currentSeparator)
|
||||
Object.keys(value.split(currentSeparator)).some((val) => {
|
||||
var match = false;
|
||||
var match = false
|
||||
Object.keys(datas).some((key) => {
|
||||
if (datas[key].value == ('' + temp[val])) {
|
||||
actions.push(datas[key].label + currentSeparator);
|
||||
match = true;
|
||||
actions.push(datas[key].label + currentSeparator)
|
||||
match = true
|
||||
}
|
||||
})
|
||||
if (!match) {
|
||||
actions.push(temp[val] + currentSeparator);
|
||||
actions.push(temp[val] + currentSeparator)
|
||||
}
|
||||
})
|
||||
return actions.join('').substring(0, actions.join('').length - 1);
|
||||
return actions.join('').substring(0, actions.join('').length - 1)
|
||||
}
|
||||
|
||||
// 字符串格式化(%s )
|
||||
export function sprintf(str) {
|
||||
var args = arguments, flag = true, i = 1;
|
||||
var args = arguments, flag = true, i = 1
|
||||
str = str.replace(/%s/g, function () {
|
||||
var arg = args[i++];
|
||||
var arg = args[i++]
|
||||
if (typeof arg === 'undefined') {
|
||||
flag = false;
|
||||
return '';
|
||||
flag = false
|
||||
return ''
|
||||
}
|
||||
return arg;
|
||||
});
|
||||
return flag ? str : '';
|
||||
return arg
|
||||
})
|
||||
return flag ? str : ''
|
||||
}
|
||||
|
||||
// 转换字符串,undefined,null等转化为""
|
||||
export function parseStrEmpty(str) {
|
||||
if (!str || str == "undefined" || str == "null") {
|
||||
return "";
|
||||
if (!str || str == 'undefined' || str == 'null') {
|
||||
return ''
|
||||
}
|
||||
return str;
|
||||
return str
|
||||
}
|
||||
|
||||
// 数据合并
|
||||
@@ -138,16 +138,16 @@ export function mergeRecursive(source, target) {
|
||||
for (var p in target) {
|
||||
try {
|
||||
if (target[p].constructor == Object) {
|
||||
source[p] = mergeRecursive(source[p], target[p]);
|
||||
source[p] = mergeRecursive(source[p], target[p])
|
||||
} else {
|
||||
source[p] = target[p];
|
||||
source[p] = target[p]
|
||||
}
|
||||
} catch (e) {
|
||||
source[p] = target[p];
|
||||
source[p] = target[p]
|
||||
}
|
||||
}
|
||||
return source;
|
||||
};
|
||||
return source
|
||||
}
|
||||
|
||||
/**
|
||||
* 构造树型结构数据
|
||||
@@ -161,43 +161,43 @@ export function handleTree(data, id, parentId, children) {
|
||||
id: id || 'id',
|
||||
parentId: parentId || 'parentId',
|
||||
childrenList: children || 'children'
|
||||
};
|
||||
}
|
||||
|
||||
var childrenListMap = {};
|
||||
var nodeIds = {};
|
||||
var tree = [];
|
||||
var childrenListMap = {}
|
||||
var nodeIds = {}
|
||||
var tree = []
|
||||
|
||||
for (let d of data) {
|
||||
let parentId = d[config.parentId];
|
||||
let parentId = d[config.parentId]
|
||||
if (childrenListMap[parentId] == null) {
|
||||
childrenListMap[parentId] = [];
|
||||
childrenListMap[parentId] = []
|
||||
}
|
||||
nodeIds[d[config.id]] = d;
|
||||
childrenListMap[parentId].push(d);
|
||||
nodeIds[d[config.id]] = d
|
||||
childrenListMap[parentId].push(d)
|
||||
}
|
||||
|
||||
for (let d of data) {
|
||||
let parentId = d[config.parentId];
|
||||
let parentId = d[config.parentId]
|
||||
if (nodeIds[parentId] == null) {
|
||||
tree.push(d);
|
||||
tree.push(d)
|
||||
}
|
||||
}
|
||||
|
||||
for (let t of tree) {
|
||||
adaptToChildrenList(t);
|
||||
adaptToChildrenList(t)
|
||||
}
|
||||
|
||||
function adaptToChildrenList(o) {
|
||||
if (childrenListMap[o[config.id]] !== null) {
|
||||
o[config.childrenList] = childrenListMap[o[config.id]];
|
||||
o[config.childrenList] = childrenListMap[o[config.id]]
|
||||
}
|
||||
if (o[config.childrenList]) {
|
||||
for (let c of o[config.childrenList]) {
|
||||
adaptToChildrenList(c);
|
||||
adaptToChildrenList(c)
|
||||
}
|
||||
}
|
||||
}
|
||||
return tree;
|
||||
return tree
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -207,19 +207,19 @@ export function handleTree(data, id, parentId, children) {
|
||||
export function tansParams(params) {
|
||||
let result = ''
|
||||
for (const propName of Object.keys(params)) {
|
||||
const value = params[propName];
|
||||
var part = encodeURIComponent(propName) + "=";
|
||||
if (value !== null && value !== "" && typeof (value) !== "undefined") {
|
||||
const value = params[propName]
|
||||
var part = encodeURIComponent(propName) + '='
|
||||
if (value !== null && value !== '' && typeof (value) !== 'undefined') {
|
||||
if (typeof value === 'object') {
|
||||
for (const key of Object.keys(value)) {
|
||||
if (value[key] !== null && value[key] !== "" && typeof (value[key]) !== 'undefined') {
|
||||
let params = propName + '[' + key + ']';
|
||||
var subPart = encodeURIComponent(params) + "=";
|
||||
result += subPart + encodeURIComponent(value[key]) + "&";
|
||||
if (value[key] !== null && value[key] !== '' && typeof (value[key]) !== 'undefined') {
|
||||
let params = propName + '[' + key + ']'
|
||||
var subPart = encodeURIComponent(params) + '='
|
||||
result += subPart + encodeURIComponent(value[key]) + '&'
|
||||
}
|
||||
}
|
||||
} else {
|
||||
result += part + encodeURIComponent(value) + "&";
|
||||
result += part + encodeURIComponent(value) + '&'
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -229,31 +229,31 @@ export function tansParams(params) {
|
||||
// 获取两个日期之间的所有月份
|
||||
export function getMonth(quitTime, reentryTime) {
|
||||
// 解析日期
|
||||
const start = new Date(quitTime);
|
||||
const end = new Date(reentryTime);
|
||||
const start = new Date(quitTime)
|
||||
const end = new Date(reentryTime)
|
||||
|
||||
// 初始化结果数组
|
||||
const months = [];
|
||||
const months = []
|
||||
|
||||
// 确保开始日期早于结束日期
|
||||
if (start > end) {
|
||||
[start, end] = [end, start];
|
||||
[start, end] = [end, start]
|
||||
}
|
||||
|
||||
// 循环遍历所有月份
|
||||
let currentDate = new Date(start);
|
||||
let currentDate = new Date(start)
|
||||
while (currentDate <= end) {
|
||||
// 添加当前月份到结果数组
|
||||
months.push({
|
||||
year: currentDate.getFullYear(),
|
||||
month: currentDate.getMonth() + 1
|
||||
});
|
||||
// 添加当前月份到结果数组
|
||||
months.push({
|
||||
year: currentDate.getFullYear(),
|
||||
month: currentDate.getMonth() + 1
|
||||
})
|
||||
|
||||
// 进入下一个月
|
||||
currentDate.setMonth(currentDate.getMonth() + 1);
|
||||
// 进入下一个月
|
||||
currentDate.setMonth(currentDate.getMonth() + 1)
|
||||
}
|
||||
|
||||
return months;
|
||||
return months
|
||||
}
|
||||
|
||||
// 验证是否为blob格式
|
||||
|
||||
@@ -1,19 +1,19 @@
|
||||
|
||||
export const uuid = () => {
|
||||
var s = [];
|
||||
var hexDigits = "0123456789abcdef";
|
||||
for (var i = 0; i < 36; i++) {
|
||||
s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1);
|
||||
}
|
||||
// s[14] = "4"; // bits 12-15 of the time_hi_and_version field to 0010
|
||||
// s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1); // bits 6-7 of the clock_seq_hi_and_reserved to 01
|
||||
s[8] = s[13] = s[18] = s[23] = "";
|
||||
var s = []
|
||||
var hexDigits = '0123456789abcdef'
|
||||
for (var i = 0; i < 36; i++) {
|
||||
s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1)
|
||||
}
|
||||
// s[14] = "4"; // bits 12-15 of the time_hi_and_version field to 0010
|
||||
// s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1); // bits 6-7 of the clock_seq_hi_and_reserved to 01
|
||||
s[8] = s[13] = s[18] = s[23] = ''
|
||||
|
||||
return s.join("");
|
||||
return s.join('')
|
||||
}
|
||||
|
||||
|
||||
|
||||
export default {
|
||||
uuid
|
||||
uuid
|
||||
}
|
||||
Reference in New Issue
Block a user