403 lines
		
	
	
		
			8.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
			
		
		
	
	
			403 lines
		
	
	
		
			8.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
| import { ID_NUMBER } from "../regular";
 | |
| 
 | |
| /**
 | |
|  * 计算序号
 | |
|  */
 | |
| export function serialNumber(pagination, index) {
 | |
|   return (pagination.current - 1) * pagination.pageSize + (index + 1);
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * 字符串数组转数组
 | |
|  */
 | |
| export function toArrayString(value) {
 | |
|   // eslint-disable-next-line no-eval
 | |
|   return value ? eval(value).map(String) : [];
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * 判断文件后缀名是否符合
 | |
|  */
 | |
| export function interceptTheSuffix(name, suffix) {
 | |
|   return (
 | |
|     name.substring(name.lastIndexOf("."), name.length).toLowerCase()
 | |
|     === suffix.toLowerCase()
 | |
|   );
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * 图片转base64
 | |
|  */
 | |
| export function image2Base64(imgUrl) {
 | |
|   return new Promise((resolve) => {
 | |
|     const img = new Image();
 | |
|     img.src = imgUrl;
 | |
|     img.crossOrigin = "Anonymous";
 | |
|     img.onload = function () {
 | |
|       const canvas = document.createElement("canvas");
 | |
|       canvas.width = img.width;
 | |
|       canvas.height = img.height;
 | |
|       const ctx = canvas.getContext("2d");
 | |
|       ctx.drawImage(img, 0, 0, img.width, img.height);
 | |
|       const ext = img.src.substring(img.src.lastIndexOf(".") + 1).toLowerCase();
 | |
|       resolve(canvas.toDataURL(`image/${ext}`));
 | |
|     };
 | |
|   });
 | |
| }
 | |
| 
 | |
| /**
 | |
|  图片转base64 (File对象版本)
 | |
|  */
 | |
| export function image2Base642(file) {
 | |
|   return new Promise((resolve, reject) => {
 | |
|     const reader = new FileReader();
 | |
|     reader.readAsDataURL(file);
 | |
|     reader.onload = (e) => {
 | |
|       resolve(e.target.result); // 返回 base64
 | |
|     };
 | |
|     reader.onerror = (error) => {
 | |
|       reject(error); // 处理错误
 | |
|     };
 | |
|   });
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * 判断图片是否可访问成功
 | |
|  */
 | |
| export function checkImgExists(imgUrl) {
 | |
|   return new Promise((resolve, reject) => {
 | |
|     const ImgObj = new Image();
 | |
|     ImgObj.src = imgUrl;
 | |
|     ImgObj.onload = function (res) {
 | |
|       resolve(res);
 | |
|     };
 | |
|     ImgObj.onerror = function (err) {
 | |
|       reject(err);
 | |
|     };
 | |
|   });
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * 获取数据类型
 | |
|  */
 | |
| export function getDataType(data) {
 | |
|   return Object.prototype.toString.call(data).slice(8, -1);
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * 数组去重
 | |
|  */
 | |
| export function ArrayDeduplication(arr) {
 | |
|   return [...new Set(arr)];
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * 数组对象去重
 | |
|  */
 | |
| export function arrayObjectDeduplication(arr, key) {
 | |
|   const obj = {};
 | |
|   arr = arr.reduce((previousValue, currentValue) => {
 | |
|     if (!obj[currentValue[key]]) {
 | |
|       obj[currentValue[key]] = true;
 | |
|       previousValue.push(currentValue);
 | |
|     }
 | |
|     return previousValue;
 | |
|   }, []);
 | |
|   return arr;
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * 查找字符串中指定的值第几次出现的位置
 | |
|  */
 | |
| export function findCharIndex(options) {
 | |
|   const { str, char, num } = options;
 | |
|   let index = str.indexOf(char);
 | |
|   if (index === -1)
 | |
|     return -1;
 | |
|   for (let i = 0; i < num - 1; i++) {
 | |
|     index = str.indexOf(char, index + 1);
 | |
|     if (index === -1)
 | |
|       return -1;
 | |
|   }
 | |
|   return index;
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * 生成指定两个值之间的随机数
 | |
|  */
 | |
| export function randoms(min, max) {
 | |
|   return Math.random() * (max - min + 1) + min;
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * 千位分隔符
 | |
|  */
 | |
| export function numFormat(num) {
 | |
|   if (num) {
 | |
|     const numArr = num.toString().split(".");
 | |
|     const arr = numArr[0].split("").reverse();
 | |
|     let res = [];
 | |
|     for (let i = 0; i < arr.length; i++) {
 | |
|       if (i % 3 === 0 && i !== 0) {
 | |
|         res.push(",");
 | |
|       }
 | |
|       res.push(arr[i]);
 | |
|     }
 | |
|     res.reverse();
 | |
|     if (numArr[1]) {
 | |
|       res = res.join("").concat(`.${numArr[1]}`);
 | |
|     }
 | |
|     else {
 | |
|       res = res.join("");
 | |
|     }
 | |
|     return res;
 | |
|   }
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * 验证是否为空
 | |
|  */
 | |
| export function isEmpty(value) {
 | |
|   return (
 | |
|     value === undefined
 | |
|     || value === null
 | |
|     || (typeof value === "object" && Object.keys(value).length === 0)
 | |
|     || (typeof value === "string" && value.trim().length === 0)
 | |
|   );
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * 获取url参数
 | |
|  */
 | |
| export function getUrlParam(key) {
 | |
|   const reg = new RegExp(`(^|&)${key}=([^&]*)(&|$)`);
 | |
|   const r = window.location.search.substr(1).match(reg);
 | |
|   if (r != null)
 | |
|     return decodeURI(r[2]);
 | |
|   return "";
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * 数据分页
 | |
|  */
 | |
| export function paging(options) {
 | |
|   const { list, currentPage, pageSize } = options;
 | |
|   return list.filter((item, index) => {
 | |
|     return (
 | |
|       index < +currentPage * +pageSize
 | |
|       && index >= (+currentPage - 1) * +pageSize
 | |
|     );
 | |
|   });
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * 获取文件后缀
 | |
|  */
 | |
| export function getFileSuffix(name) {
 | |
|   return name.substring(name.lastIndexOf(".") + 1);
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * 获取文件名称
 | |
|  */
 | |
| export function getFileName(name) {
 | |
|   if (!name)
 | |
|     return "";
 | |
|   return name.substring(name.lastIndexOf("/") + 1);
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * 读取txt文档
 | |
|  */
 | |
| export function readTxtDocument(filePah) {
 | |
|   return new Promise((resolve) => {
 | |
|     const FILE_URL = getFileUrl();
 | |
|     const file_url = FILE_URL + filePah;
 | |
|     const xhr = new XMLHttpRequest();
 | |
|     xhr.open("get", file_url, true);
 | |
|     xhr.responseType = "blob";
 | |
|     xhr.onload = function (event) {
 | |
|       const reader = new FileReader();
 | |
|       reader.readAsText(event.target.response, "GB2312");
 | |
|       reader.onload = function () {
 | |
|         resolve(reader.result);
 | |
|       };
 | |
|     };
 | |
|     xhr.send();
 | |
|   });
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * 将秒转换成时分秒
 | |
|  */
 | |
| export function secondConversion(second) {
 | |
|   if (!second)
 | |
|     return 0;
 | |
|   const h = Number.parseInt(second / 60 / 60, 10);
 | |
|   const m = Number.parseInt((second / 60) % 60, 10);
 | |
|   const s = Number.parseInt(second % 60, 10);
 | |
|   if (h) {
 | |
|     return `${h}小时${m}分钟${s}秒`;
 | |
|   }
 | |
|   else {
 | |
|     if (m) {
 | |
|       return `${m}分钟${s}秒`;
 | |
|     }
 | |
|     else {
 | |
|       return `${s}秒`;
 | |
|     }
 | |
|   }
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * 附件添加前缀
 | |
|  */
 | |
| export function addingPrefixToFile(list, options = {}) {
 | |
|   if (!list)
 | |
|     return [];
 | |
|   const {
 | |
|     pathKey = "filePath",
 | |
|     nameKey = "fileName",
 | |
|     idKey = "imgFilesId",
 | |
|   } = options;
 | |
|   const FILE_URL = getFileUrl();
 | |
|   for (let i = 0; i < list.length; i++) {
 | |
|     list[i].url = FILE_URL + list[i][pathKey];
 | |
|     list[i].name = list[i][nameKey] || getFileName(list[i][pathKey]);
 | |
|     list[i].imgFilesId = list[i][idKey];
 | |
|   }
 | |
|   return list;
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * 翻译状态
 | |
|  */
 | |
| export function getLabelName(options) {
 | |
|   const { status, list, idKey = "id", nameKey = "name" } = options;
 | |
|   for (let i = 0; i < list.length; i++) {
 | |
|     if (status?.toString() === list[i][idKey]?.toString()) {
 | |
|       return list[i][nameKey];
 | |
|     }
 | |
|   }
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * 计算文件大小
 | |
|  */
 | |
| export function calculateFileSize(size) {
 | |
|   return size > 1024
 | |
|     ? `${(`${size / 1024}`).substring(0, (`${size / 1024}`).lastIndexOf(".") + 3)
 | |
|     }MB`
 | |
|     : `${size}KB`;
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * 根据身份证号获取出生日期和性别
 | |
|  */
 | |
| export function idCardGetDateAndGender(idCard) {
 | |
|   let sex = "";
 | |
|   let date = "";
 | |
|   if (ID_NUMBER.test(idCard)) {
 | |
|     const org_birthday = idCard.substring(6, 14);
 | |
|     const org_gender = idCard.substring(16, 17);
 | |
|     const birthday
 | |
|       = `${org_birthday.substring(0, 4)
 | |
|       }-${
 | |
|         org_birthday.substring(4, 6)
 | |
|       }-${
 | |
|         org_birthday.substring(6, 8)}`;
 | |
|     const birthdays = new Date(birthday.replace(/-/g, "/"));
 | |
|     const Month = birthdays.getMonth() + 1;
 | |
|     let MonthDate;
 | |
|     const DayDate = birthdays.getDate();
 | |
|     let Day;
 | |
|     if (Month < 10)
 | |
|       MonthDate = `0${Month}`;
 | |
|     else MonthDate = Month;
 | |
|     if (DayDate < 10)
 | |
|       Day = `0${DayDate}`;
 | |
|     else Day = DayDate;
 | |
|     sex = org_gender % 2 === 1 ? "1" : "0";
 | |
|     date = `${birthdays.getFullYear()}-${MonthDate}-${Day}`;
 | |
|   }
 | |
|   return { sex, date };
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * 获取select中指定项组成的数组
 | |
|  */
 | |
| export function getSelectAppointItemList(options) {
 | |
|   const { list, value, idKey = "id" } = options;
 | |
|   return list.filter(item => value.includes(item[idKey]));
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * json转换为树形结构
 | |
|  */
 | |
| export function listTransTree(options) {
 | |
|   const { json, idKey, parentIdKey, childrenKey } = options;
 | |
|   const r = [];
 | |
|   const hash = {};
 | |
|   let i = 0;
 | |
|   let j = 0;
 | |
|   const len = json.length;
 | |
|   for (; i < len; i++) {
 | |
|     hash[json[i][idKey]] = json[i];
 | |
|   }
 | |
|   for (; j < len; j++) {
 | |
|     const aVal = json[j];
 | |
|     const hashVP = hash[aVal[parentIdKey]];
 | |
|     if (hashVP) {
 | |
|       !hashVP[childrenKey] && (hashVP[childrenKey] = []);
 | |
|       hashVP[childrenKey].push(aVal);
 | |
|     }
 | |
|     else {
 | |
|       r.push(aVal);
 | |
|     }
 | |
|   }
 | |
|   return r;
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * 将值转换为"是"/"否"显示文本
 | |
|  */
 | |
| export function isEmptyToWhether(value, options = {}) {
 | |
|   const { yesText = "是", noText = "否", yesValue = "1" } = options;
 | |
|   return !isEmpty(value)
 | |
|     ? value.toString() === yesValue.toString()
 | |
|       ? yesText
 | |
|       : noText
 | |
|     : "";
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * 生成指定长度的guid
 | |
|  */
 | |
| export function createGuid(len = 32) {
 | |
|   const chars = "abcdefghijklmnopqrstuvwxyz0123456789";
 | |
|   let result = "";
 | |
|   for (let i = 0; i < len; i++) {
 | |
|     result += chars.charAt(Math.floor(Math.random() * chars.length));
 | |
|   }
 | |
|   return result;
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * 获取序号列
 | |
|  */
 | |
| export function getIndexColumn(pagination) {
 | |
|   return {
 | |
|     title: "序号",
 | |
|     key: "index",
 | |
|     width: 70,
 | |
|     render: (_, __, index) => pagination === false ? index + 1 : serialNumber(pagination, index),
 | |
|   };
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * 获取文件url
 | |
|  */
 | |
| export function getFileUrl() {
 | |
|   return process.env.app["fileUrl"];
 | |
| }
 |