vue-admin-template学习(一)

2023-11-01

vue-admin-template

在学习vue的过程中,想要获取一个vue的脚手架,便于快速进行开发,选择了vue-admin-template,将该框架进行二次开发,作为vue初学者,踩了很多坑,以此记录分析和修改。

github:https://github.com/PanJiaChen/vue-admin-template
branch: tag\3.11.0

框架结构

在这里插入图片描述
至于在src中的结构,就是基本的vue项目结构了。

克隆运行项目

  1. 在IDEA中打开该项目
  2. cnpm install(首先注册好淘宝的npm,这里就不记录了)
  3. cnpm run dev
  4. 浏览器访问 http://localhost:9528/ 即可看到登录页面

vue-admin-template项目改造

要想对已有的demo进行二次开发,首先的是要对demo进行了解,我认为要想比较快速的上手进行开发,拿出demo的某个请求进行分析,然后将该完整的请求过程换成自己所要开发的项目。在这里,我就拿出vue-admin-template的“登录”请求做分析。

(一)分析登录请求的思路

请求路线

在这里插入图片描述
既然是登录功能,那么就从登录页面开始分析。
在src\views\login\index.vue中:
除开页面基本的输入验证信息,剩下的主要方法就是登录了,如下:

handleLogin() {
      this.$refs.loginForm.validate(valid => {
        if (valid) {
          this.loading = true
          this.$store.dispatch('Login', this.loginForm).then(() => {
            this.loading = false
            this.$router.push({ path: this.redirect || '/' })
          }).catch(() => {
            this.loading = false
          })
        } else {
          console.log('error submit!!')
          return false
        }
      })
    }
登录

