包含后端的登录与注册页面

╰+哭是因爲堅強的太久メ 2024-03-30 12:11 209阅读 0赞

包含后端的登录页面与注册页面

简介:本文讲解含有前后端的,登录页面与注册页面怎么制作,本登录页面是一个前后端不分离的。

参考文章
JS实现记住用户密码
用HTML+CSS构建一个绚丽的登录页面
提交表单与验证表单案例
JDBC数据库的连接
基于SpringBoot的SSMP整合案例
restful风格快速入门
IDEA快速构建SpringBoot项目

从参考如此多的文章就知道,其实实现起来还是有点点复杂的。

创建数据库

下面是我创建数据库的sql语句

  1. -- ----------------------------
  2. -- Table structure for user
  3. -- ----------------------------
  4. DROP TABLE IF EXISTS `user`;
  5. CREATE TABLE `user` (
  6. `id` int(11) NOT NULL AUTO_INCREMENT,
  7. `username` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  8. `password` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  9. PRIMARY KEY (`id`) USING BTREE
  10. ) ENGINE = InnoDB AUTO_INCREMENT = 51 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
  11. -- ----------------------------
  12. -- Records of user
  13. -- ----------------------------
  14. INSERT INTO `user` VALUES (1, 'LIHUA', '123456');
  15. INSERT INTO `user` VALUES (2, 'zhangsan', '123');
  16. INSERT INTO `user` VALUES (3, 'LISI', '456489');

建表成功之后的样子
在这里插入图片描述

前端部分

文件结构
在这里插入图片描述

css文件

把两个页面的公共的css文件放到同一个文件中。
water.css

  1. body{
  2. background: url("https://pic3.zhimg.com/v2-92879d7d6ddae16c6c880bf936a2b2ae_r.jpg");
  3. /* 设置背景铺满 */
  4. background-repeat:no-repeat;
  5. background-size:100%;
  6. }
  7. form{
  8. /* 设置透明度 */
  9. opacity: 80%;
  10. text-align: center;
  11. /* 再设置内边距 使得内容更偏向于中央位置 */
  12. /* 上方,下方内边距为120px 与 左边与右边均为100px 按照逆时针 */
  13. /* 但是会撑大盒子 */
  14. padding: 0px 100px;
  15. /* 设置文本文字的大小 */
  16. font-size: 18px;
  17. /* 添加圆角边框 */
  18. border-radius: 10px;
  19. /* 增加外边距 */
  20. /* 上下80px 然后左右居中 */
  21. margin: 120px auto;
  22. }
  23. .textinput{
  24. /* 设置宽高 */
  25. height: 40px;
  26. width: 100px;
  27. /* 设置内边距 */
  28. padding: 0 35px;
  29. /* 去除边框 */
  30. border: none;
  31. /* 设置背景颜色 */
  32. background: #F8F9F9;
  33. /* 设置字体大小 */
  34. font-size: 15px;
  35. /* 给文本框加上阴影 */
  36. box-shadow: 0px 1px 1px rgba(255, 255, 255, 0.7), inset 0px 2px 5px #aaaaaa;
  37. /* 给文本框加上圆角边框 */
  38. border-radius: 5px;
  39. /* 给文本框中输入文字加上颜色 */
  40. color: saddlebrown;
  41. }
  42. /* 筛选input标签中 type为"submit"的 进行渲染*/
  43. input[type="submit"]{
  44. /* 设置宽高 */
  45. width: 110px;
  46. height: 40px;
  47. /* 内部文本居中 */
  48. text-align: center;
  49. /* 圆角边框 */
  50. border-radius: 5px;
  51. /* 设置字体 */
  52. font:16px "黑体";
  53. /* 设置背景颜色 */
  54. background-color: #C0C6CB;
  55. }
  56. a {
  57. /* 去除下划线 */
  58. text-decoration: none;
  59. }
  60. a:hover {
  61. /* 悬空的时候有被选中的样子 出现下划线*/
  62. text-decoration: underline;
  63. }
  64. .main {
  65. /* 设置为绝对定位 */
  66. position: absolute;
  67. /* 设置盒子放在中间的位置 */
  68. left: 50%;
  69. top: 50%;
  70. /* 设置动态效果 */
  71. transform: translate(-50%, -50%);
  72. /* 设置盒子大小 */
  73. width: 457px;
  74. height: 454px;
  75. /* 把边框算入盒子大小 */
  76. box-sizing: border-box;
  77. border-radius: 50%;
  78. /* 背景透明 */
  79. background: transparent;
  80. /* 设置阴影边框 */
  81. box-shadow: inset 10px 20px 30px rgba(0, 0, 0, 0.5), 10px 10px 20px rgba(0, 0, 0, 0.3), 15px 15px 30px rgba(0, 0, 0, 0.05), inset -10px -10px 15px rgba(255, 255, 255, 0.8);
  82. /* 设置动画效果 */
  83. animation: move 6s linear infinite;
  84. }
  85. .main::after {
  86. position: absolute;
  87. content: "";
  88. width: 40px;
  89. height: 40px;
  90. background: rgba(255, 255, 255, 0.5);
  91. left: 80px;
  92. top: 80px;
  93. border-radius: 50%;
  94. animation: move2 6s linear infinite;
  95. filter:blur(1px);
  96. }
  97. .main::before {
  98. position: absolute;
  99. content: "";
  100. width: 20px;
  101. height: 20px;
  102. background: rgba(255, 255, 255, 0.5);
  103. left: 130px;
  104. top: 70px;
  105. border-radius: 50%;
  106. animation: move3 6s linear infinite;
  107. filter:blur(1px);
  108. }
  109. /* 设置移动方位 */
  110. @keyframes move {
  111. 50% {
  112. border-radius: 50% 50% 66% 34% / 26% 62% 38% 74% ;
  113. }
  114. 75% {
  115. border-radius: 750% 50% 49% 51% / 26% 62% 38% 74% ;
  116. }
  117. 25% {
  118. border-radius: 50% 50% 49% 51% / 52% 62% 38% 48% ;
  119. }
  120. }

