Vue 项目 login 模块

登录模块

需要做路由的守卫,有些模块是需要被保护的,必须登录才能访问。 常见手法是给路由添加 meta:{ auth:true } 来做标识,表示需要做认证。

// 路由守卫
router.beforeEach((to, from, next) => {
    // 判断要进入的路由是否需要认证
    if(to.meta.auth) {
        // 通过token令牌机制判断是否已经登录
        const token = localStorage.getItem('token');
        if (token) {
            next(); // 如果登录则放行,进入路由
        } else {
            // 跳转,并携带重定向地址
            next({
               path: '/login',
               query: {
                   redirect: to.path
               }
            });
        }
    } else {
        // 不需要验证的模块,直接放行
        next();
    }
});

在 Vuex 中存储登录状态 isLogin

import Vue from 'vue'
import Vuex from 'vuex'
import user from './service/user'

Vue.use(Vuex);
export default new Vuex.Store({
    state: {
        isLogin: localStorage.getItem('token') ? true : false
    },
    mutations: {
        setLoginState(state, bool) {
            state.isLogin = bool;
            // true 表示登录,false 表示注销
        }
    },
    actions: {
        login({commit}, user) {
            // 发起登录请求,请求都拆分出去 service 文件夹中
            // 使用 service 的请求方法
            user.login(user).then(res => {
                // 从 res.data 中解构数据,code和token
                const { code, token } = res.data;
                if (code) {
                    // 登录成功,修改Vuex中间的登录状态
                    commit('setLoginState', true);
                    // 缓存令牌 token
                    localStorage.setItem("token", token);
                }
                return code; // 返回code 给下一个 .then 使用
            });
        },
        logout({ commit }) {
            // 清除缓存
            localStorage.removeItem('token');
            // 重置状态
            commit('setLoginState', false);
        }
    }
});

service文件夹下的服务

// 返回一个 Promises 方便外面使用
import axios from 'axios'
export default {
    login(user) {
        // 注意:请求地址最好是抽出去统一管理
        return axios.get('/api/login', {
            params: user
        });
    }
}

登录组件中提交事件处理过程

// 提交函数中, dispatch 是调用 actios 中的方法,在通过 commit 发送 mutations 方法修改数据
// 注意:this.model 就是传递的数据
this.$store.dispatch("login", this.model)
    .then(code => {
        if (code) {
            // 登录成功后,重定向,如果没有则重定向到首页
            const path = this.$route.query.redirect || '/';
            this.$router.push(path);
        }
    }).catch(error => {
        // 有错误发生 或 登录失败
        const toast = this.$createToast({
            time: 2000,
            text: error.message || error.response.data.message || "登录失败",
            type: "error"
        });
        toast.show();
    });

需要考虑的检查点

  • 如何守卫路由
  • 如何进行异步操作
  • 如何保存登录状态
  • 如何模拟接口

HTTP 拦截器

新建 interceptor.js 文件,用于拦截请求和响应

// token 过期导致请求失败的情况可能出现在项目的任何地方,可以通过响应拦截统一处理
// 拦截器的作用:是对接口做一层保护,表示所有的接口都会带有令牌 token
// 可以查看 axios 的文档 : http://www.axios-js.com/zh-cn/docs/
const axios = require('axios');

export default function(vm) {
    // HTTP 请求拦截器
    axios.interceptors.request.use(config => {
        // 在发送请求之前做些什么
        // 获取token, 并添加到 headers 请求头中
        const token = localStorage.getItem('token');
        if (token) {
            config.headers.token = token;
        }
        return config;
    });

    // HTTP 响应拦截器
    // 统一处理 401 状态,token 过期的处理,清除token跳转login
    // 参数 1, 表示成功响应
    axios.interceptors.response.use(null, err => {
        // 没有登录或令牌过期
        if (err.response.status === 401) {
            // 注销,情况状态和token
            vm.$store.dispatch("logout");
            // 跳转的登录页
            vm.$storer.push('/login');
            // 注意: 这里的 vm 实例需要外部传入
        }
        return Promise.reject(err);
    });
}

// 使用拦截器
// 1. 引入拦截器文件
import interceptor from './interceptor'
// 执行拦截器初始化
interceptor(vm);

注销

  • 需要清除 token 缓存的两种情况:

    1. 用户主动注销
    2. token 过期
  • 需要做的事情:
    • 清空缓存
    • 重置登录状态
    methods: {
      logout() {
          this.$route.dispatch('login');
      }
    }

