JS实现原生注册表单,滑块验证,短信验证码

 目录

一、编辑表单询盘结构

        1、确定注册接口所需参数

        2、编写表单HTML结构

二、编写style样式

        1、非表单元素样式

三、引入阿里云滑块验证

        1、引入阿里短信接口CDN

        2、实例化nc对象

四、调用短信验证码接口

        1、给获取按钮绑定点击事件

        2、测试短信验证码获取

五、调用注册接口

        1、引入jQuery

        2、设置防抖节流

        3、表单数据获取

        4、验证密码是否相同

        5、验证是否通过

        6、调用注册接口

六、小结


原生JS实现注册表单,滑块验证,短信验证码等。

一、编辑表单询盘结构

        1、确定注册接口所需参数

                本文中案例注册接口所需参数有:

参数key
电话(companyTelephone)companyTelephone
短信(smsCode)smsCode
密码(pwd)pwd
姓名(contactPerson)contactPerson
公司名称(companyName)companyName
邮箱(companyEmail)companyEmail
_appId(_appId)_appId

        2、编写表单HTML结构

                需要注意的是,如果在wordpress中使用这种自定义组件的询盘表单,使用css样式表的  方法添加样式可能会出现优先级不够从而导致与默认表单样式冲突的问题,在页面中部分样式会显示不全出现乱版,所以我此处将部分样式编写到了标签内用以提升样式优先级,避免被默认表单样式冲突掉。

                在对应的元素上添加了对应的id、name、class属性,以方便后面获取表单数据。

<!-- 表单 -->
<form id="rForm" style="width:500px;box-shadow: 0 10px 20px 10px #d8d7d7; padding: 25px 0;margin: 50px auto;border-radius: 20px;"><div class="row" style="text-align: center;margin-bottom: 10px;display: flex;align-items: center;justify-content: center;"><div class="phone-header" style="width: 10%;height: 45px;background-color: #f9f9f9;border-top-left-radius: 20px;border-bottom-left-radius: 20px;line-height: 45px;border-right: 2px solid #ffffff;color: #858A96;font-size: 16px">+86</div><input type="text" id="phone" name="companyTelephone" required class="customizeInquiry" placeholder="请输入您的手机号码(必填)" style="width: 50%;height: 45px;border-radius: 20px;border-top-left-radius: 0px;border-bottom-left-radius: 0px;background-color: #f9f9f9;text-indent: 2em;border: none;"></div><!-- 验证码滑块 --><div id="nc" style="position: relative;width: 60%;margin: 20px auto;"></div><div class="row" style="text-align: center;margin-bottom: 10px;display: flex;align-items: center;justify-content: center;"><input type="text" id="yzm" name="smsCode" required class="customizeInquiry" placeholder="短信验证码" style="width: 40%;height: 45px;border-radius: 20px;border-top-right-radius: 0px;border-bottom-right-radius: 0px;background-color: #f9f9f9;text-indent: 2em;border: none;"><div class="getyzm" style="width: 20%;height: 45px;background-color: #f9f9f9;border-top-right-radius: 20px;border-bottom-right-radius: 20px;line-height: 45px;border-left: 2px solid #ffffff;transition: all 0.3s;cursor: pointer;margin-left: 1px;font-size: 16px;color:#858A96">获取验证码</div></div><div class="row" style="text-align: center;margin-bottom: 10px;"><input type="text" id="password" name="pwd" required class="customizeInquiry" placeholder="设置登录密码" style="width: 60%;height: 45px;background-color: #f9f9f9;text-indent: 2em;border-radius: 20px;border: none;"></div><div class="row" style="text-align: center;margin-bottom: 10px;"><input type="text" id="repassword" name="repassword" required  placeholder="请再次输入登录密码" style="width: 60%;height: 45px;background-color: #f9f9f9;text-indent: 2em;border-radius: 20px;border: none;"></div><div class="row" style="text-align: center;margin-bottom: 10px;"><input type="text" id="name" name="contactPerson" required class="customizeInquiry" placeholder="请输入您的姓名" style="width: 60%;height: 45px;background-color: #f9f9f9;text-indent: 2em;border-radius: 20px;border: none;"></div><div class="row" style="text-align: center;margin-bottom: 10px;"><input type="text" id="company" name="companyName" required class="customizeInquiry" placeholder="请输入您的公司名称(必填)" style="width: 60%;height: 45px;background-color: #f9f9f9;text-indent: 2em;border-radius: 20px;border: none;"></div><div class="row" style="text-align: center;margin-bottom: 10px;"><input type="text" id="email" name="companyEmail" required class="customizeInquiry" placeholder="请输入您的邮箱(必填)" style="width: 60%;height: 45px;background-color: #f9f9f9;text-indent: 2em;border-radius: 20px;border: none;"></div><div class="tijiao" style="text-align: center;padding-top: 10px;"><input value="立即注册" id="customizeInquiryBtn" style="width: 60%;height: 45px;background-color: #ff7602;text-indent: 0;border-radius: 20px;border: none;color: #ffffff;cursor: pointer;transition: all 0.5s;text-align: center;"></div><div class="login" style="text-align: center;padding-top: 10px;font-size: 16px;">已有账号?<a href="/login" style="text-decoration: none;color:#ff7602;">立即登录</a></div>
<div class="back" style="text-align: center;font-size: 16px;">了解服务详情?<a href="/index" style="text-decoration: none;color:#4095e5;">返回官网</a></div>
</form>

