前端注册登录

前端注册登录

设计

  1. 登录,注册,都写成组件 ⇢ \dashrightarrow 在任意页面中,都能点击显示登录模态框
  2. 写好的组件,应该放在那个组件中 ⇢ \dashrightarrow 不是页面组件(小组件)
  3. 击登录按钮,把Login.vue 通过定位,占满全屏,透明度设为 0.5 ,纯黑色悲剧,覆盖在组件上
  4. 在Login.vue点关闭,要把Login.vue隐藏起来,父子通信之子传父,自定义事件

Header组件

<template><div class="header"><div class="slogan"><p>老男孩IT教育 | 帮助有志向的年轻人通过努力学习获得体面的工作和生活</p></div><div class="nav"><ul class="left-part"><li class="logo"><router-link to="/"><img src="../assets/img/head-logo.svg" alt=""></router-link></li><li class="ele"><span @click="goPage('/free-course')" :class="{active: url_path === '/free-course'}">免费课</span></li><li class="ele"><span @click="goPage('/actual-course')" :class="{active: url_path === '/actual-course'}">实战课</span></li><li class="ele"><span @click="goPage('/light-course')" :class="{active: url_path === '/light-course'}">轻课</span></li></ul><div class="right-part"><div v-if="!username"><span @click="handleLogin">登录</span><span class="line">|</span><span @click="handleRegister">注册</span></div><div v-else><span>{{ username }}</span><span class="line">|</span><span @click="logOut">注销</span></div></div><Login v-if="loginShow" @close="handleClose" @success="success_login" @go="go_register"></Login><Register v-if="registerShow" @close="handleRegisterClose" @success="success_register"@go="success_register"></Register></div></div></template>
<script>
import Login from "@/components/Login.vue";
import Register from "@/components/Register.vue";export default {name: "Header",data() {return {url_path: sessionStorage.url_path || '/',loginShow: false,registerShow: false,username: '',token: ''}},methods: {handleRegister() {this.registerShow = true},handleRegisterClose() {this.registerShow = false},success_register() {this.registerShow = falsethis.loginShow = true},go_register() {this.registerShow = truethis.loginShow = false},logOut() {this.username = ''this.token = ''this.$cookies.remove('username')this.$cookies.remove('token')},goPage(url_path) {// 已经是当前路由就没有必要重新跳转if (this.url_path !== url_path) {this.$router.push(url_path);}sessionStorage.url_path = url_path;},handleLogin() {this.loginShow = true},handleClose() {this.loginShow = false},success_login(data) {this.loginShow = false;  // 模态框消耗this.username = data.username;this.token = data.token;}},created() {sessionStorage.url_path = this.$route.path;this.url_path = this.$route.path;this.username = this.$cookies.get('username')},components: {Register,Login}
}
</script><style scoped>
.header {background-color: white;box-shadow: 0 0 5px 0 #aaa;
}.header:after {content: "";display: block;clear: both;
}.slogan {background-color: #eee;height: 40px;
}.slogan p {width: 1200px;margin: 0 auto;color: #aaa;font-size: 13px;line-height: 40px;
}.nav {background-color: white;user-select: none;width: 1200px;margin: 0 auto;}.nav ul {padding: 15px 0;float: left;
}.nav ul:after {clear: both;content: '';display: block;
}.nav ul li {float: left;
}.logo {margin-right: 20px;
}.ele {margin: 0 20px;
}.ele span {display: block;font: 15px/36px '微软雅黑';border-bottom: 2px solid transparent;cursor: pointer;
}.ele span:hover {border-bottom-color: orange;
}.ele span.active {color: orange;border-bottom-color: orange;
}.right-part {float: right;
}.right-part .line {margin: 0 10px;
}.right-part span {line-height: 68px;cursor: pointer;
}
</style>

Login组件

<template><div class="login"><div class="box"><i class="el-icon-close" @click="close_login"></i><div class="content"><div class="nav"><span :class="{active: login_method === 'is_pwd'}" @click="change_login_method('is_pwd')">密码登录</span><span :class="{active: login_method === 'is_sms'}" @click="change_login_method('is_sms')">短信登录</span></div><el-form v-if="login_method === 'is_pwd'"><el-inputplaceholder="用户名/手机号/邮箱"prefix-icon="el-icon-user"v-model="username"clearable></el-input><el-inputplaceholder="密码"prefix-icon="el-icon-key"v-model="password"clearableshow-password></el-input><el-button type="primary" @click="login">登录</el-button></el-form><el-form v-if="login_method === 'is_sms'"><el-inputplaceholder="手机号"prefix-icon="el-icon-phone-outline"v-model="mobile"clearable@blur="check_mobile"></el-input><el-inputplaceholder="验证码"prefix-icon="el-icon-chat-line-round"v-model="sms"clearable><template slot="append"><span class="sms" @click="send_sms">{{ sms_interval }}</span></template></el-input><el-button @click="mobile_login" type="primary">登录</el-button></el-form><div class="foot"><span @click="go_register">立即注册</span></div></div></div></div>
</template><script>
export default {name: "Login",data() {return {username: '',password: '',mobile: '',sms: '',  // 验证码login_method: 'is_pwd',sms_interval: '获取验证码',is_send: false,}},methods: {close_login() {this.$emit('close')},go_register() {this.$emit('go')},change_login_method(method) {this.login_method = method;},check_mobile() {if (!this.mobile) return;// js正则:/正则语法/// '字符串'.match(/正则语法/)if (!this.mobile.match(/^1[3-9][0-9]{9}$/)) {this.$message({message: '手机号有误',type: 'warning',duration: 1000,onClose: () => {this.mobile = '';}});return false;}// 后台校验手机号是否已存在this.$axios({url: this.$settings.BASE_URL + 'user/mobile/check_mobile/?mobile=' + this.mobile,method: 'get',}).then(response => {if (response.data.code == 100) {this.$message({message: '账号正常,可以发送短信',type: 'success',duration: 1000,});// 发生验证码按钮才可以被点击this.is_send = true;} else {this.$message({message: '账号不存在',type: 'warning',duration: 1000,onClose: () => {this.mobile = '';}})}}).catch(() => {});},send_sms() {// this.is_send必须允许发生验证码,才可以往下执行逻辑if (!this.is_send) return;// 按钮点一次立即禁用this.is_send = false;let sms_interval_time = 60;this.sms_interval = "发送中...";// 定时器: setInterval(fn, time, args)// 往后台发送验证码this.$axios({url: this.$settings.BASE_URL + 'user/mobile/send_sms/',method: 'post',data: {mobile: this.mobile}}).then(response => {if (response.data.code == 100) { // 发送成功let timer = setInterval(() => {if (sms_interval_time <= 1) {clearInterval(timer);this.sms_interval = "获取验证码";this.is_send = true; // 重新回复点击发送功能的条件} else {sms_interval_time -= 1;this.sms_interval = `${sms_interval_time}秒后再发`;}}, 1000);} else {  // 发送失败this.sms_interval = "重新获取";this.is_send = true;this.$message({message: '短信发送失败',type: 'warning',duration: 3000});}}).catch(() => {this.sms_interval = "频率过快";this.is_send = true;})},login() {if (!(this.username && this.password)) {this.$message({message: '请填好账号密码',type: 'warning',duration: 1500});return false  // 直接结束逻辑}this.$axios({url: this.$settings.BASE_URL + 'user/login/mul_login/',method: 'post',data: {username: this.username,password: this.password,}}).then(response => {let username = response.data.username;let token = response.data.token;this.$cookies.set('username', username, '7d');this.$cookies.set('token', token, '7d');this.$emit('success', response.data);}).catch(error => {console.log(error.response.data)})},mobile_login() {if (!(this.mobile && this.sms)) {this.$message({message: '请填好手机与验证码',type: 'warning',duration: 1500});return false  // 直接结束逻辑}this.$axios({url: this.$settings.BASE_URL + 'user/login/sms_login/',method: 'post',data: {mobile: this.mobile,code: this.sms,}}).then(response => {if (response.data.code == 100) {let username = response.data.username;let token = response.data.token;this.$cookies.set('username', username, '7d');this.$cookies.set('token', token, '7d');this.$emit('success', response.data);} else {this.$message({message: '登录失败',type: 'warning',duration: 1500});}}).catch(error => {console.log(error.response.data)})}}
}
</script><style scoped>
.login {width: 100vw;height: 100vh;position: fixed;top: 0;left: 0;z-index: 10;background-color: rgba(0, 0, 0, 0.5);
}.box {width: 400px;height: 420px;background-color: white;border-radius: 10px;position: relative;top: calc(50vh - 210px);left: calc(50vw - 200px);
}.el-icon-close {position: absolute;font-weight: bold;font-size: 20px;top: 10px;right: 10px;cursor: pointer;
}.el-icon-close:hover {color: darkred;
}.content {position: absolute;top: 40px;width: 280px;left: 60px;
}.nav {font-size: 20px;height: 38px;border-bottom: 2px solid darkgrey;
}.nav > span {margin: 0 20px 0 35px;color: darkgrey;user-select: none;cursor: pointer;padding-bottom: 10px;border-bottom: 2px solid darkgrey;
}.nav > span.active {color: black;border-bottom: 3px solid black;padding-bottom: 9px;
}.el-input, .el-button {margin-top: 40px;
}.el-button {width: 100%;font-size: 18px;
}.foot > span {float: right;margin-top: 20px;color: orange;cursor: pointer;
}.sms {color: orange;cursor: pointer;display: inline-block;width: 70px;text-align: center;user-select: none;
}
</style>

## Register注册组件
<template><div class="register"><div class="box"><i class="el-icon-close" @click="close_register"></i><div class="content"><div class="nav"><span class="active">新用户注册</span></div><el-form><el-inputplaceholder="手机号"prefix-icon="el-icon-phone-outline"v-model="mobile"clearable@blur="check_mobile"></el-input><el-inputplaceholder="密码"prefix-icon="el-icon-key"v-model="password"clearableshow-password></el-input><el-inputplaceholder="验证码"prefix-icon="el-icon-chat-line-round"v-model="sms"clearable><template slot="append"><span class="sms" @click="send_sms">{{ sms_interval }}</span></template></el-input><el-button @click="register" type="primary">注册</el-button></el-form><div class="foot"><span @click="go_login">立即登录</span></div></div></div></div>
</template><script>
export default {name: "Register",data() {return {mobile: '',password: '',sms: '',sms_interval: '获取验证码',is_send: false,}},methods: {close_register() {this.$emit('close', false)},go_login() {this.$emit('go')},check_mobile() {if (!this.mobile) return;// js正则:/正则语法/// '字符串'.match(/正则语法/)if (!this.mobile.match(/^1[3-9][0-9]{9}$/)) {this.$message({message: '手机号有误',type: 'warning',duration: 1000,onClose: () => {this.mobile = '';}});return false;}// 后台校验手机号是否已存在this.$axios({url: this.$settings.BASE_URL + 'user/mobile/check_mobile/?mobile='+this.mobile,method: 'get',}).then(response => {if (response.data.code!=100) {this.$message({message: '欢迎注册我们的平台',type: 'success',duration: 1500,});// 发生验证码按钮才可以被点击this.is_send = true;} else {this.$message({message: '账号已存在,请直接登录',type: 'warning',duration: 1500,})}}).catch(() => {});},send_sms() {// this.is_send必须允许发生验证码,才可以往下执行逻辑if (!this.is_send) return;// 按钮点一次立即禁用this.is_send = false;let sms_interval_time = 60;this.sms_interval = "发送中...";// 定时器: setInterval(fn, time, args)// 往后台发送验证码this.$axios({url: this.$settings.BASE_URL + 'user/mobile/send_sms/',method: 'post',data: {mobile: this.mobile}}).then(response => {if (response.data.code==100) { // 发送成功let timer = setInterval(() => {if (sms_interval_time <= 1) {clearInterval(timer);this.sms_interval = "获取验证码";this.is_send = true; // 重新回复点击发送功能的条件} else {sms_interval_time -= 1;this.sms_interval = `${sms_interval_time}秒后再发`;}}, 1000);} else {  // 发送失败this.sms_interval = "重新获取";this.is_send = true;this.$message({message: '短信发送失败',type: 'warning',duration: 3000});}}).catch(() => {this.sms_interval = "频率过快";this.is_send = true;})},register() {if (!(this.mobile && this.sms && this.password)) {this.$message({message: '请填好手机、密码与验证码',type: 'warning',duration: 1500});return false  // 直接结束逻辑}this.$axios({url: this.$settings.BASE_URL + 'user/register/register/',method: 'post',data: {mobile: this.mobile,code: this.sms,password: this.password}}).then(response => {this.$message({message: '注册成功,3秒跳转登录页面',type: 'success',duration: 3000,showClose: true,onClose: () => {// 去向成功页面this.$emit('success')}});}).catch(error => {this.$message({message: '注册失败,请重新注册',type: 'warning',duration: 1500,showClose: true,onClose: () => {// 清空所有输入框this.mobile = '';this.password = '';this.sms = '';}});})}}
}
</script><style scoped>
.register {width: 100vw;height: 100vh;position: fixed;top: 0;left: 0;z-index: 10;background-color: rgba(0, 0, 0, 0.3);
}.box {width: 400px;height: 480px;background-color: white;border-radius: 10px;position: relative;top: calc(50vh - 240px);left: calc(50vw - 200px);
}.el-icon-close {position: absolute;font-weight: bold;font-size: 20px;top: 10px;right: 10px;cursor: pointer;
}.el-icon-close:hover {color: darkred;
}.content {position: absolute;top: 40px;width: 280px;left: 60px;
}.nav {font-size: 20px;height: 38px;border-bottom: 2px solid darkgrey;
}.nav > span {margin-left: 90px;color: darkgrey;user-select: none;cursor: pointer;padding-bottom: 10px;border-bottom: 2px solid darkgrey;
}.nav > span.active {color: black;border-bottom: 3px solid black;padding-bottom: 9px;
}.el-input, .el-button {margin-top: 40px;
}.el-button {width: 100%;font-size: 18px;
}.foot > span {float: right;margin-top: 20px;color: orange;cursor: pointer;
}.sms {color: orange;cursor: pointer;display: inline-block;width: 70px;text-align: center;user-select: none;
}
</style>

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Flutter之Json序列化

前言 使用 json_annotation 框架实现json字符串序列化和反序列化 框架官方地址&#xff1a;json_serializable 一、引入依赖&#xff1a;在pubspec.yaml中添加 dependencies:json_annotation: ^4.8.1dev_dependencies:build_runner: ^2.3.3json_serializable: ^6.6.0 二、…

深入理解JVM虚拟机第二十四篇:详解JVM当中的动态链接和常量池的作用

大神链接&#xff1a;作者有幸结识技术大神孙哥为好友&#xff0c;获益匪浅。现在把孙哥视频分享给大家。 孙哥链接&#xff1a;孙哥个人主页 作者简介&#xff1a;一个颜值99分&#xff0c;只比孙哥差一点的程序员 本专栏简介&#xff1a;话不多说&#xff0c;让我们一起干翻J…

在虚拟环境下安装python包

PyCharm可以自己给项目创建虚拟环境&#xff0c;示例如下&#xff1a; 首先通过File—>Setting—>Project&#xff1a;【项目名称】—>Project Interpreter—>设置—>add—>Virtuallenv Environment配置虚拟环境即可 添加解释器&#xff1a; 当创建虚拟环…

sqli-labs关卡13(基于post提交的单引号加括号的报错盲注)通关思路

文章目录 前言一、回顾第十二关知识点二、靶场第十三关通关思路1、判断注入点2、爆显位3、爆数据库名4、爆数据库表5、爆数据库列6、爆数据库关键信息 总结 前言 此文章只用于学习和反思巩固sql注入知识&#xff0c;禁止用于做非法攻击。注意靶场是可以练习的平台&#xff0c;…

c++范围for语句

语法格式 for(declaration:expression)statement 基本使用 遍历输出 vector<int> nums { 1,2,3,4,5}; for (int num : nums) {num;cout << num << " "; } cout << endl; 遍历时修改 vector<int> nums { 1,2,3,4,5}; for (int&…

浏览器Cookie是什么?如何在MaskFog指纹浏览器中导入Cookie?

在使用互联网时我们常常听到cookie这个词&#xff0c;那到底什么是cookie呢&#xff1f; Cookie是某些网站为了辨别用户身份而储存在用户本地终端上的数据&#xff08;通常经过加密&#xff09;&#xff0c;由用户客户端计算机暂时或永久保存的信息客户端向服务器发起请求&…

Python使用带账密的Socks5代理

测试代码如下 import requestsip 146.78.85.145 port 9527 username ********* password ********* proxies {http: fsocks5://{username}:{password}{ip}:{port},https: fsocks5://{username}:{password}{ip}:{port} } print(proxies) body requests.get("https:/…

OpenCV中更稳更快的边缘检测方法,快速查找线、圆、椭圆--EdgeDrawing-C++代码

计算机视觉之家看到快速圆检测Edge Drawing&#xff0c;其效果比霍夫要好&#xff0c;速度更快&#xff08;具体效果可以参考视觉之家的文章&#xff09;&#xff0c;上面C代码不全&#xff0c;那么好的检测效果国内资料竟然那么少&#xff0c;后在opencv的开发文档中找到了C代…

C++中的四种构造函数

在C中&#xff0c;有几种不同类型的构造函数&#xff0c;基于它们的特性和用途&#xff0c;可以将它们分类为以下四种&#xff1a; 默认构造函数&#xff08;Default Constructor&#xff09;: 如果没有为类定义任何构造函数&#xff0c;编译器将为其提供一个默认构造函数。这种…

基于单片机的塑料厂房气体检测系统设计

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 技术交流认准下方 CSDN 官方提供的联系方式 文章目录 概要 一、设计的主要内容二、系统硬件设计三、软件设计实物 四、结论五、 文章目录 概要 本文首先分析了基于单片机的可燃…

【计算机网络】UDP协议

UDP的结构 我们学习一个协议最主要的就是理解它的报文格式&#xff0c;对于UDP协议来说 我们看下面的这张图。 16位UDP长度&#xff0c;表示整个数据报&#xff08;UDP首部UDP数据&#xff09;的最大长度。UDP报文长度占两个字节&#xff0c;16位表示的数据范围&#xff08;0-…

java数据结构--二叉树

目录 一.概念 二.构建二叉树节点类TreeNode 三.二叉树的遍历 1.前序遍历preOrder 2.中序遍历medOrder 3.后序遍历postOrder 4.非递归遍历 三.深度 1.概念 2.递归求最大深度 3.层序遍历加队列求最大深度 4.测试 5.递归求最小深度 6.层序遍历加队列求最小深度 7.测试 四…

【保姆级教程】Linux安装JDK8

本文以centos7为例&#xff0c;一步一步进行jdk1.8的安装。 1. 下载安装 官网下载链接&#xff1a; https://www.oracle.com/cn/java/technologies/downloads/#java8 上传jdk的压缩包到服务器的/usr/local目录下 在当前目录解压jdk压缩包&#xff0c;如果是其它版本&#xf…

设计模式 -- 代理模式(Proxy Pattern)

代理模式&#xff1a;一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。 在代理模式中&#xff0c;我们创建具有现有对象的对象&#xff0c;以便向外界提供功能接口。 介绍 意图&#xff1a;为其他对象提供一种代理以控制对这个对象的访问。主要解决问题&#xf…

基于LoongArch指令集-五级流水线CPU 乘除法指令的添加

调用Xilinx IP实现乘除法运算部件 调用Xilinx IP实现乘法运算部件 wire [31:0] src1,src2; wire [63:0] unsigned_prod; wire [63:0] signed_prod;assign unsigned_prod src1*src2; assign signed_prod $signed(src1)*$signed(src2);调用 Xilinx IP 实现除法运算部件 在工程…

Trie 前缀树 字典树

PreFix Tree 二叉树 的每个节点只有两个孩子,那如果每个节点可以有多个孩子呢?这就形成了「多叉树」。多叉树的子节点数目一般不是固定的,所以会用变长数组来保存所有的子节点的指针。 「前缀树」是一种特殊的多叉树,它的 TrieNode 中 chidren 是一个大小为 26 的一维数组…

自压缩llm 为 超长记忆

自压缩llm 为 超长记忆 解释数据处理实际例子解释 # 自压缩llm 为 超长记忆 # prompt 格式 # <|细颗粒词表|><|粗颗粒词表|><|细颗粒词表|> # 细颗粒词表 = 词1,词2,词3,词4,词5,词6,词7,词8,词9,词10, # 组颗粒词表id1, 组颗粒词表id2, 组颗粒…

一篇博客读懂队列——Queue

目录 一、队列的概念和结构 ​二、队列的实现 2.1队列的初始化QueueInit 2.2队列的摧毁QueueDestroy 2.3插入结点QueuePush 2.4删除结点QueuePop 2.5返回队头QueueFront 2.6返回队尾QueueBack 2.7判断队列为空QueueEmpty 2.8统计队列数目QueueSize 一、队列的概念和…

C#动态数据类型

static void Main(string[] args){dynamic point new {x 15,y 10};DrwaPoint(point);System.Console.Read();}static void DrwaPoint(dynamic point) >System.Console.WriteLine($"x:{point.x},y:{point.y}");

【nlp】1.4 文本特征处理(n-gram特征、文本长度规范:补齐与截断)

文本特征处理 1 什么是n-gram特征2 文本长度规范及其作用文本特征处理的作用: 文本特征处理包括为语料添加具有普适性的文本特征,如:n-gram特征,以及对加入特征之后的文本语料进行必要的处理, 如: 长度规范。这些特征处理工作能够有效的将重要的文本特征加入模型训练中,增强…