015vue

src-store-vuex的模块,
src-router放路由的模块
src-views放的都是页面组件
components一般组件
@路径,指的就是src路径

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

这个方法先取到了loginForm这个表单,然后验证,如果验证成功
this.$store.dispatch(‘user/login’, this.loginForm)
其实就是调用的user.js里面的login方法
src-store-modules-users.js
传值是loginForm
回看login方法
他对参数userInfo做了什么
取出username,password
返回promise(resolve,reject)
箭头函数
值为

login({ username: username.trim(), password: password }).then(response => {
        const { data } = response
        commit('SET_TOKEN', data.token)
        setToken(data.token)
        resolve()
      }).catch(error => {
        reject(error)
      })

但是这里的login并不是递归调用,而是看引入里面,他是引用的api里面的

import { login, logout, getInfo } from '@/api/user'

大致是把url,method和data打包一起了,然后调用函数request,这个request调用了axios,大致就是发送网络请求?

import request from '@/utils/request'

export function login(data) {
  return request({
    url: '/vue-element-admin/user/login',
    method: 'post',
    data
  })
}

回到store-modules-user.js
后面.then(response)得到相应信息
把所有信息封到data
然后commit一个方法,就会触发mutations
然后state.token记录下这次的token(data.token)
然后setToken(也是调用
import { getToken, setToken, removeToken } from ‘@/utils/auth’)
用来js.cookie,把token也存到cookie里
resolve()

所以这个views-login-index.vue的handleLogin()
如果验证成功,就把THIS的loading置为true
然后调用store的dispatch,就会action,
调用user/login
去store/modules/user.js看login方法
首先记录用户名和密码
返回promise函数,实现了login函数
这个login是导入的,所以去看@/api/user’
import { login, logout, getInfo } from ‘@/api/user’
这个login返回request(url,method,data)
request调用axios请求相当于发送一个网络请求。

接着user/login,把response赋给data
commit一个方法就是要改变参数,去看mutations
commit(‘SET_TOKEN’, data.token)

const mutations = {
  SET_TOKEN: (state, token) => {
    state.token = token
  },

就是把data.token赋给state.token
然后setToken也是调用的,其实就是把state赋给cookie

import { getToken, setToken, removeToken } from '@/utils/auth'

然后resolve() ?是干嘛的

然后回到login/index.vue
.then
把router.push
this.loading=false

看permission.js
每次路由跳转都会判断
router.beforeEach(async(to, from, next) => {
从哪来,去哪里,是否放行

NProgress.start()是进度条加载动画
document.title = getPageTitle(to.meta.title)
然后hastoken赋值
如果有token
并且to的path===login
说明已经登录了,但是还要去登录界面
那么会next到’/’
相当于重定向到主界面,自己去试验/login他会定位到/dashboard

else
说明有了coolie不是去登录页

const hasRoles = store.getters.roles && store.getters.roles.length > 0

取hasroles = store.geters.roles
并且roles.length>0
说明,如果有roles并且length>0就任务hasroles=1
不然就设为0

如果hasRoles就放行
不然就
const { roles } = await store.dispatch(‘user/getInfo’)
执行这个action

getInfo({ commit, state }) {
    return new Promise((resolve, reject) => {
      getInfo(state.token).then(response => {
        const { data } = response

        if (!data) {
          reject('Verification failed, please Login again.')
        }

        const { roles, name, avatar, introduction } = data

        // roles must be a non-empty array
        if (!roles || roles.length <= 0) {
          reject('getInfo: roles must be a non-null array!')
        }

        commit('SET_ROLES', roles)
        commit('SET_NAME', name)
        commit('SET_AVATAR', avatar)
        commit('SET_INTRODUCTION', introduction)
        resolve(data)
      }).catch(error => {
        reject(error)
      })
    })
  },

然后再发网络请求,获取用户信息,然后再放行。
如果error就。。。

其他情况,就是没有token

if (whiteList.indexOf(to.path) !== -1) {
      // in the free login whitelist, go directly
      next()

如果是白名单(免登陆)也放行
不然重定向到login去登录?redirect=${to.path}
并且记录了这个用户原本想去的地方
如果有值就跳,没有就主页
相当于如果这个用户登录成功,那么我们就首先跳转到 this.redirect ,否则就调转到主页

this. $ router.push({ path: this.redirect || '/', query: this.otherQuery })

为什么主页是哪个?路由里面写了

 {
    path: '/',
    component: Layout,
    redirect: '/dashboard',
    children: [
      {
        path: 'dashboard',
        component: () => import('@/views/dashboard/index'),
        name: 'Dashboard',
        meta: { title: 'Dashboard', icon: 'dashboard', affix: true }
      }
    ]
  },
  • 19
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值