木字楠后台管理系统开发(5):Vue登陆界面编写以及与后台联调测试

news2024/11/25 15:34:53

在这里插入图片描述


🎶 文章简介:木字楠后台管理系统开发(5):Vue登陆界面编写以及与后台联调测试
💡 创作目的:为了带大家完整的体验木字楠后台管理系统模版的开发流程
☀️ 今日天气:愿冷空气冷藏你的烦恼,让快乐永驻。
📝 每日一言:即使无法掌握未来,也请不要忘了明天。


文章目录

  • 🍕 1、登陆界面编写
    • 🍔 1-1、代码以及样式编写
    • 🍟 1-2、路由信息修改
    • 🌭 1-3、滑动验证码引入
  • 🍿 2、请求后端接口
    • 🥓 2-1、编写请求方法
    • 🥗 2-2、跨域问题解决
    • 🥙 2-3、重试并设置响应拦截器
    • 🥙 2-4、新增数据测试

🍕 1、登陆界面编写

🍔 1-1、代码以及样式编写

我们来编写登录界面(具体的样式不再做具体解释)

在这里插入图片描述

<template>
  <div class="main-container"
       :style="`background: url(${Backstage}) center center / cover no-repeat;`">
    <!-- 登录部分 -->
    <div class="login-container">
      <!-- 登录界面 -->
      <div class="login-box">
        <!-- 标题部分 -->
        <div class="title-span">
          <img class="logo" :src="Logo">
          <span class="title">木字楠后台管理系统</span>
        </div>
        <!-- 登录表单 -->
        <a-form-model class="login" ref="ruleForm" @submit="login('ruleForm')" @submit.native.prevent :model="loginForm"
                      :rules="rules">
          <a-form-model-item prop="username">
            <a-input v-model="loginForm.username" placeholder="请输入用户名..."/>
          </a-form-model-item>
          <a-form-model-item prop="password">
            <a-input-password v-model="loginForm.password" placeholder="请输入密码..."/>
          </a-form-model-item>
          <div class="remember-me">
            <a-checkbox dio>记住我</a-checkbox>
            <a href="#">忘记密码</a>
          </div>
          <a-form-model-item>
            <a-button
                block
                class="login-button"
                type="primary"
                html-type="submit"
                @submit.native.prevent
                :disabled="loginForm.username === '' || loginForm.password === ''"
            >
              <a-icon type="login"/>
              登陆
            </a-button>
          </a-form-model-item>
        </a-form-model>
        <!--第三方登陆-->
        <a-divider style="margin: -15px 0 10px 0">第三方登陆</a-divider>
        <div class="three-box">
          <a-button type="primary" shape="circle" icon="qq"></a-button>
          <a-button type="primary" shape="circle" icon="alipay" style="margin-left: 10px"></a-button>
        </div>
      </div>
      <!-- 页脚部分 -->
      <div class="footer-span">
        <a-divider> Copyright © 2022 by ~ 木字楠</a-divider>
      </div>
    </div>
    <!--  其他部分 -->
    <div class="other-container">
      <!-- 网站标题 -->
      <div class="website-detail-title">
        <span>木 字 楠 后 台 管 理 平 台</span>
      </div>
      <!-- 网站标语 -->
      <div class="website-desc">
        <span>———&emsp;要努力呀,为了想要的生活,为了人间烟火,为了今天的风和月&emsp;———</span>
      </div>
    </div>
  </div>
</template>

<script>


import Backstage from "@/assets/images/backstage.jpg";
import Logo from "@/assets/images/logo/logo.png";

export default {
  name: "Login",
  data() {
    return {
      //==============   初始化   ===============
      rules: {
        username: [{required: true, message: '用户名不能为空', trigger: 'blur'}],
        password: [{required: true, message: '密码不能为空', trigger: 'blur'}],
      },
      isPass: false,
      //==============   参数对象   ===============
      loginForm: {
        username: "Visitor",
        password: "123456",
      },
      Backstage: Backstage,
      Logo: Logo,
    }
  },
  methods: {

    //==============   登陆方法   ===============
    login(formName) {
      this.$refs[formName].validate(valid => {
        if (valid) {
          if (this.isPass) {

          } else {
            this.$message.error("未通过滑块验证");
          }
        }
      });
    }

  }
}
</script>

