From 0462c947d509a7b3444ec77fc40955e9d53c1dca Mon Sep 17 00:00:00 2001 From: "@jyuhsin" <729757837@qq.com> Date: Mon, 15 Sep 2025 18:20:25 +0800 Subject: [PATCH] commit --- .../zhgh/activity/family/apply/signForm.js | 143 ++++++++++++++++-- 1 file changed, 130 insertions(+), 13 deletions(-) diff --git a/src/main/resources/views/platform/zhgh/activity/family/apply/signForm.js b/src/main/resources/views/platform/zhgh/activity/family/apply/signForm.js index 75db906..aaf2193 100644 --- a/src/main/resources/views/platform/zhgh/activity/family/apply/signForm.js +++ b/src/main/resources/views/platform/zhgh/activity/family/apply/signForm.js @@ -170,18 +170,6 @@ const signForm = { const ac = (Number(this.active) - 1) this.active = '' + (ac >= 0 ? ac : 0) }, - validFamilyForm() { - for (let i = 0; i < this.formData.mobileColumnsValue.length; i++) { - const family = this.formData.mobileColumnsValue[i] - for (const familyColumn of family) { - if(familyColumn.isRequired && !familyColumn.columnValue) { - this.$message.error('家属' + (i + 1) + '的' + familyColumn.columnName + '不能为空') - return false - } - } - } - return true - }, async validSignUp() { //获取家属是多少人 const res = await this.$axios.post("/platform/family/apply/validateSignUp", { @@ -229,6 +217,135 @@ const signForm = { this.courseTypeRow = courseType this.signDialog = true }, + validateIdCard(idCard) { + if (!idCard) { + return false + } + + // 18位身份证号码校验 + if (idCard.length === 18) { + const idCardRegex = /^[1-9]\d{5}(18|19|20)?\d{2}((0[1-9])|(10|11|12))(([0|1|2][0-9])|10|20|30|31)\d{3}(\d|[Xx])$/ + if (!idCardRegex.test(idCard)) { + return false + } + + // 校验码计算 + const weights = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2] + const checksums = ["1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"] + let sum = 0 + for (let i = 0; i < 17; i++) { + sum += idCard[i] * weights[i] + } + const checksum = checksums[sum % 11] + return checksum === idCard[17].toUpperCase() + } + + // 15位身份证号码校验 + else if (idCard.length === 15) { + const idCardRegex = /^[1-9]\d{5}\d{2}((0[1-9])|(10|11|12))(([0|1|2][0-9])|10|20|30|31)\d{3}$/ + return idCardRegex.test(idCard) + } + + // 外国人或其他情况 + else { + return false + } + }, + validFamilyForm() { + // 校验规则映射 + const validators = { + idCard: (value) => this.validateIdCard(value), + mobile: (value) => /^1[3-9]\d{9}$/.test(value), + email: (value) => /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/.test(value) + }; + // 显示提示弹窗(直接传完整的 message) + const showAlert = (message) => { + this.$alert(message, "提示", { + confirmButtonText: "确定", + type: "warning" + }) + }; + const { mobileColumnsValue } = this.formData; + for (let i = 0; i < mobileColumnsValue.length; i++) { + const family = mobileColumnsValue[i]; + for (const col of family) { + const value = col.columnValue?.trim(); // 安全处理空值和空格 + // 必填校验 + if (col.isRequired && !value) { + const message = this.activity.keyWord + (i + 1) + '的' + col.columnName + '不能为空'; + showAlert(message); + return false; + } + // 格式校验 + if (col.validRule && value) { + const validator = validators[col.validRule]; + if (validator && !validator(value)) { + const message = this.activity.keyWord + (i + 1) + '的' + col.columnName + '格式不正确'; + showAlert(message); + return false; + } + } + if(col.validRule === 'idCard' && this.courseRow.familyAgeLimit) { + const parseCard = this.parseIdCard(value) + if(this.courseRow.minAge && parseCard.age < this.courseRow.minAge) { + const message = '限制报名最小年龄为' + this.courseRow.minAge; + showAlert(message); + return false; + + } + if(this.courseRow.maxAge && parseCard.age > this.courseRow.maxAge) { + const message = '限制报名最大年龄为' + this.courseRow.maxAge; + showAlert(message); + return false; + } + } + if(col.validRule === 'idCard' && this.courseRow.familySexLimit) { + const parseCard = this.parseIdCard(value) + if(this.courseRow.familySex && parseCard.sex !== this.courseRow.familySex) { + const message = '限制报名性别为' + this.courseRow.familySex; + showAlert(message); + return false; + } + } + } + } + return true; + }, + parseIdCard(idCard) { + if (!idCard || (idCard.length !== 18 && idCard.length !== 15)) { + return null; + } + + let birthStr = ''; + let sexCode = ''; + + if (idCard.length === 15) { + birthStr = '19' + idCard.substring(6, 12); + sexCode = idCard.substring(14, 15); // 15位:第15位是性别 + } else { + birthStr = idCard.substring(6, 14); + sexCode = idCard.substring(16, 17); // 18位:第17位是性别 + } + + const birthYear = parseInt(birthStr.substring(0, 4), 10); + const birthMonth = parseInt(birthStr.substring(4, 6), 10) - 1; + const birthDay = parseInt(birthStr.substring(6, 8), 10); + + const birthDate = new Date(birthYear, birthMonth, birthDay); + const today = new Date(); + + let age = today.getFullYear() - birthDate.getFullYear(); + const monthDiff = today.getMonth() - birthDate.getMonth(); + const dayDiff = today.getDate() - birthDate.getDate(); + + if (monthDiff < 0 || (monthDiff === 0 && dayDiff < 0)) { + age--; + } + + const sex = parseInt(sexCode, 10) % 2 === 1 ? '男' : '女'; + + return { age, sex, }; + }, async onSubmit() { //验证家属表单 if (!this.validFamilyForm()) return @@ -284,7 +401,7 @@ const signForm = { }, }, style: /*language=CSS*/ ` - .el-tabs__header { + ::v-deep .el-tabs__header { margin: 0 0 15px !important; } `