vue项目第三天

news2024/11/14 15:11:09

论坛项目动态路由菜单以及渲染

用户登录全局前置拦截器获取用户的菜单以及接口执行过程

解析菜单数据,渲染伟动态路由。


菜单数据

将数据源解析为类似路由配置对象的格式(./xxx/xxx 这种格式)。

下方是路由实例的代码,后面封装了很多方法这里也需要做响应的改变

//创建路由实例

// /login
// /admin/login
const router = new vueRouter({
  mode: "hash",
  routes,
  base: "/admin",
  // 配置滚动的---- 用户切换路由组件回到顶部
  scrollBehavior() {
    //带返回值   x  y 指坐上角坐标
    return { x: 0, y: 0 };
  },
});
//设置守卫
//定义白名单
const whiteList = ["/login", "/error"];
//定义变量接收菜单
let menu = null;
router.beforeEach(async (to, from, next) => {
  //白名单路由不检测token直接放行
  //读取token
  let token = findStorage("_token");
  //判断token
  if (token) {
    //用户登录过
    //获取系统菜单数据 实现路由的动态绑定
    if (!menu) { //加这个判断的目的就是防止用户不停地访问路由
      //ajax 获取数据
      let { menuList } = await userMenu();
      //数据解析
      let newMenu = patterMenu(menuList);//把通过ajax获取的数据传递回去,这个写法是es6的对象结构,相当于把menuList拿出来
      //进行menu赋值
      menu = newMenu;
        //写入缓存(因为菜单组件需要使用数据)  需要转化字符串 存储,因为在封装的h5哪里没有改变字符串所以在这改
      setStorage("_menu", JSON.stringify(menu));
      //解析转化的数组menu 添加动态路由配置
      for (let i = 0; i < menu.length; i++) {
        addRouter(menu[i].children);
      }
      //添加完动态路由之后  重新跳转
      next({ path: to.path });
    } else {
      //如果进入的是登录界面  直接到系统首页
      if (to.path == "/login") {
        next({ path: "/" });
      }
      next();
    }
  } else {
    //用户未登录
    if (whiteList.indexOf(to.path) !== -1) {
      next();
    } else {
      next({ path: "/login", query: { redirect: to.path } });
    }
  }
});

使用递归方法解析菜单数据(这是一个封装 在router下的index.js文件中)

/**
 * 解析对象数据
 * @params {menu集合数据} list
 * @return {返回对象}
 * **/
function patterMenu(list) {
   //定义数组,因为要返回一个全新的数组
  let arr = [];
 //检测list集合是否存在 ,如果服务器崩了就没有 数据了,那就给他返回一个空集合
  if (!list) return [];
 //遍历数组,目的是拿出每一个具体的数据
  list.forEach((item, index) => {
    //定义对象
    let obj = {//拿出要的数据,不要的数据过滤掉
      children: item.list,//路由的子集叫children,所以这里定义为children
      path: item.url,
      name: item.name, //菜单中也要有name,所以这里也要写name
      icon: item.icon, //菜单左边还有图标,所以这里写icon
    };
    //使用递归算法  进行children集合转化 ,因为children也跟父及一样需要改成路由的形式
    //有的菜单下有children有的菜单下没有,所以还要再去做判断。有的有children属性,但是下面没有子集
    if (obj.children && obj.children.length) {//obj.children属性存在,并且obj.children的长度是存在的
      obj.children = patterMenu(obj.children);//把内层转换的集合,赋给原本的集合
    }
    arr[index] = obj;
  });
  return arr;
}

将解析的菜单数据 关联变量menu,防止用户跳转路由多次发送请求

           //进行menu赋值
      menu=newMenu;
      //写入缓存  需要转化字符串 存储
      setStorage("_menu",JSON.stringify(menu));
      //缓存的目的是菜单组件需要使用数据

将解析的菜单数据 添加到路由的配置

//获取路由的配置
//获取路由的静态配置
router.options.routes;

获取路由的所有配置

router.getRoutes();//包含静态配置和动态配置

解析菜单数据为路由配置格式

/**
 * 实现动态路由添加
 * @params {menu集合数据} list
 * **/
function addRouter(list) {//这里的list就是一个children的集合
  for (let i = 0; i < list.length; i++) {
    console.log(list[i]);//拿到children的每一个值放到变量now中
    let now = list[i];
    let route = {
      path: now.path,
      component: loadView(now.path),//把每一个children中的path拿出来,调用下面的方法把格式改成路由格式
    };
  }
}

同时封装根据路径加载路由组件方法

/**
 * 根据路径懒加载组件
 * @params {组件路径} url
 * **/
function loadView(url) {
  console.log(`../views/${url}.vue`);
  //前去看webpack 英文版官方 方法解析用法 这里建议最好使用变量来存储这个对象,这里因为传进来的是个路径,而且是个变量,所以刚还写在这里,如果不是就声明一个变量去接收,然后把变量写到${}中
  return () => import(`../views/${url}.vue`);
}
//需要注意import 懒加载方法用法

最终将转化的路由配置添加到路由

/**
 * 实现动态路由添加
 * @params {menu集合数据} list
 * **/
