当前位置: 首页 > news >正文

手把手教你制作登录、注册界面 SpringBoot+Vue.js(cookie的灵活运用,验证码功能)

 一、用户登录界面

实现思路:用户在界面输入用户名和密码传入变量。用post方法传输到后端,后端接收整个实体对象。将用户名提取出。在dao层方法中通过select注解查询,返回数据库对应的数据对象。如果返回为空则return false。不为空则通过比对数据库返回的密码和用户输入的密码,如果二者匹配则return true,否则return false。在前端axios框架中,通过if语句判断,如果return true则提示登录成功信息,跳转到首页。如果return false则提示登录失败请重试。

效果:

改进思路:

用cookie记住用户的登录状态。1. 在首页上方显示“欢迎xxx登录!!”字样,xxx必须根据用户名动态变化。2. 已登录状态在右上角显示“个人中心”,个人中心下拉显示“退出登录”,未登录则显示“登录”,无个人中心。3. 实现退出登录的功能。4.设置一个具有权限的页面,如果未登录页面上方弹窗显示“权限不足,请登录”,如果已登录则可以正常浏览页面内容。5. 对登录的用户名和密码进行加密,接收端进行解密匹配。

1.1 初始版本

第1步:dao层编写如下代码:

@Select("select * from tb_user where username=#{username}" )
public User login(String username);

第2步: controller层编写如下代码:

@RestController
@RequestMapping("/api/")
public class DataController {@PostMapping("login")public boolean loginmodule(@RequestBody User user){System.out.println(user.getUsername());System.out.println(user.getPassword());User u = bookDao.login(user.getUsername());if(u==null) return false;System.out.println(u.getPassword());if(user.getPassword().equals(u.getPassword())) return true;else return false;}
}

第3步:编写请求代码:

methods: {login() {axios.post("/api/login",this.form).then((response)=>{if(response.data==true) {confirm('登录成功!');window.location.href="home.html";}else alert('用户名或密码错误,请重试!');})},
}

第4步: 编写登录界面,定义变量:

登录界面:

<!--登录界面-->
<h1 style="margin-left:125px;color: #333333">登录</h1>
<el-form ref="form" :model="form" label-width="80px" style="margin-top: 30px"><el-form-item label="用户名"><el-input v-model="form.username" style="width: 200px;"></el-input></el-form-item><el-form-item label="密码"><el-input v-model="form.password" style="width: 200px;"></el-input></el-form-item><div style="margin-left: 200px;margin-bottom: 15px"><el-link type="primary" @click="register" >点击注册</el-link></div><el-form-item><el-button type="primary" @click="login">登录</el-button><el-button>取消</el-button></el-form-item>
</el-form>

定义变量: 

data() {    return {form: {username: '',password: ''
}  }  }

1.2 完善版本 

技术难点1:cookie如何定义

document.cookie = `loginStatus=true,username=${this.form.username}`;这句话定义了2个cookie,注意不同的cookie间最好以逗号分割。等号左边两边分别是键和值,以键值对的形式目的是方便切割。

