import { createApp, h, render } from "vue"; import App from "./App.vue"; import { createRouter, createWebHashHistory } from "vue-router"; import { routes } from "./router"; import less from "less"; import "./styles/ch.less"; import VueQr from "vue-qr"; import { showToast, showLoadingToast, showSuccessToast, showFailToast, showNotify, showDialog, showConfirmDialog, showImagePreview, closeToast } from "vant"; import "vant/es/notify/style"; import "vant/es/dialog/style"; import "vant/es/toast/style"; import "vant/es/image-preview/style"; const app = createApp(App); // app.component("BasePage", BasePage) // .component("VueQr", VueQr) // .component("BaseList", BaseList) // .component("AddressSelector", AddressSelector) // .component("BaseSkeleton", BaseSkeleton) // .component("CountDown", CountDown) // .component("BindPhone", BindPhone) const router = createRouter({ history: createWebHashHistory(), routes, scrollBehavior(to, from, savedPosition) { if (to.meta.cache && savedPosition) return new Promise((resolve, reject) => { resolve(savedPosition); }); else return { top: 0 }; } }); app.use(router); import pinia from './stores'; app.use(pinia); app.config.globalProperties.$showDialog = showDialog; app.config.globalProperties.$showConfirmDialog = showConfirmDialog; app.config.globalProperties.$showNotify = showNotify; app.config.globalProperties.$showToast = showToast; app.config.globalProperties.$showLoadingToast = showLoadingToast; app.config.globalProperties.$showSuccessToast = showSuccessToast; app.config.globalProperties.$showFailToast = showFailToast; app.config.globalProperties.$closeToast = closeToast; app.config.globalProperties.$showImagePreview = showImagePreview; app.config.globalProperties.$toMoney = (e, label, length = 2) => { const num = parseFloat(e).toFixed(length); const [a, b] = num.split('.'); return `${a}.<${label}>${b}`; }; app.config.globalProperties.$autoToast = (val, msg, type = 'Fail', isThrow = true) => { if (val) { app.config.globalProperties[`$show${type}Toast`](msg); if (isThrow) throw msg; } }; let skeleton; app.config.globalProperties.$showSkeleton = () => { if (!skeleton) skeleton = h(BaseSkeleton); render(skeleton, document.body); document.body.appendChild(skeleton.el); }; app.config.globalProperties.$closeSkeleton = () => { if (skeleton && document.body.contains(skeleton.el)) document.body.removeChild(skeleton.el); }; app.config.globalProperties.$navigate = (e) => { if (window.__wxjs_environment === 'miniprogram') { const index = e.indexOf('?'); let query = ''; if (index > -1) query = e.slice(index); const data = router.resolve({ path: e }); wx.miniProgram.navigateTo({ url: `/pages/webview/webview?url=${encodeURIComponent(`${location.origin}/${data.href}${query}`)}`, }); } else { router.push(e); } }; app.config.globalProperties.$ls = { set: (e, obj) => { localStorage.setItem(e, obj); }, get: (e) => { return localStorage.getItem(e); }, remove: (e) => { localStorage.removeItem(e); } }; app.config.globalProperties.$ss = { set: (e, obj) => { sessionStorage.setItem(e, obj); }, get: (e) => { return sessionStorage.getItem(e); }, remove: (e) => { sessionStorage.removeItem(e); } }; import ObjectHelper from './utils/ObjectHelper'; import date from './utils/date'; app.config.globalProperties.$conf = { apiUrl: import.meta.env.VITE_API_URL, ossUrl: import.meta.env.VITE_OSS_URL, }; app.config.globalProperties.$date = date; app.config.globalProperties.$copyText = (e) => { return ObjectHelper.Copy(e) }; app.config.globalProperties.$getRule = (e) => { return ObjectHelper.getRule(e) }; app.config.globalProperties.$groupBy = (e, key) => { return ObjectHelper.groupBy(e, key) }; app.config.globalProperties.$unsigned = (e) => { return e > 0 ? e : 0 }; app.config.globalProperties.$truncate = (e, p, a) => { return `${e.substring(0, p)}...${e.substring(e.length - a)}`; }; app.config.globalProperties.$trunc = (e, p) => { const tp = Math.pow(10, p); return Math.trunc(e * tp) / tp; }; app.config.globalProperties.$valid = (field, msg) => { if (!field) { app.config.globalProperties.$showFailToast(msg); return false; } return true; }; app.config.globalProperties.$token = (e) => { const token = localStorage.getItem(e).split('.'); return { header: JSON.parse(atob(token[0])), payload: JSON.parse(atob(token[1])), } }; app.config.globalProperties.$file = (e) => { e = e || 'base/avatar.png'; if (e.startsWith('http://') || e.startsWith('https://')) return e; else return import.meta.env.VITE_OSS_URL + e; }; app.config.globalProperties.$openUrl = (e) => { window.open(e); }; app.config.globalProperties.$refresh = () => { window.location.replace('#/refresh?key=' + app.config.globalProperties.$route.name) }; app.config.globalProperties.$verify = (permissions, module, type) => { return permissions.indexOf(`${module}:${type}`) > -1; }; app.config.globalProperties.$substring = (e, begin, end) => { if (typeof e !== 'string') { return ''; } return e.length > end ? e.substring(begin, end) + "..." : e; } app.config.globalProperties.$fileSize = (e) => { let level = 0; while (e >= 1024 && level < 4) { e /= 1024; level++; } return `${e.toFixed(2)}${['B', 'KB', 'MB', 'GB'][level]}`; }; app.config.globalProperties.$compressFiles = (files) => { const fileArray = Array.isArray(files) ? files : [files]; const promises = fileArray.map(file => { return new Promise((resolve, reject) => { if (!(file instanceof File)) { return reject(new Error('Invalid file type')); } imageConversion.compressAccurately(file, 400) .then(res => { res = new File([res], file.name, { type: res.type, lastModified: Date.now() }); resolve(res); }) .catch(err => { console.error('压缩失败', err); reject(err); }); }); }); return Promise.all(promises); }; app.config.globalProperties.$uploadFiles = (files) => { let fd = new FormData(); files.forEach(x => { fd.append('file', x.file, x.file.name); }); return new Promise((resolve, reject) => { fetch(`${import.meta.env.VITE_API_URL}File/MemberUpload`, { method: 'POST', headers: { 'token': localStorage.getItem('token'), }, body: fd, }).then(rep => { rep.json().then(data => { if (data.errcode) { reject(data); } else { //上传成功 resolve(data); } }).catch(err => { reject({ errmsg: '上传失败' }); }); }).catch(err => { reject(err); }); }); } // enum import enums from './utils/enums'; Object.getOwnPropertyNames(enums).forEach(x => { app.config.globalProperties[`${x}`] = enums[x]; }); import geo from './utils/geo'; app.config.globalProperties.$geo = geo; app.config.globalProperties.$distance = (e) => { if (e < 1) return `${e * 1000}m`; return `${e}km`; }; app.config.globalProperties.$goIndex = () => { if (window.__wxjs_environment == 'miniprogram') { wx.miniProgram.reLaunch({ url: `/pages/index/index`, }); } else { location.replace('#/'); setTimeout(() => { location.reload(); }, 100); } } app.config.globalProperties.$CheckStates = [{ label: '待审核', color: 'primary' }, { label: '已通过', color: 'success' }, { label: '已拒绝', color: 'danger' }]; app.config.globalProperties.$goService = () => { if (app.config.globalProperties.$isWechatMini()) { wx.miniProgram.navigateTo({ url: `/pages/service/service`, }); } else { app.config.globalProperties.$navigate('/Service'); } }; app.config.globalProperties.$isWechat = () => { return navigator.userAgent.toLowerCase().match(/MicroMessenger/i) == 'micromessenger' }; app.config.globalProperties.$isWechatMini = () => { return window.__wxjs_environment == 'miniprogram' }; app.config.globalProperties.$openLocation = (lon, lat, name = '', address = '') => { if (wx && app.config.globalProperties.$isWechat()) wx.openLocation({ longitude: lon, latitude: lat, name: name, address: address, scale: 18, }); else window.open(`http://api.map.baidu.com/marker?location=${lat},${lon}&coord_type=gcj02&title=${name}&content=${address}&output=html`); }; // app.config.globalProperties.$isLogin = () => { // if (!localStorage.getItem('token')) // return false; // const token = app.config.globalProperties.$token('token'); // return token.header.exp > Date.now() && (window.__wxjs_environment != 'miniprogram' || localStorage.getItem('miniopenid')); // } app.config.globalProperties.$validPhone = (e) => { return /^1(3|4|5|6|7|8|9)\d{9}$/.test(e); } app.config.globalProperties.$validIdCard = (idCard) => { const reg18 = /^[1-9]\d{5}(19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/; return reg18.test(idCard); } app.config.globalProperties.$getShareLink = () => { const query = app.config.globalProperties.$route.query; const recommend = localStorage.getItem('member_username'); let link = Object.keys(query).filter(x => x != 'RecommendCode').map(x => { return `${x}=${query[x]}`; }).join('&'); link += `&RecommendCode=${recommend}`; return `${location.href.split('?')[0]}?${link}`; } // CH import { post, get, put, del, request } from './api/http'; import { isLogin, formatGMT } from './api/user'; app.config.globalProperties.$post = post; app.config.globalProperties.$get = get; app.config.globalProperties.$put = put; app.config.globalProperties.$del = del; app.config.globalProperties.$request = request; app.config.globalProperties.$isLogin = isLogin; app.config.globalProperties.$formatGMT = formatGMT; app.mount("#app");