vue3-实战-05-管理后台顶部tabbar开发-全局守卫

news2025/1/23 7:04:46

目录

1-顶部tabbar组件静态搭建与拆分

2-菜单折叠效果

3-顶部面包屑动态展示

4-刷新和全屏

4.1-点击刷新操作

4.2-全屏

4.3-退出登录

5-路由鉴权


1-顶部tabbar组件静态搭建与拆分

       分析一下,顶部分为左右两侧,左侧是面包屑,右边是 刷新-全屏-设置 以及用户信息相关;我们将左右分别拆分两个组件。tabbar组件src\layout\tabbar\index.vue 如下

<template>
  <div class="tabbar">
    <div class="tabbar_left">     
      <!--顶部左侧图标 -->
      <Breadcrumb></Breadcrumb>
    </div>
    <!--顶部右侧设置按钮 -->
    <div class="tabbar_right">
      <Setting></Setting>
    </div>
  </div>
</template>

<script setup lang="ts">
import Breadcrumb from './breadcrumb/index.vue'
import Setting from './setting/index.vue'
</script>
<script lang="ts">
export default {
  name: 'Tabbar',
}
</script>

<style scoped lang="scss">
.tabbar {
  width: 100%;
  height: 100%;
  display: flex;//水平分布
  justify-content: space-between;//左右布局
  background-image: linear-gradient(to right,rgb(240, 233, 233),rgb(204, 175, 175),rgb(197, 111, 111));
  .tabbar_left {
    display: flex;
    align-items: center; //Y轴侧轴居中
    margin-left: 20px;
  }
  .tabbar_right {
    display: flex;
    align-items: center; //Y轴侧轴居中
  }
}
</style>

       顶部左侧面包屑抽取为组件src\layout\tabbar\breadcrumb\index.vue,我们需要使用element-plus框架中的el-breadcrumb 组件,组件内容如下:

<template>
  <!--顶部左侧图标 -->
  <el-icon style="margin-right: 10px"><Expand /></el-icon>
  <el-breadcrumb separator-icon="ArrowRight">
    <el-breadcrumb-item>权限管理</el-breadcrumb-item>
    <el-breadcrumb-item>用户管理</el-breadcrumb-item>
  </el-breadcrumb>
</template>

<script setup lang="ts"></script>

<style scoped lang="scss"></style>

顶部右侧的图标和用户信息模块src\layout\tabbar\setting\index.vue 组件内容如下:

<template>
  <el-button size="small" icon="Refresh" circle></el-button>
  <el-button size="small" icon="FullScreen" circle></el-button>
  <el-button size="small" icon="Setting" circle></el-button>
  <img
    src="../../../../public/logo.png"
    style="width: 24px; height: 24px; margin: 0px 10px"
  />
  <el-dropdown>
    <span class="el-dropdown-link">
      admin
      <el-icon class="el-icon--right">
        <arrow-down />
      </el-icon>
    </span>
    <template #dropdown>
      <el-dropdown-menu>
        <el-dropdown-item>退出登录</el-dropdown-item>
      </el-dropdown-menu>
    </template>
  </el-dropdown>
</template>

<script setup lang="ts"></script>

<style scoped lang="scss"></style>

2-菜单折叠效果

       当我们点击tabbar左侧的展开按钮时,菜单需要折叠,我们需要将菜单layout组件的左右缩小,顶部和内容区我们需要向左伸展。tabbar左侧的组件与layout通信,告诉layout组件我是展开还是折叠,这时就涉及到孙子和爷爷的通信;这时我们可以使用仓库实现数据共享。

新建小仓库:src\store\modules\setting.ts,来实现折叠还是展开的响应式数据;

 面包屑左侧图标显示展开还是折叠,我们使用vue的component组件(vue2和vue3都有),

       当我们折叠菜单后,我们需要变更顶部tabbar和内容区的宽度,需要动态展示,这时我们需要采用动态样式。菜单组件有个collapse属性,我们使用这个来折叠菜单。顶部导航的tabbar和内容展示去来个动态的class,并且来个过渡动画transition效果。

ps:展示菜单中属性background-color应该取值background-color="#001529";如果写成background-color="$base-menu-background"会看不见子菜单,白色。

 

