You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
fu-hsi-web/src/utils/index.js

252 lines
6.0 KiB
JavaScript

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/**
* @description: 工具类
* @fileName: index
* @author: luhuixu
* @date: 2023/5/27-13:36
* @version: V1.0.0
**/
/**
* @description 格式化时间
* @param time
* @param cFormat
* @returns {string|null}
*/
export function parseTime(time, cFormat) {
if (!time) return '-'
if (arguments.length === 0) {
return null
}
const format = cFormat || '{y}-{m}-{d} {h}:{i}:{s}'
let date
if (typeof time === 'object') {
date = time
} else {
if (typeof time === 'string' && /^[0-9]+$/.test(time)) {
time = parseInt(time)
}
if (typeof time === 'number' && time.toString().length === 10) {
time = time * 1000
}
date = new Date(time)
}
const formatObj = {
y: date.getFullYear(),
m: date.getMonth() + 1,
d: date.getDate(),
h: date.getHours(),
i: date.getMinutes(),
s: date.getSeconds(),
a: date.getDay()
}
const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => {
let value = formatObj[key]
if (key === 'a') {
return ['日', '一', '二', '三', '四', '五', '六'][value]
}
if (result.length > 0 && value < 10) {
value = '0' + value
}
return value || 0
})
return time_str
}
/**
* @description 根据状态返回对应tag 值
* @param str
* @returns {string}
*/
export function backTagStatusWithString(str) {
let tagType = ''
switch (str) {
case '1':
// 待发布
tagType = 'danger'
break
case '2':
// 报名中
tagType = 'primary'
break
case '3':
// 待制定
tagType = 'warning'
break
case '4':
// 进行中
tagType = 'success'
break
case '5':
// 批阅中
tagType = 'primary'
break
case '6':
// 待公示
tagType = 'warning'
break
case '7':
// 待归档
tagType = 'warning'
break
case '8':
// 已归档
tagType = 'info'
break
case '9':
// 待批阅
tagType = 'warning'
break
case '10':
// 待审核
tagType = 'warning'
break
}
return tagType
}
/**
* @author lhx
* @description 防抖函数
* @param val
* @returns {string}
*/
export function debounce(func, delay = 500) {
let timer
return function(...args) {
clearTimeout(timer)
timer = setTimeout(() => {
func.call(this, ...args)
}, delay)
}
}
/**
* 参数解析:
* ctx: canvas绘图上下文
* str: 需要绘制的文本内容
* draw_width: 绘制后的文字显示宽度
* lineNum: 最大行数,多出部分用'...'表示, 如果传-1可以达到自动换行效果
* startX: 绘制文字的起点 X 轴坐标
* startY: 绘制文字的起点 Y 轴坐标
* steps: 文字行间距
* textIndent: 是否首行缩进两个字符
*/
export function toFormateStr(ctx, str, draw_width, lineNum, startX, startY, steps, textIndent) {
var strWidth = ctx.measureText(str).width // 测量文本源尺寸信息(宽度)
var startpoint = startY; var keyStr = ''; var sreLN = strWidth / draw_width
// 计算文本源一共能生成多少行
var liner = Math.ceil(sreLN)
// 等比缩放测量一行文本显示多少个字符
const strlen = parseInt(str.length / sreLN)
// 若文本不足一行则直接绘制反之大于传入的最多行数lineNum以省略号...)代替
if (strWidth < draw_width) {
ctx.fillText(str, startX, startpoint)
} else {
for (var i = 1; i < liner + 1; i++) {
const startPoint = strlen * (i - 1)
if (i < lineNum || lineNum === -1) {
keyStr = str.substr(startPoint, strlen)
ctx.fillText(keyStr, i === 1 && textIndent ? startX + draw_width / strlen * 2 : startX, startpoint)
} else {
keyStr = str.substr(startPoint, strlen - 5) + '...'
ctx.fillText(keyStr, startX, startpoint)
break
}
startpoint = startpoint + steps
}
}
}
/**
* file转base64
* @param { * } file 图片文件
* @return {base64}
*/
export const fileToBase64 = file => {
const reader = new FileReader()
reader.readAsDataURL(file)
reader.onload = function(e) {
return e.target.result
}
}
/**
* base64转 file
* @param { * } dataurl 图片链接
* filename 图片名称
* @return {file}
*/
export const base64ImgtoFile = (dataurl, filename = 'file') => {
const arr = dataurl.split(',')
const mime = arr[0].match(/:(.*?);/)[1]
const suffix = mime.split('/')[1]
// atob : 解码使用 base-64 编码的字符串
const bstr = window.atob(arr[1])
let n = bstr.length
const u8arr = new Uint8Array(n)
while (n--) {
u8arr[n] = bstr.charCodeAt(n)
}
return new File([u8arr], `${filename}.${suffix}`, {
type: mime
})
}
/**
* 树形结构扁平化
* @param tree 树形结构数据
* @return []
*/
export function treeToArray(tree) {
var res = []
for (const item of tree) {
const { children, ...i } = item
if (children && children.length) {
res = res.concat(treeToArray(children))
}
res.push(i)
}
return res
}
/**
* @author lhx
* @description 返回树形数据
* @param val
* @returns {string}
*/
export function jsonToTree(objects, keyName, parentKeyName) {
if (!keyName) {
keyName = 'id'
}
if (!parentKeyName) {
parentKeyName = 'parentId'
}
// * 先生成parent建立父子关系
const obj = {}
objects.forEach((item) => {
obj[item[keyName]] = item
})
const parentList = []
objects.forEach((item) => {
// item.hasChildren = false;
const parent = obj[item[parentKeyName]]
if (parent) {
// * 当前项有父节点
parent.children = parent.children || []
parent.children.push(item)
// parent.hasChildren = true;
} else {
// * 当前项没有父节点 -> 顶层
parentList.push(item)
}
})
return parentList
}
/**
* @author lhx
* @description 迭代方式实现补零
* @param val
* @returns {string}
*/
export function zeroFill(num, length) {
for (var len = (num + '').length; len < length; len = num.length) {
num = '0' + num
}
return num
}