tmp: 部分代码与UnishopV5结合,但是代码有严重缺陷
This commit is contained in:
@@ -1,103 +1,100 @@
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
authInfo: {}
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
/**
|
||||
* 获取用户登录凭证code
|
||||
*/
|
||||
getCode(callback) {
|
||||
// 微信小程序
|
||||
// #ifdef MP-WEIXIN
|
||||
uni.login({
|
||||
provider: 'weixin',
|
||||
timeout: 3000,
|
||||
success: res => {
|
||||
if (res.code) {
|
||||
this.$api.sendRequest({
|
||||
url: '/weapp/api/weapp/authcodetoopenid',
|
||||
data: {
|
||||
code: res.code
|
||||
},
|
||||
success: res => {
|
||||
if (res.code >= 0) {
|
||||
if (res.data.openid) this.authInfo.weapp_openid = res.data
|
||||
.openid;
|
||||
if (res.data.unionid) this.authInfo.wx_unionid = res.data
|
||||
.unionid;
|
||||
typeof callback == 'function' && callback(this.authInfo);
|
||||
} else {
|
||||
this.$util.showToast({
|
||||
title: res.message ? res.message : '小程序配置错误'
|
||||
});
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
},
|
||||
fail: (res) => {
|
||||
// #ifdef MP-WEIXIN
|
||||
let scene = wx.getLaunchOptionsSync().scene;
|
||||
if ([1154, 1155].indexOf(scene) == -1) {
|
||||
this.$util.showToast({
|
||||
title: res.errMsg
|
||||
});
|
||||
}
|
||||
// #endif
|
||||
}
|
||||
})
|
||||
// #endif
|
||||
|
||||
// #ifdef MP-ALIPAY
|
||||
uni.login({
|
||||
timeout: 3000,
|
||||
success: res => {
|
||||
if (res.code) {
|
||||
this.$api.sendRequest({
|
||||
url: '/aliapp/api/aliapp/authcodetouserid',
|
||||
data: {
|
||||
code: res.code
|
||||
},
|
||||
success: res => {
|
||||
if (res.code >= 0) {
|
||||
if (res.data.user_id) this.authInfo.ali_openid = res.data
|
||||
.user_id;
|
||||
typeof callback == 'function' && callback(this.authInfo);
|
||||
} else {
|
||||
this.$util.showToast({
|
||||
title: res.message ? res.message : '小程序配置错误'
|
||||
});
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
},
|
||||
fail: (err) => {
|
||||
this.$util.showToast({
|
||||
title: res.errMsg
|
||||
});
|
||||
}
|
||||
})
|
||||
// #endif
|
||||
|
||||
// #ifdef H5
|
||||
if (this.$util.isWeiXin()) {
|
||||
this.$api.sendRequest({
|
||||
url: '/wechat/api/wechat/authcode',
|
||||
data: {
|
||||
redirect_url: location.href,
|
||||
scopes: 'snsapi_userinfo'
|
||||
},
|
||||
success: res => {
|
||||
if (res.code >= 0) {
|
||||
location.href = res.data;
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
// #endif
|
||||
}
|
||||
}
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
authInfo: {}
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
/**
|
||||
* 获取用户登录凭证code
|
||||
*/
|
||||
getCode(callback) {
|
||||
// 微信小程序
|
||||
// #ifdef MP-WEIXIN
|
||||
uni.login({
|
||||
provider: 'weixin',
|
||||
timeout: 3000,
|
||||
success: res => {
|
||||
if (res.code) {
|
||||
this.$api.sendRequest({
|
||||
url: '/weapp/api/weapp/authcodetoopenid',
|
||||
data: {
|
||||
code: res.code
|
||||
},
|
||||
success: res => {
|
||||
if (res.code >= 0) {
|
||||
if (res.data.openid) this.authInfo.weapp_openid = res.data.openid;
|
||||
if (res.data.unionid) this.authInfo.wx_unionid = res.data.unionid;
|
||||
typeof callback == 'function' && callback(this.authInfo);
|
||||
} else {
|
||||
this.$util.showToast({
|
||||
title: res.message ? res.message : '小程序配置错误'
|
||||
});
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
},
|
||||
fail: (res) => {
|
||||
// #ifdef MP-WEIXIN
|
||||
let scene = wx.getLaunchOptionsSync().scene;
|
||||
if ([1154, 1155].indexOf(scene) == -1) {
|
||||
this.$util.showToast({
|
||||
title: res.errMsg
|
||||
});
|
||||
}
|
||||
// #endif
|
||||
}
|
||||
})
|
||||
// #endif
|
||||
|
||||
// #ifdef MP-ALIPAY
|
||||
uni.login({
|
||||
timeout: 3000,
|
||||
success: res => {
|
||||
if (res.code) {
|
||||
this.$api.sendRequest({
|
||||
url: '/aliapp/api/aliapp/authcodetouserid',
|
||||
data: {
|
||||
code: res.code
|
||||
},
|
||||
success: res => {
|
||||
if (res.code >= 0) {
|
||||
if (res.data.user_id) this.authInfo.ali_openid = res.data.user_id;
|
||||
typeof callback == 'function' && callback(this.authInfo);
|
||||
} else {
|
||||
this.$util.showToast({
|
||||
title: res.message ? res.message : '小程序配置错误'
|
||||
});
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
},
|
||||
fail: (res) => {
|
||||
this.$util.showToast({
|
||||
title: res.errMsg
|
||||
});
|
||||
}
|
||||
})
|
||||
// #endif
|
||||
|
||||
// #ifdef H5
|
||||
if (this.$util.isWeiXin()) {
|
||||
this.$api.sendRequest({
|
||||
url: '/wechat/api/wechat/authcode',
|
||||
data: {
|
||||
redirect_url: location.href,
|
||||
scopes: 'snsapi_userinfo'
|
||||
},
|
||||
success: res => {
|
||||
if (res.code >= 0) {
|
||||
location.href = res.data;
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
// #endif
|
||||
}
|
||||
}
|
||||
}
|
||||
386
common/js/diy.js
386
common/js/diy.js
@@ -1,7 +1,14 @@
|
||||
import WxMap from 'common/js/map-wx-jssdk.js';
|
||||
import { QQMapWX } from 'common/js/map-wx-jssdk.js';
|
||||
import Config from '@/common/js/config.js';
|
||||
|
||||
let systemInfo = uni.getSystemInfoSync();
|
||||
let systemInfo = {};
|
||||
try {
|
||||
// 合并设备信息和窗口信息
|
||||
systemInfo = {...uni.getDeviceInfo(), ...uni.getWindowInfo()};
|
||||
} catch (e) {
|
||||
// 兼容旧版本
|
||||
systemInfo = uni.getSystemInfoSync();
|
||||
}
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
@@ -35,6 +42,7 @@ export default {
|
||||
latitude: null, // 纬度
|
||||
longitude: null, // 经度
|
||||
currentPosition: '', // 当前位置
|
||||
currentStore: null,//当前门店
|
||||
nearestStore: null, // 离自己最近的门店
|
||||
|
||||
storeTimeOut: null, // 没有获取到定位,则获取默认门店
|
||||
@@ -43,19 +51,26 @@ export default {
|
||||
diyRoute: '', // 页面路由
|
||||
openBottomNav: false,
|
||||
isShowCopyRight: false,
|
||||
|
||||
option: null,
|
||||
firstDiy: true,
|
||||
|
||||
//启动广告
|
||||
adv:{},
|
||||
|
||||
adv: {},
|
||||
|
||||
};
|
||||
},
|
||||
onLoad(option) {
|
||||
this.option = option;
|
||||
uni.hideTabBar();
|
||||
// 支付宝小程序传参处理
|
||||
// #ifdef MP-ALIPAY
|
||||
let aliapp_option = my.getLaunchOptionsSync();
|
||||
aliapp_option.query && Object.assign(option, aliapp_option.query);
|
||||
// #endif
|
||||
|
||||
if (option.source_member) uni.setStorageSync('source_member', option.source_member);
|
||||
|
||||
// 小程序扫码进入
|
||||
if (option.scene) {
|
||||
// 处理分享人数据
|
||||
if (option.source_member) uni.setStorageSync('source_member', option.source_member);// 分享链接进入
|
||||
if (option.scene) {// 小程序扫码进入
|
||||
var sceneParams = decodeURIComponent(option.scene);
|
||||
sceneParams = sceneParams.split('&');
|
||||
if (sceneParams.length) {
|
||||
@@ -65,64 +80,36 @@ export default {
|
||||
}
|
||||
}
|
||||
|
||||
// H5地图选择位置回调
|
||||
// #ifdef H5
|
||||
// H5地图选择位置回调数据
|
||||
if (option.module && option.module == 'locationPicker') {
|
||||
option.name = ''; // 清空地址
|
||||
option.name = ''; // 自定义页面传参id和name,防止获取地址时变量混淆
|
||||
this.locationModule = option.module;
|
||||
this.latitude = option.latng.split(',')[0];
|
||||
this.longitude = option.latng.split(',')[1];
|
||||
}
|
||||
// #endif
|
||||
|
||||
//自定义页面的id和名称
|
||||
this.id = option.id || 0;
|
||||
this.name = option.name || '';
|
||||
|
||||
uni.removeStorageSync('manual_store_info'); // 清除手动切换门店缓存
|
||||
uni.removeStorageSync('manual_change_store'); // 清楚手动切换门店标识
|
||||
|
||||
// H5才会执行
|
||||
if (this.locationModule == 'locationPicker') {
|
||||
|
||||
// H5地图选址后的回调
|
||||
this.getNearestStore();
|
||||
this.getCurrentLocation();
|
||||
|
||||
} else if (this.mapConfig.wap_is_open == 1) {
|
||||
|
||||
// 每次都要定位,获取当前位置
|
||||
/*this.$util.getLocation({
|
||||
fail: (res) => {
|
||||
// 拒绝定位,进入默认总店
|
||||
this.enterDefaultStore();
|
||||
}
|
||||
});*/
|
||||
|
||||
// 如果3秒没有获取到定位,则获取默认门店,H5使用
|
||||
// #ifdef H5
|
||||
this.storeTimeOut = setTimeout(() => {
|
||||
this.enterDefaultStore();
|
||||
}, 1000 * 3);
|
||||
// #endif
|
||||
|
||||
} else {
|
||||
// 关闭定位
|
||||
this.enterDefaultStore();
|
||||
//获取当前门店信息 必须是首页且不是手动切换操作
|
||||
let current_route = this.$util.getCurrentRoute();
|
||||
let manualChangeStore = uni.getStorageSync('manual_change_store'); // 手动切换门店
|
||||
if (current_route.path.indexOf('/pages/index/index') > -1 && !manualChangeStore) {
|
||||
this.getCurrentStore(option);
|
||||
}
|
||||
|
||||
},
|
||||
onShow() {
|
||||
|
||||
this.init();
|
||||
async onShow() {
|
||||
if (this.firstDiy) {
|
||||
this.firstDiy = false;
|
||||
await this.getDiyMethod();
|
||||
}
|
||||
await this.onShowMethod();
|
||||
},
|
||||
onHide() {
|
||||
if (this.storeTimeOut) {
|
||||
clearTimeout(this.storeTimeOut);
|
||||
}
|
||||
|
||||
// 跳转页面要关闭门店弹出框
|
||||
this.closeChooseStorePopup();
|
||||
|
||||
// 清除限时秒杀定时器
|
||||
this.$store.commit('setDiySeckillInterval', 0);
|
||||
},
|
||||
@@ -149,7 +136,7 @@ export default {
|
||||
return str;
|
||||
},
|
||||
backgroundUrl() {
|
||||
var str = this.diyData.global.bgUrl && this.diyData.global.bgUrl != 'transparent' ? 'url(' + this.$util.img(this.diyData.global.bgUrl) + ') ' : '';
|
||||
var str = this.diyData.global?.bgUrl && this.diyData.global?.bgUrl != 'transparent' ? 'url(' + this.$util.img(this.diyData.global?.bgUrl) + ') ' : '';
|
||||
return str;
|
||||
},
|
||||
textNavColor() {
|
||||
@@ -187,30 +174,34 @@ export default {
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
location: function (nVal) {
|
||||
if (nVal) {
|
||||
/* location: function (nVal) {
|
||||
if (nVal && !this.latitude && !this.longitude) {
|
||||
this.latitude = nVal.latitude;
|
||||
this.longitude = nVal.longitude;
|
||||
this.getNearestStore();
|
||||
this.getCurrentLocation();
|
||||
this.getStoreInfoByLocation();
|
||||
}
|
||||
}, */
|
||||
initStatus: function (val) {
|
||||
if (!this.option.store_id) this.getLocation();
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
play(){
|
||||
console.log(123)
|
||||
async getDiyMethod() {
|
||||
await this.getDiyInfo();
|
||||
|
||||
this.$store.commit('setDiySeckillInterval', 1);
|
||||
this.$store.commit('setComponentRefresh');
|
||||
},
|
||||
async init() {
|
||||
async onShowMethod() {
|
||||
|
||||
// 定位信息过期后,重新获取定位
|
||||
if(this.mapConfig.wap_is_open == 1 && this.locationStorage && this.locationStorage.is_expired) {
|
||||
this.$util.getLocation({
|
||||
fail: (res) => {
|
||||
// 拒绝定位,进入默认总店
|
||||
this.enterDefaultStore();
|
||||
}
|
||||
});
|
||||
}
|
||||
// if (this.mapConfig.wap_is_open == 1 && this.locationStorage && this.locationStorage.is_expired) {
|
||||
// this.$util.getLocation({
|
||||
// fail: (res) => {
|
||||
// // 失败了不需要做任何处理,保持之前的门店选择即可
|
||||
// }
|
||||
// });
|
||||
// }
|
||||
|
||||
if (this.storeToken) {
|
||||
//记录分享关系
|
||||
@@ -225,17 +216,15 @@ export default {
|
||||
|
||||
this.$store.commit('setDiySeckillInterval', 1);
|
||||
|
||||
//小程序分享
|
||||
// #ifdef MP-WEIXIN
|
||||
this.$util.getMpShare().then(res => {
|
||||
this.mpShareData = res;
|
||||
});
|
||||
// #endif
|
||||
|
||||
let manualChangeStore = uni.getStorageSync('manual_change_store'); // 手动切换门店
|
||||
if (manualChangeStore) {
|
||||
uni.removeStorageSync('manual_change_store');
|
||||
|
||||
let manualStoreInfo = uni.getStorageSync('manual_store_info'); // 手动选择门店
|
||||
uni.removeStorageSync('manual_store_info');
|
||||
if (manualStoreInfo) {
|
||||
this.currentStore = manualStoreInfo;
|
||||
}
|
||||
this.closeGetLocationFailPopup();
|
||||
// 滚动至顶部
|
||||
uni.pageScrollTo({
|
||||
duration: 200,
|
||||
@@ -267,8 +256,14 @@ export default {
|
||||
query.select('.page-header').boundingClientRect(data => {
|
||||
if (data && data.height) {
|
||||
// 从状态栏高度开始算
|
||||
this.paddingTop = data.height + 'px';
|
||||
this.marginTop = -data.height + 'px';
|
||||
if (!this.diyData.global.topNavBg) {
|
||||
this.paddingTop = 0;
|
||||
this.marginTop = 0;
|
||||
} else {
|
||||
this.paddingTop = data.height + 'px';
|
||||
this.marginTop = -data.height + 'px';
|
||||
}
|
||||
|
||||
clearInterval(time);
|
||||
}
|
||||
}).exec();
|
||||
@@ -276,7 +271,7 @@ export default {
|
||||
}, 50);
|
||||
// #endif
|
||||
},
|
||||
async getDiyAdv(){
|
||||
async getDiyAdv() {
|
||||
//启动广告
|
||||
let res = await this.$api.sendRequest({
|
||||
url: '/api/diyview/getstartadv',
|
||||
@@ -285,13 +280,13 @@ export default {
|
||||
});
|
||||
this.adv = res.value
|
||||
// 弹框形式,首次弹出 1,每次弹出 0
|
||||
if(this.adv.advshow == 1){
|
||||
if (this.adv.advshow == 1) {
|
||||
setTimeout(() => {
|
||||
if (res.value.advtype == 1) {
|
||||
var popwindow_count = uni.getStorageSync(this.id + this.name + '_popwindow_count');
|
||||
if ((this.$refs.uniPopupWindow && popwindow_count == '') || (
|
||||
this.$refs.uniPopupWindow && popwindow_count == 1)) {
|
||||
|
||||
|
||||
this.$refs.uniPopupWindow.open();
|
||||
uni.setStorageSync(this.id + this.name + '_popwindow_count', 1);
|
||||
}
|
||||
@@ -301,7 +296,7 @@ export default {
|
||||
}
|
||||
}, 500);
|
||||
}
|
||||
|
||||
|
||||
},
|
||||
async getDiyInfo() {
|
||||
let res = await this.$api.sendRequest({
|
||||
@@ -309,7 +304,7 @@ export default {
|
||||
data: {
|
||||
id: this.id,
|
||||
name: this.name,
|
||||
en_type:uni.getStorageSync("lang"),//获取语言底部
|
||||
en_type: uni.getStorageSync("lang"),//获取语言底部
|
||||
},
|
||||
async: false
|
||||
});
|
||||
@@ -337,7 +332,7 @@ export default {
|
||||
this.$langConfig.title(this.diyData.global.title);
|
||||
this.mpCollect = this.diyData.global.mpCollect;
|
||||
this.setPublicShare();
|
||||
/* if (this.diyData.global.popWindow && this.diyData.global.popWindow.imageUrl) {
|
||||
if (this.diyData.global.popWindow && this.diyData.global.popWindow.imageUrl) {
|
||||
// 弹框形式,首次弹出 1,每次弹出 0
|
||||
setTimeout(() => {
|
||||
if (this.diyData.global.popWindow.count == 1) {
|
||||
@@ -352,7 +347,7 @@ export default {
|
||||
uni.setStorageSync(this.id + this.name + '_popwindow_count', 0);
|
||||
}
|
||||
}, 500);
|
||||
}*/
|
||||
}
|
||||
|
||||
// 修改diy数据结构排序
|
||||
let searchIndex = -1;
|
||||
@@ -375,14 +370,15 @@ export default {
|
||||
this.diyData.value.splice(topCategoryIndex, 1);
|
||||
this.diyData.value.splice(0, 0, ...topCategoryData);
|
||||
this.diyData.value.splice(1, 0, ...searchData);
|
||||
} else
|
||||
} else {
|
||||
this.diyData.value.splice(0, 0, ...searchData);
|
||||
}
|
||||
} else if (searchIndex != -1 && topCategoryIndex == -1) {
|
||||
let searchData = this.diyData.value.slice(searchIndex, searchIndex + 1);
|
||||
this.diyData.value.splice(searchIndex, 1);
|
||||
this.diyData.value.splice(0, 0, ...searchData);
|
||||
}
|
||||
|
||||
this.topIndexValue = null;
|
||||
for (var i = 0; i < this.diyData.value.length; i++) {
|
||||
// 分类导航组件
|
||||
if (this.diyData.value[i].componentName == 'TopCategory') {
|
||||
@@ -402,7 +398,6 @@ export default {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// #ifdef MP
|
||||
//小程序收藏
|
||||
if (!uni.getStorageSync('isCollect') && this.diyData.global.mpCollect) {
|
||||
@@ -416,6 +411,45 @@ export default {
|
||||
this.openBottomNav = this.diyData.global.openBottomNav;
|
||||
}
|
||||
this.isShowCopyRight = true;
|
||||
|
||||
//小程序分享
|
||||
// #ifdef MP-WEIXIN
|
||||
let path = this.$util.getCurrentRoute().path;
|
||||
if (path == '/pages/member/index') {
|
||||
this.mpShareData = {};
|
||||
return;
|
||||
}
|
||||
let share_path = path;
|
||||
if (this.$store.state.memberInfo && this.$store.state.memberInfo.member_id) {
|
||||
share_path = this.$util.getCurrentShareRoute(this.$store.state.memberInfo.member_id).path
|
||||
}
|
||||
let appMessageData = {
|
||||
title: this.diyData.global.weappShareTitle,
|
||||
path: share_path,
|
||||
imageUrl: this.$util.img(this.diyData.global.weappShareImage),
|
||||
success: res => { },
|
||||
fail: res => { }
|
||||
}
|
||||
let timeLineData = {
|
||||
title: this.diyData.global.weappShareTitle,
|
||||
query: share_path,
|
||||
imageUrl: this.$util.img(this.diyData.global.weappShareImage),
|
||||
}
|
||||
|
||||
this.mpShareData = {
|
||||
appMessage: appMessageData,
|
||||
timeLine: timeLineData
|
||||
};
|
||||
//console.log(this.mpShareData, 'this.mpShareData');
|
||||
|
||||
var store_info = this.$store.state.globalStoreInfo;
|
||||
if (store_info) {
|
||||
this.mpShareData.appMessage.path += (this.mpShareData.appMessage.path.indexOf('?') > -1 ? '&' : '?') + 'store_id=' + store_info.store_id;
|
||||
this.mpShareData.timeLine.query += (this.mpShareData.timeLine.query.indexOf('?') > -1 ? '&' : '?') + 'store_id=' + store_info.store_id;
|
||||
}
|
||||
//朋友圈不需要页面路径,只要要后面的参数就行
|
||||
this.mpShareData.timeLine.query = this.mpShareData.timeLine.query.split('?')[1] || '';
|
||||
// #endif
|
||||
}
|
||||
},
|
||||
closePopupWindow() {
|
||||
@@ -430,44 +464,131 @@ export default {
|
||||
this.$util.diyRedirectTo(this.diyData.global.popWindow.link);
|
||||
this.closePopupWindow();
|
||||
},
|
||||
openChooseStorePopup() {
|
||||
if (this.globalStoreConfig && this.globalStoreConfig.confirm_popup_control == 1) {
|
||||
let storeInfo = this.globalStoreInfo;
|
||||
|
||||
// 首次进入门店,没有门店信息 || 当前位置的门店和缓存门店不一致要弹框
|
||||
if (!storeInfo || storeInfo && this.nearestStore && storeInfo.store_id != this.nearestStore.store_id) {
|
||||
if (this.$refs.chooseStorePopup) this.$refs.chooseStorePopup.open();
|
||||
/******************************************** 获取门店相关 START ***************************************************/
|
||||
/**
|
||||
* 1、分享携带门店id
|
||||
* 门店id正确 进入门店
|
||||
* 门店id错误 通过定位获取门店
|
||||
* 2、通过定位获取门店
|
||||
* 开启获取定位
|
||||
* 同意获取定位 获取最近门店 进入门店
|
||||
* 拒绝获取定位
|
||||
* 平台运营模式 进入默认门店
|
||||
* 连锁门店模式 提示获取定位失败,手动选择门店或引导去开启定位
|
||||
* 关闭获取定位
|
||||
* 平台运营模式 进入默认门店
|
||||
* 连锁门店模式 提示获取定位失败,手动选择门店
|
||||
*/
|
||||
getCurrentStore(option) {
|
||||
if (option.store_id && !isNaN(parseInt(option.store_id))) {
|
||||
this.getStoreInfoByShare(option.store_id);
|
||||
} else {
|
||||
this.getLocation();
|
||||
}
|
||||
},
|
||||
getStoreInfoByShare(store_id) {
|
||||
this.$api.sendRequest({
|
||||
url: '/api/store/info',
|
||||
data: { store_id },
|
||||
success: res => {
|
||||
if (res.code >= 0 && res.data) {
|
||||
this.changeCurrentStore(res.data);
|
||||
} else {
|
||||
this.getLocation();
|
||||
}
|
||||
},
|
||||
fail: res => {
|
||||
this.getLocation();
|
||||
}
|
||||
});
|
||||
},
|
||||
getLocation() {
|
||||
if (!this.latitude && !this.longitude && this.initStatus) {
|
||||
if (this.mapConfig.wap_is_open == 1) {
|
||||
this.$util.getLocation({
|
||||
complete: (res) => {
|
||||
if (res.latitude && res.longitude) {
|
||||
this.closeGetLocationFailPopup();
|
||||
this.latitude = res.latitude;
|
||||
this.longitude = res.longitude;
|
||||
this.getStoreInfoByLocation();
|
||||
} else {
|
||||
let is_h5 = false;
|
||||
// #ifdef H5
|
||||
is_h5 = true;
|
||||
// #endif
|
||||
if (is_h5) {
|
||||
//H5同意了也会进入失败,所以直接进入默认门店
|
||||
this.enterDefaultStore();
|
||||
} else {
|
||||
this.getLocationFail();
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
// #ifdef H5
|
||||
//H5有的机型可能根本不会触发getLocation的任何执行,包括success,fail,completele
|
||||
//所以这里如果等待一定时间后还是没有获取到当前门店则进入默认门店
|
||||
setTimeout(() => {
|
||||
let current_route = this.$util.getCurrentRoute();
|
||||
if (this.mapConfig.wap_is_open == 1 && !this.currentStore && current_route.path == '/pages/index/index') {
|
||||
this.enterDefaultStore();
|
||||
}
|
||||
}, 5000);
|
||||
// #endif
|
||||
} else {
|
||||
this.getLocationFail();
|
||||
}
|
||||
}
|
||||
|
||||
let manualStoreInfo = uni.getStorageSync('manual_store_info'); // 手动选择门店
|
||||
if (manualStoreInfo) {
|
||||
this.nearestStore = manualStoreInfo;
|
||||
},
|
||||
getStoreInfoByLocation() {
|
||||
if (this.latitude && this.longitude) {
|
||||
this.getNearestStore();
|
||||
this.getCurrentLocation();
|
||||
}
|
||||
},
|
||||
changeCurrentStore(store_info) {
|
||||
this.currentStore = store_info;
|
||||
this.changeStore(store_info);
|
||||
this.openChooseStorePopup();
|
||||
},
|
||||
getLocationFail() {
|
||||
if (this.globalStoreConfig.store_business == 'shop') {
|
||||
this.enterDefaultStore();
|
||||
} else {
|
||||
this.openGetLocationFailPopup();
|
||||
}
|
||||
},
|
||||
openGetLocationFailPopup() {
|
||||
if (this.$refs.getLocationFailRef) this.$refs.getLocationFailRef.open();
|
||||
},
|
||||
closeGetLocationFailPopup() {
|
||||
if (this.$refs.getLocationFailRef) this.$refs.getLocationFailRef.close();
|
||||
},
|
||||
openChooseStorePopup() {
|
||||
let globalStoreInfo = this.globalStoreInfo;
|
||||
if (this.globalStoreConfig && this.globalStoreConfig.confirm_popup_control == 1) {
|
||||
this.currentStore.show_address = this.currentStore.full_address.replace(/,/g, ' ') + ' ' + this.currentStore.address;
|
||||
if (this.$refs.chooseStorePopup) this.$refs.chooseStorePopup.open();
|
||||
}
|
||||
this.changeStore(this.nearestStore); // 切换门店数据
|
||||
},
|
||||
closeChooseStorePopup() {
|
||||
if (this.$refs.chooseStorePopup) this.$refs.chooseStorePopup.close();
|
||||
},
|
||||
// 确认进入门店
|
||||
enterStore() {
|
||||
this.closeChooseStorePopup();
|
||||
},
|
||||
// 选择其他门店
|
||||
chooseOtherStore() {
|
||||
this.$util.redirectTo('/pages_tool/store/list');
|
||||
this.closeChooseStorePopup();
|
||||
},
|
||||
// 打开地图重新选择位置
|
||||
reposition() {
|
||||
reGetLocation() {
|
||||
// #ifdef MP
|
||||
/*uni.chooseLocation({
|
||||
uni.chooseLocation({
|
||||
success: res => {
|
||||
this.latitude = res.latitude;
|
||||
this.longitude = res.longitude;
|
||||
this.currentPosition = res.name;
|
||||
this.getNearestStore();
|
||||
this.getCurrentLocation();
|
||||
this.getStoreInfoByLocation();
|
||||
},
|
||||
fail(res) {
|
||||
uni.getSetting({
|
||||
@@ -492,8 +613,7 @@ export default {
|
||||
this.latitude = res.latitude;
|
||||
this.longitude = res.longitude;
|
||||
this.currentPosition = res.name;
|
||||
this.getNearestStore();
|
||||
this.getCurrentLocation();
|
||||
this.getStoreInfoByLocation();
|
||||
}
|
||||
});
|
||||
}, 1000);
|
||||
@@ -511,7 +631,7 @@ export default {
|
||||
}
|
||||
});
|
||||
}
|
||||
});*/
|
||||
});
|
||||
// #endif
|
||||
|
||||
// #ifdef H5
|
||||
@@ -532,9 +652,7 @@ export default {
|
||||
data: data,
|
||||
success: res => {
|
||||
if (res.code == 0 && res.data) {
|
||||
this.nearestStore = res.data;
|
||||
this.nearestStore.show_address = this.nearestStore.full_address.replace(/,/g, ' ') + ' ' + this.nearestStore.address;
|
||||
this.openChooseStorePopup();
|
||||
this.changeCurrentStore(res.data);
|
||||
}
|
||||
}
|
||||
});
|
||||
@@ -547,7 +665,6 @@ export default {
|
||||
data.latitude = this.latitude;
|
||||
data.longitude = this.longitude;
|
||||
}
|
||||
|
||||
this.$api.sendRequest({
|
||||
url: '/api/store/getLocation',
|
||||
data: data,
|
||||
@@ -563,26 +680,42 @@ export default {
|
||||
// 定位失败,进入默认门店
|
||||
enterDefaultStore() {
|
||||
if (this.defaultStoreInfo) {
|
||||
if (!this.nearestStore) {
|
||||
this.nearestStore = this.defaultStoreInfo;
|
||||
this.nearestStore.show_address = this.nearestStore.full_address.replace(/,/g, ' ') + ' ' + this.nearestStore.address;
|
||||
}
|
||||
if (this.currentPosition == '') this.currentPosition = '未获取到定位';
|
||||
this.openChooseStorePopup();
|
||||
this.changeCurrentStore(this.defaultStoreInfo);
|
||||
}
|
||||
},
|
||||
//连锁门店未定位选择门店
|
||||
chooseStore() {
|
||||
this.$util.redirectTo('/pages_tool/store/list');
|
||||
},
|
||||
//打开手机设置重新定位
|
||||
openSetting() {
|
||||
uni.openSetting({
|
||||
success: res => {
|
||||
this.getLocation();
|
||||
}
|
||||
})
|
||||
},
|
||||
/******************************************** 获取门店相关 END ***************************************************/
|
||||
// 设置公众号分享
|
||||
setPublicShare() {
|
||||
let shareUrl = this.$config.h5Domain + this.diyRoute;
|
||||
if (this.id) shareUrl += '?id=' + this.id;
|
||||
else if (this.name) shareUrl += '?name=' + this.name;
|
||||
var store_info = this.$store.state.globalStoreInfo;
|
||||
//if (store_info) shareUrl += '?store_id=' + store_info.store_id;
|
||||
if (shareUrl.indexOf('?') > 0) {
|
||||
shareUrl += '&';
|
||||
} else {
|
||||
shareUrl += '?';
|
||||
}
|
||||
if (this.id) shareUrl += 'id=' + this.id;
|
||||
else if (this.name) shareUrl += 'name=' + this.name;
|
||||
// alert('diydiydiy')
|
||||
this.$util.setPublicShare({
|
||||
title: this.diyData.global.title,
|
||||
desc: '',
|
||||
title: this.diyData.global.wechatShareTitle || this.diyData.global.title,
|
||||
desc: this.diyData.global.wechatShareDesc,
|
||||
link: shareUrl,
|
||||
imgUrl: this.siteInfo ? this.$util.img(this.siteInfo.logo_square) : ''
|
||||
imgUrl: this.diyData.global.wechatShareImage ? this.$util.img(this.diyData.global.wechatShareImage) : this.$util.img(this.siteInfo.logo_square)
|
||||
});
|
||||
}
|
||||
},
|
||||
},
|
||||
onPageScroll(e) {
|
||||
this.scrollTop = e.scrollTop;
|
||||
@@ -597,6 +730,7 @@ export default {
|
||||
// 下拉刷新
|
||||
onPullDownRefresh() {
|
||||
this.$store.commit('setComponentRefresh');
|
||||
this.getDiyMethod();
|
||||
setTimeout(() => {
|
||||
uni.stopPullDownRefresh();
|
||||
}, 50);
|
||||
|
||||
@@ -1,371 +1,382 @@
|
||||
// 商品详情业务
|
||||
import htmlParser from '@/common/js/html-parser';
|
||||
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
skuId: 0,
|
||||
goodsId: 0,
|
||||
// 商品详情
|
||||
goodsSkuDetail: {
|
||||
goods_id: 0,
|
||||
goods_service: []
|
||||
},
|
||||
preview: 0, //是否开启预览,0:不开启,1:开启
|
||||
//评价
|
||||
contactData: {
|
||||
title: '',
|
||||
path: '',
|
||||
img: ''
|
||||
},
|
||||
|
||||
shareQuery: '', // 分享参数
|
||||
shareUrl: '', // 分享链接
|
||||
|
||||
source_member: 0, //分享人的id
|
||||
chatRoomParams: {}, // 联系客服参数
|
||||
isIphoneX: false, //判断手机是否是iphoneX以上
|
||||
whetherCollection: 0,
|
||||
posterParams: {}, //海报所需参数
|
||||
shareImg: '',
|
||||
navbarData: {
|
||||
title: '',
|
||||
topNavColor: "#ffffff",
|
||||
topNavBg: false,
|
||||
navBarSwitch: true, // 导航栏是否显示
|
||||
textNavColor: "#333333",
|
||||
moreLink: {
|
||||
name: ""
|
||||
},
|
||||
navStyle: 1,
|
||||
bgUrl: '',
|
||||
textImgPosLink: 'left'
|
||||
},
|
||||
}
|
||||
},
|
||||
onLoad(data) {
|
||||
//刷新多语言
|
||||
this.$langConfig.refresh();
|
||||
// #ifdef MP-ALIPAY
|
||||
let options = my.getLaunchOptionsSync();
|
||||
options.query && Object.assign(data, options.query);
|
||||
// #endif
|
||||
|
||||
this.preview = data.preview || 0;
|
||||
this.isIphoneX = this.$util.uniappIsIPhoneX();
|
||||
|
||||
if (data.source_member) {
|
||||
uni.setStorageSync('source_member', data.source_member);
|
||||
this.source_member = data.source_member;
|
||||
}
|
||||
//记录分享关系
|
||||
if (this.storeToken && uni.getStorageSync('source_member')) {
|
||||
this.$util.onSourceMember(uni.getStorageSync('source_member'));
|
||||
}
|
||||
|
||||
// 小程序扫码进入
|
||||
if (data.scene) {
|
||||
var sceneParams = decodeURIComponent(data.scene);
|
||||
sceneParams = sceneParams.split('&');
|
||||
if (sceneParams.length) {
|
||||
sceneParams.forEach(item => {
|
||||
if (item.indexOf('m') != -1) uni.setStorageSync('source_member', item.split('-')[1]);
|
||||
if (item.indexOf('is_test') != -1) uni.setStorageSync('is_test', 1);
|
||||
});
|
||||
}
|
||||
}
|
||||
},
|
||||
onShow() {
|
||||
},
|
||||
methods: {
|
||||
// 处理商品详情数据
|
||||
handleGoodsSkuData() {
|
||||
// this.navbarData.title = this.goodsSkuDetail.goods_name.length > 9 ? this.goodsSkuDetail.goods_name.substr(0, 9) + "..." : this.goodsSkuDetail.goods_name;
|
||||
//设置标题
|
||||
// this.$langConfig.title(this.navbarData.title);
|
||||
if (this.goodsSkuDetail.config) {
|
||||
this.navbarData.navBarSwitch = this.goodsSkuDetail.config.nav_bar_switch;
|
||||
}
|
||||
|
||||
this.whetherCollection = this.goodsSkuDetail.is_collect; // 用户关注商品状态
|
||||
|
||||
this.modifyGoodsInfo();
|
||||
|
||||
// 初始化商品详情视图数据
|
||||
if (this.$refs.goodsDetailView) this.$refs.goodsDetailView.init({
|
||||
sku_id: this.skuId,
|
||||
goods_id: this.goodsSkuDetail.goods_id,
|
||||
preview: this.preview,
|
||||
source_member: this.source_member,
|
||||
posterParams: this.posterParams,
|
||||
posterApi: this.posterApi,
|
||||
shareUrl: this.shareUrl,
|
||||
goodsRoute: this.goodsRoute,
|
||||
isVirtual: this.goodsSkuDetail.is_virtual,
|
||||
deliveryType: this.goodsSkuDetail.express_type,
|
||||
whetherCollection: this.goodsSkuDetail.is_collect,
|
||||
evaluateConfig: this.goodsSkuDetail.evaluate_config,
|
||||
evaluateList: this.goodsSkuDetail.evaluate_list,
|
||||
evaluateCount: this.goodsSkuDetail.evaluate_count
|
||||
});
|
||||
|
||||
//媒体
|
||||
if (this.goodsSkuDetail.video_url) this.switchMedia = "video";
|
||||
|
||||
if (!Array.isArray(this.goodsSkuDetail.sku_images)) {
|
||||
if (this.goodsSkuDetail.sku_images) this.goodsSkuDetail.sku_images = this.goodsSkuDetail.sku_images.split(",");
|
||||
else this.goodsSkuDetail.sku_images = [];
|
||||
}
|
||||
|
||||
// 多规格时合并主图
|
||||
if (this.goodsSkuDetail.goods_spec_format && this.goodsSkuDetail.goods_image) {
|
||||
|
||||
if (!Array.isArray(this.goodsSkuDetail.goods_image)) this.goodsSkuDetail.goods_image = this.goodsSkuDetail.goods_image.split(",");
|
||||
|
||||
this.goodsSkuDetail.sku_images = this.goodsSkuDetail.goods_image.concat(this.goodsSkuDetail.sku_images);
|
||||
}
|
||||
|
||||
let maxHeight = '';
|
||||
let systemInfo = uni.getSystemInfoSync();
|
||||
this.goodsSkuDetail.goods_image_list.forEach((item, index) => {
|
||||
if (typeof item.pic_spec == "string")
|
||||
item.pic_spec = item.pic_spec.split('*');
|
||||
|
||||
let ratio = item.pic_spec[0] / systemInfo.windowWidth;
|
||||
item.pic_spec[0] = item.pic_spec[0] / ratio;
|
||||
item.pic_spec[1] = item.pic_spec[1] / ratio;
|
||||
|
||||
if (!maxHeight || maxHeight > item.pic_spec[1]) {
|
||||
maxHeight = item.pic_spec[1];
|
||||
}
|
||||
});
|
||||
this.goodsSkuDetail.swiperHeight = maxHeight + 'px';
|
||||
|
||||
this.goodsSkuDetail.unit = this.goodsSkuDetail.unit || "件";
|
||||
|
||||
// 当前商品SKU规格
|
||||
if (this.goodsSkuDetail.sku_spec_format) this.goodsSkuDetail.sku_spec_format = JSON.parse(this.goodsSkuDetail.sku_spec_format);
|
||||
|
||||
// 商品属性
|
||||
if (this.goodsSkuDetail.goods_attr_format) {
|
||||
let goods_attr_format = JSON.parse(this.goodsSkuDetail.goods_attr_format);
|
||||
this.goodsSkuDetail.goods_attr_format = this.$util.unique(goods_attr_format, "attr_id");
|
||||
for (var i = 0; i < this.goodsSkuDetail.goods_attr_format.length; i++) {
|
||||
for (var j = 0; j < goods_attr_format.length; j++) {
|
||||
if (this.goodsSkuDetail.goods_attr_format[i].attr_id == goods_attr_format[j].attr_id && this.goodsSkuDetail.goods_attr_format[i].attr_value_id != goods_attr_format[j].attr_value_id) {
|
||||
this.goodsSkuDetail.goods_attr_format[i].attr_value_name += "、" + goods_attr_format[j].attr_value_name;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 商品SKU格式
|
||||
if (this.goodsSkuDetail.goods_spec_format) this.goodsSkuDetail.goods_spec_format = JSON.parse(this.goodsSkuDetail.goods_spec_format);
|
||||
|
||||
// 商品详情
|
||||
if (this.goodsSkuDetail.goods_content) this.goodsSkuDetail.goods_content = (this.goodsSkuDetail.goods_content);
|
||||
console.log(this.goodsSkuDetail.goods_content)
|
||||
// if (this.goodsSkuDetail.goods_content) this.goodsSkuDetail.goods_content = htmlParser(this.goodsSkuDetail.goods_content);
|
||||
|
||||
//商品服务
|
||||
if (this.goodsSkuDetail.goods_service) {
|
||||
for (let i in this.goodsSkuDetail.goods_service) {
|
||||
this.goodsSkuDetail.goods_service[i]['icon'] = this.goodsSkuDetail.goods_service[i]['icon'] ? JSON.parse(this.goodsSkuDetail.goods_service[i]['icon']) : '';
|
||||
}
|
||||
}
|
||||
|
||||
this.contactData = {
|
||||
title: this.goodsSkuDetail.sku_name,
|
||||
path: this.shareUrl,
|
||||
img: this.$util.img(this.goodsSkuDetail.sku_image, {
|
||||
size: 'big'
|
||||
})
|
||||
};
|
||||
if (this.$refs.goodsPromotion) this.$refs.goodsPromotion.refresh(this.goodsSkuDetail.goods_promotion);
|
||||
|
||||
if (this.goodsRoute != '/pages/goods/detail') this.setPublicShare();
|
||||
|
||||
// this.getBarrageData();
|
||||
if (this.addonIsExist.form) {
|
||||
this.getGoodsForm();
|
||||
}
|
||||
},
|
||||
/**
|
||||
* 刷新商品详情数据
|
||||
* @param {Object} data
|
||||
*/
|
||||
refreshGoodsSkuDetail(data) {
|
||||
this.goodsSkuDetail = Object.assign({}, this.goodsSkuDetail, data);
|
||||
if (this.$refs.goodsPromotion) this.$refs.goodsPromotion.refresh(this.goodsSkuDetail.goods_promotion);
|
||||
if (this.$refs.goodsDetailView) {
|
||||
|
||||
// 初始化商品详情视图数据
|
||||
this.goodsSkuDetail.unit = this.goodsSkuDetail.unit || "件";
|
||||
|
||||
// 解决轮播图数量不一致时,切换到第一个
|
||||
if (this.swiperCurrent > this.goodsSkuDetail.sku_images.length) {
|
||||
this.swiperAutoplay = true;
|
||||
this.swiperCurrent = 1;
|
||||
setTimeout(() => {
|
||||
this.swiperAutoplay = false;
|
||||
}, 40);
|
||||
}
|
||||
|
||||
}
|
||||
this.navbarData.title = this.goodsSkuDetail.goods_name.length > 9 ? this.goodsSkuDetail.goods_name.substr(0, 9) + "..." : this.goodsSkuDetail.goods_name;
|
||||
this.$langConfig.title(this.navbarData.title);
|
||||
|
||||
if (this.goodsSkuDetail.membercard) {
|
||||
this.membercard = this.goodsSkuDetail.membercard;
|
||||
}
|
||||
},
|
||||
goodsDetailViewInit() {
|
||||
// 初始化商品详情视图数据
|
||||
if (this.$refs.goodsDetailView) this.$refs.goodsDetailView.init({
|
||||
sku_id: this.skuId,
|
||||
goods_id: this.goodsSkuDetail.goods_id,
|
||||
preview: this.preview,
|
||||
source_member: this.source_member,
|
||||
posterParams: this.posterParams,
|
||||
posterApi: this.posterApi,
|
||||
shareUrl: this.shareUrl,
|
||||
goodsRoute: this.goodsRoute,
|
||||
isVirtual: this.goodsSkuDetail.is_virtual,
|
||||
deliveryType: this.goodsSkuDetail.express_type,
|
||||
whetherCollection: this.goodsSkuDetail.is_collect,
|
||||
evaluateConfig: this.goodsSkuDetail.evaluate_config,
|
||||
evaluateList: this.goodsSkuDetail.evaluate_list,
|
||||
evaluateCount: this.goodsSkuDetail.evaluate_count
|
||||
});
|
||||
},
|
||||
goHome() {
|
||||
if (this.preview) return; // 开启预览,禁止任何操作和跳转
|
||||
this.$util.redirectTo('/pages/index/index');
|
||||
},
|
||||
goCart() {
|
||||
if (this.preview) return; // 开启预览,禁止任何操作和跳转
|
||||
this.$util.redirectTo('/pages/goods/cart');
|
||||
},
|
||||
//-------------------------------------关注-------------------------------------
|
||||
//更新商品信息
|
||||
modifyGoodsInfo() {
|
||||
if (this.preview) return; // 开启预览,禁止任何操作和跳转
|
||||
//更新商品点击量
|
||||
this.$api.sendRequest({
|
||||
url: "/api/goods/modifyclicks",
|
||||
data: {
|
||||
sku_id: this.skuId
|
||||
},
|
||||
success: res => {
|
||||
}
|
||||
});
|
||||
|
||||
//添加足迹
|
||||
this.$api.sendRequest({
|
||||
url: "/api/goodsbrowse/add",
|
||||
data: {
|
||||
goods_id: this.goodsSkuDetail.goods_id,
|
||||
sku_id: this.skuId
|
||||
},
|
||||
success: res => {
|
||||
}
|
||||
});
|
||||
},
|
||||
//-------------------------------------关注-------------------------------------
|
||||
async editCollection() {
|
||||
if (this.$refs.goodsDetailView) {
|
||||
this.whetherCollection = await this.$refs.goodsDetailView.collection();
|
||||
}
|
||||
},
|
||||
openSharePopup() {
|
||||
if (this.$refs.goodsDetailView) {
|
||||
this.$refs.goodsDetailView.openSharePopup();
|
||||
}
|
||||
},
|
||||
//弹幕
|
||||
getBarrageData() {
|
||||
this.$api.sendRequest({
|
||||
url: '/api/goods/goodsbarrage',
|
||||
data: {
|
||||
goods_id: this.goodsSkuDetail.goods_id
|
||||
},
|
||||
success: res => {
|
||||
if (res.code == 0 && res.data) {
|
||||
let barrageData = [];
|
||||
for (let i in res.data.list) {
|
||||
if (res.data.list[i]['title']) {
|
||||
let title = res.data.list[i]['title'].substr(0, 1) + '*' + res.data.list[i]['title'].substr(res.data.list[i]['title'].length - 1, 1)
|
||||
barrageData.push({
|
||||
img: res.data.list[i]['img'] ? res.data.list[i]['img'] : this.$util.getDefaultImage().head,
|
||||
title: title + '已下单'
|
||||
});
|
||||
}
|
||||
}
|
||||
this.goodsSkuDetail.barrageData = barrageData;
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
/**
|
||||
* 设置公众号分享
|
||||
*/
|
||||
setPublicShare() {
|
||||
let shareUrl = this.$config.h5Domain + this.shareUrl;
|
||||
if (this.memberInfo && this.memberInfo.member_id) shareUrl += '&source_member=' + this.memberInfo.member_id;
|
||||
|
||||
this.$util.setPublicShare({
|
||||
title: this.goodsSkuDetail.goods_name,
|
||||
desc: '',
|
||||
link: shareUrl,
|
||||
imgUrl: typeof this.goodsSkuDetail.goods_image == 'object' ? this.goodsSkuDetail.goods_image[0] : this.goodsSkuDetail.goods_image.split(',')[0]
|
||||
})
|
||||
},
|
||||
/**
|
||||
* 获取商品表单
|
||||
*/
|
||||
getGoodsForm() {
|
||||
this.$api.sendRequest({
|
||||
url: "/form/api/form/goodsform",
|
||||
data: {
|
||||
goods_id: this.goodsSkuDetail.goods_id
|
||||
},
|
||||
success: res => {
|
||||
if (res.code == 0 && res.data) this.$set(this.goodsSkuDetail, 'goods_form', res.data);
|
||||
}
|
||||
});
|
||||
}
|
||||
},
|
||||
/**
|
||||
* 自定义分享内容
|
||||
* @param {Object} res
|
||||
*/
|
||||
onShareAppMessage(res) {
|
||||
var path = this.shareUrl;
|
||||
if (this.memberInfo && this.memberInfo.member_id) path += '&source_member=' + this.memberInfo.member_id;
|
||||
return {
|
||||
title: this.goodsSkuDetail.sku_name,
|
||||
imageUrl: this.shareImg ? this.$util.img(this.shareImg) : this.$util.img(this.goodsSkuDetail.sku_image, {
|
||||
size: 'big'
|
||||
}),
|
||||
path: path,
|
||||
success: res => {
|
||||
},
|
||||
fail: res => {
|
||||
}
|
||||
};
|
||||
},
|
||||
// 分享到微信朋友圈
|
||||
// #ifdef MP-WEIXIN
|
||||
onShareTimeline() {
|
||||
let query = this.shareQuery;
|
||||
if (this.memberInfo && this.memberInfo.member_id) query += '&source_member=' + this.memberInfo.member_id;
|
||||
return {
|
||||
title: this.goodsSkuDetail.sku_name,
|
||||
query: query,
|
||||
imageUrl: this.$util.img(this.goodsSkuDetail.sku_image, {
|
||||
size: 'big'
|
||||
})
|
||||
};
|
||||
}
|
||||
// #endif
|
||||
// 商品详情业务
|
||||
import htmlParser from '@/common/js/html-parser';
|
||||
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
skuId: 0,
|
||||
goodsId: 0,
|
||||
// 商品详情
|
||||
goodsSkuDetail: {
|
||||
goods_id: 0,
|
||||
goods_service: []
|
||||
},
|
||||
preview: 0, //是否开启预览,0:不开启,1:开启
|
||||
//评价
|
||||
contactData: {
|
||||
title: '',
|
||||
path: '',
|
||||
img: ''
|
||||
},
|
||||
|
||||
shareQuery: '', // 分享参数
|
||||
shareUrl: '', // 分享链接
|
||||
|
||||
source_member: 0, //分享人的id
|
||||
chatRoomParams: {}, // 联系客服参数
|
||||
isIphoneX: false, //判断手机是否是iphoneX以上
|
||||
whetherCollection: 0,
|
||||
posterParams: {}, //海报所需参数
|
||||
shareImg: '',
|
||||
navbarData: {
|
||||
title: '',
|
||||
topNavColor: "#ffffff",
|
||||
topNavBg: false,
|
||||
navBarSwitch: true, // 导航栏是否显示
|
||||
textNavColor: "#333333",
|
||||
moreLink: {
|
||||
name: ""
|
||||
},
|
||||
navStyle: 1,
|
||||
bgUrl: '',
|
||||
textImgPosLink: 'left'
|
||||
},
|
||||
goodsFormVal: []
|
||||
}
|
||||
},
|
||||
onLoad(data) {
|
||||
//刷新多语言
|
||||
this.$langConfig.refresh();
|
||||
// #ifdef MP-ALIPAY
|
||||
let options = my.getLaunchOptionsSync();
|
||||
options.query && Object.assign(data, options.query);
|
||||
// #endif
|
||||
|
||||
this.preview = data.preview || 0;
|
||||
this.isIphoneX = this.$util.uniappIsIPhoneX();
|
||||
|
||||
if (data.source_member) {
|
||||
uni.setStorageSync('source_member', data.source_member);
|
||||
this.source_member = data.source_member;
|
||||
}
|
||||
//记录分享关系
|
||||
if (this.storeToken && uni.getStorageSync('source_member')) {
|
||||
this.$util.onSourceMember(uni.getStorageSync('source_member'));
|
||||
}
|
||||
|
||||
// 小程序扫码进入
|
||||
if (data.scene) {
|
||||
var sceneParams = decodeURIComponent(data.scene);
|
||||
sceneParams = sceneParams.split('&');
|
||||
if (sceneParams.length) {
|
||||
sceneParams.forEach(item => {
|
||||
if (item.indexOf('m') != -1) uni.setStorageSync('source_member', item.split('-')[1]);
|
||||
if (item.indexOf('is_test') != -1) uni.setStorageSync('is_test', 1);
|
||||
});
|
||||
}
|
||||
}
|
||||
},
|
||||
onShow() {
|
||||
},
|
||||
methods: {
|
||||
detailChangeVal(data) {
|
||||
this.goodsFormVal = data;
|
||||
},
|
||||
// 处理商品详情数据
|
||||
handleGoodsSkuData() {
|
||||
this.navbarData.title = this.goodsSkuDetail.goods_name.length > 9 ? this.goodsSkuDetail.goods_name.substr(0, 9) + "..." : this.goodsSkuDetail.goods_name;
|
||||
this.$langConfig.title(this.navbarData.title);
|
||||
if (this.goodsSkuDetail.config) {
|
||||
this.navbarData.navBarSwitch = this.goodsSkuDetail.config.nav_bar_switch;
|
||||
}
|
||||
|
||||
this.whetherCollection = this.goodsSkuDetail.is_collect; // 用户关注商品状态
|
||||
|
||||
this.modifyGoodsInfo();
|
||||
|
||||
// 初始化商品详情视图数据
|
||||
if (this.$refs.goodsDetailView) this.$refs.goodsDetailView.init({
|
||||
sku_id: this.skuId,
|
||||
goods_id: this.goodsSkuDetail.goods_id,
|
||||
preview: this.preview,
|
||||
source_member: this.source_member,
|
||||
posterParams: this.posterParams,
|
||||
posterApi: this.posterApi,
|
||||
shareUrl: this.shareUrl,
|
||||
goodsRoute: this.goodsRoute,
|
||||
isVirtual: this.goodsSkuDetail.is_virtual,
|
||||
deliveryType: this.goodsSkuDetail.express_type,
|
||||
whetherCollection: this.goodsSkuDetail.is_collect,
|
||||
evaluateConfig: this.goodsSkuDetail.evaluate_config,
|
||||
evaluateList: this.goodsSkuDetail.evaluate_list,
|
||||
evaluateCount: this.goodsSkuDetail.evaluate_count,
|
||||
goods_class : this.goodsSkuDetail.goods_class,
|
||||
sale_store: this.goodsSkuDetail.sale_store
|
||||
});
|
||||
|
||||
//媒体
|
||||
if (this.goodsSkuDetail.video_url) this.switchMedia = "video";
|
||||
|
||||
if (!Array.isArray(this.goodsSkuDetail.sku_images)) {
|
||||
if (this.goodsSkuDetail.sku_images) this.goodsSkuDetail.sku_images = this.goodsSkuDetail.sku_images.split(",");
|
||||
else this.goodsSkuDetail.sku_images = [];
|
||||
}
|
||||
|
||||
// 多规格时合并主图
|
||||
if (this.goodsSkuDetail.goods_spec_format && this.goodsSkuDetail.goods_image) {
|
||||
|
||||
if (!Array.isArray(this.goodsSkuDetail.goods_image)) this.goodsSkuDetail.goods_image = this.goodsSkuDetail.goods_image.split(",");
|
||||
|
||||
this.goodsSkuDetail.sku_images = this.goodsSkuDetail.goods_image.concat(this.goodsSkuDetail.sku_images);
|
||||
}
|
||||
|
||||
let maxHeight = '';
|
||||
let systemInfo = uni.getSystemInfoSync();
|
||||
this.goodsSkuDetail.goods_image_list.forEach((item, index) => {
|
||||
if (typeof item.pic_spec == "string")
|
||||
item.pic_spec = item.pic_spec.split('*');
|
||||
|
||||
let ratio = item.pic_spec[0] / systemInfo.windowWidth;
|
||||
item.pic_spec[0] = item.pic_spec[0] / ratio;
|
||||
item.pic_spec[1] = item.pic_spec[1] / ratio;
|
||||
|
||||
if (!maxHeight || maxHeight > item.pic_spec[1]) {
|
||||
maxHeight = item.pic_spec[1];
|
||||
}
|
||||
});
|
||||
this.goodsSkuDetail.swiperHeight = maxHeight + 'px';
|
||||
|
||||
this.goodsSkuDetail.unit = this.goodsSkuDetail.unit || "件";
|
||||
|
||||
// 当前商品SKU规格
|
||||
if (this.goodsSkuDetail.sku_spec_format) this.goodsSkuDetail.sku_spec_format = JSON.parse(this.goodsSkuDetail.sku_spec_format);
|
||||
|
||||
// 商品属性
|
||||
if (this.goodsSkuDetail.goods_attr_format) {
|
||||
let goods_attr_format = JSON.parse(this.goodsSkuDetail.goods_attr_format);
|
||||
this.goodsSkuDetail.goods_attr_format = this.$util.unique(goods_attr_format, "attr_id");
|
||||
for (var i = 0; i < this.goodsSkuDetail.goods_attr_format.length; i++) {
|
||||
for (var j = 0; j < goods_attr_format.length; j++) {
|
||||
if (this.goodsSkuDetail.goods_attr_format[i].attr_id == goods_attr_format[j].attr_id && this.goodsSkuDetail.goods_attr_format[i].attr_value_id != goods_attr_format[j].attr_value_id) {
|
||||
this.goodsSkuDetail.goods_attr_format[i].attr_value_name += "、" + goods_attr_format[j].attr_value_name;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 商品SKU格式
|
||||
if (this.goodsSkuDetail.goods_spec_format) this.goodsSkuDetail.goods_spec_format = JSON.parse(this.goodsSkuDetail.goods_spec_format);
|
||||
|
||||
// 商品详情
|
||||
if (this.goodsSkuDetail.goods_content) this.goodsSkuDetail.goods_content = (this.goodsSkuDetail.goods_content);
|
||||
console.log(this.goodsSkuDetail.goods_content)
|
||||
// if (this.goodsSkuDetail.goods_content) this.goodsSkuDetail.goods_content = htmlParser(this.goodsSkuDetail.goods_content);
|
||||
|
||||
//商品服务
|
||||
if (this.goodsSkuDetail.goods_service) {
|
||||
for (let i in this.goodsSkuDetail.goods_service) {
|
||||
this.goodsSkuDetail.goods_service[i]['icon'] = this.goodsSkuDetail.goods_service[i]['icon'] ? JSON.parse(this.goodsSkuDetail.goods_service[i]['icon']) : '';
|
||||
}
|
||||
}
|
||||
|
||||
this.contactData = {
|
||||
title: this.goodsSkuDetail.sku_name,
|
||||
path: this.shareUrl,
|
||||
img: this.$util.img(this.goodsSkuDetail.sku_image, {
|
||||
size: 'big'
|
||||
})
|
||||
};
|
||||
if (this.$refs.goodsPromotion) this.$refs.goodsPromotion.refresh(this.goodsSkuDetail.goods_promotion);
|
||||
|
||||
this.setPublicShare();
|
||||
// if (this.goodsRoute != '/pages/goods/detail') this.setPublicShare();
|
||||
|
||||
this.getBarrageData();
|
||||
if (this.addonIsExist.form) {
|
||||
this.getGoodsForm();
|
||||
}
|
||||
},
|
||||
/**
|
||||
* 刷新商品详情数据
|
||||
* @param {Object} data
|
||||
*/
|
||||
refreshGoodsSkuDetail(data) {
|
||||
this.goodsSkuDetail = Object.assign({}, this.goodsSkuDetail, data);
|
||||
if (this.$refs.goodsPromotion) this.$refs.goodsPromotion.refresh(this.goodsSkuDetail.goods_promotion);
|
||||
if (this.$refs.goodsDetailView) {
|
||||
|
||||
// 初始化商品详情视图数据
|
||||
this.goodsSkuDetail.unit = this.goodsSkuDetail.unit || "件";
|
||||
|
||||
// 解决轮播图数量不一致时,切换到第一个
|
||||
if (this.swiperCurrent > this.goodsSkuDetail.sku_images.length) {
|
||||
this.swiperAutoplay = true;
|
||||
this.swiperCurrent = 1;
|
||||
setTimeout(() => {
|
||||
this.swiperAutoplay = false;
|
||||
}, 40);
|
||||
}
|
||||
|
||||
}
|
||||
this.navbarData.title = this.goodsSkuDetail.goods_name.length > 9 ? this.goodsSkuDetail.goods_name.substr(0, 9) + "..." : this.goodsSkuDetail.goods_name;
|
||||
this.$langConfig.title(this.navbarData.title);
|
||||
|
||||
if (this.goodsSkuDetail.membercard) {
|
||||
this.membercard = this.goodsSkuDetail.membercard;
|
||||
}
|
||||
},
|
||||
goodsDetailViewInit() {
|
||||
// 初始化商品详情视图数据
|
||||
if (this.$refs.goodsDetailView) this.$refs.goodsDetailView.init({
|
||||
sku_id: this.skuId,
|
||||
goods_id: this.goodsSkuDetail.goods_id,
|
||||
preview: this.preview,
|
||||
source_member: this.source_member,
|
||||
posterParams: this.posterParams,
|
||||
posterApi: this.posterApi,
|
||||
shareUrl: this.shareUrl,
|
||||
goodsRoute: this.goodsRoute,
|
||||
isVirtual: this.goodsSkuDetail.is_virtual,
|
||||
deliveryType: this.goodsSkuDetail.express_type,
|
||||
whetherCollection: this.goodsSkuDetail.is_collect,
|
||||
evaluateConfig: this.goodsSkuDetail.evaluate_config,
|
||||
evaluateList: this.goodsSkuDetail.evaluate_list,
|
||||
evaluateCount: this.goodsSkuDetail.evaluate_count
|
||||
});
|
||||
},
|
||||
goHome() {
|
||||
if (this.preview) return; // 开启预览,禁止任何操作和跳转
|
||||
this.$util.redirectTo('/pages/index/index');
|
||||
},
|
||||
goCart() {
|
||||
if (this.preview) return; // 开启预览,禁止任何操作和跳转
|
||||
this.$util.redirectTo('/pages/goods/cart');
|
||||
},
|
||||
//-------------------------------------关注-------------------------------------
|
||||
//更新商品信息
|
||||
modifyGoodsInfo() {
|
||||
if (this.preview) return; // 开启预览,禁止任何操作和跳转
|
||||
//更新商品点击量
|
||||
this.$api.sendRequest({
|
||||
url: "/api/goods/modifyclicks",
|
||||
data: {
|
||||
sku_id: this.skuId
|
||||
},
|
||||
success: res => {
|
||||
}
|
||||
});
|
||||
|
||||
//添加足迹
|
||||
this.$api.sendRequest({
|
||||
url: "/api/goodsbrowse/add",
|
||||
data: {
|
||||
goods_id: this.goodsSkuDetail.goods_id,
|
||||
sku_id: this.skuId
|
||||
},
|
||||
success: res => {
|
||||
}
|
||||
});
|
||||
},
|
||||
//-------------------------------------关注-------------------------------------
|
||||
async editCollection() {
|
||||
if (this.$refs.goodsDetailView) {
|
||||
this.whetherCollection = await this.$refs.goodsDetailView.collection();
|
||||
}
|
||||
},
|
||||
openSharePopup() {
|
||||
if (this.$refs.goodsDetailView) {
|
||||
this.$refs.goodsDetailView.openSharePopup();
|
||||
}
|
||||
},
|
||||
//弹幕
|
||||
getBarrageData() {
|
||||
this.$api.sendRequest({
|
||||
url: '/api/goods/goodsbarrage',
|
||||
data: {
|
||||
goods_id: this.goodsSkuDetail.goods_id
|
||||
},
|
||||
success: res => {
|
||||
if (res.code == 0 && res.data) {
|
||||
let barrageData = [];
|
||||
for (let i in res.data.list) {
|
||||
if (res.data.list[i]['title']) {
|
||||
let title = res.data.list[i]['title'].substr(0, 1) + '*' + res.data.list[i]['title'].substr(res.data.list[i]['title'].length - 1, 1)
|
||||
barrageData.push({
|
||||
img: res.data.list[i]['img'] ? res.data.list[i]['img'] : this.$util.getDefaultImage().head,
|
||||
title: title + '已下单'
|
||||
});
|
||||
}
|
||||
}
|
||||
this.goodsSkuDetail.barrageData = barrageData;
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
/**
|
||||
* 设置公众号分享
|
||||
*/
|
||||
setPublicShare() {
|
||||
let shareUrl = this.$config.h5Domain + this.shareUrl;
|
||||
if (this.memberInfo && this.memberInfo.member_id) shareUrl += '&source_member=' + this.memberInfo.member_id;
|
||||
var store_info = this.$store.state.globalStoreInfo;
|
||||
if (store_info) shareUrl+= '&store_id=' + store_info.store_id;
|
||||
this.$util.setPublicShare({
|
||||
title: this.goodsSkuDetail.goods_name,
|
||||
desc: '',
|
||||
link: shareUrl,
|
||||
imgUrl: typeof this.goodsSkuDetail.goods_image == 'object' ? this.goodsSkuDetail.goods_image[0] : this.goodsSkuDetail.goods_image.split(',')[0]
|
||||
})
|
||||
},
|
||||
/**
|
||||
* 获取商品表单
|
||||
*/
|
||||
getGoodsForm() {
|
||||
this.$api.sendRequest({
|
||||
url: "/form/api/form/goodsform",
|
||||
data: {
|
||||
goods_id: this.goodsSkuDetail.goods_id
|
||||
},
|
||||
success: res => {
|
||||
if (res.code == 0 && res.data) this.$set(this.goodsSkuDetail, 'goods_form', res.data);
|
||||
}
|
||||
});
|
||||
}
|
||||
},
|
||||
/**
|
||||
* 自定义分享内容
|
||||
* @param {Object} res
|
||||
*/
|
||||
onShareAppMessage(res) {
|
||||
var path = this.shareUrl;
|
||||
var store_info = this.$store.state.globalStoreInfo;
|
||||
if (store_info) path+= '&store_id=' + store_info.store_id;
|
||||
if (this.memberInfo && this.memberInfo.member_id) path += '&source_member=' + this.memberInfo.member_id;
|
||||
return {
|
||||
title: this.goodsSkuDetail.sku_name,
|
||||
imageUrl: this.shareImg ? this.$util.img(this.shareImg) : this.$util.img(this.goodsSkuDetail.sku_image, {
|
||||
size: 'big'
|
||||
}),
|
||||
path: path,
|
||||
success: res => {
|
||||
},
|
||||
fail: res => {
|
||||
}
|
||||
};
|
||||
},
|
||||
// 分享到微信朋友圈
|
||||
// #ifdef MP-WEIXIN
|
||||
onShareTimeline() {
|
||||
let query = this.shareQuery;
|
||||
var store_info = this.$store.state.globalStoreInfo;
|
||||
if (store_info) query+= '&store_id=' + store_info.store_id;
|
||||
if (this.memberInfo && this.memberInfo.member_id) query += '&source_member=' + this.memberInfo.member_id;
|
||||
return {
|
||||
title: this.goodsSkuDetail.sku_name,
|
||||
query: query,
|
||||
imageUrl: this.$util.img(this.goodsSkuDetail.sku_image, {
|
||||
size: 'big'
|
||||
})
|
||||
};
|
||||
}
|
||||
// #endif
|
||||
}
|
||||
@@ -1,440 +1,440 @@
|
||||
import util from './util.js'
|
||||
/*
|
||||
* HTML5 Parser By Sam Blowes
|
||||
*
|
||||
* Designed for HTML5 documents
|
||||
*
|
||||
* Original code by John Resig (ejohn.org)
|
||||
* http://ejohn.org/blog/pure-javascript-html-parser/
|
||||
* Original code by Erik Arvidsson, Mozilla Public License
|
||||
* http://erik.eae.net/simplehtmlparser/simplehtmlparser.js
|
||||
*
|
||||
* ----------------------------------------------------------------------------
|
||||
* License
|
||||
* ----------------------------------------------------------------------------
|
||||
*
|
||||
* This code is triple licensed using Apache Software License 2.0,
|
||||
* Mozilla Public License or GNU Public License
|
||||
*
|
||||
* ////////////////////////////////////////////////////////////////////////////
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
|
||||
* use this file except in compliance with the License. You may obtain a copy
|
||||
* of the License at http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* ////////////////////////////////////////////////////////////////////////////
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License
|
||||
* Version 1.1 (the "License"); you may not use this file except in
|
||||
* compliance with the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS"
|
||||
* basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing rights and limitations
|
||||
* under the License.
|
||||
*
|
||||
* The Original Code is Simple HTML Parser.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Erik Arvidsson.
|
||||
* Portions created by Erik Arvidssson are Copyright (C) 2004. All Rights
|
||||
* Reserved.
|
||||
*
|
||||
* ////////////////////////////////////////////////////////////////////////////
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*
|
||||
* ----------------------------------------------------------------------------
|
||||
* Usage
|
||||
* ----------------------------------------------------------------------------
|
||||
*
|
||||
* // Use like so:
|
||||
* HTMLParser(htmlString, {
|
||||
* start: function(tag, attrs, unary) {},
|
||||
* end: function(tag) {},
|
||||
* chars: function(text) {},
|
||||
* comment: function(text) {}
|
||||
* });
|
||||
*
|
||||
* // or to get an XML string:
|
||||
* HTMLtoXML(htmlString);
|
||||
*
|
||||
* // or to get an XML DOM Document
|
||||
* HTMLtoDOM(htmlString);
|
||||
*
|
||||
* // or to inject into an existing document/DOM node
|
||||
* HTMLtoDOM(htmlString, document);
|
||||
* HTMLtoDOM(htmlString, document.body);
|
||||
*
|
||||
*/
|
||||
// Regular Expressions for parsing tags and attributes
|
||||
var startTag =
|
||||
/^<([-A-Za-z0-9_]+)((?:\s+[a-zA-Z_:][-a-zA-Z0-9_:.]*(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)>/;
|
||||
var endTag = /^<\/([-A-Za-z0-9_]+)[^>]*>/;
|
||||
var attr =
|
||||
/([a-zA-Z_:][-a-zA-Z0-9_:.]*)(?:\s*=\s*(?:(?:"((?:\\.|[^"])*)")|(?:'((?:\\.|[^'])*)')|([^>\s]+)))?/g; // Empty Elements - HTML 5
|
||||
|
||||
var empty = makeMap(
|
||||
'area,base,basefont,br,col,frame,hr,img,input,link,meta,param,embed,command,keygen,source,track,wbr'
|
||||
); // Block Elements - HTML 5
|
||||
// fixed by xxx 将 ins 标签从块级名单中移除
|
||||
|
||||
var block = makeMap(
|
||||
'a,address,article,applet,aside,audio,blockquote,button,canvas,center,dd,del,dir,div,dl,dt,fieldset,figcaption,figure,footer,form,frameset,h1,h2,h3,h4,h5,h6,header,hgroup,hr,iframe,isindex,li,map,menu,noframes,noscript,object,ol,output,p,pre,section,script,table,tbody,td,tfoot,th,thead,tr,ul,video'
|
||||
); // Inline Elements - HTML 5
|
||||
|
||||
var inline = makeMap(
|
||||
'abbr,acronym,applet,b,basefont,bdo,big,br,button,cite,code,del,dfn,em,font,i,iframe,img,input,ins,kbd,label,map,object,q,s,samp,script,select,small,span,strike,strong,sub,sup,textarea,tt,u,var'
|
||||
); // Elements that you can, intentionally, leave open
|
||||
// (and which close themselves)
|
||||
|
||||
var closeSelf = makeMap(
|
||||
'colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr'); // Attributes that have their values filled in disabled="disabled"
|
||||
|
||||
var fillAttrs = makeMap(
|
||||
'checked,compact,declare,defer,disabled,ismap,multiple,nohref,noresize,noshade,nowrap,readonly,selected'
|
||||
); // Special Elements (can contain anything)
|
||||
|
||||
var special = makeMap('script,style');
|
||||
|
||||
function HTMLParser(html, handler) {
|
||||
var index;
|
||||
var chars;
|
||||
var match;
|
||||
var stack = [];
|
||||
var last = html;
|
||||
|
||||
stack.last = function() {
|
||||
return this[this.length - 1];
|
||||
};
|
||||
|
||||
while (html) {
|
||||
chars = true; // Make sure we're not in a script or style element
|
||||
if (!stack.last() || !special[stack.last()]) {
|
||||
// Comment
|
||||
if (html.indexOf('<!--') == 0) {
|
||||
index = html.indexOf('-->');
|
||||
|
||||
if (index >= 0) {
|
||||
if (handler.comment) {
|
||||
handler.comment(html.substring(4, index));
|
||||
}
|
||||
|
||||
html = html.substring(index + 3);
|
||||
chars = false;
|
||||
} // end tag
|
||||
|
||||
} else if (html.indexOf('</') == 0) {
|
||||
match = html.match(endTag);
|
||||
|
||||
if (match) {
|
||||
html = html.substring(match[0].length);
|
||||
match[0].replace(endTag, parseEndTag);
|
||||
chars = false;
|
||||
} // start tag
|
||||
|
||||
} else if (html.indexOf('<') == 0) {
|
||||
match = html.match(startTag);
|
||||
|
||||
if (match) {
|
||||
html = html.substring(match[0].length);
|
||||
match[0].replace(startTag, parseStartTag);
|
||||
chars = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (chars) {
|
||||
index = html.indexOf('<');
|
||||
var text = index < 0 ? html : html.substring(0, index);
|
||||
html = index < 0 ? '' : html.substring(index);
|
||||
|
||||
if (handler.chars) {
|
||||
handler.chars(text);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
html = html.replace(new RegExp('([\\s\\S]*?)<\/' + stack.last() + '[^>]*>'), function(all, text) {
|
||||
text = text.replace(/<!--([\s\S]*?)-->|<!\[CDATA\[([\s\S]*?)]]>/g, '$1$2');
|
||||
|
||||
if (handler.chars) {
|
||||
handler.chars(text);
|
||||
}
|
||||
|
||||
return '';
|
||||
});
|
||||
parseEndTag('', stack.last());
|
||||
}
|
||||
|
||||
|
||||
if (html == last) {
|
||||
throw 'Parse Error: ' + html;
|
||||
}
|
||||
|
||||
last = html;
|
||||
} // Clean up any remaining tags
|
||||
|
||||
|
||||
parseEndTag();
|
||||
|
||||
function parseStartTag(tag, tagName, rest, unary) {
|
||||
tagName = tagName.toLowerCase();
|
||||
|
||||
if (block[tagName]) {
|
||||
while (stack.last() && inline[stack.last()]) {
|
||||
parseEndTag('', stack.last());
|
||||
}
|
||||
}
|
||||
|
||||
if (closeSelf[tagName] && stack.last() == tagName) {
|
||||
parseEndTag('', tagName);
|
||||
}
|
||||
|
||||
unary = empty[tagName] || !!unary;
|
||||
|
||||
if (!unary) {
|
||||
stack.push(tagName);
|
||||
}
|
||||
|
||||
if (handler.start) {
|
||||
var attrs = [];
|
||||
rest.replace(attr, function(match, name) {
|
||||
var value = arguments[2] ? arguments[2] : arguments[3] ? arguments[3] : arguments[4] ?
|
||||
arguments[4] : fillAttrs[
|
||||
name] ? name : '';
|
||||
attrs.push({
|
||||
name: name,
|
||||
value: value,
|
||||
escaped: value.replace(/(^|[^\\])"/g, '$1\\\"') // "
|
||||
|
||||
});
|
||||
});
|
||||
|
||||
if (handler.start) {
|
||||
handler.start(tagName, attrs, unary);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function parseEndTag(tag, tagName) {
|
||||
// If no tag name is provided, clean shop
|
||||
if (!tagName) {
|
||||
var pos = 0;
|
||||
} // Find the closest opened tag of the same type
|
||||
else {
|
||||
for (var pos = stack.length - 1; pos >= 0; pos--) {
|
||||
if (stack[pos] == tagName) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (pos >= 0) {
|
||||
// Close all the open elements, up the stack
|
||||
for (var i = stack.length - 1; i >= pos; i--) {
|
||||
if (handler.end) {
|
||||
handler.end(stack[i]);
|
||||
}
|
||||
} // Remove the open elements from the stack
|
||||
|
||||
|
||||
stack.length = pos;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function makeMap(str) {
|
||||
var obj = {};
|
||||
var items = str.split(',');
|
||||
|
||||
for (var i = 0; i < items.length; i++) {
|
||||
obj[items[i]] = true;
|
||||
}
|
||||
|
||||
return obj;
|
||||
}
|
||||
|
||||
function removeDOCTYPE(html) {
|
||||
return html.replace(/<\?xml.*\?>\n/, '').replace(/<!doctype.*>\n/, '').replace(/<!DOCTYPE.*>\n/, '');
|
||||
}
|
||||
|
||||
/**
|
||||
* 忽略注释
|
||||
* @param {Object} html
|
||||
*/
|
||||
function replaceAnnotation(html) {
|
||||
var html = html.replace(/<!--[\s\S]*-->/gi, '');
|
||||
return html;
|
||||
}
|
||||
|
||||
/**
|
||||
* 替换图片
|
||||
* @param {Object} html
|
||||
*/
|
||||
function replaceImage(html) {
|
||||
|
||||
// #ifdef MP
|
||||
let info = uni.getSystemInfoSync();
|
||||
var screenWidth = info.windowWidth;
|
||||
screenWidth -= 20;
|
||||
screenWidth += 'px';
|
||||
// #endif
|
||||
|
||||
// #ifdef H5
|
||||
var screenWidth = '100%';
|
||||
// #endif
|
||||
|
||||
let rep = `<img style="width:100% !important;display:block;max-width: ${screenWidth} !important;"`;
|
||||
var html = html.replace(/\\/g, '').replace(/<img/g, rep);
|
||||
html = html.replace(/<img [^>]*src=['"]([^'"]+)[^>]*>/gi, (match, capture) => {
|
||||
return rep + ' src="' + util.img(capture) + '"/>';
|
||||
});
|
||||
return html;
|
||||
}
|
||||
function replaceVideo(html){
|
||||
// #ifdef MP
|
||||
let info = uni.getSystemInfoSync();
|
||||
var screenWidth = info.windowWidth;
|
||||
screenWidth -= 20;
|
||||
screenWidth += 'px';
|
||||
// #endif
|
||||
|
||||
// #ifdef H5
|
||||
var screenWidth = '100%';
|
||||
// #endif
|
||||
|
||||
let rep = `<video style="width:100% !important;display:block;max-width: ${screenWidth} !important;"`;
|
||||
var html = html.replace(/\\/g, '').replace(/<video/g, rep);
|
||||
console.log(html)
|
||||
html = html.replace(/<video [^>]*src=['"]([^'"]+)[^>]*>/gi, (match, capture) => {
|
||||
return rep + ' src="' + util.img(capture) + '"/>';
|
||||
});
|
||||
// console.log(html)
|
||||
return html;
|
||||
}
|
||||
|
||||
/**
|
||||
* 将style属性中的双引号改为单引号
|
||||
* @param {Object} html
|
||||
*/
|
||||
function replaceStyleQuotes(html) {
|
||||
var html = html.replace(/style\s*=\s*["][^>]*;[^"]?/gi, (match, capture) => {
|
||||
match = match.replace(/[:](\s?)[\s\S]*/gi, (a, b) => {
|
||||
return a.replace(/"/g, "'");
|
||||
});
|
||||
return match;
|
||||
});
|
||||
return html;
|
||||
}
|
||||
|
||||
function parseAttrs(attrs) {
|
||||
return attrs.reduce(function(pre, attr) {
|
||||
var value = attr.value;
|
||||
var name = attr.name;
|
||||
|
||||
if (pre[name]) {
|
||||
pre[name] = pre[name] + " " + value;
|
||||
} else {
|
||||
pre[name] = value;
|
||||
}
|
||||
|
||||
return pre;
|
||||
}, {});
|
||||
}
|
||||
|
||||
function parseHtml(html) {
|
||||
html = removeDOCTYPE(html);
|
||||
html = replaceAnnotation(html); //忽略注释
|
||||
html = replaceImage(html); //替换图片
|
||||
html = replaceStyleQuotes(html); //将style属性中的双引号改为单引号
|
||||
|
||||
html = replaceVideo(html); //替换视频链接
|
||||
var stacks = [];
|
||||
var results = {
|
||||
node: 'root',
|
||||
children: []
|
||||
};
|
||||
HTMLParser(html, {
|
||||
start: function start(tag, attrs, unary) {
|
||||
var node = {
|
||||
name: tag
|
||||
};
|
||||
|
||||
if (attrs.length !== 0) {
|
||||
node.attrs = parseAttrs(attrs);
|
||||
}
|
||||
|
||||
if (unary) {
|
||||
var parent = stacks[0] || results;
|
||||
|
||||
if (!parent.children) {
|
||||
parent.children = [];
|
||||
}
|
||||
|
||||
parent.children.push(node);
|
||||
} else {
|
||||
stacks.unshift(node);
|
||||
}
|
||||
},
|
||||
end: function end(tag) {
|
||||
var node = stacks.shift();
|
||||
if (node.name !== tag) console.error('invalid state: mismatch end tag');
|
||||
if (stacks.length === 0) {
|
||||
results.children.push(node);
|
||||
} else {
|
||||
var parent = stacks[0];
|
||||
|
||||
if (!parent.children) {
|
||||
parent.children = [];
|
||||
}
|
||||
|
||||
parent.children.push(node);
|
||||
}
|
||||
},
|
||||
chars: function chars(text) {
|
||||
var node = {
|
||||
type: 'text',
|
||||
text: text
|
||||
};
|
||||
|
||||
if (stacks.length === 0) {
|
||||
results.children.push(node);
|
||||
} else {
|
||||
var parent = stacks[0];
|
||||
|
||||
if (!parent.children) {
|
||||
parent.children = [];
|
||||
}
|
||||
|
||||
parent.children.push(node);
|
||||
}
|
||||
},
|
||||
comment: function comment(text) {
|
||||
var node = {
|
||||
node: 'comment',
|
||||
text: text
|
||||
};
|
||||
var parent = stacks[0];
|
||||
|
||||
if (!parent.children) {
|
||||
parent.children = [];
|
||||
}
|
||||
|
||||
parent.children.push(node);
|
||||
}
|
||||
});
|
||||
return results.children;
|
||||
}
|
||||
|
||||
import util from './util.js'
|
||||
/*
|
||||
* HTML5 Parser By Sam Blowes
|
||||
*
|
||||
* Designed for HTML5 documents
|
||||
*
|
||||
* Original code by John Resig (ejohn.org)
|
||||
* http://ejohn.org/blog/pure-javascript-html-parser/
|
||||
* Original code by Erik Arvidsson, Mozilla Public License
|
||||
* http://erik.eae.net/simplehtmlparser/simplehtmlparser.js
|
||||
*
|
||||
* ----------------------------------------------------------------------------
|
||||
* License
|
||||
* ----------------------------------------------------------------------------
|
||||
*
|
||||
* This code is triple licensed using Apache Software License 2.0,
|
||||
* Mozilla Public License or GNU Public License
|
||||
*
|
||||
* ////////////////////////////////////////////////////////////////////////////
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
|
||||
* use this file except in compliance with the License. You may obtain a copy
|
||||
* of the License at http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* ////////////////////////////////////////////////////////////////////////////
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License
|
||||
* Version 1.1 (the "License"); you may not use this file except in
|
||||
* compliance with the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS"
|
||||
* basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing rights and limitations
|
||||
* under the License.
|
||||
*
|
||||
* The Original Code is Simple HTML Parser.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Erik Arvidsson.
|
||||
* Portions created by Erik Arvidssson are Copyright (C) 2004. All Rights
|
||||
* Reserved.
|
||||
*
|
||||
* ////////////////////////////////////////////////////////////////////////////
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*
|
||||
* ----------------------------------------------------------------------------
|
||||
* Usage
|
||||
* ----------------------------------------------------------------------------
|
||||
*
|
||||
* // Use like so:
|
||||
* HTMLParser(htmlString, {
|
||||
* start: function(tag, attrs, unary) {},
|
||||
* end: function(tag) {},
|
||||
* chars: function(text) {},
|
||||
* comment: function(text) {}
|
||||
* });
|
||||
*
|
||||
* // or to get an XML string:
|
||||
* HTMLtoXML(htmlString);
|
||||
*
|
||||
* // or to get an XML DOM Document
|
||||
* HTMLtoDOM(htmlString);
|
||||
*
|
||||
* // or to inject into an existing document/DOM node
|
||||
* HTMLtoDOM(htmlString, document);
|
||||
* HTMLtoDOM(htmlString, document.body);
|
||||
*
|
||||
*/
|
||||
// Regular Expressions for parsing tags and attributes
|
||||
var startTag =
|
||||
/^<([-A-Za-z0-9_]+)((?:\s+[a-zA-Z_:][-a-zA-Z0-9_:.]*(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)>/;
|
||||
var endTag = /^<\/([-A-Za-z0-9_]+)[^>]*>/;
|
||||
var attr =
|
||||
/([a-zA-Z_:][-a-zA-Z0-9_:.]*)(?:\s*=\s*(?:(?:"((?:\\.|[^"])*)")|(?:'((?:\\.|[^'])*)')|([^>\s]+)))?/g; // Empty Elements - HTML 5
|
||||
|
||||
var empty = makeMap(
|
||||
'area,base,basefont,br,col,frame,hr,img,input,link,meta,param,embed,command,keygen,source,track,wbr'
|
||||
); // Block Elements - HTML 5
|
||||
// fixed by xxx 将 ins 标签从块级名单中移除
|
||||
|
||||
var block = makeMap(
|
||||
'a,address,article,applet,aside,audio,blockquote,button,canvas,center,dd,del,dir,div,dl,dt,fieldset,figcaption,figure,footer,form,frameset,h1,h2,h3,h4,h5,h6,header,hgroup,hr,iframe,isindex,li,map,menu,noframes,noscript,object,ol,output,p,pre,section,script,table,tbody,td,tfoot,th,thead,tr,ul,video'
|
||||
); // Inline Elements - HTML 5
|
||||
|
||||
var inline = makeMap(
|
||||
'abbr,acronym,applet,b,basefont,bdo,big,br,button,cite,code,del,dfn,em,font,i,iframe,img,input,ins,kbd,label,map,object,q,s,samp,script,select,small,span,strike,strong,sub,sup,textarea,tt,u,var'
|
||||
); // Elements that you can, intentionally, leave open
|
||||
// (and which close themselves)
|
||||
|
||||
var closeSelf = makeMap(
|
||||
'colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr'); // Attributes that have their values filled in disabled="disabled"
|
||||
|
||||
var fillAttrs = makeMap(
|
||||
'checked,compact,declare,defer,disabled,ismap,multiple,nohref,noresize,noshade,nowrap,readonly,selected'
|
||||
); // Special Elements (can contain anything)
|
||||
|
||||
var special = makeMap('script,style');
|
||||
|
||||
function HTMLParser(html, handler) {
|
||||
var index;
|
||||
var chars;
|
||||
var match;
|
||||
var stack = [];
|
||||
var last = html;
|
||||
|
||||
stack.last = function() {
|
||||
return this[this.length - 1];
|
||||
};
|
||||
|
||||
while (html) {
|
||||
chars = true; // Make sure we're not in a script or style element
|
||||
if (!stack.last() || !special[stack.last()]) {
|
||||
// Comment
|
||||
if (html.indexOf('<!--') == 0) {
|
||||
index = html.indexOf('-->');
|
||||
|
||||
if (index >= 0) {
|
||||
if (handler.comment) {
|
||||
handler.comment(html.substring(4, index));
|
||||
}
|
||||
|
||||
html = html.substring(index + 3);
|
||||
chars = false;
|
||||
} // end tag
|
||||
|
||||
} else if (html.indexOf('</') == 0) {
|
||||
match = html.match(endTag);
|
||||
|
||||
if (match) {
|
||||
html = html.substring(match[0].length);
|
||||
match[0].replace(endTag, parseEndTag);
|
||||
chars = false;
|
||||
} // start tag
|
||||
|
||||
} else if (html.indexOf('<') == 0) {
|
||||
match = html.match(startTag);
|
||||
|
||||
if (match) {
|
||||
html = html.substring(match[0].length);
|
||||
match[0].replace(startTag, parseStartTag);
|
||||
chars = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (chars) {
|
||||
index = html.indexOf('<');
|
||||
var text = index < 0 ? html : html.substring(0, index);
|
||||
html = index < 0 ? '' : html.substring(index);
|
||||
|
||||
if (handler.chars) {
|
||||
handler.chars(text);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
html = html.replace(new RegExp('([\\s\\S]*?)<\/' + stack.last() + '[^>]*>'), function(all, text) {
|
||||
text = text.replace(/<!--([\s\S]*?)-->|<!\[CDATA\[([\s\S]*?)]]>/g, '$1$2');
|
||||
|
||||
if (handler.chars) {
|
||||
handler.chars(text);
|
||||
}
|
||||
|
||||
return '';
|
||||
});
|
||||
parseEndTag('', stack.last());
|
||||
}
|
||||
|
||||
|
||||
if (html == last) {
|
||||
throw 'Parse Error: ' + html;
|
||||
}
|
||||
|
||||
last = html;
|
||||
} // Clean up any remaining tags
|
||||
|
||||
|
||||
parseEndTag();
|
||||
|
||||
function parseStartTag(tag, tagName, rest, unary) {
|
||||
tagName = tagName.toLowerCase();
|
||||
|
||||
if (block[tagName]) {
|
||||
while (stack.last() && inline[stack.last()]) {
|
||||
parseEndTag('', stack.last());
|
||||
}
|
||||
}
|
||||
|
||||
if (closeSelf[tagName] && stack.last() == tagName) {
|
||||
parseEndTag('', tagName);
|
||||
}
|
||||
|
||||
unary = empty[tagName] || !!unary;
|
||||
|
||||
if (!unary) {
|
||||
stack.push(tagName);
|
||||
}
|
||||
|
||||
if (handler.start) {
|
||||
var attrs = [];
|
||||
rest.replace(attr, function(match, name) {
|
||||
var value = arguments[2] ? arguments[2] : arguments[3] ? arguments[3] : arguments[4] ?
|
||||
arguments[4] : fillAttrs[
|
||||
name] ? name : '';
|
||||
attrs.push({
|
||||
name: name,
|
||||
value: value,
|
||||
escaped: value.replace(/(^|[^\\])"/g, '$1\\\"') // "
|
||||
|
||||
});
|
||||
});
|
||||
|
||||
if (handler.start) {
|
||||
handler.start(tagName, attrs, unary);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function parseEndTag(tag, tagName) {
|
||||
// If no tag name is provided, clean shop
|
||||
if (!tagName) {
|
||||
var pos = 0;
|
||||
} // Find the closest opened tag of the same type
|
||||
else {
|
||||
for (var pos = stack.length - 1; pos >= 0; pos--) {
|
||||
if (stack[pos] == tagName) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (pos >= 0) {
|
||||
// Close all the open elements, up the stack
|
||||
for (var i = stack.length - 1; i >= pos; i--) {
|
||||
if (handler.end) {
|
||||
handler.end(stack[i]);
|
||||
}
|
||||
} // Remove the open elements from the stack
|
||||
|
||||
|
||||
stack.length = pos;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function makeMap(str) {
|
||||
var obj = {};
|
||||
var items = str.split(',');
|
||||
|
||||
for (var i = 0; i < items.length; i++) {
|
||||
obj[items[i]] = true;
|
||||
}
|
||||
|
||||
return obj;
|
||||
}
|
||||
|
||||
function removeDOCTYPE(html) {
|
||||
return html.replace(/<\?xml.*\?>\n/, '').replace(/<!doctype.*>\n/, '').replace(/<!DOCTYPE.*>\n/, '');
|
||||
}
|
||||
|
||||
/**
|
||||
* 忽略注释
|
||||
* @param {Object} html
|
||||
*/
|
||||
function replaceAnnotation(html) {
|
||||
var html = html.replace(/<!--[\s\S]*-->/gi, '');
|
||||
return html;
|
||||
}
|
||||
|
||||
/**
|
||||
* 替换图片
|
||||
* @param {Object} html
|
||||
*/
|
||||
function replaceImage(html) {
|
||||
|
||||
// #ifdef MP
|
||||
let info = uni.getWindowInfo();
|
||||
var screenWidth = info.windowWidth;
|
||||
screenWidth -= 20;
|
||||
screenWidth += 'px';
|
||||
// #endif
|
||||
|
||||
// #ifdef H5
|
||||
var screenWidth = '100%';
|
||||
// #endif
|
||||
|
||||
let rep = `<img style="width:100% !important;display:block;max-width: ${screenWidth} !important;"`;
|
||||
var html = html.replace(/\\/g, '').replace(/<img/g, rep);
|
||||
html = html.replace(/<img [^>]*src=['"]([^'"]+)[^>]*>/gi, (match, capture) => {
|
||||
return rep + ' src="' + util.img(capture) + '"/>';
|
||||
});
|
||||
return html;
|
||||
}
|
||||
function replaceVideo(html){
|
||||
// #ifdef MP
|
||||
let info = uni.getWindowInfo();
|
||||
var screenWidth = info.windowWidth;
|
||||
screenWidth -= 20;
|
||||
screenWidth += 'px';
|
||||
// #endif
|
||||
|
||||
// #ifdef H5
|
||||
var screenWidth = '100%';
|
||||
// #endif
|
||||
|
||||
let rep = `<video style="width:100% !important;display:block;max-width: ${screenWidth} !important;"`;
|
||||
var html = html.replace(/\\/g, '').replace(/<video/g, rep);
|
||||
console.log(html)
|
||||
html = html.replace(/<video [^>]*src=['"]([^'"]+)[^>]*>/gi, (match, capture) => {
|
||||
return rep + ' src="' + util.img(capture) + '"/>';
|
||||
});
|
||||
// console.log(html)
|
||||
return html;
|
||||
}
|
||||
|
||||
/**
|
||||
* 将style属性中的双引号改为单引号
|
||||
* @param {Object} html
|
||||
*/
|
||||
function replaceStyleQuotes(html) {
|
||||
var html = html.replace(/style\s*=\s*["][^>]*;[^"]?/gi, (match, capture) => {
|
||||
match = match.replace(/[:](\s?)[\s\S]*/gi, (a, b) => {
|
||||
return a.replace(/"/g, "'");
|
||||
});
|
||||
return match;
|
||||
});
|
||||
return html;
|
||||
}
|
||||
|
||||
function parseAttrs(attrs) {
|
||||
return attrs.reduce(function(pre, attr) {
|
||||
var value = attr.value;
|
||||
var name = attr.name;
|
||||
|
||||
if (pre[name]) {
|
||||
pre[name] = pre[name] + " " + value;
|
||||
} else {
|
||||
pre[name] = value;
|
||||
}
|
||||
|
||||
return pre;
|
||||
}, {});
|
||||
}
|
||||
|
||||
function parseHtml(html) {
|
||||
html = removeDOCTYPE(html);
|
||||
html = replaceAnnotation(html); //忽略注释
|
||||
html = replaceImage(html); //替换图片
|
||||
html = replaceStyleQuotes(html); //将style属性中的双引号改为单引号
|
||||
|
||||
html = replaceVideo(html); //替换视频链接
|
||||
var stacks = [];
|
||||
var results = {
|
||||
node: 'root',
|
||||
children: []
|
||||
};
|
||||
HTMLParser(html, {
|
||||
start: function start(tag, attrs, unary) {
|
||||
var node = {
|
||||
name: tag
|
||||
};
|
||||
|
||||
if (attrs.length !== 0) {
|
||||
node.attrs = parseAttrs(attrs);
|
||||
}
|
||||
|
||||
if (unary) {
|
||||
var parent = stacks[0] || results;
|
||||
|
||||
if (!parent.children) {
|
||||
parent.children = [];
|
||||
}
|
||||
|
||||
parent.children.push(node);
|
||||
} else {
|
||||
stacks.unshift(node);
|
||||
}
|
||||
},
|
||||
end: function end(tag) {
|
||||
var node = stacks.shift();
|
||||
if (node.name !== tag) console.error('invalid state: mismatch end tag');
|
||||
if (stacks.length === 0) {
|
||||
results.children.push(node);
|
||||
} else {
|
||||
var parent = stacks[0];
|
||||
|
||||
if (!parent.children) {
|
||||
parent.children = [];
|
||||
}
|
||||
|
||||
parent.children.push(node);
|
||||
}
|
||||
},
|
||||
chars: function chars(text) {
|
||||
var node = {
|
||||
type: 'text',
|
||||
text: text
|
||||
};
|
||||
|
||||
if (stacks.length === 0) {
|
||||
results.children.push(node);
|
||||
} else {
|
||||
var parent = stacks[0];
|
||||
|
||||
if (!parent.children) {
|
||||
parent.children = [];
|
||||
}
|
||||
|
||||
parent.children.push(node);
|
||||
}
|
||||
},
|
||||
comment: function comment(text) {
|
||||
var node = {
|
||||
node: 'comment',
|
||||
text: text
|
||||
};
|
||||
var parent = stacks[0];
|
||||
|
||||
if (!parent.children) {
|
||||
parent.children = [];
|
||||
}
|
||||
|
||||
parent.children.push(node);
|
||||
}
|
||||
});
|
||||
return results.children;
|
||||
}
|
||||
|
||||
export default parseHtml;
|
||||
@@ -1,255 +1,289 @@
|
||||
import Config from './config.js'
|
||||
import Util from './util.js'
|
||||
import store from '@/store/index.js'
|
||||
|
||||
// #ifdef H5
|
||||
const app_type = Util.isWeiXin() ? 'wechat' : 'h5';
|
||||
const app_type_name = Util.isWeiXin() ? '微信公众号' : 'H5';
|
||||
// #endif
|
||||
|
||||
// #ifdef MP-WEIXIN
|
||||
const app_type = 'weapp';
|
||||
const app_type_name = '微信小程序';
|
||||
// #endif
|
||||
|
||||
// #ifdef MP-ALIPAY
|
||||
const app_type = 'aliapp';
|
||||
const app_type_name = '支付宝小程序';
|
||||
// #endif
|
||||
|
||||
// #ifdef MP-BAIDU
|
||||
const app_type = 'baiduapp';
|
||||
const app_type_name = '百度小程序';
|
||||
// #endif
|
||||
|
||||
// #ifdef MP-TOUTIAO
|
||||
const app_type = 'MP-TOUTIAO';
|
||||
const app_type_name = '头条小程序';
|
||||
// #endif
|
||||
|
||||
// #ifdef MP-QQ
|
||||
const app_type = 'MP-QQ';
|
||||
const app_type_name = 'QQ小程序';
|
||||
// #endif
|
||||
|
||||
// #ifdef APP-PLUS
|
||||
const app_type = 'app';
|
||||
const app_type_name = 'APP';
|
||||
// #endif
|
||||
|
||||
export default {
|
||||
sendRequest(params) {
|
||||
if (!Config.baseUrl) {
|
||||
uni.showToast({
|
||||
title: '未配置请求域名',
|
||||
'icon': 'none',
|
||||
duration: 10000
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
var method = params.data != undefined ? 'POST' : 'GET', // 请求方式
|
||||
url = Config.baseUrl + params.url, // 请求路径
|
||||
data = {
|
||||
app_type,
|
||||
app_type_name
|
||||
};
|
||||
|
||||
// token
|
||||
data.token = store.state.token || '';
|
||||
data.uniacid = Config.uniacid
|
||||
// 门店id
|
||||
var default_store_info = store.state.defaultStoreInfo;
|
||||
if (default_store_info) {
|
||||
data.store_id = default_store_info.store_id;
|
||||
}
|
||||
|
||||
var store_info = store.state.globalStoreInfo;
|
||||
|
||||
if (store_info) data.store_id = store_info.store_id;
|
||||
|
||||
// 参数
|
||||
if (params.data != undefined) Object.assign(data, params.data);
|
||||
|
||||
if (params.async === false) {
|
||||
//同步
|
||||
return new Promise((resolve, reject) => {
|
||||
uni.request({
|
||||
url: url,
|
||||
method: method,
|
||||
data: data,
|
||||
header: params.header || {
|
||||
// 'Accept': 'application/json',
|
||||
'content-type': 'application/x-www-form-urlencoded;application/json'
|
||||
},
|
||||
dataType: params.dataType || 'json',
|
||||
responseType: params.responseType || 'text',
|
||||
success: (res) => {
|
||||
// try {
|
||||
// res.data = JSON.parse(res.data);
|
||||
// } catch (e) {
|
||||
// //TODO handle the exception
|
||||
// console.log('api error:', e);
|
||||
// }
|
||||
if (res.data.code == -3 && store.state.siteState > 0) {
|
||||
store.commit('setSiteState', -3);
|
||||
Util.redirectTo('/pages_tool/storeclose/storeclose', {}, 'reLaunch');
|
||||
return;
|
||||
}
|
||||
if (res.data.refreshtoken) {
|
||||
store.commit('setToken', res.data.refreshtoken);
|
||||
}
|
||||
if (res.data.code == -10009 || res.data.code == -10010) {
|
||||
store.commit('setToken', '');
|
||||
store.commit('setMemberInfo', '');
|
||||
}
|
||||
resolve(res.data);
|
||||
},
|
||||
fail: (res) => {
|
||||
if (res.errMsg && res.errMsg == 'request:fail url not in domain list') {
|
||||
uni.showToast({
|
||||
title: Config.baseUrl + '不在request 合法域名列表中',
|
||||
'icon': 'none',
|
||||
duration: 10000
|
||||
});
|
||||
return;
|
||||
}
|
||||
reject(res);
|
||||
},
|
||||
complete: (res) => {
|
||||
if ((res.errMsg && res.errMsg != "request:ok") || (res.statusCode && [200, 500].indexOf(res.statusCode) == -1)) {
|
||||
uni.showToast({
|
||||
title: Config.baseUrl + '请求失败',
|
||||
'icon': 'none',
|
||||
duration: 10000
|
||||
});
|
||||
return;
|
||||
}
|
||||
reject(res.data);
|
||||
}
|
||||
});
|
||||
});
|
||||
} else {
|
||||
//异步
|
||||
uni.request({
|
||||
url: url,
|
||||
method: method,
|
||||
data: data,
|
||||
header: params.header || {
|
||||
// 'Accept': 'application/json',
|
||||
'content-type': 'application/x-www-form-urlencoded;application/json'
|
||||
},
|
||||
dataType: params.dataType || 'json',
|
||||
responseType: params.responseType || 'text',
|
||||
success: (res) => {
|
||||
// try {
|
||||
// res.data = JSON.parse(res.data);
|
||||
// } catch (e) {
|
||||
// //TODO handle the exception
|
||||
// console.log('api error:', e);
|
||||
// }
|
||||
if (res.data.code == -3 && store.state.siteState > 0) {
|
||||
store.commit('setSiteState', -3);
|
||||
Util.redirectTo('/pages_tool/storeclose/storeclose', {}, 'reLaunch');
|
||||
return;
|
||||
}
|
||||
if (res.data.refreshtoken) {
|
||||
store.commit('setToken', res.data.refreshtoken);
|
||||
}
|
||||
if (res.data.code == -10009 || res.data.code == -10010) {
|
||||
store.commit('setToken', '');
|
||||
store.commit('setMemberInfo', '');
|
||||
}
|
||||
typeof params.success == 'function' && params.success(res.data);
|
||||
},
|
||||
fail: (res) => {
|
||||
if (res.errMsg && res.errMsg == 'request:fail url not in domain list') {
|
||||
uni.showToast({
|
||||
title: Config.baseUrl + '不在request 合法域名列表中',
|
||||
'icon': 'none',
|
||||
duration: 10000
|
||||
});
|
||||
return;
|
||||
}
|
||||
typeof params.fail == 'function' && params.fail(res);
|
||||
},
|
||||
complete: (res) => {
|
||||
if ((res.errMsg && res.errMsg != "request:ok") || (res.statusCode && [200, 500].indexOf(res.statusCode) == -1)) {
|
||||
uni.showToast({
|
||||
title: Config.baseUrl + '请求失败',
|
||||
'icon': 'none',
|
||||
duration: 10000
|
||||
});
|
||||
return;
|
||||
}
|
||||
typeof params.complete == 'function' && params.complete(res.data);
|
||||
}
|
||||
});
|
||||
}
|
||||
},
|
||||
uploadBase64(params) {
|
||||
uni.request({
|
||||
url: Config.baseUrl + '/api/upload/headimgBase64',
|
||||
method: 'POST',
|
||||
header: {
|
||||
'content-type': 'application/x-www-form-urlencoded;application/json'
|
||||
},
|
||||
data: {
|
||||
app_type,
|
||||
app_type_name,
|
||||
images: params.base64
|
||||
},
|
||||
dataType: 'json',
|
||||
responseType: 'text',
|
||||
success: res => {
|
||||
typeof params.success == 'function' && params.success(res.data);
|
||||
},
|
||||
fail: () => {
|
||||
typeof params.fail == 'function' && params.fail(res);
|
||||
}
|
||||
});
|
||||
},
|
||||
pullImage(params) {
|
||||
uni.request({
|
||||
url: Config.baseUrl + '/api/upload/headimgPull',
|
||||
method: 'POST',
|
||||
header: {
|
||||
'content-type': 'application/x-www-form-urlencoded;application/json'
|
||||
},
|
||||
data: {
|
||||
app_type,
|
||||
app_type_name,
|
||||
path: params.path
|
||||
},
|
||||
dataType: 'json',
|
||||
responseType: 'text',
|
||||
success: res => {
|
||||
typeof params.success == 'function' && params.success(res.data);
|
||||
},
|
||||
fail: () => {
|
||||
typeof params.fail == 'function' && params.fail(res);
|
||||
}
|
||||
});
|
||||
},
|
||||
upload(params) {
|
||||
uni.uploadFile({
|
||||
url: Config.baseUrl + params.url,
|
||||
filePath: params.filePath,
|
||||
name: params.name || 'file',
|
||||
fileType: params.fileType || 'image',
|
||||
formData: {
|
||||
app_type,
|
||||
app_type_name,
|
||||
},
|
||||
header: {
|
||||
'content-type': 'application/x-www-form-urlencoded;application/json'
|
||||
},
|
||||
success: (res) => {
|
||||
typeof params.success == 'function' && params.success(JSON.parse(res.data));
|
||||
},
|
||||
fail: (res) => {
|
||||
typeof params.fail == 'function' && params.fail(res);
|
||||
}
|
||||
});
|
||||
}
|
||||
import Config from './config.js'
|
||||
import Util from './util.js'
|
||||
import store from '@/store/index.js'
|
||||
import { Utils } from 'common/js/map-wx-jssdk.js';
|
||||
|
||||
// #ifdef H5
|
||||
const app_type = Util.isWeiXin() ? 'wechat' : 'h5';
|
||||
const app_type_name = Util.isWeiXin() ? '微信公众号' : 'H5';
|
||||
// #endif
|
||||
|
||||
// #ifdef MP-WEIXIN
|
||||
const app_type = 'weapp';
|
||||
const app_type_name = '微信小程序';
|
||||
// #endif
|
||||
|
||||
// #ifdef MP-ALIPAY
|
||||
const app_type = 'aliapp';
|
||||
const app_type_name = '支付宝小程序';
|
||||
// #endif
|
||||
|
||||
// #ifdef MP-BAIDU
|
||||
const app_type = 'baiduapp';
|
||||
const app_type_name = '百度小程序';
|
||||
// #endif
|
||||
|
||||
// #ifdef MP-TOUTIAO
|
||||
const app_type = 'MP-TOUTIAO';
|
||||
const app_type_name = '头条小程序';
|
||||
// #endif
|
||||
|
||||
// #ifdef MP-QQ
|
||||
const app_type = 'MP-QQ';
|
||||
const app_type_name = 'QQ小程序';
|
||||
// #endif
|
||||
|
||||
// #ifdef APP-PLUS
|
||||
const app_type = 'app';
|
||||
const app_type_name = 'APP';
|
||||
// #endif
|
||||
|
||||
export default {
|
||||
sendRequest(params) {
|
||||
if (!Config.baseUrl) {
|
||||
uni.showToast({
|
||||
title: '未配置请求域名',
|
||||
'icon': 'none',
|
||||
duration: 10000
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
var method = params.data != undefined ? 'POST' : 'GET', // 请求方式
|
||||
url = Config.baseUrl + params.url, // 请求路径
|
||||
data = {
|
||||
app_type,
|
||||
app_type_name
|
||||
};
|
||||
|
||||
// token
|
||||
data.token = store.state.token || '';
|
||||
data.uniacid = Config.uniacid
|
||||
// 门店id
|
||||
var default_store_info = store.state.defaultStoreInfo;
|
||||
if (default_store_info) {
|
||||
data.store_id = default_store_info.store_id;
|
||||
}
|
||||
|
||||
var store_info = store.state.globalStoreInfo;
|
||||
|
||||
if (store_info) data.store_id = store_info.store_id;
|
||||
|
||||
// 参数
|
||||
if (params.data != undefined) Object.assign(data, params.data);
|
||||
|
||||
if (params.async === false) {
|
||||
//同步
|
||||
return new Promise((resolve, reject) => {
|
||||
uni.request({
|
||||
url: url,
|
||||
method: method,
|
||||
data: data,
|
||||
header: params.header || {
|
||||
// 'Accept': 'application/json',
|
||||
'content-type': 'application/x-www-form-urlencoded;application/json'
|
||||
},
|
||||
dataType: params.dataType || 'json',
|
||||
responseType: params.responseType || 'text',
|
||||
success: (res) => {
|
||||
// try {
|
||||
// res.data = JSON.parse(res.data);
|
||||
// } catch (e) {
|
||||
// //TODO handle the exception
|
||||
// console.log('api error:', e);
|
||||
// }
|
||||
if (res.data.code == -3 && store.state.siteState > 0) {
|
||||
store.commit('setSiteState', -3);
|
||||
Util.redirectTo('/pages_tool/storeclose/storeclose', {}, 'reLaunch');
|
||||
return;
|
||||
}
|
||||
if (res.data.refreshtoken) {
|
||||
store.commit('setToken', res.data.refreshtoken);
|
||||
}
|
||||
if (res.data.code == -10009 || res.data.code == -10010) {
|
||||
store.commit('setToken', '');
|
||||
store.commit('setMemberInfo', '');
|
||||
}
|
||||
resolve(res.data);
|
||||
},
|
||||
fail: (res) => {
|
||||
if (res.errMsg && res.errMsg == 'request:fail url not in domain list') {
|
||||
uni.showToast({
|
||||
title: Config.baseUrl + '不在request 合法域名列表中',
|
||||
'icon': 'none',
|
||||
duration: 10000
|
||||
});
|
||||
return;
|
||||
}
|
||||
reject(res);
|
||||
},
|
||||
complete: (res) => {
|
||||
if ((res.errMsg && res.errMsg != "request:ok") || (res.statusCode && [200, 500].indexOf(res.statusCode) == -1)) {
|
||||
uni.showToast({
|
||||
title: Config.baseUrl + '请求失败',
|
||||
'icon': 'none',
|
||||
duration: 10000
|
||||
});
|
||||
return;
|
||||
}
|
||||
reject(res.data);
|
||||
}
|
||||
});
|
||||
});
|
||||
} else {
|
||||
//异步
|
||||
uni.request({
|
||||
url: url,
|
||||
method: method,
|
||||
data: data,
|
||||
header: params.header || {
|
||||
// 'Accept': 'application/json',
|
||||
'content-type': 'application/x-www-form-urlencoded;application/json'
|
||||
},
|
||||
dataType: params.dataType || 'json',
|
||||
responseType: params.responseType || 'text',
|
||||
success: (res) => {
|
||||
// try {
|
||||
// res.data = JSON.parse(res.data);
|
||||
// } catch (e) {
|
||||
// //TODO handle the exception
|
||||
// console.log('api error:', e);
|
||||
// }
|
||||
if (res.data.code == -3 && store.state.siteState > 0) {
|
||||
store.commit('setSiteState', -3);
|
||||
Util.redirectTo('/pages_tool/storeclose/storeclose', {}, 'reLaunch');
|
||||
return;
|
||||
}
|
||||
if (res.data.refreshtoken) {
|
||||
store.commit('setToken', res.data.refreshtoken);
|
||||
}
|
||||
if (res.data.code == -10009 || res.data.code == -10010) {
|
||||
store.commit('setToken', '');
|
||||
store.commit('setMemberInfo', '');
|
||||
}
|
||||
typeof params.success == 'function' && params.success(res.data);
|
||||
},
|
||||
fail: (res) => {
|
||||
if (res.errMsg && res.errMsg == 'request:fail url not in domain list') {
|
||||
uni.showToast({
|
||||
title: Config.baseUrl + '不在request 合法域名列表中',
|
||||
'icon': 'none',
|
||||
duration: 10000
|
||||
});
|
||||
return;
|
||||
}
|
||||
typeof params.fail == 'function' && params.fail(res);
|
||||
},
|
||||
complete: (res) => {
|
||||
if ((res.errMsg && res.errMsg != "request:ok") || (res.statusCode && [200, 500].indexOf(res.statusCode) == -1)) {
|
||||
uni.showToast({
|
||||
title: Config.baseUrl + '请求失败',
|
||||
'icon': 'none',
|
||||
duration: 10000
|
||||
});
|
||||
return;
|
||||
}
|
||||
typeof params.complete == 'function' && params.complete(res.data);
|
||||
}
|
||||
});
|
||||
}
|
||||
},
|
||||
needMd5Fn(params,callback) {
|
||||
uni.request({
|
||||
url: Config.baseUrl + '/api/config/getApiConfig',
|
||||
method: 'POST',
|
||||
header: {
|
||||
'content-type': 'application/x-www-form-urlencoded;application/json'
|
||||
},
|
||||
data: {
|
||||
app_type,
|
||||
app_type_name,
|
||||
},
|
||||
dataType: 'json',
|
||||
responseType: 'text',
|
||||
success: res => {
|
||||
var sign_str = Utils.hexMD5('key=' + res.data.data.key+'&time='+res.data.data.time)
|
||||
typeof callback == 'function' && callback(sign_str,res.data.data.time);
|
||||
},
|
||||
fail: () => {
|
||||
typeof params.fail == 'function' && params.fail(res);
|
||||
}
|
||||
});
|
||||
},
|
||||
uploadBase64(params) {
|
||||
this.needMd5Fn(params,(sign_str,time)=>{
|
||||
uni.request({
|
||||
url: Config.baseUrl + '/api/upload/headimgBase64',
|
||||
method: 'POST',
|
||||
header: {
|
||||
'content-type': 'application/x-www-form-urlencoded;application/json'
|
||||
},
|
||||
data: {
|
||||
app_type,
|
||||
app_type_name,
|
||||
images: params.base64,
|
||||
token: store.state.token || '',
|
||||
sign: sign_str,
|
||||
time: time
|
||||
},
|
||||
dataType: 'json',
|
||||
responseType: 'text',
|
||||
success: res => {
|
||||
typeof params.success == 'function' && params.success(res.data);
|
||||
},
|
||||
fail: () => {
|
||||
typeof params.fail == 'function' && params.fail(res);
|
||||
}
|
||||
});
|
||||
})
|
||||
},
|
||||
pullImage(params) {
|
||||
this.needMd5Fn(params,(sign_str,time)=>{
|
||||
uni.request({
|
||||
url: Config.baseUrl + '/api/upload/headimgPull',
|
||||
method: 'POST',
|
||||
header: {
|
||||
'content-type': 'application/x-www-form-urlencoded;application/json'
|
||||
},
|
||||
data: {
|
||||
app_type,
|
||||
app_type_name,
|
||||
path: params.path,
|
||||
token: store.state.token || '',
|
||||
sign: sign_str,
|
||||
time: time
|
||||
},
|
||||
dataType: 'json',
|
||||
responseType: 'text',
|
||||
success: res => {
|
||||
typeof params.success == 'function' && params.success(res.data);
|
||||
},
|
||||
fail: () => {
|
||||
typeof params.fail == 'function' && params.fail(res);
|
||||
}
|
||||
});
|
||||
})
|
||||
},
|
||||
upload(params) {
|
||||
uni.uploadFile({
|
||||
url: Config.baseUrl + params.url,
|
||||
filePath: params.filePath,
|
||||
name: params.name || 'file',
|
||||
fileType: params.fileType || 'image',
|
||||
formData: {
|
||||
app_type,
|
||||
app_type_name,
|
||||
token: store.state.token || ''
|
||||
},
|
||||
header: {
|
||||
'content-type': 'application/x-www-form-urlencoded;application/json'
|
||||
},
|
||||
success: (res) => {
|
||||
typeof params.success == 'function' && params.success(JSON.parse(res.data));
|
||||
},
|
||||
fail: (res) => {
|
||||
typeof params.fail == 'function' && params.fail(res);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,107 +1,107 @@
|
||||
import TransformCoordinate from './transformCoordinate.js'
|
||||
|
||||
function openMapByDefault(latitude, longitude, name) {
|
||||
uni.openLocation({
|
||||
latitude: latitude,
|
||||
longitude: longitude,
|
||||
name: name,
|
||||
fail: (e) => {
|
||||
uni.showModal({
|
||||
content: '打开地图失败,请稍后重试'
|
||||
})
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
function openMapByAndroid(latitude, longitude, name) {
|
||||
let url = ''; // 回调地址
|
||||
let identity = ''; // 程序名称
|
||||
if (plus.runtime.isApplicationExist({
|
||||
pname: 'com.baidu.BaiduMap'
|
||||
})) {
|
||||
url =
|
||||
`baidumap://map/marker?location=${latitude},${longitude}&title=${name}&coord_type=gcj02&src=andr.baidu.openAPIdemo`
|
||||
identity = 'com.baidu.BaiduMap'
|
||||
openURL(url, identity)
|
||||
} else if (plus.runtime.isApplicationExist({
|
||||
pname: 'com.autonavi.minimap'
|
||||
})) { // 高德
|
||||
url = `androidamap://viewMap?sourceApplication=appname&poiname=${name}&lat=${latitude}&lon=${longitude}&dev=0`
|
||||
identity = 'com.autonavi.minimap'
|
||||
openURL(url, identity)
|
||||
} else {
|
||||
openMapByDefault(latitude, longitude, name)
|
||||
}
|
||||
}
|
||||
|
||||
function openMapByIos(latitude, longitude, name) {
|
||||
let url = ''; // 回调地址
|
||||
let errorCB = ''; // url失败的回调地址
|
||||
let identity = ''; // 程序名称
|
||||
|
||||
if (plus.runtime.isApplicationExist({
|
||||
action: 'baidumap://'
|
||||
})) {
|
||||
url =
|
||||
`baidumap://map/marker?location=${latitude},${longitude}&title=${name}&content=${name}&src=ios.baidu.openAPIdemo&coord_type=gcj02`;
|
||||
openURL(url, identity)
|
||||
} else if (plus.runtime.isApplicationExist({
|
||||
action: 'iosamap://'
|
||||
})) { // 高德
|
||||
url = `iosamap://viewMap?sourceApplication=applicationName&poiname=${name}&lat=${latitude}&lon=${longitude}&dev=0`
|
||||
openURL(url, identity)
|
||||
} else {
|
||||
openMapByDefault(latitude, longitude, name)
|
||||
}
|
||||
}
|
||||
|
||||
function openURL(url, identity) {
|
||||
let newurl = encodeURI(url);
|
||||
plus.runtime.openURL(newurl, function(res) {
|
||||
uni.showModal({
|
||||
content: res.message
|
||||
})
|
||||
}, identity);
|
||||
}
|
||||
|
||||
function getCoordByType(longitude, latitude, coord_type) {
|
||||
switch (coord_type) {
|
||||
case 'gcj02':
|
||||
return [longitude, latitude]
|
||||
break;
|
||||
case 'bd09':
|
||||
return TransformCoordinate.bd09togcj02(longitude, latitude)
|
||||
break;
|
||||
case 'wgs84':
|
||||
return TransformCoordinate.wgs84togcj02(longitude, latitude)
|
||||
break;
|
||||
default:
|
||||
return [longitude, latitude]
|
||||
break;
|
||||
}
|
||||
}
|
||||
export default {
|
||||
/* 打开地图 */
|
||||
openMap(latitude, longitude, name, coord_type = 'gcj02') {
|
||||
let arr = getCoordByType(longitude, latitude, coord_type)
|
||||
// #ifdef APP-PLUS
|
||||
switch (uni.getSystemInfoSync().platform) {
|
||||
case 'android':
|
||||
console.log('运行Android上')
|
||||
openMapByAndroid(arr[1], arr[0], name)
|
||||
break;
|
||||
case 'ios':
|
||||
console.log('运行iOS上')
|
||||
openMapByIos(arr[1], arr[0], name)
|
||||
break;
|
||||
default:
|
||||
openMapByDefault(arr[1], arr[0], name)
|
||||
console.log('运行在开发者工具上')
|
||||
break;
|
||||
}
|
||||
// #endif
|
||||
// #ifndef APP-PLUS
|
||||
openMapByDefault(arr[1], arr[0], name)
|
||||
// #endif
|
||||
}
|
||||
}
|
||||
import TransformCoordinate from './transformCoordinate.js'
|
||||
|
||||
function openMapByDefault(latitude, longitude, name) {
|
||||
uni.openLocation({
|
||||
latitude: latitude,
|
||||
longitude: longitude,
|
||||
name: name,
|
||||
fail: (e) => {
|
||||
uni.showModal({
|
||||
content: '打开地图失败,请稍后重试'
|
||||
})
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
function openMapByAndroid(latitude, longitude, name) {
|
||||
let url = ''; // 回调地址
|
||||
let identity = ''; // 程序名称
|
||||
if (plus.runtime.isApplicationExist({
|
||||
pname: 'com.baidu.BaiduMap'
|
||||
})) {
|
||||
url = `baidumap://map/marker?location=${latitude},${longitude}&title=${name}&coord_type=gcj02&src=andr.baidu.openAPIdemo`;
|
||||
identity = 'com.baidu.BaiduMap';
|
||||
openURL(url, identity)
|
||||
} else if (plus.runtime.isApplicationExist({
|
||||
pname: 'com.autonavi.minimap'
|
||||
})) {
|
||||
// 高德
|
||||
url = `androidamap://viewMap?sourceApplication=appname&poiname=${name}&lat=${latitude}&lon=${longitude}&dev=0`;
|
||||
identity = 'com.autonavi.minimap';
|
||||
openURL(url, identity)
|
||||
} else {
|
||||
openMapByDefault(latitude, longitude, name)
|
||||
}
|
||||
}
|
||||
|
||||
function openMapByIos(latitude, longitude, name) {
|
||||
let url = ''; // 回调地址
|
||||
let errorCB = ''; // url失败的回调地址
|
||||
let identity = ''; // 程序名称
|
||||
|
||||
if (plus.runtime.isApplicationExist({
|
||||
action: 'baidumap://'
|
||||
})) {
|
||||
url = `baidumap://map/marker?location=${latitude},${longitude}&title=${name}&content=${name}&src=ios.baidu.openAPIdemo&coord_type=gcj02`;
|
||||
openURL(url, identity)
|
||||
} else if (plus.runtime.isApplicationExist({
|
||||
action: 'iosamap://'
|
||||
})) {
|
||||
// 高德
|
||||
url = `iosamap://viewMap?sourceApplication=applicationName&poiname=${name}&lat=${latitude}&lon=${longitude}&dev=0`;
|
||||
openURL(url, identity)
|
||||
} else {
|
||||
openMapByDefault(latitude, longitude, name)
|
||||
}
|
||||
}
|
||||
|
||||
function openURL(url, identity) {
|
||||
let newurl = encodeURI(url);
|
||||
plus.runtime.openURL(newurl, function(res) {
|
||||
uni.showModal({
|
||||
content: res.message
|
||||
})
|
||||
}, identity);
|
||||
}
|
||||
|
||||
function getCoordByType(longitude, latitude, coord_type) {
|
||||
switch (coord_type) {
|
||||
case 'gcj02':
|
||||
return [longitude, latitude]
|
||||
break;
|
||||
case 'bd09':
|
||||
return TransformCoordinate.bd09togcj02(longitude, latitude)
|
||||
break;
|
||||
case 'wgs84':
|
||||
return TransformCoordinate.wgs84togcj02(longitude, latitude)
|
||||
break;
|
||||
default:
|
||||
return [longitude, latitude]
|
||||
break;
|
||||
}
|
||||
}
|
||||
export default {
|
||||
/* 打开地图 */
|
||||
openMap(latitude, longitude, name, coord_type = 'gcj02') {
|
||||
let arr = getCoordByType(longitude, latitude, coord_type)
|
||||
// #ifdef APP-PLUS
|
||||
switch (uni.getSystemInfoSync().platform) {
|
||||
case 'android':
|
||||
console.log('运行Android上')
|
||||
openMapByAndroid(arr[1], arr[0], name)
|
||||
break;
|
||||
case 'ios':
|
||||
console.log('运行iOS上')
|
||||
openMapByIos(arr[1], arr[0], name)
|
||||
break;
|
||||
default:
|
||||
openMapByDefault(arr[1], arr[0], name)
|
||||
console.log('运行在开发者工具上')
|
||||
break;
|
||||
}
|
||||
// #endif
|
||||
// #ifndef APP-PLUS
|
||||
openMapByDefault(arr[1], arr[0], name)
|
||||
// #endif
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,207 +1,215 @@
|
||||
import config from './config.js'
|
||||
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
timeoutObj: null, //ping定时器
|
||||
servicer_id: null, //绑定
|
||||
pingInterval: config.pingInterval //本地端主动给服务器ping的时间, 0 则不开启
|
||||
}
|
||||
},
|
||||
onLoad() {
|
||||
let that = this;
|
||||
// 因为图片上传,所以不能onhide关闭长链接,但是每次打开客服都会有重复请求,所以优先关闭再去打开长链接
|
||||
uni.closeSocket();
|
||||
// .判断是否已连接
|
||||
that.checkOpenSocket();
|
||||
// uni.onSocketClose(function(res) {
|
||||
// console.log('WebSocket 已关闭!');
|
||||
// });
|
||||
},
|
||||
methods: {
|
||||
// 判断是否已连接
|
||||
checkOpenSocket() {
|
||||
console.log('判断是否已连接');
|
||||
// alert('判断是否已连接')
|
||||
let self = this;
|
||||
uni.sendSocketMessage({
|
||||
data: 'ping',
|
||||
success: (res) => {
|
||||
console.log('连接成功,检查');
|
||||
// alert('连接成功,检查')
|
||||
// self.getChatList();
|
||||
},
|
||||
fail: (err) => { // 未连接打开websocket连接
|
||||
console.log('连接失败');
|
||||
// alert('连接失败')
|
||||
self.openConnection();
|
||||
}
|
||||
});
|
||||
},
|
||||
openConnection() { // 打开连接
|
||||
console.log('打开连接');
|
||||
// alert('打开连接')
|
||||
// uni.closeSocket(); // 确保已经关闭后再重新打开
|
||||
uni.connectSocket({
|
||||
url: config.webSocket,
|
||||
method: 'POST',
|
||||
success(res) {
|
||||
console.log('连接成功 connectSocket=', res);
|
||||
// alert('连接成功 connectSocket=', res);
|
||||
},
|
||||
fail(err) {
|
||||
console.log('连接失败 connectSocket=', err);
|
||||
}
|
||||
});
|
||||
// uni.onSocketOpen((res) => {
|
||||
// console.log('连接成功', res);
|
||||
// });
|
||||
this.onSocketMessage(); // 打开成功监听服务器返回的消息
|
||||
},
|
||||
// 打开成功监听服务器返回的消息
|
||||
onSocketMessage() { // 消息
|
||||
console.log("开始监听");
|
||||
|
||||
let that = this;
|
||||
this.pingInterval = config.pingInterval;
|
||||
this.timeoutObj = null;
|
||||
uni.onSocketMessage((res) => { //type:init,connect,close,string,order,goods
|
||||
let msg = JSON.parse(res.data);
|
||||
console.log("监听该服务器消息", res);
|
||||
if (msg.type == 'close') {
|
||||
clearInterval(that.timeoutObj);
|
||||
that.timeoutObj = null;
|
||||
uni.closeSocket();
|
||||
return;
|
||||
}
|
||||
this.reset();
|
||||
this.getSocketMsg(res.data); // 监听到有新服务器消息
|
||||
});
|
||||
},
|
||||
// 监听到有新服务器消息
|
||||
getSocketMsg(reData) { // 监听到服务器消息
|
||||
let that = this;
|
||||
// console.log(reData)
|
||||
let giveMsg = JSON.parse(reData);
|
||||
let data = {
|
||||
isItMe: false,
|
||||
};
|
||||
data.contentType = giveMsg.type;
|
||||
// alert(data.contentType)
|
||||
if (giveMsg.type == 'init') {
|
||||
// alert(123)
|
||||
that.$api.sendRequest({
|
||||
url: '/servicer/api/chat/bind',
|
||||
data: {
|
||||
client_id: giveMsg.data.client_id,
|
||||
site_id: that.siteId
|
||||
},
|
||||
success(res) {
|
||||
if (res.code == 0) {
|
||||
that.servicer_id = res.data.servicer_id;
|
||||
} else {
|
||||
that.servicer_id = 0;
|
||||
}
|
||||
that.getChatList();
|
||||
}
|
||||
})
|
||||
} else if (giveMsg.type == 'connect') {
|
||||
// that.servicer_id = giveMsg.data.servicer_id;
|
||||
// let NewArr = that.messageList;
|
||||
// let index = null;
|
||||
// for (let i = 0; i < NewArr.length; i++) {
|
||||
// if (NewArr[i].contentType == 'online' || NewArr[i].contentType == 'noline') {
|
||||
// index = i;
|
||||
// }
|
||||
// }
|
||||
// NewArr.splice(index, 1)
|
||||
// that.messageList = NewArr;
|
||||
// let obj = {}
|
||||
// if (that.servicer_id > 0) {
|
||||
// obj.contentType = 'online';
|
||||
// } else if (that.servicer_id == 0) {
|
||||
// obj.contentType = 'noline';
|
||||
// }
|
||||
// that.messageList.push(obj);
|
||||
return false;
|
||||
} else if (giveMsg.type == 'string') {
|
||||
data.content = giveMsg.data.servicer_say;
|
||||
} else if (giveMsg.type == 'image') {
|
||||
data.image = giveMsg.data.servicer_say;
|
||||
} else if (giveMsg.type == 'order') {
|
||||
data.order_id = giveMsg.data.order_id;
|
||||
} else if (giveMsg.type == 'goodssku') {
|
||||
data.sku_id = giveMsg.data.goods_sku_id;
|
||||
}
|
||||
if (giveMsg.type == 'init') return;
|
||||
that.messageList.push(data);
|
||||
that.$nextTick(() => {
|
||||
that.setPageScrollTo()
|
||||
})
|
||||
},
|
||||
// 检测心跳reset
|
||||
reset() {
|
||||
console.log("检测心跳");
|
||||
clearInterval(this.timeoutObj);
|
||||
this.start(); // 启动心跳
|
||||
},
|
||||
// 启动心跳 start
|
||||
start() {
|
||||
console.log("启动心跳");
|
||||
let self = this;
|
||||
this.timeoutObj = setInterval(function () {
|
||||
uni.sendSocketMessage({
|
||||
data: 'ping',
|
||||
success: (res) => {
|
||||
console.log('连接中....');
|
||||
},
|
||||
fail: (err) => {
|
||||
console.log('连接失败重新连接....');
|
||||
self.openConnection();
|
||||
}
|
||||
});
|
||||
}, this.pingInterval);
|
||||
}
|
||||
},
|
||||
// onHide() {
|
||||
// // alert("关闭")
|
||||
// // 改之前的
|
||||
// // console.log("我出发了")
|
||||
// // this.checkOpenSocket();
|
||||
// clearInterval(this.timeoutObj);
|
||||
// this.timeoutObj = null;
|
||||
// this.$api.sendRequest({
|
||||
// url: '/servicer/api/chat/bye',
|
||||
// data: {
|
||||
// servicer_id: this.servicer_id,
|
||||
// site_id: this.siteId
|
||||
// },
|
||||
// success(res) {
|
||||
// uni.closeSocket();
|
||||
// },
|
||||
// fail: (err) => {
|
||||
// uni.closeSocket();
|
||||
// }
|
||||
// });
|
||||
// },
|
||||
onUnload() {
|
||||
// alert("关闭")
|
||||
clearInterval(this.timeoutObj);
|
||||
this.timeoutObj = null;
|
||||
this.$api.sendRequest({
|
||||
url: '/servicer/api/chat/bye',
|
||||
data: {
|
||||
servicer_id: this.servicer_id,
|
||||
site_id: this.siteId
|
||||
},
|
||||
success(res) {
|
||||
// alert("关闭1")
|
||||
uni.closeSocket();
|
||||
},
|
||||
fail: (err) => {
|
||||
// alert("关闭2")
|
||||
uni.closeSocket();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
import config from './config.js'
|
||||
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
timeoutObj: null, //ping定时器
|
||||
servicer_id: null, //绑定
|
||||
pingInterval: config.pingInterval //本地端主动给服务器ping的时间, 0 则不开启
|
||||
}
|
||||
},
|
||||
onLoad() {
|
||||
let that = this;
|
||||
// 因为图片上传,所以不能onhide关闭长链接,但是每次打开客服都会有重复请求,所以优先关闭再去打开长链接
|
||||
uni.closeSocket();
|
||||
// .判断是否已连接
|
||||
that.checkOpenSocket();
|
||||
// uni.onSocketClose(function(res) {
|
||||
// console.log('WebSocket 已关闭!');
|
||||
// });
|
||||
},
|
||||
methods: {
|
||||
// 判断是否已连接
|
||||
checkOpenSocket() {
|
||||
console.log('判断是否已连接');
|
||||
// alert('判断是否已连接')
|
||||
let self = this;
|
||||
uni.sendSocketMessage({
|
||||
data: 'ping',
|
||||
success: (res) => {
|
||||
console.log('连接成功,检查');
|
||||
// alert('连接成功,检查')
|
||||
// self.getChatList();
|
||||
},
|
||||
fail: (err) => { // 未连接打开websocket连接
|
||||
console.log('连接失败');
|
||||
// alert('连接失败')
|
||||
self.openConnection();
|
||||
}
|
||||
});
|
||||
},
|
||||
openConnection() { // 打开连接
|
||||
console.log('打开连接');
|
||||
// alert('打开连接')
|
||||
// uni.closeSocket(); // 确保已经关闭后再重新打开
|
||||
|
||||
uni.connectSocket({
|
||||
url: config.webSocket,
|
||||
method: 'POST',
|
||||
success(res) {
|
||||
console.log('连接成功 connectSocket=', res);
|
||||
// alert('连接成功 connectSocket=', res);
|
||||
},
|
||||
fail(err) {
|
||||
console.log('连接失败 connectSocket=', err);
|
||||
}
|
||||
});
|
||||
// 监听 WebSocket 连接错误事件
|
||||
uni.onSocketError((res)=>{
|
||||
console.error('WebSocket 连接失败:', res.errMsg);
|
||||
this.chatListInit();
|
||||
this.getChatList();
|
||||
});
|
||||
// uni.onSocketOpen((res) => {
|
||||
// console.log('连接成功', res);
|
||||
// });
|
||||
this.onSocketMessage(); // 打开成功监听服务器返回的消息
|
||||
},
|
||||
// 打开成功监听服务器返回的消息
|
||||
onSocketMessage() { // 消息
|
||||
console.log("开始监听");
|
||||
|
||||
let that = this;
|
||||
this.pingInterval = config.pingInterval;
|
||||
if(this.timeoutObj) clearInterval(this.timeoutObj);
|
||||
this.timeoutObj = null;
|
||||
uni.onSocketMessage((res) => { //type:init,connect,close,string,order,goods
|
||||
let msg = JSON.parse(res.data);
|
||||
console.log("监听该服务器消息", res);
|
||||
if (msg.type == 'close') {
|
||||
clearInterval(that.timeoutObj);
|
||||
that.timeoutObj = null;
|
||||
uni.closeSocket();
|
||||
return;
|
||||
}
|
||||
this.reset();
|
||||
this.getSocketMsg(res.data); // 监听到有新服务器消息
|
||||
});
|
||||
},
|
||||
// 监听到有新服务器消息
|
||||
getSocketMsg(reData) { // 监听到服务器消息
|
||||
let that = this;
|
||||
let giveMsg = JSON.parse(reData);
|
||||
let data = {
|
||||
isItMe: false,
|
||||
};
|
||||
data.contentType = giveMsg.type;
|
||||
// alert(data.contentType)
|
||||
if (giveMsg.type == 'init') {
|
||||
// alert(123)
|
||||
that.$api.sendRequest({
|
||||
url: '/servicer/api/chat/bind',
|
||||
data: {
|
||||
client_id: giveMsg.data.client_id,
|
||||
site_id: that.siteId
|
||||
},
|
||||
success(res) {
|
||||
if (res.code == 0) {
|
||||
that.servicer_id = res.data.servicer_id;
|
||||
} else {
|
||||
that.servicer_id = 0;
|
||||
}
|
||||
that.chatListInit();
|
||||
that.getChatList();
|
||||
}
|
||||
})
|
||||
} else if (giveMsg.type == 'connect') {
|
||||
// that.servicer_id = giveMsg.data.servicer_id;
|
||||
// let NewArr = that.messageList;
|
||||
// let index = null;
|
||||
// for (let i = 0; i < NewArr.length; i++) {
|
||||
// if (NewArr[i].contentType == 'online' || NewArr[i].contentType == 'noline') {
|
||||
// index = i;
|
||||
// }
|
||||
// }
|
||||
// NewArr.splice(index, 1)
|
||||
// that.messageList = NewArr;
|
||||
// let obj = {}
|
||||
// if (that.servicer_id > 0) {
|
||||
// obj.contentType = 'online';
|
||||
// } else if (that.servicer_id == 0) {
|
||||
// obj.contentType = 'noline';
|
||||
// }
|
||||
// that.messageList.push(obj);
|
||||
return false;
|
||||
} else if (giveMsg.type == 'string') {
|
||||
data.content = giveMsg.data.servicer_say;
|
||||
} else if (giveMsg.type == 'image') {
|
||||
data.image = giveMsg.data.servicer_say;
|
||||
} else if (giveMsg.type == 'order') {
|
||||
data.order_id = giveMsg.data.order_id;
|
||||
} else if (giveMsg.type == 'goodssku') {
|
||||
data.sku_id = giveMsg.data.goods_sku_id;
|
||||
}
|
||||
if (giveMsg.type == 'init') return;
|
||||
that.messageList.push(data);
|
||||
that.$nextTick(() => {
|
||||
that.setPageScrollTo()
|
||||
})
|
||||
},
|
||||
// 检测心跳reset
|
||||
reset() {
|
||||
console.log("检测心跳");
|
||||
clearInterval(this.timeoutObj);
|
||||
this.start(); // 启动心跳
|
||||
},
|
||||
// 启动心跳 start
|
||||
start() {
|
||||
console.log("启动心跳");
|
||||
let self = this;
|
||||
this.timeoutObj = setInterval(function () {
|
||||
uni.sendSocketMessage({
|
||||
data: 'ping',
|
||||
success: (res) => {
|
||||
console.log('连接中....');
|
||||
},
|
||||
fail: (err) => {
|
||||
console.log('连接失败重新连接....');
|
||||
self.openConnection();
|
||||
}
|
||||
});
|
||||
}, this.pingInterval);
|
||||
}
|
||||
},
|
||||
// onHide() {
|
||||
// // alert("关闭")
|
||||
// // 改之前的
|
||||
// // console.log("我出发了")
|
||||
// // this.checkOpenSocket();
|
||||
// clearInterval(this.timeoutObj);
|
||||
// this.timeoutObj = null;
|
||||
// this.$api.sendRequest({
|
||||
// url: '/servicer/api/chat/bye',
|
||||
// data: {
|
||||
// servicer_id: this.servicer_id,
|
||||
// site_id: this.siteId
|
||||
// },
|
||||
// success(res) {
|
||||
// uni.closeSocket();
|
||||
// },
|
||||
// fail: (err) => {
|
||||
// uni.closeSocket();
|
||||
// }
|
||||
// });
|
||||
// },
|
||||
onUnload() {
|
||||
// alert("关闭")
|
||||
clearInterval(this.timeoutObj);
|
||||
this.timeoutObj = null;
|
||||
this.$api.sendRequest({
|
||||
url: '/servicer/api/chat/bye',
|
||||
data: {
|
||||
servicer_id: this.servicer_id,
|
||||
site_id: this.siteId
|
||||
},
|
||||
success(res) {
|
||||
// alert("关闭1")
|
||||
uni.closeSocket();
|
||||
},
|
||||
fail: (err) => {
|
||||
// alert("关闭2")
|
||||
uni.closeSocket();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,15 +8,15 @@ import {
|
||||
export default {
|
||||
/**
|
||||
* 页面跳转
|
||||
* @param {string} to 跳转链接 /pages/idnex/index
|
||||
* @param {string} to 跳转链接 /pages/index/index
|
||||
* @param {Object} param 参数 {key : value, ...}
|
||||
* @param {string} mode 模式
|
||||
*/
|
||||
redirectTo(to, param, mode) {
|
||||
let url = to;
|
||||
let tabbarList = ['/pages/index/index', '/pages/goods/category', '/pages/vr/index', '/pages/contact/contact', '/pages/member/index'];
|
||||
let tabbarList = ['/pages/index/index', '/pages/goods/category', '/pages/goods/cart', '/pages/member/index'];
|
||||
if (param != undefined) {
|
||||
Object.keys(param).forEach(function (key) {
|
||||
Object.keys(param).forEach(function(key) {
|
||||
if (url.indexOf('?') != -1) {
|
||||
url += "&" + key + "=" + param[key];
|
||||
} else {
|
||||
@@ -26,6 +26,8 @@ export default {
|
||||
}
|
||||
for (let i = 0; i < tabbarList.length; i++) {
|
||||
if (url.indexOf(tabbarList[i]) == 0) {
|
||||
if(url.split('?')[1]) uni.setStorageSync('tabBarParams',url.split('?')[1]);
|
||||
else uni.removeStorageSync('tabBarParams')
|
||||
uni.switchTab({
|
||||
url
|
||||
});
|
||||
@@ -64,8 +66,6 @@ export default {
|
||||
* @param {Object} params 参数,针对商品、相册里面的图片区分大中小,size: big、mid、small
|
||||
*/
|
||||
img(img_path, params) {
|
||||
|
||||
|
||||
var path = "";
|
||||
if (img_path != undefined && img_path != "") {
|
||||
if (img_path.split(',').length > 1) {
|
||||
@@ -78,19 +78,17 @@ export default {
|
||||
arr.pop();
|
||||
arr[arr.length - 1] = arr[arr.length - 1] + "_" + params.size.toUpperCase();
|
||||
arr.push(suffix);
|
||||
// if(img_path.indexOf('attachment') == -1){
|
||||
// img_path = arr.join(".");
|
||||
// }
|
||||
|
||||
img_path = arr.join(".");
|
||||
}
|
||||
if (img_path.indexOf("http://") == -1 && img_path.indexOf("https://") == -1) {
|
||||
path = Config.imgDomain + "/" + img_path;
|
||||
} else {
|
||||
// console.log(img_path)
|
||||
path = img_path;
|
||||
}
|
||||
if (Config.h5Domain.indexOf('https://') != -1) {
|
||||
path = path.replace('http://', 'https://');
|
||||
}
|
||||
}
|
||||
|
||||
// path += '?t=' + parseInt(new Date().getTime() / 1000);
|
||||
return path;
|
||||
},
|
||||
@@ -98,7 +96,7 @@ export default {
|
||||
* 时间戳转日期格式
|
||||
* @param {Object} timeStamp
|
||||
*/
|
||||
timeStampTurnTime(timeStamp, type = "") {
|
||||
timeStampTurnTime(timeStamp, format = "Y-m-d H:i:s") {
|
||||
if (timeStamp != undefined && timeStamp != "" && timeStamp > 0) {
|
||||
var date = new Date();
|
||||
date.setTime(timeStamp * 1000);
|
||||
@@ -113,14 +111,15 @@ export default {
|
||||
var second = date.getSeconds();
|
||||
minute = minute < 10 ? ('0' + minute) : minute;
|
||||
second = second < 10 ? ('0' + second) : second;
|
||||
if (type) {
|
||||
if (type == 'yearMonthDay') {
|
||||
return y + '年' + m + '月' + d + '日';
|
||||
}
|
||||
return y + '-' + m + '-' + d;
|
||||
} else {
|
||||
return y + '-' + m + '-' + d + ' ' + h + ':' + minute + ':' + second;
|
||||
}
|
||||
|
||||
format = format.replace('Y', y);
|
||||
format = format.replace('m', m);
|
||||
format = format.replace('d', d);
|
||||
format = format.replace('H', h);
|
||||
format = format.replace('i', minute);
|
||||
format = format.replace('s', second);
|
||||
|
||||
return format;
|
||||
} else {
|
||||
return "";
|
||||
}
|
||||
@@ -187,19 +186,19 @@ export default {
|
||||
* @param {Object} elem
|
||||
* @param {Object} arr
|
||||
*/
|
||||
inArray: function (elem, arr) {
|
||||
inArray: function(elem, arr) {
|
||||
return arr == null ? -1 : arr.indexOf(elem);
|
||||
},
|
||||
/**
|
||||
* 获取某天日期
|
||||
* @param {Object} day
|
||||
*/
|
||||
getDay: function (day) {
|
||||
getDay: function(day) {
|
||||
var today = new Date();
|
||||
var targetday_milliseconds = today.getTime() + 1000 * 60 * 60 * 24 * day;
|
||||
today.setTime(targetday_milliseconds);
|
||||
|
||||
const doHandleMonth = function (month) {
|
||||
const doHandleMonth = function(month) {
|
||||
var m = month;
|
||||
if (month.toString().length == 1) {
|
||||
m = "0" + month;
|
||||
@@ -231,7 +230,7 @@ export default {
|
||||
* @param callback
|
||||
* @param url
|
||||
*/
|
||||
upload: function (num, params, callback, url) {
|
||||
upload: function(num, params, callback, url) {
|
||||
// #ifdef H5
|
||||
var app_type = this.isWeiXin() ? 'wechat' : 'h5';
|
||||
var app_type_name = this.isWeiXin() ? '微信公众号' : 'H5';
|
||||
@@ -275,7 +274,7 @@ export default {
|
||||
count: imgs_num,
|
||||
sizeType: ['compressed'], //可以指定是原图还是压缩图,默认二者都有
|
||||
sourceType: ['album', 'camera'], //从相册或者拍照
|
||||
success: async function (res) {
|
||||
success: async (res) => {
|
||||
const tempFilePaths = res.tempFilePaths;
|
||||
var _data = data;
|
||||
var imgs = [];
|
||||
@@ -283,9 +282,16 @@ export default {
|
||||
title: '图片上传中'
|
||||
})
|
||||
for (var i = 0; i < tempFilePaths.length; i++) {
|
||||
var path = await _self.upload_file_server(tempFilePaths[i], _data, params.path,
|
||||
url);
|
||||
imgs.push(path);
|
||||
try {
|
||||
var path = await _self.upload_file_server(tempFilePaths[i], _data, params.path,
|
||||
url);
|
||||
imgs.push(path);
|
||||
} catch (e) {
|
||||
this.showToast({
|
||||
title: e,
|
||||
});
|
||||
break;
|
||||
}
|
||||
if (imgs.length == tempFilePaths.length) {
|
||||
uni.hideLoading()
|
||||
uni.showToast({
|
||||
@@ -297,11 +303,12 @@ export default {
|
||||
}
|
||||
},
|
||||
fail: err => {
|
||||
uni.hideLoading()
|
||||
uni.showToast({
|
||||
title: '上传失败',
|
||||
icon: 'none'
|
||||
})
|
||||
if (err.errMsg != 'chooseImage:fail cancel') {
|
||||
uni.showToast({
|
||||
title: '上传失败',
|
||||
icon: 'none'
|
||||
})
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
@@ -319,13 +326,25 @@ export default {
|
||||
name: 'file',
|
||||
fileType: data.fileType || 'image',
|
||||
formData: data,
|
||||
success: function (res) {
|
||||
success: (res) => {
|
||||
var path_str = JSON.parse(res.data);
|
||||
if (path_str.code >= 0) {
|
||||
resolve(path_str.data.pic_path);
|
||||
typeof callback == 'function' && callback(path_str.data.pic_path);
|
||||
} else {
|
||||
reject("error");
|
||||
reject(path_str.message);
|
||||
}
|
||||
uni.hideLoading();
|
||||
},
|
||||
fail: (res) => {
|
||||
if (res.statusCode != 200) {
|
||||
reject(res.errMsg || '上传错误');
|
||||
uni.hideLoading();
|
||||
}
|
||||
},
|
||||
complete: (res) => {
|
||||
if (res.statusCode != 200) {
|
||||
reject('服务器发生错误');
|
||||
uni.hideLoading();
|
||||
}
|
||||
}
|
||||
});
|
||||
@@ -395,7 +414,7 @@ export default {
|
||||
* 检测苹果X以上的手机
|
||||
*/
|
||||
isIPhoneX() {
|
||||
let res = uni.getSystemInfoSync();
|
||||
let res = uni.getDeviceInfo();
|
||||
if (res.model.search('iPhone X') != -1) {
|
||||
return true;
|
||||
}
|
||||
@@ -403,7 +422,7 @@ export default {
|
||||
},
|
||||
//判断安卓还是iOS
|
||||
isAndroid() {
|
||||
let platform = uni.getSystemInfoSync().platform
|
||||
let platform = uni.getDeviceInfo().platform
|
||||
if (platform == 'ios') {
|
||||
return false;
|
||||
} else if (platform == 'android') {
|
||||
@@ -415,7 +434,7 @@ export default {
|
||||
* @param {Object} obj
|
||||
*/
|
||||
deepClone(obj) {
|
||||
const isObject = function (obj) {
|
||||
const isObject = function(obj) {
|
||||
return typeof obj == 'object';
|
||||
}
|
||||
|
||||
@@ -431,7 +450,6 @@ export default {
|
||||
}
|
||||
return cloneObj
|
||||
},
|
||||
|
||||
/**
|
||||
* 打开微信企业客服
|
||||
* @param {Function} fallbackFunc 降级处理函数
|
||||
@@ -464,11 +482,11 @@ export default {
|
||||
* @param {Object} link
|
||||
*/
|
||||
diyRedirectTo(link) {
|
||||
|
||||
//if (link == null || Object.keys(link).length == 1) return;
|
||||
if (link == null || Object.keys(link).length == 1) return;
|
||||
|
||||
// 外部链接
|
||||
if (link.wap_url && link.wap_url.indexOf('http') != -1 || link.wap_url && link.wap_url.indexOf('http') != -1) {
|
||||
if (link.wap_url && link.wap_url.indexOf('http') != -1 || link.wap_url && link.wap_url.indexOf('https') != -1) {
|
||||
|
||||
// #ifdef H5
|
||||
window.location.href = link.wap_url;
|
||||
// #endif
|
||||
@@ -492,10 +510,8 @@ export default {
|
||||
|
||||
uni.makePhoneCall({
|
||||
phoneNumber: link.mobile,
|
||||
success: (res) => {
|
||||
},
|
||||
fail: (res) => {
|
||||
}
|
||||
success: (res) => {},
|
||||
fail: (res) => {}
|
||||
});
|
||||
|
||||
} else if (link.name == 'MEMBER_CONTACT') {
|
||||
@@ -585,9 +601,12 @@ export default {
|
||||
*/
|
||||
uniappIsIPhoneX() {
|
||||
let isIphoneX = false;
|
||||
let systemInfo = uni.getSystemInfoSync();
|
||||
let deviceInfo = uni.getDeviceInfo();
|
||||
let windowInfo = uni.getWindowInfo();
|
||||
// #ifdef MP
|
||||
if (systemInfo.model.search('iPhone X') != -1 || systemInfo.model.search('iPhone 11') != -1 || systemInfo.model.search('iPhone 12') != -1 || systemInfo.model.search('iPhone 13') != -1) {
|
||||
if (deviceInfo.model.search('iPhone X') != -1 || deviceInfo.model.search('iPhone 11') != -1 || deviceInfo.model
|
||||
.search('iPhone 12') != -1 || deviceInfo.model.search('iPhone 13') != -1 || parseInt(deviceInfo.model.split(
|
||||
'iPhone')[1]) > 13) {
|
||||
isIphoneX = true;
|
||||
}
|
||||
// #endif
|
||||
@@ -596,11 +615,11 @@ export default {
|
||||
var u = navigator.userAgent;
|
||||
var isIOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); //ios终端
|
||||
if (isIOS) {
|
||||
if (systemInfo.screenWidth == 375 && systemInfo.screenHeight == 812 && systemInfo.pixelRatio == 3) {
|
||||
if (windowInfo.screenWidth == 375 && windowInfo.screenHeight == 812 && deviceInfo.pixelRatio == 3) {
|
||||
isIphoneX = true;
|
||||
} else if (systemInfo.screenWidth == 414 && systemInfo.screenHeight == 896 && systemInfo.pixelRatio == 3) {
|
||||
} else if (windowInfo.screenWidth == 414 && windowInfo.screenHeight == 896 && deviceInfo.pixelRatio == 3) {
|
||||
isIphoneX = true;
|
||||
} else if (systemInfo.screenWidth == 414 && systemInfo.screenHeight == 896 && systemInfo.pixelRatio == 2) {
|
||||
} else if (windowInfo.screenWidth == 414 && windowInfo.screenHeight == 896 && deviceInfo.pixelRatio == 2) {
|
||||
isIphoneX = true;
|
||||
}
|
||||
}
|
||||
@@ -612,9 +631,9 @@ export default {
|
||||
*/
|
||||
uniappIsIPhone11() {
|
||||
let isIphone11 = false;
|
||||
let systemInfo = uni.getSystemInfoSync();
|
||||
let deviceInfo = uni.getDeviceInfo();
|
||||
// #ifdef MP
|
||||
if (systemInfo.model.search('iPhone 11') != -1) {
|
||||
if (deviceInfo.model.search('iPhone 11') != -1) {
|
||||
isIphone11 = true;
|
||||
}
|
||||
// #endif
|
||||
@@ -623,7 +642,6 @@ export default {
|
||||
// #ifdef H5
|
||||
//判断该浏览器是否为safaria浏览器
|
||||
isSafari() {
|
||||
let res = uni.getSystemInfoSync();
|
||||
var ua = navigator.userAgent.toLowerCase();
|
||||
if (ua.indexOf('applewebkit') > -1 && ua.indexOf('mobile') > -1 && ua.indexOf('safari') > -1 &&
|
||||
ua.indexOf('linux') === -1 && ua.indexOf('android') === -1 && ua.indexOf('chrome') === -1 &&
|
||||
@@ -670,7 +688,6 @@ export default {
|
||||
}
|
||||
},
|
||||
/**
|
||||
*
|
||||
* @param val 转化时间字符串 (转化时分秒)
|
||||
* @returns {string}
|
||||
*/
|
||||
@@ -689,7 +706,7 @@ export default {
|
||||
* 获取定位信息
|
||||
*/
|
||||
getLocation(param = {}) {
|
||||
/*uni.getLocation({
|
||||
uni.getLocation({
|
||||
type: param.type ?? 'gcj02',
|
||||
success: res => {
|
||||
store.commit('setLocation', res);
|
||||
@@ -701,7 +718,7 @@ export default {
|
||||
complete: res => {
|
||||
typeof param.complete == 'function' && param.complete(res);
|
||||
}
|
||||
});*/
|
||||
});
|
||||
},
|
||||
// 计算两个经纬度之间的距离
|
||||
getDistance(lat1, lng1, lat2, lng2) {
|
||||
@@ -709,8 +726,8 @@ export default {
|
||||
var radLat2 = lat2 * Math.PI / 180.0;
|
||||
var a = radLat1 - radLat2;
|
||||
var b = lng1 * Math.PI / 180.0 - lng2 * Math.PI / 180.0;
|
||||
var s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) +
|
||||
Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b / 2), 2)));
|
||||
var s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) + Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(
|
||||
Math.sin(b / 2), 2)));
|
||||
s = s * 6378.137; // EARTH_RADIUS;
|
||||
s = Math.round(s * 10000) / 10000;
|
||||
return s;
|
||||
@@ -737,7 +754,7 @@ export default {
|
||||
/**
|
||||
* 微信订阅消息
|
||||
*/
|
||||
subscribeMessage(keywords) {
|
||||
subscribeMessage(keywords, callback) {
|
||||
// #ifdef MP-WEIXIN
|
||||
let url = '/weapp/api/weapp/messagetmplids';
|
||||
// #endif
|
||||
@@ -759,6 +776,9 @@ export default {
|
||||
},
|
||||
fail: (res) => {
|
||||
console.log('fail', res)
|
||||
},
|
||||
complete: (res) => {
|
||||
typeof callback == 'function' && callback();
|
||||
}
|
||||
})
|
||||
// #endif
|
||||
@@ -771,10 +791,18 @@ export default {
|
||||
},
|
||||
fail: res => {
|
||||
console.log('fail', res)
|
||||
},
|
||||
complete: (res) => {
|
||||
typeof callback == 'function' && callback();
|
||||
}
|
||||
});
|
||||
// #endif
|
||||
} else {
|
||||
typeof callback == 'function' && callback();
|
||||
}
|
||||
},
|
||||
fail: res => {
|
||||
typeof callback == 'function' && callback();
|
||||
}
|
||||
})
|
||||
},
|
||||
@@ -807,10 +835,8 @@ export default {
|
||||
title: shareConfig.title,
|
||||
path: shareConfig.path,
|
||||
imageUrl: shareConfig.imageUrl,
|
||||
success: res => {
|
||||
},
|
||||
fail: res => {
|
||||
}
|
||||
success: res => {},
|
||||
fail: res => {}
|
||||
}
|
||||
//分享到朋友圈
|
||||
let query = '';
|
||||
@@ -846,8 +872,7 @@ export default {
|
||||
Http.sendRequest({
|
||||
url: '/wechat/api/wechat/jssdkconfig',
|
||||
data: {
|
||||
url: uni.getSystemInfoSync().platform == 'ios' ? uni.getStorageSync('initUrl') : window.location
|
||||
.href
|
||||
url: uni.getDeviceInfo().platform == 'ios' ? uni.getStorageSync('initUrl') : window.location.href
|
||||
},
|
||||
success: res => {
|
||||
if (res.code == 0) {
|
||||
@@ -870,7 +895,7 @@ export default {
|
||||
//获取当前路由
|
||||
getCurrentRoute() {
|
||||
let currentRoutes = getCurrentPages(); // 获取当前打开过的页面路由数组
|
||||
let currentRoute = currentRoutes[currentRoutes.length - 1].route //获取当前页面路由
|
||||
let currentRoute = currentRoutes[currentRoutes.length - 1].route; //获取当前页面路由
|
||||
let currentParam = currentRoutes[currentRoutes.length - 1].options; //获取路由参数
|
||||
// 拼接参数
|
||||
let param = [];
|
||||
@@ -950,12 +975,10 @@ export default {
|
||||
var points_D = [];
|
||||
var points_E = [];
|
||||
const DIST_AB = Math.sqrt(Math.pow(points[1]['x'] - points[0]['x'], 2) + Math.pow(points[1]['y'] - points[0][
|
||||
'y'
|
||||
], 2));
|
||||
'y'], 2));
|
||||
// 邻控制BC点间距
|
||||
const DIST_BC = Math.sqrt(Math.pow(points[2]['x'] - points[1]['x'], 2) + Math.pow(points[2]['y'] - points[1][
|
||||
'y'
|
||||
], 2));
|
||||
'y'], 2));
|
||||
// D每次在AB方向上移动的距离
|
||||
if (points[0]['x'] > points[2]['x']) {
|
||||
var EACH_MOVE_AD = -(DIST_AB / times);
|
||||
@@ -1017,5 +1040,157 @@ export default {
|
||||
verifyMobile(mobile) {
|
||||
var parse = /^\d{11}$/.test(mobile);
|
||||
return parse;
|
||||
},
|
||||
// 获取缓存key
|
||||
getStorageKey(key) {
|
||||
return Config.storagePrefix + key;
|
||||
},
|
||||
// 重写uni缓存方法
|
||||
rewriteUniStorageMethod() {
|
||||
const setStorageSync = uni.setStorageSync;
|
||||
const setStorage = uni.setStorage;
|
||||
const getStorage = uni.getStorage;
|
||||
const getStorageSync = uni.getStorageSync;
|
||||
const removeStorage = uni.removeStorage;
|
||||
const removeStorageSync = uni.removeStorageSync;
|
||||
|
||||
uni.setStorage = (options) => {
|
||||
options.key = this.getStorageKey(options.key);
|
||||
setStorage(options)
|
||||
};
|
||||
|
||||
uni.setStorageSync = (key, data) => {
|
||||
setStorageSync(this.getStorageKey(key), data)
|
||||
};
|
||||
|
||||
uni.getStorage = (options) => {
|
||||
options.key = this.getStorageKey(options.key);
|
||||
getStorage(options)
|
||||
};
|
||||
|
||||
uni.getStorageSync = (key) => {
|
||||
return getStorageSync(this.getStorageKey(key))
|
||||
};
|
||||
|
||||
uni.removeStorage = (options) => {
|
||||
options.key = this.getStorageKey(options.key);
|
||||
removeStorage(options)
|
||||
};
|
||||
|
||||
uni.removeStorageSync = (key) => {
|
||||
return removeStorageSync(this.getStorageKey(key))
|
||||
}
|
||||
},
|
||||
//生成唯一id
|
||||
generateUUID() {
|
||||
var d = new Date().getTime(); //Timestamp
|
||||
var d2 = (performance && performance.now && (performance.now() * 1000)) ||
|
||||
0; //Time in microseconds since page-load or 0 if unsupported
|
||||
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
|
||||
var r = Math.random() * 16; //random number between 0 and 16
|
||||
if (d > 0) { //Use timestamp until depleted
|
||||
r = (d + r) % 16 | 0;
|
||||
d = Math.floor(d / 16);
|
||||
} else { //Use microseconds since page-load if supported
|
||||
r = (d2 + r) % 16 | 0;
|
||||
d2 = Math.floor(d2 / 16);
|
||||
}
|
||||
return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16);
|
||||
});
|
||||
},
|
||||
// 获取弹新人礼弹框页面
|
||||
openRegisterRewardPath(back) {
|
||||
return uni.getStorageSync('initiateLogin') || back;
|
||||
},
|
||||
// 登录完成后返回页面
|
||||
loginComplete(back, mode) {
|
||||
let url = uni.getStorageSync('initiateLogin') || back;
|
||||
uni.removeStorageSync('initiateLogin')
|
||||
|
||||
let jump = true;
|
||||
let arr = getCurrentPages().reverse();
|
||||
for (let i = 0; i < arr.length; i++) {
|
||||
if (url.indexOf(arr[i].route) != -1) {
|
||||
jump = false;
|
||||
uni.navigateBack({
|
||||
delta: i
|
||||
});
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (jump) {
|
||||
this.redirectTo(url, {}, 'redirectTo')
|
||||
}
|
||||
},
|
||||
// 微信提现收款
|
||||
merchantTransfer(data,withdrawInfo,callback) {
|
||||
Http.sendRequest({
|
||||
url: '/wechatpay/api/transfer/transfer',
|
||||
data: data,
|
||||
success: res => {
|
||||
if (res.code == 0) {
|
||||
uni.hideLoading();
|
||||
// #ifdef MP-WEIXIN
|
||||
if (wx.canIUse('requestMerchantTransfer')) {
|
||||
wx.requestMerchantTransfer({
|
||||
mchId: withdrawInfo.mch_id,
|
||||
appId: withdrawInfo.app_id,
|
||||
package: res.data.package_info,
|
||||
success: (res) => {
|
||||
typeof callback == 'function' && callback(res);
|
||||
},
|
||||
fail: (res) => {
|
||||
typeof callback == 'function' && callback(res);
|
||||
},
|
||||
});
|
||||
} else {
|
||||
wx.showModal({
|
||||
content: '你的微信版本过低,请更新至最新版本。',
|
||||
showCancel: false,
|
||||
});
|
||||
}
|
||||
// #endif
|
||||
// #ifdef H5
|
||||
if (this.isWeiXin()) {
|
||||
if (uni.getDeviceInfo().platform == 'ios') {
|
||||
var url = uni.getStorageSync('initUrl');
|
||||
} else {
|
||||
var url = location.href;
|
||||
}
|
||||
// 获取jssdk配置
|
||||
Http.sendRequest({
|
||||
url: '/wechat/api/wechat/jssdkconfig',
|
||||
data: {
|
||||
url: url
|
||||
},
|
||||
success: jssdkRes => {
|
||||
var wxJS = new Weixin();
|
||||
wxJS.init(jssdkRes.data);
|
||||
wxJS.withdrawWechat({
|
||||
mch_id: withdrawInfo.mch_id,
|
||||
wechat_appid: withdrawInfo.app_id,
|
||||
package_info: res.data.package_info
|
||||
},
|
||||
res => {
|
||||
typeof callback == 'function' && callback(res);
|
||||
},
|
||||
);
|
||||
}
|
||||
})
|
||||
}
|
||||
// #endif
|
||||
} else {
|
||||
this.showToast({
|
||||
title: res.message,
|
||||
});
|
||||
}
|
||||
},
|
||||
fail: err => {
|
||||
this.showToast({
|
||||
title: err.message,
|
||||
});
|
||||
}
|
||||
})
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1,119 +1,142 @@
|
||||
/**
|
||||
* 微信jssdk调用
|
||||
*/
|
||||
let Weixin = function () {
|
||||
var wx = require('jweixin-module');
|
||||
|
||||
this.weixin = wx;
|
||||
|
||||
this.init = function (params) {
|
||||
wx.config({
|
||||
debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
|
||||
appId: params.appId, // 必填,公众号的唯一标识
|
||||
timestamp: params.timestamp, // 必填,生成签名的时间戳
|
||||
nonceStr: params.nonceStr, // 必填,生成签名的随机串
|
||||
signature: params.signature, // 必填,签名
|
||||
jsApiList: ['chooseWXPay', 'openAddress', 'updateAppMessageShareData',
|
||||
'updateTimelineShareData', 'scanQRCode', 'hideMenuItems'
|
||||
] // 必填,需要使用的JS接口列表
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 发起支付
|
||||
* @param jsApiParame
|
||||
* @param callback
|
||||
* @param cancel
|
||||
*/
|
||||
this.pay = function (jsApiParame, callback, cancel) {
|
||||
wx.ready(function () {
|
||||
wx.chooseWXPay({
|
||||
timestamp: jsApiParame
|
||||
.timestamp, // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
|
||||
nonceStr: jsApiParame.nonceStr, // 支付签名随机串,不长于 32 位
|
||||
package: jsApiParame.package, // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=\*\*\*)
|
||||
signType: jsApiParame.signType, // 签名方式,默认为'SHA1',使用新版支付需传入'MD5'
|
||||
paySign: jsApiParame.paySign, // 支付签名
|
||||
success: function (res) {
|
||||
typeof callback == 'function' && callback(res);
|
||||
},
|
||||
cancel: function (res) {
|
||||
typeof cancel == 'function' && cancel(res);
|
||||
}
|
||||
});
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取收货地址
|
||||
* @param {Object} callback
|
||||
*/
|
||||
this.openAddress = function (callback) {
|
||||
wx.ready(function () {
|
||||
wx.openAddress({
|
||||
success: function (res) {
|
||||
typeof callback == 'function' && callback(res);
|
||||
},
|
||||
fail: (res) => {
|
||||
console.log('获取收货地址 fail',res);
|
||||
alert(JSON.stringify(res))
|
||||
}
|
||||
});
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 分享给好友
|
||||
* @param {Object} params
|
||||
* @param {Object} callback
|
||||
*/
|
||||
this.setShareData = function (params, callback) {
|
||||
|
||||
wx.ready(function () {
|
||||
// 自定义“分享给朋友”及“分享到QQ”按钮的分享内容
|
||||
wx.updateAppMessageShareData({
|
||||
title: params.title || '', // 分享标题
|
||||
desc: params.desc || '', // 分享描述
|
||||
link: params.link || '', // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
|
||||
imgUrl: params.imgUrl || '', // 分享图标
|
||||
success: function (res) {
|
||||
typeof callback == 'function' && callback(res);
|
||||
},
|
||||
fail: function (err) {
|
||||
}
|
||||
})
|
||||
|
||||
// 自定义“分享到朋友圈”及“分享到QQ空间”按钮的分享内容
|
||||
wx.updateTimelineShareData({
|
||||
title: params.title || '', // 分享标题
|
||||
link: params.link || '', // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
|
||||
imgUrl: params.imgUrl || '', // 分享图标
|
||||
success: function (res) {
|
||||
typeof callback == 'function' && callback(res);
|
||||
}
|
||||
})
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 扫一扫
|
||||
* @param {Object} callback
|
||||
*/
|
||||
this.scanQRCode = function (callback) {
|
||||
wx.ready(function () {
|
||||
wx.scanQRCode({
|
||||
needResult: 1,
|
||||
scanType: ["qrCode"],
|
||||
success: function (res) {
|
||||
typeof callback == 'function' && callback(res);
|
||||
}
|
||||
});
|
||||
})
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
export {
|
||||
Weixin
|
||||
/**
|
||||
* 微信jssdk调用
|
||||
*/
|
||||
let Weixin = function () {
|
||||
var wx = require('jweixin-module');
|
||||
|
||||
this.weixin = wx;
|
||||
|
||||
this.init = function (params) {
|
||||
wx.config({
|
||||
debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
|
||||
appId: params.appId, // 必填,公众号的唯一标识
|
||||
timestamp: params.timestamp, // 必填,生成签名的时间戳
|
||||
nonceStr: params.nonceStr, // 必填,生成签名的随机串
|
||||
signature: params.signature, // 必填,签名
|
||||
jsApiList: ['chooseWXPay', 'openAddress', 'updateAppMessageShareData',
|
||||
'updateTimelineShareData', 'scanQRCode', 'hideMenuItems'
|
||||
] // 必填,需要使用的JS接口列表
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 发起支付
|
||||
* @param jsApiParame
|
||||
* @param callback
|
||||
* @param cancel
|
||||
*/
|
||||
this.pay = function (jsApiParame, callback, cancel) {
|
||||
wx.ready(function () {
|
||||
wx.chooseWXPay({
|
||||
timestamp: jsApiParame
|
||||
.timestamp, // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
|
||||
nonceStr: jsApiParame.nonceStr, // 支付签名随机串,不长于 32 位
|
||||
package: jsApiParame.package, // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=\*\*\*)
|
||||
signType: jsApiParame.signType, // 签名方式,默认为'SHA1',使用新版支付需传入'MD5'
|
||||
paySign: jsApiParame.paySign, // 支付签名
|
||||
success: function (res) {
|
||||
typeof callback == 'function' && callback(res);
|
||||
},
|
||||
cancel: function (res) {
|
||||
typeof cancel == 'function' && cancel(res);
|
||||
}
|
||||
});
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取收货地址
|
||||
* @param {Object} callback
|
||||
*/
|
||||
this.openAddress = function (callback) {
|
||||
wx.ready(function () {
|
||||
wx.openAddress({
|
||||
success: function (res) {
|
||||
typeof callback == 'function' && callback(res);
|
||||
},
|
||||
fail: (res) => {
|
||||
console.log('获取收货地址 fail',res);
|
||||
alert(JSON.stringify(res))
|
||||
}
|
||||
});
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 分享给好友
|
||||
* @param {Object} params
|
||||
* @param {Object} callback
|
||||
*/
|
||||
this.setShareData = function (params, callback) {
|
||||
|
||||
wx.ready(function () {
|
||||
// 自定义“分享给朋友”及“分享到QQ”按钮的分享内容
|
||||
wx.updateAppMessageShareData({
|
||||
title: params.title || '', // 分享标题
|
||||
desc: params.desc || '', // 分享描述
|
||||
link: params.link || '', // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
|
||||
imgUrl: params.imgUrl || '', // 分享图标
|
||||
success: function (res) {
|
||||
typeof callback == 'function' && callback(res);
|
||||
},
|
||||
fail: function (err) {
|
||||
}
|
||||
})
|
||||
|
||||
// 自定义“分享到朋友圈”及“分享到QQ空间”按钮的分享内容
|
||||
wx.updateTimelineShareData({
|
||||
title: params.title || '', // 分享标题
|
||||
link: params.link || '', // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
|
||||
imgUrl: params.imgUrl || '', // 分享图标
|
||||
success: function (res) {
|
||||
typeof callback == 'function' && callback(res);
|
||||
}
|
||||
})
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 扫一扫
|
||||
* @param {Object} callback
|
||||
*/
|
||||
this.scanQRCode = function (callback) {
|
||||
wx.ready(function () {
|
||||
wx.scanQRCode({
|
||||
needResult: 1,
|
||||
scanType: ["qrCode"],
|
||||
success: function (res) {
|
||||
typeof callback == 'function' && callback(res);
|
||||
}
|
||||
});
|
||||
})
|
||||
}
|
||||
|
||||
// 提现
|
||||
this.withdrawWechat = function (data,callback) {
|
||||
wx.ready(function () {
|
||||
wx.checkJsApi({
|
||||
jsApiList: ['requestMerchantTransfer'],
|
||||
success: function (res) {
|
||||
if (res.checkResult['requestMerchantTransfer']) {
|
||||
WeixinJSBridge.invoke('requestMerchantTransfer', {
|
||||
mchId: data.mch_id,
|
||||
appId: data.wechat_appid,
|
||||
package: data.package_info,
|
||||
},
|
||||
function (res) {
|
||||
typeof callback == 'function' && callback(res);
|
||||
}
|
||||
);
|
||||
} else {
|
||||
alert('你的微信版本过低,请更新至最新版本。');
|
||||
}
|
||||
},
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
export {
|
||||
Weixin
|
||||
}
|
||||
Reference in New Issue
Block a user