2025-01-21 18:08:48 +08:00
|
|
|
|
import {
|
|
|
|
|
|
BASE_URL
|
|
|
|
|
|
} from '@/api/request.js'
|
|
|
|
|
|
|
|
|
|
|
|
export function dateformat(time, format = 'yyyy-MM-dd HH:mm:ss') {
|
|
|
|
|
|
var t = new Date(time);
|
|
|
|
|
|
var tf = function(i) {
|
|
|
|
|
|
return (i < 10 ? '0' : '') + i
|
|
|
|
|
|
};
|
|
|
|
|
|
return format.replace(/yyyy|MM|dd|HH|mm|ss/g,
|
|
|
|
|
|
function(a) {
|
|
|
|
|
|
switch (a) {
|
|
|
|
|
|
case 'yyyy':
|
|
|
|
|
|
return tf(t.getFullYear());
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 'MM':
|
|
|
|
|
|
return tf(t.getMonth() + 1);
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 'mm':
|
|
|
|
|
|
return tf(t.getMinutes());
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 'dd':
|
|
|
|
|
|
return tf(t.getDate());
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 'HH':
|
|
|
|
|
|
return tf(t.getHours());
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 'ss':
|
|
|
|
|
|
return tf(t.getSeconds());
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
})
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//获取文件访问路径
|
|
|
|
|
|
export function getRes(url) {
|
|
|
|
|
|
const reg = /^(http:|https:).*/gi;
|
|
|
|
|
|
// console.log(11223344, reg.test(url), url)
|
|
|
|
|
|
return reg.test(url) ? BASE_URL + url : url
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 去抖动函数,多次触发只执行一次
|
|
|
|
|
|
* @param call 回调函数
|
|
|
|
|
|
* @param cycle 校验周期
|
|
|
|
|
|
* @returns {(function(): void)|*}
|
|
|
|
|
|
*/
|
|
|
|
|
|
export function debounce(call, cycle = 800) {
|
|
|
|
|
|
var timer = null; // 创建一个用来存放定时器的变量
|
|
|
|
|
|
let func = call
|
|
|
|
|
|
return function(...args) {
|
|
|
|
|
|
clearTimeout(timer); //只要触发就清除
|
|
|
|
|
|
timer = setTimeout(() => {
|
|
|
|
|
|
func.apply(this, args);
|
|
|
|
|
|
}, cycle);
|
|
|
|
|
|
};
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
export function getFileSize(size) {
|
|
|
|
|
|
if (size > 1048576) {
|
|
|
|
|
|
return (size / 1048576).toFixed(1) + 'MB'
|
|
|
|
|
|
} else if (size > 1024) {
|
|
|
|
|
|
return (size / 1024).toFixed(1) + 'KB'
|
|
|
|
|
|
} else {
|
|
|
|
|
|
return size + 'B'
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
export function $deepCopy(obj) {
|
|
|
|
|
|
return JSON.parse(JSON.stringify(obj))
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
export function $nEmpty(obj) {
|
|
|
|
|
|
return obj && (obj || '') !== ''
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
export function parseNumber(val, precision) {
|
|
|
|
|
|
if (typeof(val) === 'string') {
|
|
|
|
|
|
return precision > 0 ? parseFloat(parseFloat(val).toFixed(precision)) : parseInt(val)
|
|
|
|
|
|
}
|
|
|
|
|
|
return val
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//常用文件格式
|
|
|
|
|
|
const fileTypes = {
|
|
|
|
|
|
pdf: ['pdf'],
|
|
|
|
|
|
img: ['bmp', 'jpg', 'png', 'tif', 'gif', 'svg', 'psd', 'webp', 'apng'],
|
|
|
|
|
|
video: ['mp4', 'avi', 'mpeg', 'mkv', 'mov', 'rmvb', 'flv', '3gp', 'wav'],
|
|
|
|
|
|
word: ['doc', 'docx'],
|
|
|
|
|
|
excel: ['xls', 'xlsx'],
|
|
|
|
|
|
ppt: ['ppt', 'pptx'],
|
|
|
|
|
|
txt: ['txt'],
|
|
|
|
|
|
zip: ['zip', 'rar', '7z', 'iso'],
|
|
|
|
|
|
}
|
|
|
|
|
|
const fileTypeMap = new Map()
|
|
|
|
|
|
for (const key of Object.keys(fileTypes)) {
|
|
|
|
|
|
fileTypes[key].forEach(v => fileTypeMap.set(v, key))
|
|
|
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 从文件名获取文件对应图标
|
|
|
|
|
|
* @param {Object} fileName 文件名
|
|
|
|
|
|
*/
|
|
|
|
|
|
export function getFileImgByType(fileName) {
|
|
|
|
|
|
const type = fileTypeMap.get(fileName.split('.').pop())
|
|
|
|
|
|
return `/static/image/filetype/${(type || '') === '' ? 'file': type}.png`
|
|
|
|
|
|
}
|
|
|
|
|
|
//记录下本地文件(网络下载),方便打开的时候直接取本地
|
|
|
|
|
|
export function saveNetWorkFileTemp(file) {
|
|
|
|
|
|
// #ifndef H5
|
|
|
|
|
|
let fileObj = uni.getStorageSync('localNetWorkFile')
|
|
|
|
|
|
if (!fileObj) {
|
|
|
|
|
|
fileObj = {}
|
|
|
|
|
|
}
|
|
|
|
|
|
fileObj[file.name] = file.path
|
|
|
|
|
|
uni.setStorageSync('localNetWorkFile', fileObj)
|
|
|
|
|
|
// #endif
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//清除下本地文件(网络下载)
|
|
|
|
|
|
export function removeNetWorkFileTemp(name) {
|
|
|
|
|
|
// #ifndef H5
|
|
|
|
|
|
uni.setStorageSync('localNetWorkFile', {})
|
|
|
|
|
|
// #endif
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//记录下本地文件,方便打开的时候直接取本地
|
|
|
|
|
|
export function saveFileTemp(file) {
|
|
|
|
|
|
// #ifndef H5
|
|
|
|
|
|
let fileObj = uni.getStorageSync('localFile')
|
|
|
|
|
|
if (!fileObj) {
|
|
|
|
|
|
fileObj = {}
|
|
|
|
|
|
}
|
|
|
|
|
|
fileObj[file.name] = file
|
|
|
|
|
|
uni.setStorageSync('localFile', fileObj)
|
|
|
|
|
|
// #endif
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//记录下本地文件,方便打开的时候直接取本地
|
|
|
|
|
|
export function removeFileTemp(name) {
|
|
|
|
|
|
// #ifndef H5
|
|
|
|
|
|
let fileObj = uni.getStorageSync('localFile')
|
|
|
|
|
|
delete fileObj[name]
|
|
|
|
|
|
uni.setStorageSync('localFile', fileObj)
|
|
|
|
|
|
// #endif
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//下载并打开文件
|
|
|
|
|
|
export function openLocalFile(name, path) {
|
|
|
|
|
|
//除h5外其他端先看本地有没有,没有就下载到本地再打开,有就直接打开
|
|
|
|
|
|
// #ifdef H5
|
|
|
|
|
|
window.open(path)
|
|
|
|
|
|
// #endif
|
|
|
|
|
|
|
|
|
|
|
|
// #ifndef H5
|
|
|
|
|
|
let fileObj = uni.getStorageSync('localNetWorkFile')
|
|
|
|
|
|
if (fileObj && fileObj[name]) {
|
|
|
|
|
|
uni.openDocument({
|
|
|
|
|
|
filePath: fileObj[name],
|
|
|
|
|
|
showMenu: true,
|
|
|
|
|
|
fileType: getFileImgByType(name),
|
|
|
|
|
|
success: function(res) {
|
|
|
|
|
|
console.log('打开文档成功');
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
uni.downloadFile({
|
|
|
|
|
|
url: path,
|
|
|
|
|
|
success: function(res) {
|
|
|
|
|
|
uni.showToast({
|
|
|
|
|
|
icon: 'none',
|
|
|
|
|
|
title: '文件下载成功'
|
|
|
|
|
|
});
|
|
|
|
|
|
//ios中文文件名会报错,需要编码下
|
|
|
|
|
|
let filePath = uni.getSystemInfoSync().platform === 'ios' ? res.tempFilePath : escape(res
|
|
|
|
|
|
.tempFilePath);
|
|
|
|
|
|
uni.saveFile({
|
|
|
|
|
|
tempFilePath: filePath, //临时路径
|
|
|
|
|
|
success: function(res) {
|
|
|
|
|
|
// uni.showToast({
|
|
|
|
|
|
// icon: 'none',
|
|
|
|
|
|
// mask: true,
|
|
|
|
|
|
// title: '保存在:' + res.savedFilePath, //保存路径
|
|
|
|
|
|
// duration: 2000,
|
|
|
|
|
|
// });
|
|
|
|
|
|
//保存好再打开文件
|
|
|
|
|
|
saveNetWorkFileTemp({
|
|
|
|
|
|
name: name,
|
|
|
|
|
|
path: res.savedFilePath
|
|
|
|
|
|
})
|
|
|
|
|
|
// setTimeout(() => {
|
|
|
|
|
|
// uni.openDocument({
|
|
|
|
|
|
// filePath: res.savedFilePath,
|
|
|
|
|
|
// showMenu: true,
|
|
|
|
|
|
// fileType: getFileImgByType(name),
|
|
|
|
|
|
// success: function(res) {
|
|
|
|
|
|
// console.log('打开文档成功');
|
|
|
|
|
|
// }
|
|
|
|
|
|
// });
|
|
|
|
|
|
// }, 1000)
|
|
|
|
|
|
}
|
|
|
|
|
|
})
|
|
|
|
|
|
uni.openDocument({
|
|
|
|
|
|
filePath: filePath,
|
|
|
|
|
|
showMenu: true,
|
|
|
|
|
|
fileType: getFileImgByType(name),
|
|
|
|
|
|
success: function(res) {
|
|
|
|
|
|
console.log('打开文档成功');
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
// #endif
|
|
|
|
|
|
}
|
|
|
|
|
|
// 打开外部链接
|
|
|
|
|
|
export function openOutsideFile(path) {
|
|
|
|
|
|
console.log(path)
|
|
|
|
|
|
// #ifdef H5
|
|
|
|
|
|
window.open(path)
|
|
|
|
|
|
// #endif
|
|
|
|
|
|
|
|
|
|
|
|
// #ifndef H5
|
|
|
|
|
|
plus.runtime.openWeb(path)
|
|
|
|
|
|
// #endif
|
|
|
|
|
|
}
|
|
|
|
|
|
//获取表单组件文本值
|
|
|
|
|
|
export function getFormValText(obj) {
|
|
|
|
|
|
switch (obj.type) {
|
|
|
|
|
|
case 'DeptPicker':
|
|
|
|
|
|
case 'UserPicker':
|
|
|
|
|
|
case 'FileUpload':
|
|
|
|
|
|
case 'ImageUpload':
|
|
|
|
|
|
return (obj.value || []).map(v => v.name).join('、');
|
|
|
|
|
|
case 'TimeRangePicker':
|
|
|
|
|
|
case 'DateTimeRange':
|
|
|
|
|
|
case 'SelectPlus':
|
|
|
|
|
|
case 'MultipleSelect':
|
|
|
|
|
|
return (obj.value || []).join('、');
|
|
|
|
|
|
case 'ProcessIndex':
|
|
|
|
|
|
return (obj.value || []).map(v => v.startUser.name + '-' + v.name).join('、');
|
|
|
|
|
|
default:
|
|
|
|
|
|
return obj.value;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
export function showItem(item, val) {
|
2025-03-14 14:38:24 +08:00
|
|
|
|
// console.log("我是", item.perm, val, !(item.perm === 'R' && isEm(val)) && item.perm != 'H')
|
|
|
|
|
|
return !(item.perm === 'R' && isEm(val)) && item.perm != 'H'
|
2025-01-21 18:08:48 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function isEm(val) {
|
|
|
|
|
|
return !$nEmpty(val) ||
|
|
|
|
|
|
((val instanceof String) && val.trim() === '') ||
|
|
|
|
|
|
(Array.isArray(val) && val.length === 0)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
export function getBottomLevelData(arr) {
|
|
|
|
|
|
let leafData = [];
|
|
|
|
|
|
|
|
|
|
|
|
function getLeafDataHelper(subArr) {
|
|
|
|
|
|
subArr.forEach(item => {
|
|
|
|
|
|
if (item.list) {
|
|
|
|
|
|
// 如果存在list属性,则递归调用
|
|
|
|
|
|
getLeafDataHelper(item.list);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
// 如果是最底层数据,将其添加到结果数组中
|
|
|
|
|
|
leafData.push(item);
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
getLeafDataHelper(arr);
|
|
|
|
|
|
return leafData;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
export function exitApp() {
|
|
|
|
|
|
uni.removeStorageSync('userInfo');
|
|
|
|
|
|
uni.removeStorageSync('userInfoObj');
|
|
|
|
|
|
uni.removeStorageSync('projectDetail');
|
|
|
|
|
|
uni.removeStorageSync('projectDetailObj');
|
|
|
|
|
|
uni.removeStorageSync('company');
|
|
|
|
|
|
uni.removeStorageSync('dept');
|
|
|
|
|
|
uni.removeStorageSync('moduleInfo');
|
|
|
|
|
|
|
|
|
|
|
|
// uni.redirectTo({
|
|
|
|
|
|
// url: '/pages/login/login'
|
|
|
|
|
|
// })
|
|
|
|
|
|
uni.redirectTo({
|
|
|
|
|
|
url: '/pages/projectEnd/projectIndex/projectIndex'
|
|
|
|
|
|
})
|
|
|
|
|
|
}
|
|
|
|
|
|
export function isVideoLink(url) {
|
|
|
|
|
|
const videoExtensions = ['mp4', 'webm', 'ogg', 'mov', 'avi', 'flv', 'wmv'];
|
|
|
|
|
|
const extension = url.split('.').pop().toLowerCase();
|
|
|
|
|
|
return videoExtensions.includes(extension);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
export function isImageLink(url) {
|
|
|
|
|
|
// 正则表达式匹配常见的图片文件扩展名
|
|
|
|
|
|
const imageExtensionsRegex = /\.(jpg|jpeg|png|gif|webp)$/i;
|
|
|
|
|
|
return imageExtensionsRegex.test(url);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
export function isJSON(str) {
|
|
|
|
|
|
try {
|
|
|
|
|
|
JSON.parse(str);
|
|
|
|
|
|
} catch (e) {
|
|
|
|
|
|
// 转换出错,抛出异常
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
return true;
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
export function isHttpImage(url, httpName, url_config) {
|
|
|
|
|
|
const flag = url.includes(httpName);
|
|
|
|
|
|
console.log(url, httpName);
|
|
|
|
|
|
return flag ? url : url_config + 'image/' + url;
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// px转rpx
|
|
|
|
|
|
export function pxToRpx(px) {
|
|
|
|
|
|
const screenWidth = uni.getSystemInfoSync().screenWidth
|
|
|
|
|
|
return (750 * Number.parseInt(px)) / screenWidth
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// rpx转px
|
|
|
|
|
|
export function rpxToPx(rpx) {
|
|
|
|
|
|
const screenWidth = uni.getSystemInfoSync().screenWidth
|
|
|
|
|
|
return (screenWidth * Number.parseInt(rpx)) / 750
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 解码,输出:中文
|
|
|
|
|
|
export function decodeStr(str) {
|
|
|
|
|
|
var out, i, len, c;
|
|
|
|
|
|
var char2, char3;
|
|
|
|
|
|
out = "";
|
|
|
|
|
|
len = str.length;
|
|
|
|
|
|
i = 0;
|
|
|
|
|
|
while (i < len) {
|
|
|
|
|
|
c = str.charCodeAt(i++);
|
|
|
|
|
|
switch (c >> 4) {
|
|
|
|
|
|
case 0:
|
|
|
|
|
|
case 1:
|
|
|
|
|
|
case 2:
|
|
|
|
|
|
case 3:
|
|
|
|
|
|
case 4:
|
|
|
|
|
|
case 5:
|
|
|
|
|
|
case 6:
|
|
|
|
|
|
case 7:
|
|
|
|
|
|
// 0xxxxxxx
|
|
|
|
|
|
out += str.charAt(i - 1);
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 12:
|
|
|
|
|
|
case 13:
|
|
|
|
|
|
// 110x xxxx 10xx xxxx
|
|
|
|
|
|
char2 = str.charCodeAt(i++);
|
|
|
|
|
|
out += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F));
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 14:
|
|
|
|
|
|
// 1110 xxxx 10xx xxxx 10xx xxxx
|
|
|
|
|
|
char2 = str.charCodeAt(i++);
|
|
|
|
|
|
char3 = str.charCodeAt(i++);
|
|
|
|
|
|
out += String.fromCharCode(((c & 0x0F) << 12) |
|
|
|
|
|
|
((char2 & 0x3F) << 6) |
|
|
|
|
|
|
((char3 & 0x3F) << 0));
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return out;
|
|
|
|
|
|
}
|