js文件

background.js

  1. // 定义图片资源数组
  2. var imgs = ["ihttps://pic2.zhimg.com/v2-9142793b20533b5e2e5cc91eab9ee101_r.jpg","https://pic1.zhimg.com/v2-abdc2de175b7bf0ed358ee5828cdf858_r.jpg", "https://pic2.zhimg.com/v2-168c35bda16e110ecf9b4aa6e97d0b01_r.jpg", "https://pic2.zhimg.com/v2-dcc1ea1a8b0c398c826ef9469d1e8b96.jpg"]
  3. // 获取body元素
  4. // 添加自动切换背景的函数
  5. // 定义当前的index
  6. let index = 0;
  7. // 每隔一秒换一张背景
  8. setInterval(function(){
  9. index += 1;
  10. index = index % 4;
  11. document.body.style.background = 'url(' + this.imgs[index] + ')';
  12. }, 5000);

rememeber

  1. // 获取输入账号的元素
  2. var username= document.querySelector('#username');
  3. // 获取输入密码的元素
  4. var password = document.querySelector('#password');
  5. // 获取技术密码的选择框的元素
  6. var remember = document.querySelector('#remember');
  7. // 如果username和password存在的话
  8. if (localStorage.getItem('username') && localStorage.getItem('password')) {
  9. // 那么把username的value设置为本地存储的username
  10. username.value = localStorage.getItem('username');
  11. // 那么把password的value设置为本地存储的password
  12. password.value = localStorage.getItem('password');
  13. // 然后设置已经记住账号和密码了
  14. remember.checked = true;
  15. }
  16. // 给remember输入框添加事件
  17. remember.addEventListener('change', function() {
  18. // 如果已经记住密码了
  19. if (this.checked) {
  20. // 那么本地存储现在username和password中的值 把输入的username和password存放到本地存储中
  21. localStorage.setItem('username', username.value)
  22. localStorage.setItem('password', password.value)
  23. } else {
  24. // 如果没有记住密码 那么移除本地的username和password的存储情况
  25. localStorage.removeItem('username');
  26. localStorage.removeItem('password');
  27. }
  28. })

登录页面

登录页面的注册页面都是属于,表单提交,需要在表单的form,的action的属性中,写入需要提交的网址。

