| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209 |
- import padStart from 'lodash/padStart'
- import Clipboard from 'clipboard'
- import CryptoJS from 'crypto-js'
- const CRYPTO_KEY = 'zxc_ppt_online_editor'
- // 生成随机数
- export const createRandomNumber = (min: number, max: number) => {
- return Math.floor(min + Math.random() * (max - min))
- }
- // 生成随机码
- export const createRandomCode = (len = 6) => {
- const charset = `_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz`
- const maxLen = charset.length
- let ret = ''
- for(let i = 0; i < len; i++) {
- const randomIndex = Math.floor(Math.random() * maxLen)
- ret += charset[randomIndex]
- }
- return ret
- }
- // 生成uuid
- export const createUUID = () => {
- const url = URL.createObjectURL(new Blob())
- const uuid = url.toString()
- URL.revokeObjectURL(url)
- return uuid.substr(uuid.lastIndexOf('/') + 1)
- }
- // 获取当前日期字符串
- export const getDateTime = (format = 'yyyy-MM-dd hh:mm:ss') => {
- const date = new Date()
- const formatMap = {
- 'y+': date.getFullYear(),
- 'M+': date.getMonth() + 1,
- 'd+': date.getDate(),
- 'h+': date.getHours(),
- 'm+': date.getMinutes(),
- 's+': date.getSeconds(),
- }
- for(const item of Object.keys(formatMap)) {
- if(new RegExp('(' + item + ')').test(format)) {
- const formated = (formatMap[item] + '').length < RegExp.$1.length ? padStart('' + formatMap[item], RegExp.$1.length, '0') : formatMap[item]
- format = format.replace(RegExp.$1, formated)
- }
- }
- return format
- }
- // 数字转中文,如1049 -> 一千零四十九
- export const digitalToChinese = (n: number) => {
- const str = n + ''
- const len = str.length - 1
- const idxs = ['', '十', '百', '千']
- const num = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九']
- return str.replace(/([1-9]|0+)/g, ($, $1, idx) => {
- const pos = len - idx
- if($1 !== 0) {
- if(idx === 0 && $1 === 1 && idxs[pos] === '十') return idxs[pos]
- return num[$1] + idxs[pos]
- }
- if(idx + $1.length >= str.length) return ''
- return '零'
- })
- }
- // 数字补足位数,例如将6补足3位 -> 003
- export const fillDigit = (digit: number, len: number) => {
- return padStart('' + digit, len, '0')
- }
- // 进入全屏
- export const enterFullscreen = () => {
- const docElm = document.documentElement
- docElm.requestFullscreen()
- }
- // 退出全屏
- export const exitFullscreen = document.exitFullscreen
- // 判断是否全屏
- export const isFullscreen = () => document.fullscreenEnabled
- // 判断用户的操作系统是否安装了某字体
- export const isSupportFontFamily = (fontFamily: string) => {
- if(typeof fontFamily !== 'string') return false
- const arial = 'Arial'
- if(fontFamily.toLowerCase() === arial.toLowerCase()) return true
- const a = 'a'
- const size = 100
- const width = 100
- const height = 100
- const canvas = document.createElement('canvas')
- const ctx = canvas.getContext('2d')
- if(!ctx) return false
- canvas.width = width
- canvas.height = height
- ctx.textAlign = 'center'
- ctx.fillStyle = 'black'
- ctx.textBaseline = 'middle'
- const getDotArray = (_fontFamily: string) => {
- ctx.clearRect(0, 0, width, height)
- ctx.font = `${size}px ${_fontFamily}, ${arial}`
- ctx.fillText(a, width / 2, height / 2)
- const imageData = ctx.getImageData(0, 0, width, height).data
- return [].slice.call(imageData).filter(item => item !== 0)
- }
- return getDotArray(arial).join('') !== getDotArray(fontFamily).join('')
- }
- // 获取图片的原始宽高
- export const getImageSize = (imgUrl: string) => {
- return new Promise((resolve, reject) => {
- const img = document.createElement('img')
- img.src = imgUrl
- img.style.opacity = '0'
- document.body.appendChild(img)
- img.onload = () => {
- const imgWidth = img.clientWidth
- const imgHeight = img.clientHeight
-
- img.onload = null
- img.onerror = null
- document.body.removeChild(img)
- resolve({ imgWidth, imgHeight })
- }
- img.onerror = () => {
- img.onload = null
- img.onerror = null
- reject('图片加载失败')
- }
- })
- }
- // 复制文本到剪贴板
- export const copyText = (text: string) => {
- return new Promise((resolve, reject) => {
- const fakeElement = document.createElement('button')
- const clipboard = new Clipboard(fakeElement, {
- text: () => text,
- action: () => 'copy',
- container: document.body,
- })
- clipboard.on('success', e => {
- clipboard.destroy()
- resolve(e)
- })
- clipboard.on('error', e => {
- clipboard.destroy()
- reject(e)
- })
- document.body.appendChild(fakeElement)
- fakeElement.click()
- document.body.removeChild(fakeElement)
- })
- }
- // 读取剪贴板
- export const readClipboard = () => {
- if(navigator.clipboard) {
- navigator.clipboard.readText().then(text => {
- if(!text) return { err: '剪贴板为空或者不包含文本' }
- return { text }
- })
- }
- return { err: '浏览器不支持或禁止访问剪贴板' }
- }
- // 加密函数
- export const encrypt = (msg: string) => {
- return CryptoJS.AES.encrypt(msg, CRYPTO_KEY).toString()
- }
- // 解密函数
- export const decrypt = (ciphertext: string) => {
- const bytes = CryptoJS.AES.decrypt(ciphertext, CRYPTO_KEY)
- return bytes.toString(CryptoJS.enc.Utf8)
- }
- // 获取DOM节点样式
- export const getStyle = (el: HTMLElement, style: string) => {
- if(!el) return null
- return window.getComputedStyle(el, null).getPropertyValue(style)
- }
- // 检查元素是否处在可视区域内
- export const checkElementInViewport = (el: HTMLElement) => {
- const rect = el.getBoundingClientRect()
- return (
- rect.top >= 0 &&
- rect.left >= 0 &&
- rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) &&
- rect.right <= (window.innerWidth || document.documentElement.clientWidth)
- )
- }
|