【vue2.0后台项目之登陆】01登陆开发流程分析

1.前言

本文将致力于描述一个vue2.0后台系统的登陆业务流程,从后台项目常用的模板 vue-admin-template模板分析,到axios的二次封装,发起请求接口都会涉及到。不足之处,还请各位大佬指正。
后台管理系统API接口在线文档1
后台管理系统API接口在线文档2
登陆接口在线文档
在这里插入图片描述

2.vue-admin-template模板介绍

后台项目也称为B端项目,因为后台项目不需要多个用户去访问【比如淘宝京东购物网站】,只是公司内部人员去使用,所以账号通常由开发人员提前在数据库分配好,然后分配给公司的领导和一般的员工【所以后台项目也会涉及到权限管理】,所以一般后台项目只带有登陆功能,无需注册。

简洁版开源地址
加强版开源地址
在这里插入图片描述

而有一个大佬,具体叫啥名忘记了,暂且叫他大佬吧,开发了这么一套用于后台系统的模板【vue-admin-template】,在这套模板里,他将整个项目分成了三大区域,示例图如下
左侧侧边导航栏Sidebar,顶部导航栏 Navbar组件和中间展示区域组件AppMain,这三个组件都保存在名为layout骨架的文件夹里,layout代表着整个项目页面【可以理解类似于root根组件】
在这里插入图片描述

在这里插入图片描述

3. vue-admin-template模板结构分析

模板的文件与文件夹认知【简洁版】

  • build
    ----index.js webpack配置文件【很少修改这个文件】
  • mock
    ----mock数据的文件夹【模拟一些假的数据mockjs实现的】,因为咱们实际开发的时候,利用的是真是接口
  • node_modules
    ------项目依赖的模块
  • public
    ------ico图标,静态页面,publick文件夹里面经常放置一些静态资源,而且在项目打包的时候webpack不会编译这个文件夹,原封不动的打包到dist文件夹里面
  • src
    -----程序员写代码的地方
    ------api文件夹:涉及请求相关的
    ------assets文件夹:里面放置一些静态资源(一般共享的),放在aseets文件夹里面静态资源,在webpack打包的时候,会进行编译
    ------components文件夹:一般放置非路由组件获取全局组件
    ------icons这个文件夹的里面放置了一些svg矢量图
    ------layout文件夹:他里面放置一些组件与混入
    ------router文件夹:与路由相关的
    -----store文件夹:一定是与vuex先关的
    -----style文件夹:与样式先关的
    ------utils文件夹:request.js是axios二次封装文件****
    ------views文件夹:里面放置的是路由组件
    -App.vue:根组件
  • main.js:入口文件
  • permission.js:与导航守卫先关、
  • settings:项目配置项文件
  • .env.development 开发环境的配置文件
  • .env.producation 生产环境的配置文件

在这里插入图片描述

4.axios的二次封装

  1. 一般工具类的接口会放在src下的utils目录中,此处request.js代码对axios进行了二次封装,vue-admin-template这个模板原本就对axios进行了二次封装,但是由于这个模板是2015年开发的,时间比较久远,那时还没有async 和await,所以该模板是用的new Promise处理请求,此处我们对这个文档做一些处理【将promise改为async await】
  2. 设置了请求拦截器和响应拦截器,在每次请求发送之前,为所有的请求添加上了唯一的token标识符【大有用处】;在每次请求响应之后,对不同响应状态码做一些处理
import axios from 'axios'
import { MessageBox, Message } from 'element-ui'
// 导入仓库是为了获取到保存在里面的token
import store from '@/store'
import { getToken } from '@/utils/auth'


// axios的二次封装文件
// create an axios instance
const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
  // withCredentials: true, // send cookies when cross-domain requests
  timeout: 5000 // request timeout
})