Login.html

  1. <!DOCTYPE html>
  2. <html lang="en" xmlns:th="http://www.thymeleaf.org">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>登录</title>
  8. <link rel="stylesheet" type="text/css" href="css/water.css">
  9. <style>
  10. form{
  11. margin-top: 80px;
  12. }
  13. </style>
  14. </head>
  15. <body>
  16. <div class="main">
  17. <form th:action="@{/CanLogin}" method="post">
  18. <div style="text-align: center"><span style="color: red;text-align: center" id="sb" th:text="${session.errorInfo}"/></div>
  19. <p>用户名<br />
  20. <input type="text" class="textinput" name = "username" id = "username" placeholder="请输入用户名" />
  21. </p>
  22. <p>密码<br />
  23. <input type="password" class="textinput" name="password" id="password" placeholder="请输入密码" />
  24. </p>
  25. <p>
  26. <input id="remember" type="checkbox" /><label>记住账号</label>
  27. </p>
  28. <p>
  29. <input type="submit" value="登录" />
  30. </p>
  31. <p>还没有账户?<a href="register">注册</a></p>
  32. </form>
  33. </div>
  34. </body>
  35. <script type="text/javascript" src="js/background.js" ></script>
  36. <script type="text/javascript" src="js/rememeber.js" ></script>
  37. </html>

注册页面

Register.html

  1. <!DOCTYPE html>
  2. <html lang="en" xmlns:th="http://www.thymeleaf.org">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>注册</title>
  8. <link rel="stylesheet" type="text/css" href="css/water.css">
  9. </head>
  10. <body>
  11. <div class="main">
  12. <form th:action="@{/CanRegister}" method="post">
  13. <div style="text-align: center;margin-top: 10px"><span style="color: red;text-align: center" id="sb" th:text="${session.errorInfo}"/></div>
  14. <p>用户名<br />
  15. <input type="text" name="username" class="textinput" placeholder="请输入用户名" />
  16. </p>
  17. <p>密码<br />
  18. <input type="password" name="password" class="textinput" placeholder="请输入密码" />
  19. </p>
  20. <p>
  21. <input type="submit" value="提交" />
  22. </p>
  23. <p>
  24. <p><a href="login">返回登录</a></p>
  25. </p>
  26. </form>
  27. </div>
  28. </body>
  29. <script type="text/javascript" src="js/background.js" ></script>
  30. </html>

后端部分

application.properties

  1. spring.datasource.username=root
  2. spring.datasource.password=123456
  3. spring.datasource.url=jdbc:mysql://localhost:3306/projectdatabase?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8
  4. spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

pom.xml

pom.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <parent>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-parent</artifactId>
  8. <version>2.7.6</version>
  9. <relativePath/> <!-- lookup parent from repository -->
  10. </parent>
  11. <groupId>com.example</groupId>
  12. <artifactId>SpringBootDemo</artifactId>
  13. <version>0.0.1-SNAPSHOT</version>
  14. <name>SpringBootDemo</name>
  15. <description>SpringBootDemo</description>
  16. <properties>
  17. <java.version>8</java.version>
  18. </properties>
  19. <dependencies>
  20. <dependency>
  21. <groupId>org.springframework.boot</groupId>
  22. <artifactId>spring-boot-starter-thymeleaf</artifactId>
  23. </dependency>
  24. <dependency>
  25. <groupId>mysql</groupId>
  26. <artifactId>mysql-connector-java</artifactId>
  27. <scope>runtime</scope>
  28. </dependency>
  29. <dependency>
  30. <groupId>org.springframework.boot</groupId>
  31. <artifactId>spring-boot-starter-web</artifactId>
  32. </dependency>
  33. <dependency>
  34. <groupId>org.springframework.boot</groupId>
  35. <artifactId>spring-boot-starter-thymeleaf</artifactId>
  36. </dependency>
  37. <!--lombok-->
  38. <dependency>
  39. <groupId>org.projectlombok</groupId>
  40. <artifactId>lombok</artifactId>
  41. </dependency>
  42. <dependency>
  43. <groupId>com.baomidou</groupId>
  44. <artifactId>mybatis-plus-boot-starter</artifactId>
  45. <version>3.4.3</version>
  46. </dependency>
  47. <dependency>
  48. <groupId>org.springframework.boot</groupId>
  49. <artifactId>spring-boot-starter-test</artifactId>
  50. <scope>test</scope>
  51. </dependency>
  52. </dependencies>
  53. <build>
  54. <plugins>
  55. <plugin>
  56. <groupId>org.springframework.boot</groupId>
  57. <artifactId>spring-boot-maven-plugin</artifactId>
  58. </plugin>
  59. </plugins>
  60. </build>
  61. </project>

Bean