二、编写style样式

        1、非表单元素样式

                这里写的是表单中非input等元素的自定义块样式,例如短信验证码获取按钮,激活后样式,电话头部等样式。

 /* 询盘 */#rform{padding: 25px 0;margin: 0;}#rform .row {text-align: center;margin-bottom: 10px;}.phone-header{width: 10%;height: 45px;background-color: #f9f9f9;border-top-left-radius: 20px;border-bottom-left-radius: 20px;line-height: 45px;border-right: 2px solid #ffffff;}.getyzm{width: 20%;height: 45px;background-color: #f9f9f9;border-top-right-radius: 20px;border-bottom-right-radius: 20px;line-height: 45px;border-left: 2px solid #ffffff;transition: all 0.3s;cursor: pointer;margin-left: 1px;pointer-events: none;cursor: default;}.getyzmok{color: #000000 !important;pointer-events: visible;}.getyzm:hover{background-color: #ff7602 !important;color: #ffffff !important;font-size: 16px;}#rform input {width: 60%;height: 45px;border-radius: 20px;border: none;background-color: #f9f9f9;text-indent: 2em;}#rform input:focus{outline: 1px solid #ff7602;}#rform .tijiao{text-align: center;padding-top: 10px;}#rform .tijiao input{text-indent: 0;background-color: #ff7602;cursor: pointer;color: #ffffff;transition: all 0.5s;}#rform .tijiao input:hover{background-color: #ff7602c4;}@media screen and (max-width:768px) {.getyzm{font-size: 12px !important;}}

        完成HTML和CSS后的页面样式预览: 

三、引入阿里云滑块验证

         参考文档:如何集成滑动验证的前端页面代码_验证码(Captcha)-阿里云帮助中心

        1、引入阿里短信接口CDN

<script src="https://g.alicdn.com/AWSC/AWSC/awsc.js"></script>

        2、实例化nc对象

                在实例化nc之前先声明几个后面调用短信验证码接口时会用到的变量,参数在滑块验证成功后会返回,并将返回的参数放到对应的声明变量中,同时给获取验证码按钮添加激活类,回复按钮可点击状态,本例中短信接口所需参数为:

参数key
手机号

phoneNumber

会话ID

sessionId
类型type

签名串

sig

请求唯一标识

