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