vue-element-admin

更新一个解决问题的思路,作为例子,见文章末尾

vue-admin使用

首先,一句话:

物有本末,事有始终,追根溯源,心无旁骛。

1. 以添加页面讲解所谓物有本末

添加一个页面,vue中是在views中创建,在router中注册,即可。成功访问的前提是你要完成这两个步骤。

我们习惯于先在脑海中建立一个框架,再去画页面,画页面时也是先在脑海中建立一个框架,再去添加页面元素。这都是一个从无到有的过程。

首先,我们要知道我们要画哪几个页面,其次,我们去views中创建,然后,我们在router中注册。

1.1 找到src下的router.js,代码位置可参考已有页面对应的位置,代码示例:

  {
    path: '/sys',
    component: Layout,
    redirect: '/sys/user', //如果用户地址栏输入地址/sys则重定向到/sys/user
    alwaysShow: true, 
    meta: {
      title: '系统设置',
      icon: 'setting',
      roles: ['admin', 'editor'] 
    },
    children: [
      {
        path: '/sys/user',
        component: () => import('@/views/sys/user/index.vue'),
        name: 'sysUser',
        meta: {
          title: '用户管理',
          icon: 'user',
          roles: ['admin'] 
        }
      },
      {
        path: '/sys/dept',
        component: () => import('@/views/sys/dept/index.vue'),
        name: 'sysDept',
        meta: {
          icon: 'dept',
          title: '部门管理'
          
        }
      },
      {
        path: '/sys/role',
        component: () => import('@/views/sys/role/index.vue'),
        name: 'sysRole',
        meta: {
          icon: 'role',
          title: '角色管理'
          
        }
      }
    ]
  },

路由配置项如下:

{
  path: '/permission',
  component: Layout,
  redirect: '/permission/index', //重定向地址,在面包屑中点击会重定向去的地址
  hidden: true, // 不在侧边栏线上
  alwaysShow: true, //一直显示根路由
  meta: { roles: ['admin','editor'] }, //你可以在根路由设置权限,这样它下面所以的子路由都继承了这个权限
  children: [{
    path: 'index',
    component: ()=>import('permission/index'),
    name: 'permission',
    meta: {
      title: 'permission',
      icon: 'lock', //图标
      role: ['admin','editor'], //或者你可以给每一个子路由设置自己的权限
      noCache: true // 不会被  缓存
    }
  }]
}

1.2 新建你所添加的页面在相应的位置

如上示例,你需要在views中新建sys/role/index.vue、sys/dept/index.vue、sys/user/index.vue三个vue文件,并写入相关内容即可。

2. 以书写api来讲解所谓追根溯源

我们开发是使用前后端分离的方式,所以前端需要调用后端的接口来完成通信。

书写api很简单,发起ajax请求,传过去参数,接收到请求,这就完成了一次通信。

vue-admin中已经封装好了axios在src/utils/request.js中,我们直接使用即可。

2.1 找到src下的api文件夹

创建一个js文件,如下示例:

//login.js
import request from '@/utils/request' //引入封装好的axios请求

export function loginByUsername(username, password) {
  const data = {
    username,
    password
  }
  return request({
    url: '/login/login',
    method: 'post',
    data
  })
}

export function logout() {
  return request({
    url: '/login/logout',
    method: 'post'
  })
}

export function getUserInfo(token) {
  return request({
    url: '/sys/user/info',
    method: 'get',
    params: { token }
  })
}

export出去一个方法即可,方法内容参考上述示例

几个重点

  • request.js中有一个baseURL设置的是全局的接口前缀,你不需要设置它,你只需要在config文件夹中的dev.env.js文件和其他几个js文件中,设置
BASE_API: '"http://yapi.hzhengji.cn/mock/31/"' //使用对应的mock接口地址
  • 登录时出现的问题汇总:

    • 登录失败:可能是接口地址不正确,或者是前缀不正确。首先,去查看BASE_API是否设置正确,其次,去查看接口文件(如上例login.js)的url是否设置正确,最后,查看参数字段是否正确。

    • 获取用户信息失败:如果上述的几个过程都排查过了,却仍然登录不成功,比如报错roles must be a non-null array,那是因为获取用户信息失败。 在src文件夹下,有一个permission.js文件,里面有个router.beforeEach钩子,其中设置了每次页面跳转之前调用判断用户信息,里面调用了一个action,GetUserInfo。在GetUserInfo中设置了如果没有权限,则报错。

      解决办法:mock一个接口来获取用户信息的,具体接口内容,参考以往项目的/user/info接口。

3. 持续交付,切勿过多地停留

刚才讲个两个案例,分别举例说明如何开展工作以及可能遇到的问题。这些问题比较常见,当然还有很多不可预见的问题,接下来讲我们会讲如何定位问题和如何解决

首先,如何开展工作:

  • 抓重点,略过无关紧要的东西,不要关心具体的细节的东西,先把握全局,知道每个部分如何协同工作的。像带兵打仗一样,不需要知道每个士兵的能力,只需要知道这个营这个团的能力。

  • 追溯源头,先想要做什么,再想实现的路线,然后去实现。

  • 最后学会问问题。

3.1 抓重点

看一个框架先看整体的结构和思路,然后逐步拆解消化。当然这个拆解消化的过程是你逐步完善一个项目的过程,而不是你先学会所有的,再去完善一个项目。

也就是说,从实战中去学习体会这个框架的一些思路。