深入理解令牌机制

  • Bearer Token规范

    • 概念: 描述在HTTP访问OAuth2保护资源时如何使用令牌的规范
    • 特点:令牌就是身份证,无需证明令牌的所有权
    • 具体规定:在请求头中定义Auuthorization:Bearer token
  • Json Web Token 规范 https://jwt.io
    • 概念:令牌的具体定义方式
    • 规定:令牌由三部分构成 头、载荷、签名
    • 头:包含加密算法、令牌类型等信息
    • 载荷:包含用户信息、签发时间和过期时间等信息
    • 签名:根据头、载荷及秘钥加密得到的哈希串

滴滴 Cube-UI 库 精致的移动端组件库

Cube-UI 库地址

原文地址:https://www.cnblogs.com/yuxi2018/p/11967311.html

时间: 2024-08-26 01:30:02

Vue 项目 login 模块的相关文章

Vue 项目 购物车 模块

购物车 ajax 接口请求拆分到 service 文件夹中 // goods.js import axios from 'axios' export default { getGoodsInfo () { return axios.get('/api/goods') .then(res => { // 处理数据格式,并返回 const {code, data: goodsInfo, slider, keys} = res.data; if (code) { return {goodsInfo,

Vue项目的搭建

前言:为公司前端项目搭建整理的一份文档 一.项目环境 1.node安装 下载地址:http://nodejs.cn/download/ 安装检查: 命令: node -v npm -v 注:若需更改node模块(node_modules)的安装目录自行百度,由于创建的Vue项目中node模块是安装在项目文件夹下就不做更改了. 若使用淘宝npm镜像(cnpm)通过以下命令安装: $ npm install -g cnpm --registry=https://registry.npm.taobao

vue项目总结,所用到的技术点

1.用到的技术点 vue 是一个渐进式JavaScript框架 npm install vue vue-route 是一个路由匹配功能 npm install vue-router vue-resource 发送ajax请求的 npm install vue-resource vue-preview 图片预览插件 npm i vue-preview -S vuex 组件传值 npm install vuex --save mint-ui 基于vue的移动端组件 npm i mint-ui -S

vue 项目搭建

cli 方式安装      集成了内置webpack 模块 安装步骤   1.全局安装 vue-cli $ npm install --global vue-cli 2. 创建一个基于 webpack 模板的新项目 $ vue init webpack my-project 3.安装依赖,走你 $ cd my-project $ npm install $ npm run dev 如果npm安装慢的话 可以使用淘宝镜像 npm install -g cnpm --registry=https:/

Vue 项目中使用 jsPlumb

jsPlumb 介绍 jsPlumb 是一个强大的 JavaScript 连线库,它可以将 html中 的元素用箭头.曲线.直线等连接起来,适用于开发 Web 上的图表.建模工具.流程图.关系图等. jsPlumb 参考网站 博客园:http://www.cnblogs.com/leomYili/p/6346526.html?utm_source=itdadao&utm_medium=referral 官网:https://www.jsplumbtoolkit.com/ 安装 jsPlumb v

创建一个Vue项目

Vue.js不支持IE8及其以下版本,因为Vue.js使用了IE8不能模拟的ECMAScript5特性. 在用Vue.js构建大型应用时推荐使用NPM安装,Npm能很好地和诸如Webpack或Browserify模块打包器配合使用.Vue.js也提供配套工具来开发单文件组件. vue的安装依赖于node.js,要确保你的计算机上已安装过node.js.可以进入cmd编辑器,输入node -v进行查看.node尽量要用一些新的版本,否则后续安装会提示node版本过低.去node官网下个新版node

vue项目优化之按需加载组件-使用webpack require.ensure

vue项目优化之按需加载组件-使用webpack require.ensure 使用 vue-cli构建的项目,在 默认情况下 ,执行 npm run build  会将所有的js代码打包为一个整体, 打包位置是 dist/static/js/app.[contenthash].js 类似下面的路由代码 router/index.js  路由相关信息,该路由文件引入了多个 .vue组件 import Hello from '@/components/Hello' import Province

我的第一个vue项目

作为一个研一的学生,一开始对vue框架这个概念也仅限于听说过.正打算在研一下半学期学习了解一下vue框架,正巧在此时实验室接手了一个全新的项目,于是我就全身心投入到了vue的研究中.下面是我总结的一些我的第一个vue项目的过程.问题等等. 首先要先搭建一下vue运行环境: 1.下载node.js  (http://www.runoob.com/nodejs/nodejs-install-setup.html) 2.基于node.js,利用淘宝npm镜像安装相关依赖,在cmd里直接输入:npm i

如何在 vue 项目里正确地引用 jquery 和 jquery-ui的插件

copy内容的网址: https://segmentfault.com/a/1190000007020623 使用vue-cli构建的vue项目,webpack的配置文件是分散在很多地方的,而我们需要修改的是build/webpack.base.conf.js,修改两处的代码 // 在开头引入webpack,后面的plugins那里需要 var webpack = require('webpack') // resolve module.exports = { // 其他代码... resolv