| | |
| | | import { ElMessage, ElMessageBox } from 'element-plus'; |
| | | import JSONbig from 'json-bigint'; |
| | | |
| | | import { storeToRefs } from 'pinia'; |
| | | import { unref, type Ref } from 'vue'; |
| | | import { useTagsViewRoutes } from '/@/stores/tagsViewRoutes'; |
| | | import { useThemeConfig } from '/@/stores/themeConfig'; |
| | | import request from '/@/utils/request'; |
| | | |
| | | /** |
| | | * @description 当碰到 JSON 中存在过长的数字时,使用 JSONbigString 解析,数字会转为字符串处理 |
| | | * 用法:JSONbigString.parse(jsonStr)) |
| | |
| | | export const convertListToTree = ( |
| | | data: any[], |
| | | defaultProps = { |
| | | ID: 'ID', |
| | | Children: 'Children', |
| | | ParentID: 'ParentID', |
| | | ID: 'id', |
| | | Children: 'children', |
| | | ParentID: 'parent', |
| | | } |
| | | ) => { |
| | | if (!data || data?.length === 0) return []; |
| | |
| | | callback: (value: T, index?, array?, parent?) => any, |
| | | parent: any = null, |
| | | markParent = false, |
| | | childrenKey = 'Children' |
| | | childrenKey = 'children' |
| | | ) => { |
| | | if (!treeData || treeData.length === 0) return; |
| | | if (!parent) parent = treeData; |
| | | |
| | | for (let index = 0; index < treeData.length; index++) { |
| | | const value = treeData[index] as any; |
| | | if (markParent) { |
| | |
| | | |
| | | if (value[childrenKey] && value[childrenKey].length !== 0) { |
| | | // 递归跳出 |
| | | const callResult = travelTree(value[childrenKey], callback, value, markParent); |
| | | const callResult = travelTree(value[childrenKey], callback, value, markParent, childrenKey); |
| | | if (callResult) { |
| | | return true; |
| | | } |
| | |
| | | * @param tableData |
| | | * @returns |
| | | */ |
| | | export const flatten = (tableData: any[], removeChild?: boolean, children = 'Children'): any[] => { |
| | | export const flatten = (tableData: any[], removeChild?: boolean, children = 'children'): any[] => { |
| | | const flattenedData: any[] = []; |
| | | |
| | | for (const item of tableData) { |
| | |
| | | * 最近 n 天的 startDate、endDate |
| | | * @param dates |
| | | */ |
| | | export const getRecentDateRange = (dates: number) => { |
| | | export const getRecentDateRange = (dates: number, includesCurrent = true) => { |
| | | dates = includesCurrent ? dates - 1 : dates; |
| | | // 获取当前日期 |
| | | const endDate = new Date(); |
| | | const startDate = new Date(); |
| | |
| | | }, wait); |
| | | }; |
| | | }; |
| | | |
| | | /** |
| | | * 文件大小字节转换为XXX |
| | | * @param size 字节大小 |
| | | * @returns {string|*} |
| | | */ |
| | | export const convertFileSize = (size) => { |
| | | if (!size && size !== 0) return ''; |
| | | if (size < pow1024(1)) return size + ' B'; |
| | | if (size < pow1024(2)) return (size / pow1024(1)).toFixed(2) + ' KB'; |
| | | if (size < pow1024(3)) return (size / pow1024(2)).toFixed(2) + ' MB'; |
| | | if (size < pow1024(4)) return (size / pow1024(3)).toFixed(2) + ' GB'; |
| | | return (size / pow1024(4)).toFixed(2) + ' TB'; |
| | | }; |
| | | // 求次幂 |
| | | function pow1024(num) { |
| | | return Math.pow(1024, num); |
| | | } |
| | | /** |
| | | * |
| | | * @param {*} func 节流函数 |
| | |
| | | |
| | | /** |
| | | * 保留指定精度小数位,且不补零 |
| | | * @param num |
| | | * @param precision |
| | | * @returns |
| | | * @param num |
| | | * @param precision |
| | | * @returns |
| | | */ |
| | | export const toMyFixed = (num, precision) => { |
| | | if (num == null) return ''; |
| | | return num.toFixed(precision).replace(/\.?0+$/, ''); |
| | | if (!precision) return num + ''; |
| | | const factor = Math.pow(10, precision); |
| | | return Math.round(Number(num) * factor) / factor + ''; |
| | | }; |
| | | |
| | | type GetTextWidthOption = { |
| | | size?: string; |
| | | family?: string; |
| | | }; |
| | | |
| | | export function getTextWidth(text: string, option: GetTextWidthOption) { |
| | | if (!text) return 0; |
| | | const { size = '14px', family = 'Microsoft YaHei' } = option; |
| | | const spanEle = document.createElement('span'); |
| | | document.body.appendChild(spanEle); |
| | | |
| | | spanEle.style.font = 'times new roman'; |
| | | spanEle.style.fontSize = size; |
| | | spanEle.style.height = 'auto'; |
| | | spanEle.style.width = 'auto'; |
| | | spanEle.style.position = 'absolute'; |
| | | spanEle.style.whiteSpace = 'no-wrap'; |
| | | spanEle.innerHTML = text; |
| | | |
| | | const width = spanEle.clientWidth; |
| | | |
| | | document.body.removeChild(spanEle); |
| | | return width; |
| | | } |
| | | |
| | | export function decodeFormData(formDataString) { |
| | | const params = new URLSearchParams(formDataString); |
| | | const decodedData = {}; |
| | | for (const [key, value] of params) { |
| | | decodedData[key] = decodeURIComponent(value); |
| | | } |
| | | return decodedData; |
| | | } |