CET-vue-3.0/src/utils/common/compUtils.ts

368 lines
9.5 KiB
TypeScript
Raw Normal View History

2022-06-10 10:44:44 +08:00
import { useGlobSetting } from '/@/hooks/setting';
import { merge, random } from 'lodash-es';
import { isArray } from '/@/utils/is';
import { FormSchema } from '/@/components/Form';
2022-03-10 09:47:29 +08:00
const globSetting = useGlobSetting();
const baseApiUrl = globSetting.domainUrl;
/**
* 访
* @param fileUrl
* @param prefix(http) http/https
*/
2022-06-10 10:44:44 +08:00
export const getFileAccessHttpUrl = (fileUrl, prefix = 'http') => {
2022-03-10 09:47:29 +08:00
let result = fileUrl;
try {
if (fileUrl && fileUrl.length > 0 && !fileUrl.startsWith(prefix)) {
//判断是否是数组格式
let isArray = fileUrl.indexOf('[') != -1;
if (!isArray) {
2022-06-10 10:44:44 +08:00
let prefix = `${baseApiUrl}/sys/common/static/`;
2022-03-10 09:47:29 +08:00
// 判断是否已包含前缀
if (!fileUrl.startsWith(prefix)) {
2022-06-10 10:44:44 +08:00
result = `${prefix}${fileUrl}`;
2022-03-10 09:47:29 +08:00
}
}
}
2022-06-10 10:44:44 +08:00
} catch (err) {}
2022-03-10 09:47:29 +08:00
return result;
};
/**
* window.resize
*/
export function triggerWindowResizeEvent() {
2022-06-10 10:44:44 +08:00
let event: any = document.createEvent('HTMLEvents');
event.initEvent('resize', true, true);
event.eventType = 'message';
window.dispatchEvent(event);
2022-03-10 09:47:29 +08:00
}
/**
*
* @param length
*/
2022-06-10 10:44:44 +08:00
export const getRandom = (length: number = 1) => {
2022-03-10 09:47:29 +08:00
return '-' + parseInt(String(Math.random() * 10000 + 1), length);
};
/**
*
* @param length
* @param chats
* @return string
*/
export function randomString(length: number, chats?: string) {
2022-06-10 10:44:44 +08:00
if (!length) length = 1;
2022-03-10 09:47:29 +08:00
if (!chats) {
// noinspection SpellCheckingInspection
2022-06-10 10:44:44 +08:00
chats = '0123456789qwertyuioplkjhgfdsazxcvbnm';
2022-03-10 09:47:29 +08:00
}
2022-06-10 10:44:44 +08:00
let str = '';
2022-03-10 09:47:29 +08:00
for (let i = 0; i < length; i++) {
2022-06-10 10:44:44 +08:00
let num = random(0, chats.length - 1);
str += chats[num];
2022-03-10 09:47:29 +08:00
}
2022-06-10 10:44:44 +08:00
return str;
2022-03-10 09:47:29 +08:00
}
/**
* tree结构
* @param array tree数据
* @param opt
* @param startPid
*/
2022-06-10 10:44:44 +08:00
export const listToTree = (array, opt, startPid) => {
2022-03-10 09:47:29 +08:00
const obj = {
primaryKey: opt.primaryKey || 'key',
parentKey: opt.parentKey || 'parentId',
titleKey: opt.titleKey || 'title',
startPid: opt.startPid || '',
currentDept: opt.currentDept || 0,
maxDept: opt.maxDept || 100,
2022-06-10 10:44:44 +08:00
childKey: opt.childKey || 'children',
};
if (startPid) {
obj.startPid = startPid;
2022-03-10 09:47:29 +08:00
}
2022-06-10 10:44:44 +08:00
return toTree(array, obj.startPid, obj.currentDept, obj);
};
2022-03-10 09:47:29 +08:00
/**
* tree
* @param list
* @param startPid
* @param currentDept
* @param opt
* @returns {Array}
*/
export const toTree = (array, startPid, currentDept, opt) => {
if (opt.maxDept < currentDept) {
2022-06-10 10:44:44 +08:00
return [];
2022-03-10 09:47:29 +08:00
}
2022-06-10 10:44:44 +08:00
let child = [];
2022-03-10 09:47:29 +08:00
if (array && array.length > 0) {
2022-06-10 10:44:44 +08:00
child = array
.map((item) => {
// 筛查符合条件的数据(主键 = startPid
if (typeof item[opt.parentKey] !== 'undefined' && item[opt.parentKey] === startPid) {
// 满足条件则递归
const nextChild = toTree(array, item[opt.primaryKey], currentDept + 1, opt);
// 节点信息保存
if (nextChild.length > 0) {
item['isLeaf'] = false;
item[opt.childKey] = nextChild;
} else {
item['isLeaf'] = true;
}
item['title'] = item[opt.titleKey];
item['label'] = item[opt.titleKey];
item['key'] = item[opt.primaryKey];
item['value'] = item[opt.primaryKey];
return item;
2022-03-10 09:47:29 +08:00
}
2022-06-10 10:44:44 +08:00
})
.filter((item) => {
return item !== undefined;
});
2022-03-10 09:47:29 +08:00
}
2022-06-10 10:44:44 +08:00
return child;
};
2022-03-10 09:47:29 +08:00
/**
*
* @param tableData
* @param fieldKeys
*/
export function mapTableTotalSummary(tableData: Recordable[], fieldKeys: string[]) {
2022-06-10 10:44:44 +08:00
let totals: any = { _row: '合计', _index: '合计' };
fieldKeys.forEach((key) => {
2022-03-10 09:47:29 +08:00
totals[key] = tableData.reduce((prev, next) => {
2022-06-10 10:44:44 +08:00
prev += next[key];
return prev;
}, 0);
});
return totals;
2022-03-10 09:47:29 +08:00
}
/**
*
*
* (debounce)(delay)100ms
* 100ms内再次执行函数
*
*
* @param fn
* @param delay
* @returns {Function}
*/
export function simpleDebounce(fn, delay = 100) {
2022-06-10 10:44:44 +08:00
let timer: any | null = null;
2022-03-10 09:47:29 +08:00
return function () {
2022-06-10 10:44:44 +08:00
let args = arguments;
2022-03-10 09:47:29 +08:00
if (timer) {
2022-06-10 10:44:44 +08:00
clearTimeout(timer);
2022-03-10 09:47:29 +08:00
}
timer = setTimeout(() => {
// @ts-ignore
2022-06-10 10:44:44 +08:00
fn.apply(this, args);
}, delay);
};
2022-03-10 09:47:29 +08:00
}
/**
*
* @param date
* @param block
*/
export function dateFormat(date, block) {
if (!date) {
2022-06-10 10:44:44 +08:00
return '';
2022-03-10 09:47:29 +08:00
}
2022-06-10 10:44:44 +08:00
let format = block || 'yyyy-MM-dd';
date = new Date(date);
2022-03-10 09:47:29 +08:00
const map = {
M: date.getMonth() + 1, // 月份
d: date.getDate(), // 日
h: date.getHours(), // 小时
m: date.getMinutes(), // 分
s: date.getSeconds(), // 秒
q: Math.floor((date.getMonth() + 3) / 3), // 季度
S: date.getMilliseconds(), // 毫秒
2022-06-10 10:44:44 +08:00
};
2022-03-10 09:47:29 +08:00
format = format.replace(/([yMdhmsqS])+/g, (all, t) => {
2022-06-10 10:44:44 +08:00
let v = map[t];
2022-03-10 09:47:29 +08:00
if (v !== undefined) {
if (all.length > 1) {
2022-06-10 10:44:44 +08:00
v = `0${v}`;
v = v.substr(v.length - 2);
2022-03-10 09:47:29 +08:00
}
2022-06-10 10:44:44 +08:00
return v;
2022-03-10 09:47:29 +08:00
} else if (t === 'y') {
2022-06-10 10:44:44 +08:00
return date
.getFullYear()
.toString()
.substr(4 - all.length);
2022-03-10 09:47:29 +08:00
}
2022-06-10 10:44:44 +08:00
return all;
});
return format;
2022-03-10 09:47:29 +08:00
}
/**
* IE11EdgeChromeFirefoxSafari
* 使JVxeTable Span模式
*/
export function getEventPath(event) {
2022-06-10 10:44:44 +08:00
let target = event.target;
let path = (event.composedPath && event.composedPath()) || event.path;
2022-03-10 09:47:29 +08:00
if (path != null) {
2022-06-10 10:44:44 +08:00
return path.indexOf(window) < 0 ? path.concat(window) : path;
2022-03-10 09:47:29 +08:00
}
if (target === window) {
2022-06-10 10:44:44 +08:00
return [window];
2022-03-10 09:47:29 +08:00
}
let getParents = (node, memo) => {
2022-06-10 10:44:44 +08:00
const parentNode = node.parentNode;
2022-03-10 09:47:29 +08:00
if (!parentNode) {
2022-06-10 10:44:44 +08:00
return memo;
2022-03-10 09:47:29 +08:00
} else {
2022-06-10 10:44:44 +08:00
return getParents(parentNode, memo.concat(parentNode));
2022-03-10 09:47:29 +08:00
}
2022-06-10 10:44:44 +08:00
};
return [target].concat(getParents(target, []), window);
2022-03-10 09:47:29 +08:00
}
/**
* push
* @param array
* @param value
* @param key id
* @returns {boolean} push true false
*/
export function pushIfNotExist(array, value, key?) {
for (let item of array) {
2022-06-10 10:44:44 +08:00
if (key && item[key] === value[key]) {
return false;
2022-03-10 09:47:29 +08:00
} else if (item === value) {
2022-06-10 10:44:44 +08:00
return false;
2022-03-10 09:47:29 +08:00
}
}
2022-06-10 10:44:44 +08:00
array.push(value);
return true;
2022-03-10 09:47:29 +08:00
}
/**
*
* @param obj
* @returns {*}
*/
export function filterObj(obj) {
if (!(typeof obj == 'object')) {
return;
}
2022-06-10 10:44:44 +08:00
for (let key in obj) {
if (obj.hasOwnProperty(key) && (obj[key] == null || obj[key] == undefined || obj[key] === '')) {
2022-03-10 09:47:29 +08:00
delete obj[key];
}
}
return obj;
}
/**
* 线
* @param string
*/
export function underLine2CamelCase(string: string) {
2022-06-10 10:44:44 +08:00
return string.replace(/_([a-z])/g, (_, letter) => letter.toUpperCase());
2022-03-10 09:47:29 +08:00
}
/**
*
* @param treeList
* @param fn
* @param childrenKey
*/
export function findTree(treeList: any[], fn: Fn, childrenKey = 'children') {
for (let i = 0; i < treeList.length; i++) {
let item = treeList[i];
if (fn(item, i, treeList)) {
return item;
}
2022-06-10 10:44:44 +08:00
let children = item[childrenKey];
2022-03-10 09:47:29 +08:00
if (isArray(children)) {
let findResult = findTree(children, fn, childrenKey);
if (findResult) {
2022-06-10 10:44:44 +08:00
return findResult;
2022-03-10 09:47:29 +08:00
}
}
}
2022-06-10 10:44:44 +08:00
return null;
2022-03-10 09:47:29 +08:00
}
/** 获取 mapFormSchema 方法 */
export function bindMapFormSchema<T>(spanMap, spanTypeDef: T) {
return function (s: FormSchema, spanType: T = spanTypeDef) {
2022-06-10 10:44:44 +08:00
return merge(
{
disabledLabelWidth: true,
} as FormSchema,
spanMap[spanType],
s
);
};
2022-03-10 09:47:29 +08:00
}
/**
* null或null字符串
* @param str
* @return {boolean}
*/
export function stringIsNull(str) {
// 两个 == 可以同时判断 null 和 undefined
return str == null || str === 'null' || str === 'undefined';
}
/**
* divmodal上
* @param node
*/
export function getAutoScrollContainer(node: HTMLElement) {
let element: Nullable<HTMLElement> = node
while (element != null) {
if (element.classList.contains('scrollbar__view')) {
// 判断是否有滚动条
if (element.clientHeight < element.scrollHeight) {
// 有滚动条时,挂载到父级,解决滚动问题
return node.parentElement
} else {
// 无滚动条时挂载到body上解决下拉框遮盖问题
return document.body
}
} else {
element = element.parentElement
}
}
// 不在弹窗内,走默认逻辑
return node.parentElement
}
/**
2022-11-10 14:31:34 +08:00
*
* @param menuTreeItem
*/
export function checkChildrenHidden(menuTreeItem){
2022-11-10 14:31:34 +08:00
//是否是聚合路由
let alwaysShow=menuTreeItem.alwaysShow;
if(alwaysShow){
return false;
}
if(!menuTreeItem.children){
return false
}
return menuTreeItem.children?.find((item) => item.hideMenu == false) != null;
}