/** * 通用js方法封装处理 * Copyright (c) 2019 ruoyi */ const baseURL = process.env.VUE_APP_BASE_API // 日期格式化 export function parseTime(time, pattern) { if (arguments.length === 0 || !time) { return null } const format = pattern || '{y}-{m}-{d} {h}:{i}:{s}' let date if (typeof time === 'object') { date = time } else { if ((typeof time === 'string') && (/^[0-9]+$/.test(time))) { time = parseInt(time) } else if (typeof time === 'string') { time = time.replace(new RegExp(/-/gm), '/'); } if ((typeof time === 'number') && (time.toString().length === 10)) { time = time * 1000 } date = new Date(time) } const formatObj = { y: date.getFullYear(), m: date.getMonth() + 1, d: date.getDate(), h: date.getHours(), i: date.getMinutes(), s: date.getSeconds(), a: date.getDay() } const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => { let value = formatObj[key] // Note: getDay() returns 0 on Sunday if (key === 'a') { return ['日', '一', '二', '三', '四', '五', '六'][value] } if (result.length > 0 && value < 10) { value = '0' + value } return value || 0 }) return time_str } // 表单重置 export function resetForm(refName) { if (this.$refs[refName]) { this.$refs[refName].resetFields(); } } // 添加日期范围 export function addDateRange(params, dateRange) { var search = params; search.beginTime = ""; search.endTime = ""; if (null != dateRange && '' != dateRange) { search.beginTime = dateRange[0]; search.endTime = dateRange[1]; } return search; } // 回显数据字典 export function selectDictLabel(datas, value) { if (value === null || value === undefined) { return ''; } var actions = []; Object.keys(datas).some((key) => { if (datas[key].dictValue == ('' + value)) { actions.push(datas[key].dictLabel); return true; } }) return actions.join(''); } // 回显数据字典(字符串数组) export function selectDictLabels(datas, value, separator) { var actions = []; var currentSeparator = undefined === separator ? "," : separator; var temp = value.split(currentSeparator); Object.keys(value.split(currentSeparator)).some((val) => { Object.keys(datas).some((key) => { if (datas[key].dictValue == ('' + temp[val])) { actions.push(datas[key].dictLabel + currentSeparator); } }) }) return actions.join('').substring(0, actions.join('').length - 1); } // 通用下载方法 export function download(fileName) { window.location.href = baseURL + "/common/download?fileName=" + encodeURI(fileName) + "&delete=" + true; } // 字符串格式化(%s ) export function sprintf(str) { var args = arguments, flag = true, i = 1; str = str.replace(/%s/g, function () { var arg = args[i++]; if (typeof arg === 'undefined') { flag = false; return ''; } return arg; }); return flag ? str : ''; } // 转换字符串,undefined,null等转化为"" export function praseStrEmpty(str) { if (!str || str == "undefined" || str == "null") { return ""; } return str; } /** * 构造树型结构数据 * @param {*} data 数据源 * @param {*} id id字段 默认 'id' * @param {*} parentId 父节点字段 默认 'parentId' * @param {*} children 孩子节点字段 默认 'children' * @param {*} rootId 根Id 默认 0 */ export function handleTree(data, id, parentId, children, rootId) { id = id || 'id' parentId = parentId || 'parentId' children = children || 'children' rootId = rootId || Math.min.apply(Math, data.map(item => { return item[parentId] })) || 0 //对源数据深度克隆 const cloneData = JSON.parse(JSON.stringify(data)) //循环所有项 const treeData = cloneData.filter(father => { let branchArr = cloneData.filter(child => { //返回每一项的子级数组 return father[id] === child[parentId] }); branchArr.length > 0 ? father.children = branchArr : ''; //返回第一层 return father[parentId] === rootId; }); return treeData != '' ? treeData : data; } /** 数字逢三位加逗号 */ export function toThousands(num){ const str = num.toString(); const reg = str.indexOf(".") > -1 ? /(\d)(?=(\d{3})+\.)/g : /(\d)(?=(?:\d{3})+$)/g; return str.replace(reg,"$1,"); } export function digitUppercase(n) { const fraction = ['角', '分']; const digit = [ '零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖' ]; const unit = [ ['元', '万', '亿'], ['', '拾', '佰', '仟'] ]; const head = n < 0 ? '欠' : ''; n = Math.abs(n); let s = ''; for (let i = 0; i < fraction.length; i++) { s += (digit[Math.floor(n * 10 * Math.pow(10, i)) % 10] + fraction[i]).replace(/零./, ''); } s = s || '整'; n = Math.floor(n); for (let i = 0; i < unit[0].length && n > 0; i++) { const p = ''; for (let j = 0; j < unit[1].length && n > 0; j++) { p = digit[n % 10] + unit[1][j] + p; n = Math.floor(n / 10); } s = p.replace(/(零.)*零$/, '').replace(/^$/, '零') + unit[0][i] + s; } return head + s.replace(/(零.)*零元/, '元') .replace(/(零.)+/g, '零') .replace(/^整$/, '零元整'); }; /* * * @params {string} idcode * * 函数参数必须是字符串,因为二代身份证号码是十八位,而在javascript中,十八位的数值会超出计算范围,造成不精确的结果, * 导致最后两位和计算的值不一致,从而该函数出现错误(详情查看javascript的数值范围)。 * 为了避免这一误差,idcode必须是字符串 * * 正则思路: * 第一位不可能是0 * 第二位到第六位可以是0-9 * 第七位到第十位是年份,所以七八位为19或者20 * 十一位和十二位是月份,这两位是01-12之间的数值 * 十三位和十四位是日期,是从01-31之间的数值 * 十五,十六,十七都是数字0-9 * 十八位可能是数字0-9,也可能是X * */ export function validatorIDCard(idcode) { if (typeof idcode !== 'string') { return { code: -1, msg: "为了避免javascript数值范围误差,idcode 必须是字符串" } } const idcard_patter = /^[1-9][0-9]{5}([1][9][0-9]{2}|[2][0][0|1][0-9])([0][1-9]|[1][0|1|2])([0][1-9]|[1|2][0-9]|[3][0|1])[0-9]{3}([0-9]|[X])$/; // 判断格式是否正确 const format = idcard_patter.test(idcode); if (!format) { return { code: -1, msg: "身份证号码格式错误" } } // 加权因子 const weight_factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]; // 校验码 const check_code = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']; const last = idcode[17];//最后一位 const seventeen = idcode.substring(0, 17); // ISO 7064:1983.MOD 11-2 // 判断最后一位校验码是否正确 const arr = seventeen.split(""); const len = arr.length; let num = 0; for (let i = 0; i < len; i++) { num += arr[i] * weight_factor[i]; } // 获取余数 const resisue = num % 11; const last_no = check_code[resisue]; // 返回验证结果,校验码和格式同时正确才算是合法的身份证号码 const result = last === last_no ? true : false; return { code: result ? 1 : -1, msg: !result ? "身份证号码格式错误" : "" } }