前端新用户注册,登录,退出登录功能实现

article/2025/9/20 13:14:50

目录

新用户注册功能

用户登录功能

用户退出登录功能


新用户注册功能

基本思路:

将用户的信息通过接口存入数据库,接口会返回是否存入成功

使用elementui做表单验证

代码如下:

<template><div class="register"><el-form :model="ruleForm" status-icon :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm"><el-form-item label="用户名" prop="username"><el-input v-model="ruleForm.username"></el-input></el-form-item><el-form-item label="用户权限" prop="Auth"><el-input type="password" v-model="ruleForm.Auth"></el-input></el-form-item><el-form-item label="密码" prop="password"><el-input type="password" v-model="ruleForm.password" autocomplete="off"></el-input></el-form-item><el-form-item label="确认密码" prop="confirmPassword"><el-input type="password" v-model="ruleForm.confirmPassword" autocomplete="off"></el-input></el-form-item><el-form-item><el-button type="primary" @click="submitForm('ruleForm')">提交</el-button><el-button @click="resetForm('ruleForm')">重置</el-button></el-form-item></el-form></div>
</template>
<script>
import { register } from '../../api'
export default {data() {var checkName = (rule, value, callback) => {if (!value) {return callback(new Error('用户名不能为空'));} else {callback();}};var Auth = (rule, value, callback) => {if (!value) {return callback(new Error('权限不能为空'));} else {callback();}};var validatePass = (rule, value, callback) => {if (value === '') {callback(new Error('请输入密码'));} else {if (this.ruleForm.confirmPassword !== '') {this.$refs.ruleForm.validateField('confirmPassword');}callback();}};var validatePass2 = (rule, value, callback) => {if (value === '') {callback(new Error('请再次输入密码'));} else if (value !== this.ruleForm.password) {callback(new Error('两次输入密码不一致!'));} else {callback();}};return {ruleForm: {password: '',confirmPassword: '',username: '',Auth: ''},rules: {username: [{ validator: checkName, trigger: 'blur' }],Auth: [{ validator: Auth, trigger: 'blur'}],password: [{ validator: validatePass, trigger: 'blur' }],confirmPassword: [{ validator: validatePass2, trigger: 'blur' }],}};},methods: {submitForm(formName) {this.$refs[formName].validate(async (valid) => {if (valid) {register(this.ruleForm)} else {console.log('error submit!!');return false;}});},resetForm(formName) {this.$refs[formName].resetFields();}}
}
</script>
<style>
.register {height: 300px;width: 400px;
}
</style>

用户登录功能

基本思路:

将用户的登录信息传入接口,接口会返回一个用户的token,这个token是这个用户的唯一标识,当需要获取该用户的信息时,需要将token传入接口去获取数据。

运用vuex去调用接口

组件代码:

