import { post } from '../services/common/CommonController'; export function sleep(time: number) { // eslint-disable-next-line no-promise-executor-return return new Promise((resolve) => setTimeout(resolve, time)); } export function changePath(routes: Array) { routes.forEach((route) => { if (route.component) { const component = route.component as string route.component = `src${component.substring(component.indexOf("/"))}` } if (route.routes && route.routes.length > 0) { changePath(route.routes) } }) return routes } /** * 判断照片是否存在 * @param imgUrl 图片路径 * @returns */ export async function isExistImg(imgurl: string) { return new Promise((resolve, reject) => { const ImgObj = new Image(); // 判断图片是否存在 ImgObj.src = require(`../assets/icon/${imgurl}`); ImgObj.onload = (res) => { resolve(res); }; ImgObj.onerror = (err) => { reject(err); }; }).then((imageData) => { const target = (imageData as any).target; if (target.fileSize > 0 || (target.width > 0 && target.height > 0)) { return true; } return false; }).catch((err) => { console.error(err); return false; }); } /** * 预加载function的图片, * 当应用中包含左斜线,则使用-号替换 * @param functions */ export async function preloadFunctionImage(functions: Array) { if (functions) { const arr = JSON.parse(JSON.stringify(functions)); if (arr && arr.length > 0) { for (const idx in arr) { if (Object.prototype.hasOwnProperty.call(arr, idx) && !arr[idx].link_icon) { const iconname = arr[idx].name.indexOf("/") ? arr[idx].name.replace("/", "-") : arr[idx].name const isExisImg: boolean = await isExistImg(`${iconname}.png`) if (!isExisImg) { // 不存在,则使用默认照片 arr[idx].link_icon = '安检待办' } else { // 存在,则使用预加载照片 arr[idx].link_icon = `${iconname}` } if (arr[idx].children && arr[idx].children.length > 0) { arr[idx].children = await preloadFunctionImage(arr[idx].children) } } } } return arr; } else { return []; } } // 获取下拉数据 export async function getLogicData(keyName: string, value: any) { const logic = keyName.substring(6); return await post(`/api/af-system/logic/${logic}`, { ...value }); }; /** * 文件转base64 * @param file 文件流 * @param callback 回调函数 */ export function fileByBase64(file: File, callback: any) { let reader = new FileReader(); // 传入一个参数对象即可得到基于该参数对象的文本内容 reader.readAsDataURL(file); reader.onload = function (e) { // target.result 该属性表示目标对象的DataURL callback(e.target?.result); }; }; export async function imgToCanvas( base64Url: string, ): Promise { // 创建img元素 const img = document.createElement('img'); img.setAttribute('src', base64Url); // eslint-disable-next-line no-promise-executor-return await new Promise((resolve) => (img.onload = resolve)); // 创建canvas DOM元素,并设置其宽高和图片一样 const canvas: HTMLCanvasElement = document.createElement('canvas'); canvas.width = img.width; canvas.height = img.height; // 坐标(0,0) 表示从此处开始绘制,相当于偏移。 canvas.getContext('2d')?.drawImage(img, 0, 0); return canvas; }; /** * canvas添加水印 * @param canvas 对象 * @param text 水印文字 */ export function addWatermark(canvas: HTMLCanvasElement, text: string) { const ctx: CanvasRenderingContext2D | null = canvas.getContext('2d'); if (ctx) { ctx.fillStyle = 'red'; ctx.textAlign = 'left'; ctx.textBaseline = 'middle'; const fontsize = ctx.canvas.width / 20; ctx.font = fontsize + 'px Arial'; const row: string[] = []; for (let i = 0; i < text.length; i += 20) { row.push(text.substring(i, i + 20)); } for (let i = 0; i < row.length; i++) { const element = row[i]; ctx.fillText(element, 0, fontsize + fontsize * i); } } return canvas; }; /** * canvas转成img * @param {canvas对象} canvas */ export function convasToImg(canvas: HTMLCanvasElement, type: string) { // 新建Image对象,可以理解为DOM let image = new Image(); // canvas.toDataURL 返回的是一串Base64编码的URL // 指定格式 PNG image.src = canvas.toDataURL(type); return image; }; /** * @param urlData base64 * @param fileName 文件名称 * @returns {File} */ export function base64ToFile(urlData: string, fileName: string) { let arr = urlData.split(','); let mime = arr[0].match(/:(.*?);/)![1]; let bytes = atob(arr[1]); // 解码base64 let n = bytes.length; let ia = new Uint8Array(n); while (n--) { ia[n] = bytes.charCodeAt(n); } return new File([ia], fileName, { type: mime }); }; /** * 从字典集合中根据字典名称和值获取这个对象 * @param dictionary * @param columns * @param value * @returns */ export function getDictionaryColumnsValueByValue(dictionary: object, columns: string, value: any) { // console.log(dictionary, columns, value); const result = (dictionary[columns] as Array)?.filter((item: any) => { if (item.value === value) { return item; } }) return result?.[0] || null } /** * 时间格式化 * @param dateStr * @param fmt * @returns */ export function formatDate(dateStr: string, fmt: string) { if (dateStr == null) { return '--' } let date if (dateStr === 'now') { date = new Date() } else { date = new Date(dateStr) } const o = { 'M+': date.getMonth() + 1, 'd+': date.getDate(), 'h+': date.getHours(), 'm+': date.getMinutes(), 's+': date.getSeconds(), 'q+': Math.floor((date.getMonth() + 3) / 3), 'S': date.getMilliseconds() } if (!fmt) { fmt = 'yyyy-MM-dd hh:mm:ss' } if (/(y+)/.test(fmt)) { fmt = fmt.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length)) } for (const k in o) { if (new RegExp('(' + k + ')').test(fmt)) { fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? (o[k]) : (('00' + o[k]).substr(('' + o[k]).length))) } } return fmt }