JavaScript登录校验逻辑异常:选举投票系统多条件判断修复
修复选举投票系统登录校验逻辑问题
需求说明
需要实现以下4种登录校验逻辑:
- 用户输入信息匹配
votersDetails中的注册信息,且已在allElectionResult中存在(已投票):提示「您已完成过该操作,无法重复投票」(当前逻辑正常) - 用户输入信息匹配
votersDetails中的注册信息,但未在allElectionResult中存在(未投票):允许登录并跳转至e-voting-votingPage.html(当前逻辑异常,未校验注册信息就直接跳转) - 用户输入信息未在
votersDetails中(未注册):提示「请先注册」 - 用户输入信息与
votersDetails中的注册信息不匹配:提示「登录信息错误,请重试」
原代码问题分析
原signIn函数存在两个核心问题:
- 校验注册信息时,错误引用了不存在的字段:注册数据中没有
id和key字段,实际应为email和password,导致正确的注册信息无法被识别。 - 逻辑分支未准确区分「未注册」和「信息不匹配」的场景,导致错误提示混乱。
修复后的完整代码
// 初始化 votersDetails 从 localStorage 获取 var votersDetails = []; if (localStorage.localVoters) { var oldVoters = JSON.parse(localStorage.getItem("localVoters")); votersDetails = oldVoters; } // 注册提交函数 function submitRegistration() { if (firstName.value == "") { firstName.style.borderColor = "red"; } else { var voters = { fname: firstName.value, lname: lastName.value, email: email.value, password: pass.value, }; votersDetails.push(voters); localStorage.setItem("localVoters", JSON.stringify(votersDetails)); } } // 初始化 allElectionResult 从 localStorage 获取 var allElectionResult = []; if (localStorage.localResultsAll) { var oldAllResult = JSON.parse(localStorage.getItem("localResultsAll")); allElectionResult = oldAllResult; } // 投票完成提交函数 function finish() { for (let index = 0; index < votersDetails.length; index++) { disp.innerHTML = `${votersDetails[index].fname}`; disp4.innerHTML = `${votersDetails[index].email}`; } var allVotersElectionResult = { name: disp.innerHTML, myEmail: disp4.innerHTML, }; allElectionResult.push(allVotersElectionResult); localStorage.setItem("localResultsAll", JSON.stringify(allElectionResult)); window.location.href = "final.html"; } // 修复后的登录校验函数 function signIn() { var votersId = loginId.value.trim(); var votersKey = pass.value.trim(); let isRegistered = false; let isCredentialsMatch = false; let matchedEmail = ""; // 校验是否注册且账号密码匹配 for (let voter of votersDetails) { if (voter.email === votersId) { isRegistered = true; if (voter.password === votersKey) { isCredentialsMatch = true; matchedEmail = voter.email; break; } } } // 校验是否已投票 let hasVoted = false; for (let record of allElectionResult) { if (record.myEmail === matchedEmail) { hasVoted = true; break; } } // 分支逻辑处理 if (isCredentialsMatch && hasVoted) { warningAlert.innerHTML = `<i class="fas fa-warning" id="faWarning"></i> Operation Declined. <p>您已完成过该操作,无法重复投票</p>`; } else if (isCredentialsMatch && !hasVoted) { window.location.href = "e-voting-votingPage.html"; } else if (!isRegistered) { alert("请先注册"); } else { alert("登录信息错误,请重试"); } }
修复说明
- 字段修正:将原代码中错误的
id和key字段替换为注册数据实际存在的email和password,确保注册信息校验准确。 - 状态拆分:新增
isRegistered(是否注册)和isCredentialsMatch(账号密码是否匹配)两个状态,明确区分不同场景。 - 逻辑分支优化:按「已匹配且已投票」→「已匹配未投票」→「未注册」→「信息不匹配」的顺序处理,完全覆盖需求中的4种情况。
- 输入处理:添加
trim()去除输入首尾空格,避免因空格导致的校验失败。
内容的提问来源于stack exchange,提问作者Adex
相关产品推荐
相关产品推荐

