UNPKG

@jdlinker/utils

Version:

jdLinker 工具库

309 lines (282 loc) 7.53 kB
import type { RouteLocationNormalized, RouteRecordNormalized } from 'vue-router'; import type { App, Plugin } from 'vue'; import { unref } from 'vue'; import { isObject } from './is'; export const URL_HASH_TAB = `__AGWE4H__HASH__TAG__PWHRG__`; // export const noop = () => {}; /** * @description: Set ui mount node */ export function getPopupContainer(node?: HTMLElement): HTMLElement { return (node?.parentNode as HTMLElement) ?? document.body; } /** * Add the object as a parameter to the URL * @param baseUrl url * @param obj * @returns {string} * eg: * let obj = {a: '3', b: '4'} * setObjToUrlParams('www.baidu.com', obj) * ==>www.baidu.com?a=3&b=4 */ export function setObjToUrlParams(baseUrl: string, obj: any): string { let parameters = ''; for (const key in obj) { parameters += key + '=' + encodeURIComponent(obj[key]) + '&'; } parameters = parameters.replace(/&$/, ''); return /\?$/.test(baseUrl) ? baseUrl + parameters : baseUrl.replace(/\/?$/, '?') + parameters; } export function deepMerge<T = any>(src: any = {}, target: any = {}): T { let key: string; for (key in target) { src[key] = isObject(src[key]) ? deepMerge(src[key], target[key]) : (src[key] = target[key]); } return src; } export function openWindow( url: string, opt?: { target?: any; noopener?: boolean; noreferrer?: boolean; } ) { const { target = '__blank', noopener = true, noreferrer = true } = opt || {}; const feature: string[] = []; noopener && feature.push('noopener=yes'); noreferrer && feature.push('noreferrer=yes'); window.open(url, target, feature.join(',')); } // dynamic use hook props export function getDynamicProps<T, U>(props: T): Partial<U> { const ret: any = {}; Object.keys(props).map((key) => { ret[key] = unref((props as any)[key]); }); return ret as Partial<U>; } /** * 获取表单字段值数据类型 * @param props * @param field * @updateBy:zyf */ export function getValueType(props, field) { const formSchema = unref(unref(props)?.schemas); let valueType = 'string'; if (formSchema) { const schema = formSchema.filter((item) => item.field === field)[0]; valueType = schema.componentProps && schema.componentProps.valueType ? schema.componentProps.valueType : valueType; } return valueType; } export function getRawRoute(route: RouteLocationNormalized): RouteLocationNormalized { if (!route) return route; const { matched, ...opt } = route; return { ...opt, matched: (matched ? matched.map((item) => ({ meta: item.meta, name: item.name, path: item.path })) : undefined) as RouteRecordNormalized[] }; } /** * 深度克隆对象、数组 * @param obj 被克隆的对象 * @return 克隆后的对象 */ export function cloneObject(obj) { return JSON.parse(JSON.stringify(obj)); } export const withInstall = <T>(component: T, alias?: string) => { const comp = component as any; comp.install = (app: App) => { app.component(comp.name || comp.displayName, component); if (alias) { app.config.globalProperties[alias] = component; } }; return component as T & Plugin; }; /** * 获取url地址参数 * @param paraName */ export function getUrlParam(paraName) { const url = document.location.toString(); const arrObj = url.split('?'); if (arrObj.length > 1) { const arrPara = arrObj[1].split('&'); let arr; for (let i = 0; i < arrPara.length; i++) { arr = arrPara[i].split('='); if (arr != null && arr[0] == paraName) { return arr[1]; } } return ''; } else { return ''; } } /** * 休眠(setTimeout的promise版) * @param ms 要休眠的时间,单位:毫秒 * @param fn callback,可空 * @return Promise */ export function sleep(ms: number, fn?: Fn) { return new Promise<void>((resolve) => setTimeout(() => { fn && fn(); resolve(); }, ms) ); } /** * 获取URL上参数 * @param url */ export function getQueryVariable(url) { if (!url) return; let t, n, r, i = url.split('?')[1], s = {}; (t = i.split('&')), (r = null), (n = null); for (const o in t) { const u = t[o].indexOf('='); u !== -1 && ((r = t[o].substr(0, u)), (n = t[o].substr(u + 1)), (s[r] = n)); } return s; } /** * 判断是否显示办理按钮 * @param bpmStatus * @returns {*} */ export function showDealBtn(bpmStatus) { if (bpmStatus != '1' && bpmStatus != '3' && bpmStatus != '4') { return true; } return false; } //update-begin-author:taoyan date:2022-6-8 for:解决老的vue2动态导入文件语法 vite不支持的问题 const allModules = import.meta.glob('../views/**/*.vue'); export function importViewsFile(path): Promise<any> { if (path.startsWith('/')) { path = path.substring(1); } let page = ''; if (path.endsWith('.vue')) { page = `../views/${path}`; } else { page = `../views/${path}.vue`; } return new Promise((resolve, reject) => { let flag = true; for (const path in allModules) { if (path == page) { flag = false; allModules[path]().then((mod) => { resolve(mod); }); } } if (flag) { reject('该文件不存在:' + page); } }); } //update-end-author:taoyan date:2022-6-8 for:解决老的vue2动态导入文件语法 vite不支持的问题 /** * 跳转至积木报表的 预览页面 * @param url * @param id * @param token */ export function goJmReportViewPage(url, id, token) { // update-begin--author:liaozhiyang---date:20230904---for:【QQYUN-6390】eval替换成new Function,解决build警告 // URL支持{{ window.xxx }}占位符变量 url = url.replace(/{{([^}]+)?}}/g, (_s1, s2) => _eval(s2)); // update-end--author:liaozhiyang---date:20230904---for:【QQYUN-6390】eval替换成new Function,解决build警告 if (url.includes('?')) { url += '&'; } else { url += '?'; } url += `id=${id}`; url += `&token=${token}`; window.open(url); } /** * 获取随机颜色 */ export function getRandomColor(index?) { const colors = [ 'rgb(100, 181, 246)', 'rgb(77, 182, 172)', 'rgb(255, 183, 77)', 'rgb(229, 115, 115)', 'rgb(149, 117, 205)', 'rgb(161, 136, 127)', 'rgb(144, 164, 174)', 'rgb(77, 208, 225)', 'rgb(129, 199, 132)', 'rgb(255, 138, 101)', 'rgb(133, 202, 205)', 'rgb(167, 214, 118)', 'rgb(254, 225, 89)', 'rgb(251, 199, 142)', 'rgb(239, 145, 139)', 'rgb(169, 181, 255)', 'rgb(231, 218, 202)', 'rgb(252, 128, 58)', 'rgb(254, 161, 172)', 'rgb(194, 163, 205)' ]; return index && index < 19 ? colors[index] : colors[Math.floor(Math.random() * (colors.length - 1))]; } export function getRefPromise(componentRef) { return new Promise((resolve) => { (function next() { const ref = componentRef.value; if (ref) { resolve(ref); } else { setTimeout(() => { next(); }, 100); } })(); }); } /** * 2023-09-04 * liaozhiyang * 用new Function替换eval */ export function _eval(str: string) { return new Function(`return ${str}`)(); } /** * * @param name 地址栏参数key值 * @returns 返回value */ export function GetQueryString(name: string) { const reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)'); // @ts-ignore const r = decodeURI(window.top.location.search).substr(1).match(reg); if (r != null) { return unescape(r[2]); } return null; }