Files
go-view/src/utils/utils.ts
T
2022-04-07 15:28:25 +08:00

187 lines
4.0 KiB
TypeScript

import { h } from 'vue'
import { NIcon } from 'naive-ui'
import screenfull from 'screenfull'
import throttle from 'lodash/throttle'
import Image_404 from '../assets/images/exception/image-404.png'
import html2canvas from 'html2canvas'
import { downloadByA } from './file'
/**
* * 判断是否是开发环境
* @return { Boolean }
*/
export const isDev = () => {
return import.meta.env.DEV
}
/**
* * 生成一个不重复的ID
* @param { Number } randomLength
*/
export const getUUID = (randomLength = 10) => {
return Number(
Math.random().toString().substr(2, randomLength) + Date.now()
).toString(36)
}
/**
* * render 图标
* @param icon 图标
* @param set 设置项
*/
export const renderIcon = (icon: any, set = {}) => {
return () => h(NIcon, set, { default: () => h(icon) })
}
/**
* * render 语言
* @param lang 语言标识
* @param set 设置项
* @param tag 要渲染成的标签
*/
export const renderLang = (lang: string, set = {}, tag = 'span') => {
return () => h(tag, set, { default: () => window['$t'](lang) })
}
/**
* ! 编译会报错,暂不使用
* * 处理 vite 中无法使用 require 的问题,utils 文件为根路径
* @param path
* @param name
* @returns url
*/
// export const requireUrl = (path: string, name: string) => {
// return new URL(`${path}/${name}`, import.meta.url).href
// }
/**
* * 获取错误处理图片,默认 404 图
* @param path
* @param name
* @returns url
*/
export const requireErrorImg = () => {
return Image_404
}
/**
* * 全屏操作函数
* @param isFullscreen
* @param isEnabled
* @returns
*/
export const screenfullFn = (isFullscreen?: boolean, isEnabled?: boolean) => {
// 是否是全屏
if (isFullscreen) return screenfull.isFullscreen
// 是否支持全屏
if (isEnabled) return screenfull.isEnabled
if (screenfull.isEnabled) {
screenfull.toggle()
return
}
// TODO lang
window['$message'].warning('您的浏览器不支持全屏功能!')
}
/**
* * 设置元素属性
* @param HTMLElement 元素
* @param key 键名
* @param value 键值
*/
export const setDomAttribute = <
K extends keyof CSSStyleDeclaration,
V extends CSSStyleDeclaration[K]
>(
HTMLElement: HTMLElement,
key: K,
value: V
) => {
if (HTMLElement) {
HTMLElement.style[key] = value
}
}
/**
* * 判断是否是 mac
* @returns boolean
*/
export const isMac = () => {
return /macintosh|mac os x/i.test(navigator.userAgent)
}
/**
* * file转url
*/
export const fileToUrl = (file: File): string => {
const Url = URL || window.URL || window.webkitURL
const ImageUrl = Url.createObjectURL(file)
return ImageUrl
}
/**
* * file转base64
*/
export const fileTobase64 = (file: File, callback: Function) => {
let reader = new FileReader()
reader.readAsDataURL(file)
reader.onload = function (e: ProgressEvent<FileReader>) {
if (e.target) {
let base64 = e.target.result
callback(base64)
}
}
}
/**
* * 挂载监听
*/
export const addEventListener = <K extends keyof WindowEventMap>(
target: HTMLElement | Document,
type: K,
listener: any,
delay?: number,
options?: boolean | AddEventListenerOptions | undefined
) => {
if (!target) return
target.addEventListener(
type,
throttle(listener, delay || 300, {
leading: true,
trailing: false,
}),
options
)
}
/**
* * 卸载监听
*/
export const removeEventListener = <K extends keyof WindowEventMap>(
target: HTMLElement | Document,
type: K,
listener: any
) => {
if (!target) return
target.removeEventListener(type, listener)
}
/**
* * 截取画面为图片并下载
* @param html 需要截取的 DOM
*/
export const canvasCut = (html: HTMLElement | null, callback?: Function) => {
if (!html) {
window['$message'].error('导出失败!')
if (callback) callback()
return
}
html2canvas(html).then((canvas: HTMLCanvasElement) => {
window['$message'].success('导出成功!')
downloadByA(canvas.toDataURL(), undefined, 'png')
if (callback) callback()
})
}