work-order/work-order-uniapp/utils/index.js
2025-07-27 20:34:15 +08:00

214 lines
5.4 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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);
}