vue3 身份证校验、识别性别/生日/年龄

表单项绑定 @change 事件

javascript 复制代码
<template>
  <el-form ref="employeeFormRef" :model="form" :rules="rules" label-width="120px">
    <el-form-item label="身份证号" prop="idCardNo">
      <el-input v-model="form.idCardNo" placeholder="请输入身份证号" @change="idCardNoChange" />
    </el-form-item>
    <el-form-item label="出生日期" prop="dateOfBirth">
      <el-date-picker clearable
                      v-model="form.dateOfBirth"
                      type="date"
                      value-format="YYYY-MM-DD"
                      placeholder="请选择出生日期">
      </el-date-picker>
    </el-form-item>
    <el-form-item label="年龄" prop="age">
      <el-input v-model="form.age" placeholder="请输入年龄" />
    </el-form-item>
    <el-form-item label="性别" prop="sex">
      <el-select v-model="form.sex" placeholder="请选择性别">
        <el-option
          v-for="dict in sys_user_sex"
          :key="dict.value"
          :label="dict.label"
          :value="dict.value"
        ></el-option>
      </el-select>
    </el-form-item>
  </el-form>
</template>

定义身份验证规则规则

javascript 复制代码
const isIdCardNo = (rule, value, callback) => {
  var arrExp = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];//加权因子
  var arrValid = [1, 0, "X", 9, 8, 7, 6, 5, 4, 3, 2];//校验码
  if (/^\d{17}\d|x$/i.test(value)) {
    var sum = 0, idx;
    for (var i = 0; i < value.length - 1; i++) {
      // 对前17位数字与权值乘积求和
      sum += parseInt(value.substr(i, 1), 10) * arrExp[i];
    }
    // 计算模(固定算法)
    idx = sum % 11;
    // 检验第18为是否与校验码相等
    if (arrValid[idx] == value.substr(17, 1).toUpperCase()) {
      callback()
    } else {
      form.value.sex = '';
      form.value.dateOfBirth = '';
      form.value.age = '';
      callback("身份证格式有误");
    }
  } else {
    form.sex = '';
    form.dateOfBirth = '';
    form.value.age = '';
    callback("身份证格式有误");
  }
};

const data = reactive<PageData<EmployeeForm, EmployeeQuery>>({
  rules: {
    idCardNo: [
      { required: true, message: "身份证号不能为空", trigger: "blur" },
      {	//调用定义的方法校验格式是否正确
        validator: isIdCardNo, trigger: "blur"
      }
    ],
  }
});

识别性别、出生日期

javascript 复制代码
// 身份证识别性别出生日期
const idCardNoChange = () => {
  const reg =
    /^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/;
  if (reg.test(form.value.idCardNo)) {
    let org_birthday = form.value.idCardNo.substring(6, 14);
    let org_gender = form.value.idCardNo.substring(16, 17);
    let sex = org_gender % 2 == 1 ? "0" : "1";
    let birthday =
      org_birthday.substring(0, 4) +
      "-" +
      org_birthday.substring(4, 6) +
      "-" +
      org_birthday.substring(6, 8);
    form.value.sex = sex;
    form.value.dateOfBirth = birthday;
    form.value.age = ageValue(birthday).age;
  } else {
    return false;
  }
};

出生日期计算年龄

javascript 复制代码
/**
 * 获取年龄
 * @param val
 * @returns {{month: unknown, day: unknown, age: unknown}}
 */
const ageValue= (val?: String) => {
  // 新建日期对象
  let date = new Date()
  // 今天日期,数组,同 birthday
  let birthdayDate = new Date(val)
  let birthday = [birthdayDate.getFullYear(), birthdayDate.getMonth(), birthdayDate.getDate()]
  let today = [date.getFullYear(), date.getMonth() + 1, date.getDate()]
  // 分别计算年月日差值
  let age = today.map((value, index) => {
    return value - birthday[index]
  })
  // 当天数为负数时,月减 1,天数加上月总天数
  if (age[2] < 0) {
    // 简单获取上个月总天数的方法,不会错
    let lastMonth = new Date(today[0], today[1], 0)
    age[1]--
    age[2] += lastMonth.getDate()
  }
  // 当月数为负数时,年减 1,月数加上 12
  if (age[1] < 0) {
    age[0]--
    age[1] += 12
  }
  return {age:age[0],month:age[1],day:age[2]}
}
相关推荐
万物得其道者成6 分钟前
React Zustand状态管理库的使用
开发语言·javascript·ecmascript
小白小白从不日白7 分钟前
react hooks--useReducer
前端·javascript·react.js
下雪天的夏风19 分钟前
TS - tsconfig.json 和 tsconfig.node.json 的关系,如何在TS 中使用 JS 不报错
前端·javascript·typescript
青稞儿25 分钟前
面试题高频之token无感刷新(vue3+node.js)
vue.js·node.js
diygwcom31 分钟前
electron-updater实现electron全量版本更新
前端·javascript·electron
volodyan34 分钟前
electron react离线使用monaco-editor
javascript·react.js·electron
^^为欢几何^^43 分钟前
lodash中_.difference如何过滤数组
javascript·数据结构·算法
Hello-Mr.Wang1 小时前
vue3中开发引导页的方法
开发语言·前端·javascript
程序员凡尘1 小时前
完美解决 Array 方法 (map/filter/reduce) 不按预期工作 的正确解决方法,亲测有效!!!
前端·javascript·vue.js
北岛寒沫6 小时前
JavaScript(JS)学习笔记 1(简单介绍 注释和输入输出语句 变量 数据类型 运算符 流程控制 数组)
javascript·笔记·学习