Spring Boot + Vue 前后端分离项目 -- 前后端登录接口对接

前言

我们先进行了登录页面的绘制:在 Vue 中使用 Element UI

然后再实现了后端登录接口:Spring Boot + Vue 前后端分离项目 -- 后端登录接口实现

现在可以进行前后端登录接口对接了。

准备工作

1、安装 axios

在 vue 项目中,需要使用 axios 发送网络请求,安装命令如下:

npm install axios

安装完毕后,package.json 文件中,会出现 axios 的版本号,表示安装好了。

2、前端统一失败处理

使用 axios 发送网络请求时,可能会成功,也可能会失败,为了方便,我们使用 vue 中的 message 标签,进行网络请求的统一失败处理。

在 vue 项目中新建包 utils,再在其中新建 js 文件:api.js,写入如下代码:

import axios from 'axios';
import { Message } from 'element-ui';

axios.interceptors.response.use(success =>{
  if (success.status && success.status ==200 && success.data.status ==500){
    Message.error({message: success.data.msg});
    return;
  }
  return success.data;
}, error => {
      if (error.response.status ==504 || error.response.status ==404){
        Message.error({message: "服务器被吃了o(╯□╰)o"})
      }else if (error.response.status ==403){
        Message.error({message: "权限不足,请联系管理员!"})
      }else if (error.response.status ==401){
        Message.error({message: "没有登录,请登录!"})
      }else if (error.response.data.msg){
        Message.error({message: error.response.data.msg})
      }else {
        Message.error({message: "未知错误..."})
      }
      return;
})

这里配置了一个 axios 的响应拦截器,对响应的成功或者失败进行统一处理。

3、axios 网络请求方法封装

为了方便在 vue 中使用 axios 发送网络请求,需要对 post 请求进行封装一下,顺便再对其他几个方法进行封装一下,同样在 api.js 文件中编写。

此时 api.js 的完整代码如下:

import axios from 'axios';
import { Message } from 'element-ui';

axios.interceptors.response.use(success =>{
  if (success.status && success.status ==200 && success.data.status ==500){
    Message.error({message: success.data.msg});
    return;
  }
  return success.data;
}, error => {
      if (error.response.status ==504 || error.response.status ==404){
        Message.error({message: "服务器被吃了o(╯□╰)o"})
      }else if (error.response.status ==403){
        Message.error({message: "权限不足,请联系管理员!"})
      }else if (error.response.status ==401){
        Message.error({message: "没有登录,请登录!"})
      }else if (error.response.data.msg){
        Message.error({message: error.response.data.msg})
      }else {
        Message.error({message: "未知错误..."})
      }
      return;
})

let base = "";

// 登录时的 post 请求
// params 默认是 json 格式,需要转换成 form 表单,因为登录请求只接受 form 表单传参
export const postKeyValueRequest=(url, params) =>{
  return axios({
    method: "post",
    url: `${base}${url}`,
    data: params,
    transformRequest: [function (data) {
      let ret = '';
      for (let i in data){
        ret += encodeURIComponent(i)+"="+ encodeURIComponent(data[i]) + "&";
      }
      return ret;
    }],
    header: {
      "Content-Type": "application/x-www-urlencoded"
    }
  })
}

export const postRequest = (url, params) => {
  return axios({
    method: "post",
    url: `${base}${url}`,
    data: params,
    // contentType: "application/json;charset=UTF-8"
  })
}

export const putRequest = (url, params) => {
  return axios({
    method: "put",
    url: `${base}${url}`,
    data: params,
  })
}

export const getRequest = (url, params) => {
  return axios({
    method: "get",
    url: `${base}${url}`,
    data: params,
  })
}

export const deleteRequest = (url, params) => {
  return axios({
    method: "delete",
    url: `${base}${url}`,
    data: params,
  })
}

需要注意的是,登录用到的 post 请求和业务上的 post 请求有所不同。

在使用 SpringSecurity 作为安全框架的项目中,登录请求默认使用 form 表单进行传参,而前后端分离的项目中,前后端使用 json 格式进行数据交互。

所以需要将 json 数据,转换成 form 表单,再进行登录请求。

所以 api.js 文件中,有两个 post 请求方法:

  • postKeyValueRequest:登录使用的

  • postRequest :业务上的增加需求使用的

最后通过 Vue.prototype, 制作插件,使得在 vue 项目的任何地方,都可以方便调用这几个网络请求的方法。

我们需要在 main.js 文件中添加如下几行:

import {postKeyValueRequest} from "./utils/api";
import {postRequest} from "./utils/api";
import {putRequest} from "./utils/api";
import {getRequest} from "./utils/api";
import {deleteRequest} from "./utils/api";

Vue.prototype.postKeyValueRequest = postKeyValueRequest;
Vue.prototype.postRequest = postRequest;
Vue.prototype.putRequest = putRequest;
Vue.prototype.getRequest = getRequest;
Vue.prototype.deleteRequest = deleteRequest;

这样就可以在任一 vue 组件中通过 this.postRequest 调用对应的 post 请求。

4、设置请求转发

由于前后端分离,端口不同,前端向后端发送登录请求会涉及跨域问题,需要在 vue 项目中配置一下。

具体配置方法,可以参考文章:Vue 配置请求转发(vue2 和 vue3 的方式不同)

我这里用的是 vue2 ,所以在 config 包的 index.js 文件中,修改如下:

    proxyTable: {
      '/':{
        target: "http://localhost:8081", // 后端地址
        changeOrigin: true,
        pathRewrite: {
          '^/': ''
        }
      }
    },

再重启 vue 项目才会生效。

5、建立 home 页

登录成功后,需要跳转至 home 页,这里先简单建一个 home 页,具体内容日后再填充。

在 views 包下,新建 Home.vue 组件,完整代码如下:

<template>
  <div>
    <h3 style="display: flex; justify-content: center; margin-top: 50px">这是首页</h3>
  </div>
</template>

<script>
    export default {
        name: "Home"
    }
</script>

<style>

</style>

在 router 中引入 Home 页,完整代码如下:

import Vue from 'vue'
import Router from 'vue-router'
import Login from "../views/Login"
import Home from "../views/Home"

Vue.use(Router)

export default new Router({
  routes: [
    {
      path: '/',
      name: 'Login',
      component: Login
    },
    {
      path: '/home',
      name: 'Home',
      component: Home
    }
  ]
})

6、发送登录请求并跳转 Home 页

之前在文章 在 Vue 中使用 Element UI 已经制作好了登录页。

只需要在 <el-button 按钮下,添加一个点击事件:@click="submitLogin", 并实现点击事件:

     methods:{
        submitLogin:function () {
          this.$refs.loginForm.validate((valid) =>{
            if (valid){
              this.postKeyValueRequest("doLogin", this.loginData).then(resp =>{
                if (resp){
                  window.sessionStorage.setItem("user", JSON.stringify(resp.obj));
                  this.$router.replace("/home");
                }
              })
            }
            else {
              this.$message.error('请输入所有字段');
              return false;
            }
          })
        }
      }

为了方便输入密码后按回车就可以登录,可以在 密码那个输入框 <el-input 中添加 @keydown.enter.native="submitLogin"

这里使用 this.$router.replace("/home")进行页面跳转,具体可参考文章:Vue 页面跳转

7、效果

登录页:

home 页

每天学习一点点,每天进步一点点。

posted @ 2021-05-06 22:57  爱吃西瓜的番茄酱  阅读(4229)  评论(0编辑  收藏  举报