// 获取路径参数
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)
}
})
}