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

11 months ago
/**
* @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
}