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}`;
 | |
| }
 |