Skip to content

代码片段

axios拦截

js
import axios from 'axios';
let request = axios.create({
  baseURL: import.meta.env.VITE_BASE_API,
  timeout: 10000,
  headers: {},
  isShowMessage: true,
});
request.interceptors.request.use(
  (config) => {
    return config;
  },
  (error) => {
    return Promise.reject(error);
  },
);
request.interceptors.response.use(
  ({ data, config }) => {
    if (data.code == 0 || data.code == 200) return data.result;
    if (config.isShowMessage)
      //如果配置isShowMessage=true显示错误信息
      ElMessage({
        //提示错误消息
        message: data.message,
        type: 'error',
      });
    return Promise.reject(data); // 返回接口返回的错误信息,使用try catch捕获
  },
  (error) => {
    return Promise.reject(error);
  },
);
export default request;

判断文件类型是否是图片

js
/**
 * @description 判断文件类型是否是图片
 * @param {string} type 文件类型
 */
function isPicture(type) {
  if (type) return ['jpg', 'jpeg', 'png'].includes(type.toLowerCase());
}

判断文件类型是否是视频

js
/**
 * @description 判断文件类型是否是视频
 * @param {string} type 文件类型
 */
function isVideo(type) {
  if (type) return ['mp4', 'mov', 'mkv', 'avi'].includes(type.toLowerCase());
}

防抖

js
/**
 * @decription 防抖
 * @param {function} fn 延迟要执行的函数
 * @param {number} delay 默认时间为 300ms
 * @returns
 */
export function debounce(fn, delay = 300) {
  let timer = null;

  return async function (...args) {
    clearTimeout(timer);

    timer = setTimeout(async () => {
      await fn.apply(this, args);
    }, delay);
  };
}

节流

js
/**
 * @description节流
 * @param {function} fn 要执行的函数
 * @param {number} gapTime 间隔时间 默认:0
 * @returns
 */
function throttle(fn, gapTime) {
  let _lastTime = null;
  gapTime = gapTime || 0;

  return function () {
    let that = this,
      args = arguments,
      _nowTime = +new Date();
    if (_nowTime - _lastTime > gapTime || !_lastTime) {
      fn.apply(that, args);
      _lastTime = _nowTime;
    }
  };
}

比较数据是否一致

js
/**
 * 比较数据是否一致
 * @param {*} a
 * @param {*} b
 * @returns {boolean} 一致返回true 反之false
 */
function equals(a, b) {
  if (a === b) return true;
  if (a instanceof Date && b instanceof Date) return a.getTime() === b.getTime();
  if (!a || !b || (typeof a !== 'object' && typeof b !== 'object')) return a === b;
  if (a.prototype !== b.prototype) return false;
  let keys = Object.keys(a);
  if (keys.length !== Object.keys(b).length) return false;
  return keys.every((k) => equals(a[k], b[k]));
}

判断是否是数字

js
/**
 * @description -判断是否是数字
 * @param {*}
 * @return {boolean} 是数字返回true 反之false
 */
function isRealNum(num) {
  if (num === '' || num === null) {
    return false;
  }

  if (typeof num === 'number' && !isNaN(num)) {
    return true;
  }

  return false;
}

复制文本到剪切板

js
/**
 * 复制文本到剪切板
 * @param {string} text
 * @example
 * copyToClipboard('hello')
 */
const copyToClipboard = (text) => navigator.clipboard.writeText(text);

获取某个日期位于当年的第几天

js
/**
 * 获取某个日期位于当年的第几天
 * @param {Date} date
 * @returns {number}
 * @example
 * getDayOfYear(new Date(2022,10,22)) // 331
 */
const getDayOfYear = (date) =>
  Math.floor((date - new Date(date.getFullYear(), 0, 0)) / 1000 / 60 / 60 / 24);

将rgb颜色灰度化(基于光感加权平均)

js
/**
 * 将rgb颜色灰度化(基于光感加权平均)
 * @param {number} r
 * @param {number} g
 * @param {number} b
 * @returns {number}
 * @example
 * rgbToGray(50, 100, 150) // 92.98
 */
const rgbToGray = (r, g, b) => 0.2126 * r + 0.7152 * g + 0.0722 * b;

解析URL中参数

js
/**
 * 解析URL中参数
 * @param {string} url
 * @returns {object}
 * @example
 * parseQuery('?a=1&b=2') // {a: 1, b: 2}
 */
const parseQuery = (url) => {
  q = {};
  url.replace(/([^?&=]+)=([^&]*)/g, (_, k, v) => (q[k] = v));
  return q;
};

对象属性转url参数

js
/**
 * 对象属性转url参数
 * @param {object} options 传入一个对象
 * @returns {string} 返回一个string类型
 */
