work-order/work-order-uniapp/utils/index.js

214 lines
5.4 KiB
JavaScript
Raw Permalink Normal View History

2025-07-27 20:34:15 +08:00
import { baseUrl } from "@/config";
import { isExternal } from "@/utils/validate";
/**
* 判断是否空字符串
*/
export function isBlank(str) {
return str == null || str === '';
}
/**
* 字符串转换为数组
*/
export function strToList(str, split = ',') {
if (isBlank(str)) {
return [];
}
if (str instanceof Array) {
return str;
}
return str.split(split);
}
export function getRealUrl(url) {
return url.substring(0, url.lastIndexOf('?'))
}
export function isEmpty(obj) {
return obj == null || obj.length === 0;
}
/**
* 转换本地URL若是本地URL则加前缀否则直接返回
* @param url
*/
export function parseLocalUrl(url) {
if (isEmpty(url) || isExternal(url)) {
return url;
}
return baseUrl + url;
}
// 日期格式化
export function parseTime(time, pattern) {
if (arguments.length === 0 || !time) {
return null
}
const format = pattern || '{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)
} else if (typeof time === 'string') {
time = time.replace(new RegExp(/-/gm), '/').replace('T', ' ').replace(new RegExp(/\.[\d]{3}/gm), '');
}
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]
// Note: getDay() returns 0 on Sunday
if (key === 'a') { return ['日', '一', '二', '三', '四', '五', '六'][value] }
if (result.length > 0 && value < 10) {
value = '0' + value
}
return value || 0
})
return time_str
}
/**
* 解析地址信息
* @param {Object} res - 地址信息对象
* @returns {Object} 解析后的地址对象
*/
export function parseLocation(res) {
if (!res || !res.address) {
return {
province: null,
country: null,
city: null,
address: null
};
}
const addressBean = {
province: null,
country: null,
city: null,
address: null
};
// 直辖市和特别行政区匹配
const directCityRegex = /^(北京市|天津市|重庆市|上海市|香港特别行政区|澳门特别行政区)/;
const directCityMatch = directCityRegex.exec(res.address);
if (directCityMatch) {
addressBean.province = directCityMatch[1];
regexAddressBean(res, addressBean);
} else {
// 普通省份匹配
const provinceRegex = /^(.*?(省|自治区))(.*?)$/;
const provinceMatch = provinceRegex.exec(res.address);
if (provinceMatch) {
addressBean.province = provinceMatch[1];
regexAddressBean(res, addressBean);
} else {
// 无法匹配省份的情况
regexAddressBean(res, addressBean);
}
}
return addressBean;
}
/**
* 正则解析地址信息
* @param {Object} res - 地址信息对象
* @param {Object} addressBean - 地址对象
*/
function regexAddressBean(res, addressBean) {
if (!res || !res.address) return;
// 移除省份信息后的地址
const addressWithoutProvince = res.address.replace(addressBean.province, '');
const regex = /^(.*?[市]|.*?地区|.*?特别行政区)(.*?[市区县])(.*?)$/g;
const match = regex.exec(addressWithoutProvince);
if (match && match.length >= 4) {
addressBean.city = match[1];
addressBean.country = match[2];
addressBean.address = match[3] + (res.name ? `(${res.name})` : '');
} else {
// 如果正则匹配失败,将整个地址作为详细地址
addressBean.address = res.address + (res.name ? `(${res.name})` : '');
}
}
// 文件类型
export const FileType = {
// 图片
IMAGE: ['png', 'jpg', 'jpeg', 'gif', 'bmp', 'webp', 'ico'],
// 办公
OFFICE: ['doc', 'docx', 'xls', 'xlsx', 'pdf', 'ppt', 'pptx'],
// 音频
AUDIO: ['mp3', 'wav', 'm4a', 'ogg', 'flac', 'aac'],
// 视频
VIDEO: ['mp4', 'avi', 'mov', 'wmv', 'flv', 'mpeg', 'mpg', 'm4v', 'webm', 'mkv'],
// 压缩文件
ZIP: ['zip', 'rar', '7z'],
// 其他
OTHER: ['exe'],
// 全部
all() {
return [...this.IMAGE, ...this.OFFICE, ...this.AUDIO, ...this.VIDEO, ...this.OTHER, ...this.ZIP];
}
}
/**
* 获取文件扩展名支持文件名或url
* @param {string} fileNameOrUrl 文件名或url
* @returns {string} 扩展名小写无扩展名返回空字符串
*/
export function getExt(fileNameOrUrl) {
if (!fileNameOrUrl) return '';
// 去除url参数
let cleanName = fileNameOrUrl.split('?')[0].split('#')[0];
// 只取最后的文件名部分
cleanName = cleanName.substring(cleanName.lastIndexOf('/') + 1);
const lastDot = cleanName.lastIndexOf('.');
if (lastDot > -1 && lastDot < cleanName.length - 1) {
return cleanName.slice(lastDot + 1).toLowerCase();
}
return '';
}
// 是否为办公文件
export function isOfficeFile(url) {
const ext = getExt(url);
return FileType.OFFICE.includes(ext);
}
// 是否为音频文件
export function isAudioFile(url) {
const ext = getExt(url);
return FileType.AUDIO.includes(ext);
}
// 是否为图片
export function isImage(url) {
const ext = getExt(url);
return FileType.IMAGE.includes(ext);
}
// 是否为视频
export function isVideo(url) {
const ext = getExt(url);
return FileType.VIDEO.includes(ext);
}