Perfect login

pull/9/head
johnniang 2019-04-30 11:18:03 +08:00
parent 510daf522c
commit a835758b7f
6 changed files with 31 additions and 102 deletions

View File

@ -233,7 +233,7 @@ export const constantRouterMap = [
},
{
path: '/404',
name: '404',
name: 'NotFound',
component: () => import(/* webpackChunkName: "fail" */ '@/views/exception/404')
}
]

View File

@ -7,6 +7,7 @@ import '@/core/lazy_lib/components_use'
import Viser from 'viser-vue'
import VueCropper from 'vue-cropper'
import 'ant-design-vue/dist/antd.less'
import bootstrap from './bootstrap'
// ext library
import VueClipboard from 'vue-clipboard2'
@ -18,3 +19,5 @@ Vue.use(Viser)
Vue.use(VueStorage, config.storageOptions)
Vue.use(VueClipboard)
Vue.use(VueCropper)
bootstrap()

View File

@ -6,35 +6,18 @@ import store from './store/'
import './logger'
import './core/lazy_use'
import bootstrap from './core/bootstrap'
import './permission'
import '@/utils/filter' // global filter
import './components'
import animated from 'animate.css'
Vue.config.productionTip = false
router.beforeEach((to, from, next) => {
if (to.meta.title) {
document.title = to.meta.title + ' | Halo Dashboard'
}
if (to.name !== 'Login' && to.name !== 'Install' && to.name !== '404' && !store.getters.token) {
Vue.$log.debug('Redirectint to Login page')
next({ name: 'Login' })
return
}
next()
})
Vue.use(router)
Vue.use(animated)
new Vue({
router,
store,
created() {
bootstrap()
},
render: h => h(App)
}).$mount('#app')

View File

@ -4,97 +4,36 @@ import store from './store'
import NProgress from 'nprogress' // progress bar
import 'nprogress/nprogress.css' // progress bar style
import notification from 'ant-design-vue/es/notification'
import { ACCESS_TOKEN } from '@/store/mutation-types'
NProgress.configure({ showSpinner: false }) // NProgress Configuration
const whiteList = ['login'] // no redirect whitelist
const whiteList = ['Login', 'Install', 'NotFound'] // no redirect whitelist
router.beforeEach((to, from, next) => {
NProgress.start() // start progress bar
if (Vue.ls.get(ACCESS_TOKEN)) {
/* has token */
if (to.path === '/user/login') {
NProgress.start()
Vue.$log.debug('Token', store.getters.token)
if (store.getters.token) {
if (to.name === 'Login') {
next({ name: 'Dashboard' })
NProgress.done()
} else {
if (store.getters.roles.length === 0) {
store
.dispatch('GetInfo')
.then(res => {
const roles = res.result && res.result.role
store.dispatch('GenerateRoutes', { roles }).then(() => {
// 根据roles权限生成可访问的路由表
// 动态添加可访问路由表
router.addRoutes(store.getters.addRouters)
const redirect = decodeURIComponent(from.query.redirect || to.path)
if (to.path === redirect) {
// hack方法 确保addRoutes已完成 ,set the replace: true so the navigation will not leave a history record
next({ ...to, replace: true })
} else {
// 跳转到目的路由
next({ path: redirect })
}
})
})
.catch(() => {
notification.error({
message: '错误',
description: '请求用户信息失败,请重试'
})
store.dispatch('Logout').then(() => {
next({ path: '/user/login', query: { redirect: to.fullPath } })
})
})
} else {
next()
}
}
} else {
if (whiteList.includes(to.name)) {
// 在免登录白名单,直接进入
next()
} else {
next({ path: '/user/login', query: { redirect: to.fullPath } })
NProgress.done() // if current page is login will not trigger afterEach hook, so manually handle it
return
}
// TODO Get installation status
next()
return
}
// Not login
// Check whitelist
if (whiteList.includes(to.name)) {
next()
return
}
next({ name: 'Login', query: { redirect: to.fullPath } })
})
router.afterEach(() => {
NProgress.done() // finish progress bar
NProgress.done()
})
/**
* Action 权限指令
* 指令用法
* - 在需要控制 action 级别权限的组件上使用 v-action:[method] , 如下
* <i-button v-action:add >添加用户</a-button>
* <a-button v-action:delete>删除用户</a-button>
* <a v-action:edit @click="edit(record)">修改</a>
*
* - 当前用户没有权限时组件上使用了该指令则会被隐藏
* - 当后台权限跟 pro 提供的模式不同时只需要针对这里的权限过滤进行修改即可
*
* @see https://github.com/sendya/ant-design-pro-vue/pull/53
*/
const action = Vue.directive('action', {
bind: function(el, binding, vnode) {
const actionName = binding.arg
const roles = store.getters.roles
const elVal = vnode.context.$route.meta.permission
const permissionId = (elVal instanceof String && [elVal]) || elVal
roles.permissions.forEach(p => {
if (!permissionId.includes(p.permissionId)) {
return
}
if (p.actionList && !p.actionList.includes(actionName)) {
;(el.parentNode && el.parentNode.removeChild(el)) || (el.style.display = 'none')
}
})
}
})
export { action }

View File

@ -4,7 +4,7 @@ import adminApi from '@/api/admin'
const user = {
state: {
token: '',
token: null,
name: '',
avatar: '',
roles: [],

View File

@ -83,7 +83,11 @@ export default {
})
},
loginSuccess() {
this.$router.push({ name: 'Dashboard' })
if (this.$route.query.redirect) {
this.$router.replace(this.$route.query.redirect)
} else {
this.$router.replace({ name: 'Dashboard' })
}
// 1
setTimeout(() => {
this.$notification.success({