const formatOptions = (options) => {
  var urlOptions = "";
  for (var i in options) {
    urlOptions += i + "=" + options[i] + "&";
  }
  urlOptions = urlOptions.slice(0, urlOptions.length - 1);
  return urlOptions;
};

筛选对象属性

js
/**
 * 筛选对象属性
 * @param {object} obj
 * @param {string[]} props
 * @returns {object}
 * @example
 * pick({a: 1, b: 2, c: 3}, 'a', 'c') // {a: 1, c: 3}
 */
const pick = (obj, ...props) =>
  Object.fromEntries(Object.entries(obj).filter(([k]) => props.includes(k)));

随机HEX颜色

js
/**
 * 随机HEX颜色
 * @returns {string}
 * @example
 * randomColor() // '#ffffff'
 */
const randomColor = () =>
  "#" +
  Math.floor(Math.random() * 0xffffff)
    .toString(16)
    .padEnd(6, "0");

去掉字符串中的元素标记

js
/**
 * 去掉字符串中的元素标记
 * @param {string} fragment
 * @returns {string}
 * @example
 * removeTag('<p>hello</p>') // 'hello'
 */
const removeTag = (fragment) =>
  new DOMParser().parseFromString(fragment, "text/html").body.textContent || "";

数据库字段名称下划线转小驼峰

js
function toCamelCase(str) {
  return str.replace(/_([a-z])/g, (match, p1) => p1.toUpperCase());
}
// 递归地将对象或数组的键转换为小驼峰格式
function convertToCamelCase(input) {
  if (Array.isArray(input)) {
    return input.map((item) => convertToCamelCase(item));
  } else if (input !== null && typeof input === 'object') {
    return Object.keys(input).reduce((acc, key) => {
      const camelCaseKey = toCamelCase(key);
      acc[camelCaseKey] = convertToCamelCase(input[key]);
      return acc;
    }, {});
  }
  return input;
}

兼容ios文件下载

js
   /**
     * @decription 下载兼容ios
     * @param {object} value
     * @param {object} value.filePath -文件地址
     * @param {object} value.fileName - 文件名
     */
    function download(value) {
      let link = document.createElement('a');
      link.href = value.filePath;
      link.download = value.fileName;
      // 在IOS上模拟点击链接
      if (navigator.userAgent.match(/(iPod|iPhone|iPad)/)) {
        var event = document.createEvent('MouseEvents');
        event.initMouseEvent(
          'click',
          true,
          true,
          window,
          1,
          0,
          0,
          0,
          0,
          false,
          false,
          false,
          false,
          0,
          null
        );
        link.dispatchEvent(event);
      } else {
        // 在其他设备上直接下载文件
        link.click();
      }
    }

图片处理

图片压缩

js
/**
* @decription 图片压缩
* @parma {Object} file 图片文件对象
* @parma {number} quality 压缩的图片质量0-1
* @return {Promise<File>} 返回文件对象
*/
function compressImage(file, quality = 0.1) {
      return new Promise((resolve, reject) => {
        let img = new Image();
        let reader = new FileReader();

        // 读取文件为DataURL
        reader.onload = function (e) {
          img.src = e.target.result;
        };
        reader.readAsDataURL(file);

        // 图片加载完成后执行
        img.onload = () => {
          let canvas = document.createElement('canvas');
          let ctx = canvas.getContext('2d');

          // 计算新的宽度和高度
          let width = img.width;
          let height = img.height;

          // 设置canvas的宽度和高度
          canvas.width = width;
          canvas.height = height;

          // 绘制图片到canvas
          ctx.drawImage(img, 0, 0, width, height);

          // 将canvas的内容转回dataURL
          // let dataUrl = canvas.toDataURL(file.type, quality); // quality范围0到1
          canvas.toBlob(
            (blob) => {
              if (!blob) {
                reject(new Error('Failed to create Blob'));
                return;
              }

              // 创建新的File对象
              const compressedFile = new File([blob], file.name, {
                type: file.type,
              });

              resolve(compressedFile);
            },
            file.type,
            quality
          );
          // resolve(dataUrl);
        };

        img.onerror = reject;
      });
    },

图片转base64

js
/**
* @description - 图片文件对象转图片base64
* @param {Object} file 图片文件对象
* @return {Promise<string>} 图片的base64
*/
function fileToBase64(file) {
      return new Promise((resolve, reject) => {
        const reader = new FileReader();
        reader.onload = (event) => {
          console.log(event.target.result, 'event.target.result');
          resolve(event.target.result);
        };
        reader.onerror = reject;
        // 将File对象以DataURL形式读取,这会返回一个包含Base64编码的字符串
        reader.readAsDataURL(file);
      });
    },