User类,这里面的数据类型与数据库中的保持一致。

  1. package com.example.springbootdemo.Bean;
  2. import lombok.AllArgsConstructor;
  3. import lombok.Data;
  4. import lombok.NoArgsConstructor;
  5. @Data
  6. @AllArgsConstructor
  7. @NoArgsConstructor
  8. public class User {
  9. private Integer id;
  10. private String username;
  11. private String password;
  12. public User(String username, String password) {
  13. this.username = username;
  14. this.password = password;
  15. }
  16. }

Controller

这一个类的目的是,设置项目的默认访问页面,我这里把登录页面设置为默认的访问页面。
IndexController

  1. package com.example.springbootdemo.Controller;
  2. import org.springframework.stereotype.Controller;
  3. import org.springframework.web.bind.annotation.RequestMapping;
  4. @Controller
  5. public class IndexController {
  6. @RequestMapping("/")
  7. public String index(){
  8. return"admin/Login.html";
  9. }
  10. }

LoginController
这个类的目的是存放登录和注册相关的类。
基本上以后都是这样的格式,如果不是很懂的话,可以直接把这个后端模板背下来,以后遇到自己的项目直接复制然后改一下就可以了。

在登录模块里面我还添加了,对于密码或者账号错误的检查,如果错了会有,提示信息的,在注册模块里面,加上了对账号的检查,如果账号已经存在了,那么就不能进行注册。

  1. package com.example.springbootdemo.Controller;
  2. import com.example.springbootdemo.Bean.User;
  3. import com.example.springbootdemo.Dao.UserDao;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.stereotype.Controller;
  6. import org.springframework.web.bind.annotation.GetMapping;
  7. import org.springframework.web.bind.annotation.PostMapping;
  8. import org.springframework.web.bind.annotation.RequestMapping;
  9. import org.springframework.web.bind.annotation.RestController;
  10. import javax.servlet.http.HttpServletRequest;
  11. import javax.servlet.http.HttpServletResponse;
  12. import java.util.List;
  13. @Controller
  14. public class LoginController {
  15. @Autowired
  16. private UserDao userDao;
  17. @GetMapping("/login")
  18. public String login(){
  19. return "admin/Login.html";
  20. }
  21. @GetMapping("/register")
  22. public String register(){
  23. return "admin/register.html";
  24. }
  25. @PostMapping("/CanLogin")
  26. private String CanLogin(HttpServletRequest request){
  27. String username = request.getParameter("username");
  28. String password = request.getParameter("password");
  29. System.out.println(username + " " + password);
  30. List<User> users = userDao.selectList(null);
  31. System.out.println(users);
  32. String errorInfo = "";
  33. for (User lis:users){
  34. if (lis.getUsername().equals(username) && lis.getPassword().equals(password)){
  35. System.out.println("正确");
  36. return "pk/index.html";
  37. }
  38. }
  39. errorInfo = "账号或密码错误";
  40. request.getSession().setAttribute("errorInfo", errorInfo);
  41. return "admin/Login.html";
  42. }
  43. @PostMapping("/CanRegister")
  44. private String CanRegister(HttpServletRequest request){
  45. String username = request.getParameter("username");
  46. String password = request.getParameter("password");
  47. System.out.println(username + " " + password);
  48. List<User> users = userDao.selectList(null);
  49. String errorInfo = "";
  50. for (User lis:users){
  51. if (lis.getUsername().equals(username)){
  52. errorInfo = "用户名重复请重新输入";
  53. request.getSession().setAttribute("errorInfo", errorInfo);
  54. System.out.println("用户名重复请重新输入");
  55. return "admin/Register.html";
  56. }
  57. }
  58. // 这里的id为user.size() + 1可以保证新用户一直在最后面
  59. userDao.insert(new User(users.size() + 1, username, password));
  60. return "admin/Login.html";
  61. }
  62. }

Dao

感谢伟大的mybatis-plus让我不再写sql语句。

  1. package com.example.springbootdemo.Dao;
  2. import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  3. import com.example.springbootdemo.Bean.User;
  4. import org.apache.ibatis.annotations.Mapper;
  5. // BaseMapper自带很多模板sql语句
  6. @Mapper
  7. public interface UserDao extends BaseMapper<User> {
  8. }

运行结果展示

默认为登录页面的情况
在这里插入图片描述

登录成功之后的样子
在这里插入图片描述

注册页面
在这里插入图片描述

注册成功之后数据库中会增加一条数据。在这里插入图片描述在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,209人围观)

还没有评论,来说两句吧...

相关阅读