// 设置请求拦截器,在每次请求发送之前做些事情,并对请求失败做些处理
service.interceptors.request.use(
  config => {
    // do something before request is sent
    // 响应失败在干什么
    if (store.getters.token) {
      // let each request carry token
      // ['X-Token'] is a custom headers key
      // please modify it according to the actual situation
      config.headers['token'] = getToken()
    }
    return config
  },
  error => {
    // do something with request error
    console.log(error) // for debug
    return Promise.reject(error)
  }
)
// 设置响应拦截器,在每次响应之后做些事情,
service.interceptors.response.use(
  /**
   * If you want to get http information such as headers or status
   * Please return  response => response
  */

  /**
   * Determine the request status by custom code
   * Here is just an example
   * You can also judge the status by HTTP Status Code
   */
  response => {
    const res = response.data

    // 响应失败在干什么
    if (res.code !== 20000  && res.code!==200) {
      Message({
        message: res.message || 'Error',
        type: 'error',
        duration: 5 * 1000
      })

      // 50008: Illegal token; 50012: Other clients logged in; 50014: Token expired;
      if (res.code === 50008 || res.code === 50012 || res.code === 50014) {
        // to re-login
        MessageBox.confirm('You have been logged out, you can cancel to stay on this page, or log in again', 'Confirm logout', {
          confirmButtonText: 'Re-Login',
          cancelButtonText: 'Cancel',
          type: 'warning'
        }).then(() => {
          // 组件中修改vuex的数据,this.$store.dispatch('action中的方法名',数据) ;开启命名空间后,组件中调用dispatch, this.$store.dispatch(模块化名字/action中的方法名)
          store.dispatch('user/resetToken').then(() => {
            // BOM浏览器对象提供的API location ,表示重新加载来自当前 URL 的资源。
            location.reload()
          })
        })
      }
      return Promise.reject(new Error(res.message || 'Error'))
    } else {
      return res
    }
  },
  error => {
    console.log('err' + error) // for debug
    Message({
      message: error.message,
      type: 'error',
      duration: 5 * 1000
    })
    return Promise.reject(error)
  }
)

export default service

5.请求后端接口

根据接口文档的要求来发起请求,data表示请求体,params表示地址栏中的查询字符串
例如下图
用户登录接口:
请求方式:post
请求地址/admin/acl/index/login
请求头参数token (已经在axios请求拦截器中封装好了)
请求体data(包括用户名和密码)
请求成功返回 状态码200

获取用户信息接口:
请求方式:get
请求地址/admin/acl/index/info
请求头参数token (已经在axios请求拦截器中封装好了)
请求体 无
请求成功 返回状态码200

用户登录接口文档
在这里插入图片描述

获取用户信息接口文档

在这里插入图片描述

// 引入axios二次封装文件
import request from '@/utils/request'
// 对外暴露登陆接口
export function login(data) {
  return request({
    url: '/admin/acl/index/login',
    method: 'post',
    data
  })
}
// 对外暴露获取用户信息接口
export function getInfo(token) {
  return request({
    url: '/admin/acl/index/info',
    method: 'get',
  })
}
// 对外暴露退出接口
export function logout() {
  return request({
    url: '/admin/acl/index/logout',
    method: 'post'
  })
}

6.表单验证

7.派发action,在action中发起请求

如果表单符合验证规则,就会派发action,在user模块的action中调用前端写好的请求逻辑【见第五小点请求后端接口】,如果不符合验证规则,提示错误提交,如果既符合验证规则又成功登录,就保存token到store仓库中并进行路由跳转

