后台整合篇之VUE登录整合

        做了很多年的java开发,从SpringMVC,到Springboot的,一直在进步,但是也一直没有回过头来系统性总结,今天就来总结一下,以便系统性理解。

        我相信开发的很多人,大部分人都是基于业务进行项目或产品开发,都是用别人现成的框架,或者网上开源的框架直接开整,其中很少有人能系列的搭建一套这样的框架,或者不能够系列的把整个项目串联起来,形成自己的认知,除非,自己手摸手,自己撸过,,有时候撸过一边是没感觉的,得撸两边,再次我也是通过自己的整合和理解,总结一下

        做后台的应该对后台的整个请求,拦截应该是不陌生的,后面也会整理出后台的系列总结,

        今天基于VUE整合后台前端框架,我也有学习思考过那些框架大佬,为什么能做成这样的事,我认为他也是撸多了,才有的,加上理解,融会贯通,最后自己的任督二脉就通了。

        整合VUE后台框架,首先要了解一下VUE语法,和官网文档,系统性过一遍,VUE官网

有时候有些东西理解不了,没关系,先熟悉,脑子里有个概念.

整合框架,找一个VUE的基础框架。点击,找个基础版的,以实战带动理解

# clone the project
git clone https://github.com/PanJiaChen/vue-admin-template.git

# enter the project directory
cd vue-admin-template

# install dependency
npm install

# develop
npm run dev

 运行起来可以直接看效果。

        梳理一下后台整合流程 ,调用后台登录接口 ——> 获取token,前端存储token,按照后台约定的方式,将在头信息中带上登录后的token,进行请求,根据登录后获取的权限进行路由控制

        上面的代码获取到之后,需要修改的地方是,登陆后把账号密码存储到Cookie

在Utils定义一个support.js

import Cookies from 'js-cookie';
const SupporKey = 'supportKey';
export function getSupport(){
  return Cookies.get(SupporKey)
}

export function setSupport(isSupport){
  return Cookies.set(SupporKey,isSupport,{expires:3})
}

export function setCookie(key,value,expires){
  return Cookies.set(key,value,{expires:expires})
}

export function getCookie(key) {
  return Cookies.get(key)
}

在login- index.vue中导入进来

import {setCookie} from '@/utils/support';

 这样就把账号密码存储到浏览器本地

this.$store.dispatch('user/login', this.loginForm).then((res) => {
            setCookie("username",this.loginForm.username,15);
            setCookie("password",this.loginForm.password,15);
            this.$router.push({ path: this.redirect || '/' })
            this.loading = false
          }).catch(() => {
            this.loading = false
          })
this.$store.dispatch('user/login', this.loginForm) 中user/login这个路径的方法是在store/modules/user.js中定义的,如果用IDEA的话,是可以点过去的

在actions对象中,定义的几个方法就是用来处理登录后的token存储,获取用户信息的,退出登录的

原先的方法是这样的


const actions = {
  // user login
  login({ commit }, userInfo) {
    const { username, password } = userInfo
    return new Promise((resolve, reject) => {
      login({ username: username.trim(), password: password }).then(response => {
        const { data } = response
        commit('SET_TOKEN', data.token)
        setToken(data.token)
        resolve()
      }).catch(error => {
        reject(error)
      })
    })
  },

  // get user info
  getInfo({ commit, state }) {
    return new Promise((resolve, reject) => {
      getInfo(state.token).then(response => {
        const { data } = response

        if (!data) {
          return reject('Verification failed, please Login again.')
        }

        const { name, avatar } = data

        commit('SET_NAME', name)
        commit('SET_AVATAR', avatar)
        resolve(data)
      }).catch(error => {
        reject(error)
      })
    })
  },

  // user logout
  logout({ commit, state }) {
    return new Promise((resolve, reject) => {
      logout(state.token).then(() => {
        removeToken() // must remove  token  first
        resetRouter()
        commit('RESET_STATE')
        resolve()
      }).catch(error => {
        reject(error)
      })
    })
  },

  // remove token
  resetToken({ commit }) {
    return new Promise(resolve => {
      removeToken() // must remove  token  first
      commit('RESET_STATE')
      resolve()
    })
  }
}

改造后的方法


