import dayjs from 'dayjs' import { FormItemRule } from 'element-plus' import { sortParserDate } from './date' /** * 是否为原生对象 * @param obj 判断对象 * @returns 是否为原生对象 */ export function isPlainObject (obj: unknown) { return Object.prototype.toString.call(obj) === '[object Object]' } /** * 是否为空 * @param val 需要判断的值 可以为任意类型 * @returns */ export function isEmpty (val: unknown): val is undefined|null|'' { return val === null || val === undefined || (typeof val === 'string' ? val.length === 0 : false) } /** * 是否为空,空格字符也算空 * @param val 需要判断的值 * @returns */ export function isEmptyTrim (val?: unknown): val is undefined|null|'' { return val === null || val === undefined || (typeof val === 'string' ? val.trim().length === 0 : false) } /** * 检查字符串的长度 * @param str 字符串 * @param reqlength 要比较的长度 * @return true:变量长度<给出的长度;false:变量长度>=给出的长度 */ export function isShorter (str: string, reqlength: number) { return !isEmpty(str) && str.length < reqlength } /** * 检查字符串是否是整数 * @param s 字符串 * @return 是否是整数 */ export function isInteger (s: string|number) { return /^[0-9]+$/.test(String(s)) } /** * 判断输入变量是否是实数 * @param s 要检查的变量值 * @return 是否为实数 */ export function isDecimal (s: string|number) { return /^([0-9]+(\.?))?[0-9]+$/.test(String(s)) } /** * 判断输入变量是否是数字或者字母 * @param s 要检查的变量值 * @return 是否为数字或者字母 */ export function isIntChar (s: string|number) { return typeof s === 'number' || /^[a-zA-Z0-9]+$/.test(s) } /** * 判断输入变量是否是数字或者字母或者特殊字符 * 特殊字符:|_ - * & % $ # @ ! ~ ^ ( ) * @param s 要检查的变量值 * @return 是否为数字或者字母或者特殊字符 */ export function isIntCharSpecial (s: string|number) { return typeof s === 'number' || /^[-a-zA-Z0-9|_*&%$#@!~^()]+$/.test(s) } /** * 检查字符串是否为合法email地址 * @param s 字符串 * @return 是否为合法email地址 */ export function isEmail (s: string) { return /^\w+((-\w+)|(\.\w+))*@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/.test(s) } /** * 检查字符串是否为合法手机号 ?? 规则不够详细 * @param s 字符串 * @return 是否为合法手机号 */ export function isMobileNumber (s: string|number) { return !(isEmpty(s) || !isInteger(s) || String(s).length !== 11) } /** * 时间1是否在时间2之前 * @param date1 时间1 * @param date2 时间2 * @param unitType 可精确的单位 默认为天 * @returns */ export function isBeforeDate (date1?: dayjs.ConfigType, date2?: dayjs.ConfigType, unitType: dayjs.OpUnitType = 'date') { return dayjs(date1).isBefore(date2, unitType) } /** * 时间1是否在时间2之后 * @param date1 时间1 * @param date2 时间2 * @param unitType 可精确的单位 默认为天 * @returns */ export function isAfterDate (date1?: dayjs.ConfigType, date2?: dayjs.ConfigType, unitType: dayjs.OpUnitType = 'date') { return dayjs(date1).isAfter(date2, unitType) } /** * 检查时间间隔是否在规定间隔之内 * @param date1 时间1 * @param date2 时间2 * @param unit 数量 * @param unitType 单位,默认为天 * @returns */ export function isInDaterangeUnit (date1: dayjs.ConfigType, date2: dayjs.ConfigType, unit: number, unitType: dayjs.ManipulateType = 'd') { const [start, end] = sortParserDate([date1, date2]) return unit > 0 ? !start.add(unit, unitType).isAfter(end) : !end.add(unit, unitType).isBefore(end) } /** * 检验行内账号合法性 * @param account 账号 * @return 账号是否合法 */ export function isAccount (account: string) { if (!/^\d+$/.test(account)) return false function add (total: number, num: string) { return (total += Number(num)) } const accountChars = account.split('') const allTotal = accountChars .reduceRight((total, cur, index) => { const num = Number(cur) * 2 total += num > 9 ? `${num}`.split('').reduce(add, 0) : num total += Number(accountChars[index - 1] || 0) return total }, 0) let verify = allTotal > 9 ? Number(`${allTotal}`.charAt(1)) : allTotal verify = verify === 0 ? 0 : 10 - verify const last = account.slice(-1)[0] return Number(last) === verify } /** * 身份证校验 * @param value * @returns */ export function isIdCard (value: string) { if ((!value) || ((value.length !== 18))) { return false } const temp = value.substr(0, 17) for (let i = 0; i < temp.length; i++) { if (temp.charAt(i) < '0' || temp.charAt(i) > '9') { return false } } if (parseInt(value.substr(6, 4), 10) < 1900 || parseInt(value.substr(6, 4), 10) > 2100) { return false } if (parseInt(value.substr(10, 2), 10) > 12 || parseInt(value.substr(10, 2), 10) < 1) { return false } if (parseInt(value.substr(12, 2), 10) > 31 || parseInt(value.substr(12, 2), 10) < 1) { return false } const Wi = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1] const Ai = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'] value.charAt(17) === 'x' && (value = value.replace('x', 'X')) const checkDigit = value.charAt(17) let cardSum = 0 for (let j = 0; j < value.length - 1; j++) { cardSum = cardSum + parseInt(value.charAt(j)) * Wi[j] } const seq = cardSum % 11 const getCheckDigit = Ai[seq] if (checkDigit !== getCheckDigit) { return false } return true } /** * 生成elForm rule * @param validate 接受一个value的校验函数 * @param message 提示信息 * @returns */ export function generateRule (validate: (val: unknown) => boolean, message: string) { const rule: FormItemRule = { validator: (rule, val) => validate(val), message } return rule }