js 工具类
const XLSX = require("xlsx");
import Papa from "papaparse";
export const ChenUtil = {
// tree
treeUtil: {
generateTreeData: function (data, nodeId, parentNodeKey) {
// 将数据存储为以 nodeId 为 KEY 的 map 索引数据列
const map = {};
data.forEach((item) => {
item.children = [];
map[item[nodeId]] = item;
});
// 遍历数据,构建树形结构
const rootNodes = [];
data.forEach((item) => {
const parent = map[item[parentNodeKey]];
if (parent) {
parent.children.push(item);
item.parent = parent;
} else {
rootNodes.push(item);
}
});
return rootNodes;
},
// 在树形结构中查找指定id节点
findNodeInTree: function (tree, id) {
for (let i = 0; i < tree.length; i++) {
if (tree[i].id === id) {
return tree[i];
} else {
if (tree[i].children) {
let node = this.findNodeInTree(tree[i].children, id);
if (node) {
return node;
}
}
}
}
},
// 在树形结构中查找指定id节点的上一个父节点
findParentNodeInTree: function (tree, id) {
// Id等于0的节点为根节点,没有父节点
// id找到了的话,往上找一层父节点返回
if (id === 0) {
return null;
}
for (let i = 0; i < tree.length; i++) {
if (tree[i].id === id) {
return tree[i].parent;
} else {
if (tree[i].children) {
let node = this.findParentNodeInTree(tree[i].children, id);
if (node) {
return node;
}
}
}
}
},
},
// cookie
cookie: {
setCookie: function (name, value, day) {
const date = new Date();
date.setDate(date.getDate() + day);
document.cookie = name + "=" + value + ";expires=" + date;
},
getCookie: function (cname) {
var name = cname + "=";
var ca = document.cookie.split(";");
for (var i = 0; i < ca.length; i++) {
var c = ca[i].trim();
if (c.indexOf(name) === 0) return c.substring(name.length, c.length);
}
return "";
},
delCookie: function (name) {
this.setCookie(name, "", -1);
},
},
// turnFile
turnFile: {
// base64转file
base64toFile: function (base64, filename) {
let arr = base64.split(",");
let mime = arr[0].match(/:(.*?);/)[1];
let suffix = mime.split("/")[1];
let bstr = atob(arr[1]);
let n = bstr.length;
let u8arr = new Uint8Array(n);
while (n--) {
u8arr[n] = bstr.charCodeAt(n);
}
return new File([u8arr], `${filename}.${suffix}`, {
type: mime,
});
},
//获取图片url转换file对象
getImageFileFromUrl: function (url, imageName) {
return new Promise((resolve, reject) => {
var blob = null;
var xhr = new XMLHttpRequest();
xhr.open("GET", url);
xhr.setRequestHeader("Accept", "image/jpeg");
xhr.responseType = "blob";
xhr.onload = () => {
blob = xhr.response;
let imgFile = new File([blob], imageName, { type: "image/jpeg" });
resolve(imgFile);
};
xhr.onerror = (e) => {
reject(e);
};
xhr.send();
});
},
// 文件url转换file对象
getFileFromUrl: function (url, fileName) {
return new Promise((resolve, reject) => {
var blob = null;
var xhr = new XMLHttpRequest();
xhr.open("GET", url);
xhr.responseType = "blob";
xhr.onload = () => {
blob = xhr.response;
let file = new File([blob], fileName);
// let file = new File([blob], fileName, {
// type: 'application/octet-stream',
// });
resolve(file);
};
xhr.onerror = (e) => {
reject(e);
};
xhr.send();
});
},
},
// download
download: {
/**
* 将url文件下载到本地
* @param fileUrl {String} 文件链接
* @param fileName {String} 文件名字
* @return void
*/
downloadFile: async function (fileUrl, fileName) {
console.log(fileUrl);
let blob = await this.getBlob(fileUrl);
this.saveFile(blob, fileName);
},
getBlob: function (fileUrl) {
return new Promise((resolve) => {
const xhr = new XMLHttpRequest();
xhr.open("GET", fileUrl, true);
xhr.setRequestHeader(
"content-type",
"application/x-www-form-urlencoded"
);
//监听进度
xhr.addEventListener(
"progress",
function (evt) {
if (evt.lengthComputable) {
let percentComplete = evt.loaded / evt.total;
// 下载进度
let percentage = percentComplete * 100;
console.log(percentage);
}
},
false
);
xhr.responseType = "blob";
xhr.onload = () => {
if (xhr.status === 200) {
resolve(xhr.response);
}
};
xhr.send();
});
},
saveFile: function (blob, fileName) {
// ie的下载
if (window.navigator.msSaveOrOpenBlob) {
navigator.msSaveBlob(blob, fileName);
} else {
// 非ie的下载
const link = document.createElement("a");
const body = document.querySelector("body");
link.href = window.URL.createObjectURL(blob);
link.download = fileName;
// fix Firefox
link.style.display = "none";
body.appendChild(link);
link.click();
body.removeChild(link);
window.URL.revokeObjectURL(link.href);
}
},
},
// 加密/解密
secret: function (string, code, operation) {
// string-需要解密的字段 code-约定的密钥 operation 默认false表示加密,传入true表示解密
// 引入:import CryptoJS from 'crypto-js'; npm install crypto-js --save
// cdn: <script src="https://cdn.bootcss.com/crypto-js/3.1.9-1/crypto-js.js"></script>
code = CryptoJS.MD5(code).toString();
var iv = CryptoJS.enc.Utf8.parse(code.substring(0, 16));
var key = CryptoJS.enc.Utf8.parse(code.substring(16));
if (operation) {
return CryptoJS.AES.decrypt(string, key, {
iv: iv,
padding: CryptoJS.pad.Pkcs7,
}).toString(CryptoJS.enc.Utf8);
}
return CryptoJS.AES.encrypt(string, key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7,
}).toString();
},
// 文件读取
file: {
// 文件读取,将xlsx,xls转为json
// npm install xlsx --save
xlsxReadFile: function (file) {
return new Promise((resolve, reject) => {
const reader = new FileReader();
reader.onload = () => {
const data = reader.result;
const workbook = XLSX.read(data, { type: "binary" });
const sheetNames = workbook.SheetNames;
const result = {};
sheetNames.forEach((sheetName) => {
const worksheet = workbook.Sheets[sheetName];
const jsonData = XLSX.utils.sheet_to_json(worksheet);
result[sheetName] = jsonData;
});
resolve(result);
};
reader.onerror = () => {
reject(reader.error);
};
reader.readAsBinaryString(file);
});
},
// 文件读取,将csv转json
// npm install papaparse
convertToJSON: function (file) {
return new Promise((resolve, reject) => {
const reader = new FileReader();
reader.onload = () => {
const csvString = reader.result;
const parsedResult = Papa.parse(csvString, {
header: true,
});
resolve(parsedResult.data);
};
reader.onerror = () => {
reject(reader.error);
};
reader.readAsText(file);
});
},
},
};
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
评论已关闭