第二天学习总结

登录流程

1. vuex子模块的创建

    export default {
        namespaced: true, //开启命名空间
        state: {
            token: ''
        },
        mutations: {
            
        },
        actions: {
            // 调用登录接口请求
            // 接口返回token
            // 调用mutation的方法 
        }
    }

2.组件内事件触发vuex子模块里面的actions内部的方法

    // 这里的user指的是vuex里面的一个子模块,不能缺失
    this.$store.dispatch('子模块名/actions的方法', val) 

3、token持久化存储

通过vuex配合本地存储进行,本地存储存在的目的在于弥补vuex在界面刷新的时候被清空的缺点

4、vue解决开发环境下跨域问题。(其实后端可以开启cors解决,但是接口的安全性会受到影响)

  • 跨域的含义:协议、主机名、端口号其中一个不同。它是浏览器提供的一种安全策略。
  • 前端解决方案:vue-cli代理解决跨域
  • 具体操作:
// 1、 在vue.config.js中添加proxy属性
    proxy: {
        '/api': {
            target: '要代理的目标地址'
        }
    }
// 删除原有的before配置选项
    // before: require('./mock/mock-server.js') //模拟数据

//发送验证
axios({
    method: 'post',
    url: '/api/sys/login',
    data: {
        mobile: '12345432',
        password: '1234'
    }
})

5、你是如何封装axios的

逐字稿:首先我们知道axios的作用是对请求相关进行一些操作。里面包括基地址、超时时间、请求拦截器和响应拦截器。接下来我们将进行以下操作:1、先安装axios,并在utils里面新建一个名为request的js文件。通过axios.create创建一个axios实例,里面配置基地址和超时时间;用instance接收这个实例。2、添加请求拦截器;3、添加响应拦截器;4、导出封装好的实例instance。

69ca00465955db930c32613433f9612.png c1b630a7375ed8c7d443b76feebf2b3.png 05fae7cc6c73bdadbc040d11247a1a1.png
// 请求相关 - 基地址  超时时间 请求拦截器  响应拦截器
import axios from 'axios'
const instance = axios.create({
    baseURL: '/api',
    timeout: 10000
})

// 添加请求拦截器
instance.interceptors.request.use(function(confit){
    // 获取token
    // 判断token是否存在
    // 若存在 - 请求头中携带
    const token = store.getters.token
    if(token){
        config.headers.Authorization = `Bearer ${token}`
    }
    return config
}, function(error){
    // 对请求错误做些什么
    return Primise.reject(error)
})

// 添加响应拦截器
instance.interceptors.response.use(function(response){
    // 2xx 范围内的状态码会触发该函数
    // 对相应数据的处理
    console.log('响应拦截器返回的结果', response.data)
    const { message, success, data } = response.data  // 结构返回结果中的详细信息
    
    if(success) {
        Message.success(message)
        return response.data
    }else{
        Message.error(message)
        return Promise.reject(new Error(message))
    }
}, function(error) {
    // 超出 2xx 范围的状态码都会触发该函数。 
    // 对响应错误做点什么 
    return Promise.reject(error);
}

6、axios如何区分开发环境和生产环境

逐字稿:在进行项目开发的时候,我们将对应的环境分为开发环境和生成环境;我们在.env.development中设置开发环境的变量,默认NODE_NEW的值为development;在.env.production中设置生成环境变量;默认NODE_ENV值为production;我们通过process.env.属性的方式获取对应环境值。 在进行项目开发的时候,process.env.属性这个操作可以让我们在表单默认信息填入的时候提供遍历:开发环境下,表单信息自动填入默认信息。生产环境中则为空。

4797d138bb740ae9ef3ab571f773602.png b7235158decb10eb5846744eb3e98da.png

7、谈谈你的项目中主页权限验证是如何实现的(permission.js)(鉴权)

逐字稿:A、项目中主页权限验证我们放在permission.js文件中实现。我们将其分为两种情况进行处理:1、用户访问主页的时候,判断若token存在则直接放行,没有token则调到登录页。2、用户访问登录页面,判断有token调到主页,没有token的话直接放行。B、项目中NProgress界面加载进度条的实现:首先我们需要引入,这里需要引入两个文件。然后再进行调用。

import store from './store'
const nProgress = require('nprogress')
import 'nprogress/nprogress.css'
const { default: router } = require('./router')

const whiteList = ['/login', '404']
router.beforeEach(async(to, form, next) => {
  nProgress.start()// 开启进度条
  const token = store.getters.token
  if (token) {
    if (to.path === '/login') {
      next('/')
      nProgress.done()// 关闭进度条
    } else {
      if (!store.getters.userId1) {
        await store.dispatch('user/updateUserInfo')
      }
      next()
    }
  } else {
    if (whiteList.includes(to.path)) {
      next()
    } else {
      next('/login')
      nProgress.done()// 关闭进度条
    }
  }
})

router.afterEach(() => {
  nProgress.done()// 关闭进度条
})

de5712e9c28e10a76b933b4b36aa75e.png

以上是第三天的学习内容。本人处于学习阶段,疏漏之处在所难免,还望各位大神指正~