代码格式修改

This commit is contained in:
2025-10-18 17:13:04 +08:00
parent b9224ed8bb
commit 81017eb280
837 changed files with 102784 additions and 98409 deletions

View File

@@ -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, '\\$&')
}
};
}

View File

@@ -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/',
},
},
},
},
});
};
})
}

View File

@@ -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

View File

@@ -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()
}
}

View File

@@ -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'

View File

@@ -1,4 +1,4 @@
import { mergeRecursive } from "@/utils/ruoyi";
import { mergeRecursive } from '@/utils/ruoyi'
import DictOptions from './DictOptions'
/**

View File

@@ -1,4 +1,4 @@
import { mergeRecursive } from "@/utils/ruoyi";
import { mergeRecursive } from '@/utils/ruoyi'
import dictConverter from './DictConverter'
export const options = {

View File

@@ -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`);
// };
// },
}

View File

@@ -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
}

View File

@@ -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
}
}

View File

@@ -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()
})
}

View File

@@ -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格式

View File

@@ -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
}