<style lang="scss" scoped>
.main-container {
  width: 100%;
  height: 100%;
  display: flex;
  justify-content: space-between;

  .login-container {
    position: relative;
    width: 26%;
    height: 100%;
    opacity: 0.95;
    background: white;
    border-right: 1px solid gray;
    border-radius: 10px;
    box-shadow: 2px 10px 20px gray;


    .login-box {
      position: absolute;
      width: 100%;
      height: auto;
      padding: 10px 0 20px 0;
      margin: 0 auto;
      top: 15%;

      .title-span {
        display: flex;
        justify-content: center;
        margin-bottom: 40px;

        .logo {
          user-select: none;
          width: 38px;
          height: 38px;
          margin-right: 10px;
          border-radius: 50%;
        }

        .title {
          user-select: none;
          font-size: 24px;
          font-weight: bolder;

        }
      }

      .login {
        padding: 0 30px;

        .remember-me {
          display: flex;
          justify-content: space-between;
        }

        .login-button {
          margin-top: 10px;
          width: 100%;
        }
      }

      .three-box {
        display: flex;
        justify-content: center;
      }

    }


    .footer-span {
      user-select: none;
      position: absolute;
      bottom: 1%;
      left: 0;
      right: 0;
    }
  }

  .other-container {
    width: 74%;
    position: relative;

    .website-detail-title {
      position: absolute;
      width: 100%;
      text-align: center;
      top: 10%;

      span {
        user-select: none;
        font-weight: bolder;
        color: #40403a;
        font-size: 40px;
      }
    }

    .website-desc {
      position: absolute;
      width: 100%;
      text-align: center;
      bottom: 5%;


      span {
        user-select: none;
        font-size: 20px;
        color: white;
      }
    }
  }

}
</style>

🍟 1-2、路由信息修改

引入代码,启动项目之后我们会发现页面空白
这是因为我们没有给登陆页面配制路由,当然不会进行跳转。

登陆界面是作为我们网站的默认界面,所以我们在请求/的时候默认重定向至/login界面。

在这里插入图片描述
在这里插入图片描述

🌭 1-3、滑动验证码引入

登陆一般会设置验证码,这样可以有效的防止登陆的暴力破解以及登陆请求被恶意使用。
我们这里采用滑动验证码块的方式做登录验证。
项目中使用的为 slider-verification-code

在这里插入图片描述

首先我们在控制台中执行 npm i slider-verification-code 下载依赖

在这里插入图片描述

  1. main.js中进行插件的引入
  2. Login.vue中使用滑块验证码

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

          <!-- 滑块验证码 -->
          <a-form-model-item prop="captcha">
            <SliderVerificationCode height="35px"
                                    content="请拖动滑块进行验证"
                                    inactiveValue="未验证"
                                    activeValue="已验证"
                                    v-model="isPass"/>
          </a-form-model-item>

在这里插入图片描述

在这里插入图片描述

🍿 2、请求后端接口

🥓 2-1、编写请求方法

  1. 在src目录下新建一个api文件夹用于存放api请求方法
  2. 由于本项目中使用的是SpringSecurity默认的登陆逻辑,根据源码我们可以得知,登陆请求是Post请求 且 参数是通过请求头携带(eg: localhost:9999/user/login?username=a&password=b)
  3. Login.vue中通过滑块验证之后调用登陆方法,发起网络请求。

在这里插入图片描述
在这里插入图片描述

调用接口方法,请求成功之后跳转至欢迎界面
在这里插入图片描述

    //==============   登陆方法   ===============
    login(formName) {
      this.$refs[formName].validate(valid => {
        if (valid) {
          if (this.isPass) {
            userLogin().then(res => {
              if (res.success){
              this.$notification.success({message: res.message});
                this.$router.replace('/welcome');
              } else {
                this.$message.error(res.data.message);
              }
            });
          } else {
            this.$message.error("未通过滑块验证");
          }
        }
      });
    }

在这里插入图片描述

我们发送网络请求之后发现发生了跨域问题

在这里插入图片描述

🥗 2-2、跨域问题解决

跨域问题的解决方案有很多种:
以下是最常用的几种,本项目中使用后端代理的方式来进行配制。

  • nodejs中间件代理跨域
  • nginx代理跨域
  • 跨域资源共享(CORS)
  • 服务端跨域配制

我们在config包下新建WebMvcConfiguration配制类来解决跨域问题

在这里插入图片描述

@Configuration
public class WebMvcConfiguration implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedHeaders("*")
                .allowedMethods("PUT", "POST", "GET", "HEAD", "DELETE", "OPTIONS")
                .allowedOriginPatterns("*")
                .maxAge(3600)
                .allowCredentials(true);
}

但是由于我们是用了SpringSecurity框架,我们需要额外去SpringSecurity配置类中进行跨域的配置。

在这里插入图片描述

        //region 跨域配置开启 和 csrf关闭
        http.cors()
                .and()
                .csrf().disable();
        //endregion

🥙 2-3、重试并设置响应拦截器

