实现注册手机号用户
1、使用Post异步发送请求(发送短信),离焦事件触发时判断
<script src="layer/layer.js"></script><!--离焦事件--><script type="text/javascript" th:inline="javascript">$("#username").blur(function(){//判断用户名谁否符合手机号的格式,正则if(/^1([358][0-9]|4[579]|66|7[0135678]|9[89])[0-9]{8}$/.test($("#username").val())){//如果符合,发短信,$.post (ajax)var telephone = $("#username").val()$.post(//url 给/sendSMS权限放行[[@{~/sendSMS}]],//参数{"telephone":telephone},//回调函数function(data){alert("success")},//数据格式"json")}else{//不符合,给出提示信息layer.msg("手机号格式有误!!")}})$("#repassword").blur(function(){alert("repassword")})$("#SMS").blur(function(){alert("SMS")})</script>
package com.zzz.blog.controller;import ...@Controller
public class VisitorController {//ajax@RequestMapping("/sendSMS")@ResponseBody public String sendSMS(String telephone) {//给手机号发信息System.out.println(telephone);return "";}}
2、发送手机验证码(使用腾讯云短信服务,注册方法搜索之前文章)
复制qcloudsms-1.0.5.jar到工程bin文件夹下,并build path一下。
修改sendSMS方法
//ajax 给手机号发信息@RequestMapping("/sendSMS")@ResponseBody public String sendSMS(String telephone,HttpSession session) {//appid appkeyint appid = xxx;String appkey = "xxx";//短信模板idint templateId = xxx;//签名的名字String smsSign = "玄尺软件编程公众号";//给谁发String phoneNumber = telephone;//验证码String[] params = new String[1];Random r = new Random();String code = "";for(int i=0;i<4;i++) {code += r.nextInt(10);}//放入session域中session.setAttribute("SMS", code);params[0] = code;SmsSingleSender sender = new SmsSingleSender(appid, appkey);//地区、电话、模板id、验证码、签名SmsSingleSenderResult result;try {result = sender.sendWithParam("86", phoneNumber, templateId, params, smsSign, "", "");System.out.println(result);} catch (HTTPException | JSONException | IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}return "";}
3、判断手机号是否已存在
@Controller
public class VisitorController {@Autowiredprivate VisitorService visitorService;//ajax 给手机号发信息@RequestMapping("/sendSMS")@ResponseBody public String sendSMS(String telephone,HttpSession session) {//判断数据库是否存在该手机号//存在,不发送短信String json = null;if (visitorService.findVisitorByUsername(telephone) != null) {json = "{\"message\":"+false+"}";} //不存在,发送短信else {json = "{\"message\":"+true+"}";SMS(telephone, session);}return json;}public void SMS(String telephone,HttpSession session) {//appid appkeyint appid = xxx;String appkey = "xxx";//短信模板idint templateId = xxx;//签名的名字String smsSign = "玄尺软件编程公众号";//给谁发String phoneNumber = telephone;//验证码String[] params = new String[1];Random r = new Random();String code = "";for(int i=0;i<4;i++) {code += r.nextInt(10);}//放入session域中session.setAttribute("SMS", code);params[0] = code;SmsSingleSender sender = new SmsSingleSender(appid, appkey);//地区、电话、模板id、验证码、签名SmsSingleSenderResult result;try {result = sender.sendWithParam("86", phoneNumber, templateId, params, smsSign, "", "");System.out.println(result);} catch (HTTPException | JSONException | IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}
package com.zzz.blog.service;import ...
@Service
public interface VisitorService {Visitor saveVisitory(Visitor visitor);Visitor findVisitorByUsername(String telephone);}
package com.zzz.blog.service;import ...@Component
public class VisitorServiceImpl implements VisitorService{@Autowiredprivate VisitorRepository visitorRepository;@Overridepublic Visitor saveVisitory(Visitor visitor) {return visitorRepository.save(visitor);}@Overridepublic Visitor findVisitorByUsername(String telephone) {return visitorRepository.findVisitorByUsername(telephone);}}
package com.zzz.blog.repository;import ...public interface VisitorRepository extends CrudRepository<Visitor, Long>{@Query(value = "select * from visitor where username = ?1",nativeQuery = true)Visitor findVisitorByUsername(String telephone);}
<script type="text/javascript" th:inline="javascript">$("#errorMessage").hide();...//回调函数function(data){if(data.message){$("#errorMessage").hide();layer.msg("手机验证码已发送,请注意查收!!")}else{$("#errorMessage").show(); //在前面先调用先隐藏错误信息$("#errorMessage").html("该手机号已经被注册!!");}},...
4、测试发送短信以及用户名是否重复
测试发送短信成功以后,把验证码发送代码注释掉(因为发送短信需要收费)
System.out.println(code);// SmsSingleSender sender = new SmsSingleSender(appid, appkey);
// //地区、电话、模板id、验证码、签名
// SmsSingleSenderResult result;
// try {
// result = sender.sendWithParam("86", phoneNumber, templateId, params, smsSign, "", "");
// System.out.println(result);
// } catch (HTTPException | JSONException | IOException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
在visitor表中插入一条手机号用户数据,测试用户重复情况下的提示信息,测试通过。
5、判断两次密码是否一致
$("#repassword").blur(function(){//判断两次密码是否一致if($("#password").val() != $("#repassword").val()){$("#errorMessage").show();$("#errorMessage").html("两次密码输入不一致!!");}else{$("#errorMessage").hide();}})
6、测试判断手机验证码的正确性
$("#SMS").blur(function(){var sms = $("#SMS").val();$.post(//url 在securityconfig中给权限放行[[@{~/judgeSMS}]],//传参{"smsCode":sms},//回调参数function(data){if(data.message){$("#errorMessage").hide();layer.msg("验证码正确!!")}else{$("#errorMessage").show();$("#errorMessage").html("验证码错误!!");}},//数据格式"json")})
//在VisitorController中添加判断方法@RequestMapping("/judgeSMS")@ResponseBodypublic String judgeSMS(String smsCode,HttpSession session) {String codeInSession = (String)session.getAttribute("SMS");String json = null;if (smsCode.equals(codeInSession)) {json = "{\"message\":"+true+"}";} else {json = "{\"message\":"+false+"}";}return json;}
7、防止皮的用户注册提交错误的表单
...
<form id="visitorRegisterForm" th:action="@{~/registerVisitor}" class="login100-form validate-form">
...
<button onclick="submitButton()" type="button" class="login100-form-btn">注 册</button>
...<!--离焦事件--><script type="text/javascript" th:inline="javascript">$("#errorMessage").hide();var isOkUsername,isOkPassword,isOkSMS; //在每个离焦事件中第一句赋初值为false,在判断正确的逻辑里改值为true...function submitButton(){//防止皮的用户在输入有错误内容的时候注册if(isOkUsername==false){$("#errorMessage").show();$("#errorMessage").html("用户名重复或格式错误!!");}else if(isOkPassword==false){$("#errorMessage").show();$("#errorMessage").html("两次密码输入不一致!!");}else if(isOkSMS==false){$("#errorMessage").show();$("#errorMessage").html("验证码错误!!");}else{$("#visitorRegisterForm").submit()}} </script>
...
8、完成注册功能
@RequestMapping("/registerVisitor") //权限放行public String registerVisitor(Visitor visitor) {Random r = new Random();int random = r.nextInt(8) + 1;visitor.setImage("/images/1-"+random+".jpg");visitorService.saveVisitory(visitor);return "redirect:/visitorLogin";}
测试:输入内容,点击注册按钮,数据库中正确添加数据即可。
相关文章:
实现注册手机号用户
1、使用Post异步发送请求(发送短信),离焦事件触发时判断 <script src"layer/layer.js"></script><!--离焦事件--><script type"text/javascript" th:inline"javascript">$("#use…...
【2023年11月第四版教材】第15章《风险管理》(第三部分)
第15章《风险管理》(第三部分) 5 过程1-规划风险管理6 过程2-识别风险6.1 识别风险★★★6.2 数据收集★★★6.3 数据分析★★★ 7 过程3-实施定性风险分析7.1 实施定性风险分析7.2 数据分析★★★7.3 数据表现★★★7.4 项目文件(更新&#…...
datart导入hive连接包
datart读取hive数据时,需要先在datart的lib目录下导入hive jdbc相关的包,这里面有几个坑记录下: 1.和springboot中commons-lang3冲突 2.hive中带的jetty和springboot冲突 3.hive jdbc的包的版本号一定要小于登录hive服务端的版本ÿ…...
2023美团秋招一面面经-已过
批处理批处理一个sql下的若干条sql,如何提高速度,如果要分片的话如何分片 1.使用数据库的批处理功能来执行多个 SQL 语句。这可以减少每个 SQL 语句的通信开销。JDBC 中的 addBatch() 和 executeBatch() 方法可以用来执行批处理操作。 在程序开始时候设…...
ARM Day2
目录 实现1-100的累加 思维导图 实现1-100的累加 .text .globl _start _start:mov r1,#0x64mov r2,#0x1mov r4,#0x1 going:cmp r1,r4bcc endleaddcs r3,r3,r4add r4,r4,r2b going endle:stop:b stop .end思维导图...
手把手教你制作独特优惠促销微传单
您是否曾经想要为自己的业务或活动制作一张吸引人的微传单?以下是一份简单易懂的微传单制作教程,帮助您在短短四步内打造出精美的宣传海报。 1. 登录乔拓云,点击【微传单】 首先,打开乔拓云网站并点击【微传单】选项。您将进入一个…...
Qt-QImage-convertTo-copy-convertToFormat-格式转换
文章目录 1.copy2.convertToFormat3.QPainter4.总结 1.copy 深度复制图像格式数据,可以指定区域。 QImage copy(const QRect &rect QRect()) const;inline QImage copy(int x, int y, int w, int h) const{ return copy(QRect(x, y, w, h)); }2.convertToForm…...
asp.net core automapper的使用
1.安装automapper的nuget包 AutoMapper.Extensions.Microsoft.DependencyInjection 2.创建需要映射的类和转换后的类 public class studto{public int sn { get; set; }public string name { get; set; }public string sex { get; set; }public int age { get; set; }public s…...
自学WEB后端03-Node.js 语法
学习后端路线: JavaScript 基础语法 Node,js 内置 API 模块 (fs、 path、 http等) 第三方 API 模块 (express、mysql等) 今天主要回顾下Node.js 语法 Node.js 是基于 Chrome V8 引擎的 JavaScript 运行环境,它提供了一种能够在服务器端运行 JavaScr…...
对象数组合并和去重
数组去重: 普通字符串/数字数组去重: 1. 利用Set的特性 > new Set(arr) 2. for遍历, indexOf判断是否存在 3. 利用对象去重, 因为对象的key有唯一性 数组合并: 可以使用克隆(克隆, 深克隆的那些方法) 对象数组去重: for循环, find或者findIndex判断是否存在, 然后不存…...
【AI语言模型】阿里推出音视频转文字引擎
一、前言 阿里的音视频转文字引擎可以正式使用,用户可体验所有AI功能,含全文概要、章节速览、发言总结等高阶AI功能。通过阿里云主账号登录,可享受以下权益: 每日登录,自动获得2小时转写时长; 每邀请1名好…...
YOLOv5改进D-LKA:在D-LKA结构的基础上进行多种改进结构,同时拥有Attention和大卷积核的能力,高效改进
💡本篇内容:YOLOv5改进D-LKA:在D-LKA结构的基础上进行多种改进结构,同时拥有Attention和大卷积核的能力,高效改进 💡🚀🚀🚀本博客 改进源代码改进 适用于 YOLOv5 按步骤操作运行改进后的代码即可 💡本文提出改进 原创 方式:二次创新,YOLOv5专属 论文理论部…...
Java项目-Spring Boot的生鲜网上交易系统
博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 文章目录 1 简介2 技术栈3 系统功能4 功能设计5系统详细设计5.1系统功能模块5.2后台功能模块5\.2\.1用户功…...
MySQL - group by分组查询 (查询操作 三)
功能介绍 group by: 对数据进行分组和聚合操作(可以操作单字段和多字段) having:过滤group by的结果,也就是在分组后添加筛选条件 基础语法 select 字段列表 from 表名 [ where 条件 ] group by 分组字段名 [ having ]; where 和 having的区…...
96.qt qml-http之XMLHttpRequest介绍详解使用
在QML中我们可以通过XMLHttpRequest 来实现http/https访问网络接口,接下来我们先来学习XMLHttpRequest类的常用部分、 由于QML的XMLHttpRequest少部分参数是没有的,所以本章来单独讲解下。下章我们来实现旋转请求按钮以及通用的JSON请求模板方法 1.XMLHttpRequest初步使用 …...
代码随想录算法训练营第五十天 | 123.买卖股票的最佳时机III 188. 买卖股票的最佳时机 IV
1. 买卖股票的最佳时机 III 123. 买卖股票的最佳时机 III - 力扣(LeetCode) * 定义 5 种状态: * 0: 没有操作, 1: 第一次买入, 2: 第一次卖出, 3: 第二次买入, 4: 第二次卖出 class Solution {public int maxProfit(int[] prices) {int length prices.l…...
详解window.print(),实现长列表打印分页
相信大家平时做项目时,打印需求很常见,但想把打印做好,还是要花点时间的。特别是长列表要分页的情况。 我们知道浏览原生 API window.print() 可以用于印当前窗口(window.document)视图内容。调用此方法会产生一个打印…...
使用Chatgpt编写的PHP数据库pdo操作类(增删改查)
摘要 将PDO封装成PHP类进行调用有很多好处,包括: 1、封装性和抽象性: 通过将PDO封装到一个类中,您可以将数据库操作逻辑与应用程序的其他部分分离开来,提高了代码的组织性和可维护性。这样,您只需在一个地…...
蓝桥杯2023年第十四届省赛真题-异或和之和--题解
目录 蓝桥杯2023年第十四届省赛真题-异或和之和 题目描述 输入格式 输出格式 样例输入 样例输出 【代码实现】 大家觉得写得可以的话,可以加入QQ群907575059. 蓝桥杯2023年第十四届省赛真题-异或和之和 时间限制: 3s 内存限制: 320MB 提交: 241 解决: 66 …...
Linux 常用命令学习笔记
Linux 常用命令学习笔记 文件操作 ls:列出当前目录下的文件和文件夹。 ls -l:以长格式显示文件和文件夹的详细信息。ls -a:显示所有文件,包括隐藏文件。 cd [目录]:切换到指定目录。pwd:显示当前工作目录…...
eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...
【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...
企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...
Caliper 配置文件解析:fisco-bcos.json
config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...
node.js的初步学习
那什么是node.js呢? 和JavaScript又是什么关系呢? node.js 提供了 JavaScript的运行环境。当JavaScript作为后端开发语言来说, 需要在node.js的环境上进行当JavaScript作为前端开发语言来说,需要在浏览器的环境上进行 Node.js 可…...
