20261008
This commit is contained in:
@@ -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;
|
||||
+146
@@ -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: {
|
||||
|
||||
}
|
||||
}
|
||||
+1040
File diff suppressed because it is too large
Load Diff
+1068
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user