Spring Boot 笔记 024 登录页面

1.1 登录接口

//导入request.js请求工具
import request from '@/utils/request.js'

//提供调用注册接口的函数
export const userRegisterService = (registerData)=>{
    //借助于UrlSearchParams完成传递
    const params = new URLSearchParams()
    for(let key in registerData){
        params.append(key,registerData[key]);
    }
    return request.post('/user/register',params);
}

//提供调用登录接口的函数
export const userLoginService = (loginData)=>{
    const params = new URLSearchParams();
    for(let key in loginData){
        params.append(key,loginData[key])
    }
    return request.post('/user/login',params)
}

2.1 编写页面

2.2 绑定数据模型并校验

2.3 清空表单内的数据

2.4 调用登录接口

```html
<script setup>
import { User, Lock } from '@element-plus/icons-vue'
import { ref } from 'vue'
//控制注册与登录表单的显示, 默认显示注册
const isRegister = ref(false)

//定义数据模型
const registerData = ref({
    username: '',
    password: '',
    rePassword: ''
})

//校验密码的函数
const checkRePassword = (rule, value, callback) => {
    if (value === '') {
        callback(new Error('请再次确认密码'))
    } else if (value !== registerData.value.password) {
        callback(new Error('请确保两次输入的密码一样'))
    } else {
        callback()
    }
}

//定义表单校验规则
const rules = {
    username: [
        { required: true, message: '请输入用户名', trigger: 'blur' },
        { min: 5, max: 16, message: '长度为5~16位非空字符', trigger: 'blur' }
    ],
    password: [
        { required: true, message: '请输入密码', trigger: 'blur' },
        { min: 5, max: 16, message: '长度为5~16位非空字符', trigger: 'blur' }
    ],
    rePassword: [
        { validator: checkRePassword, trigger: 'blur' }
    ]
}

//调用后台接口,完成注册
import { userRegisterService, userLoginService} from '@/api/user.js'
const register = async () => {
    //registerData是一个响应式对象,如果要获取值,需要.value
    let result = await userRegisterService(registerData.value);
    if (result.code === 0) {
        //成功了
        alert(result.msg ? result.msg : '注册成功');
    }else{
        //失败了
        alert('注册失败')
    } 
    //alert(result.msg ? result.msg : '注册成功');
    // ElMessage.success(result.msg ? result.msg : '注册成功')
}

//绑定数据,复用注册表单的数据模型
//表单数据校验
//登录函数
// import {useTokenStore} from '@/stores/token.js'
// import {useRouter} from 'vue-router'
// const router = useRouter()
// const tokenStore = useTokenStore();
const login =async ()=>{
    //调用接口,完成登录
   let result =  await userLoginService(registerData.value);
   if(result.code===0){
    alert(result.msg? result.msg : '登录成功')
   }else{
    alert('登录失败')
   } 
//    //alert(result.msg? result.msg : '登录成功')
//    ElMessage.success(result.msg ? result.msg : '登录成功')
//    //把得到的token存储到pinia中
//    tokenStore.setToken(result.data)
//    //跳转到首页 路由完成跳转
//    router.push('/')
}

//定义函数,清空数据模型的数据
const clearRegisterData = ()=>{
    registerData.value={
        username:'',
        password:'',
        rePassword:''
    }
}

</script>

<template>
    <el-row class="login-page">
        <el-col :span="12" class="bg"></el-col>
        <el-col :span="6" :offset="3" class="form">
            <!-- 注册表单 -->
            <el-form ref="form" size="large" autocomplete="off" v-if="isRegister" :model="registerData" :rules="rules">
                <el-form-item>
                    <h1>注册</h1>
                </el-form-item>
                <el-form-item prop="username">
                    <el-input :prefix-icon="User" placeholder="请输入用户名" v-model="registerData.username"></el-input>
                </el-form-item>
                <el-form-item prop="password">
                    <el-input :prefix-icon="Lock" type="password" placeholder="请输入密码"
                        v-model="registerData.password"></el-input>
                </el-form-item>
                <el-form-item prop="rePassword">
                    <el-input :prefix-icon="Lock" type="password" placeholder="请输入再次密码"
                        v-model="registerData.rePassword"></el-input>
                </el-form-item>
                <!-- 注册按钮 -->
                <el-form-item>
                    <el-button class="button" type="primary" auto-insert-space @click="register">
                        注册
                    </el-button>
                </el-form-item>
                <el-form-item class="flex">
                    <el-link type="info" :underline="false" @click="isRegister = false;clearRegisterData()">
                        ← 返回
                    </el-link>
                </el-form-item>
            </el-form>
            <!-- 登录表单 -->
            <el-form ref="form" size="large" autocomplete="off" v-else :model="registerData" :rules="rules">
                <el-form-item>
                    <h1>登录</h1>
                </el-form-item>
                <el-form-item prop="username">
                    <el-input :prefix-icon="User" placeholder="请输入用户名" v-model="registerData.username"></el-input>
                </el-form-item>
                <el-form-item prop="password">
                    <el-input name="password" :prefix-icon="Lock" type="password" placeholder="请输入密码" v-model="registerData.password"></el-input>
                </el-form-item>
                <el-form-item class="flex">
                    <div class="flex">
                        <el-checkbox>记住我</el-checkbox>
                        <el-link type="primary" :underline="false">忘记密码?</el-link>
                    </div>
                </el-form-item>
                <!-- 登录按钮 -->
                <el-form-item>
                    <el-button class="button" type="primary" auto-insert-space @click="login">登录</el-button>
                </el-form-item>
                <el-form-item class="flex">
                    <el-link type="info" :underline="false" @click="isRegister = true;clearRegisterData()">
                        注册 →
                    </el-link>
                </el-form-item>
            </el-form>
        </el-col>
    </el-row>
</template>

<style lang="scss" scoped>
/* 样式 */
.login-page {
    height: 100vh;
    background-color: #fff;

    .bg {
        background: url('@/assets/logo2.png') no-repeat 60% center / 240px auto,
            url('@/assets/login_bg.jpg') no-repeat center / cover;
        border-radius: 0 20px 20px 0;
    }

    .form {
        display: flex;
        flex-direction: column;
        justify-content: center;
        user-select: none;

        .title {
            margin: 0 auto;
        }

        .button {
            width: 100%;
        }

        .flex {
            width: 100%;
            display: flex;
            justify-content: space-between;
        }
    }
}
</style>
```