methods: {login() {axios.post("/api/login",this.form).then((response)=>{if(response.data==true) {confirm('登录成功!');document.cookie = `loginStatus=true,username=${this.form.username}`;window.location.href="home.html";}else alert('用户名或密码错误,请重试!');})
},

— — — — — — 知识加油站 — — — — — — 

1. ${}是 JavaScript 中的模板字符串语法。它允许在字符串中插入动态的表达式或变量。最终会被解析为具体的值。

2. 在 JavaScript 中document对象提供了一个cookie属性,用于访问和操作浏览器中的 cookie。

3. Cookie 是存储在用户计算机上的小型文本文件,用于在浏览器和服务器之间存储和传递数据。它可以用于在用户的不同请求之间存储会话信息、用户偏好设置、购物车数据等。

— — — — — — — — — — — — — — — — 

技术难点2:如何提取cookie中的目标数据,进行实时显示

上面定义完cookie之后可以直接通过document.cookie直接取得cookie,然而此时的cookie还是以字符串的形式存在,所以需要进行适当的切分:

function getCookie(username){const cookies = document.cookie.split(",")for(let i=0;i<cookies.length;i++){const cookie = cookies[i].split('=');if(cookie[0]==username) return cookie[1];}return "";
}

cookies就是loginStatus=true和username=${this.form.username}。cookie就是loginStatus,true,username,${this.form.username}。

通过匹配cookie[0]是否是username键,可以返回username的值,供前端实时显示欢迎xxx。

技术难点3:如何根据登录与否,显示不同的页面样式

document.addEventListener("DOMContentLoaded", function() {// 在首页上方显示欢迎信息和登录状态const loginStatus = getCookie("loginStatus"); //获取loginStatus的值赋值给loginStatus,是true或falseconst welcomeMessage = document.getElementById("welcome-message");const loginStatusText = document.getElementById("login-status");if (loginStatus === "true") {// 已登录状态const username = getCookie("username"); // 假设用户名保存在名为"username"的cookie中console.info(username);welcomeMessage.textContent = "欢迎 " + username + " 登录!!";} else {// 未登录状态welcomeMessage.textContent = "";loginStatusText.textContent = "登录";}
});

技术难点2和难点3的代码需要同导航栏的代码进行配套使用,才能保证各个页面的一致性,因此可以把上述两段代码封装到一个cookie.js中,然后需要引用的时候就在前端加上如下代码即可:

<script src="cookie.js"></script>

— — — — — — 知识加油站 — — — — — — 

1. <script src="navigation.js"></script>这段代码用于在页面中引入navigation.js文件,该文件包含了导航栏和登录界面的代码。

2. <div id="navigation"></div>这段代码创建了一个空的<div>元素,并为其设置了一个唯一的 id 属性值为 "navigation"。这个 div 元素将被用于展示导航栏的代码。

3. <script>document.getElementById("navigation").innerHTML = navigationCode;</script>这段代码使用 JavaScript 获取到 id 为navigation的 div 元素,并将导航栏的代码navigationCode插入到这个 div 元素中。这样就将导航栏的代码动态地展示在页面上。

4.<div>标签本身不具备任何特定的语义或功能,它只是一个用于容纳其他 HTML 元素的容器。

— — — — — — — — — — — — — — — — 

技术难点4:如何封装前端重复性的代码

前端的每个页面都具有导航栏,每个导航栏的代码如下这么长,如果每个页面都填写,显得及其臃肿。

于是我们选择将代码封装到一个navigation.js的文件中,

const navigationCode = `
<el-menu:default-active="activeIndex2"class="el-menu-demo"mode="horizontal"@select="handleSelect"background-color="#545c64"text-color="#fff"active-text-color="#ffd04b"><el-menu-item><a href="ADSS.html" style="font-size: large;text-decoration: none;">数据查询</a></el-menu-item><el-menu-item><a  href="home.html" style="font-size: large;text-decoration: none;">首页</a></el-menu-item><el-menu-item><a href="login.html" style="font-size: large;text-decoration: none;"><h id="login-status"></h></a></el-menu-item><el-submenu index="2" style=" position: absolute;right: 135px;" ><template  slot="title">个人中心</template><el-menu-item @click="clear" >退出登录</el-menu-item></el-submenu><h5 id="welcome-message" style="color: #edf2fc;display: flex;justify-content: flex-end;"></h5></el-menu>`

 见上面知识加油站:

<!--导航栏--><script src="navigation.js"></script><div id="navigation"></div><script>document.getElementById("navigation").innerHTML = navigationCode;</script>

二、用户注册界面

实现思路:用户输入用户名和密码,利用post方式传回后端,后端根据用户名比对数据是否已在数据库内(select),如果已在则直接提示登录跳转登录界面,如果不在则将数据插入数据库,然后提示注册成功,跳转登录界面。

实现效果:

改进思路:1. 增加验证码机制。2. 可以在旁边实时显示是否已注册。

第1步:dao层编写如下代码:

@Insert("Insert into tb_user(username,password) "+"values(#{username},#{password})")
public void register(User user);
@Select("select * from tb_user where username=#{username}" )
public User login(String username);

 第2步:controller层编写如下代码,判断逻辑:通过用户输入的username,查看数据库中是否有相应的实体对象,如果有说明已注册,如果没有则将数据插入数据库。

@RestController
@RequestMapping("/api/")
public class DataController {@PostMapping("register")public boolean registermodule(@RequestBody User user){User compare = bookDao.login(user.getUsername()); //根据用户输入的用户名返回数据库中对应实体对象if(compare!=null) return false;bookDao.register(user);return true;}
}

第3步:编写注册界面,定义变量:

注册界面如下:

<!--注册界面-->
<h1 style="margin-left:100px;color: #333333">注册账号</h1>
<el-form ref="form" :model="form" label-width="80px" style="margin-top: 30px"><el-form-item label="用户名"><el-input v-model="form.username" style="width: 200px;"></el-input></el-form-item><el-form-item label="密码"><el-input v-model="form.password" style="width: 200px;"></el-input></el-form-item><el-form-item><el-button type="primary" @click="onSubmit">注册</el-button><el-button href="register.html">取消</el-button></el-form-item>
</el-form>

接收数据的变量如下:

data() {return {form: {username: '',password: ''},

第4步:编写请求代码:

onSubmit() {axios.post("/api/register",this.form).then((response)=>{if(response.data==false) alert("注册失败,用户名已存在!");else {confirm("注册成功,即将跳转登录界面")window.location.href="login.html";}})
}

相关文章:

手把手教你制作登录、注册界面 SpringBoot+Vue.js(cookie的灵活运用,验证码功能)

一、用户登录界面 实现思路&#xff1a;用户在界面输入用户名和密码传入变量。用post方法传输到后端&#xff0c;后端接收整个实体对象。将用户名提取出。在dao层方法中通过select注解查询&#xff0c;返回数据库对应的数据对象。如果返回为空则return false。不为空则通过比对…...

C++ Qt零基础入门进阶与企业级项目实战教程与学习方法分享

Qt是一个卓越的客户端跨平台开发框架&#xff0c;可以在Windows、Linux、macOS进行客户端开发&#xff0c;无缝切换&#xff0c;一统三端&#xff1b;当然除了桌面端&#xff0c;在移动端的早期&#xff0c;Qt也展现了其多才多艺&#xff0c;在Android和ios也可以使用Qt编写app…...

TypeScript学习记录

一、TS开发环境的搭建 1、下载并安装node.js 2、使用npm全局安装typeScript 进入命令行输入&#xff1a;npm i -g typescript 3、创建一个ts文件 4、使用tsc对ts文件进行编译 进入命令行进入ts文件所在目录执行命令&#xff1a;tsc 文件名.ts 二、TS基本变量 1、类型声…...

vue内置组件Transition的详解

1. Transition定义 Vue 提供了两个内置组件&#xff0c;可以帮助你制作基于状态变化的过渡和动画&#xff1a; <Transition>会在一个元素或组件进入和离开 DOM 时应用动画。 <TransitionGroup> 会在一个 v-for 列表中的元素或组件被插入&#xff0c;移动&#xff0…...

中秋节听夜曲,Android OpenGL 呈现周董专属的玉兔主题音乐播放器

概述 前几天发现QQ音乐有个好玩的功能&#xff0c;为用户提供了多种 播放器主题&#xff0c;其中 原神 的主题让我眼前一亮&#xff1a; 当然&#xff0c;诸如 换肤、主题 类的功能已经屡见不鲜&#xff0c;但这类沉浸式播放器的听歌体验确实不错。 见猎心喜&#xff0c;正好…...

008_第一代软件系统架构

第一代软件系统架构 文章目录 第一代软件系统架构项目介绍软件架构和软件构架系统框架硬件组成运行系统基础库软件层 系统架构 关键字&#xff1a; Qt、 Qml、 关键字3、 关键字4、 关键字5 项目介绍 欢迎来到我们的 QML & C 项目&#xff01;这个项目结合了 QML&…...

oracle客户端的安装(SQL Developer)

参考资料 软件首页&#xff1a;https://www.oracle.com/database/sqldeveloper/ 官方文档&#xff1a;https://docs.oracle.com/en/database/oracle/sql-developer/ 下载地址&#xff1a;https://www.oracle.com/database/sqldeveloper/technologies/download/ 安装指南&#…...

Mysql索引优化1

关闭查询缓存 set global query_cache_size 0; set global query_cache_type 0; force index&#xff08;索引&#xff09;where 条件 强制走索引 一般不推荐&#xff0c;因为mysql结构中会通过cost计算出最优sql路线 索引下推 5.6之前 会先从辅助索引表也就是二级索引…...

Spring常考知识点(IOC、事务、容器等)

作者&#xff1a;逍遥Sean 简介&#xff1a;一个主修Java的Web网站\游戏服务器后端开发者 主页&#xff1a;https://blog.csdn.net/Ureliable 觉得博主文章不错的话&#xff0c;可以三连支持一下~ 如有需要我的支持&#xff0c;请私信或评论留言&#xff01; Spring需要理解的问…...

Leetcode 2867. Count Valid Paths in a Tree

Leetcode 2867. Count Valid Paths in a Tree 1. 解题思路2. 代码实现 题目链接&#xff1a;2867. Count Valid Paths in a Tree 1. 解题思路 这一题思路上的话由于要求路径上有且仅有一个质数点&#xff0c;因此&#xff0c;一个直接的思路就是考察所有质数的点作为中心点时…...

Jtti:Ubuntu下如何创建XFS文件系统的LVM

在 Ubuntu 下创建一个 XFS 文件系统的 LVM&#xff08;Logical Volume Manager&#xff09;分区需要一系列步骤。以下是详细的步骤&#xff1a; 1. 创建物理卷 (PV) 首先&#xff0c;将要用于 LVM 的硬盘分区&#xff08;物理卷&#xff09;初始化为物理卷。假设你有一个硬盘…...

做销售管理分析需要看哪些关键指标?

做销售管理分析需要看哪些关键指标&#xff1f; 销售管理分析时抓取关键指标&#xff0c;有着能够【分析和判断销售趋势、为销售决策提供数据支持、优化销售流程和客户管理】等的好处 在了解了分析关键指标的目的之后&#xff0c;我们就可以根据企业的需求来确定关键指标&…...

【Python】自动完成手写字体图片贴入以及盖章工具

简介 该工具完成了如下功能&#xff1a; 1.将文字转换为手写体填入到模板文件中 2.自动将文字转换为盖章格式填入到模板文件中 3.字体格式可以替换 4.有配置文件进行扩展功能 功能模块 1.界面模块 import sys from PyQt5.QtWidgets import QApplication, QMessageBox, QWid…...

基于Xml方式Bean的配置-初始化方法和销毁方法

SpringBean的配置详解 Bean的初始化和销毁方法配置 Bean在被实例化后&#xff0c;可以执行指定的初始化方法完成一些初始化的操作&#xff0c;Bean在销毁之前也可以执行指定的销毁方法完成一些操作&#xff0c;初始化方法名称和销毁方法名称通过 <bean id"userService…...

实时更新进度条:JavaScript中的定时器和异步编程技巧

前言 在Web开发中&#xff0c;有许多场景需要实时地更新页面上的进度&#xff0c;例如上传文件、数据处理等。本文将介绍如何利用JavaScript中的定时器和异步编程技巧来实现实时更新进度&#xff0c;并探讨一些其他解决方案。 处理进度实时更新&#xff1a; 利用异步编程实现实…...

【简单图论】CF898 div4 H

Problem - H - Codeforces 题意&#xff1a; 思路&#xff1a; 手玩一下样例就能发现简单结论&#xff1a; v 离它所在的树枝的根的距离 < m 离这个根的距离时是 YES 否则就是NO 实现就很简单&#xff0c;先去树上找环&#xff0c;然后找出这个根&#xff0c;分别给a 和…...

【大虾送书第十一期】适合新手自学的网络安全基础技能“蓝宝书”:《CTF那些事儿》

目录 &#x1f96e;写在前面 &#x1f96e;内容简介 &#x1f96e;读者对象 &#x1f96e;专家推荐 &#x1f96e;目录 &#x1f96e;文末福利 &#x1f990;博客主页&#xff1a;大虾好吃吗的博客 &#x1f990;专栏地址&#xff1a;免费送书活动专栏地址 写在前面 CTF比赛是快…...

IDEA安装离线插件后重启无法打开

解决方法 1.找到插件安装目录删除插件 插件的位置一般在C:\Users\19058\AppData\Roaming\JetBrains\IntelliJIdea2021.1\plugins 高亮部分是自己电脑的用户位置&#xff0c;把报错前的刚才最新安装的插件删除&#xff0c;再尝试打开idea即可解决该问题 2.补充说明 AppData是个隐…...

论软件的可靠性设计

摘要 2021年6月&#xff0c;我所在的公司中标某集团保险大数据平台一体化研发项目&#xff0c;该项目总投资2000万人民币&#xff0c;项目周期为2年&#xff0c;通过该项目&#xff0c;搭建该集团保险大数据平台&#xff0c;一方面将全国所有保险业务全部入库并保存&#xff0…...

AG35学习笔记(一):debug串口抓取模组log、debug串口测试AT指令、echo命令通过串口发送16进制数据

目录 一、概述二、抓取模组log2.1 硬件接口2.2 用户登录2.3 相关指令 三、测试AT指令3.1 查看端口3.2 进入模式 四、串口发16进制echo使用 一、概述 二、抓取模组log 在之前记录了通过USB&#xff0c;使用移远工具Qwinlog来抓取log&#xff08;3.3 抓取模组log&#xff09;。…...

【RuoYi】数据分页功能分析 —— 以登录日志页面为例

本文基于 RuoYi-Vue v3.8.2&#xff0c;以"监控 → 登录日志"页面为例&#xff0c;从前端代码、前端开发者工具、后端代码到后端 Log 输出&#xff0c;完整分析 RuoYi 框架中数据分页的实现原理。一、实例简介本次分析选取的含数据分页功能的页面为&#xff1a;系统管…...

从堆叠到双线性:手把手图解注意力机制的‘进化史’与PyTorch实现对比

从堆叠到双线性&#xff1a;手把手图解注意力机制的‘进化史’与PyTorch实现对比 在计算机视觉与自然语言处理的交叉领域&#xff0c;注意力机制早已从最初的简单加权求和发展为具有复杂交互能力的计算范式。本文将带您穿越注意力机制的进化长廊&#xff0c;通过PyTorch实战演示…...

AzurLaneAutoScript:解放双手的碧蓝航线智能自动化脚本

AzurLaneAutoScript&#xff1a;解放双手的碧蓝航线智能自动化脚本 【免费下载链接】AzurLaneAutoScript Azur Lane bot (CN/EN/JP/TW) 碧蓝航线脚本 | 无缝委托科研&#xff0c;全自动大世界 项目地址: https://gitcode.com/gh_mirrors/az/AzurLaneAutoScript 还在为《…...

2026亚洲消费电子展6月来袭,观众预登记

2026亚洲消费电子展筹备工作进入关键阶段&#xff0c;本届展会定于2026年6月10日至12日在北京举办&#xff0c;运营方赛逸品牌管理有限公司正式对外宣布&#xff0c;展会专业观众线上预约通道同步启动&#xff0c;行业采购人士、技术从业者及科研机构可提前完成预登记&#xff…...

CNAS实验室一份完整的质量手册需要包含哪些要素?一文教会质量手册编写

编写质量管理体系文件是CNAS实验室认证工作中非常重要的一个环节&#xff0c;实验室质量管理体系文件按照惯例&#xff0c;一般会分为四个层级&#xff0c;质量手册、程序文件、作业指导书和记录文件。实验室质量手册是实验室依据相关标准制定的纲领性文件&#xff0c;系统规定…...

【2026 最新】Web 安全完整学习指南 红队全套技能栈

0x00 技能栈 依照红队的流程分工&#xff0c;选择适合自己的技能栈发展。 越接近中心的能力点越贴近web技术栈&#xff0c;反之亦然。可以根据自身情况&#xff0c;选择技术栈的发展方向。 0x01 漏洞理解篇(Vulnerability) 1.1 前端 同源策略 & CSP & JOSNP 跨域…...

告别PCL!用Qt+QGLWidget手把手教你打造自己的3D点云查看器(附完整源码)

轻量级3D点云可视化&#xff1a;基于Qt与OpenGL的高效实现方案 在工业测量、自动驾驶和三维重建等领域&#xff0c;点云数据的可视化一直是开发者面临的挑战。传统方案如PCL虽然功能强大&#xff0c;但其庞大的体积和复杂的依赖链往往让项目变得臃肿。本文将展示如何利用Qt的QG…...

渗透测试中的Windows痕迹清理:从“删库跑路”到“雁过无痕”的反取证艺术

引子&#xff1a;想象一下武侠小说里的场景&#xff1a;绝顶高手在别人家的藏经阁偷学了绝世武功&#xff0c;临走时不但不留下一丝指纹&#xff0c;还顺手把烛台复原、抹平了地上的脚印&#xff0c;甚至故意丢下一枚别的门派的暗器——这&#xff0c;就是网络安全界“痕迹清理…...

LeetCode 每日一题笔记 日期:2026.05.19 题目:2540. 最小公共值

LeetCode 每日一题笔记 0. 前言 日期&#xff1a;2026.05.19题目&#xff1a;2540. 最小公共值难度&#xff1a;简单标签&#xff1a;数组、双指针、哈希表 1. 题目理解 问题描述&#xff1a; 给定两个按非降序排序的整数数组 nums1 和 nums2&#xff0c;请返回它们的最小公共整…...

Head Activator ;pPPGGSKVILF

一、基础信息多肽名称&#xff1a;头部激活因子三字母序列&#xff1a;Pyr-Pro-Pro-Gly-Gly-Ser-Lys-Val-Ile-Leu-Phe单字母序列&#xff1a;pPPGGSKVILF氨基酸数量&#xff1a;11 aa分子式&#xff1a;C54H84N12O14分子量&#xff1a;1125.34结构特征&#xff1a;N 端 Pyr&…...