3-顶部面包屑动态展示

       tabbar组件的顶部面包屑我们已经静态展示了,现在需要动态展示。我们可以使用路由matched属性就可以匹配到路由信息,内部自己嵌套路由。

       由于首页是在layout组件下的二级,我们可以将src\router\router.ts中的layout组件信息meta中的title和icon置空,这样我们可以实现隐藏v-show。点击面包屑上面的标题,也需要进行路由跳转,使用到了to属性。如果点击一级路由,我们在router中配置重定向到一级路由下第一个二级路由。

ps:在vue3中在v-for中如果使用v-if,v-if的优先级更高,所以这里我们使用v-show

4-刷新和全屏

当我们点击tabbar右侧的刷新和全屏的时候,我们需要进行刷新和全屏操作。

4.1-点击刷新操作

      当我们点击刷新操作的时候,需要重新加载main区域数据,刷新按钮在tabbar组件里面的setting组件中,main和setting不在一个组件中,涉及到组件通信,而且main组件和setting组件是 叔侄 关系。我们采用仓库来定义一个属性控制是否点击刷新。然后在main中使用watch来监听数据是否发生变化,来重新销毁和创建组件。

 src\layout\main\index.vue

4.2-全屏

       当我们点击全屏按钮的时候,我们需要切换到全屏模式,这里我们直接使用dom对象里面的方法实现;document.fullscreenElement和document.documentElement.requestFullscreen()以及document.exitFullscreen()来实现。

 

4.3-退出登录

tabbar左右的主题模式因为目前没有数据,暂时不显示,后续开发和完善....获取用户信息在下一章节,路由鉴权和守卫一起开发,先开发退出登录功能。当用户点击退出登录按钮时,需要清空本地的localStorage数据和用户基本信息数据。

5-路由鉴权

路由鉴权:鉴权,项目当中路由能不能被的权限的设置(某一个路由什么条件下可以访问、什么条件下不可以访问)。

比如本项目中,如果没有登录(没有token),我们不能访问其他路由,只能跳转到登录的组件页面;当已经登录,我们需要获取用户信息,渲染用户名和图像;当有token没有用户信息时,我们需要获取用户信息。我们用户信息存储在store中(非持久化),当我们点击页面刷新时,用户信息接口没有重新调用(此时token还有效);我们不可能每个组件页面加载时调用获取用户信息接口,我们可以将这个功能放在守卫中进行。

1-封装获取用户信息接口存储到store,请求头需要带登录返回的token信息。

 

2-路由导航,全局守卫开发;任意路由切换实现进度条业务,路由鉴权(路由组件访问权限的设置)

src\permisstion.ts内容如下:如果要使用,必须在入口文件main.ts中引入。

 

//路由鉴权:鉴权,项目当中路由能不能被的权限的设置(某一个路由什么条件下可以访问、什么条件下不可以访问)
import router from '@/router'
import setting from './setting'
//@ts-ignore
import nprogress from 'nprogress'
//引入进度条样式
import 'nprogress/nprogress.css'
nprogress.configure({ showSpinner: false })

//获取用户相关的小仓库内部token数据,去判断用户是否登录成功
import useUserStore from './store/modules/user'
import pinia from './store'
import {GET_TOKEN} from './utils/token'
const userStore = useUserStore(pinia)

//全局守卫:项目当中任意路由切换都会触发的钩子
//全局前置守卫
router.beforeEach(async (to: any, from: any, next: any) => {
    document.title = `${setting.title} - ${to.meta.title}`
    //to:你将要访问那个路由; from:你从来个路由而来;next:路由的放行函数
    nprogress.start()
    const token = GET_TOKEN() //获取token,去判断用户登录、还是未登录
    const username = userStore.username //获取用户名字
    //用户登录判断
    if (token) {     
      if (to.path == '/login') {//登录成功,访问login,不能访问,指向首页
        next({ path: '/' })
      } else {//登录成功访问其余六个路由(登录排除)     
        if (username) {//有用户信息         
          next()//放行
        } else {//如果没有用户信息,在守卫这里发请求获取到了用户信息再放行          
          try {            
            await userStore.userInfo()//获取用户信息
            //放行
            //万一:刷新的时候是异步路由,有可能获取到用户信息、异步路由还没有加载完毕,出现空白的效果
            next({ ...to })
          } catch (error) {//token过期:获取不到用户信息了--用户手动修改本地存储token           
            userStore.userLogout()
            next({ path: '/login', query: { redirect: to.path } })
          }
        }
      }
    } else {//用户未登录判断    
      if (to.path == '/login') {
        next()
      } else {
        next({ path: '/login', query: { redirect: to.path } })
      }
    }
  })
  //全局后置守卫
  router.afterEach((to: any, from: any) => {
    nprogress.done()
  })
  