function addRouter(list) { //这里的list就是一个children的集合
  for (let i = 0; i < list.length; i++) { 
    let now = list[i];//拿到children的每一个值放到变量now中
    let route = {
      path: now.path,
      component: loadView(now.path), //把每一个children中的path拿出来,调用下面的方法把格式改成路由格式
    };
    // 将解析之后的对象添加给路由配置
    //调用add方法,第一个参数是父路由的名称,所以要去router下的routers.js文件中给admin加一个name属性,属性为admin。
    router.addRoute("admin", route); 
  }
}
/**
 * 根据路径懒加载组件
 * @params {组件路径} url
 * **/
function loadView(url) {
  //前去看webpack 英文版官方 方法解析用法 这里建议最好使用变量来存储这个对象,这里因为传进来的是个路径,而且是个变量,所以刚还写在这里,如果不是就声明一个变量去接收,然后把变量写到${}中
  return () => import(`../views${url}.vue`);
}

查看所有的路由配置

console.log(router.getRoutes());

当前系统存在/—-/login 登录 /login—-/ 会产生路由多次定向错误导致路由无法进入。

重写replace或者push的底层方法 抓异常抛出

//获取replace 方法 进行重写
let replaceOrigin = vueRouter.prototype.replace;
//重写replace 方法
/**
 * location 参数  push  replace   ({path:"/"})
 * **/
vueRouter.prototype.replace = function (location) {
  console.log("测试", location);
  //目的是抓异常
  return replaceOrigin.call(this, location).catch((error) => error);
};

可能会存在,异常处理了,但是登录路由不跳转,需要在守卫中添加添加类似重定向的业务代码

系统菜单的渲染


获取用户登录之后的数据缓存_menu

注意后端返回的数据path路径没有带/,会导致路由路径多余sys ,处理:

处理scrollbar

实现header功能


使用的是组件的自定义事件通信完成

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/343451.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RFID服装吊牌材质分类

1、吊牌常见材质 铜版纸&#xff1a;最常用&#xff0c;分单铜纸、双铜纸 白卡纸&#xff1a;厚度较厚 黑卡纸&#xff1a;黑卡纸常用于烫金、烫银工艺 牛皮纸&#xff1a;韧度较高、色彩单一 塑料材料&#xff1a;一般一些比较高档的品牌会选塑料材质&#xff0c;成本比铜…

电商CRM的作用和用途

数据显示&#xff0c;使用电商CRM客户管理系统后&#xff0c;企业销售额提高了87%&#xff0c;客户满意度提高了74%&#xff0c;业务效率提高了73%。要在竞争激烈的电商市场取得成功&#xff0c;与目标受众的有效沟通是有效的方法。下面说说什么是电商CRM系统&#xff1f;电商C…

