This commit is contained in:
程
2022-12-28 10:08:51 +08:00
parent 0fa93d545e
commit 3881370b6e
151 changed files with 17044 additions and 0 deletions

524
im/src/utils/functions.js Normal file
View File

@@ -0,0 +1,524 @@
/** 公共方法类 */
import { getToken } from "@/utils/auth";
import config from "@/config/config";
/**
* 人性化时间显示
*
* @param {Object} datetime
*/
export function formatTime(datetime) {
if (datetime == null) return "";
datetime = datetime.replace(/-/g, "/");
let time = new Date();
let outTime = new Date(datetime);
if (/^[1-9]\d*$/.test(datetime)) {
outTime = new Date(parseInt(datetime) * 1000);
}
if (
time.getTime() < outTime.getTime() ||
time.getFullYear() != outTime.getFullYear()
) {
return parseTime(outTime, "{y}-{m}-{d} {h}:{i}");
}
if (time.getMonth() != outTime.getMonth()) {
return parseTime(outTime, "{m}-{d} {h}:{i}");
}
if (time.getDate() != outTime.getDate()) {
let day = outTime.getDate() - time.getDate();
if (day == -1) {
return parseTime(outTime, "昨天 {h}:{i}");
}
if (day == -2) {
return parseTime(outTime, "前天 {h}:{i}");
}
return parseTime(outTime, "{m}-{d} {h}:{i}");
}
if (time.getHours() != outTime.getHours()) {
return parseTime(outTime, "{h}:{i}");
}
let minutes = outTime.getMinutes() - time.getMinutes();
if (minutes == 0) {
return "刚刚";
}
minutes = Math.abs(minutes);
return `${minutes}分钟前`;
}
/**
* 格式化文件大小
*
* @param {String} value 文件大小(字节)
*/
export function formatSize(value) {
if (null == value || value == "") {
return "0";
}
let unitArr = ["Bytes", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"];
let index = 0;
let srcsize = parseFloat(value);
index = Math.floor(Math.log(srcsize) / Math.log(1024));
let size = srcsize / Math.pow(1024, index);
size = size.toFixed(2); //保留的小数位数
return size + unitArr[index];
}
/**
* 获取文件后缀名
*
* @param {String} fileName
*/
export function getFileExt(fileName) {
let ext = fileName.split(".");
ext = ext[ext.length - 1]; // 获取文件后缀名
return ext;
}
/**
* 根据图片url下载图片
* @param {String} imgsrc
* @param {String} name
*/
export function downloadIamge(imgsrc, name) {
//下载图片地址和图片名
let image = new Image();
// 解决跨域 Canvas 污染问题
image.setAttribute("crossOrigin", "anonymous");
image.onload = function () {
let canvas = document.createElement("canvas");
canvas.width = image.width;
canvas.height = image.height;
let context = canvas.getContext("2d");
context.drawImage(image, 0, 0, image.width, image.height);
let url = canvas.toDataURL("image/png"); //得到图片的base64编码数据
let a = document.createElement("a"); // 生成一个a元素
let event = new MouseEvent("click"); // 创建一个单击事件
a.download = name || "photo"; // 设置图片名称
a.href = url; // 将生成的URL设置为a.href属性
a.dispatchEvent(event); // 触发a的单击事件
};
image.src = imgsrc;
}
/**
* 通过图片url获取图片大小
*
* @param {String} imgsrc 例如图片名: D8x5f13a53dbc4b9_350x345.png
*/
export function getImageInfo(imgsrc) {
let data = {
width: 0,
height: 0,
};
let arr = imgsrc.split("_");
if (arr.length == 1) return data;
let info = arr[arr.length - 1].match(/\d+x\d+/g);
if (info == null) return data;
info = info[0].split("x");
return {
width: parseInt(info[0]),
height: parseInt(info[1]),
};
}
/**
* 文件下载方法
*
* @param {Number} cr_id
*/
export function download(cr_id) {
let api = config.BASE_API_URL;
let token = getToken();
try {
let link = document.createElement("a");
link.href = `${api}/download/user-chat-file?cr_id=${cr_id}&token=${token}`;
link.click();
} catch (e) {}
}
/**
* 时间格式化方法
*
* @param {(Object|string|number)} time
* @param {String} cFormat
* @returns {String | null}
*/
export function parseTime(time, cFormat) {
if (arguments.length === 0) {
return null;
}
let date;
const format = cFormat || "{y}-{m}-{d} {h}:{i}:{s}";
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;
console.log("时间判断为number");
}
date = new Date(time.replace(/-/g, "/"));
}
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(/{([ymdhisa])+}/g, (result, key) => {
const value = formatObj[key];
// Note: getDay() returns 0 on Sunday
if (key === "a") {
return ["日", "一", "二", "三", "四", "五", "六"][value];
}
return value.toString().padStart(2, "0");
});
return time_str;
}
/**
* 去除字符串控制
*
* @param {String} str
*/
export function trim(str, type = null) {
if (type) {
return str.replace(/(^\s*)|(\s*$)/g, "");
} else if (type == "l") {
return str.replace(/(^\s*)/g, "");
} else {
return str.replace(/(\s*$)/g, "");
}
}
/**
* 解析url中参数
*
* @param {String} url
* @returns {Object}
*/
export function param2Obj(url) {
const search = url.split("?")[1];
if (!search) return {};
return JSON.parse(
'{"' +
decodeURIComponent(search)
.replace(/"/g, '\\"')
.replace(/&/g, '","')
.replace(/=/g, '":"')
.replace(/\+/g, " ") +
'"}'
);
}
/**
* @param {Object} json
* @returns {Array}
*/
export function param(json) {
if (!json) return "";
return cleanArray(
Object.keys(json).map((key) => {
if (json[key] === undefined) return "";
return encodeURIComponent(key) + "=" + encodeURIComponent(json[key]);
})
).join("&");
}
/**
* @param {Array} actual
* @returns {Array}
*/
export function cleanArray(actual) {
const newArray = [];
for (let i = 0; i < actual.length; i++) {
if (actual[i]) {
newArray.push(actual[i]);
}
}
return newArray;
}
/**
* @param {HTMLElement} element
* @param {String} className
*/
export function toggleClass(element, className) {
if (!element || !className) {
return;
}
let classString = element.className;
let nameIndex = classString.indexOf(className);
if (nameIndex === -1) {
classString += "" + className;
} else {
classString =
classString.substr(0, nameIndex) +
classString.substr(nameIndex + className.length);
}
element.className = classString;
}
/**
* Check if an element has a class
*
* @param {HTMLElement} elm
* @param {String} cls
* @returns {Boolean}
*/
export function hasClass(ele, cls) {
return !!ele.className.match(new RegExp("(\\s|^)" + cls + "(\\s|$)"));
}
/**
* Add class to element
*
* @param {HTMLElement} elm
* @param {String} cls
*/
export function addClass(ele, cls) {
if (!hasClass(ele, cls)) ele.className += " " + cls;
}
/**
* Remove class from element
*
* @param {HTMLElement} elm
* @param {String} cls
*/
export function removeClass(ele, cls) {
if (hasClass(ele, cls)) {
const reg = new RegExp("(\\s|^)" + cls + "(\\s|$)");
ele.className = ele.className.replace(reg, " ");
}
}
/**
* 通过图片Url获取图片等比例缩放的宽度和高度信息
*
* @param {String} src
* @param {Number} width
*/
export function imgZoom(src, width = 200) {
const info = getImageInfo(src);
if (info.width < width) {
return {
width: `${info.width}px`,
height: `${info.height}px`,
};
}
return {
width: width + "px",
height: parseInt(info.height / (info.width / width)) + "px",
};
}
/**
* 获取浏览器光标选中内容
*
* @export
* @returns
*/
export function getSelection() {
return window.getSelection
? window.getSelection().toString()
: document.selection.createRange().text;
}
/**
* 剪贴板复制功能
*
* @param {String} value 复制内容
* @param {Function} callback 复制成功回调方法
*/
export const copyTextToClipboard = (value, callback) => {
let textArea = document.createElement("textarea");
textArea.style.background = "transparent";
textArea.value = value;
document.body.appendChild(textArea);
textArea.select();
try {
document.execCommand("copy");
if (callback) callback();
} catch (err) {
this.$message.error("Oops, unable to copy");
}
document.body.removeChild(textArea);
};
/**
* 隐藏用户手机号中间四位
*
* @param {String} phone 手机号
*/
export function hidePhone(phone) {
return phone.replace(/(\d{3})\d{4}(\d{4})/, "$1****$2");
}
/**
* 人性化显示时间
*
* @param {Object} datetime
*/
export function beautifyTime(datetime = "") {
if (datetime == null) {
return "";
}
datetime = datetime.replace(/-/g, "/");
let time = new Date();
let outTime = new Date(datetime);
if (/^[1-9]\d*$/.test(datetime)) {
outTime = new Date(parseInt(datetime) * 1000);
}
if (time.getTime() < outTime.getTime()) {
return parseTime(outTime, "{y}/{m}/{d}");
}
if (time.getFullYear() != outTime.getFullYear()) {
return parseTime(outTime, "{y}/{m}/{d}");
}
if (time.getMonth() != outTime.getMonth()) {
return parseTime(outTime, "{m}/{d}");
}
if (time.getDate() != outTime.getDate()) {
let day = outTime.getDate() - time.getDate();
if (day == -1) {
return parseTime(outTime, "昨天 {h}:{i}");
}
if (day == -2) {
return parseTime(outTime, "前天 {h}:{i}");
}
return parseTime(outTime, "{m}-{d}");
}
if (time.getHours() != outTime.getHours()) {
return parseTime(outTime, "{h}:{i}");
}
let minutes = outTime.getMinutes() - time.getMinutes();
if (minutes == 0) {
return "刚刚";
}
minutes = Math.abs(minutes);
return `${minutes}分钟前`;
}
export function getSort(fn) {
return function (a, b) {
let ret = 0;
if (fn.call(this, a, b)) {
ret = -1;
} else if (fn.call(this, b, a)) {
ret = 1;
}
return ret;
};
}
/**
* 批量排序
*
* @param {*} arr
*/
export function getMutipSort(arr) {
return function (a, b) {
let tmp;
let i = 0;
do {
tmp = arr[i++](a, b);
} while (tmp == 0 && i < arr.length);
return tmp;
};
}
/**
* Url 替换超链接
*
* @param {String} text 文本
* @param {String} color 超链接颜色
*/
export function textReplaceLink(text, color = "#409eff") {
let exp =
/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/gi;
return text.replace(
exp,
`<a href='$1' target="_blank" style="color:${color};text-decoration: revert;">$1</a >`
);
}
/**
* 防抖
*
* @param {*} func
* @param {*} wait
* @param {*} immediate
* @returns
*/
export function debounce(func, wait, immediate) {
let timeout;
return function () {
let context = this;
let args = arguments;
if (timeout) clearTimeout(timeout); // timeout 不为null
if (immediate) {
let callNow = !timeout; // 第一次会立即执行,以后只有事件执行后才会再次触发
timeout = setTimeout(function () {
timeout = null;
}, wait);
if (callNow) func.apply(context, args);
} else {
timeout = setTimeout(function () {
func.apply(context, args);
}, wait);
}
};
}