重启后端项目之后,我们再次发送登陆请求。
因为数据库中没有数据,未查询到对应信息,默认提示 用户名或密码错误

在这里插入图片描述

但是我们会发现接口请求失败一般都会将返回信息提示出来,而提示信息的操作也比较单一,所以我们可以在axios 的 response拦截器中进行处理。

在这里插入图片描述

//=======================  响应(Response)拦截器  ===========================
axios.interceptors.response.use(
    config => {
        if (config.data.message === "用户未登陆,请登陆!") {
            router.replace('/login');
            return;
        }
        if (!config.data.success) {
            notification.error({message: config.data.message});
        }
        return config.data;
    }, error => {
        if (error.response.code === 404 || error.response.code === 504) {
            message.error({message: '服务器被怪兽吃掉了 gg'})
        } else if (error.response.code === 401) {
            message.error({message: '尚未登陆,请登陆!'})
            router.replace('/');
        } else if (error.response.code === 403) {
            message.error({message: '没有权限,请联系管理员!'})
        }
    }
);

我们就可以将调用方法时手动执行的弹窗删掉了

在这里插入图片描述

🥙 2-4、新增数据测试

  1. 新增角色信息
  2. 新增用户基础信息
  3. 在数据库中新增用户名、密码(密文)

在线加密工具

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

重新进行登录测试

在这里插入图片描述


在这里插入图片描述

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

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

相关文章

PaddleX API开发模式快速上手文档

目录一. 环境安装1.1 PaddlePaddle-gpu安装1.2 PaddleX安装二. 快速训练2.1 准备数据集2.2 定义图像预处理与数据增强2.3 定义并装载数据2.4 开始训练2.5 使用Visual查看训练情况三. 部署推理3.1 模型加载预测PaddleX官方文档(以图像分类为例)&#xff1a;PaddleX/docs/quick_s…

MySQL索引优化(一)

文章目录一、索引介绍1. 什么是MySQL的索引2. 索引数据结构3. 索引优势4. 索引劣势5. 索引使用场景&#xff08;1&#xff09;需要建立索引的场景&#xff08;2&#xff09;不推荐建立索引的场景6. 索引分类&#xff08;1&#xff09;主键索引&#xff08;2&#xff09;唯一索引…

【k8s 实战】Prometheus Operator 高级配置- 监控Kubernetes自动发现

上文我们一起学习了如何在 Prometheus Operator 下面自定义一个监控选项&#xff0c;以及自定义报警规则的使用。那么我们还能够直接使用前面课程中的自动发现功能吗&#xff1f;如果在我们的 Kubernetes 集群中有了很多的 Service/Pod&#xff0c;那么我们都需要一个一个的去建…

MATLAB傅里叶变换和加入噪声后的傅里叶变换

1.傅里叶变换代码 查看String为傅里叶变换的button添加callback函数&#xff0c;可以通过查看callback函数快速定位到该位置 function pushbutton37_Callback(hObject, eventdata, handles)%傅里叶变换&#xff08;频谱图&#xff09; axes(handles.show_proImg); global fpat…

[附源码]Nodejs计算机毕业设计基于的二手房交易系统Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分…

动态规划——状态机模型

文章目录概述大盗阿福思路代码股票买卖 IV思路代码股票买卖 V思路代码总结概述 定义&#xff1a; 它是一个有向图形&#xff0c;由一组节点和一组相应的转移函数组成。状态机通过响应一系列事件而“运行”。每个事件都在属于“当前” 节点的转移函数的控制范围内&#xff0c;其…

QT 6开发环境搭建——Windows环境

QT 目前不支持离线安装&#xff0c;只支持在线安装。&#xff08;从Qt5.15版本后不支持离线安装&#xff09; 去下面的网址&#xff0c;下载在线安装包&#xff1a; https://download.qt.io/archive/online_installers 我个人选择的是4.3.可以选择更新的版本。选择合适自己电…

时间序列的蒙特卡罗交叉验证

交叉验证应用于时间序列需要注意是要防止泄漏和获得可靠的性能估计本文将介绍蒙特卡洛交叉验证。这是一种流行的TimeSeriesSplits方法的替代方法。 时间序列交叉验证 TimeSeriesSplit通常是时间序列数据进行交叉验证的首选方法。下图1说明了该方法的操作方式。可用的时间序列…

编译原理实验三:算符优先分析算法的设计与实现(python)

实验目的 根据算符优先分析法&#xff0c;对表达式进行语法分析&#xff0c;使其能够判断一个表达式是否正确。通过算符优先分析方法的实现&#xff0c;加深对自下而上语法分析方法的理解。 实验内容 1、输入文法。可以是如下算术表达式的文法&#xff08;你可以根据需要适当…