Docker镜像和容器操作,ლ(´ڡ`ლ)好吃的.

文章目录1.镜像操作1.镜像命令2.情景1&#xff1a;拉取镜像3.情景2&#xff1a;保存导入镜像2.容器操作1.容器命令2.情景1&#xff1a;创建并运行一个容器3.情景2&#xff1a;进入容器&#xff0c;修改文件3.结语halo&#xff0c;大家好&#xff0c;这次我带来的是Docker的一些…

SATA SSD需要NCQ开启吗?

一、故事开篇最近有同学在咨询&#xff0c;SATA SSD是否需要NCQ功能&#xff1f;借此机会&#xff0c;今天我们来聊聊这个比较古老的话题&#xff0c;关于SATA协议的NCQ的故事。首先我们先回顾下SATA与NCQ的历史&#xff1a;2003年&#xff0c;SATA协议1.0问世&#xff0c;传输…

微服务中API网关的作用是什么?

目录 什么是API网关&#xff1f; 为什么要用API网关&#xff1f; API网关架构 API网关是如何实现这些功能的&#xff1f; 协议转换 链式处理 异步请求 什么是API网关&#xff1f; Api网关是微服务的重要组成部分&#xff0c;封装了系统内部的复杂结构&#xff0c;客户端…

蓝牙Mesh学习笔记(一)

Mesh系统结构1 Mesh网络分层1.1 模型层(Model layer)1.2 基础模型层(Foundation Model layer)1.3 接入层(Access layer)1.4 上层传输层(Upper transport layer)1.5 下层传输层(Lower transport layer)1.6 网络层(Network layer)1.7 承载层(Bearer layer)1.8 BLE内核规范(BLE Co…

MySQL性能优化六 事物隔离级别与锁机制

概述 我们的数据库一般都会并发执行多个事务&#xff0c;多个事务可能会并发的对相同的一批数据进行增删改查操作&#xff0c;可能就会导致我们说的脏写、脏读、不可重复读、幻读这些问题。 这些问题的本质都是数据库的多事务并发问题&#xff0c;为了解决多事务并发问题&#…

CUDA内存管理一文理清|参加CUDA线上训练营

CUDA 内存概述 GPU的内存包括&#xff1a; 全局内存&#xff08;global memory&#xff09;常量内存&#xff08;constant memory&#xff09;纹理内存核表面内存&#xff08;texture memory&#xff09;寄存器&#xff08;register&#xff09;局部内存&#xff08;local me…

BI 到底是什么,看看这篇文章怎么说

随着数据价值得到了认可&#xff0c;数据开始成为个人、企业乃至国家的重要战略资产&#xff0c;但数据资产不能直接产生价值&#xff0c;而是需要通过数据分析、数据可视化等数据处理手段将数据转化为信息和知识&#xff0c;才能进行资产的价值化&#xff0c;这时候商业智能BI…

Python骚操作 - 实现把文字写在像素中

前言 嗨嗨&#xff0c;大家好 我是小圆 今天又发来个有意思的 用Python在照片中添加文字~&#xff08;实现把文字写在像素中&#xff09; 那咱就话不多说咯 直接开始展示 实现步骤 想要实现把文字写在像素中&#xff0c;那么我们就需要用到 pillow 这个神器。 众所周知&a…

从零实现高并发WebRTC服务器(六):OpenSSL协议,DTLS协议,RTP协议和SRTP协议

文章目录一、SSL协议二、OpenSSL三、TLS和DTLS四、DTLS的通信的步骤图五、RTP协议和SRTP协议5.1 详解RTP协议5.2 详解RTCP协议5.3 RTP && RTCP的协议的关键技术六、DTLS-SRTP协议一、SSL协议 SSL的全名叫做secure socket layer(安全套接字层)&#xff0c;最开始是由一…

【CSS 布局】 Sticky Footer布局

Sticky footer布局是什么&#xff1f; 我们所见到的大部分网站页面&#xff0c;都会把一个页面分为头部区块、内容区块和页脚区块&#xff0c;当头部区块和内容区块内容较少时&#xff0c;页脚能固定在屏幕的底部&#xff0c;而非随着文档流排布。当页面内容较多时&#xff0c;…

大数据框架之Hadoop:HDFS(三)HDFS客户端操作(开发重点)

3.1 HDFS客户端环境准备 1&#xff0e;根据自己电脑的操作系统拷贝对应的编译后的hadoop jar包到非中文路径&#xff08;例如&#xff1a;D:\javaEnv\hadoop-2.77&#xff09;&#xff0c;如下图所示。 2&#xff0e;配置HADOOP_HOME环境变量&#xff0c;如下图所示。 3&#…

分布式项目-品牌管理(7)

【今日成果】&#xff1a; //啊哈哈哈 &#xff0c; 莫名其妙入选了。 【快速回顾】&#xff1a; &#xff08;1&#xff09;&#xff1a; 虽然提交表单的时候前端做了校验&#xff0c;但是通过PostMAN接口调试&#xff0c;我们发现不规范的数据还是会被存储到数据库中&am…

前端基础知识6

谈谈你对语义化标签的理解语义化标签就是具有语义的标签&#xff0c;它可以清晰地向我们展示它的作用和用途。 清晰的代码结构&#xff1a;在页面没有css的情况下&#xff0c;也能够呈现出清晰的代码内容 有利于SEO: 爬虫依赖标签来确定关键字的权重&#xff0c;因此可以和搜索…

Android 一体机研发之修改系统设置————声音

Android 一体机研发之修改系统设置————屏幕亮度 Android 一体机研发之修改系统设置————声音 Android 一体机研发之修改系统设置————自动锁屏 修改系统设置系列篇章马上开张了&#xff01; 本章将为大家细节讲解声音。 对于声音功能大家都不陌生&#xff0c;在多…

Java虚拟机(JVM)调优思路

title: Java虚拟机&#xff08;JVM&#xff09;调优思路 date: 2022-04-09 00:00:00 tags: JVM性能调优 categories:Java 调什么 内存方面 JVM需要的内存总大小各块内存分配&#xff0c;新生代、老年代、存活区选择合适的垃圾回收算法、控制GC停顿次数和时间解决内存泄露的问…

Appium移动自动化测试——app控件获取之uiautomatorviewer

下载手机YY http://yydl.duowan.com/mobile/yymobile_client-android/5.4.2/yymobile_client-5.4.2-881.apk 若链接失效&#xff0c;请自行百度 新建maven空白工程 前置条件&#xff1a;安装eclipse&#xff0c;及其maven插件&#xff0c;请自行百度 新建的工程如下&#xf…

Kylin查询下压的设置、Sparder查询引擎详细介绍、HDFS文件目录含义

目录1. 查询下压设置2. Sparder查询引擎详细介绍3. HDFS文件目录含义1. 查询下压设置 如果未开启查询下压&#xff0c;则查询有很多限制。这是因为只能查询cube中的数据&#xff0c;而不能通过spark sql查询Hive中的源数据 开启查询下压&#xff0c;优先从cube中查询数据&…

百度前端常考vue面试题(附答案)

怎么实现路由懒加载呢 这是一道应用题。当打包应用时&#xff0c;JavaScript 包会变得非常大&#xff0c;影响页面加载。如果我们能把不同路由对应的组件分割成不同的代码块&#xff0c;然后当路由被访问时才加载对应组件&#xff0c;这样就会更加高效 // 将 // import UserD…