You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
zhishifufei_uniapp/utils/utils.js

851 lines
27 KiB

import md5 from "js-md5";
import store from "@/store";
import config from '@/config';
import { getSupportData, getSiteServicePhone } from "@/api/public";
import { COOKIE_KEY } from '@/constants/storage-keys';
import MathX from "@/utils/math";
import { getWxAppIsPay, aliPayApp, aliPayWap } from "@/api/special";
import Routine from '@/libs/routine';
import { SET_LOGIN } from "@/store/types/muations-types";
import { isForceBinding } from "@/api/user";
import { VALID_LOGIN_STATUS } from "@/store/types/action-types";
import userInfo from "@/mixins/userInfo";
const { HTTP_REQUEST_URL, Url_SCHEMES } = config;
import {getIndexData } from "@/api/index";
const systemInfo = uni.getSystemInfoSync();
export default {
...MathX,
getFullPath(otherParams = {}) {
const pages = getCurrentPages();
const page = pages[pages.length - 1];
const { route, options } = page;
const params = this.objToParam({
...options,
...otherParams
});
return {
full_path: route,
scene: params || ""
}
},
delCookie(key) {
let cookies = this.getStorage(COOKIE_KEY);
if (cookies) {
cookies = cookies.trim();
let date = new Date(); //获取当前时间
date.setTime(date.getTime() - 10000); //格式化为cookie识别的时间
const data = key + "=v;expires=" + date.toGMTString(); //设置cookie
if (cookies[cookies.length - 1] === ";") {
cookies += data;
} else {
cookies = cookies + ";" + data;
}
// #ifndef MP
document.cookie = cookies;
// #endif
this.setStorage(COOKIE_KEY, cookies);
}
},
dateFormat(time) {
let date = new Date(time);
let year = date.getFullYear();
// 在日期格式中,月份是从0开始的,因此要加0,使用三元表达式在小于10的前面加0,以达到格式统一 如 09:11:05
let month = date.getMonth() + 1 < 10 ? "0" + (date.getMonth() + 1) : date.getMonth() + 1;
let day = date.getDate() < 10 ? "0" + date.getDate() : date.getDate();
let hours = date.getHours() < 10 ? "0" + date.getHours() : date.getHours();
let minutes = date.getMinutes() < 10 ? "0" + date.getMinutes() : date.getMinutes();
let seconds = date.getSeconds() < 10 ? "0" + date.getSeconds() : date.getSeconds();
// 拼接
// return year + "-" + month + "-" + day + " " + hours + ":" + minutes + ":" + seconds;
return year + "-" + month + "-" + day + ' ' + hours + ":" + minutes;
},
mergeLaunchParams(options) {
const app = getApp();
if (app.globalData.pre_data) {
const data = {
...app.globalData.pre_data,
options
};
app.globalData.pre_data = undefined;
return data;
}
return options;
},
parseScene(scene) {
if (scene) scene = decodeURIComponent(scene);
let pre_data;
const list = scene?.split("&");
if (list?.length) {
pre_data = {};
list.forEach(e => {
try {
let [k, v] = e.trim().split('=');
pre_data[k?.trim()] = v?.trim();
} catch {
}
});
}
return pre_data;
},
getCookie(key) {
let cookies = this.getStorage(COOKIE_KEY);
let params = {}
if (cookies) {
cookies?.split(';').forEach(e => {
try {
let [k, v] = e.trim().split('=');
x[k?.trim()] = v?.trim();
} catch {
}
});
}
return params[key];
},
setCookie(key, val, time) {
let cookies = this.getStorage(COOKIE_KEY);
if (cookies) {
cookies = cookies.trim();
let date = new Date(); //获取当前时间
if (!time) time = 1; //将date设置为n天以后的时间
date.setTime(date.getTime() + time * 24 * 3600 * 1000); //格式化为cookie识别的时间
const data = key + "=" + val + ";expires=" + date.toGMTString(); //设置cookie
if (cookies[cookies.length - 1] === ";") {
cookies += data;
} else {
cookies = cookies + ";" + data;
}
// #ifndef MP
document.cookie = cookies;
// #endif
this.setStorage(COOKIE_KEY, cookies);
}
},
getURLSearchParams(url) {
let requestParams = {};
if (url.indexOf("?") !== -1) {
let str = url.substr(url.indexOf("?") + 1); //截取?后面的内容作为字符串
// console.log(str, '?后面的内容');
let strs = str.split("&"); //将字符串内容以&分隔为一个数组
// console.log(strs, '以&切割的数组');
for (let i = 0; i < strs.length; i++) {
requestParams[strs[i].split("=")[0]] = decodeURI(
strs[i].split("=")[1]
);
// 将数组元素中'='左边的内容作为对象的属性名,'='右边的内容作为对象对应属性的属性值
}
}
return requestParams;
},
getClientRect(selector, target) {
return new Promise((resolve) => {
let query = uni.createSelectorQuery();
if (target) {
query = query.in(target);
};
query
.select(selector)
.boundingClientRect((res) => {
resolve(res);
})
.exec();
});
},
/**
*
* @param {int} support_type 咨询内容类型
* @param {int} id 商品/订单ID
* @param {int} type 商品/订单类型
*/
goSupport(support_type = 0, type = 0, id = 0 ,mer_id = 0) {
this.checkLogin(() => {
uni.navigateTo({
url: "/pages/customer/chat?" + this.objToParam({
support_type,
id,
type,
mer_id
}),
});
}, true);
},
asyncNextTick(vm) {
return new Promise((resolve) => {
vm.$nextTick(() => {
resolve();
});
});
},
getImagePath(path) {
// #ifdef H5
path = HTTP_REQUEST_URL + "/wap/public_api/proxy_img?path=" + encodeURIComponent(path);
// #endif
return new Promise((resolve, reject) => {
uni.downloadFile({
url: path,
success: ({ tempFilePath }) => {
resolve(tempFilePath);
},
fail: (err) => {
reject(err);
}
});
});
},
SplitArray(list, sp) {
if (typeof list != 'object') return [];
if (sp === undefined) sp = [];
for (let i = 0; i < list.length; i++) {
sp.push(list[i]);
}
return sp;
},
getSystemInfo(force = false) {
if (!force) return systemInfo;
return uni.getSystemInfoSync();
},
styleToStr(obj) {
return Object.keys(obj)
.map(k => `${k}: ${obj[k]}`)
.join(';');
},
objToParam(obj) {
return Object.keys(obj)
.map(k => `${k}=${obj[k]}`)
.join('&');
},
hexMd5(str) {
return md5.hex(str);
},
isForceBinding() {
return isForceBinding()
},
async checkLogin(fn, noLoginFn, BindPhone = 0) {
console.log(store.getters.isLogin, noLoginFn);
if (store.getters.isLogin) {
let { data } = await this.isForceBinding()
if (data.is_force_binding != 2 && !store.getters.userInfo.phone && !BindPhone) {
return uni.navigateTo({
url: "/pages/login/index"
});
}
fn();
} else {
if (noLoginFn === true) {
// #ifdef H5
if (this.isWeixin())
return uni.redirectTo({
url: "/pages/login/wechat"
});
// #endif
// #ifdef MP-TOUTIAO
setTimeout(() => {
this.showMsg("请点击头像登录")
}, 1000);
return uni.switchTab({
url: "/pages/my/index"
});
// #endif
uni.navigateTo({
url: "/pages/login/index"
});
} else {
noLoginFn && noLoginFn();
}
}
},
isWeixin() {
return navigator.userAgent.toLowerCase().indexOf("micromessenger") !== -1;
},
showMsg(msg, icon = "none") {
uni.showToast({
title: msg,
icon,
duration: 1500,
fail: function (err) {
console.log(err);
}
});
},
showModal(msg, content, fuc) {
uni.showModal({
title: msg,
content: content,
success: fuc
});
},
wrapFn(fn, options) {
return new Promise((resolve, reject) => {
fn({
...options,
success: (...args) => {
resolve(...args);
},
fail: (...err) => {
reject(...err);
}
});
});
},
//新用户登录完成后修改用户头像和名称
updategetUserInfo(data, vm) {
const header = {
'X-Requested-With': "XMLHttpRequest",
'X-Version': 'next'
};
return new Promise((reslove, reject) => {
uni.request({
url: HTTP_REQUEST_URL + "/wap" + "/auth_api/updateUserInfo",
method: 'POST',
header,
data: data || {},
success: (res) => {
vm.tipIsVisable = false
vm.$store.dispatch("app/" + VALID_LOGIN_STATUS);
},
fail: (err) => {
reject(err);
}
})
});
},
uploadImg(filePath) {
return this.wrapFn(uni.uploadFile, {
url: HTTP_REQUEST_URL + "/wap" + "/auth_api/upload",
filePath,
name: "file",
header: {
Authorization: 'Bearer ' + store.getters.token,
'X-Version': 'next'
}
}).then(res => {
const result = JSON.parse(res.data);
if (result.code === 200 && result.data.url) {
return result.data.url;
}
throw new Error(result.msg || "上传失败!");
});
},
pickerOneImg() {
return new Promise(async (resolve, reject) => {
const { tempFilePaths } = await this.wrapFn(uni.chooseImage, {
count: 1,
extension: ["png", "jpg", "jpeg"],
});
const path = tempFilePaths[0];
uni.showLoading({
mask: true,
});
try {
const result = await this.uploadImg(path);
uni.hideLoading();
resolve(result);
} catch (err) {
uni.hideLoading();
this.$util.showMsg(err.msg || err);
reject();
}
});
},
getStorage(k) {
try {
return uni.getStorageSync(k);
} catch (err) {
}
},
setStorage(k, v) {
try {
uni.setStorageSync(k, v);
} catch (err) {
}
},
removeStorage(k) {
try {
uni.removeStorageSync(k);
} catch (err) {
}
},
debounce(fn, delay = 200) {
let time = 0;
return (...args) => {
if (Date.now() - time < delay) return;
time = Date.now();
fn(...args);
}
},
wxh5Pay(jsConfig) {
const platform = uni.getSystemInfoSync().platform;
let path = jsConfig.mweb_url + "&redirect_url=" + encodeURIComponent(Url_SCHEMES + "://")
const webview = plus.webview.create('', HTTP_REQUEST_URL);
switch (platform) {
case 'android':
webview.loadURL(path, { 'Referer': HTTP_REQUEST_URL });
break;
case 'ios':
//解决ios支付完成后,打开safari浏览器的bug
res = webview.loadURL(path, { 'Referer': Url_SCHEMES });
break;
default:
webview.loadURL(path, { 'Referer': upload });
break;
}
},
getCallBackUrl() {
return HTTP_REQUEST_URL + '/wap/callback/pay_success_synchro'
},
aliPay(msn, type, vm) {
// #ifdef APP-PLUS
aliPayApp(msn, type).then(res => {
this.aliAppPay(res.msg, vm)
}).catch(err => {
this.showMsg(err.msg)
})
//#endif
// #ifdef H5
aliPayWap(msn, type).then((res) => {
this.aliWapPay(res)
}).catch(err => {
if (err.code = 400) {
return this.showMsg(err.msg)
}
this.aliWapPay(err)
})
//#endif
},
toutiaoPay: function (jsConfig, vm) {
let that = this
tt.pay({
orderInfo: jsConfig,
service: 5,
success(res) {
if (res.code == 0) {
uni.hideLoading();
vm.successOrder()
return that.showMsg(res.msg);
}
},
fail(res) {
console.log(e);
uni.hideLoading();
vm.extendOrder()
return that.showMsg("取消支付");
},
});
},
kuaishouPay: function (jsConfig, vm) {
vm.isOpenWeixing = true
let that = this
ks.pay({
serviceId: 1,
orderInfo: jsConfig,
success(res) {
if (res.code == 0) {
uni.hideLoading();
vm.successOrder()
return that.showMsg(res.msg);
}
},
fail(e) {
console.log(e);
uni.hideLoading();
vm.extendOrder()
return that.showMsg("取消支付");
},
})
},
aliWapPay(res) {
document.querySelector('body').innerHTML = res.msg;
document.forms[0].submit()
},
aliAppPay(jsConfig, vm) {
uni.showLoading({
title: '支付中'
});
if (jsConfig.search('&amp;') != -1)
jsConfig = jsConfig.replace(/&amp;/g, '&');
uni.requestPayment({
provider: 'alipay',
orderInfo: jsConfig,
success: function (res) {
vm.successOrder();
},
fail: function (err) {
vm.extendOrder()
},
complete: () => {
uni.hideLoading();
},
})
},
//刷新页面或关闭当前页面并跳转
refreshPage(url, timeout = 3000) {
setTimeout(() => {
uni.redirectTo({
url: url[0] === '/' ? url : '/' + url
});
}, timeout);
},
wxh5PayIsSuccess(orderId, type, vm) {
uni.showLoading({
title: '支付中'
});
setTimeout(() => {
getWxAppIsPay(orderId, type).then(({ data }) => {
uni.hideLoading()
if (data.is_pay) vm.successOrder();
else vm.extendOrder();
})
}, 1000);
},
weixinpay(config, vm) {
WeixinJSBridge.invoke(
'getBrandWCPayRequest', config,
function (res) {
if (res.err_msg == "get_brand_wcpay_request:ok") {
vm.successOrder()
} else if (res.err_msg == "get_brand_wcpay_request:cancel") {
vm.extendOrder()
} else {
vm.extendOrder()
}
}
)
},
//微信小程序支付
wechatRoutinePay: function (jsConfig, vm) {
let that = this
uni.requestPayment({
timeStamp: jsConfig.timeStamp,
nonceStr: jsConfig.nonceStr,
package: jsConfig.package,
signType: jsConfig.signType,
paySign: jsConfig.paySign,
success: function (res) {
uni.hideLoading();
vm.successOrder()
return that.showMsg(res.msg);
},
fail: function (e) {
uni.hideLoading();
vm.extendOrder()
return that.showMsg("取消支付");
},
complete: function (e) {
uni.hideLoading();
if (e.errMsg == 'requestPayment:cancel') {
vm.extendOrder()
return that.showMsg("取消支付");
}
}
});
},
//微信APP
wechatH5Pay: function (jsConfig, vm) {
// #ifdef APP-PLUS
vm.isOpenWeixing = true
this.wxh5Pay(jsConfig)
//#endif
// #ifdef H5
let callbackUrl = this.getCallBackUrl() + "?type=2&id=0";
let mwebUrl = jsConfig.mweb_url + "&redirect_url=" + encodeURIComponent(callbackUrl);
window.location.href = mwebUrl;
//#endif
},
//微信小程序登录
getUserProfile(vm,currentAvatar,username) {
const app = getApp();
let code = ''
Routine.getCode()
.then(codes => {
code = codes
})
uni.showLoading({
title: '正在登录中'
});
return Routine.getUserProfile()
.then(res => {
let userInfo = res.userInfo;
userInfo.code = code;
userInfo.spread_spid = app.globalData.spid || 0; //获取推广人ID
userInfo.currentAvatar = currentAvatar || '';
userInfo.username = username || '';
userInfo.agent_id=app.globalData.agent_id || 0
console.log(userInfo)
Routine.authUserInfo(userInfo).then(res => {
uni.hideLoading();
store.commit("app/" + SET_LOGIN, {
token: res.data.token,
userInfo: res.data.userInfo
});
var name = res.data.userInfo.nickname;
getIndexData().then(res =>{
if(name == res.data.login_nickname){
vm.tipIsVisable = true
}
})
})
.catch(res => {
uni.hideLoading();
uni.showToast({
title: res.msg,
icon: 'none',
duration: 2000
});
});
})
.catch(res => {
uni.hideLoading();
});
},
//快手小程序登录
async getKSUserProfile(vm) {
let that = this
const app = getApp();
uni.showLoading({
title: '正在登录中'
});
let provider = "kuaishou"
uni.checkSession({
success(res) {
return uni.getUserInfo({
provider: provider,
withCredentials: true,
success: function (res) {
uni.login({
provider: provider,
success: function (loginRes) {
let userInfo = res;
userInfo.code = loginRes.code;
userInfo.spread_spid = app.globalData.spid || 0; //获取推广人ID
userInfo.agent_id=app.globalData.agent_id || 0
userInfo.type = provider
Routine.authUserInfo(userInfo).then(res => {
uni.hideLoading();
store.commit("app/" + SET_LOGIN, {
token: res.data.token,
userInfo: res.data.userInfo
});
}).catch(res => {
uni.hideLoading();
uni.showToast({
title: res.msg,
icon: 'none',
duration: 2000
});
});
},
fail: function (err) {
uni.hideLoading();
uni.showToast({
title: err.msg,
icon: 'none',
duration: 2000
});
}
});
},
fail: function (err) {
uni.hideLoading();
console.log(err);
}
})
},
fail: function (err) {
uni.hideLoading();
uni.login({
provider: provider,
success: function () {
that.getKSUserProfile()
},
fail: function (err) {
uni.hideLoading();
uni.showToast({
title: err.msg,
icon: 'none',
duration: 2000
});
}
});
}
})
},
//抖音小程序登录
async getDYUserProfile(vm, userInfo) {
const app = getApp();
let provider = 'toutiao';
uni.showLoading({
title: '正在登录中'
});
uni.login({
provider: provider,
success: function (loginRes) {
console.log(loginRes);
userInfo.code = loginRes.code;
userInfo.spread_spid = app.globalData.spid || 0; //获取推广人ID
userInfo.agent_id=app.globalData.agent_id || 0
userInfo.type = provider
Routine.authUserInfo(userInfo).then(res => {
uni.hideLoading();
store.commit("app/" + SET_LOGIN, {
token: res.data.token,
userInfo: res.data.userInfo
});
}).catch(res => {
uni.hideLoading();
uni.showToast({
title: res.msg,
icon: 'none',
duration: 2000
});
});
},
fail: function (err) {
uni.hideLoading();
uni.showToast({
title: err.msg,
icon: 'none',
duration: 2000
});
}
});
},
/* 微信APP登录 */
wxAppLogin(vm) {
const app = getApp();
let provider = 'weixin';
uni.showLoading({
title: '正在登录中'
});
uni.login({
provider: provider,
success: function (loginRes) {
// 获取用户信息
uni.getUserInfo({
provider: provider,
success: function (infoRes) {
let userInfo = {};
userInfo.encryptedData = JSON.stringify(infoRes.userInfo)
userInfo.code = loginRes.code;
userInfo.spread_spid = app.globalData.spid || 0; //获取推广人ID
userInfo.agent_id=app.globalData.agent_id || 0
userInfo.type = 'wxapp'
Routine.authUserInfo(userInfo).then(res => {
uni.hideLoading();
store.commit("app/" + SET_LOGIN, {
token: res.data.token,
userInfo: res.data.userInfo
});
vm.$emit("login-close");
}).catch(res => {
console.log(res);
uni.hideLoading();
uni.showToast({
title: res.msg,
icon: 'none',
duration: 2000
});
});
},
fail() {
uni.showToast({
title: `获取用户信息失败`,
icon: 'none',
duration: 2000
})
},
complete() {
uni.hideLoading()
}
});
},
fail: function (err) {
console.log(err);
uni.hideLoading();
uni.showToast({
title: err.msg,
icon: 'none',
duration: 2000
});
}
});
},
jumpLogin(vm,currentAvatar,username) {
/*#ifdef MP-WEIXIN */
// return this.getUserProfile(vm,currentAvatar,username);
uni.navigateTo({
url: "/pages/login/index"
});
/* #endif */
/*#ifdef MP-KUAISHOU */
return this.getKSUserProfile(vm)
/* #endif */
// #ifdef APP-PLUS
console.log('APP-PLUS');
// vm.loginShow = true;
uni.navigateTo({
url: "/pages/login/index"
});
//#endif
// #ifdef H5
console.log('H5', this.isWeixin(), vm.loginShow === undefined);
uni.navigateTo({
url: "/pages/login/index"
});
// if (this.isWeixin()) {
// return uni.redirectTo({
// url: "/pages/login/wechat"
// });
// } else if (vm.loginShow === undefined) {
// uni.navigateTo({
// url: "/pages/login/index"
// });
// } else {
// vm.loginShow = true;
// }
// #endif
},
isAndroid() {
let u = navigator.userAgent;
return u.indexOf('Android') > -1 || u.indexOf('Adr') > -1;
}
}