3-用户点击退出登录,我们需要调用后端接口,目前我们没有mock数据,我们暂时先忽略;前端需要清除store数据和清除localStorage里面的token信息。

 

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

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

相关文章

物联网行业的发展的趋势、现状与挑战

随着物联网技术的不断发展&#xff0c;越来越多的行业正在积极拥抱物联网&#xff0c;进行物联网开发。在这些行业中&#xff0c;有大量的产品和服务都在使用物联网技术。事实上&#xff0c;目前有超过1000亿个设备在运行着联网设备。全球智能传感器市场预计将从2021年的272亿美…

Codeforces Round 877 div2 C No Prime Differences

目录 一、题目 二、题目分析 三、 一、题目 传送门 C. No Prime Differences time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output You are given integers n and m. Fill an n by m grid with the…

分布式理论 - CAP

tip: 作为程序员一定学习编程之道&#xff0c;一定要对代码的编写有追求&#xff0c;不能实现就完事了。我们应该让自己写的代码更加优雅&#xff0c;即使这会费时费力。 文章目录 一、简介深入理解三、CAP的应用应用 一、简介 CAP理论是分布式系统中最重要的理论之一&#xf…

windows编译CTK

文章目录 windows编译CTK环境准备使用cmake-gui编译CTK测试VTK windows编译CTK 环境准备 CTK源码 &#xff1a;https://github.com/commontk/CTK CTKData 源码&#xff1a;https://github.com/commontk/CTKData 最新版本的不用下载CTKData 相关的下载会在编译的时候去下载&…

CSS样式——悬停变色

目录 准备图标 实现效果 基础模板 清除默认样式 重合相同图标 实现悬停变色 CSS样式——悬停变色&#xff0c;效果如下所示&#xff1a; 准备图标 在完成上面的效果之前&#xff0c;我们需要准备图标&#xff0c;这里我使用的是阿里巴巴矢量图标库&#xff0c;不会使用阿…

聚力自主安全,领跑先进计算!麒麟信安闪耀2023首届国家新一代自主安全计算系统产业集群融通生态大会

5月25日至26日&#xff0c;2023首届“国家新一代自主安全计算系统产业集群”融通生态大会在长沙隆重举行。大会以“聚力自主安全 领跑先进计算”为主题&#xff0c;由工业和信息化部规划司指导&#xff0c;湖南省工业和信息化厅、长沙市人民政府主办&#xff0c;旨在围绕实现“…

C++入门——缺省参数|函数重载

前言&#xff1a; C入门我们主要是补充C语言的不足&#xff0c;为后续类和对象学习打基础。在前面我们学了命名空间、输入输出&#xff0c;今天我们继续学习。 上期链接&#xff1a; C入门——关键字|命名空间|输入&输出_wangjiushun的博客-CSDN博客 目录&#xff1a; …

CompletableFuture真香,可以替代CountDownLatch!

1、背景 之前我们提到了 Future 和 Promise。Future 相当于一个占位符&#xff0c;代表一个操作将来的结果。一般通过 get 可以直接阻塞得到结果&#xff0c;或者让它异步执行然后通过 callback 回调结果。 但如果回调中嵌入了回调呢&#xff1f;如果层次很深&#xff0c;就是…

Spring Cloud Alibaba 快速上手搭建公司项目(四)Sentinel

Sentinel是一个开源的云原生流量控制和熔断降级的组件&#xff0c;它可以实现对微服务架构中的服务进行实时监控、自动降级、熔断限流等功能。Sentinel的核心原理是通过滑动窗口的方式对请求进行控制&#xff0c;当请求超过阈值时&#xff0c;会自动触发熔断操作&#xff0c;避…

JavaWeb——JSP实现书城首页

