// 获取路径参数 import Vue from "vue"; // 格式化富文本 Vue.prototype.formateRichText = str => { if (!str) return ""; var reg = new RegExp("') reg = new RegExp("section", "g"); str = str.replace(reg, 'div'); reg = new RegExp("↵", "g"); str = str.replace(reg, '
'); return str; } // 获取路径参数 Vue.prototype.getUrlPara = url => { let arrUrl = url.split("?"); let para = arrUrl[1]; return para ? para.split('&') : false; } // 中文姓名规则 Vue.prototype.idChinaName = (val) => { var pattern = /^[\u4E00-\u9FA5]{2,4}$/ return pattern.test(val); } // 身份证验证规则 Vue.prototype.idCardNumber = (val) => { var pattern = /^\d{17}(\d{1}|[X|x])$/ return pattern.test(val); } // 护照验证正则 Vue.prototype.passportValid = (val) => { return /^([a-zA-z]|[0-9]){5,17}$/.test(val); } // 台胞证正则 Vue.prototype.taiwanValid = (val) => { return /^\d{8}|^[a-zA-Z0-9]{10}|^\d{18}$/.test(val); } // 港澳通行证正则 Vue.prototype.gangaoValid = (val) => { return /^([A-Z]\d{6,10}(\(\w{1}\))?)$/.test(val); } // 外国人永久居留证正则 Vue.prototype.foreignerValid = (val) => { return /(^[A-Za-z]{3})([0-9]{12}$)/.test(val); } // 军官证正则 Vue.prototype.officerValid = (val) => { return /^[\u4E00-\u9FA5](字第)([0-9a-zA-Z]{4,8})(号?)$/.test(val); } // 邮箱验证正则 Vue.prototype.emailValid = (val) => { return /^[A-Za-z0-9\u4e00-\u9fa5]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/.test(val) } //判断电话号码格式 Vue.prototype.IsTel = tel => { var pattern = /^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$/; return pattern.test(tel); } //判断澳门电话号码格式 Vue.prototype.IsTelMacau = tel => { var pattern = /^\d{8}$/; return pattern.test(tel); } //验证码格式 Vue.prototype.IsCode = code => { var pattern = /^\d{6}$/; return pattern.test(code); } // 图片显示判断 Vue.prototype.showImg = img => { if (!img) return; if (img.indexOf('https://') != -1 || img.indexOf('http://') != -1) { return img; } else { return Vue.prototype.NEWAPIURLIMG + img ; } } // 获取经纬度 Vue.prototype.getLocation = function(callback) { return // 检查权限状态 uni.getSetting({ success: (res) => { if (res.authSetting['scope.userLocation'] === false) { // 已拒绝权限,引导用户去设置 uni.showModal({ title: '权限申请', content: '需要位置权限才能获取当前城市', confirmText: '去设置', success: (res) => { if (res.confirm) { uni.openSetting(); } else { callback && callback(null, { errMsg: '用户拒绝授权' }); } } }); } else { // 未授权或已授权,请求位置 this._requestLocation(callback); } }, fail: (err) => { console.error('获取权限状态失败:', err); callback && callback(null, err); } }); }; // 私有方法:请求位置 Vue.prototype._requestLocation = function(callback) { // 直接获取位置(微信小程序不需要先调用startLocationUpdate) uni.getLocation({ type: 'wgs84', // 坐标系类型 success: (res) => { console.log('获取位置成功:', res); const location = { lat: res.latitude, lon: res.longitude }; uni.setStorageSync('location', location); callback && callback(location); }, fail: (err) => { console.error('获取位置失败:', err); if (err.errMsg.includes('auth deny')) { // 权限被拒绝,引导用户去设置 uni.showModal({ title: '权限申请', content: '需要位置权限才能获取当前城市', confirmText: '去设置', success: (res) => { if (res.confirm) { uni.openSetting(); } } }); } callback && callback(null, err); } }); }; // 路由页面跳转 Vue.prototype.gotoPath = path => { console.log(path,'pathpath'); // 参数验证 if (!path || typeof path !== 'string') { console.error('gotoPath: 路径参数无效', path); return; } // 清理路径,移除多余的空格和特殊字符 path = path.trim(); // 检查是否为有效路径格式 if (!path.startsWith('/')) { console.error('gotoPath: 路径必须以/开头', path); return; } // 获取当前页面栈 const pages = getCurrentPages(); const currentPage = pages[pages.length - 1]; const currentPath = currentPage ? currentPage.route : ''; // 避免重复跳转到同一页面 if (currentPath && ('/' + currentPath) === path) { console.warn('gotoPath: 避免重复跳转到当前页面', path); return; } // 检查页面栈深度,避免栈溢出 if (pages.length >= 10) { console.warn('gotoPath: 页面栈过深,使用redirectTo替代', path); uni.redirectTo({ url: path, fail: (err) => { console.error('redirectTo失败:', err, 'path:', path); // 最后尝试reLaunch uni.reLaunch({ url: path, fail: (err2) => { console.error('reLaunch也失败:', err2, 'path:', path); } }); } }); return; } // 防抖处理,避免快速重复点击 if (Vue.prototype._lastNavigateTime && Date.now() - Vue.prototype._lastNavigateTime < 500) { console.warn('gotoPath: 防抖拦截,请勿频繁点击'); return; } Vue.prototype._lastNavigateTime = Date.now(); // 尝试正常跳转 uni.navigateTo({ url: path, success: (res) => { console.log('跳转成功:', path); }, fail: (err) => { console.error('navigateTo失败:', err, 'path:', path); // 如果是tabBar页面,使用switchTab if (err.errMsg && err.errMsg.includes('tabbar')) { console.log('检测到tabBar页面,使用switchTab'); uni.switchTab({ url: path, fail: (err2) => { console.error('switchTab也失败:', err2, 'path:', path); } }); } else if (err.errMsg && err.errMsg.includes('limit exceed')) { // 页面栈超限,使用redirectTo console.log('页面栈超限,使用redirectTo'); uni.redirectTo({ url: path, fail: (err3) => { console.error('redirectTo也失败:', err3, 'path:', path); } }); } else { // 其他错误,尝试延迟重试 console.log('延迟重试跳转'); setTimeout(() => { uni.navigateTo({ url: path, fail: (err4) => { console.error('延迟重试也失败:', err4, 'path:', path); } }); }, 300); } } }); } // 返回上一页 Vue.prototype.goBack = () => { getCurrentPages().length > 1 ? uni.navigateBack({}) : uni.switchTab({ url: '/pages/index/index' }) } // 打开地图 Vue.prototype.openLocation = (lat, lon) => { uni.openLocation({ latitude: Number(lat), longitude: Number(lon), success: function() { console.log('success'); } }); } // 拨打电话 Vue.prototype.clickPhone = (phone) => { uni.makePhoneCall({ phoneNumber: phone }) } //周几 Vue.prototype.ShowDateDay = day => { let stateTxt = ""; switch (day) { case 0: stateTxt = '周日' break; case 1: stateTxt = '周一' break; case 2: stateTxt = '周二' break; case 3: stateTxt = '周三' break; case 4: stateTxt = '周四' break; case 5: stateTxt = '周五' break; case 6: stateTxt = '周六' break; } return stateTxt } Date.prototype.Format = function(fmt) { //author: meizz var o = { "Y+": this.getFullYear(), //月份 "M+": this.getMonth() + 1, //月份 "d+": this.getDate(), //日 "h+": this.getHours(), //小时 "m+": this.getMinutes(), //分 "s+": this.getSeconds(), //秒 "q+": Math.floor((this.getMonth() + 3) / 3), //季度 "S": this.getMilliseconds() //毫秒 }; if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length)); for (var k in o) if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]) .length))); return fmt; } // 是否接收订阅消息 Vue.prototype.getSubscribeMessage = () => { const templateIds = [ // 退款成功通知 'hRZoiEES2BWtKb6Xgsnn8khLQH9un5j_11qu0bwlhfE', // 订单核销通知 // '7D-JP7o0nQ_NiQk2w8mBs8jdT1_7ofvyBN-G9NLY2Zk', // 订单支付成功通知 // '6cHez9KDlCDp1_nWUlUSV7qEaahIQWmYVlOCE-J6ODQ', // 出票失败提醒 // 'G-N85zK2gPwgTRZWQrtHZo_-5TFcdAqBxSk4qsqcvVc', // 出票结果通知 'YyTCUIYBnrj9CyKks8cOjNX_Rk8a4yVdswMP-zXVbhc' ] uni.requestSubscribeMessage({ tmplIds: templateIds, complete(res) { uni.navigateTo({ url: '/subPackages/haveFeeling/list' }) } }) } // 金刚区头图 Vue.prototype.getHeadImg = id => { return Vue.prototype.Post({id: id},'/api/article/getArticleById').then(res => { return res.data.image }); } // 判断是否去外部链接 Vue.prototype.goOtherDetail = (item,type) => { if(item.link_type == 1) { // 外部小程序 uni.navigateToMiniProgram({ shortLink: item.ext_link }) return true }else if(item.link_type == 2){ // 外部H5 uni.navigateTo({ url: '/subPackages/webPage/webPage?url=' + item.ext_link }); return true } } // 根据类型判断详情页 Vue.prototype.goDetailByType= function(item){ // let res = this.goOtherDetail(item) // if (res) { // return // } console.log(item.id) uni.navigateTo({ url: `/subPackages/techan/detail?id=${(item.goods_id || item.id)}` }) } // 轮播图跳转 1产品详情 2是各种详情页,3是列表专题页面,4是小程序 Vue.prototype.gotoUrlNew = (item) => { console.log(item); let that = this; let url = ''; switch (item.jump_type) { case 0: break; case 1: uni.navigateTo({ url: '/subPackages/techan/detail?id=' + item.product_model.id }); break; case 2: uni.navigateTo({ url: item.front_model.mini }); break; case 3: uni.navigateTo({ url: '/subPackages/webPage/webPage?url=' + item.tdata }); break; case 4: uni.navigateToMiniProgram({ appId: item.tdata.appid, // 此为appid path: item.tdata.page, // 此为首页路径 envVersion: 'release', success: res => { // 打开成功 console.log('打开成功', res); }, fail: err => { console.log(err); } }); break; case 5: wx.openChannelsActivity({ finderUserName: item.tdata.video_appid, // 视频号的原始ID feedId: item.tdata.video_id, // 视频号的视频ID success(res) { console.log('拉起视频号成功', res); }, fail(res) { console.log('拉起视频号失败', res); } }) break; default: break; } } Vue.prototype.gotoUrlNewDes = (item) => { let that = this; let url = ''; switch (item.jumpType) { case 0: break; case 1: uni.navigateTo({ url: item.jumpUrl }); break; case 2: uni.navigateTo({ url: '/subPackages/webPage/webPage?url=' + item.jumpUrl }); break; case 4: uni.navigateToMiniProgram({ appId: item.tdata.appid, // 此为appid path: item.tdata.page, // 此为首页路径 envVersion: 'release', success: res => { // 打开成功 console.log('打开成功', res); }, fail: err => { console.log(err); } }); break; case 5: wx.openChannelsActivity({ finderUserName: item.tdata.video_appid, // 视频号的原始ID feedId: item.tdata.video_id, // 视频号的视频ID success(res) { console.log('拉起视频号成功', res); }, fail(res) { console.log('拉起视频号失败', res); } }) break; default: break; } } // 埋点 Vue.prototype.getUuid = () => { return new Promise((resolve, reject) => { if (uni.getStorageSync('uuid')) { resolve(uni.getStorageSync('uuid')) } else { Vue.prototype.Post({}, '/api/browse/get_uuid').then(res => { uni.setStorageSync('uuid', res.data.uuid) resolve(res.data.uuid) }) } }) }, // 普通埋点 Vue.prototype.browse_record = (info) => { info.drive = 'mini' if (!info.type) { info.type = 'page' } var pages = getCurrentPages() //获取加载的页面 var currentPage = pages[pages.length - 1] //获取当前页面的对象 info.url = currentPage.$page.fullPath Vue.prototype.getUuid().then(uuid => { info.uuid = uuid Vue.prototype.Post(info, '/api/browse/browse_record').then(res => {}) }) } Vue.prototype.appendToStorage = (key, newData) => { const existing = uni.getStorageSync(key) || {}; const updated = { ...existing, ...newData }; uni.setStorageSync(key, updated); } Vue.prototype.JDSU_IMG_URL = "https://static.ticket.sz-trip.com" Vue.prototype.addImgStyleToHtml = (htmlStr) => { return htmlStr.replace(/]*)>/gi, (match, attrs) => { // 检查是否已有 style 属性 if (/style\s*=/.test(attrs)) { // 已有 style,合并 width:100% return ` { // 合并 width:100% 到已有 style let newStyle = styleVal; if (!/width\s*:\s*100%/.test(styleVal)) { newStyle = `width:100%;${styleVal}`; } return `style=${quote}${newStyle}${quote}`; } )}>`; } else { // 没有 style,直接加 return ``; } }); } Vue.prototype.toJdszWx = (path) => { wx.navigateToMiniProgram({ appId: 'wx4bb7b6050831f585', path: path, envVersion: process.env.NODE_ENV === 'development'?'trial':'release', success(res) { // 打开成功 }, fail(e){ console.log(e) } }) }