赋能组织执行力学习-R4管理-结果体系、责任体系、检查与改进体系、及时激励体系

本文向大家介绍R4管理&#xff0c;是由结果体系&#xff08;Result&#xff09;、责任体系&#xff08;Responsibility&#xff09;、检查与改进体系&#xff08;Review&#xff09;、及时激励体系&#xff08;Reward&#xff09;组成&#xff0c;帮助我们如何更好的运用。 马云…

TikTok选品技巧 | 爆品一般是怎么选出来的,快看这些技巧

TikTok电商商家看过来&#xff01;随着短视频时代的兴起与发展&#xff0c;TikTok在全球受到越来越多的用户所追捧。同时&#xff0c;吸引了更多TikTok商家前来发展电商。但是&#xff0c;想要在这里快速实现TikTok变现目标&#xff0c;并非容易。TikTok选品和TikTok营销是最不…

数据库原理及MySQL应用 | 多表查询

在实际应用中&#xff0c;多表查询应用相对较多&#xff0c;根据多表之间的相关列&#xff0c;可以从多个表中检索出所需数据。 在实际应用中&#xff0c;单表查询应用范围相对较少&#xff0c;因为用户需要的数据往往存储在多个不同的表中&#xff0c;这时需要进行多表查询。…

oracle的pkg改为hivesql

1. oracle的() 改为hive左右连接 oracle ()学习_cclovezbf的博客-CSDN博客最近工作需要将oracle的存储过程转化为hive的sql脚本。遇到很多不一样的地方&#xff0c;例如oracle连接中有()号的用法。借鉴这篇文章&#xff0c;但是这个排版比较烂。。。先建表和插入数据首先说明…

笔试强训(四十六)

目录一、选择题二、编程题2.1 简单错误记录2.1.1 题目2.1.2 题解一、选择题 &#xff08;1&#xff09;一台刚接入互联网的WEB服务器第一次被访问到时&#xff0c;不同协议的发生顺序是下面中的&#xff08;A&#xff09; A.ARP->DNS->HTTP B.ARP->HTTP->DNS C.DN…

怎么提取伴奏?有什么实用的提取软件?

由于我喜欢唱歌&#xff0c;所以在读书时期偶尔会参加学校的一些歌唱比赛或是文艺汇演。而一开始的我没什么经验&#xff0c;练习时都是放着原声带跟唱&#xff0c;但是到了舞台上发现只有伴奏&#xff0c;一时间卡不到开唱的点&#xff0c;甚是尴尬。所以后来我吸取了教训&…

蓝桥杯嵌入式 cubeMX生成代码解读

文章目录前言一、代码风格二、为什么要这些注释&#xff1f;三、生成的独立模块的代码总结前言 本篇文章讲介绍一下cubeMX生成代码的风格。 一、代码风格 在main.c中可以看到非常多的注释代码&#xff0c;很多人都不知道这些是用来干嘛的&#xff0c;现在就给大家介绍一下这…

你了解Java中的ForkJoin吗?

什么是ForkJoin? ForkJoin 从字面上看Fork是分岔的意思&#xff0c;Join是结合的意思&#xff0c;我们可以理解为将大任务拆分成小任务进行计算求解&#xff0c;最后将小任务的结果进行结合求出大任务的解&#xff0c;这些裂变出来的小任务&#xff0c;我们就可以交给不同的线…

新智慧杂志新智慧杂志社新智慧编辑部2022年第30期目录

杏坛潮_热点关注 特色劳动教育模式探究——基于“劳动周”项目的设计与实践 王胜; 1-3《新智慧》投稿&#xff1a;cn7kantougao163.com “双减”背景下小学数学大单元深度学习的实践与探索——以小学高年级为例 王晓雪; 4-6 杏坛潮_创新教育 问题教学法在高中物理教…

20221215英语学习

今日新词&#xff1a; rich adj.富有的, 富裕的, 油腻的 luck n.运气, 幸运, 好运, 侥幸 live adj.活的, 现场直播的, 实况转播的, 现场演出的 tutor n.家庭教师&#xff1b;私人教师&#xff1b;导师&#xff1b;助教 swipe v.挥拳打, 扬起巴掌打, 挥起&#xff08;物体&…

刷屏的AI 绘画,你成功驯服了吗?其背后的AIGC模型你可能还不知道

文章目录前言基于 CLIP Latents 的条件文本图像生成BLIPHugging Face奇点智源中文-CLIP百度昆仑万维之AI绘画前言 随着人工智能技术的发展与完善&#xff0c;AIGC&#xff08;AI generated content&#xff09;在内容的创作上为人们的工作和生活带来前所未有的帮助&#xff0c…