实验名称&#xff1a; JSP实现书城首页 实验目的&#xff1a; &#xff08;1&#xff09;了解JSP的特点及其运行原理 &#xff08;2&#xff09;掌握JSP的基本语法 &#xff08;3&#xff09;熟悉JSP指令和隐式对象的使用 &#xff08;4&#xff09;掌握JSP动作元素的使用…

ABP VNext 利用QQ邮箱发送邮件

ABP VNext 利用QQ邮箱发送邮件 1.配置邮箱1.1 设置1.2账户1.3 开启邮箱服务1.4 生成授权码 2 默认的SmtpEmailSender发送邮件2.1 生成数据库2.2 添加一个后台任务执行发送邮件2.3 服务中注入ISmtpEmailSender2.4 在配置文件添加邮箱信息 3 集成MailKit发送邮件3.1 添加包Volo.A…

从Docker和Kubernetes看Containerd

导读&#xff1a; 在学习Containerd之前&#xff0c;我们需要去了解Docker与Kubernetes这两个使用Containerd最多的技术&#xff0c;也需要明白什么是容器&#xff0c;什么是容器运行时&#xff0c;以及里面涉及的组件&#xff0c;这些组件是用来干什么的&#xff0c;及容器领域…

Zabbix Httpd漏洞修复2

一、背景 漏洞库升级的真是快啊&#xff0c;绿盟扫描的zabbix服务器又有新的漏洞了&#xff0c;经一番折腾&#xff0c;搞定&#xff0c;记录如下。 二、漏洞内容 漏洞主要还是集中在php和http漏洞 三、修复过程 思路还是升级httpd版本解决。 1、查看下zabbix版本&#xff…

【JVM】垃圾回收机制

垃圾回收三大步骤&#xff1a;判断是不是垃圾(垃圾判断算法) -> 标记需要回收的垃圾(三色标记) -> 回收垃圾(垃圾回收算法)。 一、如何判断是不是垃圾&#xff08;垃圾判断算法&#xff09;&#xff1f; &#xff08;1&#xff09;引用计数器算法&#xff1a;对象中记录…

基于STM32F103C8T6的超声波测距——串口输出

文章目录 前言一、超声波模块介绍1、产品特点2、超声波模块的时序图 二、STM32CubeMx创建工程1、配置项目2、keil代码设置3、效果 三、总结四、参考资料 前言 环境&#xff1a; 1、硬件&#xff1a;stm32f103c8t6 核心板 2、软件&#xff1a;STM32CubeMX 6.4.0 3、软件&#xf…

进程通信管道制作

利用父子进程 创建管道利用pipe函数 // 1.创建管道int pipefd[2] {0}; //[0] 读端 &#xff0c;[1]写端int n pipe(pipefd);assert(n ! -1); // debug 在release下会裁减(void)n;//防止在release下报错cout << "fd[0]:" << pipefd[0] << endl…

多用户商城开源-多店铺商城系统平台开发

多用户商城开源是指一种基于开放源代码的电子商务平台&#xff0c;允许多个用户共享一个平台&#xff0c;每位用户可以创建自己的电子商城&#xff0c;并在平台上进行交易、管理、营销等操作。多用户商城开源通常包含多种功能&#xff0c;如商品管理、订单管理、支付集成、促销…

vue diff算法与虚拟dom知识整理(14) patchVNode处理子节点新增和删减

上文 vue diff算法与虚拟dom知识整理(13) 手写patch子节点更新换位策略 我们实现了子节点位置的更新策略 但还有一些匹配不到的情况会导致死循环 那么我们继续来优化一下 我们先将src下的 index.js 代码改成这样 import h from "./snabbdom/h"; import patch from …

Scrapy ImagesPipeline下载图片

一、 ImagesPipeline是啥 ImagesPipeline是scrapy自带的类&#xff0c;用来处理图片(爬取时将图片下载到本地)。 二、ImagesPipeline优势&#xff1a; 将下载图片转换成通用的jpg和rgb格式避免重复下载缩略图生成图片大小过滤异步下载 三、ImagesPipeline工作流程 爬取一个…

Echarts构建指定省份的地图

1. 自行准备好Echarts环境 Echarts官网&#xff1a;https://echarts.apache.org/zh/index.html 2. 下载需要的省份或者城市的json地理信息文件 下载我们需要显示地区的Json数据&#xff0c;这个Json数据用于Echart的地图显示 例如我这里是下载的&#xff1a;湖南、湖北、四川…