<template><div class="login"><el-form :model="ruleForm" status-icon :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm"><el-form-item label="用户名" prop="username"><el-input v-model="ruleForm.username"></el-input></el-form-item><el-form-item label="密码" prop="password"><el-input type="password" v-model="ruleForm.password" autocomplete="off"></el-input></el-form-item><el-form-item><el-button type="primary" @click="submitForm('ruleForm')">提交</el-button><el-button @click="resetForm('ruleForm')">重置</el-button></el-form-item></el-form></div>
</template>
<script>
export default {data() {var checkName = (rule, value, callback) => {if (!value) {return callback(new Error('用户名不能为空'));} else {callback();}};var validatePass = (rule, value, callback) => {if (value === '') {callback(new Error('请输入密码'));} else {if (this.ruleForm.confirmPassword !== '') {this.$refs.ruleForm.validateField('confirmPassword');}callback();}};return {ruleForm: {password: '',username: '',},rules: {username: [{ validator: checkName, trigger: 'blur' }],password: [{ validator: validatePass, trigger: 'blur' }],}};},mounted() {},methods: {//提交表单submitForm(formName) {this.$refs[formName].validate(async(valid) => {if (valid) {try {await this.$store.dispatch("login", this.ruleForm); //调用登录接口} catch (error) {console.log(error)}} else {console.log('error submit!!');return false;}});},//重置表单resetForm(formName) {this.$refs[formName].resetFields();},}
}
</script>
<style >
.login {height: 300px;width: 400px;
}
</style>

 基本思路:

1.由于vuex的数据存储并非持久化,当页面刷新时,数据就会丢失,所以采用localStorage本地存储将token存储起来。

2。localStorage的数据存储理论上讲是永久的,只要不主动清除就不会丢失。

组件代码:

<template><div class="login"><el-form :model="ruleForm" status-icon :rules="rules" ref="loginForm" label-width="100px" class="demo-ruleForm"><el-form-item label="用户名" prop="username"><el-input v-model="ruleForm.username"></el-input></el-form-item><el-form-item label="密码" prop="password"><el-input type="password" v-model="ruleForm.password" autocomplete="off"></el-input></el-form-item><el-form-item><el-button type="primary" @click="submitForm('loginForm')">提交</el-button><el-button @click="resetForm('loginForm')">重置</el-button></el-form-item></el-form></div>
</template>
<script>
export default {data() {var checkName = (rule, value, callback) => {if (!value) {return callback(new Error('用户名不能为空'));} else {callback();}};var validatePass = (rule, value, callback) => {if (!value) {return callback(new Error('用户名不能为空'));} else {callback();}};return {ruleForm: {password: '',username: '',},rules: {username: [{ validator: checkName, trigger: 'blur' }],password: [{ validator: validatePass, trigger: 'blur' }],}};},mounted() {},methods: {//提交表单submitForm(formName) {this.$refs[formName].validate(async(valid) => {if (valid) {try {await this.$store.dispatch("login", this.ruleForm); //调用登录接口} catch (error) {console.log(error)}} else {console.log('error submit!!');return false;}});},//重置表单resetForm(formName) {this.$refs[formName].resetFields();},}
}
</script>
<style >
.login {height: 300px;width: 400px;
}
</style>

vuex代码

import { reqLogin } from "@/api";
let Base64 = require('js-base64').Base64;
import { setToken, getToken, removeToken } from "@/utils/token"
const state = {token: getToken(),
};
const mutations = {//用户登录RWQLOGIN(state, token) {state.token = token;}
};
const actions = {//用户登录async login({ commit }, userInfo) {const { username } = userInfoconst { password } = userInfolet result = await reqLogin({username: Base64.encode(username),  //将用户名和密码加密处理password: Base64.encode(password)});if (result.code == 0) {commit("RWQLOGIN", result.data.token);//持久化存储tokensetToken(result.data.token);return "ok";} else {return Promise.reject(new Error("faile"));}},
};
const getters = {};
export default {state,mutations,actions,getters,
};

localStorage的数据存取

//存储token
export const setToken = (token) => {localStorage.setItem("TOKEN", token);};//获取tokenexport const getToken = () => {return localStorage.getItem("TOKEN");};//清除本地存储的tokenexport const removeToken=()=>{localStorage.removeItem("TOKEN");}

用户退出登录功能

基本思路:

1.调接口通知服务器清除用户的token(每次用户登录时,服务器都会派发一个新的token)。

2.清除本地存储的token

组件代码:

<template><div><el-tooltip content="点击退出登录" placement="top"><el-button class="iconfont icon-diannao button" @click="loginOut"></el-button></el-tooltip></div>
</template>
<script>
export default {data() {return {}},created() {},computed: {},methods: {//退出登录async loginOut() {try{await this.$store.dispatch("loginOut")}catch (error) {console.log(error)}}},
}
</script>
<style>
.button {border: none;
}
</style>

 vuex代码

  //退出登录async loginOut({ commit }) {let result = await reqlogout()if (result.code == 0) {//清除本地存储的数据commit("CLEAR")return "ok"} else {return Promise.reject(new Error("faile"));}}
  //清除本地数据CLEAR(state) {//帮仓库中先关用户信息清空state.token = '';//本地存储数据清空removeToken();}

http://chatgpt.dhexx.cn/article/iJOAs220.shtml

相关文章

Linux的登录和退出

1. 图形用户界面的登录和退出 图形用户界面&#xff0c;直接输入用户名密码即可登录。 在终端中输入init 0命令即可关闭系统。或者我们点击这里&#xff1a; 2.命令行界面登录和退出 Linux提供了6个虚拟控制台&#xff0c;通过按键盘CtrlAltF[1~6]来切换。如图&#xff0…

登录退出页面

一.登录业务流程 1、在登录页面输入用户名和密码 2、调用后台接口进行验证 3、通过验证之后,根据后台的响应状态跳转到项目主页 二.登录业务的相关技术点 1、http是无状态的 2、通过cookie在客户端记录状态 3、通过session在服务器端记录状态 4、通过token方式维持状态(解决跨…

token清除,退出登录

当我点击的时候&#xff0c;并没有打印任何地方应该打印的console.log(111),这时候应该检查一下自己的标签&#xff0c;我的错误在于a标签并没有删掉herf所以并没有出发点击事件&#xff0c;后面的这一切流程都没有走&#xff0c;但是我比较疑惑的一点是为啥之前并没有删掉herf…

Java退出登录功能

有志者&#xff0c;事竟成 文章持续更新&#xff0c;可以关注【小奇JAVA面试】第一时间阅读&#xff0c;回复【资料】获取福利&#xff0c;回复【项目】获取项目源码&#xff0c;回复【简历模板】获取简历模板&#xff0c;回复【学习路线图】获取学习路线图。 文章目录 一、登录…

十六、退出登录

用户只需要向Spring Security项目中发送/logout退出请求即可。 1.退出实现 实现退出非常简单&#xff0c;只要在页面中添加/logout的超链接即可。 <a href"/logout">退出登录 为了实现更好的效果&#xff0c;通常添加退出的配置。默认的退出url为/logout&#…

STM32CubeMX配置DCMI+DMA之OV2640

STM32CubeMX配置DCMIDMA之OV2640 本文章只讲解如何使用STM32CubeMX配置STM32外设&#xff0c;其他驱动代码请别处移植 一、设备及软件 1、keil 2、STM32CubeMX 3、正点原子STM32F407探索者开发板配OV2640 二、配置步骤 1、配置RCC外部晶振、SYS为SW模式和USART1&#xff0…

STM32 DCMI调试

之前调试一款摄像头没有仔细读stm32数据手册&#xff0c;用库函数写的&#xff0c;sensor的数据手册配置和dcmi配置的HSYNC和VSYN都是低电平有效&#xff0c;读摄像头sensor示波器波形也是低电平有效&#xff0c;但是数据就是读不出来。 摄像头HSYNC和VSYN信号&#xff1a; 之…

DCMI(数字图像接口)与OV2640 stm32

本文先介绍了摄像头模块OV2640&#xff0c;又介绍了DCMI。 最后讲解在stm32上相关代码。 一、OV2640 1.OV2640基本概念 CMOS SCCB&#xff0c;所有图像处理过程可以通过SCCB接口编程 IIC 支持按比例缩小(从SXGA到40*30的任何尺寸)&#xff0c;通过DSP转换成需要的任何尺寸 P…

第46章 DCMI—OV5640摄像头—零死角玩转STM32-F429系列

第46章 DCMI—OV5640摄像头 全套200集视频教程和1000页PDF教程请到秉火论坛下载&#xff1a;www.firebbs.cn 野火视频教程优酷观看网址&#xff1a;http://i.youku.com/firege 本章参考资料&#xff1a;《STM32F4xx参考手册》、《STM32F4xx规格书》、库帮助文档《stm32…

基于STM32CubeIDE的STM32H750 DCMI接口驱动OV2640读取JPEG结合自编上位机实现可以用的数字图传

基于STM32CubeIDE的STM32H750 DCMI接口驱动OV2640读取JPEG结合自编上位机实现可以用的数字图传 最近的一个小项目方案介绍硬件连接下位机程序部分使用串口助手进行测试 播放视频写在最后 最近的一个小项目 本人最近在设计一个无人机飞控&#xff0c;无人机还在学校呢&#xff…

【单片机开发】OV2640在没有DCMI接口的情况下的STM32驱动

文章目录 (一)背景介绍&#xff08;二&#xff09;接线&#xff08;三&#xff09;软件实现 (一)背景介绍 在之前刚学STM32的时候完成了一个ov7670的驱动 ov7670驱动 已经快要两年过去了&#xff0c;最近抽了一点时间又将之前搞得ov2640的驱动完善了一下 看一下效果吧。 &…

第45章 DCMI—OV2640摄像头—零死角玩转STM32-F429系列

第45章 DCMI—OV2640摄像头 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/firege 本章参考资料:《STM32F4xx参考手册》、《STM32F4xx规格书》、库帮助文档《stm32f4xx_dsp_stdperiph_lib_um.…

stm32cubeMx---DCMI 配置与使用

最近需要使用stm32的DCMI外设&#xff0c;所以经过一段时间研究后&#xff0c;对现有的学习状态进行记录&#xff1a; 1&#xff1a;stm32cube的pinout处进行无脑配置就行了&#xff0c;不进行描述。时钟配置按照自己的需求进行配置。DCMI的DMA配置如下图&#xff1a; 2&#…

通过stm32cubemx配置DCMI驱动ov5640摄像头

打开stm32cubemx选择芯片 选择外部时钟源 选择debug方式 配置dcmi 打开dma 打开dcmi中断 选择合适的io 设置reset、pwdn、scl、sda引脚&#xff0c;注意scl和sda设置为开漏输出&#xff0c;之前参考别人的设置为推挽输出&#xff0c;导致一直没有成功&#xff0c;不知道什么原…

DCMI接口与OV2640原理与配置

OV2640是OmniVision公司生产的一颗1/4寸的CMOS UXGA&#xff08;1632*1232&#xff09;图像传感器。该传感器体积小、工作电压低&#xff0c;提供单片UXGA摄像头和影像处理器的所有功能。通过SCCB 总线控制&#xff0c;可以输出整帧、子采样、缩放和取窗口等方式的各种分辨率8/…

STM32H743中的DCMI无法进入行中断和场中断问题

今天在玩MT9V034摄像头时&#xff0c;用到了DCMI接口处理摄像头的数据&#xff0c;出现了一个BUG&#xff0c;怎么都进入不了行中断或者场中断。究其原因&#xff0c;原来是忘记设置其中断优先级了。 void Msp_DCMI_Init(void) {GPIO_InitTypeDef GPIO_InitStruct;__HAL_RCC_DC…

STM32 DCMI OV9655 直接在LCD显示

CUBEMX配置DCMI如下&#xff1a; 生成代码。DCMI初始化代码如下&#xff1a; void HAL_DCMI_MspInit(DCMI_HandleTypeDef* hdcmi) {GPIO_InitTypeDef GPIO_InitStruct {0};if(hdcmi->InstanceDCMI){/* USER CODE BEGIN DCMI_MspInit 0 *//* USER CODE END DCMI_MspInit …

基于STM32F429的DCMI实现OV7725-NF无缓存摄像头的图像采集HAL库

基于STM32F429的OV7725-NF无缓存摄像头的DCMI图像采集 和LTDC显示 0. 首先说明一下时钟配置1. DCMI配置1.1 首先点击DCMI进入配置页面后&#xff0c;要选择Mode1.2 然后要进行GPIO settings1.3 然后是Parameter settings参数设置1.4 DMA settings1.5 需要使用的HAL库函数 3. OV…

stm32-DCMI—OV2640摄像头

第45章 DCMI—OV2640摄像头 全套200集视频教程和1000页PDF教程请到秉火论坛下载&#xff1a;www.firebbs.cn 野火视频教程优酷观看网址&#xff1a;http://i.youku.com/firege 本章参考资料&#xff1a;《STM32F4xx参考手册》、《STM32F4xx规格书》、库帮助文档《stm32f…

stm32f407的高速并口12位ad——dcmi方式

stm32f407的高速并口12位ad——dcmi方式 关于dcmi 我们可以利用这个摄像头接口&#xff0c;进行一个54M以下的并口ad的数据处理。 这个是dcmi的时序图&#xff0c;时钟使用mco1输出系统时钟四分频也就是42m&#xff0c;我的是ad9926&#xff0c;上升沿触发&#xff0c;那么ad…