index.js(入口文件)
import Vue from 'vue'import Vuex from 'vuex'import getters from './getters'Vue.use(Vuex)// https://webpack.js.org/guides/dependency-management/#requirecontextconst modulesFiles = require.context('./modules', true, /\.js$/)// you do not need `import app from './modules/app'`// it will auto require all vuex module from modules fileconst modules = modulesFiles.keys().reduce((modules, modulePath) => {  // set './app.js' => 'app'  const moduleName = modulePath.replace(/^\.\/(.*)\.\w+$/, '$1')  const value = modulesFiles(modulePath)  modules[moduleName] = value.default  return modules}, {})const store = new Vuex.Store({  modules,  getters})export default store
getters.js
const getters = {  sidebar: state => state.app.sidebar,  size: state => state.app.size,  device: state => state.app.device,  visitedViews: state => state.tagsView.visitedViews,  cachedViews: state => state.tagsView.cachedViews,  token: state => state.user.token,  avatar: state => state.user.avatar,  name: state => state.user.name,  introduction: state => state.user.introduction,  roles: state => state.user.roles,  permission_routes: state => state.permission.routes,  errorLogs: state => state.errorLog.logs}export default getters
modules/user.js
import { login, logout, getInfo } from '@/api/user'import { getToken, setToken, removeToken } from '@/utils/auth'import router, { resetRouter } from '@/router'const state = {  token: getToken(),  name: '',  avatar: '',  introduction: '',  roles: []}const mutations = {  SET_TOKEN: (state, token) => {    state.token = token  },  SET_INTRODUCTION: (state, introduction) => {    state.introduction = introduction  },  SET_NAME: (state, name) => {    state.name = name  },  SET_AVATAR: (state, avatar) => {    state.avatar = avatar  },  SET_ROLES: (state, roles) => {    state.roles = roles  }}const actions = {  // user login  login({ commit }, userInfo) {    const { username, password } = userInfo    return new 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)      })    })  },  // get user info  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)      })    })  },  // user logout  logout({ commit, state, dispatch }) {    return new Promise((resolve, reject) => {      logout(state.token).then(() => {        commit('SET_TOKEN', '')        commit('SET_ROLES', [])        removeToken()        resetRouter()        // reset visited views and cached views        // to fixed https://github.com/PanJiaChen/vue-element-admin/issues/2485        dispatch('tagsView/delAllViews', null, { root: true })        resolve()      }).catch(error => {        reject(error)      })    })  },  // remove token  resetToken({ commit }) {    return new Promise(resolve => {      commit('SET_TOKEN', '')      commit('SET_ROLES', [])      removeToken()      resolve()    })  },  // dynamically modify permissions  async changeRoles({ commit, dispatch }, role) {    const token = role + '-token'    commit('SET_TOKEN', token)    setToken(token)    const { roles } = await dispatch('getInfo')    resetRouter()    // generate accessible routes map based on roles    const accessRoutes = await dispatch('permission/generateRoutes', roles, { root: true })    // dynamically add accessible routes    router.addRoutes(accessRoutes)    // reset visited views and cached views    dispatch('tagsView/delAllViews', null, { root: true })  }}export default {  namespaced: true,  state,  mutations,  actions}
vue-element-admin.zip