3.1 修改响应拦截器以及提示框

//定制请求的实例

//导入axios  npm install axios
import axios from 'axios';
import { ElMessage } from 'element-plus'
//定义一个变量,记录公共的前缀  ,  baseURL
const baseURL = '/api';
const instance = axios.create({baseURL})


//添加响应拦截器
instance.interceptors.response.use(
    result=>{
        if(result.data.code===0){
            return result.data;
        }

        ElMessage.error(result.data.msg?result.data.msg:'服务异常')

        return Promise.reject(result.data)
        
    },
    err=>{
        alert('服务异常');
        return Promise.reject(err);//异步的状态转化成失败的状态
    }
)

export default instance;

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

51-2 万字长文,深度解读端到端自动驾驶的挑战和前沿

去年初&#xff0c;我曾打算撰写一篇关于端到端自动驾驶的文章&#xff0c;发现大模型在自动驾驶领域的尝试案例并不多。遂把议题扩散了一点&#xff0c;即从大模型开始&#xff0c;逐渐向自动驾驶垂直领域靠近&#xff0c;最后落地到端到端。这样需要阐述的内容就变成LLM基础模…

CyberDAO:web3时代的引领者

Web3.0正在改写着世界运行的规则&#xff0c;AGI将为人类未来的生产效率、工作方式与目标带来改变&#xff0c;区块链经过十余年发展开启了去中心化新格局&#xff0c;带来生产关系的变革。人类正在从过往以时间换取收入、听命完成工作&#xff0c;转变为以个性化、自主追求人生…

广西物理杂志广西物理杂志社广西物理编辑部2024年第3期目录

专题论析 石笋中放射性核素高纯锗分析方法 王一飞;杨济瑜;欧阳河;梁芳;韦尚佑;沈洪涛; 1-6 基于机器学习方法的快速射电暴分类研究 孙万鹏;张富文; 7-1623《广西物理》投稿&#xff1a;cn7kantougao163.com 基于STM32的简易数字示波器设计 庞成康;黎海明;舒向航;李…

【web安全】渗透测试实战思路

步骤一&#xff1a;选目标 1. 不建议太小的公司&#xff08;可能都是请别人来开发的&#xff0c;用现成成熟的框架&#xff09; 2. 不建议一线大厂&#xff1a;腾讯&#xff0c;字节&#xff0c;阿里等&#xff0c;你懂的 3. 不建议政府部门&#xff0c;安全设备多&#xff…

java日志框架总结(六、logback日志框架 扩展)

springboot推荐使用logback-spring.xml而不是logback.xml而logback-spring.xml文件与logback.xml文件还是有一定的区别&#xff0c;所以简单讲解一下。 一、logback-spring.xml 配置文件实例&#xff1a; <?xml version"1.0" encoding"UTF-8"?> …

【探索】flutter3.x仿微信桌面版EXE

为了探索flutter3桌面端更多开发可能性&#xff0c;最近正在开发一款flutter3.xdart3仿微信exe客户端聊天项目。 flutter-winchat支持最大化/最小化/关闭功能 点击用户头像&#xff0c;卡片展示信息 消息列表&#xff0c;右键弹出操作菜单 整个项目采用最新版flutter3/dart3开…

【JavaEE】_线程安全

目录 1. 线程不安全问题 2. 线程不安全的原因 3. 解决线程不安全问题 1. 线程不安全问题 线程安全问题是多线程编程必须考虑的重要问题&#xff0c;也因为其难以理解与处理&#xff0c;故而程序员也尝试发明更多的编程模型来处理并发编程&#xff0c;如多进程、多线程、act…

m4v如何转换成mp4?这4个转换方法总结好了

