import type { App } from 'vue' import { adminBaseRoutePath } from '@/router/static' import router from '@/router/index' import { trimStart } from 'lodash-es' import * as elIcons from '@element-plus/icons-vue' import Icon from '@/components/icon/index.vue' export function registerIcons(app: App) { /* * 全局注册 Icon * 使用方式: * 详见<待完善> */ app.component('Icon', Icon) /* * 全局注册element Plus的icon */ const icons = elIcons as any for (const i in icons) { app.component(`el-icon-${icons[i].name}`, icons[i]) } } /** * 是否在后台应用内 * @param path 不传递则通过当前路由 path 检查 */ export const isAdminApp = (path = '') => { const regex = new RegExp(`^${adminBaseRoutePath}`) if (path) { return regex.test(path) } if (regex.test(getCurrentRoutePath())) { return true } return false } /** * 获取路由 path */ export const getCurrentRoutePath = () => { let path = router.currentRoute.value.path if (path == '/') path = trimStart(window.location.hash, '#') if (path.indexOf('?') !== -1) path = path.replace(/\?.*/, '') return path } /** * 获取资源完整地址 * @param relativeUrl 资源相对地址 * @param domain 指定域名 */ export const fullUrl = (relativeUrl: string, domain = '') => { return domain + relativeUrl } /** * 是否是外部链接 * @param path */ export function isExternal(path: string): boolean { return /^(https?|ftp|mailto|tel):/.test(path) } /** * 全局防抖 * 与 _.debounce 不同的是,间隔期间如果再次传递不同的函数,两个函数也只会执行一次 * @param fn 执行函数 * @param ms 间隔毫秒数 */ export const debounce = (fn: Function, ms: number) => { return (...args: any[]) => { if (window.lazy) { clearTimeout(window.lazy) } window.lazy = window.setTimeout(() => { fn(...args) }, ms) } } /** * 字符串补位 */ const padStart = (str: string, maxLength: number, fillString = ' ') => { if (str.length >= maxLength) return str const fillLength = maxLength - str.length let times = Math.ceil(fillLength / fillString.length) while ((times >>= 1)) { fillString += fillString if (times === 1) { fillString += fillString } } return fillString.slice(0, fillLength) + str } /** * 格式化时间戳 * @param dateTime 时间戳 * @param fmt 格式化方式,默认:yyyy-mm-dd hh:MM:ss */ export const timeFormat = (dateTime: string | number | null = null, fmt = 'yyyy-mm-dd hh:MM:ss') => { if (dateTime == 'none') return '-' if (!dateTime) dateTime = Number(new Date()) if (dateTime.toString().length === 10) { dateTime = +dateTime * 1000 } const date = new Date(dateTime) let ret const opt: anyObj = { 'y+': date.getFullYear().toString(), // 年 'm+': (date.getMonth() + 1).toString(), // 月 'd+': date.getDate().toString(), // 日 'h+': date.getHours().toString(), // 时 'M+': date.getMinutes().toString(), // 分 's+': date.getSeconds().toString() // 秒 } for (const k in opt) { ret = new RegExp('(' + k + ')').exec(fmt) if (ret) { fmt = fmt.replace(ret[1], ret[1].length == 1 ? opt[k] : padStart(opt[k], ret[1].length, '0')) } } return fmt }