# 工具函数
# 日期格式化
传入的数据为 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
}