auto-tools
Version:
常用函数的封装使用
341 lines (338 loc) • 14.3 kB
TypeScript
import type { Dayjs } from 'dayjs';
import type { IBackendTree, ITreeNode, IObjAny, IBackMenu, IBackMenuField, ISiderShowMenu, IRoute, IFontMenu, IObj, TBaseNull } from "./type";
/**
* @description 验证是否为 '' null undefined {} []
* @return {boolean}
* @example
* isEmpty(0) false 注意 数字 0 在这里不为空;
* isEmpty(1) false
* isEmpty(false) false
*
* isEmpty(' ') true
* isEmpty({}) true
* isEmpty([]) true
* isEmpty(null), true
* isEmpty(undefined) true
*/
export declare function isEmpty<T>(b: T): boolean;
export declare function isNotEmpty<T>(b: T): boolean;
/** TODO
* 处理对象数据里的 空
* @param obj 数据源对象
* @param absDelNull 是否删除 所有空值(包括[]、{}) 的属性
* @param delNull 是否删除 一般空值(''|null|undefined)的属性
* @param if2EmptyStr 是否把 一般空 的值转化为 空字符串''
* @returns IObjAny
*/
export declare function handleObjNull(obj: IObjAny, absDelNull?: boolean, delNull?: boolean, if2EmptyStr?: boolean): IObjAny;
export declare function isArrayVal<T>(arr: T): boolean;
export declare function isFuncVal<T>(fn: T): boolean;
export declare function isAsyncFuncVal<T>(fn: T): boolean;
export declare function isObjectVal<T>(obj: T): boolean;
export declare function isStringVal<T>(str: T): boolean;
export declare function isBoolVal<T>(b: T): boolean;
export declare function isPromiseVal<T>(p: T): boolean;
export declare function isNumberVal<T>(n: T): boolean;
/**
* 向父 iframe 发送消息
* @param cfg 消息配置
* @param host 域名
*/
export declare function postParentMsg<ETY, D>(cfg: {
type: ETY;
data: D;
}, host?: string): void;
/**
* 对比数据是否发生过改变;
* @param data1 OBJ
* @param data2 OBJ
* @returns boolean
*/
export declare function hasChangeData(data1: IObj, data2: IObj): boolean;
/**
* 获取 存储模块数据
* @param field 想要获取的字段
* @param moduleKey 模块名称; 默认 admin-user
* @param storage 存储类型; 默认 local,表示 localStorage
* @description 可配合 pinia; 根据 module key 持久化取值
*/
export declare function getStorageVal(field: string, moduleKey?: string, storage?: 'local' | 'session'): TBaseNull;
/**
* 获取 对象数组的 keys values
* @param arr
* @param label 默认 'label'
* @param value 默认 'value'
* @param needStr 要不要把 value 转成 string形式
* @returns ({ labelList, valueList })
* @example [{ id, name }] 获取数组里 所有对象的 id 的集合 / name集合;
*/
export declare function getArrObjKVs(arr: Array<IObjAny>, label?: string, value?: string, needStr?: boolean): {
labelList: string[];
valueList: (string | number)[];
};
/**
* 数组key转对象属性
* @param array
* @param obj 要返回的 obj
* @param key 默认 'key'
* @example [{ key: 'name', defaultVal: 'ff' }, { key: 'age', }] =>> { name: 'ff', age: '', }
* 注意:obj若是一个空对象,可以返回一个新对象,斩断引用关系,若不是则会保持对源对象;
* '' 可能有特殊含义,所以不能轻易使用 ''
*/
export declare function list2ObjAttr(array: Array<IObjAny>, obj: IObjAny, key?: string): IObjAny;
/**
* 特殊的(input前后带select定制化的) list2ObjAttr
* beforeModelKey input前 select默认值
* afterModelKey input后 select默认值
*/
export declare function list2ObjAttrAB(array: Array<IObjAny>, obj: IObjAny, key?: string): IObjAny;
/**
* 手机号 添加 前缀
* @param phn 手机号
* @param prefix 前缀 默认 '+86'
* @returns 前缀+手机号
*/
export declare function getPlusPhone(phn: string, prefix?: string): string;
/**
* 手机号 去除 前缀
* @param phn 手机号
* @param prefix 前缀 默认 '+86'
* @returns 手机号
*/
export declare function getSubPhone(phn: string, prefix?: string): string;
/**
* 日期 格式化;
* @param time 时间; now 获取当前时间的 时间格式
* @param pattern 格式; 默认 YYYY-MM-DD HH:mm:ss
*/
export declare function parseTime(time: number | 'now', pattern?: string): string;
/**
* 获取指定时间戳
* @param time
* @returns TimeStamp
* @description 获取 Date、dayjs、日期字符串 形式的时间戳
*/
export declare function getTimeStamp(time: string | Dayjs): string | number;
/**
* 查找指定 key 的索引
* @param arr
* @param val 要找的 key 值
* @param by 默认 modelKey
* @returns 找到的索引
* @example 在 formModelList 里,找到 modelKey = remoteCategory 的对象的索引
* formModelList = [
* { modelKey: 'remoteCategory', },
* { modelKey: 'nnn', },
* ]
* const i = findIdxByKey('modelKey', 'remoteCategory', formModelList)
*/
export declare function findIdxByKey(arr: Array<IObjAny>, val: string | number, by?: string): number;
/**
* 根据开始 结束 返回 数组
* @param start 数字
* @param end 数字
* @returns Array<number>
* @example start 0 end 24 => [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24]
*/
export declare const setRangeNumArr: (start: number, end: number) => number[];
/**
* 获取 校验表单 结果
* @param formRefVal form ref值的 value,如:myForm.value
* @description 适合 antd 形式的 表单校验; 注意,formRefVal 一定要.value
*/
export declare function validateMyForm<F extends {
validateFields: Function;
}>(formRefVal: F | undefined | null): Promise<boolean>;
/**
* 获取当前语言
* @returns 当前语言
*/
export declare function getCurrentLang(): string;
/**
* 一个url能否触发浏览器自动下载:
* 主要看该请求响应头response header是否满足,一般是看Content-Disposition和Content-Type这两个消息头:
response header中指定了Content-Disposition为attachment,它表示让浏览器把消息体以附件的形式下载并保存到本地
(一般还会指定filename, 下载的文件名默认就是filename)
response header中指定了Content-Type 为 application/octet-stream(无类型) 或 application/zip(zip包时)等等。
(
其中 application/octet-stream表示http response为二进制流(没指定明确的type), 用在未知的应用程序文件,
浏览器一般不会自动执行或询问执行。浏览器会像对待 设置了HTTP头Content-Disposition 值为 attachment 的文件一样来对待这类文件
)
suffixTxt: 指定下载文件的后缀 以 .开头,如,.pdf
*/
/**
* 下载文件
* @param file Blob|string 文件流或者文件 url
* @param fileName 文件名;默认时间戳
* @param openType 文件 url时, window.open的打开方式,默认 _blank
* @param suffixTxt 文件名后缀,默认没有
*/
export declare function downloadFile(file: Blob | string, fileName?: string, openType?: string, suffixTxt?: string): void;
/**
* URL 批量下载;在iframe下,子窗口不通知 父iframe也可自行下载
* @param urlArr
* @param clearSecond 默认 5000 清除定时器
*/
export declare function batchDownload(urlArr: Array<string>, clearSecond?: number): void;
/**
* 导出 excle 后端返回列表数据(只能下载返回的数据)
* @param data Blob
* @param fileName 默认当前时间戳
*/
export declare const ExportExlFile: (data: Blob, fileName?: string) => void;
/**
* 获取随机色; 随机数取整,并转换成16进制
* @return 颜色值
*/
export declare function getRandomColor(): string;
/**
* 0-9数字加 0 处理
* @param t
* @description 非数字 返回 --
*/
export declare function tranlateTime10(t: number | string): string | number;
export declare function getUTCtime(): string;
/**
* 数组去重
* @param list 待去重数组
* @param key 根据什么去重; 默认 id
*/
export declare function delRepeat(list: Array<IObjAny>, key?: string): IObjAny[];
/**
* 数组取交集
* @param arrA 待取交集数组
* @param arrB 待取交集数组
* @param crossBy 数组时根据什么字段 取交集;
* 有值,表示数组对象类型的取交集,默认为空表示简单数组
* 数组对象的取交集,是根据 crossBy 字段来的
* @returns Array<string|number>
* @example
* let a = [1,2,3,3,4,5]; let b = [1,3,4,55,6];
* getCrossArray(a,b) => [1, 3, 3, 4]
*/
export declare function getCrossArray(arrA: Array<string | number | IObjAny>, arrB: Array<string | number | IObjAny>, crossBy?: string): (string | number | IObjAny)[];
/**
* @description 数组取并集; 可能会重复;
* @param arrA, arrB 待取并集数组 ; complex:复杂数组,即数组对象,false,即为简单数组;
* @return arr
* @example let a = [1,2,3,3,4,5];
let b = [1,3,4,55,6];
getUnionArray(a,b) => [1, 2, 3, 3, 4, 5, 1, 3, 4, 55, 6]
*/
export declare function getUnionArray(arrA: Array<string | number>, arrB: Array<string | number>, complex?: boolean): (string | number)[];
/**
* 数组排序
* @param arr 待排序数组
* @param id 根据什么排序; 默认 pid
* @returns
*/
export declare function sortArrById(arr: Array<IObjAny>, id?: string): IObjAny[];
/**
* 数组对象 转换成 tree 结构;
* @param arr
* @param pid 父元素id字段
* @example
* let c1 = [
{id: '021', name: 'n021', pid: '02', children:[]},
{id: '032', name: 'n032', pid: '03', children:[]},
{id: '01', name: 'n01', pid: '0', children:[]},
{id: '02', name: 'n01', pid: '0', children:[]},
]
===>
let c1 = [
{id: '01', name: 'n01', pid: '0', children:[]},
{id: '02', name: 'n02', pid: '0', children:[
{id: '021', name: 'n021', pid: '02', children:[]},
]},
]
*/
export declare function arr2Tree(arr: Array<IObjAny>, pid?: string): IObjAny[];
/**
* 数组对象转成 tree结构
* @param list [{ id, parentId}, ...]
* @returns [{id, parentId, children}]
*/
export declare function list2TreeById<T extends IBackendTree>(list: T[]): ITreeNode[];
/**
* tree 平铺展开 成数组对象, 包括 1级、2级等 所有级别, 不重复
* @param tree 树结构数组
*/
export declare function tree2Arr(treeData: Array<IObjAny>): IObjAny[];
/**
* list--> map
* @param list 数组;key:String; 默认是 'id'
* @param key map的key; 默认是 'value'
*/
export declare function list2Map<T extends {
[propname: string | number]: any;
}>(list: Array<T>, key?: string | number): {
[propname: string]: T;
[propname: number]: T;
};
/**
* @description 获取对象属性重复数目
* @example
* [{name:'apple'},{name:'apple'},{name:'orange'},{name:'apple'},{name:'pear'}] => {"apple":3,"orange":1,"pear":1}
*/
export declare function getRepeatProNum(arr: Array<IObjAny>): IObjAny;
/**
* 把 Obj里 空值(''|null|undefined|[]|{}),转成 undefined; 方便antd等 undefined时显示 placeHolder
* @param obj {}类型的参数,不是 {}类型的话,会返回原数据
* @param toUndefined 是否把 空 转成 undefined; true
* @returns obj
*/
export declare function val2Undefined(obj: IObjAny, toUndefined?: boolean): IObjAny;
/************************************************************* 菜单相关 开始 ***********************************************************/
/**
* 处理菜单
* @param viewModules 批量注册路由: import.meta.glob 的值
* @param frameRoute 布局layout 入口的 路由;
* @param list0 菜单接口返回的 菜单数据; T接口返回的菜单类型
* @param isAdmin 是否是 管理员;
* @param ifTranslate 是否需要 把接口菜单转换成指定字段;true
* @param fieldCfg 转换成指定字段配置;有默认值,也可以直接赋值 {}
* @param splitUrls 根据指定urls 分割path以挑出自带页面path(可以加载本地代码);默认为[],表示不用分割;
* @param menuDirVal 是目录 类型时 menuType 的值;['D']
* @param menuPageVal 是页面 类型时 menuType 的值;['P']
* @param menuButtonVal 是按钮类 型时 menuType 的值;['B']
* @param visibleVal 菜单显示时 visible的值;0
* @param isI18n 是否处于国际化环境中;false
* @returns
* myAllMenus所有菜单
* mySiderMenu左侧展示 可见的菜单
* myPerms按钮 级别权限字符
* myPathList菜单的 path 集合
*/
export declare function generateMenuRoutes<T extends IObjAny>(viewModules: Record<string, () => Promise<any>>, frameRoute: IRoute, list0: Array<T>, isAdmin: boolean, ifTranslate?: boolean, fieldCfg?: IBackMenuField, splitUrls?: Array<string>, menuDirVal?: string[], // 是目录类型; 数组类型,防止某些情况下,存在多个值
menuPageVal?: string[], // 是页面类型; 数组类型,防止某些情况下,存在多个值
menuButtonVal?: string[], // 是页面类型
visibleVal?: number, // 0 显示
isI18n?: boolean): {
myAllMenus: IFontMenu[];
mySiderMenu: IFontMenu[];
myPerms: string[];
myPagePaths: string[];
};
/**
* 转换 菜单接口返回的 model,使之符合内部需要
* @param list 接口返回的菜单 集合
* @param ifTranslate 是否需要转换成指定字段
* @param fieldCfg 指定字段配置; key 是内部使用的字段,value 是接口对应的字段
* @returns IBackMenu
*/
export declare function translateMenusField<T extends IObjAny>(list: Array<T>, ifTranslate?: boolean, fieldCfg?: IBackMenuField): Array<IBackMenu>;
/**
* sider菜单 仅做展示用,去除了多余的敏感数据
* @param arr 菜单数据源
* @class1Id 一级菜单 id; 默认0
* @returns 脱敏后的菜单({ title, routeKey, menuType, icon, children })
*/
export declare function translateSiderOps(arr: Array<IFontMenu>, class1Id?: number): ISiderShowMenu[];
/**
* 菜单树形关系排序
* @param rArr 菜单数据源
* @param menuButtonVal 按钮 类型的值
* @returns 树形菜单数据
*/
export declare function sortRelationship(rArr: Array<IFontMenu>, menuButtonVal: Array<string>): IFontMenu[];
/************************************************************* 菜单相关 结束 ***********************************************************/