很简单的一个例子,即使你不知道x+y=z,你也可以写出来x+y+x+y=z+z。模仿是我们的天性,你可以不知道axios的封装内容,但是你可以根据别人写过的如何调用后台api接口的方法去写你自己的api方法。

3.2 追溯源头

学会追溯源头而不是一筹莫展。

举个实战中的例子:实现登录功能(具体的原理思路手摸手已经讲得很清楚https://juejin.im/post/59097cd7a22b9d0065fb61d2,这里不再累述,只讲如何实现。)

你下载了vue-admin,要把接口改成我们自己mock的,于是你需要(上面有过介绍,再来过一遍流程):

(1)找到BASE_API,改为我们自己的mock地址。

(2)找到login.js,把login的url改为自己项目的,把getuserinfo也改成自己项目的。

那么要说一下怎么知道是这两个文件的。我们要改登录的接口,就要先看登录的逻辑,找到登录的页面。

(1)找到登录页面:如何找,如果这个项目比较大,不容易找,那么按照下面的步骤。

首先,启动项目,找到项目url,(http://localhost:9527/#/login?redirect=%2Fdashboard),发现路 径是login。

其次,去router中搜索这个path,发现component: () => import('@/views/login/index')

最后,找到login文件夹下的index。

(2)打开登录页面,找到登录的方法,handleLogin,查看一下逻辑。

首先,验证登录表单,如果验证不通过,则console.log('error submit!!')。可以得知,如果你控制台打印的是error submit,那么问题就知道处在哪了。

其次,验证通过后,调用this.$store.dispatch('LoginByUsername', this.loginForm),这是一个vuex的action,如果你不知道,没关系,接着向下找。进入store的modules文件夹中,找到user.js,打开。全局搜索一下LoginByUsername,发现在一个action里面,这就是登录页面的登录按钮所执行的方法。

然后,我们看一下LoginByUsername,逻辑大致是LoginByUsername这个action调用LoginByUsername这个同名的api(这个api是在最上面引入的import { loginByUsername, logout, getUserInfo } from '@/api/login'),传给服务器账号密码,服务器验证后传过来token,然后把token存入vuex的state和cookie中。至此,登录就完成了。

(3)什么?有问题,看看控制台是否报接口地址的错误,如果是,看看你的BASE_API是否和控制台打印的错误一致。接口没问题却还是没有跳转?报的错是roles must be a non-null array, 那就可能是前面说过的问题:在src文件夹下,有一个permission.js文件,里面的router.beforeEach的问题

经过如上的修改之后,你的登录功能应该就ok了,其他不可预见的问题自行排查。

3.3 学会问问题。

去问问题之前:

(1)明白你想问什么

(2)已经试过解决但没见成效

(3)话不在多

(4)去除无意义的提问

其次,定位问题和如何解决:

分享几个比较实用的技巧或者说是经验。

  • 照葫芦画瓢页面也没有出现预期的效果

    这时,你需要从几个方面来排查

    • 是否报错,报的错是什么,能否在百度的第一页找到。

      首先,如果没有报错,很大可能是因为你的瓢不是比着画的,而是装逼闭着眼睛画的。

      其次,如果报的错在控制台显示,尝试根据提示信息去排查。排查的方法有两种,一是报的文件错误,vue甚至都提示了你哪一行或者是哪个方法错了,一看就是你的语法或者是用法错误;二是vue报的错误 一般可以通过百度解决。这些一般也是比较容易解决的。如果报的错是弹窗提示的错误,这一般是框架里面某个地方设置的提示错误,你可以根据提示信息进去全局搜索,找到是哪个地方因为什么逻辑才会报的错,定位问题从而解决。

      最后,绝大多数你遇到的问题其实都可以在百度找到,关键在于你的百度方法是否正确。

      如果这些步骤你都没有经历过,就坐在那里一筹莫展,控制台的问题就是小事了,你的问题才是大事。

  • 自己尝试添加一些新的功能

    如果没有出现预期的效果,那么问题很有可能是你的打开方式不对。是否按照官方的指南走的,是否自以为是自己加了一些不必要的代码(很多时候问题解决完总有人会说我以为这样可以)。

  • 定位问题的关键在于不被其他东西干扰

    你要知道自己将要解决的问题是什么,而不是过分关心一些不相干的东西,比如你要注册一个路由,那么你就不要发愁axios是怎么封装的,自己完全不懂。这完全没有关系好吗,你不懂的东西不多了去了你还不懂cpu怎么造的呢你玩什么电脑啊。

    明确自己的问题,顺着逻辑一步步走,就像刚才梳理登录的过程找到登录的api一样。

示例

问题:动态侧边栏的如何写

1、侧边栏在哪里配置
2、动态
第一个问题:查看页面元素,找到侧边栏的class(element这里是el-scrollbar),
在项目里全局搜一下,找到这个所在地方(src\layout\components\Sidebar\index.vue),
可以看出来这个侧边栏是如何生成的了。(剩下的大家看吧)
第二个问题:如何动态?
1、服务器根据你登录成功后的身份自动生成一个router列表返回给你,你直接拿到增加到你的router(可以通过addRoutes)
2、服务器只返回给你身份,你来生成router列表,最后增加到你的router(通过addRoutes)【这个可以参考src\permission.js】
以上基于vue-element-admin-master。
自己搭的管理端框架或者是其他的管理端框架(例如iview-admin)基本大同小异,思路一样

你可能感兴趣的:(vue-element-admin)