517 lines
11 KiB
JavaScript
517 lines
11 KiB
JavaScript
/**
|
|
* 提示方法
|
|
* @param {String} title 提示文字
|
|
* @param {String} icon icon图片
|
|
* @param {Number} duration 提示时间
|
|
*/
|
|
export function toast(title, icon = "none", duration = 1500) {
|
|
if (title) {
|
|
uni.showToast({
|
|
title,
|
|
icon,
|
|
duration,
|
|
});
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @param {String} url
|
|
* @return {function}
|
|
* @description navigateTo跳转
|
|
*/
|
|
export function Jump(url) {
|
|
uni.navigateTo({
|
|
url: url,
|
|
});
|
|
}
|
|
|
|
/**
|
|
* 提示信息
|
|
* **/
|
|
export function showModal(title, msg, showCancel) {
|
|
uni.showModal({
|
|
title: title,
|
|
content: msg,
|
|
showCancel: showCancel,
|
|
success: function (res) {},
|
|
});
|
|
}
|
|
|
|
export function showLoading(content) {
|
|
uni.showLoading({
|
|
title: content,
|
|
});
|
|
}
|
|
/**
|
|
* 隐藏loading
|
|
* **/
|
|
export function hideLoading() {
|
|
uni.hideLoading();
|
|
}
|
|
|
|
/***
|
|
* 获取时间戳
|
|
*/
|
|
export function getTimStamp() {
|
|
var timestamp = Date.parse(new Date());
|
|
timestamp = timestamp / 1000;
|
|
return timestamp;
|
|
}
|
|
/***
|
|
* 生成随机数
|
|
*/
|
|
export function getNonce() {
|
|
var t = "";
|
|
for (var i = 0; i < 12; i++) {
|
|
t += Math.floor(Math.random() * 10);
|
|
}
|
|
return t;
|
|
}
|
|
/**
|
|
* 获取32位随机数
|
|
* ***/
|
|
export function getnoncestr() {
|
|
let len = len || 32;
|
|
var $chars = "abcdefghijklmnopqrstuvwxyz0123456789";
|
|
var maxPos = $chars.length;
|
|
var pwd = "";
|
|
for (var i = 0; i < len; i++) {
|
|
pwd += $chars.charAt(Math.floor(Math.random() * maxPos));
|
|
}
|
|
return pwd;
|
|
}
|
|
|
|
/**
|
|
* 解析url中的参数
|
|
*/
|
|
export function UrlParamHash(url) {
|
|
var params = {},
|
|
h;
|
|
var hash = url.slice(url.indexOf("?") + 1).split("&");
|
|
for (var i = 0; i < hash.length; i++) {
|
|
h = hash[i].split("=");
|
|
if (h.length > 1) {
|
|
params[h[0]] = h[1];
|
|
} else {
|
|
params[h[0]] = "";
|
|
}
|
|
}
|
|
return params;
|
|
}
|
|
|
|
/**
|
|
* 一键复制 uni.setClipboardData
|
|
* 用法:
|
|
* 1. import {setClipboardData} from '该文件的地址'
|
|
* 2. 利用async await
|
|
* 3. await setClipboardData(需要复制的文本)
|
|
*/
|
|
const setClipboardData = (text) => {
|
|
return new Promise((resolve, reject) => {
|
|
uni.setClipboardData({
|
|
data: text,
|
|
success: (res) => {
|
|
resolve(res);
|
|
},
|
|
fail: (err) => {
|
|
reject(err);
|
|
},
|
|
});
|
|
});
|
|
};
|
|
|
|
/**
|
|
* 获取系统剪贴板内容 uni.getClipboardData
|
|
* 用法:
|
|
* 1. import {getClipboardData} from '该文件的地址'
|
|
* 2. 利用async await来接收获取到的数据
|
|
* 3. await getClipboardData()
|
|
*/
|
|
const getClipboardData = () => {
|
|
return new Promise((resolve, reject) => {
|
|
uni.getClipboardData({
|
|
success: (res) => {
|
|
resolve(res);
|
|
},
|
|
fail: (err) => {
|
|
reject(err);
|
|
},
|
|
});
|
|
});
|
|
};
|
|
|
|
/**
|
|
* 拨打电话 uni.makePhoneCall()
|
|
* 用法:
|
|
* 1. import {getBatteryInfo} from '该文件的地址'
|
|
* 2. 直接makePhoneCall(拨打的电话号码)
|
|
*/
|
|
const makePhoneCall = (phone) => {
|
|
uni.makePhoneCall({
|
|
phoneNumber: phone,
|
|
});
|
|
};
|
|
|
|
/**
|
|
* 设置缓存
|
|
* @param {String} key 键名
|
|
* @param {String} data 值
|
|
*/
|
|
export function setStorageSync(key, data) {
|
|
uni.setStorageSync(key, data);
|
|
}
|
|
|
|
/**
|
|
* 获取缓存
|
|
* @param {String} key 键名
|
|
*/
|
|
export function getStorageSync(key) {
|
|
return uni.getStorageSync(key);
|
|
}
|
|
|
|
/**
|
|
* 删除缓存
|
|
* @param {String} key 键名
|
|
*/
|
|
export function removeStorageSync(key) {
|
|
return uni.removeStorageSync(key);
|
|
}
|
|
|
|
/**
|
|
* 清空缓存
|
|
* @param {String} key 键名
|
|
*/
|
|
export function clearStorageSync() {
|
|
return uni.clearStorageSync();
|
|
}
|
|
|
|
/**
|
|
* 页面跳转
|
|
* @param {'navigateTo' | 'redirectTo' | 'reLaunch' | 'switchTab' | 'navigateBack' | number } url 转跳路径
|
|
* @param {String} params 跳转时携带的参数
|
|
* @param {String} type 转跳方式
|
|
**/
|
|
export function useRouter(url, params = {}, type = "navigateTo") {
|
|
try {
|
|
if (Object.keys(params).length)
|
|
url = `${url}?data=${encodeURIComponent(JSON.stringify(params))}`;
|
|
if (type === "navigateBack") {
|
|
uni[type]({ delta: url });
|
|
} else {
|
|
uni[type]({ url });
|
|
}
|
|
} catch (error) {
|
|
console.error(error);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 预览图片
|
|
* @param {Array} urls 图片链接
|
|
*/
|
|
export function previewImage(
|
|
urls,
|
|
itemList = ["发送给朋友", "保存图片", "收藏"]
|
|
) {
|
|
uni.previewImage({
|
|
urls,
|
|
longPressActions: {
|
|
itemList,
|
|
fail: function (error) {
|
|
console.error(error, "===previewImage");
|
|
},
|
|
},
|
|
});
|
|
}
|
|
|
|
/**
|
|
* 保存图片到本地
|
|
* @param {String} filePath 图片临时路径
|
|
**/
|
|
export function saveImage(filePath) {
|
|
if (!filePath) return false;
|
|
uni.saveImageToPhotosAlbum({
|
|
filePath,
|
|
success: (res) => {
|
|
toast("图片保存成功", "success");
|
|
},
|
|
fail: (err) => {
|
|
if (
|
|
err.errMsg === "saveImageToPhotosAlbum:fail:auth denied" ||
|
|
err.errMsg === "saveImageToPhotosAlbum:fail auth deny"
|
|
) {
|
|
uni.showModal({
|
|
title: "提示",
|
|
content: "需要您授权保存相册",
|
|
showCancel: false,
|
|
success: (modalSuccess) => {
|
|
uni.openSetting({
|
|
success(settingdata) {
|
|
if (settingdata.authSetting["scope.writePhotosAlbum"]) {
|
|
uni.showModal({
|
|
title: "提示",
|
|
content: "获取权限成功,再次点击图片即可保存",
|
|
showCancel: false,
|
|
});
|
|
} else {
|
|
uni.showModal({
|
|
title: "提示",
|
|
content: "获取权限失败,将无法保存到相册哦~",
|
|
showCancel: false,
|
|
});
|
|
}
|
|
},
|
|
fail(failData) {
|
|
console.log("failData", failData);
|
|
},
|
|
});
|
|
},
|
|
});
|
|
}
|
|
},
|
|
});
|
|
}
|
|
|
|
/**
|
|
* 深拷贝
|
|
* @param {Object} data
|
|
**/
|
|
export const clone = (data) => JSON.parse(JSON.stringify(data));
|
|
/**
|
|
* 获取平台名称
|
|
* @return {string} 平台名称
|
|
*/
|
|
export function getPlatform() {
|
|
let platform;
|
|
switch (process.env.VUE_APP_PLATFORM) {
|
|
case "app":
|
|
case "app-plus":
|
|
let n = uni.getSystemInfoSync().platform.toLowerCase();
|
|
if (n === "ios") {
|
|
platform = "ios";
|
|
} else if (n === "android") {
|
|
platform = "android";
|
|
} else {
|
|
platform = "app";
|
|
}
|
|
break;
|
|
case "mp-weixin":
|
|
platform = "wx";
|
|
break;
|
|
case "mp-alipay":
|
|
platform = "alipay";
|
|
break;
|
|
case "mp-baidu":
|
|
platform = "baidu";
|
|
break;
|
|
case "mp-qq":
|
|
platform = "qq";
|
|
break;
|
|
case "mp-toutiao":
|
|
platform = "toutiao";
|
|
break;
|
|
case "quickapp-webview":
|
|
platform = "kuai";
|
|
break;
|
|
}
|
|
|
|
return platform;
|
|
}
|
|
|
|
/**
|
|
* 数组去重
|
|
* @param {Array} array 数值
|
|
* @retrun {Array} 数值
|
|
*/
|
|
export function arrayShuffle(array) {
|
|
let i = array.length,
|
|
t,
|
|
j;
|
|
while (i) {
|
|
j = Math.floor(Math.random() * i--);
|
|
t = array[i];
|
|
array[i] = array[j];
|
|
array[j] = t;
|
|
}
|
|
return array;
|
|
}
|
|
|
|
/**
|
|
* 日期格式化
|
|
* @param {Date} date 日期
|
|
* @param {string} format 返回的日期格式
|
|
* @retrun {string} 日期
|
|
*/
|
|
export function dateFormat(date, format = "YYYY-MM-DD HH:mm:ss") {
|
|
const config = {
|
|
YYYY: date.getFullYear(),
|
|
MM: date.getMonth() + 1,
|
|
DD: date.getDate(),
|
|
HH: date.getHours(),
|
|
mm: date.getMinutes(),
|
|
ss: date.getSeconds(),
|
|
};
|
|
for (const key in config) {
|
|
let value = config[key];
|
|
if (value < 10) {
|
|
value = "0" + value;
|
|
}
|
|
format = format.replace(key, value);
|
|
}
|
|
return format;
|
|
}
|
|
|
|
/**
|
|
* base64转文件
|
|
* @param {string} base64data base64
|
|
* @param {Function} cb 回调
|
|
*/
|
|
export function base64ToSrc(base64data, cb) {
|
|
const FILE_BASE_NAME = "tmp_base64src";
|
|
const [, format, bodyData] =
|
|
/data:image\/(\w+);base64,(.*)/.exec(base64data) || [];
|
|
if (!format) {
|
|
return new Error("格式错误");
|
|
}
|
|
|
|
// #ifdef MP-WEIXIN
|
|
let filePath = `${wx.env.USER_DATA_PATH}/${FILE_BASE_NAME}.${format}`;
|
|
// #endif
|
|
// #ifdef MP-QQ
|
|
let filePath = `${qq.env.USER_DATA_PATH}/${FILE_BASE_NAME}.${format}`;
|
|
// #endif
|
|
|
|
const buffer = uni.base64ToArrayBuffer(bodyData);
|
|
uni.getFileSystemManager().writeFile({
|
|
filePath,
|
|
data: buffer,
|
|
encoding: "binary",
|
|
success() {
|
|
cb && cb(filePath);
|
|
},
|
|
});
|
|
}
|
|
|
|
/**
|
|
* base64解码
|
|
* @param {string} str str
|
|
* @param {string}
|
|
*/
|
|
export function encodeBase64(str) {
|
|
return new Buffer.from(str).toString("base64");
|
|
}
|
|
|
|
/**
|
|
* base64解码
|
|
* @param {string} str str
|
|
* @param {string}
|
|
*/
|
|
export function decodeBase64(str) {
|
|
const commonContent = str.replace(/\s/g, "+");
|
|
return new Buffer.from(commonContent, "base64").toString();
|
|
}
|
|
|
|
/**
|
|
* 播放声音
|
|
* @param {string} src 声音文件地址
|
|
* @param {Boolean} loop 是否循环
|
|
*/
|
|
export function playSound(src, loop = false) {
|
|
const innerAudioContext = uni.createInnerAudioContext();
|
|
innerAudioContext.autoplay = true;
|
|
innerAudioContext.loop = loop;
|
|
innerAudioContext.src = src;
|
|
innerAudioContext.onPlay(() => {});
|
|
innerAudioContext.onError((res) => {});
|
|
}
|
|
|
|
/**
|
|
* 生成订单ID
|
|
* @param {string} prefix 订单前缀
|
|
* @param {string} 订单ID
|
|
*/
|
|
export function createOrderSn(prefix = "") {
|
|
return `${prefix}${this.randomString(10).toUpperCase()}${+new Date()}`;
|
|
}
|
|
|
|
/**
|
|
* 图片转base64
|
|
* @param {string} src 图片地址
|
|
* @return {Promise} base64
|
|
*/
|
|
export function imageToBase64(src) {
|
|
return new Promise((resolve, reject) => {
|
|
uni.getImageInfo({
|
|
src,
|
|
success: (image) => {
|
|
console.log(image);
|
|
uni.getFileSystemManager().readFile({
|
|
filePath: image.path,
|
|
encoding: "base64",
|
|
success: (e) => {
|
|
return resolve(`data:image/jpeg;base64,${e.data}`);
|
|
},
|
|
fail: (e) => {
|
|
return reject(null);
|
|
},
|
|
});
|
|
},
|
|
});
|
|
});
|
|
}
|
|
|
|
/**
|
|
* 随机范围内的数字
|
|
* @param {number} start 起始数字
|
|
* @param {number} end 起始数字
|
|
* @return {number || null} 随机数
|
|
*/
|
|
export function randomByRange(start, end) {
|
|
if (typeof start === "number" && typeof end === "number") {
|
|
return start + Math.floor(Math.random() * (end - start));
|
|
} else {
|
|
console.error("参数必须为数字");
|
|
return null;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 判断所给时间和今天的差值
|
|
* @param {string} date 所给时间
|
|
* @returns {string} 差值
|
|
*/
|
|
|
|
export function getDateDiff(date) {
|
|
const inputDate = new Date(date.replace(/\//g, "-"));
|
|
const today = new Date();
|
|
today.setHours(0, 0, 0, 0);
|
|
inputDate.setHours(0, 0, 0, 0);
|
|
|
|
const timeDiff = inputDate - today;
|
|
const oneDay = 24 * 60 * 60 * 1000;
|
|
const daysDiff = Math.floor(timeDiff / oneDay);
|
|
|
|
if (daysDiff === 0) {
|
|
return "今天";
|
|
} else if (daysDiff > 0) {
|
|
return `${daysDiff}天后`;
|
|
} else {
|
|
return `${Math.abs(daysDiff)}天前`;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
* 将分钟转换为时间格式
|
|
* @param {number} minutes 分钟
|
|
* @returns {string} 时间格式
|
|
*/
|
|
export function minutesToTime(minutes) {
|
|
const hours = Math.floor(minutes / 60);
|
|
const mins = minutes % 60;
|
|
const formattedHours = String(hours).padStart(2, '0');
|
|
const formattedMins = String(mins).padStart(2, '0');
|
|
return `${formattedHours}:${formattedMins}`;
|
|
}
|