记一次代码优化

时间:2021-02-11 04:14:26

一. 证件号码校验规则需求

1、 非空
2、 长度
3、 符合相应证件类型号码生成规则,比如居民身份证号必须为十八位阿拉伯数字和英文字母等规则要求。
身份证规则:
1) 18位
2) 前17位号码为数字,18位为数字或X,正则参考:(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)
3) 第7-14位为出生年月日,日期不能大于当前时间,不能小于1900年
4) 第18位校验码检查,根据前17位数字计算第18位校验码是否正确
a) 将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2;
b) 将这17位数字和系数相乘的结果相加, 用加出来和除以11,取余
c) 余数只可能有0-1-2-3-4-5-6-7-8-9-10这11个数字。其分别对应的最后一位身份证的号码为1-0-X -9-8-7-6-5-4-3-2 

优化前代码

//取当前时间年月日,格式20180713
basedev.empAudit.getDateRangeStr = function nowtime() { //将当前时间转换成yyyymmdd格式
    var mydate = new Date();
    var str = "" + mydate.getFullYear();
    var mm = mydate.getMonth() + 1
    if (mydate.getMonth() > 9) {
        str += mm;
    } else {
        str += "0" + mm;
    }
    if (mydate.getDate() > 9) {
        str += mydate.getDate();
    } else {
        str += "0" + mydate.getDate();
    }
    return str;
}

//证件号码校验规则
Ext.apply(Ext.form.VTypes, {
    regular_userCardId: function(val, field) {
        var patt = /(^\d{18}$)|(^\d{17}(\d|X|x)$)/;
        //判断是否是18位,前17位号码为数字,18位为数字或X
        if (val.length != 18 || !patt.test(val)) {
            this.regular_userCardIdText = "身份证长度必须为18位!";
            return false;
        }

        //第7-14位为出生年月日,日期不能大于当前时间,不能小于1900年
        var userCardIdYear = val.substring(6, 10);
        var userCardIdDay = val.substring(6, 14);
        if (! (userCardIdYear >= 1900 || basedev.empAudit.getDateRangeStr() < userCardIdDay)) {
            this.regular_userCardIdText = "身份证号年月日错误!";
            return false;
        }

        //第18位校验码检查,根据前17位数字计算第18位校验码是否正确
        var valStr1 = val.substring(0, 1);
        var valStr2 = val.substring(1, 2);
        var valStr3 = val.substring(2, 3);
        var valStr4 = val.substring(3, 4);
        var valStr5 = val.substring(4, 5);
        var valStr6 = val.substring(5, 6);
        var valStr7 = val.substring(6, 7);
        var valStr8 = val.substring(7, 8);
        var valStr9 = val.substring(8, 9);
        var valStr10 = val.substring(9, 10);
        var valStr11 = val.substring(10, 11);
        var valStr12 = val.substring(11, 12);
        var valStr13 = val.substring(12, 13);
        var valStr14 = val.substring(13, 14);
        var valStr15 = val.substring(14, 15);
        var valStr16 = val.substring(15, 16);
        var valStr17 = val.substring(16, 17);
        var valStr18 = val.substring(17, 18);

        var valRema = (valStr1 * 7 + valStr2 * 9 + valStr3 * 10 + valStr4 * 5 + valStr5 * 8 + valStr6 * 4 + valStr7 * 2 + valStr8 * 1 + valStr9 * 6 + valStr10 * 3 + valStr11 * 7 + valStr12 * 9 + valStr13 * 10 + valStr14 * 5 + valStr15 * 8 + valStr16 * 4 + valStr17 * 2) % 11;

        switch (valRema) {
        case 0:
            if (valStr18 == 1) {
                return true;
            } else {
                this.regular_userCardIdText = "身份证校验位错误!";
                return false;
            }
            break;
        case 1:
            if (valStr18 == 0) {
                return true;
            } else {
                this.regular_userCardIdText = "身份证校验位错误!";
                return false;
            }
            break;
        case 2:
            if (valStr18 == 'X') {
                return true;
            } else {
                this.regular_userCardIdText = "身份证校验位错误!";
                return false;
            }
            break;
        case 3:
            if (valStr18 == 9) {
                return true;
            } else {
                this.regular_userCardIdText = "身份证校验位错误!";
                return false;
            }
            break;
        case 4:
            if (valStr18 == 8) {
                return true;
            } else {
                this.regular_userCardIdText = "身份证校验位错误!";
                return false;
            }
            break;
        case 5:
            if (valStr18 == 7) {
                return true;
            } else {
                this.regular_userCardIdText = "身份证校验位错误!";
                return false;
            }
            break;
        case 6:
            if (valStr18 == 6) {
                return true;
            } else {
                this.regular_userCardIdText = "身份证校验位错误!";
                return false;
            }
            break;
        case 7:
            if (valStr18 == 5) {
                return true;
            } else {
                this.regular_userCardIdText = "身份证校验位错误!";
                return false;
            }
            break;
        case 8:
            if (valStr18 == 4) {
                return true;
            } else {
                this.regular_userCardIdText = "身份证校验位错误!";
                return false;
            }
            break;
        case 9:
            if (valStr18 == 3) {
                return true;
            } else {
                this.regular_userCardIdText = "身份证校验位错误!";
                return false;
            }
            break;
        case 10:
            if (valStr18 == 2) {
                return true;
            } else {
                this.regular_userCardIdText = "身份证校验位错误!";
                return false;
            }
            break;
        default:
            return false;
        }
    }
});