M4V是一种常见的视频格式&#xff0c;特别是在苹果设备上。然而&#xff0c;有时候我们可能需要将M4V文件转换成MP4格式&#xff0c;以便在不同的设备和软件上播放。m4v如何转换成mp4&#xff1f;本文为你总结了4个简单易行的转换方法&#xff0c;让你轻松实现格式转换。无论你…

FPGA 高速接口(LVDS)

差分信号环路测试 1 概述 LVDS&#xff08;Low Voltage Differential Signalin&#xff09;是一种低振幅差分信号技术。它使用幅度非常低的信号&#xff08;约350mV&#xff09;通过一对差分PCB走线或平衡电缆传输数据。大部分高速数据传输中&#xff0c;都会用到LVDS传输。 …

Python自动化测试之异常处理机制知识讲解

一、前言 今天笔者还是想要讲python中的基础&#xff0c;主要讲解Python中异常介绍、捕获、处理相关知识点内容&#xff0c;只有学好了这些才能为后续自动化测试框架搭建及日常维护做铺垫&#xff0c;废话不多说我们直接进入主题吧。 二、异常处理合集 2.1 异常处理讲解 在…

数据库||数据库的安全性

1.实验题目&#xff1a;数据库的安全性 2.实验目的和要求&#xff1a; 掌握SQL Server 2008的安全控制机制掌握SQL Server2008的身份验证模式理解数据库用户帐户的基本概念理解角色的概念 3.实验步骤&#xff1a; 按实验内容要求完成各项操作根据题目要求给出解决方案提交实…

如何找回丢失照片? 7 种免费照片恢复方法分享

照片可以勾起回忆&#xff0c;让我们想起与最亲近的人一起度过的时光&#xff0c;这就是为什么仅仅丢失一张重要照片就会让人感觉完全毁灭性的——几乎就像你失去了记忆本身一样。好消息是&#xff0c;大多数丢失或意外删除的照片都可以使用照片恢复软件恢复&#xff0c;而且我…

appium实现自动化测试原理

目录 1、Appium原理 1.1、Android Appium原理图文解析 1.1.2、原理详解 1.1.2.1、脚本端 1.1.2.2、appium-server 1.1.2.3、中间件bootstrap.jar 1.1.2.4、驱动引擎uiautomator 1.2、 IOS Appium原理 1、Appium原理 1.1、Android Appium原理图文解析 执行测试脚本全过…

IDEA-常用插件

1、Mybatis Log Free 当我们使用mybatis log在控制台输出sql 内容&#xff0c;输出内容将语句与参数分开打印&#xff0c;还需要手动将参数替换到指定位置。 使用对应插件后&#xff0c;自动将输出内容组装成完整的可直接执行的SQL 在插件市场 查看对应名称&#xff0c;并安装。…

Postman路径修改

默认安装好Postman之后&#xff0c;默认路径在&#xff1a;C:\Users\用户名\AppData\Local\Postman。 修改路径只需要将整个文件夹拷贝到需要移动的位置即可&#xff0c;然后重新创建一个快捷方式。再删除原来路径的文件夹。

【Java EE初阶十八】网络原理(三)

3. 网络层 网络层要做的事情主要是两方面&#xff1a; 1)、地址管理&#xff1a;制定一系列的规则,通过地址,描述出网络上一个设备的位置&#xff1b; 2)、路由选择&#xff1a;网络环境是比较复杂的&#xff0c;从一个节点到另一个节点之间&#xff0c;存在很…

2024阅读AOSP源码的正确打开姿势

2024阅读AOSP源码的正确打开姿势 在Android系统开发中&#xff0c;阅读AOSP&#xff08;Android Open Source Project&#xff09;源码是非常重要的环节。然而&#xff0c;如何构建一个优雅的阅读环境却是一个不容忽视的问题。本文将介绍不同工具和方法下阅读AOSP源码的正确姿…

渲染效果图为什么都选择使用云渲染,优势有哪些?

随着3D技术在动画、电影、游戏、建筑等领域的广泛应用&#xff0c;渲染作为3D制作流程中的重要环节&#xff0c;其效率和成本直接影响着项目的最终成果。 近年来&#xff0c;云渲染技术的兴起为3D创作者提供了一种全新的选择&#xff0c;与传统的本地渲染相比&#xff0c;云渲…

【Wio Terminal】输入/输出

输入/输出 一、概述1、硬件原理图Terminal引脚分布及功能Wio Terminal Grove端口引脚分配 二、使用Wio Terminal上的Grove模拟端口1、RPI 模拟引脚2、Grove引脚配置3、示例 三、使用 Wio Terminal上的Grove数字端口1、RPI 数字引脚2、Grove引脚配置将 Grove I2C 端口用作数字端…

数据结构1.0(基础)

近java的介绍&#xff0c; 文章目录 第一章、数据结构1、数据结构 &#xff1f;2、常用的数据结构数据结构&#xff1f; 逻辑结构and物理结构 第二章、数据结构基本介绍2.1、数组&#xff08;Array&#xff09;2.2、堆栈&#xff08;Stack&#xff09;2.3、队列&#xff08;Que…
最新文章