token

        实例化中nc的对应appkey需要在阿里云后台控制台获取,请输入对应的参数,否则会验证失败。 

        let phoneNumberV = '';let sessionIdV = '';let sigV = '';let tokenV = '';let ncInstance;// 实例化ncAWSC.use("nc", function (state, module) {// 初始化ncInstance = module.init({// 应用类型标识。它和使用场景标识(scene字段)一起决定了滑动验证的业务场景与后端对应使用的策略模型。您可以在阿里云验证码控制台的配置管理页签找到对应的appkey字段值,请务必正确填写。appkey: "XXXXXXXXXXXXXXXXXXXX",//使用场景标识。它和应用类型标识(appkey字段)一起决定了滑动验证的业务场景与后端对应使用的策略模型。您可以在阿里云验证码控制台的配置管理页签找到对应的scene值,请务必正确填写。scene: "nc_register",// 声明滑动验证需要渲染的目标ID。renderTo: "nc",//前端滑动验证通过时会触发该回调参数。您可以在该回调参数中将会话ID(sessionId)、签名串(sig)、请求唯一标识(token)字段记录下来,随业务请求一同发送至您的服务端调用验签。success: function (data) {phoneNumberV = document.getElementById('phone').value; // 获取手机号sessionIdV = data.sessionId;tokenV = data.token;sigV = data.sig;const getyzmbtn = document.querySelector('.getyzm');getyzmbtn.classList.add('getyzmok');},// 滑动验证失败时触发该回调参数。fail: function (failCode) {window.console && console.log(failCode)},// 验证码加载出现异常时触发该回调参数。error: function (errorCode) {window.console && console.log(errorCode)}});});

         滑块验证成功反馈:

