拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Web-Dev-For-Beginners 银行应用实战(二):构建登录与注册表单及全链路验证体系

Web-Dev-For-Beginners 银行应用实战二构建登录与注册表单及全链路验证体系【免费下载链接】Web-Dev-For-Beginners24 Lessons, 12 Weeks, Get Started as a Web Developer项目地址: https://gitcode.com/GitHub_Trending/we/Web-Dev-For-Beginners本文是《Web-Dev-For-Beginners》课程中银行应用Bank App系列的第二课讲解如何把上一课基于 HTML 模板的静态银行应用升级为具备完整「登录 / 注册」能力的交互式应用。你将系统掌握 HTML5 表单语义与输入类型、GET/POST 提交差异、基于事件驱动 FormData Fetch API 的现代表单处理以及「浏览器层 → JavaScript 层 → 服务端层」的多层验证架构并能在本仓库的 Bank API 后端端口 5000上跑通真实的账户创建与数据校验流程。前置准备双服务架构与 API 连通性检查本课是上一课 HTML 模板路由 的延续动手前需确认以下组件就绪组件状态说明HTML Templates✅ 必需银行应用的基础页面结构Node.js✅ 必需运行后端 API 的 JavaScript 运行时Bank API Server✅ 必需负责数据存储与查询的后端服务开发环境中需要同时运行两个相互独立的服务器这与真实项目中前后端分离的部署形态一致前端服务器服务于银行应用页面默认端口3000后端 API 服务器处理数据的存储与检索端口5000两者可并行运行而互不冲突。启动后端后用 curl 验证连通性curl http://localhost:5000/api # 预期响应: Bank API v1.0.0看到 API 版本号即代表环境就绪。后端接口的完整清单可查阅 api/README.mdPOST /api/accounts/创建账户、GET /api/accounts/:user查询账户、DELETE /api/accounts/:user删除账户、POST /api/accounts/:user/transactions添加交易等注意该服务使用内存存储重启后数据即丢失。HTML 表单与控件用户与应用之间的通信协议HTML 表单是用户意图与应用响应之间的桥梁。HTML5 引入的专用输入类型email 校验、数字格式化、日期选择显著改善了可访问性与移动端体验。每个表单都需要的结构要素!-- 基础表单结构 -- form iduserForm methodPOST label forusernameUsername/label input idusername nameusername typetext required button typesubmitSubmit/button /form创建带唯一标识符的表单容器指定数据提交的 HTTP 方法关联label 与 input可访问性关键定义处理表单提交的提交按钮。现代输入类型与属性输入类型用途使用示例text通用文本输入input typetext nameusernameemail邮箱格式校验input typeemail nameemailpassword隐藏字符输入input typepassword namepasswordnumber数值输入input typenumber namebalance min0tel电话号码input typetel namephoneHTML5 优势使用特定输入类型可获得自动校验、合适的移动端键盘与更好的可访问性支持无需额外 JavaScript按钮类型与行为!-- 三种按钮行为 -- button typesubmitSave Data/button !-- 提交表单 -- button typeresetClear Form/button !-- 重置所有字段 -- button typebuttonCustom Action/button !-- 无默认行为 --submit触发表单提交将数据发往指定端点reset将所有字段恢复为初始状态普通 button无默认行为需自定义 JavaScript 实现功能。⚠️注意input是自闭合元素现代规范建议省略结尾斜杠直接写作input。构建登录表单template idlogin h1Bank App/h1 section h2Login/h2 form idloginForm novalidate div classform-group label forusernameUsername/label input idusername nameuser typetext required autocompleteusername placeholderEnter your username /div button typesubmitLogin/button /form /section /template要点用语义化 HTML5 元素组织结构用带含义 class 的div容器分组相关元素用for/id关联标签与输入框用autocomplete、placeholder提升体验用novalidate关闭浏览器默认校验改由 JavaScript 接管。仓库的最终解决方案 solution/index.html 正是这种结构的工程化版本登录表单与注册表单并排放在auth-panels中每个字段外层包裹带图标的field容器并预置了loginError/registerError两个rolealert的错误展示区供 JS 写入错误信息后由屏幕阅读器即时播报。标签Label的威力正确的标签关联带来四大收益屏幕阅读器支持可清晰朗读每个表单字段点击目标扩展点击标签即可聚焦对应输入框表单校验错误消息能关联到具体字段SEO 增益为表单元素提供语义含义。可访问性目标每个表单输入都必须有与之关联的 label。这一简单实践能让表单服务包括残障用户在内的所有人。构建注册表单注册需要更详细的信息以创建完整账户hr/ h2Register/h2 form idregisterForm novalidate div classform-group label foruserUsername/label input iduser nameuser typetext required autocompleteusername placeholderChoose a username /div div classform-group label forcurrencyCurrency/label input idcurrency namecurrency typetext value$ required maxlength3 placeholderUSD, EUR, etc. /div div classform-group label fordescriptionAccount Description/label input iddescription namedescription typetext maxlength100 placeholderPersonal savings, checking, etc. /div div classform-group label forbalanceStarting Balance/label input idbalance namebalance typenumber value0 min0 step0.01 placeholder0.00 /div button typesubmitCreate Account/button /form这里应用了div容器组织每个字段便于样式布局恰当的autocomplete支持浏览器自动填充placeholder提示输入value设置合理默认值required、maxlength、min等校验属性typenumberstep0.01支持余额小数输入。输入类型与行为探索特性收益示例typenumber移动端弹出数字键盘余额输入更轻松step0.01控制小数精度支持货币的「分」autocomplete浏览器自动填充表单填写更快placeholder上下文提示引导用户预期可访问性挑战尝试仅用键盘浏览表单——Tab在字段间移动、Space勾选、Enter提交以此体验屏幕阅读器用户的交互方式。表单提交方法数据应该去哪里默认表单行为先观察基础提交会发生什么点击「Register」按钮后浏览器地址栏会变化、页面重新加载、数据出现在 URL 中。GET 与 POST 对比方法适用场景数据位置安全级别大小限制GET搜索、筛选URL 参数低可见约 2000 字符POST用户账户、敏感数据请求体较高隐藏无实际限制GET把表单数据以查询参数形式追加到 URL适合检索型操作POST数据放入请求体敏感信息必须使用GET 局限尺寸受限、数据可见、留在浏览器历史中POST 优势容量大、隐私保护、支持文件上传。最佳实践搜索与筛选用GET注册、登录、创建数据一律用POST。配置表单提交目标让注册表单通过 POST 与后端 API 通信form idregisterForm action//localhost:5000/api/accounts methodPOST novalidate定向到 API 端点使用POST安全传输数据保留novalidate交由 JavaScript 管理校验。测试表单提交填写注册表单点击「Create Account」观察浏览器中的服务器响应。预期现象浏览器跳转到 API 端点返回包含新账户数据的 JSON 响应服务器确认账户创建成功。实验用相同用户名再次注册观察服务器如何返回重复数据错误——这正是后续「挑战」小节的铺垫。理解 JSON 响应{ user: john_doe, currency: $, description: Personal savings, balance: 100, id: unique_account_id }该响应确认新账户创建成功分配了唯一标识符返回全部账户信息供核对数据已成功入库。对照 api/server.js 可看到服务端真实行为POST /accounts先检查必填参数缺user或currency返回400 Missing parameters再检查用户名是否已存在存在返回409 User already exists随后将 balance 转为数字并组装{ user, currency, description, balance, transactions: [] }存入内存数据库最后以201状态码返回完整账户对象——与文档中的 JSON 示例字段一一对应。现代 JavaScript 表单处理告别页面重载传统表单提交会触发整页重载打断用户体验并丢失应用状态。现代做法是拦截表单提交事件即时反馈、优雅处理错误并依据服务器响应更新界面全程保持用户在应用中的位置。为什么避免页面重载保持应用状态与用户上下文提供即时反馈与加载指示支持动态错误处理与校验创造流畅、类 App 的用户体验允许基于服务器响应的条件逻辑。传统方式会「把用户带离应用、丢失状态、为简单操作整页刷新、反馈控制有限」现代方式则「让用户留在应用内、状态与数据完整保留、实时校验反馈、支持渐进增强与可访问性」。事件驱动的表单处理实现移除action属性改由事件处理接管!-- 移除 action 属性添加事件处理 -- form idregisterForm methodPOST novalidate在app.js中加入注册逻辑// 现代事件驱动表单处理 function register() { const registerForm document.getElementById(registerForm); const formData new FormData(registerForm); const data Object.fromEntries(formData); const jsonData JSON.stringify(data); console.log(Form data prepared:, data); } // 页面加载后挂接事件监听 document.addEventListener(DOMContentLoaded, () { const registerForm document.getElementById(registerForm); registerForm.addEventListener(submit, (event) { event.preventDefault(); // 阻止默认表单提交 register(); }); });用event.preventDefault()阻止默认提交用现代 DOM 选择获取表单元素用FormDataAPI 提取数据用Object.fromEntries()转为普通对象序列化为 JSON 便于与服务器通信打印处理结果便于调试。FormData API 详解// FormData 自动捕获的内容示例 // { // user: john_doe, // currency: $, // description: Personal account, // balance: 100 // }全面收集一次调用捕获文本、文件、复杂输入等全部表单元素类型感知自动处理不同类型输入无需自写编码高效免去手工逐字段收集自适应表单结构演化时仍保持可用。构建服务器通信函数async function createAccount(account) { try { const response await fetch(//localhost:5000/api/accounts, { method: POST, headers: { Content-Type: application/json, Accept: application/json }, body: account }); // 检查响应是否成功 if (!response.ok) { throw new Error(HTTP error! status: ${response.status}); } return await response.json(); } catch (error) { console.error(Account creation failed:, error); return { error: error.message || Network error occurred }; } }该实现的要点async/await让异步代码清晰可读try/catch 做完整错误处理处理数据前先检查响应状态设置 JSON 通信所需的正确请求头提供详细错误消息成功与失败路径返回一致的数据结构失败时返回{ error: ... }。现代 Fetch API 的优势特性收益实现基于 Promise异步代码更干净await fetch()请求可定制完整 HTTP 控制Headers、方法、body响应处理灵活多样数据解析.json()、.text()、.blob()错误处理完备全面捕获异常try/catch 块核心概念async 函数可暂停执行以等待服务器响应await 关键字让异步代码读起来像同步Fetch API提供基于 Promise 的现代 HTTP 请求错误处理确保网络故障时应用平滑降级。安全提示当前数据经 HTTP 明文传输仅适合开发环境。生产环境必须启用 HTTPS 加密传输保护用户数据。完整的生产级注册函数async function register() { const registerForm document.getElementById(registerForm); const submitButton registerForm.querySelector(button[typesubmit]); try { // 显示加载状态 submitButton.disabled true; submitButton.textContent Creating Account...; // 处理表单数据 const formData new FormData(registerForm); const jsonData JSON.stringify(Object.fromEntries(formData)); // 发送到服务器 const result await createAccount(jsonData); if (result.error) { console.error(Registration failed:, result.error); alert(Registration failed: ${result.error}); return; } console.log(Account created successfully!, result); alert(Welcome, ${result.user}! Your account has been created.); // 成功后重置表单 registerForm.reset(); } catch (error) { console.error(Unexpected error:, error); alert(An unexpected error occurred. Please try again.); } finally { // 恢复按钮状态 submitButton.disabled false; submitButton.textContent Create Account; } }增强点提交中提供视觉反馈禁用提交按钮防止重复提交同时优雅处理预期与非预期错误显示用户友好的成功/错误消息成功后重置表单无论结果如何都恢复 UI 状态。测试你的实现打开浏览器控制台F12 → Console 标签填写注册表单点击「Create Account」观察控制台消息与用户反馈。预期可见提交按钮出现加载状态控制台输出处理过程日志创建成功时弹出成功消息表单自动重置。仓库方案 solution/app.js 展示了同思路的工程化落地register()先以form.checkValidity()form.reportValidity()触发 HTML5 原生校验再用Object.fromEntries(new FormData(form))采集数据并对user/currency/description做trim()清洗、对balance做Number()归一调用createAccount后若有错误写入registerError区域而非alert成功则updateState保存账户并路由跳转到/dashboard——错误就地显示 状态驱动的 SPA 切换正是避免页面重载设计目标的直接体现。全面表单验证多层防御体系有效的验证像空间站的多套冗余系统浏览器层即时反馈、JavaScript 层提升体验、服务端层保证安全与数据完整性。验证层级总览HTML5 验证浏览器即时检查JavaScript 验证自定义逻辑与体验优化服务端验证最终的安全与数据完整性把关渐进增强即使禁用 JavaScript 也能工作。HTML5 验证属性属性用途使用示例浏览器行为required必填字段input required阻止空提交minlength/maxlength文本长度限制input maxlength20强制字符数min/max数值范围input min0 max1000校验数值边界pattern自定义正则规则input pattern[A-Za-z]匹配特定格式type数据类型验证input typeemail格式专属校验用 CSS 呈现验证状态/* 合法输入样式 */ input:valid { border-color: #28a745; background-color: #f8fff9; } /* 非法输入样式 */ input:invalid { border-color: #dc3545; background-color: #fff5f5; } /* 焦点态提升可访问性 */ input:focus:valid { box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25); } input:focus:invalid { box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25); }绿边框表示校验通过、红边框提示需修正的错误、焦点高亮提供当前输入位置的视觉上下文、一致的样式建立用户可学习的可预期交互模式。技巧用:valid与:invalid伪类在用户输入过程中即时给出视觉反馈打造响应式、有助益的界面。增强版注册表单完整验证版form idregisterForm methodPOST novalidate div classform-group label foruserUsername span classrequired*/span/label input iduser nameuser typetext required minlength3 maxlength20 pattern[a-zA-Z0-9_] autocompleteusername titleUsername must be 3-20 characters, letters, numbers, and underscores only small classform-textChoose a unique username (3-20 characters)/small /div div classform-group label forcurrencyCurrency span classrequired*/span/label input idcurrency namecurrency typetext required value$ maxlength3 pattern[A-Z$€£¥₹] titleEnter a valid currency symbol or code small classform-textCurrency symbol (e.g., $, €, £)/small /div div classform-group label fordescriptionAccount Description/label input iddescription namedescription typetext maxlength100 placeholderPersonal savings, checking, etc. small classform-textOptional description (up to 100 characters)/small /div div classform-group label forbalanceStarting Balance/label input idbalance namebalance typenumber value0 min0 step0.01 titleEnter a positive number for your starting balance small classform-textInitial account balance (minimum $0.00)/small /div button typesubmitCreate Account/button /form组合使用必填标记与提示文案pattern做格式校验title提供提示气泡与可访问性支持small.form-text辅助文本引导输入语义化 HTML 结构提升可访问性。各字段验证规则详解字段验证规则用户收益用户名required、minlength3、maxlength20、pattern[a-zA-Z0-9_]保证合法、唯一的标识符货币required、maxlength3、pattern[A-Z$€£¥₹]接受常见货币符号余额min0、step0.01、typenumber防止负余额描述maxlength100合理的长度上限注方案 solution/index.html 中 currency 字段的maxlength放宽为5可输入INR或₹说明校验规则应随业务形态货币代码或符号灵活调整后端 api/server.js 还会再次解析并校验 balance 数字性形成前后端双重保险。测试验证行为提交含空必填字段的表单输入少于 3 个字符的用户名在用户名字段尝试特殊字符输入负数余额。观察结果浏览器显示原生验证消息样式随:valid/:invalid变化所有检查通过前无法提交焦点自动移到第一个非法字段。客户端验证 vs 服务端验证客户端验证即时反馈、体验更佳、减轻服务器负载服务端验证保证安全、数据完整性与业务规则两者缺一不可恶意用户可绕过客户端检查服务端验证是安全与数据完整性的底线渐进增强JS 禁用时表单依然可用。️安全提醒永远不要只信任客户端验证恶意用户可以绕过客户端检查因此服务端验证对安全与数据完整性必不可少。对照 api/server.js服务端确实独立执行了全部关键业务校验user/currency必填400、用户名唯一性409、balance必须可转数字400即使前端被绕过非法数据也无法写入。挑战与练习GitHub Copilot Agent 挑战使用 Agent 模式完成以下挑战为注册表单构建完整的客户端验证系统包括——1随输入即时反馈的逐字段验证2显示在每个输入框下方的自定义验证消息3带匹配验证的密码确认字段4视觉指示器合法字段绿色对勾、非法字段红色警告5全部验证通过前保持禁用的提交按钮。要求综合运用 HTML5 验证属性、CSS 验证状态样式与 JavaScript 交互逻辑。基础挑战重复用户名错误提示在 HTML 中显示错误消息当用户已存在时。这正是本课各环节反复铺垫的实战点表单提交后服务器返回409 User already exists见 api/server.js前端捕获该响应后将其渲染进registerError区域。以下是经过一定样式配置后最终登录页的示例效果完整实现可参考 7-bank-project/solution 目录其app.js中login()与register()对错误返回统一走updateElement(loginError|registerError, ...)就地渲染配合rolealert实现符合无障碍标准的错误播报。课后作业完成 样式化银行应用创建styles.css构建包含色彩体系主色/辅色/中性色/成功错误色、字体层级、8px 间距刻度与响应式栅格的设计系统为表单输入、按钮、导航等组件建立统一的视觉规范并满足 WCAG 对比度正文 ≥ 4.5:1、可见焦点指示与 320px–1920px 响应式要求。技能沉淀与学习路线完成本课后你已掌握HTML5 表单语义结构、输入类型、可访问性属性、JavaScript 表单处理事件管理、数据收集、AJAX 通信、验证架构面向安全与体验的多层验证、异步编程现代 Fetch API 与 async/await、错误管理完整错误处理与用户反馈系统、UX 设计加载态、成功消息、错误恢复、渐进增强跨浏览器与设备能力。这些技能可迁移到电商结账/账户注册/支付表单、企业数据录入/报表界面、内容发布后台、金融接口、医疗患者门户、教育选课系统等真实场景。进阶路线建议先通过课后测验巩固表单处理概念实现带实时反馈的完整验证挑战再依次挑战密码确认字段、重复用户名/服务端错误处理、文件上传、带进度指示的多步表单、表单自动保存与恢复最后探索企业级表单组件库与设计系统。相关资源上一课 HTML 模板路由 · 后端接口文档 api/README.md · 完整源码 solution/index.html 与 solution/app.js · 后端实现 api/server.js · 本课作业 assignment.md【免费下载链接】Web-Dev-For-Beginners24 Lessons, 12 Weeks, Get Started as a Web Developer项目地址: https://gitcode.com/GitHub_Trending/we/Web-Dev-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门