IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> Antd+SpringBoot+Vue的权限管理设计 -> 正文阅读

[JavaScript知识库]Antd+SpringBoot+Vue的权限管理设计

1.从服务端获取用户的 [基础信息] 和 [权限信息]并构建动态路由和菜单

问题1:为什么这么做:

  1. 一般开发需要权限的系统时,都会有 登录 步骤
  2. 单页应用每次刷新时,内存中的数据就会呗清空,如果每次刷新,执行一次登录步骤就是很不合理的
  3. 设计一次登录就是为了获取用户的授权 access token,并持久化到localstorage中,之后用户每次打开页面或者刷新页面时,都可以利用这个 token 去后端获取用户的真实信息

问题2:为什么不把用户心也存到localstorage来少一次请求?

  1. 用户信息存在loacalstorage后,使用者打开控制台,直接修改其中权限信息,如果用户角色是user,被改成了admin。刷新页面的时候就是admin的信息了。

问题3:为什么不每次都调用登录?

  1. 如果每次刷新都要登录认证,那么用户的账户及密码则不可保障安全
  2. 要登录必须要账户密码或者相同功能的认证信息代替

问题4:access token 不也是不能保障安全吗?

  1. 用户在此进行登录,代表认同该设备,保存用户的token可以进行快速身份认证
  2. 当用户认为 token 发生泄露或者不安全时,可以根据相关的服务端 token 设计规则,删除token

2.在Vue中应该怎么配置导航栏路由

? ? ? ? 一般情况下,我们的路由都是根据router/index.ts里面手动配置的,然后在根据加载路由的时候获取导航栏

export const routes: MenuDataItem[] = [
{
    name: 'index',
    path: '/',
    redirect: '/workplace',
    component: Layout,
    children: [
 {
        path: '/workplace',
        name: 'Workplace',
        meta: { icon: 'HistoryOutlined', title: 'pages.dashboard.workplace.title', lock: true },
        component: h(RouteView, null, () => h(AsyncWorkplace)),
      },
]
}
]

如果需要动态配置时,首先需要在后端构建好数据,获取数据以后,封装成路由格式,或者在返回前端以后再进行封装

// 生成常用路由
// getCurrentUserNav() 是后端获取需要显示模块的数据,进行返回
// generator 数据重构生成一个完整的路由
export const generatorDynamicRouter = () => {
  return new Promise<MenuDataItem>((resolve, reject) => {
    getCurrentUserNav()
      .then(menuNavRes => {
        // root id = 0;
        const routes = generator(menuNavRes.data, 0, undefined) as MenuDataItem[];
        // routes.push(notFoundRouter);
        rootRouter.children = routes;
        resolve(rootRouter);
      })
      .catch(err => {
        reject(err);
      });
  });
};

?

// 根级菜单
const rootRouter: MenuDataItem = {
  name: 'index',
  path: '/',
  redirect: '/dashboard',
  meta: {
    title: '首页',
  },
  component: () => import('@/layouts/index.vue'),
  children: [] as MenuDataItem[],
};


// 构建一个路由
export const generator = (
  routeMap: RouteItem[],
  parentId: string | number,
  routeItem?: RouteRecordRaw | MenuDataItem,
) => {
  return routeMap
    .filter(item => item.parentId === parentId)
    .map(item => {
      const { title, hideInMenu, hideChildrenInMenu, target, icon, authority } = item.meta || {};
      const currentRouter: MenuDataItem = {
        // 如果路由设置了 path,则作为默认 path,否则 路由地址 动态拼接生成如 /dashboard/workplace
        path: item.path || `${(routeItem && routeItem.path) || ''}/${item.name}`,
        // 路由名称,建议唯一
        name: item.name || `${item.id}`,
        // meta: 页面标题, 菜单图标, 页面权限(供指令权限用,可去掉)
        meta: {
          title,
          icon: icon || undefined,
          hideInMenu,
          hideChildrenInMenu,
          target: target,
          authority: authority,
        },
        // 该路由对应页面的 组件 (动态加载 @/views/ 下面的路径文件)
        component:
          item.component && defineRouteComponentKeys.includes(item.component)
            ? defineRouteComponents[item.component]
            : () => import(/* @vite-ignore */ `../views/${item.component}.vue`),
      };

      // 为了防止出现后端返回结果不规范,处理有可能出现拼接出两个 反斜杠
      if (!currentRouter.path.startsWith('http')) {
        currentRouter.path = currentRouter.path.replace('//', '/');
      }

      // 重定向
      item.redirect && (currentRouter.redirect = item.redirect);

      // 子菜单,递归处理
      currentRouter.children = generator(routeMap, item.id, currentRouter);
      if (currentRouter.children === undefined || currentRouter.children.length <= 0) {
        delete currentRouter.children;
      }
      return currentRouter;
    })
    .filter(item => item);
};

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-09-21 00:19:29  更:2022-09-21 00:22:02 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年6日历 -2024/6/1 21:55:02-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码