# 工具函数

# 日期格式化

传入的数据为 Element-UI DateTimePicker (opens new window)等日期组件的 v-model 值,返回格式为 YYYY-MM-DD HH:mm:ss


<script setup>
  export function formatDate(date) {
    return `${date.getFullYear()}-${(date.getMonth() + 1).toString().padStart(2, '0')}-${date.getDate().toString().padStart(2, '0')} ${date.getHours().toString().padStart(2, '0')}:${date.getMinutes().toString().padStart(2, '0')}:${date.getSeconds().toString().padStart(2, '0')}`;
  }
</script>

# 手机号合法验证


<script setup>
  export const validatePhoneNumber = (phoneNumber) => {
    // 定义正则表达式
    const phoneRegex = /^(\+?0?86\-?)?1[3-9]\d{9}$/;

    // 测试手机号是否符合正则表达式
    return phoneRegex.test(phoneNumber);
  }
</script>

# 信用代码合法验证


<script setup>
  export const validateCreditCode = (creditCode) => {
    // 定义正则表达式
    const creditCodeRegex = /^[0-9A-Z]{18}$/

    // 测试信用代码是否符合正则表达式
    return creditCodeRegex.test(creditCode)
  }
</script>

# 身份证合法验证


<script setup>
  export const validateIDCard = (idCard) => {
    // 身份证号码长度应为 18 位
    if (idCard.length !== 18) {
      return false;
    }

    // 前 17 位应为数字,最后一位可以是数字或者 X(代表 10)
    const reg = /^\d{17}[\dX]$/;
    if (!reg.test(idCard)) {
      return false;
    }

    // 获取前 17 位的数字
    const code17 = idCard.substring(0, 17);
    // 获取最后一位
    const parityBit = idCard.substring(17, 18);
    // Wi = 2^(n-1) % 11
    const powers = [
      7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2
    ];
    // 校验位
    const checkBits = [
      '1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'
    ];
    let sum = 0;
    for (let i = 0; i < 17; i++) {
      sum += parseInt(code17.charAt(i)) * powers[i];
    }
    // 校验位的计算结果
    const mod = sum % 11;
    return parityBit === checkBits[mod];
  }
</script>

# 二进制文件流下载

需搭配若依使用,传入的数据为 二进制流

提示


<script setup>
  import axios from "axios";
  import {getToken} from "@/utils/auth";


  let file = {
    type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8',
    url: '/system/static/static/export',
    method: 'post',
    data: this.queryParams
  }
  export function exportBlobFile(file = {}) {
    axios({
      url: process.env.VUE_APP_BASE_API + file.url,
      method: file.method,
      headers: {
        Authorization: 'Bearer ' + getToken()
      },
      data: file.data,
      // 在将流转为文件进行下载时,需要传个值:'blob',否则会乱码
      responseType: 'blob'
    }).then(res => {
      // let fileName = '123'
      // console.log('fileName==>', fileName)
      let blob = new Blob([res.data], {type: file.type})
      let downloadElement = document.createElement('a')

      let href = window.URL.createObjectURL(blob) //常见下载的链接

      downloadElement.href = href

      // downloadElement.download = fileName //下载后文件名

      document.body.appendChild(downloadElement)

      downloadElement.click() //点击下载

      document.body.removeChild(downloadElement) //下载完成移除元素

      window.URL.revokeObjectURL(href) //释放blob对象
    })
  }
</script>

# UUID使用

# 安装

npm install uuid

# 使用

import {v4 as uuidv4} from 'uuid';

const id = uuidv4();

# 图片url转Base64

<script>
    export function convertImageToBase64(imageUrl) {
    if (!imageUrl) {
    console.error('请先选择文件')
    return
}
    return fetch(imageUrl)
    .then(response => response.blob())
    .then(blob => new Promise((resolve, reject) => {
    const reader = new FileReader()
    reader.onload = () => resolve(reader.result.split(',')[1])
    reader.onerror = error => reject(error)
    reader.readAsDataURL(blob)
}))
    .then(base64 => `data:image/png;base64,${base64}`)
    .catch(error => console.error('Error converting image to Base64:', error))
}
</script>

# 数字转大写中文

    export const numberToChineseUpper = (money = 0, isUppercase = true, isMoney = true, isDeletePre = true) => {
    // 汉字的数字
    let cnNums = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九']
    if (isUppercase) {
        cnNums = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖']
    }
    // 基本单位
    let cnIntRadice = ['', '十', '百', '千']
    if (isUppercase) {
        cnIntRadice = ['', '拾', '佰', '仟']
    }
    // 对应整数部分扩展单位
    const cnIntUnits = ['', '万', '亿', '兆']
    // 对应小猪部分单位
    const cnDecUnits = ['角', '分', '毫', '厘']
    // 整数金额时后面跟的字符
    const cnInteger = '整'
    // 整数结束时的单位
    const cnIntLast = '圆'
    // 最大处理的数字, 纯数字可能失去精度问题,用字符串
    const maxNum = '99999999999999.9999'
    // 金额整数部分
    let integerNum
    // 金额小数部分
    let decimaNUm
    // 输出的中文金额字符串
    let chineseStr = ''
    // 分离金额后用的数组,预定义
    let parts
    if (money === '') {
        return ''
    }
    money = parseFloat(money)
    if (money >= Number(maxNum)) {
        // 超出最大处理数字
        return '超出最大处理数字'
    }
    if (money === 0) {
        if (isMoney) {
            chineseStr = cnNums[0] + cnIntLast + cnInteger
        } else {
            chineseStr = cnNums[0]
        }
        return chineseStr
    }
    // 转换为字符串
    money = money.toString()
    if (money.indexOf('.') === -1) {
        integerNum = money
        decimaNUm = ''
    } else {
        parts = money.split('.')
        integerNum = parts[0]
        // 小数点后最多取4
        decimaNUm = parts[1].substr(0, 4)
    }
    // 获取整型部分
    if (parseInt(integerNum, 10) > 0) {
        let zeroCount = 0
        for (let i = 0; i < integerNum.length; i++) {
            const n = integerNum.substr(i, 1)
            const p = integerNum.length - i - 1
            const q = p / 4
            const m = p % 4
            if (n === '0') {
                zeroCount++
            } else {
                if (zeroCount > 0) {
                    chineseStr += cnNums[0]
                }
                // 归零
                zeroCount = 0
                chineseStr += cnNums[parseInt(n)] + cnIntRadice[m]
            }
            if (m === 0 && zeroCount < 4) {
                chineseStr += cnIntUnits[q]
            }
        }
        if (isMoney) {
            chineseStr += cnIntLast
        }
    }
    // 小数部分
    if (decimaNUm !== '') {
        for (let i = 0; i < decimaNUm.length; i++) {
            const n = decimaNUm.substr(i, 1)
            if (n !== '0') {
                if (isMoney) {
                    chineseStr += cnNums[Number(n)] + cnDecUnits[i]
                } else {
                    chineseStr += cnNums[Number(n)]
                }
            }
        }
    }
    if (chineseStr === '') {
        if (isMoney) {
            chineseStr += cnNums[0] + cnIntLast + cnInteger
        } else {
            chineseStr += cnNums[0]
        }
    } else if (decimaNUm === '') {
        if (isMoney) {
            chineseStr += cnInteger
        }
    }
    // 10~20之间数字特殊处理,例如:一十改为十, 11转为 一十一改为 十一
    if (isDeletePre && money >= 10 && money < 20) {
        return chineseStr.replace(/^(一|壹)/, '')
    }
    return chineseStr
}