| | |
| | | import { useOptionItemsStore } from '@/stores/optionItems.js'; |
| | | import $qxueyou from '@/config/qxueyou.js' |
| | | /** |
| | | * 获取 assets/images 目录下的图片URL |
| | | * @param {string} imageName - 图片文件名(包含扩展名) |
| | | * @returns {string} 图片的完整URL |
| | | */ |
| | | export const getImageUrl = (imageName) => { |
| | | try { |
| | | return new URL('../assets/images/' + imageName, import.meta.url).href; |
| | | } catch (error) { |
| | | console.warn(`Failed to load image: ${imageName}`, error); |
| | | return ""; |
| | | } |
| | | // 使用 Vite 的 glob 功能动态导入图片资源 |
| | | const modules = import.meta.glob('../assets/images/**/*.{png,jpg,jpeg,gif,svg,webp}', { eager: true }); |
| | | // 移除开头的斜杠 |
| | | const cleanName = imageName.startsWith('/') ? imageName.slice(1) : imageName; |
| | | const path = `../assets/images/${cleanName}`; |
| | | return modules[path]?.default || ''; |
| | | }; |
| | | export const getUUID = () => { |
| | | let s = [] |
| | |
| | | } |
| | | } |
| | | |
| | | export const getOccupationName = (code) => { |
| | | export const getOccupationName = (id) => { |
| | | const { occupationItems } = useOptionItemsStore() |
| | | const obj = occupationItems.find(ele => ele.code == code) |
| | | const obj = occupationItems.find(ele => ele.id == id) |
| | | |
| | | return obj?.name || '' |
| | | return obj?.occupationJob || '' |
| | | } |
| | | |
| | | const levelKey = { |
| | | '5': '五级', |
| | | '4': '四级', |
| | | '3': '三级', |
| | | '2': '二级', |
| | | '1': '一级' |
| | | } |
| | | |
| | | export const getLevelItems = (occupationId) => { |
| | | const { occupationItems } = useOptionItemsStore() |
| | | const obj = occupationItems.find(ele => ele.id == occupationId) |
| | | if (!obj) return [] |
| | | let levelItems = [] |
| | | obj.levelStr.split(',').forEach(ele => { |
| | | levelItems.push({ name: levelKey[ele], value: ele },) |
| | | }) |
| | | return levelItems || [] |
| | | } |
| | | |
| | | export const getLevelName = (levelStr) => { |
| | | let levelList = levelStr?.split(',') || [] |
| | | let tempList = [] |
| | | levelList.forEach(ele => { |
| | | tempList.push(levelKey[ele]) |
| | | }) |
| | | return tempList.join(',') |
| | | } |
| | | |
| | | export const getJobName = (occupationCode, jobCode) => { |
| | |
| | | if (!job) return '' |
| | | |
| | | return job.jobName || '' |
| | | } |
| | | } |
| | | |
| | | export const getFileUrlName = (url = '') => { |
| | | const fullFilename = url?.substring(url.lastIndexOf('/') + 1); |
| | | return fullFilename || '' |
| | | } |
| | | |
| | | /** |
| | | * 通过URL下载文件(简单方法) |
| | | * @param {string} url - 文件URL |
| | | * @param {string} [filename] - 自定义文件名 |
| | | */ |
| | | export const downloadFileByUrl = function(url, filename) { |
| | | // 创建a标签 |
| | | const link = document.createElement('a'); |
| | | link.href = url.includes('http') ? url : $qxueyou.qxyRes + url ; |
| | | link.download = filename || '文件'; |
| | | link.style.display = 'none'; |
| | | |
| | | // 添加到文档并触发点击 |
| | | document.body.appendChild(link); |
| | | link.click(); |
| | | document.body.removeChild(link); |
| | | } |
| | | |
| | | export const uploadByBase64 = async function(base64, fileName, fileType = 'png') { |
| | | if (!base64) return null |
| | | |
| | | let blob = getBlobByBase64(base64, fileType) |
| | | if (!blob) return null |
| | | |
| | | return await uploadRequest(blob, fileName, fileType) |
| | | } |
| | | |
| | | let getBlobByBase64 = function(base64, fileType){ |
| | | if (!base64) return null |
| | | |
| | | let bstr = window.atob(base64.split(',')[1]) |
| | | let bstrLen = bstr.length |
| | | let u8arr = new Uint8Array(bstrLen); |
| | | while (bstrLen--) { |
| | | u8arr[bstrLen] = bstr.charCodeAt(bstrLen); |
| | | } |
| | | return new Blob([u8arr], {type: fileType}) |
| | | } |
| | | |
| | | let uploadRequest = function(blob, fileName, fileType){ |
| | | return new Promise((resolve) => { |
| | | let fd = new FormData() |
| | | let xhr = new XMLHttpRequest() |
| | | fd.append('image', blob, `${fileName}.${fileType}`) |
| | | xhr.open('POST', $qxueyou.upload, true) |
| | | xhr.onreadystatechange = () => { |
| | | if (xhr.readyState === 4 && xhr.status === 200 && xhr.responseText) { |
| | | let file = JSON.parse(xhr.responseText)[0] // 返回结果 |
| | | resolve(file.path) |
| | | } |
| | | } |
| | | xhr.onerror = (evt) => { // 上传失败回调 |
| | | store.commit("snack/error", "上传失败!") |
| | | console.log(JSON.stringify(evt.target)) |
| | | resolve() |
| | | } |
| | | xhr.send(fd); |
| | | }) |
| | | } |
| | | |
| | | export const getCurrentPosition = (options = {}) => { |
| | | return new Promise((resolve, reject) => { |
| | | if (!("geolocation" in navigator)) { |
| | | reject(new Error("浏览器不支持地理位置定位")); |
| | | } else { |
| | | navigator.geolocation.getCurrentPosition( |
| | | (position) => resolve(position), |
| | | (error) => { |
| | | console.log(error.code) |
| | | console.log(error.message) |
| | | reject(error) |
| | | }, |
| | | { |
| | | enableHighAccuracy: options.enableHighAccuracy || false, |
| | | timeout: options.timeout || 10000, |
| | | maximumAge: options.maximumAge || 0 |
| | | } |
| | | ); |
| | | } |
| | | }); |
| | | } |
| | | |