(1) this.$store.dispatch('Login', this.loginForm).then(()
该请求使用$store.diepatch调取src\store\modules里的user.js的Login方法,如下:

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

(2)login(username, userInfo.password).then(response =>
在new Promise中,通过login调用了src\api的login.js中的login方法
如下:

import request from '@/utils/request'
export function login(username, password) {
  return request({
    url: '/user/login',
    method: 'post',
    data: {
      username,
      password
    }
  })
}

(3)该方法中return request,显然调用了第一行import request对应的文件中的方法。src\utils中的request.js很重要。该方法创建axios实例、 request拦截器、response 拦截器。如下:

创建axios实例
// 创建axios实例
const service = axios.create({
  baseURL: process.env.BASE_API, // api 的 base_url
  timeout: 5000 // 请求超时时间
})

在该方法中,很重要的一点是baseURL的指向。
其指向了config下的dev.env.js中的配置,如下:

module.exports = merge(prodEnv, {
  NODE_ENV: '"development"',
  BASE_API: '"https://easy-mock.com/mock/5950a2419adc231f356a6636/vue-admin"',
})

在后面进行二次开发时,需要将BASE_API的值修改为实际项目的接口基本地址,如http://localhost:8082。

request拦截器
// request拦截器
service.interceptors.request.use(
  config => {
    if (store.getters.token) {
      config.headers['X-Token'] = getToken() // 让每个请求携带自定义token 请根据实际情况自行修改
    }
    return config
  },
  error => {
    // Do something with request error
    console.log(error) // for debug
    Promise.reject(error)
  }
)

该拦截器主要在有request时,如果在store中存储有token则在headers中带上x-Token,实际这个拦截器中直接return config即可,
然后在登录完成后,访问其他页面的时候带上token访问。这个暂时不考虑分析。

response 拦截器
service.interceptors.response.use(
  response => {
    /**
     * code为非20000是抛错 可结合自己业务进行修改
     */
    const res = response.data
    if (res.code !== 20000) {
      Message({
        message: res.message,
        type: 'error',
        duration: 5 * 1000
      })
      ------省略------
      return Promise.reject('error')
    } else {
      return response.data
    }
  },
  error => {
    console.log('err' + error) // for debug
    Message({
      message: error.message,
      type: 'error',
      duration: 5 * 1000
    })
    return Promise.reject(error)
  }
)

该拦截器主要用于在请求完后,后台返回的消息进行处理。

(4)这个”登录“请求从开始发起request到response结束,基本流程就是这样。那么,在该项目登录模块中,form数据的提交到验证在到返回数据,获取token,获取用户信息,怎么都没有看到在上面分析的方法中呢。原因是在上面的框架结构图中,使用了mock,mock的简单使用请看vue中使用mock

(5)在mock目录中,index.js中,定义了mock的拦截,将对“登录”请求的提交/user/login进行拦截,如下:

import userAPI from './user'

Mock.mock(/\/user\/login/, 'post', userAPI.login)

该拦截将会调用mock目录下的user.js中的login方法。如下:

login: res => {
    const { username } = JSON.parse(res.body)
    const data = tokens[username]

    if (data) {
      return {
        code: 20000,
        data
      }
    }
    return {
      code: 60204,
      message: 'Account and password are incorrect.'
    }
  },

于是就会将响应数据返回,这样在src\utils\request.js中,response响应拦截就会获取到数据,并进行相应判断,按发起登录请求路线返回,在src\store\modules里的user.js登录方法中设置setToken,直至返回src\views\login\index.vue,并进行相应页面跳转。

(二)分析登录请求结结束

到这里,已经将在vue-admin-template中的“登录”请求进行了分析,其他请求的分析也是这样。作为初学者,在使用这个框架时,碰到了很多问题,分析了比较久的时间,特此记录下,为了以后碰到相应的问题不在耗费太多的时间,也为了给即将学习的朋友一点思路。写得不好,感谢指出。经过分析后,后面将会进行项目的二次开发。

(三)项目改造

首先,我们要改造项目,并且是“登录”功能,那么先根据上面分析的,修改项目的API接口为我们自己的,通过分析,如下:

dev.env.js配置

(1)运行起来项目后,打开浏览器访问,F12打开调试控制台,选择Sources中,打开上述分析中的request.js,在如图位置打上断点,在request拦截器中,查看config中的数据
在这里插入图片描述
或者在console中,直接打上“config”查看
在这里插入图片描述
可以看到此处的baseURL的值为项目下config目录中,dev.env.js中配置的BASE_API
在这里插入图片描述

登录响应

在上述方法中,再次在request.js的响应拦截处打个断点,查看响应的数据,如下:
在这里插入图片描述
在这里插入图片描述
可以看到相应的数据,而该数据的产生,就源于我们上面说的项目mock模拟数据,mock目录下index.js拦截了url,调用了user.js中的login方法
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
于是在request.js的response拦截中获取了相应的数据。

修改

(1)将dev.env.js中的BASE_API值修改为项目(这里已我已有的后端项目接口举例,已启动后端项目)
在这里插入图片描述
这时来试试登录会怎么样,还是在request.js上的两个拦截器中打上断点
在这里插入图片描述
在这里插入图片描述

从图中可以看出来,接口的baseURL已经变成我们想要的,但是竟然响应返回的值还是mock中的模拟数据,并且跳过断点后,仍然是登录成功进入系统。
这里还是mock拦截在操作,并不会真正访问我们自己项目的api
一种解决方法:
在这里插入图片描述
如上图,将mock拦截注销掉就可以了,这样user/login就不会被mock拦截,就可以访问我们的后端api。

(2)后端登录接口:http://localhost:8082/login
postman测试:
在这里插入图片描述
在这里插入图片描述
在src\api\login.js中,将login方法的请求路径修改为/login(原来为/user/login)
在这里插入图片描述
这样,当点击登录时就可以调用我们的后端登录api接口了。
再次测试登录页面登录功能
先输入错误的密码
报错信息图
在这里插入图片描述
可以看到返回的结果中就是我们后端接口的返回数据。上图中报错消息的处理后面在进行。

输入正确的密码
在这里插入图片描述
可以看出返回了正确的数据,报错信息仍然和上面的报错信息图一样。因为我们还没对request.js中的response拦截器中的code进行修改,它判断出code不为20000的都是报错误消息,但是我们的后端接口200是正常,非200是异常。所以接下来,我们对拦截器进行简单修改,仅作为思路。

(3)下面贴上修改前和修改后的

import { Message, MessageBox } from 'element-ui'   //这个位置也注意,后面不使用MessageBox要删除,否则报错

service.interceptors.response.use(
  response => {
    /**
     * code为非20000是抛错 可结合自己业务进行修改
     */
    const res = response.data
    if (res.code !== 20000) {
      Message({
        message: res.message,
        type: 'error',
        duration: 5 * 1000
      })

      // 50008:非法的token; 50012:其他客户端登录了;  50014:Token 过期了;
      if (res.code === 50008 || res.code === 50012 || res.code === 50014) {
        MessageBox.confirm(
          '你已被登出,可以取消继续留在该页面,或者重新登录',
          '确定登出',
          {
            confirmButtonText: '重新登录',
            cancelButtonText: '取消',
            type: 'warning'
          }
        ).then(() => {
          store.dispatch('FedLogOut').then(() => {
            location.reload() // 为了重新实例化vue-router对象 避免bug
          })
        })
      }
      return Promise.reject('error')
    } else {
      return response.data
    }
  },
  error => {
    console.log('err' + error) // for debug
    Message({
      message: error.message,
      type: 'error',
      duration: 5 * 1000
    })
    return Promise.reject(error)
  }
)

修改后:

import { Message } from 'element-ui'

// response 拦截器
service.interceptors.response.use(
  response => {
    /**
     * code为非20000是抛错 可结合自己业务进行修改
     */
    const res = response.data
    console.log(res)
    if (res.code !== 200) {
      Message({
        message: res.msg,
        type: 'error',
        duration: 5 * 1000
      })

      // // 50008:非法的token; 50012:其他客户端登录了;  50014:Token 过期了;
      // if (res.code === 50008 || res.code === 50012 || res.code === 50014) {
      //   MessageBox.confirm(
      //     '你已被登出,可以取消继续留在该页面,或者重新登录',
      //     '确定登出',
      //     {
      //       confirmButtonText: '重新登录',
      //       cancelButtonText: '取消',
      //       type: 'warning'
      //     }
      //   ).then(() => {
      //     store.dispatch('FedLogOut').then(() => {
      //       location.reload() // 为了重新实例化vue-router对象 避免bug
      //     })
      //   })
      // }
      return Promise.reject('error')
    } else {
      return response.data
    }
  },
  error => {
    console.log('err' + error) // for debug
    Message({
      message: error.msg,
      type: 'error',
      duration: 5 * 1000
    })
    return Promise.reject(error)
  }
)

在这里插入图片描述
再次登录,发现打印的登录成功,但是会报错,那是因为登录成功后触发了获取用户信息的方法,获取出错。后端api接口在登录成功时返回了用户的信息。要设置用户信息等,可以在下面的方面内设置,包括token,关于获取用户信息就不说了。

项目改造结语

关于对vue-admin-template的分析和改造就到此了,通过分析一个登录请求到响应,了解该项目的流程及功能点。至于其他的,可以参考该登录请求作为了解。
作为初学者,很多前端的知识都没有掌握,见谅,如有错误请指出,以期进步,感谢!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vue-admin-template学习(一) 的相关文章

随机推荐

  • VC10中的C++0x特性 Part 2 (3):右值引用

    VC10中的C 0x特性 Part 2 3 右值引用 来源 vcblog 作者 Stephan T Lavavej 翻译 飘飘白云 转载时请注明作者和出处 未经许可 请勿用于商业用途 简介 这一系列文章介绍Microsoft Visual
  • 虚拟内存、虚拟地址空间和物理地址空间(内存管理)

    文章目录 前言 一 虚拟地址和物理地址 二 虚拟内存 三 为什么引入虚拟内存 前言 虚拟内存 虚拟地址空间和物理地址空间 一 虚拟地址和物理地址 地址空间是一个非负整数地址的有序集合 在一个带虚拟内存的系统中 CPU从一个有N pow 2
  • vue3使用ElementPlus的消息el-message样式不生效或者被遮盖(z-index)

    问题1 el message自定义样式不生效 想改弹出框的位置时不生效 使用了el message的自定义类的custom class属性也不行 原因应该是加了scoped后使用到里面样式的dom会添加data v xxxx这种属性防止cs
  • spring JDBCTemplate 批量插入 返回id 批量插入返回批量id

    http www iteye com topic 1135650 1 插入一条记录返回刚插入记录的id Java代码 public int addBean final Bean b final String strSql insert in
  • 红黑树和AVL树的比较分析

    定义 AVL树全称是平衡二叉搜索树 相比于红黑树 他是一种高度平衡的二叉搜索树 所有节点的左右子树高度差不超过1 红黑树是一种弱平衡的二叉搜索树 它只要求部分达到平衡 其保证最长路径最多是最短路径的2倍 增删查比较 插入 就插入节点导致树失
  • 团队管理和协作,Markdown,原型的使用

    背景 公司的技术文档和接口都需要多人合作编写 博客只能是个人的技术总结 无法有效的团队管理 最终 技术文档 接口 数据字典 查看Demo web页面原型 app原型 在线作图 流程图 思维导图 原型图 UML 网络拓扑图 组织结构图
  • 【信息】宁波银行金融科技部:常见问题解答

    0 内推 我的内推码 90OF50 宁波银行金融科技部2023届校招开始了 内推码 90OF50 社招请直接与我联系哦 1 说明 本文是对很多朋友都关心的一些问题的集中解答 以免大家重复地询问一样的问题 大家自取自己关注的内容即可 顺序可能
  • Android Studio制作简单计算器

    代码地址 https github com xjhqre android calculator 效果演示 1 连续加法 2 连续减法 3 连续乘法 4 连续除法 5 优先级运算 6 退格功能 7 错误提示 制作步骤 1 创建按钮图片 1 1
  • bat小游戏代码大全_Python俄罗斯方块游戏代码

    本游戏共两个文件 blocks py和main py blocks py定义各类方块 main py定义游戏画面 blocks py import randomfrom collections import namedtuplePoint
  • CSS导航栏及下拉菜单

    导航栏对于一个网站来说非常重要 熟练地使用CSS可以转换成好看的导航栏而不是枯燥的HTML菜单 导航栏基本上是一个链接列表 所以使用 ul ul 和 li li 元素非常有意义 导航栏就是建立在列表标签的精确熟练使用上 小复习 伪类的使用方
  • SQL的开窗函数

    引用 在开窗函数出现之前存在着非常多用 SQL 语句非常难解决的问题 非常多都要通过复杂的相关子查询或者存储过程来完毕 为了解决这些问题 在2003年ISO SQL标准增加了开窗函数 开窗函数的使用使得这些经典的难题能够被轻松的解决 眼下在
  • 怎么查看端口号被哪个程序占用从而解决端口冲突

    在java后台开发过程中我们可能都会遇到端口被占用的问题 但是此时又不知道端口被哪个端口占用 用下面方法可以查看端口是被哪个程序占用 然后结束这个程序就可以解决端口被占用的问题 1 按windows R键 输入cmd命令 回车 2 输入ne
  • 【微信小程序开发】一文带你详解小程序组件和 API 的使用

    引言 在小程序开发中 组件和API是非常重要的部分 它们可以帮助我们构建丰富的用户界面和实现各种功能 本文将介绍小程序中常用的组件和API 并提供相应的代码示例 文章目录 引言 组件 文本组件 图片组件 按钮组件 输入框组件 列表组件 AP
  • 三大移动Web开发框架哪个适合你?

    我最近特别关注JavaScript驱动的移动应用开发解决方案 先后撰文介绍了众多的相关话题 包括jQuery Mobile jQTouch Sencha Touch和PhoneGap 我得承认 要搞清楚这一批前沿技术并非易事 于是我这回概述
  • java远程调试_Java 远程调试原理(学习笔记)

    Java远程调试的原理 JDWP Java Debug Wire Protocol 两个VM之间通过debug协议进行通信 然后以达到远程调试的目的 两者之间可以通过socket进行通信 其中 调试的程序常常被称为debugger 而被调试
  • postgis中将数据库备份到其它数据库中还原

    1 备份数据库 可以用命令操作 pg dump U postgres h hostip d joint boot Fc gt D python Project PG data joint jar 2 创建新的数据库 可以在其它postgis
  • vCard和MECARD格式

    vcard和MECARD都是电子名片的格式 这几篇文章介绍都很详细 MECARD格式的电子名片简单介绍 链接1 链接2 vCard格式 链接 分割线 补充一个只有微信扫码时会出现的问题 不管是vCard还是MECARD 也不管vCard是2
  • SpringBoot优缺点分析

    Spring的优点分析 Spring是Java企业版 Java Enterprise Edition JEE 也称J2EE 的轻量级代替品 无需开发重量级的Enterprise JavaBean EJB Spring为企业级Java开发提供
  • java进阶一:java集合

    1 集合简介 集合和数组类似 都是储存元素的容器 数组像是静态容器 长度一旦创建就不能再改变 元素类型必须统一 只能通过下标去索引元素等 集合像是动态容器 集合的长度可以动态的改变 元素类型可以不一致 可以用某个映射的关系去索引元素等 ja
  • vue-admin-template学习(一)

    vue admin template学习 一 vue admin template 框架结构 克隆运行项目 vue admin template项目改造 一 分析登录请求的思路 请求路线 登录 创建axios实例 request拦截器 re