黑马程序员技术交流社区

标题: 【上海校区】vue项目实践-前后端分离关于权限的思路 [打印本页]

作者: 不二晨    时间: 2018-7-31 09:41
标题: 【上海校区】vue项目实践-前后端分离关于权限的思路
前后端分离后权限的思路最近看到许多关于权限的思路,但好像都是使用动态加载路由的方式,现在也分享下我在项目中使用的解决方案。
前后端分离关于权限的处理每个人都不一样,根据项目选择制定合适的方案就好
我的方案是:
前后端分离权限的实现路由定义若是后端项目,一般会包含公用的头部,侧边导航等公用的部分,这些部分可以将其抽象成一个个组件,创建布局页使其更简单的使用关于路由的引用,在大的项目中发现不适用懒加载能够更快的热更新,所以可以根据环境采取不同的加载方式一个简单的路由
路由结构图

生产环境( production )/ testing 的定义module.exports = file => () => import('@/views/' + file + '.vue')开发环境( development )的定义module.exports = file => require('@/views/' + file + '.vue').default路由导入代码
import Vue from 'vue'import Router from 'vue-router'import { routes } from './routes'import logic from './logic'Vue.use(Router)const router = new Router({  //   mode: 'history',  routes})router.beforeEach(logic.beforeEach)router.afterEach(logic.afterEach)export default router复制代码import { getInfo } from '@/api/modules/account'const beforeEach = (to, from, next) => {  if (!to.meta.auth) {    return next()  }  if (!localStorage.token) {    return next('/login')  }  if (window.info) return next()  getInfo().then(res => {    localStorage.token = res.data.info.token    window.info = res.data.info    window.menus = res.data.menus    window.modules = res.data.modules    next()  })}const afterEach = (to, from) => {}export default {  beforeEach,  afterEach}复制代码const _import = require('./_import_' + process.env.NODE_ENV)export const appRouter = [  {    path: '/',    component: Layout,    children: [      {        path: '',        name: 'home',        component: _import('dashboard/index'),        meta: { defAuth: true, auth: true }      }    ]  }]export const routes = [...appRouter]复制代码接口定义菜单加载新建 Layout 文件夹,将各部分组件再拆成小组件进行拼接后台组件,样式使用圣杯布局,然后稍加改动就能够实现基本的后台管理页布局Layout 结构图

菜单结构:"menus": [      {        "menuName": "控制台",        "menuIcon": null,        "menuCode": "home",        "menuUrl": null      },      {        "menuName": "系统管理",        "menuIcon": null,        "children": [          {            "menuName": "管理员管理",            "menuIcon": null,            "children": [              {                "menuName": "管理员列表",                "menuIcon": null,                "menuCode": "system-admin-list",                "menuUrl": null              }            ]          },          {            "menuName": "角色列表",            "menuIcon": null,            "menuCode": "system-role-list",            "menuUrl": null          }        ]      }    ],复制代码递归生成菜单组件
<template>    <dl>        <template v-for="(item,index) in menus">            <dt :key="item.menuName">                <a href="javascript:;" v-if="item.menuUrl" @click="$ui.redirect(item.menuUrl)">{{item.menuName}}</a>                <router-link :to="{name:item.menuCode}" v-else-if="item.menuCode">{{item.menuName}}</router-link>                <span v-else>{{item.menuName}}</span>            </dt>            <dd class="child-menu" :key="'c_'+index" v-if="item.children&&item.children.length>0">                <v-app-nav :menus="item.children" />            </dd>        </template>    </dl></template><script>export default {  name: 'v-app-nav',  props: ['menus']}</script><style></style>复制代码指令封装可以通过指令传入需要的权限标识值,进行对按钮权限的控制,根据需要控制显示/启用
定义export default {  auth: {    inserted: (el, binding) => {      if (window.modules.indexOf(binding.value) === -1) {        // el.remove()        el.setAttribute('disabled', 'disabled')      }    }  }}复制代码使用对于常用的一些按钮,应封装到组件中,统一管理风格,也能使起更易维护
<button v-auth="'role_create_create'">添加</button>复制代码相关链接文中的实现可以在下面仓库中找到,不清楚的地方也可以直接查看源码


作者:易墨
链接:https://juejin.im/post/5b5d3163e51d4517573272f6




作者: wuqiong    时间: 2018-7-31 10:27

作者: 不二晨    时间: 2018-7-31 11:53
奈斯,很赞
作者: 梦缠绕的时候    时间: 2018-7-31 11:56





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2