302 lines
5.7 KiB
TypeScript

import { isArray, isNumber, isString, orderBy } from 'lodash-es';
import { resolveComponent } from 'vue';
import storage from './storage';
// 首字母大写
export function firstUpperCase(value: string): string {
return value.replace(/\b(\w)(\w*)/g, function ($0, $1, $2) {
return $1.toUpperCase() + $2;
});
}
// 获取方法名
export function getNames(value: any) {
return Object.getOwnPropertyNames(value.constructor.prototype);
}
// 获取地址栏参数
export function getUrlParam(name: string): string | null {
const reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)');
const r = window.location.search.substr(1).match(reg);
if (r != null) return decodeURIComponent(r[2]);
return null;
}
// 文件名
export function filename(path: string): string {
return basename(path.substring(0, path.lastIndexOf('.')));
}
// 路径名称
export function basename(path: string): string {
let index = path.lastIndexOf('/');
index = index > -1 ? index : path.lastIndexOf('\\');
if (index < 0) {
return path;
}
return path.substring(index + 1);
}
// 文件扩展名
export function extname(path: string): string {
return path.substring(path.lastIndexOf('.') + 1).split(/(\?|&)/)[0];
}
// 横杠转驼峰
export function toCamel(str: string): string {
return str.replace(/([^-])(?:-+([^-]))/g, function ($0, $1, $2) {
return $1 + $2.toUpperCase();
});
}
// uuid
export function uuid(separator = '-'): string {
const s: any[] = [];
const hexDigits = '0123456789abcdef';
for (let i = 0; i < 36; i++) {
s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1);
}
s[14] = '4';
s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1);
s[8] = s[13] = s[18] = s[23] = separator;
return s.join('');
}
// 浏览器信息
export function getBrowser() {
const { clientHeight, clientWidth } = document.documentElement;
// 浏览器信息
const ua = navigator.userAgent.toLowerCase();
// 浏览器类型
let type = (ua.match(/firefox|chrome|safari|opera/g) || 'other')[0];
if ((ua.match(/msie|trident/g) || [])[0]) {
type = 'msie';
}
// 平台标签
let tag = '';
const isTocuh =
'ontouchstart' in window || ua.indexOf('touch') !== -1 || ua.indexOf('mobile') !== -1;
if (isTocuh) {
if (ua.indexOf('ipad') !== -1) {
tag = 'pad';
} else if (ua.indexOf('mobile') !== -1) {
tag = 'mobile';
} else if (ua.indexOf('android') !== -1) {
tag = 'androidPad';
} else {
tag = 'pc';
}
} else {
tag = 'pc';
}
// 浏览器内核
let prefix = '';
switch (type) {
case 'chrome':
case 'safari':
case 'mobile':
prefix = 'webkit';
break;
case 'msie':
prefix = 'ms';
break;
case 'firefox':
prefix = 'Moz';
break;
case 'opera':
prefix = 'O';
break;
default:
prefix = 'webkit';
break;
}
// 操作平台
const plat = ua.indexOf('android') > 0 ? 'android' : navigator.platform.toLowerCase();
// 屏幕信息
let screen = 'full';
if (clientWidth < 768) {
screen = 'xs';
} else if (clientWidth < 992) {
screen = 'sm';
} else if (clientWidth < 1200) {
screen = 'md';
} else if (clientWidth < 1920) {
screen = 'xl';
} else {
screen = 'full';
}
// 是否 ios
const isIOS = !!navigator.userAgent.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/);
// 是否 PC 端
const isPC = tag === 'pc';
// 是否移动端
const isMobile = isPC ? false : true;
// 是否移动端 + 屏幕宽过小
const isMini = screen === 'xs' || isMobile;
return {
height: clientHeight,
width: clientWidth,
type,
plat,
tag,
prefix,
isMobile,
isIOS,
isPC,
isMini,
screen
};
}
// 路径转数组
export function deepPaths(paths: string[], splitor?: string) {
const list: any[] = [];
paths.forEach(e => {
const arr: string[] = e.split(splitor || '/').filter(Boolean);
let c = list;
arr.forEach((a, i) => {
let d = c.find(e => e.label == a);
if (!d) {
d = {
label: a,
value: a,
children: arr[i + 1] ? [] : null
};
c.push(d);
}
if (d.children) {
c = d.children;
}
});
});
return list;
}
// 列表转树形
export function deepTree(list: any[], sort?: 'desc' | 'asc'): any[] {
const newList: any[] = [];
const map: any = {};
orderBy(list, 'orderNum', sort)
.map(e => {
map[e.id] = e;
return e;
})
.forEach(e => {
const parent = map[e.parentId];
if (parent) {
(parent.children || (parent.children = [])).push(e);
} else {
newList.push(e);
}
});
return newList;
}
// 树形转列表
export function revDeepTree(list: any[]) {
const arr: any[] = [];
let id = 0;
function deep(list: any[], parentId: number) {
list.forEach(e => {
if (!e.id) {
e.id = ++id;
}
if (!e.parentId) {
e.parentId = parentId;
}
arr.push(e);
if (e.children && isArray(e.children) && e.id) {
deep(e.children, e.id);
}
});
}
deep(list || [], 0);
return arr;
}
// 路径转对象
export function path2Obj(list: any[]) {
const data: any = {};
list.forEach(({ path, value }) => {
if (path) {
const arr: string[] = path.split('/');
const parents = arr.slice(0, arr.length - 1);
const name = basename(path).replace('.ts', '');
let curr = data;
parents.forEach(k => {
if (!curr[k]) {
curr[k] = {};
}
curr = curr[k];
});
curr[name] = value;
}
});
return data;
}
// 是否是组件
export function isComponent(name: string) {
return !isString(resolveComponent(name));
}
// 是否Promise
export function isPromise(val: any) {
return val && Object.prototype.toString.call(val) === '[object Promise]';
}
// 单位转换
export function parsePx(val: string | number) {
return isNumber(val) ? `${val}px` : val;
}
// 延迟
export function sleep(duration: number) {
return new Promise(resolve => {
setTimeout(() => {
resolve(true);
}, duration);
});
}
export { storage };
export * from './loading';