四、调用短信验证码接口

        短信验证码流程图(图源阿里云),不过我们这里最后拿到验证码后调用的是注册接口,原理相通。

        1、给获取按钮绑定点击事件

                给获取验证码按钮绑定点击事件,点击后移除按钮的激活类,恢复到不可点击状态,判断滑块验证是否成功,如果是已经成功的重置滑块状态。创建FormData对象,将上面滑块验证成功后回调给的对应参数添加到对象中用以调用短信接口。

    document.addEventListener('DOMContentLoaded', function() {// 点击获取验证码按钮document.querySelector('.getyzm').addEventListener('click', function() {const getyzmbtn = document.querySelector('.getyzm');getyzmbtn.classList.remove('getyzmok');if (ncInstance) {ncInstance.reset(); // 触发滑块验证}// 创建 FormData 对象const formData = new FormData();formData.append('mobile', phoneNumberV);formData.append('type', 1);formData.append('sessionId', sessionIdV);formData.append('sig', sigV);formData.append('token', tokenV);// 发送 POST 请求到指定接口fetch('https://example.net/send', { method: 'POST',body:formData}).then(response => response.json()).then(data => {console.log('Response:', data);alert(data.message)}).catch(error => {console.error('Error:', error);alert(error.message)});});})

        2、测试短信验证码获取

                因为这里我的手机号已经注册过了,所以接口返回已被注册,同时也说明接口获取的滑块回调参数是正确的,接口正常调用了。如果是未注册的手机号,这里应该会弹出success发送成功,同时手机上收到短信验证码smsCode

五、调用注册接口

        1、引入jQuery

                引入jQuery,方便获取表单中的各项数据和发起请求。

<script src="https://cdn.staticfile.net/jquery/1.10.2/jquery.min.js"></script>

        2、设置防抖节流

                设置变量isSubmitting 判断是否提交,如果为true则是已经提交,提示请勿重复提交,如果为false可以继续执行。

    $(document).ready(function() {let isSubmitting = false; // Track submission state$('#customizeInquiryBtn').on('click', function(event) {event.preventDefault(); // 防止表单的默认提交行为// Check if already submittingif (isSubmitting) {alert('请勿重复提交');return;}isSubmitting = true;)}
)}

        3、表单数据获取

                定义变量isValid判断是否符合提交规则,使用jQuery根据class获取表单中各项数据放入inputs,定义变量enquiryContent存放表单数据,定义agreementCheckbox判断是否勾选复选框(如果有的话,本例中没有该选项,但不影响),对inputs进行遍历查看是否为空,对于非空的数据存储在enquiryContent中,当有空的选项时进行提示,当遍历完成后切都不为空时拿到所有选项数据并存储在enquiryContent中,此时isValidtrue,否则isValidfalse

    $(document).ready(function() {let isSubmitting = false; // Track submission state$('#customizeInquiryBtn').on('click', function(event) {event.preventDefault(); // 防止表单的默认提交行为// Check if already submittingif (isSubmitting) {alert('请勿重复提交');return;}isSubmitting = true; // Set to true to prevent further submissions// 获取非hidden的输入框的数据let isValid = true;const inputs = $('.customizeInquiry');const enquiryContent = {};// 通过ID获取checkbox元素  var agreementCheckbox = document.getElementById('agreement');  // 循环查看是否表单为空inputs.each(function() {const value = $(this).val();const name = $(this).attr('name'); // console.log($(this).context.id);if ($(this).attr('type') === 'checkbox') {// 处理checkboxif ($(this).is(':checked')) {if (!enquiryContent[name]) {enquiryContent[name] = [];}enquiryContent[name].push($(this).attr('id'));}} else {if (!value) {$(this).siblings('.empty-tip').show();isValid = false;} else {$(this).siblings('.empty-tip').hide();enquiryContent[name] = value;}}});});});

        4、验证密码是否相同

                使用jQuery根据id拿到输入框中的密码和重复密码的value值,进行判断是否相同,不同则isValid返回false,并进行提示。

    $(document).ready(function() {let isSubmitting = false; // Track submission state$('#customizeInquiryBtn').on('click', function(event) {event.preventDefault(); // 防止表单的默认提交行为// Check if already submittingif (isSubmitting) {alert('请勿重复提交');return;}isSubmitting = true; // Set to true to prevent further submissions// 获取非hidden的输入框的数据let isValid = true;const inputs = $('.customizeInquiry');const enquiryContent = {};// 通过ID获取checkbox元素  var agreementCheckbox = document.getElementById('agreement');  // 循环查看是否表单为空inputs.each(function() {const value = $(this).val();const name = $(this).attr('name'); // console.log($(this).context.id);if ($(this).attr('type') === 'checkbox') {// 处理checkboxif ($(this).is(':checked')) {if (!enquiryContent[name]) {enquiryContent[name] = [];}enquiryContent[name].push($(this).attr('id'));}} else {if (!value) {$(this).siblings('.empty-tip').show();isValid = false;} else {$(this).siblings('.empty-tip').hide();enquiryContent[name] = value;}}});// 检查密码和确认密码是否匹配const password = $('#password').val();const repassword = $('#repassword').val();if (password !== repassword) {alert('密码和确认密码不相同,请确认密码一致!');isValid = false;}});});

        5、验证是否通过

                验证isValid的值,为true则进行表单数据处理,否则提示错误。

    $(document).ready(function() {let isSubmitting = false; // Track submission state$('#customizeInquiryBtn').on('click', function(event) {event.preventDefault(); // 防止表单的默认提交行为// Check if already submittingif (isSubmitting) {alert('请勿重复提交');return;}isSubmitting = true; // Set to true to prevent further submissions// 获取非hidden的输入框的数据let isValid = true;const inputs = $('.customizeInquiry');const enquiryContent = {};// 通过ID获取checkbox元素  var agreementCheckbox = document.getElementById('agreement');  // 循环查看是否表单为空inputs.each(function() {const value = $(this).val();const name = $(this).attr('name'); // console.log($(this).context.id);if ($(this).attr('type') === 'checkbox') {// 处理checkboxif ($(this).is(':checked')) {if (!enquiryContent[name]) {enquiryContent[name] = [];}enquiryContent[name].push($(this).attr('id'));}} else {if (!value) {$(this).siblings('.empty-tip').show();isValid = false;} else {$(this).siblings('.empty-tip').hide();enquiryContent[name] = value;}}});// 检查密码和确认密码是否匹配const password = $('#password').val();const repassword = $('#repassword').val();if (password !== repassword) {alert('密码和确认密码不相同,请确认密码一致!');isValid = false;}// 验证是否通过if (isValid) {//  console.log(enquiryContent)// 对表单结果进行处理// console.log(JSON.stringify(enquiryContent));} else {alert("请完善表单!")}});});

        6、调用注册接口

                当isValidtrue时,对表单数据进行处理,创建DormData对象,将表单中的值赋值给对应参数,最终拿到formData2,调用注册接口携带formData2参数发起POST请求,请求成功后设置定时器0.1秒后跳转登录地址,并设置定时器在3秒后重置isSubmitting参数为false,控制在发起请求3秒内不能再次提交请求。

    $(document).ready(function() {let isSubmitting = false; // Track submission state$('#customizeInquiryBtn').on('click', function(event) {event.preventDefault(); // 防止表单的默认提交行为// Check if already submittingif (isSubmitting) {alert('请勿重复提交');return;}isSubmitting = true; // Set to true to prevent further submissions// 获取非hidden的输入框的数据let isValid = true;const inputs = $('.customizeInquiry');const enquiryContent = {};// 通过ID获取checkbox元素  var agreementCheckbox = document.getElementById('agreement');  // 循环查看是否表单为空inputs.each(function() {const value = $(this).val();const name = $(this).attr('name'); // console.log($(this).context.id);if ($(this).attr('type') === 'checkbox') {// 处理checkboxif ($(this).is(':checked')) {if (!enquiryContent[name]) {enquiryContent[name] = [];}enquiryContent[name].push($(this).attr('id'));}} else {if (!value) {$(this).siblings('.empty-tip').show();isValid = false;} else {$(this).siblings('.empty-tip').hide();enquiryContent[name] = value;}}});// 检查密码和确认密码是否匹配const password = $('#password').val();const repassword = $('#repassword').val();if (password !== repassword) {alert('密码和确认密码不相同,请确认密码一致!');isValid = false;}// 验证是否通过if (isValid) {//  console.log(enquiryContent.companyTelephone)// 对表单结果进行处理// console.log(JSON.stringify(enquiryContent));// 创建 FormData 对象const formData2 = new FormData();formData2.append('companyTelephone', enquiryContent.companyTelephone);formData2.append('smsCode', enquiryContent.smsCode);formData2.append('pwd', enquiryContent.pwd);formData2.append('contactPerson', enquiryContent.contactPerson);formData2.append('companyName', enquiryContent.companyName);formData2.append('companyEmail', enquiryContent.companyEmail);formData2.append('_appId', 8);// 发送 POST 请求到指定接口fetch('https://example.net/register', { method: 'POST',body:formData2}).then(response => response.json()).then(data => {console.log('Response:', data);alert(data.message);if(data.message == 'success'){// alert('注册成功!');window._agl && window._agl.push(['track', ['success', {t: 3}]])setTimeout(function(){window.location.href = '/login';},100)}}).catch(error => {console.error('Error:', error);alert(error.message)}).finally(() => {// Reset isSubmitting after 3 secondssetTimeout(() => {isSubmitting = false;}, 3000);});} else {alert("请完善表单!")}});});

六、小结

        注意替换接口地址为真实接口地址。

        在一些时候可能会用到注册渠道追踪,可以在isValid验证通过后添加参数source(根据后端接口情况,此处默认source)提交给接口。先获取当前页面地址参数queryParamsValue,再通过get方法获取参数数据(可以是多个,一起拼接为一个参数就行,此处举例使用了两个参数,sourcekeyword),并将参数source添加入formData2一并发送给注册接口,从而在后端接收注册渠道信息。

// 获取页面来源
const queryParamsValue = new URLSearchParams(window.location.search);
const sourceValue= queryParamsValue.get('source'); 
const keywordValue = queryParamsValue.get('keyword'); 
const source = ('注册来源是:' + sourceValue + ',关键词是:' + keywordValue)

 示例:

当前注册页面地址:https://example.net/register?source=baidu&keyword=凉风听雪

获取注册渠道来源source

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/4088.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

matlab 质心重合法实现点云配准

目录 一、算法原理1、原理概述2、参考文献二、代码实现三、结果展示1、初始位置2、配准结果本文由CSDN点云侠原创,原文链接,首发于:2024年11月5日。 一、算法原理 1、原理概述 质心重合法是将源点云 P P P

YOLOv8实战人脸口罩识别

本文采用YOLOv8作为核心算法框架&#xff0c;结合PyQt5构建用户界面&#xff0c;使用Python3进行开发。YOLOv8以其高效的实时检测能力&#xff0c;在多个目标检测任务中展现出卓越性能。本研究针对人脸口罩数据集进行训练和优化&#xff0c;该数据集包含丰富的人脸口罩图像样本…

科研绘图系列:R语言两侧柱状图(Grouped Bar Chart)

文章目录 介绍加载R包数据画图1画图2组合图形系统信息介绍 两侧柱状图(也称为双柱状图或并列柱状图)是一种数据可视化图表,它通过在坐标轴的两侧绘制两组或多组柱状图来展示不同类别或组别的数据对比。这种图表特别适用于比较两个或多个数据系列之间的差异。以下是两侧柱状…

获取订单物流信息:追踪包裹的“侦探游戏”

在电商的世界里&#xff0c;顾客下单之后&#xff0c;最让人心急如焚的莫过于等待包裹的到来。想象一下&#xff0c;如果你是一名侦探&#xff0c;而你的任务是追踪那些神秘的包裹&#xff0c;那么获取订单物流信息的API就是你的侦探工具。今天&#xff0c;我们就来聊聊如何使用…

Kinematic-ICP开源:优化激光雷达与轮式里程计融合

文章目录 摘要一、介绍二、相关工作三、使用点对点ICP的激光雷达里程计四. 在ICP中引入运动学约束五. 实验评估A. 实验设置B. 大型室内仓库的定性结果C. 定量结果D. 消融实验 摘要 代码&#xff1a;github 原文&#xff1a;原文 摘要—LiDAR里程计对许多机器人应用至关重要&am…

最新Ubuntu超详细安装教程(附镜像包)

一、镜像下载&#xff1a; 官方正版VMware下载&#xff1a;https://pan.baidu.com/s/1yC610SU1-O9Jtk7nUrZuSA?pwdsKByvm17pro安装教程文档&#xff08;必看&#xff09;.txt 这个一定要下载下来看一下&#xff01;&#xff01;&#xff01; Ubuntu镜像下载&#xff1a;http…

归并排序算法

1、基本思想 归并排序是建立在归并操作上的一种有效的排序算法&#xff0c;它采用分治法的策略。其基本思想是将一个待排序的数组分成两个或多个子数组&#xff0c;先对每个子数组进行排序&#xff0c;然后再将已排序的子数组合并成一个最终的排序数组。 对于两个有序的数组&am…

记录解决vscode 登录leetcode中遇到的问题

1. 安装完 leetcode 点击sign in to leetcode 点击打开网站登录leetcode&#xff0c;发现网页无法打开。 解决办法&#xff1a;将leetcode.cn.js文件中的leetcode-cn.com路径都改成leetcode.cn 2. 继续点击 sign in to leetcode &#xff0c;选择使用账号登录&#xff0c;始…

机器人助力Bridge Champ游戏:1.4.2版本如何提升玩家体验

在Bridge Champ游戏中&#xff0c;机器人扮演着桥牌游戏的“无名英雄”角色&#xff0c;默默地提升玩家体验。凭借智能化的设计&#xff0c;这些机器人不仅能够陪练&#xff0c;也大大提升了比赛的流畅度与趣味性。 Bridge Champ是什么 Bridge Champ是一个基于Ignis公链的在线…

服装品牌零售业态融合中的创新发展:以开源 AI 智能名片 S2B2C 商城小程序为视角

摘要&#xff1a;本文以服装品牌零售业态融合为背景&#xff0c;探讨信息流优化和资金流创新的重要作用&#xff0c;并结合开源 AI 智能名片 S2B2C 商城小程序&#xff0c;分析其如何进一步推动服装品牌在零售领域的发展&#xff0c;提高运营效率和用户体验&#xff0c;实现商业…

redis:set集合命令,内部编码,使用场景

个人主页 &#xff1a; 个人主页 个人专栏 &#xff1a; 《数据结构》 《C语言》《C》《Linux》《网络》 《redis学习笔记》 文章目录 前言命令SADDSMEMBERSSISMEMBERSCARDSPOPSMOVESREM集合间操作SINTERSINTERSTORESUNIONSUNIONSTORESDIFFSDIFFSTORE 内部编码使用场景总结 前言…

ssm052游戏攻略网站的设计与实现+vue(论文+源码)-kaic

毕 业 设 计&#xff08;论 文&#xff09; 题目&#xff1a;游戏攻略网站设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本游戏攻略网站就是在这…

Java基础-JDBC

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 一、JDBC简介 1.1 什么是JDBC 1.2 JDBC的作用 1.3 JDBC的架构 二、JDBC核心接口与类 2.1 DriverManag…

好好看 3.2.3 | 纯净无广告的四端追剧软件,高清秒播

好好看是一款全新的追剧软件&#xff0c;与网飞猫同一系列&#xff0c;纯净无广告&#xff0c;支持安卓、iOS、TV和PC四端。汇集了Netflix、电影、短剧、剧集、动漫、综艺等资源&#xff0c;并且各大平台资源同步更新。内置多条超清、蓝光、优质等线路&#xff0c;支持投屏、影…

Python爬虫如何处理验证码与登录

Python爬虫如何处理验证码与登录 Python 爬虫在抓取需要登录的网站数据时&#xff0c;通常会遇到两个主要问题&#xff1a;登录验证和验证码处理。这些机制是网站用来防止自动化程序过度抓取数据的主要手段。本文将详细讲解如何使用 Python 处理登录与验证码&#xff0c;以便进…

分布式光伏电站管理的有效措施

分布式光伏电站是一种将太阳能转化为电能的系统&#xff0c;其特点是“自发自用&#xff0c;余电上网”&#xff0c;也就是说&#xff0c;白天利用太阳能进行发电&#xff0c;晚上利用电网进行互补。这种电站建设周期短&#xff0c;见效快&#xff0c;适合于有闲置屋顶或空地的…

濮良贵《机械设计》第十版课后习题答案全解PDF电子版

《机械设计》(第十版)是“十二五”普通高等教育本科国家级规划教材&#xff0c; 是在《机械设计》(第九版)的基础上修订而成的。本次修订主要做了以下几项工作&#xff1a; 1. 内容的适当更新——自本书第九版出版以来&#xff0c; 机械工程及相关领域的新理论、新技术和新标准…

python之正则表达式总结

正则表达式 对于正则表达式的学习&#xff0c;我整理了网上的一些资料&#xff0c;希望可以帮助到各位&#xff01;&#xff01;&#xff01; 我们可以使用正则表达式来定义字符串的匹配模式&#xff0c;即如何检查一个字符串是否有跟某种模式匹配的部分或者从一个字符串中将与…

算法专题:字符串

目录 1. 最长公共前缀 1.1 算法原理 1.2 算法代码 2. 最长回文子串 2.1 算法原理 2.2 算法代码 3. 二进制求和 3.1 算法原理 3.2 算法代码 4. 字符串相乘 4.1 算法原理 4.2 算法代码 1. 最长公共前缀 . - 力扣&#xff08;LeetCode&#xff09; 1.1 算法原理 有以…

[Unity Demo]从零开始制作空洞骑士Hollow Knight第十八集补充:制作空洞骑士独有的EventSystem和InputModule

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、制作空洞骑士独有的EventSystem和InputModule总结 前言 hello大家好久没见&#xff0c;之所以隔了这么久才更新并不是因为我又放弃了这个项目&#xff0c;而…