131 lines
3.4 KiB
TypeScript
131 lines
3.4 KiB
TypeScript
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
|
||
* 使用方式: <Icon name="name" size="size" color="color" />
|
||
* 详见<待完善>
|
||
*/
|
||
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
|
||
}
|