You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

166 lines
4.4 KiB

import CONFIG from '@/config'
export const formatTime = date => {
const year = date.getFullYear();
const month = date.getMonth() + 1;
const day = date.getDate();
const hour = date.getHours();
const minute = date.getMinutes();
const second = date.getSeconds();
return [year, month, day].map(formatNumber).join('/') + ' ' + [hour, minute, second].map(formatNumber).join(':');
};
export const formatNumber = n => {
n = n.toString();
return n[1] ? n : '0' + n;
};
export function resetNum(num, type = 'first', fixNum = 6) {
const pow = Math.pow(10, fixNum);
if (type === 'end') {
return (Number(num) / pow).toFixed(4)
}
return Number(num) * pow
}
export function setTabBarBadge (num, index = 1) {
if (num < 1) {
uni.removeTabBarBadge({
index
})
return
}
uni.setTabBarBadge({
//给tabBar添加角标
index,
text: String(num)
});
}
export function toast(message = 'message', duration = 2000) {
uni.showToast({
title: message,
icon: 'none',
duration
})
}
export function getFileList (url) {
const imgType = ['.png', '.jpeg', '.jpg','.xbm','.tif','.ico','.tiff','.gif','.svg','.webp','.bmp','.pjp','.apng','.pjpeg','.avif']
const urls = url ? url.split(',') : []
return urls.map(v => {
const isImg = imgType.some(item => v.includes(item))
const type = isImg ? 'img' : 'video'
console.Console
return {
type,
_url: v,
url: CONFIG.imgUrl + v
}
})
}
export const debounce = (() => {
let timer = null
return (callback, wait = 800) => {
timer&&clearTimeout(timer)
timer = setTimeout(callback, wait)
}
})();
// 图片旋转处理 => output(base64)
export const rotateBase64Img = (src, edg, callback) => {
try {
const canvas = document.createElement('canvas')
const ctx = canvas.getContext('2d')
let imgW = 0 // 图片宽度
let imgH = 0 // 图片高度
let size = 0 // canvas初始大小
if (edg % 90 !== 0) {
throw new Error('旋转角度必须是90的倍数!')
}
(edg < 0) && (edg = (edg % 360) + 360)
const quadrant = (edg / 90) % 4 // 旋转象限
const cutCoor = { sx: 0, sy: 0, ex: 0, ey: 0 } // 裁剪坐标
const image = new Image()
image.src = src
image.crossOrigin = 'anonymous'
image.onload = function () {
imgW = image.width
imgH = image.height
size = imgW > imgH ? imgW : imgH
canvas.width = size * 2
canvas.height = size * 2
switch (quadrant) {
case 0:
cutCoor.sx = size
cutCoor.sy = size
cutCoor.ex = size + imgW
cutCoor.ey = size + imgH
break
case 1:
cutCoor.sx = size - imgH
cutCoor.sy = size
cutCoor.ex = size
cutCoor.ey = size + imgW
break
case 2:
cutCoor.sx = size - imgW
cutCoor.sy = size - imgH
cutCoor.ex = size
cutCoor.ey = size
break
case 3:
cutCoor.sx = size
cutCoor.sy = size - imgW
cutCoor.ex = size + imgH
cutCoor.ey = size + imgW
break
}
ctx.translate(size, size)
ctx.rotate(edg * Math.PI / 180)
ctx.drawImage(image, 0, 0)
const imgData = ctx.getImageData(cutCoor.sx, cutCoor.sy, cutCoor.ex, cutCoor.ey)
if (quadrant % 2 === 0) {
canvas.width = imgW
canvas.height = imgH
} else {
canvas.width = imgH
canvas.height = imgW
}
ctx.putImageData(imgData, 0, 0)
if (typeof callback === 'function') {
const blob = base64ImgtoFile(canvas.toDataURL('image/png', 0.7))
const blobUrl = window.URL.createObjectURL(blob);
callback(blobUrl)
}
}
} catch (e) {
console.log(e)
}
}
function base64ImgtoFile (dataurl, filename = 'file') {
//将base64格式分割['data:image/png;base64','XXXX']
const arr = dataurl.split(',')
// .* 表示匹配任意字符到下一个符合条件的字符 刚好匹配到:
// image/png
const mime = arr[0].match(/:(.*?);/)[1] //image/png
//[image,png] 获取图片类型后缀
const suffix = mime.split('/')[1] //png
const bstr = atob(arr[1]) //atob() 方法用于解码使用 base-64 编码的字符串
let n = bstr.length
const u8arr = new Uint8Array(n)
while (n--) {
u8arr[n] = bstr.charCodeAt(n)
}
return new File([u8arr], `${filename}.${suffix}`, {
type: mime
})
}