//user.js store模块中写以下代码
const actions = {
  // user login 处理登陆业务员,发起用户登陆请求
  async login({ commit }, userInfo) {
    // 结构赋值出用户名和密码
    const { username, password } = userInfo
    let result=await login({ username: username.trim(), password: password })
    // 登陆成功
    if(result.code===200 || result.code===20000){
        // 触发 SET_TOKEN mutation,并传递参数,更新store仓库保存的token
        commit('SET_TOKEN', result.data.token)
        // 使用cookie技术保存token
        setToken(result.data.token)
        return 'ok'
    }else{
      // 登陆失败
        return Promise.reject(new Error('fail'))
    }
  },
//点击登录按钮后执行以下代码
    handleLogin() {
      //表单验证,验证用户名和密码是否符合验证规则,符合返回true 不符合返回false
      this.$refs.loginForm.validate(valid => {
       
        if (valid) {
          // 开启登陆按钮加载图标
          this.loading = true
          // 触发 store的actions方法 user模块的login方法,并携带 表单参数
          this.$store.dispatch('user/login', this.loginForm).then((res) => {
            // 登陆成功跳转到主页或重定向 
            this.$router.push({ path: this.redirect || '/' })
            // 关闭登陆按钮加载图标
            this.loading = false
          }).catch(() => {
            this.loading = false
          })
        } else {
          
          console.log('error submit!!')
          return false
        }
      })
    }

8.token的用处

🏻 token是什么意思
作为计算机术语时,是“令牌”的意思。Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码。

token其实说的更通俗点可以叫暗号,在一些数据传输之前,要先进行暗号的核对,不同的暗号被授权不同的数据操作。说白了token是一个身份卡,有权限的作用。例如在USB1.1协议中定义了4类数据包:token包、data包、handshake包和special包。主机和USB设备之间连续数据的交换可以分为三个阶段,第一个阶段由主机发送token包,不同的token包内容不一样(暗号不一样)可以告诉设备做不同的工作,第二个阶段发送data包,第三个阶段由设备返回一个handshake包。

🏻 token产生的背景
HTTP 是一种没有状态的协议,也就是它并不知道是谁是访问应用。这里我们把用户看成是客户端,客户端使用用户名还有密码通过了身份验证,不过下回这个客户端再发送请求时候,还得再验证一下。

🏻 token是用来干嘛的
使用token机制的身份验证方法,在服务器端不需要存储用户的登录记录。

大概的流程:

1️⃣客户端使用用户名和密码请求登录。

2️⃣服务端收到请求,验证用户名和密码。

3️⃣验证成功后,服务端会生成一个token,然后把这个token发送给客户端。

4️⃣客户端收到token后把它存储起来,可以放在cookie或者Local Storage(本地存储)里。

5️⃣客户端每次向服务端发送请求的时候都需要带上服务端发给的token。

6️⃣服务端收到请求,然后去验证客户端请求里面带着token,如果验证成功,就向客户端返回请求的数据。

🌱 token的使用小结:
◾ 前端登陆的时候向服务器发送请求,服务器验证成功,会生成一个token

◾ 前端会存储这个token,放在session或cookie中,用于之后的业务请求身份验证

◾ 拿着这个token,可以在当前登录的账号下进行请求业务,发送请求时,token会放在请求头里,服务器收到这个业务请求,验证token,成功就允许这个请求获取数据

◾ token可以设置失效期
参考文章

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
计算机硬件系统: 计算机硬件系统是构成计算机物理实体的所有部件的集合,包括核心组件以及外设。其主要组成部分包括: 中央处理单元 (CPU):作为计算机的大脑,负责执行指令、进行逻辑运算和数据处理。 内存:包括随机访问内存 (RAM) 和只读存储器 (ROM),用于临时或永久地存储程序和数据供CPU快速访问。 存储设备:如硬盘、固态硬盘 (SSD)、光盘驱动器等,用于长期保存大量的程序和数据。 输入/输出设备:如键盘、鼠标、显示器、打印机、扫描仪、摄像头等,实现人与计算机之间的交互以及数据的输入和输出。 主板:连接和协调各硬件组件工作,包含芯片组、扩展插槽、接口等。 其他外设:如声卡、网卡、显卡等,提供特定功能支持。 计算机软件系统: 软件系统是指在硬件之上运行的各种程序和数据的集合,分为两大类: 系统软件: 操作系统 (OS):如Windows、macOS、Linux、Unix等,是管理和控制计算机硬件与软件资源、提供公共服务、协调计算机各部分工作的基础平台,是用户与计算机硬件之间的桥梁。 驱动程序:为特定硬件设备提供接口,使操作系统能够识别和控制这些设备。 实用工具:如编译器、链接器、调试器、文件管理器等,协助开发、维护和管理计算机系统。 应用软件: 办公套件:如Microsoft Office、LibreOffice,包括文字处理、电子表格、演示文稿等工具。 专业软件:如AutoCAD(工程制图)、Adobe Creative Suite(图形设计与多媒体编辑)、MATLAB(数值计算与数据分析)等,针对特定行业或任务的专业应用。 互联网应用:如浏览器、电子邮件客户端、即时通讯软件、社交媒体平台等。 游戏:休闲游戏、网络游戏、模拟游戏等各类娱乐软件。 信息系统: 在企业、机构或组织中,信息系统是指由硬件、软件、人员、数据资源、通信网络等组成的,用于收集、处理、存储、分发和管理信息,以支持决策制定、业务运营和战略规划的系统。这类系统包括: 数据库管理系统 (DBMS):如Oracle、MySQL、SQL Server,用于创建、维护和查询结构化数据。 企业资源计划 (ERP):整合企业的财务、供应链、人力资源、生产等多方面管理功能的综合性信息系统。 客户关系管理 (CRM):用于管理与客户互动的全过程,提升销售、营销和服务效率。 供应链管理 (SCM):优化供应链流程,包括采购、库存、物流、分销等环节。 决策支持系统 (DSS):辅助决策者分析复杂问题,提供数据驱动的决策建议。 网络系统: 包括局域网 (LAN)、广域网 (WAN)、互联网 (Internet) 等,通过路由器、交换机、调制解调器等网络设备,以及通信协议(如TCP/IP),实现计算机之间的数据传输和资源共享。 分布式系统: 由多台计算机通过网络互相协作,共同完成一项任务的系统。分布式系统可以提供高可用性、可扩展性、负载均衡等优点,如云计算平台、分布式数据库、区块链系统等。 安全系统: 旨在保护计算机系统免受恶意攻击、未经授权访问、数据泄露等安全威胁的措施和工具,包括防火墙、入侵检测系统、防病毒软件、身份认证与访问控制机制、数据加密技术等。 综上所述,计算机领域的“系统”概念广泛涉及硬件架构、软件层次、信息管理、网络通信、分布式计算以及安全保障等多个方面,它们相互交织,共同构成了现代计算机技术的复杂生态系统。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值