This commit is contained in:
2023-11-07 17:15:33 +08:00
commit fe37e2e1df
418 changed files with 53012 additions and 0 deletions
@@ -0,0 +1,190 @@
/**
* vk-unicloud框架客户端(前端)
* author VK
*/
import userCenter from './libs/vk-unicloud/vk-unicloud-user-center'
import callFunctionUtil from './libs/vk-unicloud/vk-unicloud-callFunctionUtil'
import pubfn from './libs/function/index'
import modal from './libs/function/modal'
import navigate from './libs/function/vk.navigate'
import localStorage from './libs/function/vk.localStorage'
import sessionStorage from './libs/function/vk.sessionStorage'
import aliyunOSSUtil from './libs/function/aliyunOSSUtil'
import openapi from './libs/openapi/index'
import requestUtil from './libs/function/vk.request'
import importObject from './libs/function/vk.importObject'
import filters from './libs/function/vk.filters'
import mixin from './libs/mixin/mixin.js'
import initPermission from './libs/function/permission'
import storeMixin from './libs/store/mixin/mixin'
import initGlobalError from './libs/store/libs/error'
import consoleLog from './libs/install/console.log'
import updateManager from './libs/function/updateManager.js'
// #ifdef H5
import h5 from './libs/function/vk.h5'
// #endif
var vk = {
userCenter,
callFunctionUtil,
/**
* 发起一个云函数请求
*/
callFunction: callFunctionUtil.callFunction,
getToken: callFunctionUtil.getToken,
checkToken: callFunctionUtil.checkToken,
uploadFile: callFunctionUtil.uploadFile,
getConfig: callFunctionUtil.getConfig,
emitRefreshToken: callFunctionUtil.emitRefreshToken,
onRefreshToken: callFunctionUtil.onRefreshToken,
offRefreshToken: callFunctionUtil.offRefreshToken,
pubfn,
// #ifdef H5
h5,
// #endif
alert: modal.alert,
toast: modal.toast,
confirm: modal.confirm,
prompt: modal.prompt,
showActionSheet: modal.showActionSheet,
showLoading: modal.showLoading,
hideLoading: modal.hideLoading,
setLoading: modal.setLoading,
navigate,
// 保留当前页面,并进行页面跳转
navigateTo: navigate.navigateTo,
// 关闭当前页面,并进行页面跳转
redirectTo: navigate.redirectTo,
// 并关闭所有页面,并进行页面跳转
reLaunch: navigate.reLaunch,
// 并关闭所有非tab页面,并进行tab面跳转
switchTab: navigate.switchTab,
// 页面返回
navigateBack: navigate.navigateBack,
// 跳转到首页
navigateToHome: navigate.navigateToHome,
// 跳转到登录页
navigateToLogin: navigate.navigateToLogin,
// 跳转到小程序
navigateToMiniProgram: navigate.navigateToMiniProgram,
// 触发全局的自定义事件,附加参数都会传给监听器回调函数。
$emit: navigate.$emit,
// 监听全局的自定义事件,事件由 uni.$emit 触发,回调函数会接收事件触发函数的传入参数。
$on: navigate.$on,
// 触发全局的自定义事件,附加参数都会传给监听器回调函数。
$once: navigate.$once,
// 移除全局自定义事件监听器。
$off: navigate.$off,
// 本地持久
localStorage: localStorage,
// 本地会话缓存
sessionStorage: sessionStorage,
// 获取应用语言列表
getLocaleList: pubfn.getLocaleList,
// 获取应用当前语言
getLocale: pubfn.getLocale,
// 获取应用当前语言对象
getLocaleObject: pubfn.getLocaleObject,
// 设置应用当前语言
setLocale: pubfn.setLocale,
// 本地持久缓存
...localStorage,
// 本地会话缓存
...sessionStorage,
// 阿里云oss
aliyunOSSUtil,
// 更新管理器
updateManager,
// 开放API
openapi,
// 请求库
requestUtil,
// 发起URL请求
request: requestUtil.request,
// 导出云对象
importObject
};
// vk实例初始化
vk.init = function(obj = {}) {
let {
Vue, // Vue实例
config, // 配置
store, // vuex简写法则(新版本无需传store)
} = obj;
if (typeof store !== "undefined") {
// 兼容旧版本
Vue.use(store);
} else {
// 新版本无需传store
Vue.mixin(storeMixin);
if (config.globalError) {
Vue.use(initGlobalError);
}
}
// 自定义云函数路由配置
vk.callFunctionUtil.setConfig(config);
// 重写 console.log
Vue.use(consoleLog);
};
vk.getGlobalObject = function() {
if (typeof globalThis === "object") return globalThis;
if (typeof self === "object") return self;
if (typeof window === "object") return window;
if (typeof global === "object") return global;
};
// 加载拓展功能
vk.use = function(obj, util) {
for (let name in obj) {
if (obj[name] && typeof obj[name].init === "function") {
obj[name].init(util);
}
vk[name] = obj[name];
}
};
const install = Vue => {
// 全局混入
Vue.mixin(mixin);
// #ifndef VUE3
// 加载全局过滤器开始
for (let i in filters) {
Vue.filter(i, filters[i]);
}
Vue.prototype.vk = vk;
Vue.prototype.$fn = vk.pubfn;
// #endif
// #ifdef VUE3
// 将vk挂载到Vue实例
Vue.config.globalProperties.vk = vk;
Vue.config.globalProperties.$fn = vk.pubfn;
// #endif
// 将vk挂载到uni对象
if (typeof uni == "object") uni.vk = vk;
// 将vk挂载到全局
let vkGlobalThis = vk.getGlobalObject();
if (typeof vkGlobalThis == "object") vkGlobalThis.vk = vk;
let util = { vk };
// 加载插件
vk.use({
callFunctionUtil: vk.callFunctionUtil,
openapi: vk.openapi
}, util);
initPermission(Vue);
}
export default {
install
}
@@ -0,0 +1,274 @@
/**
* 阿里云oss工具类
*/
var aliyunOSSUtil = {};
var counterNum = 0;
/**
* 上传至阿里云oss
vk.callFunctionUtil.uploadFile({
filePath:tempFilePath,
fileType:"image",
provider:"aliyun",
index,
onUploadProgress:function(res){
// 上传过程中
if (res.progress > 0) {
if(list[index]){
list[index].progress = res.progress;
}
}
},
success:function(res){
// 上传成功
},
fail:function(res){
// 上传失败
}
});
*/
aliyunOSSUtil.uploadFile = function(obj) {
let {
filePath,
fileType = "image",
name = "file",
header = {
"x-oss-forbid-overwrite": true,
},
index = 0,
file = {},
needSave = false,
category_id,
title,
cloudPathRemoveChinese = true, // 删除文件名中的中文
cloudDirectory,
} = obj;
let vk = getApp().globalData.vk;
if (title) vk.showLoading(title);
let fileNameObj = createFileName(obj);
let aliyunOSS = getConfig();
let fileName = fileNameObj.fileFullName;
let formData = vk.pubfn.copyObject(aliyunOSS.uploadData);
formData["key"] = fileName; // 存储在oss的文件路径
/**
* 特别说明
* 若已知本地图片,则使用formData["name"] = filePath
* 若已知base64,则是用formData["file"] = file;// file base64字符串转成blob对象
*/
if (filePath.indexOf(";base64,") > -1) {
formData["file"] = dataURLtoBlob(filePath);
} else {
formData["name"] = filePath;
}
let Logger = {};
Logger.startTime = new Date().getTime();
Logger.filePath = filePath;
return new Promise((resolve, reject) => {
let uploadTask = uni.uploadFile({
url: aliyunOSS.action,
filePath,
name,
header,
formData: formData,
success: function(res) {
if (title) vk.hideLoading();
if (![200, 201].includes(res.statusCode)) {
if (typeof obj.fail === "function") obj.fail(res);
Logger.error = res;
} else {
// 上传成功
res.fileID = fileNameObj.url;
res.url = fileNameObj.url;
Logger.result = res;
if (typeof obj.success === "function") obj.success(res);
resolve(res);
if (needSave) {
// 保存文件记录到数据库
vk.userCenter.addUploadRecord({
data: {
url: res.fileID,
name: file.name,
size: file.size,
file_id: res.fileID,
provider: "aliyun",
category_id
},
filePath,
fileType,
success: function() {
if (typeof obj.addSuccess == "function") obj.addSuccess(res);
},
fail: function(res) {
if (typeof obj.addFail === "function") obj.addFail(res);
}
});
}
}
},
fail: function(res) {
if (title) vk.hideLoading();
Logger.error = res;
if (res.errMsg && res.errMsg.indexOf('fail url not in domain list') > -1) {
vk.toast('上传域名未在白名单中');
}
if (typeof obj.fail === "function") obj.fail(res);
},
complete: function() {
let vk = getApp().globalData.vk;
let config = vk.callFunctionUtil.config;
if (config.debug) {
Logger.endTime = new Date().getTime();
Logger.runTime = (Logger.endTime - Logger.startTime);
let colorArr = config.logger.colorArr;
let colorStr = colorArr[counterNum % colorArr.length];
counterNum++;
console.log("%c--------【开始】【阿里云oss文件上传】--------", 'color: ' + colorStr + ';font-size: 12px;font-weight: bold;');
console.log("【本地文件】: ", Logger.filePath);
console.log("【返回数据】: ", Logger.result);
console.log("【预览地址】: ", Logger.result.fileID);
console.log("【上传耗时】: ", Logger.runTime, "毫秒");
console.log("【上传时间】: ", vk.pubfn.timeFormat(Logger.startTime, "yyyy-MM-dd hh:mm:ss"));
if (Logger.error) console.error("【error】:", Logger.error);
console.log("%c--------【结束】【阿里云oss文件上传】--------", 'color: ' + colorStr + ';font-size: 12px;font-weight: bold;');
}
}
});
uploadTask.onProgressUpdate((res) => {
if (res.progress > 0) {
if (typeof obj.onUploadProgress === "function") obj.onUploadProgress(res);
}
});
});
};
export default aliyunOSSUtil;
// 获取配置
function getConfig() {
let vk = getApp().globalData.vk;
let aliyunOSS = vk.getConfig("service.aliyunOSS");
let configData = {};
if (aliyunOSS && aliyunOSS.uploadData && aliyunOSS.uploadData.OSSAccessKeyId) {
try {
// 只有开启按userId分组且开启了vk的vuex功能,才可以自动按userId分组
if (aliyunOSS.groupUserId && typeof vk.getVuex === "function") {
let userInfo = vk.getVuex("$user.userInfo");
if (vk.pubfn.isNotNull(userInfo) && userInfo._id) {
aliyunOSS.dirname += `/${userInfo._id}`;
}
}
} catch (err) {}
configData = {
uploadData: {
OSSAccessKeyId: aliyunOSS.uploadData.OSSAccessKeyId,
policy: aliyunOSS.uploadData.policy,
signature: aliyunOSS.uploadData.signature,
success_action_status: 200,
key: "test.png"
},
action: aliyunOSS.action,
dirname: aliyunOSS.dirname,
host: aliyunOSS.host,
};
}
return configData;
}
// 生成文件名
function createFileName(obj = {}) {
let {
file,
filePath,
index = 0,
cloudPathRemoveChinese = true,
cloudDirectory
} = obj;
let vk = getApp().globalData.vk;
let aliyunOSS = getConfig();
let dirname = aliyunOSS.dirname;
let host = aliyunOSS.host;
let fileObj = {};
let suffix = getFileSuffix(obj);
let oldName = index + "." + suffix;
if (file && file.name) {
let suffixName = file.name.substring(file.name.lastIndexOf(".") + 1);
if (suffixName && suffixName.length < 5) oldName = file.name;
// 只保留["数字","英文",".","-"]
if (cloudPathRemoveChinese) {
oldName = oldName.replace(/[^a-zA-Z.-d]/g, '');
}
if (oldName.indexOf(".") == 0) oldName = "0" + oldName;
}
let date = new Date();
let dateYYYYMMDD = vk.pubfn.timeFormat(date, "yyyy/MM/dd");
let dateTime = date.getTime().toString(); // 时间戳
// 时间戳后8位
let dateTimeEnd8 = dateTime.substring(dateTime.length - 8, dateTime.length);
let randomNumber = vk.pubfn.random(8); // 8位随机数
// 文件路径 = 固定路径名 + 业务路径
// 业务路径
let servicePath = "";
if (cloudDirectory) {
// 如果自定义了上传目录,则使用自定义的上传目录
if (cloudDirectory.lastIndexOf("/") !== cloudDirectory.length-1) {
cloudDirectory = cloudDirectory + "/";
}
servicePath = cloudDirectory;
} else {
// 否则,使用年月日作为上传目录
servicePath = dateYYYYMMDD + "/";
}
// 文件名 = 时间戳后8位 - 随机数8位 + 后缀名
let fileNickName = dateTimeEnd8 + randomNumber + "-" + oldName;
// 文件相对路径 = 业务目录 + 文件名
let fileRelativePath = servicePath + fileNickName;
// 文件名全称(包含文件路径) = 根目录 + 文件相对路径
let fileFullName = dirname + "/" + fileRelativePath;
// 外网地址 = 外网域名 + 文件名全称
let url = host + "/" + fileFullName;
fileObj.url = url;
fileObj.fileFullName = fileFullName;
fileObj.fileNickName = fileNickName;
return fileObj;
}
function getFileSuffix(obj = {}) {
let {
file,
filePath,
suffix = "png"
} = obj;
if (filePath) {
let suffixName = filePath.substring(filePath.lastIndexOf(".") + 1);
if (suffixName && suffixName.length < 5) suffix = suffixName;
}
if (file) {
if (file.path) {
let suffixName = file.path.substring(file.path.lastIndexOf(".") + 1);
if (suffixName && suffixName.length < 5) suffix = suffixName;
}
if (file.name) {
let suffixName = file.name.substring(file.name.lastIndexOf(".") + 1);
if (suffixName && suffixName.length < 5) suffix = suffixName;
}
}
return suffix;
}
function dataURLtoBlob(dataurl) {
let arr = dataurl.split(','),
mime = arr[0].match(/:(.*?);/)[1],
bstr = atob(arr[1]),
n = bstr.length,
u8arr = new Uint8Array(n);
while (n--) {
u8arr[n] = bstr.charCodeAt(n);
}
return new Blob([u8arr], { type: mime });
}
@@ -0,0 +1,34 @@
let timeoutArr = [];
/**
* 防抖函数
* 防抖原理:一定时间内,只有最后一次或第一次调用,回调函数才会执行
* @param {Function} fn 要执行的回调函数
* @param {Number} time 延时的时间
* @param {Boolean} isImmediate 是否立即执行 默认true
* @param {String} timeoutName 定时器ID
* @return null
vk.pubfn.debounce(() => {
}, 1000);
*/
function debounce(fn, time = 500, isImmediate = true, timeoutName = "default") {
// 清除定时器
if(!timeoutArr[timeoutName]) timeoutArr[timeoutName] = null;
if (timeoutArr[timeoutName] !== null) clearTimeout(timeoutArr[timeoutName]);
// 立即执行一次
if (isImmediate) {
var callNow = !timeoutArr[timeoutName];
timeoutArr[timeoutName] = setTimeout(() => {
timeoutArr[timeoutName] = null;
}, time);
if (callNow){
if(typeof fn === 'function') return fn();
}
} else {
// 设置定时器,当最后一次操作后,timeout不会再被清除,所以在延时time毫秒后执行fn回调方法
timeoutArr[timeoutName] = setTimeout(() => {
if(typeof fn === 'function') return fn();
}, time);
}
}
export default debounce
@@ -0,0 +1,23 @@
// 判断arr是否为一个数组,返回一个bool值
function isArray (arr) {
return Object.prototype.toString.call(arr) === '[object Array]';
}
// 深度克隆
function deepClone (obj) {
// 对常见的“非”值,直接返回原来值
if([null, undefined, NaN, false].includes(obj)) return obj;
if(typeof obj !== "object" && typeof obj !== 'function') {
//原始类型直接返回
return obj;
}
var o = isArray(obj) ? [] : {};
for(let i in obj) {
if(obj.hasOwnProperty(i)){
o[i] = typeof obj[i] === "object" ? deepClone(obj[i]) : obj[i];
}
}
return o;
}
export default deepClone;
@@ -0,0 +1,30 @@
import deepClone from "./deepClone";
// JS对象深度合并
function deepMerge(target = {}, source = {}) {
target = deepClone(target);
if (typeof target !== 'object' || typeof source !== 'object') return false;
for (var prop in source) {
if (!source.hasOwnProperty(prop)) continue;
if (prop in target) {
if (typeof target[prop] !== 'object') {
target[prop] = source[prop];
} else {
if (typeof source[prop] !== 'object') {
target[prop] = source[prop];
} else {
if (target[prop].concat && source[prop].concat) {
target[prop] = target[prop].concat(source[prop]);
} else {
target[prop] = deepMerge(target[prop], source[prop]);
}
}
}
} else {
target[prop] = source[prop];
}
}
return target;
}
export default deepMerge;
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,297 @@
/**
* 函数 - 弹窗
*/
const localeObj = {
title: {
"zh-Hans": "提示",
"zh-Hant": "提示",
"en": "Tips"
},
confirmText: {
"zh-Hans": "确定",
"zh-Hant": "確定",
"en": "OK"
},
cancelText: {
"zh-Hans": "取消",
"zh-Hant": "取消",
"en": "Cancel"
},
placeholderText: {
"zh-Hans": "请输入",
"zh-Hant": "請輸入",
"en": "Please enter"
}
};
export default {
/**
vk.alert("内容");
vk.alert("内容","提示","好的",function(){
});
*/
alert: function(a = " ", b, c, d) {
let vk = uni.vk;
let locale = vk.getLocale();
let obj = {
title: localeObj.title[locale],
confirmText: localeObj.confirmText[locale],
placeholderText: localeObj.placeholderText[locale],
content: a,
showCancel: false
};
if (typeof d === 'function') {
obj.title = b;
obj.confirmText = c;
obj.success = d;
} else if (typeof c === 'function') {
obj.title = b;
obj.success = c;
} else if (typeof b === 'function') {
obj.success = b;
} else if (b != undefined) {
obj.title = b;
if (c != undefined) {
obj.confirmText = c;
}
}
if (typeof obj.content === 'number') {
obj.content = obj.content + "";
} else if (typeof obj.content === 'object') {
obj.content = JSON.stringify(obj.content);
}
return uni.showModal(obj);
},
/**
vk.confirm("内容","提示","确定","取消",(res) => {
if(res.confirm){
}
});
*/
confirm: function(a, b, c, d, e) {
let vk = uni.vk;
let locale = vk.getLocale();
let obj = {
showCancel: true,
cancelColor: "#999",
title: localeObj.title[locale],
confirmText: localeObj.confirmText[locale],
cancelText: localeObj.cancelText[locale],
placeholderText: localeObj.placeholderText[locale],
};
if (typeof a === "object") {
obj = a;
} else {
if (typeof a === "string") {
obj.content = a;
}
if (typeof e === 'function') {
obj.title = b;
obj.confirmText = c;
obj.cancelText = d;
obj.success = e;
} else if (typeof d === 'function') {
obj.title = b;
obj.confirmText = c;
obj.success = d;
} else if (typeof c === 'function') {
obj.title = b;
obj.success = c;
} else if (typeof b === 'function') {
obj.success = b;
} else if (b != undefined) {
obj.title = b;
if (c != undefined) {
obj.confirmText = c;
}
}
}
return uni.showModal(obj);
},
/**
vk.prompt("请输入","提示","确定","取消",function(res){
if(res.confirm){
console.log(res.content);
}
},"输入框内初始内容");
*/
prompt: function(a, b, c, d, e, f) {
let vk = uni.vk;
let locale = vk.getLocale();
let obj = {
showCancel: true,
editable: true,
cancelColor: "#999",
title: localeObj.title[locale],
confirmText: localeObj.confirmText[locale],
cancelText: localeObj.cancelText[locale],
placeholderText: localeObj.placeholderText[locale],
};
if (typeof a === "object") {
obj = a;
} else {
if (typeof a === "string") {
obj.placeholderText = a;
}
if (typeof e === 'function') {
obj.title = b;
obj.confirmText = c;
obj.cancelText = d;
obj.success = e;
obj.content = f;
} else if (typeof d === 'function') {
obj.title = b;
obj.confirmText = c;
obj.success = d;
obj.content = e;
} else if (typeof c === 'function') {
obj.title = b;
obj.success = c;
obj.content = d;
} else if (typeof b === 'function') {
obj.success = b;
obj.content = c;
}
}
return uni.showModal(obj);
},
/**
vk.toast("提示内容","none");
*/
toast: function(a, b, c, d, e) {
let vk = uni.vk;
if (typeof a === 'number') {
a = a.toString();
} else if (typeof a === 'object') {
a = JSON.stringify(a);
}
let title = a;
let icon = "none";
let image = "";
let mask = false;
let duration = 1500;
let fn;
if (typeof e !== "undefined") {
if (typeof e == "function") fn = e;
if (typeof e == "number") duration = e;
if (typeof e == "boolean") mask = e;
}
if (typeof d !== "undefined") {
if (typeof d == "function") fn = d;
if (typeof d == "number") duration = d;
if (typeof d == "boolean") mask = d;
}
if (typeof c !== "undefined") {
if (typeof c == "function") fn = c;
if (typeof c == "number") duration = c;
if (typeof c == "boolean") mask = c;
}
if (typeof b !== "undefined") {
if (typeof b == "function") fn = b;
if (typeof b == "number") duration = b;
if (typeof b == "boolean") mask = b;
if (typeof b == 'string') {
if (b == "ok") b = "success";
if (b == "success" || b == "loading" || b == "none" || b == "error") {
icon = b;
} else {
image = b;
}
}
}
return uni.showToast({
title: title,
icon: icon,
image: image,
mask: mask,
duration: duration,
success: function(res) {
if (typeof fn === 'function') {
setTimeout(function() {
fn(res);
}, duration);
}
}
});
},
/**
* 操作菜单
vk.showActionSheet({
title:"",
list:["位置","@好友"],
color:"rgb(0, 0, 0)",
success:function(res){
if(res.index==0){
}else if(res.index==1){
}
}
});
*/
showActionSheet: function(object) {
let vk = uni.vk;
let title = object.title;
let list = object.list;
let color = object.color || "#000000";
let success = object.success;
let fail = object.fail;
let complete = object.complete;
return uni.showActionSheet({
itemList: list,
itemColor: color,
success: function(res) {
let index = res.tapIndex;
let text = list[index];
let g = { index, text };
//console.log(g);
if (typeof success == "function") success(g);
},
fail: function(res) {
//console.log(res);
if (typeof fail == "function") fail(res);
},
complete: function(res) {
if (typeof complete == "function") complete(res);
}
});
},
showLoading: function(obj) {
if (typeof obj == "string") {
let title = obj;
obj = {
title: title,
mask: true
};
}
uni.showLoading(obj);
},
hideLoading: function() {
uni.hideLoading();
},
// 设置当前页面的loading变量的值
setLoading: function(loading = true, obj = true) {
try {
let vk = uni.vk;
if (typeof obj === "boolean") {
let pages = getCurrentPages();
let page = pages[pages.length - 1];
let that = page.$vm;
that.loading = loading;
} else if (typeof obj === "object") {
let { data, name, that } = obj;
if (!data) data = that;
vk.pubfn.setData(data, name, loading);
} else if (typeof obj === "string") {
let pages = getCurrentPages();
let page = pages[pages.length - 1];
let that = page.$vm;
let name = obj;
vk.pubfn.setData(that, name, loading);
}
} catch (err) {}
},
}
@@ -0,0 +1,33 @@
function $hasRole(...args) {
const userRoles = this.$store.state.$user.userInfo.role || [];
return args.some(arg => {
if (Array.isArray(arg)) {
return arg.every(role => userRoles.includes(role));
} else {
return userRoles.includes(arg);
}
});
}
function $hasPermission(...args) {
const userPermission = this.$store.state.$user.permission || []
return args.some(arg => {
if (Array.isArray(arg)) {
return arg.every(permission => userPermission.includes(permission));
} else {
return userPermission.includes(arg);
}
});
}
export default function(Vue) {
// #ifndef VUE3
Vue.prototype.$hasRole = $hasRole;
Vue.prototype.$hasPermission = $hasPermission;
// #endif
// #ifdef VUE3
Vue.config.globalProperties.$hasRole = $hasRole;
Vue.config.globalProperties.$hasPermission = $hasPermission;
// #endif
}
@@ -0,0 +1,60 @@
/**
* 对象转url参数
* @param {*} data,对象
* @param {*} isPrefix,是否自动加上"?"
* 此函数参考uView
*/
function queryParams(data = {}, isPrefix = true, arrayFormat = 'brackets') {
let newData = JSON.parse(JSON.stringify(data));
let prefix = isPrefix ? '?' : ''
let _result = []
if (['indices', 'brackets', 'repeat', 'comma'].indexOf(arrayFormat) == -1) arrayFormat = 'brackets';
for (let key in newData) {
let value = newData[key]
// 去掉为空的参数
if (['', undefined, null].indexOf(value) >= 0) {
continue;
}
// 如果值为数组,另行处理
if (value.constructor === Array) {
// e.g. {ids: [1, 2, 3]}
switch (arrayFormat) {
case 'indices':
// 结果: ids[0]=1&ids[1]=2&ids[2]=3
for (let i = 0; i < value.length; i++) {
_result.push(key + '[' + i + ']=' + value[i])
}
break;
case 'brackets':
// 结果: ids[]=1&ids[]=2&ids[]=3
value.forEach(_value => {
_result.push(key + '[]=' + _value)
})
break;
case 'repeat':
// 结果: ids=1&ids=2&ids=3
value.forEach(_value => {
_result.push(key + '=' + _value)
})
break;
case 'comma':
// 结果: ids=1,2,3
let commaStr = "";
value.forEach(_value => {
commaStr += (commaStr ? "," : "") + _value;
})
_result.push(key + '=' + commaStr)
break;
default:
value.forEach(_value => {
_result.push(key + '[]=' + _value)
})
}
} else {
_result.push(key + '=' + value)
}
}
return _result.length ? prefix + _result.join('&') : ''
}
export default queryParams;
@@ -0,0 +1,51 @@
// #ifdef H5
uni.setClipboardData = function setClipboardData({
data,
success,
fail,
complete
} = {}) {
try {
const x = window.scrollX
const y = window.scrollY
const input = document.createElement('input')
input.setAttribute('readonly', 'readonly')
input.setAttribute('value', data)
input.style.position = 'absolute'
input.style.width = '100px'
input.style.left = '-10000px'
document.body.appendChild(input)
input.focus()
window.scrollTo(x, y)
input.setSelectionRange(0, input.value.length)
document.execCommand('copy')
document.body.removeChild(input)
setTimeout(() => {
const res = {
errMsg: 'setClipboardData:ok',
data
}
success && success(res)
complete && complete(res)
})
} catch (e) {
setTimeout(() => {
const res = {
errMsg: 'setClipboardData:fail'
}
fail && fail(res)
complete && complete(res)
})
}
}
// #endif
// JS对象深度合并
function setClipboardData(obj = {}) {
uni.setClipboardData({
...obj
});
}
export default setClipboardData;
@@ -0,0 +1,37 @@
let timeoutArr = [];
let flagArr = [];
/**
* 节流函数
* 节流原理:在一定时间内,只能触发一次
* @param {Function} fn 要执行的回调函数
* @param {Number} time 延时的时间
* @param {Boolean} isImmediate 是否立即执行
* @param {String} timeoutName 定时器ID
* @return null
vk.pubfn.throttle(function() {
}, 1000);
*/
function throttle(fn, time = 500, isImmediate = true, timeoutName = "default") {
if(!timeoutArr[timeoutName]) timeoutArr[timeoutName] = null;
if (isImmediate) {
if (!flagArr[timeoutName]) {
flagArr[timeoutName] = true;
// 如果是立即执行,则在time毫秒内开始时执行
if(typeof fn === 'function') fn();
timeoutArr[timeoutName] = setTimeout(() => {
flagArr[timeoutName] = false;
}, time);
}
} else {
if (!flagArr[timeoutName]) {
flagArr[timeoutName] = true;
// 如果是非立即执行,则在time毫秒内的结束处执行
timeoutArr[timeoutName] = setTimeout(() => {
flagArr[timeoutName] = false;
if(typeof fn === 'function') fn();
}, time);
}
}
};
export default throttle
@@ -0,0 +1,642 @@
/**
* 时间工具类
*/
var util = {};
util.getTargetTimezone = function(val) {
if (typeof val === "number") {
return val;
}
let vk = uni.vk;
let defaultValue = 8;
let targetTimezone = defaultValue;
try {
const config = vk.callFunctionUtil.getConfig();
targetTimezone = config.targetTimezone;
if (typeof targetTimezone !== "number") {
targetTimezone = defaultValue;
}
} catch (err) {}
return targetTimezone;
};
// 尽可能的将参数转成正确的时间对象
util.getDateObject = function(date, targetTimezone) {
if (!date) return "";
let nowDate;
// 如果是字符串,且纯数字,则强制转数值
if (typeof date === "string" && !isNaN(date) && date.length >= 10) date = Number(date);
if (typeof date === "number") {
if (date.toString().length == 10) date *= 1000;
nowDate = new Date(date); // 转时间对象
} else if (typeof date === "object") {
nowDate = new Date(date.getTime()); // 新建一个时间对象
} else if (typeof date === "string") {
targetTimezone = util.getTargetTimezone(targetTimezone);
let targetTimezoneStr = targetTimezone;
let targetTimezoneF = targetTimezone >= 0 ? "+" : "";
if (targetTimezone >= 0 && targetTimezone < 10) {
targetTimezoneStr = `0${targetTimezone}`;
} else if (targetTimezone < 0 && targetTimezone > -10) {
targetTimezoneStr = `-0${targetTimezone*-1}`;
}
let arr1 = date.split(" ");
let arr1_1 = arr1[0] || "";
let arr1_2 = arr1[1] || "";
let arr2;
if (arr1_1.indexOf("-") > -1) {
arr2 = arr1_1.split("-");
} else {
arr2 = arr1_1.split("/");
}
let arr3 = arr1_2.split(":");
let dateObj = {
year: Number(arr2[0]),
month: Number(arr2[1]) || 1,
day: Number(arr2[2]) || 1,
hour: Number(arr3[0]) || 0,
minute: Number(arr3[1]) || 0,
second: Number(arr3[2]) || 0,
};
for (let key in dateObj) {
if (dateObj[key] >= 0 && dateObj[key] < 10) dateObj[key] = `0${dateObj[key]}`;
}
// 格式 2022-10-01T00:00:00+08:00
let dateStr = `${dateObj.year}-${dateObj.month}-${dateObj.day}T${dateObj.hour}:${dateObj.minute}:${dateObj.second}${targetTimezoneF}${targetTimezoneStr}:00`;
nowDate = new Date(dateStr);
}
return nowDate;
};
// 获取时间在不同时区下的时间对象
util.getTimeByTimeZone = function(date, targetTimezone) {
let nowDate = util.getDateObject(date);
targetTimezone = util.getTargetTimezone(targetTimezone);
let timezoneOffset = nowDate.getTimezoneOffset();
let offset = timezoneOffset * 60 * 1000 + (targetTimezone * 60 * 60 * 1000);
let targetTime = nowDate.getTime() + offset;
nowDate = new Date(targetTime);
return nowDate;
};
/**
* 日期格式化
* @param {Date || Number} date 需要格式化的时间
* vk.pubfn.timeFormat(new Date(),"yyyy-MM-dd hh:mm:ss");
*/
util.timeFormat = function(date, fmt = 'yyyy-MM-dd hh:mm:ss', targetTimezone) {
try {
if (!date) return "";
targetTimezone = util.getTargetTimezone(targetTimezone);
let nowDate = util.getTimeByTimeZone(date, targetTimezone);
let opt = {
"M+": nowDate.getMonth() + 1, //月份
"d+": nowDate.getDate(), //日
"h+": nowDate.getHours(), //小时
"m+": nowDate.getMinutes(), //分
"s+": nowDate.getSeconds(), //秒
"q+": Math.floor((nowDate.getMonth() + 3) / 3), //季度
"S": nowDate.getMilliseconds(), //毫秒
"Z": `${targetTimezone >= 0 ? '+' : '-'}${Math.abs(targetTimezone).toString().padStart(2, '0')}:00` // 时区
};
if (/(y+)/.test(fmt)) {
fmt = fmt.replace(RegExp.$1, (nowDate.getFullYear() + "").substr(4 - RegExp.$1.length));
}
for (let k in opt) {
if (new RegExp("(" + k + ")").test(fmt)) {
fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (opt[k]) : (("00" + opt[k]).substr(("" + opt[k]).length)));
}
}
return fmt;
} catch (err) {
// 若格式错误,则原值显示
return time;
}
};
/**
* 解析日期对象属性
* @param {Date || Number} date 需要转换的时间
* vk.pubfn.getDateInfo(new Date());
*/
util.getDateInfo = function(date = new Date(), targetTimezone) {
let nowDate = util.getTimeByTimeZone(date, targetTimezone);
let year = nowDate.getFullYear() + '';
let month = (nowDate.getMonth() + 1 < 10 ? '0' + (nowDate.getMonth() + 1) : nowDate.getMonth() + 1);
let day = (nowDate.getDate() < 10 ? '0' + (nowDate.getDate()) : nowDate.getDate());
let hour = (nowDate.getHours() < 10 ? '0' + (nowDate.getHours()) : nowDate.getHours());
let minute = (nowDate.getMinutes() < 10 ? '0' + (nowDate.getMinutes()) : nowDate.getMinutes());
let second = (nowDate.getSeconds() < 10 ? '0' + (nowDate.getSeconds()) : nowDate.getSeconds());
let millisecond = nowDate.getMilliseconds(); //毫秒
let week = nowDate.getDay(); // 周
let quarter = Math.floor((nowDate.getMonth() + 3) / 3); //季度
return {
year: Number(year),
month: Number(month),
day: Number(day),
hour: Number(hour),
minute: Number(minute),
second: Number(second),
millisecond: Number(millisecond),
week: Number(week),
quarter: Number(quarter),
};
};
/**
* 获取时间范围
* @param {Date} date 日期对象 可以指定时间计算节点,默认使用当前时间进行计算
* 返回的是时间戳
* 返回数据如下:
{
todayStart 今日开始时间(时间戳)
todayEnd 今日结束时间(时间戳)
today12End 今日上午结束时间(时间戳)
monthStart 本月开始时间(时间戳)
monthEnd 本月结束时间(时间戳)
yearStart 本年开始时间(时间戳)
yearEnd 本年结束时间(时间戳)
weekStart 本周开始时间(时间戳)
weekEnd 本周结束时间(时间戳)
hourStart 当前小时开始时间(时间戳)
hourEnd 当前小时结束时间(时间戳)
yesterdayStart 昨天开始时间(时间戳)
yesterday12End 昨天上午结束时间(时间戳)
yesterdayEnd 昨天结束时间(时间戳)
lastMonthStart 上月开始时间(时间戳)
lastMonthEnd 上月结束时间(时间戳)
now 现在的时间点(含月年日时分秒)
months 本年度每月的开始和结束时间 months[1] 代表1月
days 本月每天的开始和结束时间 days[1] 代表1日
}
* vk.pubfn.getCommonTime();
*/
util.getCommonTime = function(date = new Date(), targetTimezone) {
let res = {};
let nowDate = util.getDateObject(date);
targetTimezone = util.getTargetTimezone(targetTimezone);
const dif = nowDate.getTimezoneOffset();
const timeDif = dif * 60 * 1000 + (targetTimezone * 60 * 60 * 1000);
const { year, month, day, hour, minute, second, millisecond, week, quarter } = util.getDateInfo(nowDate, targetTimezone);
const oneDayTime = 24 * 60 * 60 * 1000;
// 现在的时间
res.now = {
year,
month,
day,
hour,
minute,
second,
millisecond,
week,
quarter,
date_str: util.timeFormat(nowDate, "yyyy-MM-dd hh:mm:ss", targetTimezone),
date_day_str: util.timeFormat(nowDate, "yyyy-MM-dd", targetTimezone),
date_month_str: util.timeFormat(nowDate, "yyyy-MM", targetTimezone),
};
// 获取本月最大天数
let month_last_day = new Date(year, month, 0).getDate();
// 获取今年12月最大天数
let year_last_day = new Date(year, 12, 0).getDate();
// 今日开始时间
res.todayStart = new Date(`${year}/${month}/${day}`).getTime() - timeDif;
// 今日12点时间
res.today12End = new Date(`${year}/${month}/${day}`).getTime() + (12 * 60 * 60 * 1000 - 1) - timeDif;
// 今日结束时间
res.todayEnd = new Date(`${year}/${month}/${day}`).getTime() + (oneDayTime - 1) - timeDif;
// 本月开始时间
res.monthStart = new Date(`${year}/${month}/1`).getTime() - timeDif;
// 本月结束时间
res.monthEnd = new Date(`${year}/${month}/${month_last_day}`).getTime() + (oneDayTime - 1) - timeDif;
// 本年开始时间
res.yearStart = new Date(`${year}/1/1`).getTime() - timeDif;
// 本年结束时间
res.yearEnd = new Date(`${year}/12/${year_last_day}`).getTime() + (oneDayTime - 1) - timeDif;
// 当前小时开始时间
res.hourStart = new Date(`${year}/${month}/${day} ${hour}:00:00`).getTime() - timeDif;
// 当前小时结束时间
res.hourEnd = new Date(`${year}/${month}/${day} ${hour}:59:59`).getTime() - timeDif;
// 计算上月开始-----------------------------------------------------------
let year_last = year;
let month_last = month - 1;
if (month_last === 0) {
month_last = 12;
year_last = year - 1;
}
let month_last_day_last = new Date(year_last, month_last, 0).getDate();
// 上月开始时间
res.lastMonthStart = new Date(`${year_last}/${month_last}/1`).getTime() - timeDif;
// 上月结束时间
res.lastMonthEnd = new Date(`${year_last}/${month_last}/${month_last_day_last}`).getTime() + (oneDayTime - 1) - timeDif;
// 计算上月结束-----------------------------------------------------------
// 昨天开始时间
res.yesterdayStart = res.todayStart - 1000 * 3600 * 24;
// 昨天上午结束时间
res.yesterday12End = res.today12End - 1000 * 3600 * 24;
// 昨天结束时间
res.yesterdayEnd = res.todayEnd - 1000 * 3600 * 24;
let weekObj = util.getWeekOffsetStartAndEnd(0, nowDate, targetTimezone);
// 本周开始时间
res.weekStart = weekObj.startTime;
// 本周结束时间
res.weekEnd = weekObj.endTime;
// 本年1-12月的起止时间
res.months = [];
res.months[0] = {
startTime: res.monthStart,
endTime: res.monthEnd,
startTimeStr: util.timeFormat(res.monthStart, "yyyy-MM-dd hh:mm:ss", targetTimezone),
endTimeStr: util.timeFormat(res.monthEnd, "yyyy-MM-dd hh:mm:ss", targetTimezone),
monthStart: res.monthStart, // 兼容旧版
monthEnd: res.monthEnd, // 兼容旧版
};
for (let i = 1; i <= 12; i++) {
// 获取此月最大天数
let month_last_day = new Date(year, i, 0).getDate();
// 此月开始时间
let startTime = new Date(`${year}/${i}/1`).getTime() - timeDif;
// 此月结束时间
let endTime = new Date(`${year}/${i}/${month_last_day}`).getTime() + (oneDayTime - 1) - timeDif;
res.months[i] = {
startTime,
endTime,
startTimeStr: util.timeFormat(startTime, "yyyy-MM-dd hh:mm:ss", targetTimezone),
endTimeStr: util.timeFormat(endTime, "yyyy-MM-dd hh:mm:ss", targetTimezone),
monthStart: startTime, // 兼容旧版
monthEnd: endTime, // 兼容旧版
};
}
// 本月1号到最后一天每天的起止时间
res.days = [];
res.days[0] = {
startTime: res.todayStart,
endTime: res.todayEnd,
startTimeStr: util.timeFormat(res.todayStart, "yyyy-MM-dd hh:mm:ss", targetTimezone),
endTimeStr: util.timeFormat(res.todayEnd, "yyyy-MM-dd hh:mm:ss", targetTimezone)
};
for (let i = 1; i <= month_last_day; i++) {
let nowTime = res.monthStart + ((i - 1) * oneDayTime);
let { startTime, endTime } = util.getDayOffsetStartAndEnd(0, nowTime, targetTimezone);
res.days[i] = {
startTime,
endTime,
startTimeStr: util.timeFormat(startTime, "yyyy-MM-dd hh:mm:ss", targetTimezone),
endTimeStr: util.timeFormat(endTime, "yyyy-MM-dd hh:mm:ss", targetTimezone)
};
}
for (let key in res) {
if (typeof res[key] === "number" && res[key].toString().length === 13) {
res[`${key}Str`] = util.timeFormat(res[key], "yyyy-MM-dd hh:mm:ss", targetTimezone);
}
}
return res;
};
/**
* 获得指定年份和月份后的该月的开始时间和结束时间
* 返回数据如下:(时间戳形式)
{
startTime 该月开始时间
endTime 该月结束时间
}
vk.pubfn.getMonthStartAndEnd({
year:2021
month:1
});
*/
util.getMonthStartAndEnd = function(obj, targetTimezone) {
targetTimezone = util.getTargetTimezone(targetTimezone);
let res = {
startTime: null,
endTime: null
};
let { year, month } = obj;
if (year > 0 && month > 0) {
const dif = new Date().getTimezoneOffset();
const timeDif = dif * 60 * 1000 + (targetTimezone * 60 * 60 * 1000);
let month_last_day = new Date(year, month, 0).getDate();
// 开始时间
res.startTime = new Date(`${year}/${month}/1`).getTime() - timeDif;
// 结束时间
res.endTime = new Date(`${year}/${month}/${month_last_day}`).getTime() + (24 * 60 * 60 * 1000 - 1) - timeDif;
}
return res;
}
/**
* 获得相对当前时间的偏移 count 小时的起止日期(返回小时的开始和结束时间戳)
* @param {Number} count 默认0(0代表当前小时 -1代表上一个小时 1代表下一个小时以此类推)
* @param {Date || Number} date 指定从哪个时间节点开始计算
* vk.pubfn.getHourOffsetStartAndEnd(0);
*/
util.getHourOffsetStartAndEnd = function(count = 0, date = new Date(), targetTimezone) {
let nowDate = util.getDateObject(date);
targetTimezone = util.getTargetTimezone(targetTimezone);
let res = {};
const dif = nowDate.getTimezoneOffset();
const timeDif = dif * 60 * 1000 + (targetTimezone * 60 * 60 * 1000);
// 一天的毫秒数
let offsetMillisecond = 1000 * 60 * 60;
// 相对于当前日期count个天的日期
nowDate = new Date(nowDate.getTime() + (offsetMillisecond * 1 * count));
let dateInfo = util.getDateInfo(nowDate);
// 获得当天的起始时间
res.startTime = new Date(`${dateInfo.year}/${dateInfo.month}/${dateInfo.day} ${dateInfo.hour}:00:00`).getTime() - timeDif;
// 获得当天的结束时间
res.endTime = new Date(`${dateInfo.year}/${dateInfo.month}/${dateInfo.day} ${dateInfo.hour}:00:00`).getTime() + (offsetMillisecond - 1) - timeDif;
return res;
}
/**
* 获得相对当前时间的偏移 count 天的起止日期(返回日的开始和结束)
* @param {Number} count 默认0(0代表今日 -1代表昨日 1代表明日以此类推)
* @param {Date || Number} date 指定从哪个时间节点开始计算
* vk.pubfn.getDayOffsetStartAndEnd(0);
*/
util.getDayOffsetStartAndEnd = function(count = 0, date = new Date(), targetTimezone) {
let nowDate = util.getDateObject(date);
targetTimezone = util.getTargetTimezone(targetTimezone);
let res = {};
const dif = nowDate.getTimezoneOffset();
const timeDif = dif * 60 * 1000 + (targetTimezone * 60 * 60 * 1000);
// 一天的毫秒数
let offsetMillisecond = 1000 * 60 * 60 * 24;
// 相对于当前日期count个天的日期
nowDate = new Date(nowDate.getTime() + (offsetMillisecond * 1 * count));
let dateInfo = util.getDateInfo(nowDate);
// 获得当天的起始时间
res.startTime = new Date(`${dateInfo.year}/${dateInfo.month}/${dateInfo.day}`).getTime() - timeDif;
// 获得当天的结束时间
res.endTime = new Date(`${dateInfo.year}/${dateInfo.month}/${dateInfo.day}`).getTime() + (offsetMillisecond - 1) - timeDif;
return res;
}
/**
* 获得相对当前周count个周的起止日期(返回周的开始和结束)
* @param {Number} count 默认0(0代表本周 -1代表上周 1代表下周以此类推)
* vk.pubfn.getWeekOffsetStartAndEnd(0);
*/
util.getWeekOffsetStartAndEnd = function(count = 0, date = new Date(), targetTimezone) {
let res = {};
let nowDate = util.getDateObject(date);
targetTimezone = util.getTargetTimezone(targetTimezone);
const dif = nowDate.getTimezoneOffset();
const timeDif = dif * 60 * 1000 + (targetTimezone * 60 * 60 * 1000);
let nowDay = nowDate.getDay() === 0 ? 7 : nowDate.getDay();
nowDate.setDate(nowDate.getDate() - nowDay + 1 + count * 7);
let dateInfo1 = util.getDateInfo(nowDate);
nowDate.setDate(nowDate.getDate() + 7);
let dateInfo2 = util.getDateInfo(nowDate);
// 开始时间
res.startTime = new Date(`${dateInfo1.year}/${dateInfo1.month}/${dateInfo1.day}`).getTime() - timeDif;
// 结束时间
res.endTime = new Date(`${dateInfo2.year}/${dateInfo2.month}/${dateInfo2.day}`).getTime() - 1 - timeDif;
return res;
}
/**
* 获得相对当前时间的偏移 count 个月的起止日期(月的开始和结束时间戳)
* @param {Number} count 默认0(0代表本月 -1代表上月 1代表下月以此类推)
* @param {Date || Number} date 指定从哪个时间节点开始计算
* vk.pubfn.getMonthOffsetStartAndEnd(0);
*/
util.getMonthOffsetStartAndEnd = function(count = 0, date = new Date(), targetTimezone) {
let res = {};
let nowDate = util.getDateObject(date);
targetTimezone = util.getTargetTimezone(targetTimezone);
const dif = nowDate.getTimezoneOffset();
const timeDif = dif * 60 * 1000 + (targetTimezone * 60 * 60 * 1000);
let dateInfo = util.getDateInfo(nowDate);
let month = dateInfo.month + count;
let year = dateInfo.year;
if (month > 12) {
year = year + Math.floor(month / 12);
month = Math.abs(month) % 12;
} else if (month <= 0) {
year = year - 1 - Math.floor(Math.abs(month) / 12);
month = 12 - Math.abs(month) % 12;
}
let month_last_day = new Date(year, month, 0).getDate();
// 开始时间
res.startTime = new Date(`${year}/${month}/1`).getTime() - timeDif;
// 结束时间
res.endTime = new Date(`${year}/${month}/${month_last_day}`).getTime() + (24 * 60 * 60 * 1000 - 1) - timeDif;
return res;
}
/**
* 获得相对当前时间的偏移 count 个季度的起止日期(季度的开始和结束时间戳)
* @param {Number} count 默认0(0代表本季度 -1代表上个季度 1代表下个季度以此类推)
* @param {Date || Number} date 指定从哪个时间节点开始计算
* vk.pubfn.getQuarterOffsetStartAndEnd(0);
*/
util.getQuarterOffsetStartAndEnd = function(count = 0, date = new Date(), targetTimezone) {
let res = {};
let nowDate = util.getDateObject(date);
nowDate.setMonth(nowDate.getMonth() + count * 3);
targetTimezone = util.getTargetTimezone(targetTimezone);
const dif = nowDate.getTimezoneOffset();
const timeDif = dif * 60 * 1000 + (targetTimezone * 60 * 60 * 1000);
let dateInfo = util.getDateInfo(nowDate);
let month = dateInfo.month;
if ([1, 2, 3].indexOf(month) > -1) {
// 第1季度
month = 1;
} else if ([4, 5, 6].indexOf(month) > -1) {
// 第2季度
month = 4;
} else if ([7, 8, 9].indexOf(month) > -1) {
// 第3季度
month = 7;
} else if ([10, 11, 12].indexOf(month) > -1) {
// 第4季度
month = 10;
}
nowDate.setMonth(month - 1); // 因为0代表1月,所以这里要减1
let dateInfo1 = util.getDateInfo(nowDate);
nowDate.setMonth(nowDate.getMonth() + 3);
let dateInfo2 = util.getDateInfo(nowDate);
// 开始时间
res.startTime = new Date(`${dateInfo1.year}/${dateInfo1.month}/1`).getTime() - timeDif;
// 结束时间
res.endTime = new Date(`${dateInfo2.year}/${dateInfo2.month}/1`).getTime() - 1 - timeDif;
return res;
}
/**
* 获得相对当前时间的偏移 count 年的起止日期(年的开始和结束时间戳)
* @param {Number} count 默认0 (0代表今年 -1代表去年 1代表明年以此类推)
* @param {Date || Number} date 指定从哪个时间节点开始计算
* vk.pubfn.getYearOffsetStartAndEnd(0);
*/
util.getYearOffsetStartAndEnd = function(count = 0, date = new Date(), targetTimezone) {
let res = {};
let nowDate = util.getDateObject(date);
targetTimezone = util.getTargetTimezone(targetTimezone);
const dif = nowDate.getTimezoneOffset();
const timeDif = dif * 60 * 1000 + (targetTimezone * 60 * 60 * 1000);
let dateInfo = util.getDateInfo(nowDate);
let year = dateInfo.year + count;
// 开始时间
res.startTime = new Date(`${year}/1/1`).getTime() - timeDif;
// 结束时间
res.endTime = new Date(`${year}/12/31`).getTime() + (24 * 60 * 60 * 1000 - 1) - timeDif;
return res;
};
/**
* 获得指定时间偏移 year年 month月 day天 hours时 minutes分 seconds秒前或后的时间戳
* 返回时间戳
vk.pubfn.getOffsetTime(new Date(), {
year:0,
month:0,
day:0,
hours:0,
minutes:0,
seconds:0,
mode:"after", // after 之后 before 之前
});
vk.pubfn.getOffsetTime(new Date(), {
y:0,
m:0,
d:0,
hh:0,
mm:0,
ss:0,
mode:"after" // after 之后 before 之前
});
*/
util.getOffsetTime = function(date = new Date(), obj, targetTimezone) {
let nowDate = util.getDateObject(date);
let dateInfo = util.getDateInfo(nowDate);
targetTimezone = util.getTargetTimezone(targetTimezone);
const dif = nowDate.getTimezoneOffset();
const timeDif = dif * 60 * 1000 + (targetTimezone * 60 * 60 * 1000);
let year = obj.year || obj.y || 0;
let month = obj.month || obj.m || 0;
let day = obj.day || obj.d || 0;
let hour = obj.hour || obj.hours || obj.hh || 0;
let minute = obj.minute || obj.minutes || obj.mm || 0;
let second = obj.second || obj.seconds || obj.ss || 0;
let { mode = "after" } = obj;
if (mode == "before") {
year *= -1;
month *= -1;
day *= -1;
hour *= -1;
minute *= -1;
second *= -1;
}
let offsetObj = {
year: dateInfo.year + year,
month: dateInfo.month + month,
day: dateInfo.day + day,
hour: dateInfo.hour + hour,
minute: dateInfo.minute + minute,
second: dateInfo.second + second
};
nowDate = new Date(offsetObj.year, offsetObj.month - 1, offsetObj.day, offsetObj.hour, offsetObj.minute, offsetObj.second);
return nowDate.getTime() - timeDif;
}
/**
* 判断是否是闰年
* @param {Number | Date} year 需要计算的年份或时间,默认使用当前时间的年份
* vk.pubfn.timeUtil.isLeapYear(year);
*/
util.isLeapYear = function(year) {
if (typeof year === "undefined") {
let { now } = util.getCommonTime();
year = now.year;
} else if (typeof year === "object") {
let { now } = util.getCommonTime(year);
year = now.year;
}
if (((year % 4) == 0) && ((year % 100) != 0) || ((year % 400) == 0)) {
return true;
} else {
return false;
}
}
/**
* 判断是否是清明节
* @param {Date} date 日期对象 可以指定时间计算节点,默认使用当前时间进行计算
vk.pubfn.timeUtil.isQingming(new Date());
*/
util.isQingming = function(data = new Date()) {
let { now } = util.getCommonTime(data);
let { year, month, day } = now;
let key = false;
// 清明节的日期是不固定的,规律是:闰年开始的前2年是4月4日,闰年开始的第3年和第4年是4月5日
if (util.isLeapYear(year) || util.isLeapYear(year - 1)) {
if (month === 4 && day === 4) {
key = true;
}
} else {
if (month === 4 && day === 5) {
key = true;
}
}
return key;
}
/**
* 日期对象转换(已弃用,建议不要使用此API)
* @param {Date || Number} date 需要转换的时间
* @param {Number} type 转换方式
* type = 0 返回 2020-08-03 12:12:12
* type = 1 返回 20200803121212
* type = 2 返回 { YYYY, MM, DD, hh, mm, ss }
*/
util.getFullTime = function(date, type = 0, targetTimezone) {
if (!date) return "";
targetTimezone = util.getTargetTimezone(targetTimezone);
let nowDate = util.getDateObject(date);
const dif = nowDate.getTimezoneOffset();
const timeDif = dif * 60 * 1000 + (targetTimezone * 60 * 60 * 1000);
const east8time = nowDate.getTime() + timeDif;
nowDate = new Date(east8time);
let YYYY = nowDate.getFullYear() + '';
let MM = (nowDate.getMonth() + 1 < 10 ? '0' + (nowDate.getMonth() + 1) : nowDate.getMonth() + 1);
let DD = (nowDate.getDate() < 10 ? '0' + (nowDate.getDate()) : nowDate.getDate());
let hh = (nowDate.getHours() < 10 ? '0' + (nowDate.getHours()) : nowDate.getHours());
let mm = (nowDate.getMinutes() < 10 ? '0' + (nowDate.getMinutes()) : nowDate.getMinutes());
let ss = (nowDate.getSeconds() < 10 ? '0' + (nowDate.getSeconds()) : nowDate.getSeconds());
if (type === 2) {
return {
YYYY: Number(YYYY),
MM: Number(MM),
DD: Number(DD),
hh: Number(hh),
mm: Number(mm),
ss: Number(ss),
year: Number(YYYY),
month: Number(MM),
day: Number(DD),
hour: Number(hh),
minute: Number(mm),
second: Number(ss),
};
} else if (type === 1) {
return YYYY + "" + MM + "" + DD + "" + hh + "" + mm + "" + ss;
} else {
return YYYY + "-" + MM + "-" + DD + " " + hh + ":" + mm + ":" + ss;
}
};
export default util;
@@ -0,0 +1,93 @@
import deepClone from './deepClone'
var util = {};
/**
* 将树形结构转成数组结构
* @param {Array} treeData 数据源
* @param {Object} treeProps 树结构配置 { id : "menu_id", children : "children" }
* vk.pubfn.treeToArray(treeData);
*/
util.treeToArray = function(treeData, treeProps) {
let newTreeData = deepClone(treeData);
return util.treeToArrayFn(newTreeData, treeProps);
};
util.treeToArrayFn = function(treeData, treeProps = {}, arr=[], current_parent_id) {
let { id="_id", parent_id="parent_id", children = "children", deleteChildren = true } = treeProps;
for(let i in treeData){
let item = treeData[i];
if(current_parent_id) item[parent_id] = current_parent_id;
arr.push(item);
if(item[children] && item[children].length>0){
arr = util.treeToArrayFn(item[children], treeProps, arr, item[id]);
}
if(deleteChildren){
delete item[children];
}
}
return arr;
};
/**
* 数组结构转树形结构
let tree = vk.pubfn.arrayToTree(arrayData,{
id:"code",
parent_id:"parent_code",
});
*/
util.arrayToTree = function(originalArrayData,treeProps) {
let arrayData = deepClone(originalArrayData);
let {
id="_id",
parent_id="parent_id",
children = "children",
deleteParentId = false,
need_field
} = treeProps;
let result = [];
let temp = {};
for (let i = 0; i < arrayData.length; i++) {
temp[arrayData[i][id]] = arrayData[i]; // 以id作为索引存储元素,可以无需遍历直接定位元素
}
for (let j = 0; j < arrayData.length; j++) {
let currentElement = arrayData[j];
let newCurrentElement = {};
if(need_field){
need_field = uniqueArr(need_field.concat([id,parent_id,children]));
for(let keyName in currentElement){
if(need_field.indexOf(keyName) === -1){
delete currentElement[keyName];
}
}
}
let tempCurrentElementParent = temp[currentElement[parent_id]]; // 临时变量里面的当前元素的父元素
if (tempCurrentElementParent) {
// 如果存在父元素
if (!tempCurrentElementParent[children]) {
// 如果父元素没有chindren键
tempCurrentElementParent[children] = []; // 设上父元素的children键
}
if(deleteParentId){
delete currentElement[parent_id];
}
tempCurrentElementParent[children].push(currentElement); // 给父元素加上当前元素作为子元素
} else {
// 不存在父元素,意味着当前元素是一级元素
result.push(currentElement);
}
}
return result;
};
// 最简单数组去重法
function uniqueArr(array) {
let n = []; //一个新的临时数组
//遍历当前数组
for (let i = 0; i < array.length; i++) {
//如果当前数组的第i已经保存进了临时数组,那么跳过,
//否则把当前项push到临时数组里面
if (n.indexOf(array[i]) == -1) n.push(array[i]);
}
return n;
}
export default util;
@@ -0,0 +1,61 @@
var updateManager = {};
/**
* 本API返回全局唯一的版本更新管理器对象: updateManager,用于管理小程序更新。
* vk.updateManager.updateReady();
*/
updateManager.updateReady = function(obj) {
// #ifdef MP
updateManagerByMP(obj);
// #endif
};
export default updateManager;
function updateManagerByMP(obj = {}) {
let {
title = "更新提示",
content = "新版本已经准备好,点击更新!",
autoUpdate = true,
showCancel = false,
confirmText = "一键更新"
} = obj;
const updateManager = uni.getUpdateManager();
updateManager.onCheckForUpdate(function(res) {
// 请求完新版本信息的回调
// console.log(res.hasUpdate);
});
updateManager.onUpdateReady(function(res) {
uni.showModal({
title,
content,
showCancel,
confirmText,
success(res) {
if (res.confirm) {
if (typeof obj.success === "function") {
obj.success({
applyUpdate: updateManager.applyUpdate
});
}
if (typeof obj.complete === "function") obj.complete();
if (autoUpdate) {
// 新的版本已经下载好,调用 applyUpdate 应用新版本并重启
updateManager.applyUpdate();
}
}
},
});
});
updateManager.onUpdateFailed(function(res) {
// 新的版本下载失败
console.error("onUpdateFailed", res);
if (typeof obj.fail === "function") obj.fail(res);
if (typeof obj.complete === "function") obj.complete();
});
}
@@ -0,0 +1,63 @@
/**
* vk.filters
* 全局过滤器
*/
import pubfn from './index.js'
var util = {};
// 将时间显示成1秒前、1天前
util.dateDiff = function(starttime, showType) {
return pubfn.dateDiff(starttime, showType);
}
util.dateDiff2 = function(starttime, showType) {
return pubfn.dateDiff2(starttime, showType);
};
// 计数器1
util.numStr = function(n) {
return pubfn.numStr(n);
};
util.timeStr = function(date) {
return pubfn.timeFormat(date);
};
/**
* 日期对象转字符串
* @description 最终转成 2020-08-01 12:12:12
* @param {Date || Number} date 需要转换的时间
* date参数支持
* 支持:时间戳
* 支持:2020-08
* 支持:2020-08-24
* 支持:2020-08-24 12
* 支持:2020-08-24 12:12
* 支持:2020-08-24 12:12:12
*/
util.timeFilter = function(date, fmt) {
return pubfn.timeFormat(date, fmt);
};
// 金额过滤器
util.priceFilter = function(n, defaultValue = " - ") {
return pubfn.priceFilter(n, defaultValue);
};
// 金额过滤器 - 只显示小数点左边
util.priceLeftFilter = function(n) {
return pubfn.priceLeftFilter(n);
};
// 金额过滤器 - 只显示小数点右边
util.priceRightFilter = function(n) {
return pubfn.priceRightFilter(n);
};
// 百分比过滤器
util.percentageFilter = function(n, needShowSymbol, defaultValue = " - ") {
return pubfn.percentageFilter(n, needShowSymbol, defaultValue);
};
// 折扣过滤器
util.discountFilter = function(n, needShowSymbol, defaultValue = " - ") {
return pubfn.discountFilter(n, needShowSymbol, defaultValue);
};
// 大小过滤器 sizeFilter(1024,3,["B","KB","MB","GB"])
util.sizeFilter = function(...obj) {
let res = pubfn.calcSize(...obj);
return res.title;
};
export default util;
@@ -0,0 +1,60 @@
// #ifdef H5
/**
* H5专用的一些函数,会涉及到window等H5专用的内置对象。
*/
var h5 = {};
// 引入 微信公众号 js_sdk 包
import wx from './weixin-js-sdk'
h5.wx = wx;
/**
* 获取当前H5所在的环境
* let env = vk.h5.getEnv();
*/
h5.getEnv = function() {
let ua = window.navigator.userAgent.toLowerCase();
if (ua.match(/MicroMessenger/i) == 'micromessenger' && (ua.match(/miniprogram/i) == 'miniprogram')) {
// 微信小程序
return "mp-weixin";
}
if (ua.match(/MicroMessenger/i) == 'micromessenger') {
// 微信公众号
return "h5-weixin";
}
if (ua.match(/alipay/i) == 'alipay' && ua.match(/miniprogram/i) == 'miniprogram') {
return "mp-alipay";
}
if (ua.match(/alipay/i) == 'alipay') {
return "h5-alipay";
}
// 外部 H5
return "h5";
};
/**
* 获取当前项目根目录访问地址
* https://www.aaa.com/pages/index/index?a=1&b=1
* http://192.168.66.66:8080/pages/index/index?a=1&b=1
* 获取当前H5的url地址的https://www.aaa.com 部分
* let getRootPath = vk.h5.getRootPath();
* let getRootPath = vk.h5.getRootPath({ projectName:true });
*/
h5.getRootPath = function(obj={}) {
let {
projectName: _projectName = false
} = obj;
let wwwPath = window.location.href;
let pathName = window.location.pathname;
let pos = wwwPath.indexOf(pathName);
let localhostPaht = wwwPath.substring(0, pos);
let projectName = pathName.substring(0, pathName.substr(1).indexOf('/') + 1);
let rootPath = localhostPaht;
if (_projectName) {
rootPath = localhostPaht + projectName;
}
return rootPath;
};
export default h5;
// #endif
@@ -0,0 +1,59 @@
/**
* 导出云对象实例
* @param {String} name 云对象路径,如:client/pub
* @example const pubObject = uni.vk.importObject('client/pub'); // 导入云对象
* 注意,只能在声明 async 的函数内使用,如:
async test(){
let res = await pubObject.getList({
title: "请求中",
data: {
a: 1,
b: "2"
}
});
}
*/
var importObject = function(name, importObjectOptions = {}) {
const newObj = new Proxy(importObject, {
get: function(target, key, receiver) {
/**
* 导出云对象内的某个方法
* @param {Object} data 请求参数,如 { a:1, b:"2" } 云对象内可通过 let { a, b } = data; 获取参数
* @param {String} title 遮罩层提示语,为空或不传则代表不显示遮罩层。
* @param {Boolean} needAlert 为true代表请求错误时,会有弹窗提示。默认为true
* @param {Object} loading 与title二选一,格式为 { name: "loading", that: that } name是变量名,that是数据源,当发起请求时,自动that[name] = true; 请求结束后,自动that[name] = false;
*/
return async function(options) {
// 如果importObjectOptions中指定了easy为true,代表options的值就是请求参数
if (importObjectOptions.easy) {
options = {
data: options
}
}
// 如果importObjectOptions中指定了data,代表有默认请求参数,需要加到请求参数中
if (importObjectOptions.data) {
if (typeof importObjectOptions.data === "function") {
options.data = Object.assign({}, importObjectOptions.data(), options.data)
} else {
options.data = Object.assign({}, importObjectOptions.data, options.data)
}
}
return uni.vk.callFunction({
...importObjectOptions,
...options,
url: `${name}.${key}`
});
}
},
// set: function(target, key, value, receiver) {
// console.log("set");
// console.log("target",target);
// console.log("key",key);
// console.log("value",value);
// console.log("receiver", receiver);
// },
});
return newObj;
};
export default importObject;
@@ -0,0 +1,131 @@
/**
* vk依赖扩展 - localStorage 本地缓存
* pub - 公共的可随时删除的缓存
* kh - 跟登录账号有关联的缓存
* sys - 系统级缓存 - 一般不删除
*
* 储存缓存
* vk.setStorageSync(key, data);
* 获取缓存
* vk.getStorageSync(key);
*/
var localStorage = {};
/**
* 将 data 存储在本地缓存中指定的 key 中,会覆盖掉原来该 key 对应的内容,这是一个同步接口。
* @param {String} key 本地缓存中的指定的 key
* @param {Any} data 需要存储的内容,只支持原生类型、及能够通过 JSON.stringify 序列化的对象
*/
localStorage.setStorageSync = function(key, data) {
uni.setStorageSync(key, data);
watchLocalStorage({ type: "set", key, data });
};
/**
* 从本地缓存中异步获取指定 key 对应的内容。
* @param {String} key 本地缓存中的指定的 key
*/
localStorage.getStorageSync = function(key) {
let data = uni.getStorageSync(key);
// get 没有必要监听
// watchLocalStorage({ type:"get", key, data });
return data;
};
/**
* 同步获取当前 storage 的相关信息。
*/
localStorage.getStorageInfoSync = function() {
let info = uni.getStorageInfoSync();
let sizeInfo = calcSize(Number(info.currentSize), 1024, 3, ["KB", "MB", "GB"]);
info.sizeInfo = sizeInfo;
return info;
};
/**
* 从本地缓存中同步移除指定 key。
* @param {String} key 本地缓存中的指定的 key
*/
localStorage.removeStorageSync = function(key) {
uni.removeStorageSync(key);
watchLocalStorage({ type: "remove", key });
};
/**
* 从本地缓存中异步移除指定 key。
*/
localStorage.removeStorage = function(obj) {
uni.removeStorage({
key: obj.key,
success: (res) => {
watchLocalStorage({ type: "remove", key: obj.key });
if (obj.success) obj.success(res);
},
fail: obj.fail,
complete: obj.complete
});
};
/**
* 同步清理本地数据缓存。若key有值,则清除键值为指定字符串开头的缓存
* @param {String} key 本地缓存中的指定的 key
* vk.clearStorageSync();
*/
localStorage.clearStorageSync = function(key) {
if (key) {
let { keys } = uni.getStorageInfoSync();
if (keys) {
keys.map((keyName) => {
if (keyName.indexOf(key) == 0) {
localStorage.removeStorage({
key: keyName
});
}
});
}
} else {
uni.clearStorage();
watchLocalStorage({ type: "clear" });
}
};
export default localStorage;
/**
* 单位进制换算
* length 换算前大小
* ary 进制,如KB-MB-GB,进制1024
* precision 数值精度
* arr 进制的数组,如["B","KB","MB","GB"]
* calcSize(length,1024,3,["B","KB","MB","GB"]);
*/
function calcSize(length = 0, ary, precision, arr) {
var size = parseFloat(length);
var mySize = 0;
var type = "";
if (size < ary || arr.length <= 1) {
type = arr[0];
mySize = parseFloat(size.toFixed(precision));
} else {
for (var i = 1; i < arr.length; i++) {
var g = arr[i];
size = size / ary;
if (size < ary) {
type = g;
mySize = parseFloat(size.toFixed(precision));
break;
}
}
}
return {
size: mySize,
type: type,
title: mySize + " " + type
}
};
function watchLocalStorage(obj) {
if (typeof localStorage.watch === "function") {
localStorage.watch(obj);
}
}
@@ -0,0 +1,462 @@
/**
* 函数 - 页面导航
*/
// #ifndef VUE3
var config;
try {
config = require('@/app.config.js');
if (typeof config.default === "object") {
config = config.default;
}
} catch (e) {
config = {};
}
// #endif
// #ifdef VUE3
import config from '@/app.config.js'
// #endif
var util = {};
var lastNavigate = {
url: "",
time: 0
};
/**
* 保留当前页面,跳转到应用内的某个页面,使用vk.navigateBack可以返回到原页面。
* vk.navigateTo(url);
*/
util.navigateTo = function(obj) {
let vk = uni.vk;
if (typeof obj == "string") {
let url = obj;
obj = {
url: url
};
} else if (typeof obj == "undefined") {
obj = {};
}
if (!obj.url) {
vk.toast("url不能为空!");
return false;
}
let time = Date.now();
if (lastNavigate.url === obj.url && (time - lastNavigate.time) < 200) {
return false;
}
lastNavigate = { url: obj.url, time };
util.checkNeedLogin({
url: obj.url,
success: function(res) {
if (res.needLogin) {
obj.url = vk.pubfn.getPageFullPath(obj.url);
vk.navigate.setOriginalPage(obj);
obj.url = config.login.url;
// login拦截器开始-----------------------------------------------------------
let { interceptor = {} } = config;
if (typeof interceptor.login === "function") {
let key = interceptor.login({
vk,
params: obj,
res: {
...res,
code: 30204,
msg: "本地token校验未通过"
}
});
if (typeof key === "undefined" || key !== true) return false;
}
// login拦截器结束-----------------------------------------------------------
} else {
vk.navigate.setOriginalPage(null);
}
util._navigateTo(obj);
}
});
};
util._navigateTo = function(obj) {
let { interceptor = {} } = config;
if (typeof interceptor.navigateTo === "function") {
let vk = uni.vk;
obj.pagePath = vk.pubfn.getPageFullPath(obj.url);
let key = interceptor.navigateTo({
...obj,
vk
});
if (typeof key == "boolean" && key === false) return false;
}
let {
url,
animationType = "pop-in",
animationDuration = 300,
events,
mode = "navigateTo"
} = obj;
// 此处写法仅为支持vue3,vue3不支持uni[apiName]的形式调用
let navigateFn;
if (mode === "navigateTo") {
navigateFn = uni.navigateTo;
} else if (mode === "redirectTo") {
navigateFn = uni.redirectTo;
} else if (mode === "reLaunch") {
navigateFn = uni.reLaunch;
} else if (mode === "switchTab") {
navigateFn = uni.switchTab;
} else {
navigateFn = uni.navigateTo;
}
// 此处写法仅为支持vue3,vue3不支持uni[apiName]的形式调用
navigateFn({
url: url,
animationType: animationType,
animationDuration: animationDuration,
events: events, // 参考 https://uniapp.dcloud.io/api/router?id=navigateto
success: function(res) {
if (typeof obj.success == "function") obj.success(res);
},
fail: function(err) {
if (err.errMsg.indexOf("not found") > -1) {
let vk = uni.vk;
let errUrl = vk.pubfn.getPageFullPath(url);
vk.toast(`页面 ${errUrl} 不存在`, "none");
console.error(err);
return false;
}
uni.switchTab({
url: url,
success: obj.success,
fail: function() {
uni.redirectTo({
url: url,
success: obj.success,
fail: function(err) {
console.error(err);
if (typeof obj.fail == "function") obj.fail(err);
}
});
}
});
},
complete: function(res) {
if (typeof obj.complete == "function") obj.complete(res);
}
});
};
/**
* 关闭当前页面,跳转到应用内的某个页面。
* vk.redirectTo(url);
*/
util.redirectTo = function(obj) {
obj = util.paramsInit(obj);
obj.mode = "redirectTo";
util.navigateTo(obj);
};
/**
* 关闭所有页面,打开到应用内的某个页面。
* vk.reLaunch(url);
*/
util.reLaunch = function(obj) {
obj = util.paramsInit(obj);
obj.mode = "reLaunch";
util.navigateTo(obj);
};
/**
* 跳转到 tabBar 页面,并关闭其他所有非 tabBar 页面。
* vk.switchTab(url);
*/
util.switchTab = function(obj) {
obj = util.paramsInit(obj);
obj.mode = "switchTab";
util.navigateTo(obj);
};
/**
* 关闭当前页面,返回上一页面或多级页面。可通过 getCurrentPages() 获取当前的页面栈,决定需要返回几层。
* vk.navigateBack();
*/
util.navigateBack = function(obj) {
let vk = uni.vk;
if (typeof obj == "number") {
let delta = obj;
obj = {
delta: delta
};
} else if (typeof obj == "undefined") {
obj = {};
}
let {
delta = 1,
animationType = "pop-out",
animationDuration = 300
} = obj;
uni.navigateBack({
delta: delta,
animationType: animationType,
animationDuration: animationDuration,
success: function() {
if (typeof obj.success == "function") obj.success();
},
fail: function(res) {
console.error(res);
if (typeof obj.fail == "function") obj.fail();
},
complete: function() {
if (typeof obj.complete == "function") obj.complete();
}
});
};
/**
* 跳转到登录前的页面
* vk.navigate.originalTo();
*/
util.originalTo = function() {
let vk = uni.vk;
let originalPage = vk.navigate.getOriginalPage();
vk.navigate.setOriginalPage(null);
util.redirectTo(originalPage);
};
/**
* 获取登录前的页面
* vk.navigate.getOriginalPage();
*/
util.getOriginalPage = function() {
if (typeof uni.vk.getVuex === "function") {
// 有安装vuex则使用vuex
return uni.vk.getVuex('$app.originalPage');
} else {
// 未安装则使用本地缓存
return uni.vk.getStorageSync('vk.navigate.originalPage');
}
};
/**
* 设置登录前的页面
* vk.navigate.setOriginalPage(originalPage);
*/
util.setOriginalPage = function(originalPage) {
uni.vk.navigate.originalPage = originalPage; // 兼容老版本
if (typeof uni.vk.getVuex === "function") {
// 有安装vuex则使用vuex
return uni.vk.setVuex('$app.originalPage', originalPage);
} else {
// 未安装则使用本地缓存
return uni.vk.setStorageSync('vk.navigate.originalPage', originalPage);
}
};
/**
* 跳转到首页
* vk.navigateToHome();
*/
util.navigateToHome = function(obj = {}) {
let vk = uni.vk;
let {
mode = "reLaunch"
} = obj;
vk[mode](config.index.url);
};
/**
* 跳转到登录页
* vk.navigateToLogin();
*/
util.navigateToLogin = function(obj = {}) {
let vk = uni.vk;
let {
mode = "reLaunch"
} = obj;
vk[mode](config.login.url);
};
/**
* 检测是否满足条件(内部方法)
util.checkWildcardTest({
url:url,
pagesRule:config.checkTokenPages,
success:function(res){
if(res.success){
}
}
})
*/
util.checkWildcardTest = function(obj) {
let vk = uni.vk;
let {
url,
pagesRule
} = obj;
// ../ 转成绝对路径
url = vk.pubfn.getPageFullPath(url);
let key = false;
if (vk.pubfn.isNotNull(pagesRule)) {
let { mode = 0, list = [] } = pagesRule;
if (mode > 0) {
let regExpKey = false;
let path = util.getPagePath(url);
for (let i = 0; i < list.length; i++) {
let pageRegExp = list[i];
regExpKey = vk.pubfn.wildcardTest(path, pageRegExp);
if (regExpKey) {
break;
}
}
if (mode === 1 && regExpKey) {
key = true;
} else if (mode === 2 && !regExpKey) {
key = true;
}
}
}
return {
url,
key
};
};
/**
* 检测是否需要登录(内部方法)
util.checkNeedLogin({
url:url,
success:function(res){
if(res.needLogin){
}
}
})
*/
util.checkNeedLogin = function(obj) {
let vk = uni.vk;
let { url, success } = obj;
let needLogin = false; // 用户是否需要重新登录
let pageNeedLogin = false; // 该页面是否需要登录才能访问
let pagesRule = config.checkTokenPages;
if (pagesRule) {
let res = util.checkWildcardTest({
url,
pagesRule
});
pageNeedLogin = res.key;
if (pageNeedLogin) {
// 本地判断token有效期(联网会浪费性能)
if (!vk.checkToken()) {
needLogin = true;
}
}
}
success({
url,
needLogin,
pageNeedLogin
});
};
// 获取?前面的地址
util.getPagePath = function(url) {
let pathIndex = url.indexOf("?");
let path = url;
if (pathIndex > -1) {
path = path.substring(0, pathIndex);
}
return path;
};
util.paramsInit = function(obj) {
let vk = uni.vk;
if (typeof obj == "string") {
let url = obj;
obj = {
url: url
};
} else if (typeof obj == "undefined") {
obj = {};
}
if (!obj.url) {
vk.toast("url不能为空!");
return false;
}
return obj;
}
/**
* 跳转到小程序
vk.navigateToMiniProgram({
appId: 'appId',
path: 'pages/index/index',
extraData:{
//发送数据携带的参数
},
success(res) {
// 打开成功
}
})
*/
util.navigateToMiniProgram = function(obj) {
let vk = uni.vk;
// #ifdef H5
vk.toast("不支持打开小程序", "none");
// #endif
// #ifndef H5
uni.navigateToMiniProgram(obj);
// #endif
};
/**
* 检测是否可以分享(内部方法)
util.checkAllowShare({
url:url,
});
*/
util.checkAllowShare = function(obj) {
let vk = uni.vk;
let { url, success } = obj;
let pagesRule = config.checkSharePages || {};
if (pagesRule && pagesRule.mode > 0) {
let res = util.checkWildcardTest({
url,
pagesRule
});
// #ifdef MP
let menus = pagesRule.menus || ['shareAppMessage', 'shareTimeline'];
if (res.key) {
//console.log("允许分享");
uni.showShareMenu({
withShareTicket: false,
menus
});
} else {
//console.log("禁止分享");
uni.hideShareMenu({
menus
})
}
// #endif
}
};
util.$emit = function(...obj) {
return uni.$emit(...obj);
};
util.$on = function(...obj) {
return uni.$on(...obj);
};
util.$once = function(...obj) {
return uni.$once(...obj);
};
util.$off = function(...obj) {
return uni.$off(...obj);
};
export default util;
@@ -0,0 +1,434 @@
var requestUtil = {};
requestUtil.config = {
// 请求配置
request: {
// 公共请求参数(每次请求都会带上的参数)
dataParam: {}
},
requestGlobalParamKeyName: "vk_url_request_global_param",
debug: process.env.NODE_ENV !== "production",
// 日志风格
logger: {
colorArr: [
"#0095ff",
"#67C23A"
]
},
};
var counterNum = 0;
/**
* request 请求库
* 注意: 该请求库目前主要是框架自身使用,且近期变动频率较高,目前请勿使用在你自己的业务中。
* @param {String} url 服务器接口地址
* @param {Object/String/ArrayBuffer} data 请求的参数 App(自定义组件编译模式)不支持ArrayBuffer类型
* @param {Object} header 设置请求的 header,header 中不能设置 Referer。 App、H5端会自动带上cookie,且H5端不可手动修改
* @param {String} method 默认 POST 可选 GET
* @param {Number} timeout 超时时间,单位 ms 默认3000(30秒)
* @param {String} dataType 默认json 如果设为 json,会尝试对返回的数据做一次 JSON.parse
* @param {String} responseType 默认 text 设置响应的数据类型。合法值:text、arraybuffer App和支付宝小程序不支持
* @param {Boolean} sslVerify 默认 true 是否需要验证ssl证书 仅App安卓端支持(HBuilderX 2.3.3+) 仅App安卓端支持(HBuilderX 2.3.3+)
* @param {Boolean} withCredentials 默认 false 跨域请求时是否携带凭证(cookies) 仅H5支持(HBuilderX 2.6.15+)
* @param {Boolean} firstIpv4 默认 false DNS解析时优先使用ipv4 仅 App-Android 支持 (HBuilderX 2.8.0+)
* @param {String} success 成功回调
* @param {String} fail 失败回调
* @param {String} complete 完成回调
* 以下为特殊参数
* @param {String} errorCodeName 服务器返回的错误码的字段名,若不为空,则会对返回结果进行判断
* @param {String} errorMsgName 服务器返回的错误码的字符串含义,若不为空,且errorCodeName对应的值不为0,则会alert弹窗
* @param {Boolean} needAlert 服务器返回的错误时,是否需要alert弹出提示
*
* 调用示例
vk.request({
url: `https://www.xxx.com/api/xxxx`,
method:"POST",
header:{
"content-type": "application/json; charset=utf-8",
},
data:{
},
success: function(data){
},
fail: function(err){
}
});
*/
requestUtil.request = function(obj = {}) {
let vk = uni.vk;
// 去除值为 undefined 的参数
if (typeof obj.data === "object") {
obj.data = vk.pubfn.copyObject(obj.data);
}
// 注入自定义全局参数开始-----------------------------------------------------------
let config = requestUtil.config;
let globalParam = uni.getStorageSync(config.requestGlobalParamKeyName) || {};
// 根据正则规格自动匹配全局请求参数
for (let i in globalParam) {
let customDate = globalParam[i];
if (customDate.regExp) {
if (typeof customDate.regExp === "object") {
// 数组形式
for (let i = 0; i < customDate.regExp.length; i++) {
let regExp = new RegExp(customDate.regExp[i]);
if (regExp.test(obj.url)) {
obj.data = Object.assign(customDate.data, obj.data);
break;
}
}
} else {
// 字符串形式
let regExp = new RegExp(customDate.regExp);
if (regExp.test(obj.url)) {
obj.data = Object.assign(customDate.data, obj.data);
}
}
}
}
// 根据指定globalParamName匹配全局请求参数
let customDate = requestUtil.getRequestGlobalParam(obj.globalParamName);
if (customDate && JSON.stringify(customDate) !== "{}") {
if (customDate.regExp) {
obj.data = Object.assign(customDate.data, obj.data); // 新版本
} else {
obj.data = Object.assign(customDate, obj.data); // 兼容旧版本
}
}
// 注入自定义全局参数结束-----------------------------------------------------------
if (!obj.method) obj.method = "POST"; // 默认POST请求
if (typeof obj.dataType === "undefined") obj.dataType = "json";
if (obj.dataType == "default" || obj.dataType === "") delete obj.dataType;
if (typeof obj.header === "undefined" && typeof obj.headers !== "undefined") {
obj.header = obj.headers;
}
// 自动注入token到请求头开始-----------------------------------------------------------
// 注意:自2.15.1开始,需要手动指定uniIdToken: true 才会自动添加token到请求头里
if (typeof vk.getToken === "function" && obj.uniIdToken) {
let uni_id_token;
if (obj.uniIdToken === true) {
uni_id_token = vk.getToken();
} else if (typeof obj.uniIdToken === "boolean") {
uni_id_token = obj.uniIdToken;
}
if (uni_id_token) {
if (!obj.header) obj.header = {};
obj.header["uni-id-token"] = uni_id_token;
}
}
// 自动注入token到请求头结束-----------------------------------------------------------
let interceptor = obj.interceptor;
delete obj.interceptor;
if (interceptor && typeof interceptor.invoke === "function") {
let interceptorRes = interceptor.invoke(obj);
if (interceptorRes === false) {
return;
}
}
if (typeof obj.timeout === "undefined") obj.timeout = 30000; // 超时时间,单位 ms(默认30秒)
let Logger = {};
if (config.debug) {
Logger.params = (typeof obj.data == "object") ? vk.pubfn.copyObject(obj.data) : obj.data;
Logger.startTime = new Date().getTime();
let url = obj.url;
let path = obj.url.split("?")[0];
if (path.indexOf("://") > -1) {
path = path.substring(path.indexOf("://") + 3);
Logger.domainName = path.substring(0, path.indexOf("/"));
} else {
Logger.domainName = "";
}
Logger.action = path.substring(path.indexOf("/") + 1);
Logger.url = url;
}
if (obj.title) vk.showLoading(obj.title);
if (obj.loading) vk.setLoading(true, obj.loading);
let promiseAction = new Promise(function(resolve, reject) {
uni.request({
...obj,
success: (res) => {
if (interceptor && typeof interceptor.success === "function") {
let interceptorRes = interceptor.success(res);
if (interceptorRes === false) {
return;
}
}
requestSuccess({
res,
params: obj,
Logger,
resolve,
reject
});
},
fail: (res) => {
if (interceptor && typeof interceptor.fail === "function") {
let interceptorRes = interceptor.fail(res);
if (interceptorRes === false) {
return;
}
}
requestFail({
res,
params: obj,
Logger,
reject
});
},
complete: (res) => {
if (interceptor && typeof interceptor.complete === "function") {
let interceptorRes = interceptor.complete(res);
if (interceptorRes === false) {
return;
}
}
requestComplete({
res,
params: obj,
Logger
});
}
});
});
promiseAction.catch(error => {});
return promiseAction;
}
// 请求成功回调
function requestSuccess(obj = {}) {
let vk = uni.vk;
let config = requestUtil.config;
let {
res = {},
params,
Logger,
resolve,
reject
} = obj;
let {
title,
needOriginalRes,
dataType,
errorCodeName,
errorMsgName,
success,
loading
} = params;
let data = res.data || {};
if (vk.pubfn.isNotNullAll(errorCodeName, data[errorCodeName])) {
data.code = data[errorCodeName];
delete data[errorCodeName];
}
if (vk.pubfn.isNotNullAll(errorMsgName, data[errorMsgName])) {
data.msg = data[errorMsgName];
if (typeof data[errorMsgName] === "string") {
delete data[errorMsgName];
}
}
if (config.debug) Logger.result = (typeof data == "object") ? vk.pubfn.copyObject(data) : data;
if ([1301, 1302, 30201, 30202, 30203, 30204].indexOf(data.code) > -1 && data.msg.indexOf("token") > -1) {
// 执行 login 拦截器函数(跳转到页面页面)
let { interceptor = {} } = vk.callFunctionUtil;
if (typeof interceptor.login === "function") {
interceptor.login({
res: data,
params,
vk
});
}
reject(data);
} else if (res.statusCode >= 400 || data.code) {
requestFail({
res: data,
params,
Logger,
reject
});
} else {
if (title) vk.hideLoading();
if (loading) vk.setLoading(false, loading);
if (needOriginalRes) data.originalRes = vk.pubfn.copyObject(res);
if (data.vk_uni_token) vk.callFunctionUtil.saveToken(data.vk_uni_token);
if (data.userInfo && data.needUpdateUserInfo) vk.callFunctionUtil.updateUserInfo(data);
if (typeof success === "function") success(data);
if (typeof resolve === "function") resolve(data);
}
}
// 请求失败回调
function requestFail(obj = {}) {
let vk = uni.vk;
let config = requestUtil.config;
let {
res = {},
params,
Logger,
reject
} = obj;
let {
title,
needAlert,
fail,
loading
} = params;
if (typeof needAlert === "undefined") {
needAlert = (typeof fail === "function") ? false : true;
}
let errMsg = "";
let sysErr = false;
if (typeof res.code !== "undefined") {
errMsg = res.msg;
} else {
sysErr = true;
errMsg = JSON.stringify(res);
}
if (errMsg.indexOf("fail timeout") > -1) {
sysErr = true;
errMsg = "请求超时,请重试!";
}
if (config.debug) Logger.error = res;
if (title) vk.hideLoading();
if (loading) vk.setLoading(false, loading);
let runKey = true;
// 自定义拦截器开始-----------------------------------------------------------
let { interceptor = {} } = vk.callFunctionUtil.getConfig();
if (interceptor.request && typeof interceptor.request.fail == "function") {
runKey = interceptor.request.fail({
vk,
res: res,
params: params
});
if (runKey === undefined) runKey = true;
}
// 自定义拦截器结束-----------------------------------------------------------
if (runKey) {
if (needAlert && vk.pubfn.isNotNull(errMsg)) {
if (sysErr) {
vk.toast("网络开小差了!", "none");
} else {
vk.alert(errMsg);
}
}
if (typeof fail === "function") fail(res);
if (typeof reject === "function") reject(res);
}
}
// 请求完成回调
function requestComplete(obj = {}) {
let vk = uni.vk;
let config = requestUtil.config;
let {
res = {},
params,
Logger
} = obj;
let {
title,
needOriginalRes,
complete
} = params;
if (config.debug) {
Logger.endTime = new Date().getTime();
Logger.runTime = (Logger.endTime - Logger.startTime);
let colorArr = config.logger.colorArr;
let colorStr = colorArr[counterNum % colorArr.length];
counterNum++;
console.log("%c--------【开始】【服务器请求】【" + Logger.action + "】--------", 'color: ' + colorStr + ';font-size: 12px;font-weight: bold;');
console.log("【请求地址】: ", Logger.url);
console.log("【请求参数】: ", Logger.params);
console.log("【返回数据】: ", Logger.result);
console.log("【请求状态】: ", res.statusCode, "【http状态码】");
console.log("【总体耗时】: ", Logger.runTime, "毫秒【含页面渲染】");
console.log("【请求时间】: ", vk.pubfn.timeFormat(Logger.startTime, "yyyy-MM-dd hh:mm:ss"));
if (Logger.error) {
let errorLog = console.warn || console.error;
if (Logger.error.err && Logger.error.err.stack) {
console.error("【Error】: ", Logger.error);
console.error("【Stack】: ", Logger.error.err.stack);
} else {
errorLog("【Error】: ", Logger.error);
}
}
console.log("%c--------【结束】【服务器请求】【" + Logger.action + "】--------", 'color: ' + colorStr + ';font-size: 12px;font-weight: bold;');
}
let data = res.data;
if (needOriginalRes) data.originalRes = vk.pubfn.copyObject(res);
if (typeof complete === "function") complete(data);
}
/**
* 修改请求配置中的公共请求参数
* 若把shop-manage改成*则代表全局
vk.requestUtil.updateRequestGlobalParam({
"shop-manage":{
regExp:"^xxx/kh/",
data:{
shop_id : shop_id
}
}
});
对应的request中增加参数globalParamName:"shop-manage"
vk.request({
url: 'xxx/xxxxxx',
title: '请求中...',
globalParamName:"shop-manage",// 如果设置了正则规则,则不需要此参数
data: {},
success(data) {
}
});
*/
requestUtil.updateRequestGlobalParam = (data = {}, setKey) => {
let vk = uni.vk;
let config = requestUtil.config;
if (setKey) {
// 覆盖对象
config.request.dataParam = data;
} else {
// 覆盖参数(有就覆盖,没有则新增)
config.request.dataParam = Object.assign(config.request.dataParam, data);
}
vk.setStorageSync(config.requestGlobalParamKeyName, config.request.dataParam);
}
/**
* 获取请求配置中的公共请求参数
vk.requestUtil.getRequestGlobalParam();
*/
requestUtil.getRequestGlobalParam = (globalParamName = "*") => {
let vk = uni.vk;
let config = requestUtil.config;
let data = config.request.dataParam;
if (!data || JSON.stringify(data) === "{}") {
data = uni.getStorageSync(config.requestGlobalParamKeyName) || {};
config.request.dataParam = data;
}
let param = data[globalParamName] || {};
return JSON.parse(JSON.stringify(param));
}
/**
* 删除请求配置中的公共请求参数
* globalParamName 不传代表删除所有
vk.requestUtil.deleteRequestGlobalParam(globalParamName);
*/
requestUtil.deleteRequestGlobalParam = (globalParamName) => {
let vk = uni.vk;
let config = requestUtil.config;
let globalParam = uni.getStorageSync(config.requestGlobalParamKeyName) || {};
if (globalParamName) {
delete globalParam[globalParamName];
} else {
globalParam = {};
}
config.request.dataParam = globalParam;
vk.setStorageSync(config.requestGlobalParamKeyName, globalParam);
}
export default requestUtil;
@@ -0,0 +1,146 @@
/**
* vk依赖扩展 - sessionStorage 本地会话缓存(仅H5可用)
* sessionStorage 属性允许你访问一个,对应当前源的 session Storage 对象。
* 它与 localStorage 相似,不同之处在于 localStorage 里面存储的数据没有过期时间设置
* 而存储在 sessionStorage 里面的数据在页面会话结束时会被清除。
* pub - 公共的可随时删除的缓存
* kh - 跟登录账号有关联的缓存
* sys - 系统级缓存 - 一般不删除
*
* 储存缓存
* vk.setSessionStorageSync(key, data);
* 获取缓存
* vk.getSessionStorageSync(key);
*/
var storage = {};
/**
* 将 data 存储在本地缓存中指定的 key 中,会覆盖掉原来该 key 对应的内容,这是一个同步接口。
* @param {String} key 本地缓存中的指定的 key
* @param {Any} data 需要存储的内容,只支持原生类型、及能够通过 JSON.stringify 序列化的对象
* vk.setSessionStorageSync(key, data);
*/
storage.setSessionStorageSync = function(key, data = "") {
// #ifdef H5
let type = typeof data;
let value = {
type: typeof data,
data: data
};
sessionStorage.setItem(key, JSON.stringify(value));
watchSessionStorage({ type: "set", key, data });
// #endif
// #ifndef H5
console.warn("非H5环境不支持此API");
// #endif
};
/**
* 从本地缓存中异步获取指定 key 对应的内容。
* @param {String} key 本地缓存中的指定的 key
* vk.getSessionStorageSync(key);
*/
storage.getSessionStorageSync = function(key) {
// #ifdef H5
let data;
try {
let value = JSON.parse(sessionStorage.getItem(key));
data = value.data;
} catch (err) {
data = sessionStorage.getItem(key);
}
// get 没有必要监听
// watchSessionStorage({ type:"get", key, data });
return data;
// #endif
// #ifndef H5
console.warn("非H5环境不支持此API");
// #endif
};
/**
* 从本地缓存中同步移除指定 key。
* @param {String} key 本地缓存中的指定的 key
* vk.removeSessionStorageSync(key);
*/
storage.removeSessionStorageSync = function(key) {
// #ifdef H5
sessionStorage.removeItem(key);
watchSessionStorage({ type: "remove", key });
// #endif
// #ifndef H5
console.warn("非H5环境不支持此API");
// #endif
};
/**
* 同步清理本地数据缓存。若key有值,则清除键值为指定字符串开头的缓存
* @param {String} key 本地缓存中的指定的 key
* vk.clearSessionStorageSync();
*/
storage.clearSessionStorageSync = function(key) {
// #ifdef H5
if (key) {
let keys = Object.keys(sessionStorage);
if (keys) {
keys.map((keyName) => {
if (keyName.indexOf(key) == 0) {
sessionStorage.removeItem(keyName);
}
});
}
} else {
sessionStorage.clear();
watchSessionStorage({ type: "clear" });
}
// #endif
// #ifndef H5
console.warn("非H5环境不支持此API");
// #endif
};
export default storage;
/**
* 单位进制换算
* length 换算前大小
* ary 进制,如KB-MB-GB,进制1024
* precision 数值精度
* arr 进制的数组,如["B","KB","MB","GB"]
* calcSize(length,1024,3,["B","KB","MB","GB"]);
*/
function calcSize(length = 0, ary, precision, arr) {
var size = parseFloat(length);
var mySize = 0;
var type = "";
if (size < ary || arr.length <= 1) {
type = arr[0];
mySize = parseFloat(size.toFixed(precision));
} else {
for (var i = 1; i < arr.length; i++) {
var g = arr[i];
size = size / ary;
if (size < ary) {
type = g;
mySize = parseFloat(size.toFixed(precision));
break;
}
}
}
return {
size: mySize,
type: type,
title: mySize + " " + type
}
};
function watchSessionStorage(obj) {
if (typeof storage.watch === "function") {
storage.watch(obj);
}
}
@@ -0,0 +1,890 @@
function n(o, e) {
if (!o.jWeixin) {
var n,
c = {
config: "preVerifyJSAPI",
onMenuShareTimeline: "menu:share:timeline",
onMenuShareAppMessage: "menu:share:appmessage",
onMenuShareQQ: "menu:share:qq",
onMenuShareWeibo: "menu:share:weiboApp",
onMenuShareQZone: "menu:share:QZone",
previewImage: "imagePreview",
getLocation: "geoLocation",
openProductSpecificView: "openProductViewWithPid",
addCard: "batchAddCard",
openCard: "batchViewCard",
chooseWXPay: "getBrandWCPayRequest",
openEnterpriseRedPacket: "getRecevieBizHongBaoRequest",
startSearchBeacons: "startMonitoringBeacons",
stopSearchBeacons: "stopMonitoringBeacons",
onSearchBeacons: "onBeaconsInRange",
consumeAndShareCard: "consumedShareCard",
openAddress: "editAddress"
},
a = (function() {
var e = {};
for (var n in c) e[c[n]] = n;
return e;
})(),
i = o.document,
t = i.title,
r = navigator.userAgent.toLowerCase(),
s = navigator.platform.toLowerCase(),
d = !(!s.match("mac") && !s.match("win")),
u = -1 != r.indexOf("wxdebugger"),
l = -1 != r.indexOf("micromessenger"),
p = -1 != r.indexOf("android"),
f = -1 != r.indexOf("iphone") || -1 != r.indexOf("ipad"),
m = (n =
r.match(/micromessenger\/(\d+\.\d+\.\d+)/) ||
r.match(/micromessenger\/(\d+\.\d+)/)) ?
n[1] :
"",
g = {
initStartTime: L(),
initEndTime: 0,
preVerifyStartTime: 0,
preVerifyEndTime: 0
},
h = {
version: 1,
appId: "",
initTime: 0,
preVerifyTime: 0,
networkType: "",
isPreVerifyOk: 1,
systemType: f ? 1 : p ? 2 : -1,
clientVersion: m,
url: encodeURIComponent(location.href)
},
v = {},
S = { _completes: [] },
y = { state: 0, data: {} };
O(function() {
g.initEndTime = L();
});
var I = !1,
_ = [],
w = {
config: function(e) {
B("config", (v = e));
var t = !1 !== v.check;
O(function() {
if (t)
M(
c.config, {
verifyJsApiList: C(v.jsApiList),
verifyOpenTagList: C(v.openTagList)
},
(function() {
(S._complete = function(e) {
(g.preVerifyEndTime = L()), (y.state = 1), (y.data = e);
}),
(S.success = function(e) {
h.isPreVerifyOk = 0;
}),
(S.fail = function(e) {
S._fail ? S._fail(e) : (y.state = -1);
});
var t = S._completes;
return (
t.push(function() {
!(function() {
if (
!(
d ||
u ||
v.debug ||
m < "6.0.2" ||
h.systemType < 0
)
) {
var i = new Image();
(h.appId = v.appId),
(h.initTime = g.initEndTime - g
.initStartTime),
(h.preVerifyTime =
g.preVerifyEndTime - g
.preVerifyStartTime),
w.getNetworkType({
isInnerInvoke: !0,
success: function(e) {
h.networkType =
e
.networkType;
var n =
"https://open.weixin.qq.com/sdk/report?v=" +
h.version +
"&o=" +
h
.isPreVerifyOk +
"&s=" +
h
.systemType +
"&c=" +
h
.clientVersion +
"&a=" +
h.appId +
"&n=" +
h
.networkType +
"&i=" +
h.initTime +
"&p=" +
h
.preVerifyTime +
"&u=" +
h.url;
i.src = n;
}
});
}
})();
}),
(S.complete = function(e) {
for (var n = 0, i = t.length; n < i; ++n) t[n]
();
S._completes = [];
}),
S
);
})()
),
(g.preVerifyStartTime = L());
else {
y.state = 1;
for (var e = S._completes, n = 0, i = e.length; n < i; ++n)
e[n]();
S._completes = [];
}
}),
w.invoke ||
((w.invoke = function(e, n, i) {
o.WeixinJSBridge && WeixinJSBridge.invoke(e, x(n), i);
}),
(w.on = function(e, n) {
o.WeixinJSBridge && WeixinJSBridge.on(e, n);
}));
},
ready: function(e) {
0 != y.state ? e() : (S._completes.push(e), !l && v.debug && e());
},
error: function(e) {
m < "6.0.2" || (-1 == y.state ? e(y.data) : (S._fail = e));
},
checkJsApi: function(e) {
M(
"checkJsApi", { jsApiList: C(e.jsApiList) },
((e._complete = function(e) {
if (p) {
var n = e.checkResult;
n && (e.checkResult = JSON.parse(n));
}
e = (function(e) {
var n = e.checkResult;
for (var i in n) {
var t = a[i];
t && ((n[t] = n[i]), delete n[i]);
}
return e;
})(e);
}),
e)
);
},
onMenuShareTimeline: function(e) {
P(
c.onMenuShareTimeline, {
complete: function() {
M(
"shareTimeline", {
title: e.title || t,
desc: e.title || t,
img_url: e.imgUrl || "",
link: e.link || location.href,
type: e.type || "link",
data_url: e.dataUrl || ""
},
e
);
}
},
e
);
},
onMenuShareAppMessage: function(n) {
P(
c.onMenuShareAppMessage, {
complete: function(e) {
"favorite" === e.scene ?
M("sendAppMessage", {
title: n.title || t,
desc: n.desc || "",
link: n.link || location.href,
img_url: n.imgUrl || "",
type: n.type || "link",
data_url: n.dataUrl || ""
}) :
M(
"sendAppMessage", {
title: n.title || t,
desc: n.desc || "",
link: n.link || location.href,
img_url: n.imgUrl || "",
type: n.type || "link",
data_url: n.dataUrl || ""
},
n
);
}
},
n
);
},
onMenuShareQQ: function(e) {
P(
c.onMenuShareQQ, {
complete: function() {
M(
"shareQQ", {
title: e.title || t,
desc: e.desc || "",
img_url: e.imgUrl || "",
link: e.link || location.href
},
e
);
}
},
e
);
},
onMenuShareWeibo: function(e) {
P(
c.onMenuShareWeibo, {
complete: function() {
M(
"shareWeiboApp", {
title: e.title || t,
desc: e.desc || "",
img_url: e.imgUrl || "",
link: e.link || location.href
},
e
);
}
},
e
);
},
onMenuShareQZone: function(e) {
P(
c.onMenuShareQZone, {
complete: function() {
M(
"shareQZone", {
title: e.title || t,
desc: e.desc || "",
img_url: e.imgUrl || "",
link: e.link || location.href
},
e
);
}
},
e
);
},
updateTimelineShareData: function(e) {
M(
"updateTimelineShareData", { title: e.title, link: e.link, imgUrl: e.imgUrl },
e
);
},
updateAppMessageShareData: function(e) {
M(
"updateAppMessageShareData", {
title: e.title,
desc: e.desc,
link: e.link,
imgUrl: e
.imgUrl
},
e
);
},
startRecord: function(e) {
M("startRecord", {}, e);
},
stopRecord: function(e) {
M("stopRecord", {}, e);
},
onVoiceRecordEnd: function(e) {
P("onVoiceRecordEnd", e);
},
playVoice: function(e) {
M("playVoice", { localId: e.localId }, e);
},
pauseVoice: function(e) {
M("pauseVoice", { localId: e.localId }, e);
},
stopVoice: function(e) {
M("stopVoice", { localId: e.localId }, e);
},
onVoicePlayEnd: function(e) {
P("onVoicePlayEnd", e);
},
uploadVoice: function(e) {
M(
"uploadVoice", {
localId: e.localId,
isShowProgressTips: 0 == e.isShowProgressTips ? 0 : 1
},
e
);
},
downloadVoice: function(e) {
M(
"downloadVoice", {
serverId: e.serverId,
isShowProgressTips: 0 == e.isShowProgressTips ? 0 : 1
},
e
);
},
translateVoice: function(e) {
M(
"translateVoice", {
localId: e.localId,
isShowProgressTips: 0 == e.isShowProgressTips ? 0 : 1
},
e
);
},
chooseImage: function(e) {
M(
"chooseImage", {
scene: "1|2",
count: e.count || 9,
sizeType: e.sizeType || ["original", "compressed"],
sourceType: e.sourceType || ["album", "camera"]
},
((e._complete = function(e) {
if (p) {
var n = e.localIds;
try {
n && (e.localIds = JSON.parse(n));
} catch (e) {}
}
}),
e)
);
},
getLocation: function(e) {},
previewImage: function(e) {
M(c.previewImage, { current: e.current, urls: e.urls }, e);
},
uploadImage: function(e) {
M(
"uploadImage", {
localId: e.localId,
isShowProgressTips: 0 == e.isShowProgressTips ? 0 : 1
},
e
);
},
downloadImage: function(e) {
M(
"downloadImage", {
serverId: e.serverId,
isShowProgressTips: 0 == e.isShowProgressTips ? 0 : 1
},
e
);
},
getLocalImgData: function(e) {
!1 === I ?
((I = !0),
M(
"getLocalImgData", { localId: e.localId },
((e._complete = function(e) {
if (((I = !1), 0 < _.length)) {
var n = _.shift();
wx.getLocalImgData(n);
}
}),
e)
)) :
_.push(e);
},
getNetworkType: function(e) {
M(
"getNetworkType", {},
((e._complete = function(e) {
e = (function(e) {
var n = e.errMsg;
e.errMsg = "getNetworkType:ok";
var i = e.subtype;
if ((delete e.subtype, i)) e.networkType = i;
else {
var t = n.indexOf(":"),
o = n.substring(t + 1);
switch (o) {
case "wifi":
case "edge":
case "wwan":
e.networkType = o;
break;
default:
e.errMsg = "getNetworkType:fail";
}
}
return e;
})(e);
}),
e)
);
},
openLocation: function(e) {
M(
"openLocation", {
latitude: e.latitude,
longitude: e.longitude,
name: e.name || "",
address: e.address || "",
scale: e.scale || 28,
infoUrl: e.infoUrl || ""
},
e
);
},
getLocation: function(e) {
M(
c.getLocation, { type: (e = e || {}).type || "wgs84" },
((e._complete = function(e) {
delete e.type;
}),
e)
);
},
hideOptionMenu: function(e) {
M("hideOptionMenu", {}, e);
},
showOptionMenu: function(e) {
M("showOptionMenu", {}, e);
},
closeWindow: function(e) {
M("closeWindow", {}, (e = e || {}));
},
hideMenuItems: function(e) {
M("hideMenuItems", { menuList: e.menuList }, e);
},
showMenuItems: function(e) {
M("showMenuItems", { menuList: e.menuList }, e);
},
hideAllNonBaseMenuItem: function(e) {
M("hideAllNonBaseMenuItem", {}, e);
},
showAllNonBaseMenuItem: function(e) {
M("showAllNonBaseMenuItem", {}, e);
},
scanQRCode: function(e) {
M(
"scanQRCode", {
needResult: (e = e || {}).needResult || 0,
scanType: e.scanType || ["qrCode", "barCode"]
},
((e._complete = function(e) {
if (f) {
var n = e.resultStr;
if (n) {
var i = JSON.parse(n);
e.resultStr = i && i.scan_code && i.scan_code.scan_result;
}
}
}),
e)
);
},
openAddress: function(e) {
M(
c.openAddress, {},
((e._complete = function(e) {
e = (function(e) {
return (
(e.postalCode = e.addressPostalCode),
delete e.addressPostalCode,
(e.provinceName = e.proviceFirstStageName),
delete e.proviceFirstStageName,
(e.cityName = e.addressCitySecondStageName),
delete e.addressCitySecondStageName,
(e.countryName = e.addressCountiesThirdStageName),
delete e.addressCountiesThirdStageName,
(e.detailInfo = e.addressDetailInfo),
delete e.addressDetailInfo,
e
);
})(e);
}),
e)
);
},
openProductSpecificView: function(e) {
M(
c.openProductSpecificView, {
pid: e.productId,
view_type: e.viewType || 0,
ext_info: e.extInfo
},
e
);
},
addCard: function(e) {
for (var n = e.cardList, i = [], t = 0, o = n.length; t < o; ++t) {
var r = n[t],
a = { card_id: r.cardId, card_ext: r.cardExt };
i.push(a);
}
M(
c.addCard, { card_list: i },
((e._complete = function(e) {
var n = e.card_list;
if (n) {
for (var i = 0, t = (n = JSON.parse(n)).length; i < t; ++i) {
var o = n[i];
(o.cardId = o.card_id),
(o.cardExt = o.card_ext),
(o.isSuccess = !!o.is_succ),
delete o.card_id,
delete o.card_ext,
delete o.is_succ;
}
(e.cardList = n), delete e.card_list;
}
}),
e)
);
},
chooseCard: function(e) {
M(
"chooseCard", {
app_id: v.appId,
location_id: e.shopId || "",
sign_type: e.signType || "SHA1",
card_id: e.cardId || "",
card_type: e.cardType || "",
card_sign: e.cardSign,
time_stamp: e.timestamp + "",
nonce_str: e.nonceStr
},
((e._complete = function(e) {
(e.cardList = e.choose_card_info), delete e.choose_card_info;
}),
e)
);
},
openCard: function(e) {
for (var n = e.cardList, i = [], t = 0, o = n.length; t < o; ++t) {
var r = n[t],
a = { card_id: r.cardId, code: r.code };
i.push(a);
}
M(c.openCard, { card_list: i }, e);
},
consumeAndShareCard: function(e) {
M(
c.consumeAndShareCard, { consumedCardId: e.cardId, consumedCode: e.code },
e
);
},
chooseWXPay: function(e) {
M(c.chooseWXPay, V(e), e);
},
openEnterpriseRedPacket: function(e) {
M(c.openEnterpriseRedPacket, V(e), e);
},
startSearchBeacons: function(e) {
M(c.startSearchBeacons, { ticket: e.ticket }, e);
},
stopSearchBeacons: function(e) {
M(c.stopSearchBeacons, {}, e);
},
onSearchBeacons: function(e) {
P(c.onSearchBeacons, e);
},
openEnterpriseChat: function(e) {
M(
"openEnterpriseChat", { useridlist: e.userIds, chatname: e.groupName },
e
);
},
launchMiniProgram: function(e) {
M(
"launchMiniProgram", {
targetAppId: e.targetAppId,
path: (function(e) {
if ("string" == typeof e && 0 < e.length) {
var n = e.split("?")[0],
i = e.split("?")[1];
return (n += ".html"), void 0 !== i ? n + "?" + i : n;
}
})(e.path),
envVersion: e.envVersion
},
e
);
},
openBusinessView: function(e) {
M(
"openBusinessView", {
businessType: e.businessType,
queryString: e.queryString || "",
envVersion: e.envVersion
},
((e._complete = function(n) {
if (p) {
var e = n.extraData;
if (e)
try {
n.extraData = JSON.parse(e);
} catch (e) {
n.extraData = {};
}
}
}),
e)
);
},
miniProgram: {
navigateBack: function(e) {
(e = e || {}),
O(function() {
M(
"invokeMiniProgramAPI", {
name: "navigateBack",
arg: {
delta: e
.delta || 1
}
},
e
);
});
},
navigateTo: function(e) {
O(function() {
M(
"invokeMiniProgramAPI", { name: "navigateTo", arg: { url: e.url } },
e
);
});
},
redirectTo: function(e) {
O(function() {
M(
"invokeMiniProgramAPI", { name: "redirectTo", arg: { url: e.url } },
e
);
});
},
switchTab: function(e) {
O(function() {
M(
"invokeMiniProgramAPI", { name: "switchTab", arg: { url: e.url } },
e
);
});
},
reLaunch: function(e) {
O(function() {
M(
"invokeMiniProgramAPI", { name: "reLaunch", arg: { url: e.url } },
e
);
});
},
postMessage: function(e) {
O(function() {
M(
"invokeMiniProgramAPI", { name: "postMessage", arg: e.data || {} },
e
);
});
},
getEnv: function(e) {
O(function() {
e({ miniprogram: "miniprogram" === o.__wxjs_environment });
});
}
}
},
T = 1,
k = {};
return (
i.addEventListener(
"error",
function(e) {
if (!p) {
var n = e.target,
i = n.tagName,
t = n.src;
if ("IMG" == i || "VIDEO" == i || "AUDIO" == i || "SOURCE" == i)
if (-1 != t.indexOf("wxlocalresource://")) {
e.preventDefault(), e.stopPropagation();
var o = n["wx-id"];
if ((o || ((o = T++), (n["wx-id"] = o)), k[o])) return;
(k[o] = !0),
wx.ready(function() {
wx.getLocalImgData({
localId: t,
success: function(e) {
n.src = e.localData;
}
});
});
}
}
},
!0
),
i.addEventListener(
"load",
function(e) {
if (!p) {
var n = e.target,
i = n.tagName;
n.src;
if ("IMG" == i || "VIDEO" == i || "AUDIO" == i || "SOURCE" == i) {
var t = n["wx-id"];
t && (k[t] = !1);
}
}
},
!0
),
e && (o.wx = o.jWeixin = w),
w
);
}
function M(n, e, i) {
o.WeixinJSBridge ?
WeixinJSBridge.invoke(n, x(e), function(e) {
A(n, e, i);
}) :
B(n, i);
}
function P(n, i, t) {
o.WeixinJSBridge ?
WeixinJSBridge.on(n, function(e) {
t && t.trigger && t.trigger(e), A(n, e, i);
}) :
B(n, t || i);
}
function x(e) {
return (
((e = e || {}).appId = v.appId),
(e.verifyAppId = v.appId),
(e.verifySignType = "sha1"),
(e.verifyTimestamp = v.timestamp + ""),
(e.verifyNonceStr = v.nonceStr),
(e.verifySignature = v.signature),
e
);
}
function V(e) {
return {
timeStamp: e.timestamp + "",
nonceStr: e.nonceStr,
package: e.package,
paySign: e.paySign,
signType: e.signType || "SHA1"
};
}
function A(e, n, i) {
("openEnterpriseChat" != e && "openBusinessView" !== e) ||
(n.errCode = n.err_code),
delete n.err_code,
delete n.err_desc,
delete n.err_detail;
var t = n.errMsg;
t ||
((t = n.err_msg),
delete n.err_msg,
(t = (function(e, n) {
var i = e,
t = a[i];
t && (i = t);
var o = "ok";
if (n) {
var r = n.indexOf(":");
"confirm" == (o = n.substring(r + 1)) && (o = "ok"),
"failed" == o && (o = "fail"),
-1 != o.indexOf("failed_") && (o = o.substring(7)),
-1 != o.indexOf("fail_") && (o = o.substring(5)),
("access denied" !=
(o = (o = o.replace(/_/g, " ")).toLowerCase()) &&
"no permission to execute" != o) ||
(o = "permission denied"),
"config" == i && "function not exist" == o && (o = "ok"),
"" == o && (o = "fail");
}
return (n = i + ":" + o);
})(e, t)),
(n.errMsg = t)),
(i = i || {})._complete && (i._complete(n), delete i._complete),
(t = n.errMsg || ""),
v.debug && !i.isInnerInvoke && alert(JSON.stringify(n));
var o = t.indexOf(":");
switch (t.substring(o + 1)) {
case "ok":
i.success && i.success(n);
break;
case "cancel":
i.cancel && i.cancel(n);
break;
default:
i.fail && i.fail(n);
}
i.complete && i.complete(n);
}
function C(e) {
if (e) {
for (var n = 0, i = e.length; n < i; ++n) {
var t = e[n],
o = c[t];
o && (e[n] = o);
}
return e;
}
}
function B(e, n) {
if (!(!v.debug || (n && n.isInnerInvoke))) {
var i = a[e];
i && (e = i),
n && n._complete && delete n._complete,
console.log('"' + e + '",', n || "");
}
}
function L() {
return new Date().getTime();
}
function O(e) {
l &&
(o.WeixinJSBridge ?
e() :
i.addEventListener &&
i.addEventListener("WeixinJSBridgeReady", e, !1));
}
};
export default n(window);
@@ -0,0 +1,18 @@
let debug = process.env.NODE_ENV !== 'production';
const install = Vue => {
let vk = Vue.prototype ? Vue.prototype.vk : Vue.config.globalProperties.vk;
if (vk) {
vk.log = console.log;
if (typeof vk.getConfig === "function") {
debug = vk.getConfig().debug;
}
if(!debug){
console.log = function(...obj){};
}
}
}
export default {
install
}
@@ -0,0 +1,40 @@
var isOnLaunch = true;
export default {
data() {
return {}
},
onLoad() {
// 将vk实例挂载到app.globalData上,方便在非Vue页面自身函数中调用vk实例(因为获取不到this)
let app = getApp({ allowDefault: true });
if (app && app.globalData && !app.globalData.vk) {
app.globalData.vk = this.vk;
}
if (this.vk) {
const url = this.vk.pubfn.getCurrentPageRoute();
// 检测是否可以分享(小程序专属)
this.vk.navigate.checkAllowShare({ url });
// 检测是否需要登录,只有首次启动的页面才需要检测,其他页面通过 vk.navigateTo 跳转前会自动判断。
if (isOnLaunch && !this.vk.checkToken() && getCurrentPages().length == 1) {
isOnLaunch = false; // 重新标记为非首次页面
const currentPage = this.vk.pubfn.getCurrentPage() || {};
let pagePath = currentPage.pagePath || `/${currentPage.route}` || url;
let fullPath = currentPage.fullPath;
let options = currentPage.options;
this.vk.pubfn.checkLogin({ url: pagePath, fullPath, options, isOnLaunch: true }); // 检测是否需要登录
}
}
},
created() {
// 将vk实例挂载到app.globalData上,方便在非Vue页面自身函数中调用vk实例(因为获取不到this)
let app = getApp({ allowDefault: true });
if (app && app.globalData && !app.globalData.vk) {
app.globalData.vk = this.vk;
}
},
methods: {
$getData(data, key, defaultValue) {
let { vk } = this;
return vk.pubfn.getData(data, key, defaultValue);
}
}
}
@@ -0,0 +1,170 @@
/**
* 百度API
*/
var baidu = {};
var vk = {};
var baiduOpenApiAccessTokenCacheName = "vk_openapi_baidu_open_token";
baidu.init = function(util={}) {
vk = util.vk;
};
// 百度开放平台api
baidu.open = {};
// 文字识别
baidu.open.ocr = {};
/**
* 营业执照识别
* 以下data参数三选一即可
* @param {File} file 文件对象
* @param {String} image 图像base64编码后进行urlencode
* @param {String} url 图片完整URL
*
vk.openapi.baidu.open.ocr.business_license({
title:"识别中...",
data: {
file: res.tempFiles[0]
},
success: (res) => {
that.data = res.data;
},
});
*/
baidu.open.ocr.business_license = function(obj={}){
obj.action = "ocr/v1/business_license";
let file = obj.data.file;
if(file){
vk.pubfn.fileToBase64({ file }).then(base64 => {
obj.data.image = base64;
delete obj.data.file;
baidu.request(obj);
});
}else{
baidu.request(obj);
}
}
/**
* 身份证识别
* 以下data参数三选一即可
* @param {File} file 文件对象
* @param {String} image 图像base64编码后进行urlencode
* @param {String} url 图片完整URL
vk.openapi.baidu.open.ocr.idcard({
title:"识别中...",
data: {
image:base64,
id_card_side:"front", // front:身份证含照片的一面 back:身份证带国徽的一面
},
success: (res) => {
that.data = res.data;
},
});
*/
baidu.open.ocr.idcard = function(obj={}){
obj.action = "ocr/v1/idcard";
let file = obj.data.file;
if(!obj.data.id_card_side) obj.data.id_card_side = "front";
if(file){
vk.pubfn.fileToBase64({ file }).then(base64 => {
obj.data.image = base64;
delete obj.data.file;
baidu.request(obj);
});
}else{
baidu.request(obj);
}
}
/**
* 百度开放平台通用请求接口
* @param {String} action 接口名称
* @param {String} actionVersion 接口版本名称 默认2.0
* @param {String} title loading文字
* @param {object} data 请求参数
* @param {String} success 成功回调
* @param {String} fail 失败回调
* @param {String} complete 完成回调
* 使用示例
vk.openapi.baidu.request({
action: 'ocr/v1/business_license',
title:"识别中...",
data: {
image:base64
},
success: (data) => {
that.data = data;
},
});
*/
baidu.request = function(obj={}){
let {
title
} = obj;
if(title) vk.showLoading(title);
let baiduApiAccessToken = vk.getStorageSync(baiduOpenApiAccessTokenCacheName);
if(baiduApiAccessToken && baiduApiAccessToken.expTime > new Date().getTime()){
// 获取缓存中的token
obj.accessToken = baiduApiAccessToken.accessToken;
request(obj);
}else{
// 发起请求获取token
vk.callFunction({
url: 'plugs/baidu/client/pub/getAccessToken',
success:function(tokenRes) {
vk.setStorageSync(baiduOpenApiAccessTokenCacheName,{
accessToken : tokenRes.access_token,
expTime : 2590000000 + new Date().getTime(),
});
obj.accessToken = tokenRes.access_token;
request(obj);
},
fail:function(res){
if(title) vk.hideLoading();
if(typeof obj.fail === "function") obj.fail(res);
if(typeof obj.complete === "function") obj.complete(res);
}
});
}
}
function request(obj={}){
let {
action,
actionVersion = "2.0",
accessToken,
header = { "content-type": "application/x-www-form-urlencoded" },
data,
title
} = obj;
vk.request({
url: `https://aip.baidubce.com/rest/${actionVersion}/${action}?access_token=${accessToken}`,
method:"POST",
header:{
"content-type": "application/x-www-form-urlencoded",
},
errorCodeName:"error_code",
errorMsgName:"error_msg",
data,
needAlert:true,
success: function(data){
if(title) vk.hideLoading();
if(data.code){
if(typeof obj.fail === "function") obj.fail(data);
}else{
if(typeof obj.success === "function") obj.success(data);
}
},
fail: function(data){
if(title) vk.hideLoading();
// 如果是因为token失效报的错误,则清空下本地token缓存
if(data && data.code === 110) vk.removeStorageSync(baiduOpenApiAccessTokenCacheName);
if(typeof obj.fail === "function") obj.fail(data);
},
complete: function(data){
if(typeof obj.complete === "function") obj.complete(data);
}
});
}
export default baidu;
@@ -0,0 +1,14 @@
/**
* 开放API
*/
import baidu from './baidu'
var openapi = {};
openapi.baidu = baidu;
openapi.init = function(util){
openapi.baidu.init(util);
}
// 微信小程序API
export default openapi;
@@ -0,0 +1,25 @@
const install = Vue => {
const debug = process.env.NODE_ENV !== 'production';
let vk = Vue.prototype ? Vue.prototype.vk : Vue.config.globalProperties.vk;
if (debug && vk) {
const oldErrorHandler = Vue.config.errorHandler;
Vue.config.errorHandler = function errorHandler(err, vm, info) {
const route = vm.$page && vm.$page.route;
let date = new Date();
let log = {
err: err.toString(),
info,
route,
time: date.getTime(),
timeStr: date.toLocaleTimeString()
};
if(vk.vuex) vk.vuex.dispatch('$error/add', log);
return oldErrorHandler(err, vm, info);
}
}
}
export default {
install
}
@@ -0,0 +1,67 @@
export default {
beforeCreate() {
// 将vuex方法挂在到vk实例中 beforeCreate created
let { vk, $store } = this;
if (typeof $store !== "undefined" && typeof vk.getVuexStore === "undefined") {
vk.getVuexStore = function() {
return $store;
};
vk.vuex = (name, value) => {
$store.commit('updateStore', { name, value });
};
/**
* (推荐) 设置vuex
* vk.vuex.set('$user.userInfo.avatar', avatar);
*/
vk.vuex.set = (name, value) => {
$store.commit('updateStore', { name, value });
};
/**
* (推荐) 读取vuex(具有解除对象内存印射功能,且任意一层数据为undefined,不会报错)
* vk.vuex.get('$user.userInfo.avatar');
*/
vk.vuex.get = (name, defaultValue) => {
let value = vk.pubfn.getData($store.state, name);
if (typeof value === "undefined") return (typeof defaultValue !== "undefined") ? defaultValue : "";
return JSON.parse(JSON.stringify(value));
};
vk.vuex.getters = (name) => {
return $store.getters[name];
};
/**
* 触发vuex的指定actions(异步)
* $user是模块名,addFootprint是对应模块的action名称
* vk.vuex.dispatch('$user/addFootprint', data);
*/
vk.vuex.dispatch = $store.dispatch;
/**
* 触发vuex的指定mutations
* $user是模块名,setFootprint是对应模块的action名称
* vk.vuex.commit('$user/setFootprint', data);
*/
vk.vuex.commit = $store.commit;
/* 另一种方式 */
/**
* vk.setVuex('$user.userInfo.avatar', avatar);
*/
vk.setVuex = vk.vuex.set;
/**
* vk.getVuex('$user.userInfo.avatar');
*/
vk.getVuex = vk.vuex.get;
/* 兼容老版本 */
vk.state = vk.vuex.get;
try {
if (!vk.checkToken()) {
vk.callFunctionUtil.deleteUserInfo({
log: false
});
}
} catch (err) {}
}
},
computed: {
}
}