254 lines
7.2 KiB
JavaScript
254 lines
7.2 KiB
JavaScript
/**
|
||
* 通用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 ? "身份证号码格式错误" : ""
|
||
}
|
||
}
|
||
|