2020年5月19日javascript
额,今天是520的前一天,虽然跟我没啥关系 这几天作了一个简单的登陆系统css
一、初衷html
主要是测试本身对springBoot的理解和掌握(由于本身前段时间自学了这个springBoot因此想测试一下)还有就是对SSM的回顾前端
话很少说上代码(Don't talk too much about code)html5
二、开发环境java
语言Java
2_一、开发工具mysql
基于IntelliJ IDEA 2019.3
2_二、技术选型jquery
前端(还没学Vue)git
基础的HTML5 CSS JavaScript JQuery
后端github
SpringBoot(2.3.0.RELEASE) 基础的SpringMVC、Spring 5.x和MyBatis3 templates MySql5.7
项目管理工具
Maven(3.6.3) Git GitHub项目的地址 (https://github.com/hello9geg/sms-login)
短信API(腾讯云) (若有不懂,自行百度)
重要的pom.xml文件 <properties> <java.version>1.8</java.version> <thymeleaf.version>3.0.11.RELEASE</thymeleaf.version> <!-- 布局功能的支持程序 thymeleaf3主程序 layout2以上版本 一个适配--> <!-- thymeleaf2 layout1--> <thymeleaf-layout-dialect.version>2.4.1</thymeleaf-layout-dialect.version> </properties> <dependencies> <!-- 引入web模块 能够暂时先把它当作springMvc --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- 引入thymeleaf模板引擎 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <!-- 引入外部的jqueryJar--> <dependency> <groupId>org.webjars</groupId> <artifactId>jquery</artifactId> <version>3.3.1</version> </dependency> <!--导入配置文件处理器,配置文件进行绑定就会有提示--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency> <!-- 引入myBatis --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.2</version> </dependency> <!-- 引入mysql驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <!-- 引入Druid数据池 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.20</version> </dependency> <!-- 引入腾讯云的Jar --> <dependency> <groupId>com.github.qcloudsms</groupId> <artifactId>qcloudsms</artifactId> <version>1.0.6</version> </dependency> <!-- 建立springBoot项目自带的测试组件 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> </dependencies> <build> <plugins> <!-- 建立springBoot项目自带的插件(打War包) --> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
三、Java后台代码
3_一、Controller:这个主要是对发短信的业务的处理
package com.springboot.smslogin.controller; import com.github.qcloudsms.SmsSingleSender; import com.github.qcloudsms.SmsSingleSenderResult; import com.github.qcloudsms.httpclient.HTTPException; import com.springboot.smslogin.entity.UserInfo; import com.springboot.smslogin.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import javax.servlet.http.HttpSession; import java.io.IOException; import java.util.Random; /** * @author * @date * @description */ @Controller @RequestMapping("/userController") public class UserController { @Autowired private UserService userService; @RequestMapping("/sms") @ResponseBody //由于后台传来的ajax因此要加这个注解 //smsphone 前台传来的smsphone(键) public String smsCode(String smsphone){ String json = null; //判断手机号是否被注册过 boolean result = userService.findUserInfoByPhone(smsphone); if(result == false){ json = "{\"message\":"+ false +"}"; return json; }else{ //发送短信 获取返回值 String sms = SMS(smsphone); json = "{\"message\":"+ true +",\"sms\":\""+ sms +"\"}"; return json; } } //发送短信 返回发送的验证码 private String SMS(String phone) { String phoneNumber = phone; //短信内容 templateId这个Id对应着短信内容 int templateId = 200461; //验证码 String[] params = new String[1]; //生成一个随机的验证码 String code = ""; Random r = new Random(); for (int i = 1; i <=4 ; i++) { code += r.nextInt(10); } //存放随机的一个验证码 params[0] = code; System.out.println(code+"====================="); //签名 String sign = "tLain公众号"; //拿到发送短信的核心类 SmsSingleSender sender = new SmsSingleSender(1400142856,"21306d751cfdf61ed433e506da242522"); //发送短信 try { SmsSingleSenderResult result = sender.sendWithParam("86", phoneNumber, templateId, params, sign, "", ""); //也能够拿到返回值 这里的返回值用于查看你的错误信息 System.out.println(result); } catch (HTTPException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return code; } @RequestMapping("/register") public String register(UserInfo userInfo){ boolean result = userService.register(userInfo); if(result){ //重定向到登陆页面 return "redirect:/indexController/index"; }else{ return "redirect:/indexController/registered"; } } @RequestMapping("/login") public String login(UserInfo userInfo, Model model, HttpSession session){ boolean result = userService.login(userInfo); if (result){ //注册成功重定向到主页面 顺便把用户存取到会话中, 防止表单重复提交,重定向到后台页面 session.setAttribute("userInfo",userInfo); return "login_success"; }else{ model.addAttribute("message","用户名或者密码错误"); return "index"; } } }
3_二、Dao (由于作的系统比较简单,因此数据访问层页比较简单)
@Insert("insert into userInfo(phone,password) values(#{phone}, #{password})") public abstract Integer saveUserInfo(UserInfo userInfo); @Select("select * from userInfo where phone = #{phone} and password = #{password}") public UserInfo findUserInfoByPhoneAndPwd(UserInfo userInfo); @Select("select * from userInfo where phone = #{phone}") public abstract UserInfo findUserInfoByPhone(String phone);
四、前台代码
4_一、HTML
4_1_一、注册页面
注册页面代码(HTML和本身写的Js)
<!doctype html> <!-- 引入templates的命名空间 xmlns:th="http://www.thymeleaf.org" --> <html lang="zh-CN" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link href="css/bootstrap.min.css" type="text/css" rel="stylesheet" th:href="@{/css/bootstrap.min.css}" > <link href="css/font-awesome.min.css" type="text/javascript" rel="stylesheet" th:href="@{/css/font-awesome.min.css}"> <link href="css/bootsnav.css" type="text/css" rel="stylesheet" th:href="@{/css/bootsnav.css}"> <link href="css/normalize.css" type="text/css" rel="stylesheet" th:href="@{/css/normalize.css}"> <link href="css/css.css" rel="stylesheet" type="text/css" th:href="@{/css/css.css}"> <script src="js/jquery-1.11.0.min.js" type="text/javascript" th:src="@{/js/jquery-1.11.0.min.js}"></script> <script src="js/jquery.step.js" th:src="@{/js/jquery.step.js}"></script> <script src="js/bootstrap.min.js" type="text/javascript" th:src="@{/js/bootstrap.min.js}"></script> <script src="js/bootsnav.js" type="text/javascript" th:src="@{/js/bootsnav.js}"></script> <script src="js/jquery.js" type="text/javascript" th:src="@{/js/jquery.js}"></script> <!--[if IE]> <script src="js/html5.js"></script><![endif]--> <title>注册</title> </head> <body class="logobg_style"> <div id="large-header" class="large-header login-page"> <canvas id="demo-canvas" width="1590" height="711"></canvas> <div class="Retrieve_style"> <div class="Retrieve-content step-body" id="myStep"> <h1 class="title_name">用户注册</h1> <div class="step-header"> <ul> <li><p>输入电话</p></li> <li><p>确认密码</p></li> <li><p>成功</p></li> </ul> </div> <div class="step-content"> <div class="step-list login_padding"> <!-- 大表单 --> <form role="form" id="form_login" class=""> <div class="form-group clearfix"> <div class="input-group col-lg-8 col-md-8 col-xs-8"> <div class="input-group-addon"><i class="icon_phone"></i></div> <!-- 输入的手机号的框 --> <input type="text" class="form-control text_phone" name="phone" id="phone" placeholder="你的手机号" autocomplete="off"> </div> <!-- 获取验证码的按钮 --> <div class="col-lg-4 col-md-4 col-xs-4 fl"><input type="button" id="sms-input" class="btn_mfyzm" value="获取验证码" onclick="SendSMS()"/> </div> </div> <div class="form-group clearfix"> <div class="input-group"> <div class="input-group-addon"><i class="icon_yanzhen"></i></div> <!-- 输入短信验证码的框 --> <input type="text" class="form-control" name="Verification" id="sms-code" placeholder="短信验证码" autocomplete="off"> </div> </div> <div class="tishi"></div> </form> <div class="form-group"> <!-- 下一步按钮 disabled="disabled" 若是没输入手机号和验证码是不容许点击的 --> <button class="btn btn-danger btn-block btn-login" id="applyBtn" disabled="disabled" >下一步</button> </div> </div> <div class="step-list"> <form method="post" role="form" id="" class="login_padding"> <div class="form-group clearfix"> <div class="input-group"> <div class="input-group-addon"> <i class="icon_password"></i> </div> <!-- 第一个密码框 --> <input type="password" class="form-control" name="password" id="password" placeholder="输入密码" autocomplete="off"> </div> </div> <div class="form-group clearfix"> <div class="input-group"> <div class="input-group-addon"> <i class="icon_password"></i> </div> <!-- 第二个密码框 --> <input type="password" class="form-control" name="confirmpwd" id="confirmpwd" placeholder="再次密码" autocomplete="off"> </div> </div> <div class="tishis"></div> <div class="form-group"> <a href="javascript:void(0);" type="submit" class="btn btn-danger btn-block btn-login" id="submitBtn">注册</a> </div> </form> </div> <div class="step-list"> <div class="ok_style center"> <h2><img src="images/ok.png" th:src="@{/images/ok.png}"></h2> <!-- 写一个定时器的效果(倒计时的效果)已完成在jquery.step.js下的28行--> <h5 class="color2 mtb20">你已成功注册会员<b id="Os">5</b>秒后跳转到首页</h5> </div> </div> <!-- 本身写一个隐藏表单 --> <form hidden id="sms_form" th:action="@{/userController/register}" method="post"> <input id="sms_userName" name="phone"/> <input id="sms_password" name="password"/> </form> </div> </div> </div> </div> <script src="js/TweenLite/TweenLite.min.js" th:src="@{/js/TweenLite/TweenLite.min.js}"></script> <script src="js/TweenLite/EasePack.min.js" th:src="@{/js/TweenLite/EasePack.min.js}"></script> <script src="js/TweenLite/rAF.js" th:src="@{/js/TweenLite/rAF.js}"></script> <script src="js/TweenLite/demo-1.js" th:src="@{/js/TweenLite/demo-1.js}"></script> <!-- 引入layer js 这个脚本主要是作弹出层的效果很不错--> <script src="js/layer/layer.js" th:src="@{/js/layer/layer.js}"></script> <!-- th:inline="javascript" 能够在javascript使用thymeleaf语法 --> <script type="text/javascript" th:inline="javascript"> var tiem = 5; var InterValOjb; //用于存储 回调函数的返回值 var sms; function timer() { if(tiem == 0){ $("#sms-input").val("从新获取验证码"); //为何要在这里设置为又把tiem设置为5呢? // 缘由就是为下一次点击按钮作准备,若是下一次点击按钮那就是等于5了,就会走else了, //而后这样不断的循环,只要有人点按钮就会触发这个事件 tiem = 5; //点击完一次在设置为false 这里使用原生的Jquery document.getElementById("sms-input").disabled = false; //若是时间等于0秒的话,那就删除定时器 window.clearInterval(InterValOjb); }else{ tiem --; $("#sms-input").val(tiem+"秒"); } } //把按钮隐藏30s的效果 function SendSMS() { //获取手机号,使用正则表达式来验证手机号的正确与否 var phone = $("#phone").val(); if((/^1(3|4|5|6|7|8|9)\d{9}$/.test(phone))){ //发送Ajax请求 这里虽然会显示错误,可是不会影响程序的运行 $.post([[@{~/userController/sms}]],{"smsphone":phone},function (data) { //若是该手机号已被注册过的话那就不能注册了 if(data.message == false){ layer.msg("该手机号已被注册"); return false; }else{ //把回调函数的结果 赋值给这个公共变量 sms = data.sms; layer.msg("验证码发送成功,请注意查收"); //把用户输入的手机号 添加到隐藏表单手机号 $("#sms_userName").val(phone); } },"json"); //设置按钮的只读属性 $("#sms-input").attr("disabled","true"); //每隔一千毫秒(1秒)就调用一次这个timer方法 InterValOjb = window.setInterval(timer,1000); }else{ layer.msg("手机格式有误"); return false; } } //验证码的离焦事件(失去焦点) 判断密码是否正确 $("#sms-code").blur(function () { //获取用户输入的验证码 var code = $("#sms-code").val(); //获取真正的验证码 // 第一种方法(有误): // 第一次是获取不到值的 由于使用thymeleaf模板引擎第一次进入这个页面它会自动渲染,(因此获得的结果就是null) // 可是你的离焦事件启动完了以后就会有值,只要你再次刷新页面(从新渲染)那么就会又有值了 //var sms = [[${session.sms}]]; //第二种方法 if(code == sms){ layer.msg("验证码正确"); $("#applyBtn").attr("disabled",null); }else{ layer.msg("验证码输入有误,请从新输入"); $("#applyBtn").attr("disabled","disabled"); return; } }); </script> </body> </html>
4_1_二、登陆页面
登陆页面代码(HTML和本身写的Js)
<!doctype html> <!-- 引入templates的命名空间 xmlns:th="http://www.thymeleaf.org" --> <html lang="zh-CN" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link href="css/bootstrap.min.css" type="text/css" rel="stylesheet" th:href="@{/css/bootstrap.min.css}" > <link href="css/font-awesome.min.css" type="text/javascript" rel="stylesheet" th:href="@{/css/font-awesome.min.css}"> <link href="css/bootsnav.css" type="text/css" rel="stylesheet" th:href="@{/css/bootsnav.css}"> <link href="css/normalize.css" type="text/css" rel="stylesheet" th:href="@{/css/normalize.css}"> <link href="css/css.css" rel="stylesheet" type="text/css" th:href="@{/css/css.css}"> <script src="js/jquery-1.11.0.min.js" type="text/javascript" th:src="@{/js/jquery-1.11.0.min.js}"></script> <script src="js/jquery.step.js" th:src="@{/js/jquery.step.js}"></script> <script src="js/bootstrap.min.js" type="text/javascript" th:src="@{/js/bootstrap.min.js}"></script> <script src="js/bootsnav.js" type="text/javascript" th:src="@{/js/bootsnav.js}"></script> <script src="js/jquery.js" type="text/javascript" th:src="@{/js/jquery.js}"></script> <!--[if IE]> <script src="js/html5.js"></script><![endif]--> <title>注册</title> </head> <body class="logobg_style"> <div id="large-header" class="large-header login-page"> <canvas id="demo-canvas" width="1590" height="711"></canvas> <div class="Retrieve_style"> <div class="Retrieve-content step-body" id="myStep"> <h1 class="title_name">用户注册</h1> <div class="step-header"> <ul> <li><p>输入电话</p></li> <li><p>确认密码</p></li> <li><p>成功</p></li> </ul> </div> <div class="step-content"> <div class="step-list login_padding"> <!-- 大表单 --> <form role="form" id="form_login" class=""> <div class="form-group clearfix"> <div class="input-group col-lg-8 col-md-8 col-xs-8"> <div class="input-group-addon"><i class="icon_phone"></i></div> <!-- 输入的手机号的框 --> <input type="text" class="form-control text_phone" name="phone" id="phone" placeholder="你的手机号" autocomplete="off"> </div> <!-- 获取验证码的按钮 --> <div class="col-lg-4 col-md-4 col-xs-4 fl"><input type="button" id="sms-input" class="btn_mfyzm" value="获取验证码" onclick="SendSMS()"/> </div> </div> <div class="form-group clearfix"> <div class="input-group"> <div class="input-group-addon"><i class="icon_yanzhen"></i></div> <!-- 输入短信验证码的框 --> <input type="text" class="form-control" name="Verification" id="sms-code" placeholder="短信验证码" autocomplete="off"> </div> </div> <div class="tishi"></div> </form> <div class="form-group"> <!-- 下一步按钮 disabled="disabled" 若是没输入手机号和验证码是不容许点击的 --> <button class="btn btn-danger btn-block btn-login" id="applyBtn" disabled="disabled" >下一步</button> </div> </div> <div class="step-list"> <form method="post" role="form" id="" class="login_padding"> <div class="form-group clearfix"> <div class="input-group"> <div class="input-group-addon"> <i class="icon_password"></i> </div> <!-- 第一个密码框 --> <input type="password" class="form-control" name="password" id="password" placeholder="输入密码" autocomplete="off"> </div> </div> <div class="form-group clearfix"> <div class="input-group"> <div class="input-group-addon"> <i class="icon_password"></i> </div> <!-- 第二个密码框 --> <input type="password" class="form-control" name="confirmpwd" id="confirmpwd" placeholder="再次密码" autocomplete="off"> </div> </div> <div class="tishis"></div> <div class="form-group"> <a href="javascript:void(0);" type="submit" class="btn btn-danger btn-block btn-login" id="submitBtn">注册</a> </div> </form> </div> <div class="step-list"> <div class="ok_style center"> <h2><img src="images/ok.png" th:src="@{/images/ok.png}"></h2> <!-- 写一个定时器的效果(倒计时的效果)已完成在jquery.step.js下的28行--> <h5 class="color2 mtb20">你已成功注册会员<b id="Os">5</b>秒后跳转到首页</h5> </div> </div> <!-- 本身写一个隐藏表单 --> <form hidden id="sms_form" th:action="@{/userController/register}" method="post"> <input id="sms_userName" name="phone"/> <input id="sms_password" name="password"/> </form> </div> </div> </div> </div> <script src="js/TweenLite/TweenLite.min.js" th:src="@{/js/TweenLite/TweenLite.min.js}"></script> <script src="js/TweenLite/EasePack.min.js" th:src="@{/js/TweenLite/EasePack.min.js}"></script> <script src="js/TweenLite/rAF.js" th:src="@{/js/TweenLite/rAF.js}"></script> <script src="js/TweenLite/demo-1.js" th:src="@{/js/TweenLite/demo-1.js}"></script> <!-- 引入layer js (这个脚本主要是作弹出层的效果)很不错--> <script src="js/layer/layer.js" th:src="@{/js/layer/layer.js}"></script> <!-- th:inline="javascript" 能够在javascript使用thymeleaf语法 --> <script type="text/javascript" th:inline="javascript"> var tiem = 5; var InterValOjb; //用于存储 回调函数的返回值 var sms; function timer() { if(tiem == 0){ $("#sms-input").val("从新获取验证码"); //为何要在这里设置为又把tiem设置为5呢? // 缘由就是为下一次点击按钮作准备,若是下一次点击按钮那就是等于5了,就会走else了, //而后这样不断的循环,只要有人点按钮就会触发这个事件 tiem = 5; //点击完一次在设置为false 这里使用原生的Jquery document.getElementById("sms-input").disabled = false; //若是时间等于0秒的话,那就删除定时器 window.clearInterval(InterValOjb); }else{ tiem --; $("#sms-input").val(tiem+"秒"); } } //把按钮隐藏30s的效果 function SendSMS() { //获取手机号,使用正则表达式来验证手机号的正确与否 var phone = $("#phone").val(); if((/^1(3|4|5|6|7|8|9)\d{9}$/.test(phone))){ //发送Ajax请求 这里虽然会显示错误,可是不会影响程序的运行 $.post([[@{~/userController/sms}]],{"smsphone":phone},function (data) { //若是该手机号已被注册过的话那就不能注册了 if(data.message == false){ layer.msg("该手机号已被注册"); return false; }else{ //把回调函数的结果 赋值给这个公共变量 sms = data.sms; layer.msg("验证码发送成功,请注意查收"); //把用户输入的手机号 添加到隐藏表单手机号 $("#sms_userName").val(phone); } },"json"); //设置按钮的只读属性 $("#sms-input").attr("disabled","true"); //每隔一千毫秒(1秒)就调用一次这个timer方法 InterValOjb = window.setInterval(timer,1000); }else{ layer.msg("手机格式有误"); return false; } } //验证码的离焦事件(失去焦点) 判断密码是否正确 $("#sms-code").blur(function () { //获取用户输入的验证码 var code = $("#sms-code").val(); //获取真正的验证码 // 第一种方法(有误): // 第一次是获取不到值的 由于使用thymeleaf模板引擎第一次进入这个页面它会自动渲染,(因此获得的结果就是null) // 可是你的离焦事件启动完了以后就会有值,只要你再次刷新页面(从新渲染)那么就会又有值了 //var sms = [[${session.sms}]]; //第二种方法 if(code == sms){ layer.msg("验证码正确"); $("#applyBtn").attr("disabled",null); }else{ layer.msg("验证码输入有误,请从新输入"); $("#applyBtn").attr("disabled","disabled"); return; } }); </script> </body> </html>
4_二、CSS
这个没什么好说的,就是下载的网页的模板自带的
4_三、JS
绝大部分使用的是模板自带的
也有部分本身写的
var step = $("#myStep").step({ animate: true, initStep: 1, speed: 1000 }); $("#preBtn").click(function (event) { var yes = step.preStep(); }); $("#applyBtn").click(function (event) { var code = $.trim($("#Verification").val()); var phone = /[1][3-9][0-9]{9,9}/; var phones = $.trim($("#phone").val()); if ($.trim(phones) == "") { Tip('请填写手机号码!'); $("#phone").focus(); return; } var yes = step.nextStep(); return; }); $("#submitBtn").click(function (event) { var txtconfirm = $.trim($("#confirmpwd").val()); var txtPwd = $("#password").val(); if ($.trim(txtPwd) == "") { layer.msg("请输入你要设置的密码!"); $("#txtPwd").focus(); return; } if ($.trim(txtconfirm) == "") { layer.msg("请再次输入密码!"); $("#txtconfirm").focus(); return; } if ($.trim(txtconfirm) != $.trim(txtPwd)) { layer.msg("你输入的密码不匹配,请重新输入!"); $("#txtconfirm").focus(); return; } // (若是两次输入的是正确的) $("#sms_password").val(txtconfirm); //倒计时效果 var Os=document.getElementById("Os"); var num=5; var timer=setInterval(function () { num--; Os.innerText=num; if(num==0){ clearInterval(timer); window.location.href="/indexController/index"; //5秒事后才会提交隐藏表单 到数据库 $("#sms_form").submit(); } },1000) var yes = step.nextStep(); $(function () { setTimeout("lazyGo();", 1000); }); function lazyGo() { var sec = $("#sec").text(); $("#sec").text(--sec); if (sec > 0) setTimeout("lazyGo();", 1000); else window.location.href = "article_home.html"; } });
五、遇到的困难
至于其余的倒也没了
六、总结OR收获
虽然这只是一个小的登陆案例 可是呢,也让本身对本身有了一个认知吧。知道本身哪里缺什么,该学什么,
最后加油吧少年