优化后代码

//取当前时间年月日,格式20180713
basedev.empAudit.getDateRangeStr = function nowtime() {
    var mydate = new Date();
    var str = "" + mydate.getFullYear();
    var mm = mydate.getMonth() + 1
    if (mydate.getMonth() > 9) {
        str += mm;
    } else {
        str += "0" + mm;
    }
    if (mydate.getDate() > 9) {
        str += mydate.getDate();
    } else {
        str += "0" + mydate.getDate();
    }
    return str;
}

//证件号码校验规则
Ext.apply(Ext.form.VTypes, {
    regular_userCardId: function (val, field) {
        var patt = /(^\d{18}$)|(^\d{17}(\d|X|x)$)/;
        //判断是否是18位,前17位号码为数字,18位为数字或X
        if (val.length != 18 || !patt.test(val)) {
            this.regular_userCardIdText = "身份证长度必须为18位!";
            return false;
        }

        //第7-14位为出生年月日,日期不能大于当前时间,不能小于1900年
        var userCardIdYear = val.substring(6, 10);
        var userCardIdDay = val.substring(6, 14);
        if (!(userCardIdYear >= 1900 || basedev.empAudit.getDateRangeStr() < userCardIdDay)) {
            this.regular_userCardIdText = "身份证号年月日错误!";
            return false;
        }

        //第18位校验码检查,根据前17位数字计算第18位校验码是否正确
        var cardArr = val.split('');
        var valStr18 = cardArr[17];
        var valRema = (cardArr[0] * 7 + cardArr[1] * 9 + cardArr[2] * 10 + cardArr[3] * 5 + cardArr[4] * 8 +
            cardArr[5] * 4 + cardArr[6] * 2 + cardArr[7] * 1 + cardArr[8] * 6 + cardArr[9] * 3 +
            cardArr[10] * 7 + cardArr[11] * 9 + cardArr[12] * 10 + cardArr[13] * 5 + cardArr[14] * 8 +
            cardArr[15] * 4 + cardArr[16] * 2) % 11;

        var cardArrs = new Array(1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2);
        if (cardArrs[valRema] != valStr18) {
            this.regular_userCardIdText = "身份证校验位错误!";
            return false;
        } else {
            return true;
        }
    }
});