const actions = {
  // 登录
  login({ commit }, userInfo) {
    const { username, password } = userInfo
    return new Promise((resolve, reject) => {
      login({ username: username.trim(), password: password }).then(response => {
        console.log(response.data)
        const { data } = response
        const tokenStr = data.tokenHead + data.token
        commit('SET_TOKEN', tokenStr)
        setToken(tokenStr)
        resolve()
      }).catch(error => {
        reject(error)
      })
    })
  },

  // get user info
  getInfo({ commit, state }) {
    return new Promise((resolve, reject) => {
      getInfo().then(response => {
        const data = response.data
        if(data.roles && data.roles.length >0){
          commit("SET_ROLES",data.roles)
        }else{
          reject("getInfo:juese 必须不能为空数组")
        }
        commit("SET_NAME",data.username)
        commit("SET_AVATAR",data.icon)
        resolve(response)
      }).catch(error => {
        reject(error)
      })
    })
  },

  // user logout
  logout({ commit, state }) {
    return new Promise((resolve, reject) => {
      logout(state.token).then(() => {
        removeToken() // must remove  token  first
        resetRouter()
        commit('RESET_STATE')
        resolve()
      }).catch(error => {
        reject(error)
      })
    })
  },

  // remove token
  resetToken({ commit }) {
    return new Promise(resolve => {
      removeToken() // must remove  token  first
      commit('RESET_STATE')
      resolve()
    })
  }
}

主要改造的就是定义了自己的token方式,后台返回了tokenHead ,因为后台采用的是JWT+security方式,登录后请求头的格式为 Authorization: Bearer xxxxxx;的方式,

所以需要进行处理

const tokenStr = data.tokenHead + data.token
        commit('SET_TOKEN', tokenStr)

也可以前端写死,在request中request interceptor方法中新增一个

// 登录完成之后给每一个请求头携带Authorization
      config.headers['Authorization'] = getToken()

框架中是这样的,其实这个地方目前改动不大,主要是这个地方,按照自己的头方式去请求,

// let each request carry token
      // ['X-Token'] is a custom headers key
      // please modify it according to the actual situation
      config.headers['X-Token'] = getToken()

很多时候不理解是因为自己没有去做尝试,其实尝试之后,才能更好的更系统性的去理解中间的逻辑,和把掌握的知识点,串成一个面

        最后总结,就是登录后存token,请求的时候按照后台需要的格式携带token,就能把登录整合起来

VUE框架package.json中,dependencies中包含的就是所需要的技术栈

 {
  "dependencies": {
    "axios": "0.18.1",
    "element-ui": "2.13.0",
    "js-cookie": "2.2.0",
    "normalize.css": "7.0.0",
    "nprogress": "0.2.0",
    "path-to-regexp": "2.4.0",
    "vue": "2.6.10",
    "vue-router": "3.0.6",
    "vuex": "3.1.0"
  }
}

其实这里面还要扩充的知识点有

axios

一款基于JavaScript的http请求客户端,用于在浏览器中发起请求,这个只要看下项目的README就大概知道怎么用了。

https://github.com/axios/axios

element-ui

一套为开发者、设计师和产品经理准备的基于 Vue 2.0 的桌面端组件库。说白了就是个UI组件库,看下官方文档即可。

https://element.eleme.cn/

一款操作Cookie的JavaScript组件库,这个只要看下项目的README就大概知道怎么用了。

https://github.com/js-cookie/js-cookie

normalize.css

一款css库,在默认的HTML元素样式上提供了跨浏览器的高度一致性,说白了就是浏览器样式兼容用的,不看也可以。

https://github.com/necolas/normalize.css

nprogress

一款基于JavaScript的进度条UI组件,这个只要看下项目的README就大概知道怎么用了。

https://github.com/rstacruz/nprogress

path-to-regexp

将路径字符串(如/user/:name)转换为正则表达式的工具库,这个只要看下项目的README就大概知道怎么用了。

https://github.com/pillarjs/path-to-regexp

vue

我们之前就学过Vue的基础了,看下官方教程即可。

https://cn.vuejs.org/v2/guide/

vue-router

Vue Router 是 Vue.js 官方的路由管理器。它和 Vue.js 的核心深度集成,让构建单页面应用变得易如反掌。看下官方教程即可。

https://router.vuejs.org/zh/

vuex

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。其实就是个全局状态管理器,比如用户登录信息,你很多页面都会用到,就存到这个里面。看下官方文档即可。

https://vuex.vuejs.org/zh/

很多时候不能一下子理解,其实没关系,可以结合框架,以实战,结合文档,能更好的理解

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值