VUE3项目实现动态路由demo

news2024/10/5 15:22:49

文章目录

      • 1、创建vue项目
      • 2、安装常用的依赖
        • 2.1 安装elementUI
        • 2.2 安装axios
        • 2.3 安装router
        • 2.4 安装vuex
        • 2.5 安装store
        • 2.6 安装mockjs
      • 3、编写登录页面以及逻辑
      • 4、编写首页以及逻辑
      • 5、配置router.js
      • 6、配置store.js
      • 7、配置menuUtils.js(动态路由重点)
      • 8、配置main.js
      • 9、编写mock.js
      • 10、项目结构
      • 11、启动:


1、创建vue项目

vue create orkasgb-vue3-app

2、安装常用的依赖

2.1 安装elementUI

npm install element-plus --save

2.2 安装axios

npm i --save axios

2.3 安装router

npm install vue-router

2.4 安装vuex

npm install vuex

2.5 安装store

npm install store

2.6 安装mockjs

// -D表示在开发环境中使用
npm install mockjs -D 

3、编写登录页面以及逻辑

编写登录页面
请添加图片描述

登录逻辑实现:

/**
* 登录
*/
submitForm() {
	this.$refs["elForm"].validate((valid) => {
		if (!valid) return;
		// 请求后台,验证登录信息
		this.$axios
		.post("/test/api/login", "{}")
		.then((resp) => {
			if (resp.status == "200" && resp.data &&
				resp.data.code == "200" && resp.data.data.legth != 0) {
					// 登录成功后,用户信息缓存
					localStorage.setItem("UserInfor", JSON.stringify(resp.data.data));
					window.sessionStorage.setItem(
					"UserInfor",
					JSON.stringify(resp.data.data)
					);
					this.$message.info(resp.data.message);
					// 登录成功后,缓存token
					this.$store.commit("setToken", resp.data.data.token);
					window.sessionStorage.setItem("token", resp.data.data.token);
					// 登录成功后,跳转到home页
					this.$router.replace("/home");
			} else {
				this.$message.error("登录失败!");
			}
		});
	});
}

4、编写首页以及逻辑

首页布局:
请添加图片描述

逻辑:

// 数据来源配置
data() {
	return {
		formData: {
			userInfor: window.sessionStorage.getItem("UserInfor"), // 获取用户信息,直接从sessionStorage中获取,在登录的时候已经保存在sessionStorage中
		}
	};
},

/**
* 左侧菜单栏,直接通过监听路由,开启el-menu组件中路由模式实现
*/
// 开启el-menu组件中路由模式
<el-menu router="true"></el-menu>
// computed方法可以不断的监听路由变化,并当路由有变化时返回路由,并且computed方法是由缓存的,比watch性能好
computed: {
	routers() {
		return this.$store.state.routes;
	},
},

/**
* 退出登录
*/
loginOut() {
	// 退出登录时,删除缓存的用户信息
	localStorage.removeItem("UserInfor");
	// 退出登录时,删除缓存的token
	this.$store.commit("delToken", "token");
	// 退出登录时,删除缓存的路由
	this.$store.commit("initRouters", []);
	// 退出登录时,跳转到登录页面
	this.$router.replace("/");
}

5、配置router.js

import { createRouter, createWebHashHistory } from 'vue-router'
/**
* 设置固定的路由,一般是登录页面的路由是固定的
*/
const routes = [
	{
		path: "/",
		name: "login",
		component: () => import("../components/LoginPage.vue")
	},
	{
		path: "/home",
		name: "home",
		component: () => import("../components/HomePage.vue")
	}
];

/**
* 路由配置,比如设置路由模式为hash
*/
const router = createRouter({
	history: createWebHashHistory(),
	routes
});

export default router;

6、配置store.js

import Vuex from 'vuex'
/**
* vuex是一个状态管理器,比如我们的一些项目信息可以用vuex来管理。
*/
export default new Vuex.Store({
state: {
	routes: [],// 缓存动态路由
	token: '' // 缓存token
	},

// 同步执行。
mutations: {
	// 初始化动态路由
	initRouters(state, data) {
	state.routes = data;
	},

// 设置token
setToken(state, token) {
	state.token = token
	sessionStorage.token = token
	},

// 删除token
delToken(state) {
	state.token = ''
	sessionStorage.removeItem('token')
	}
},

// 异步执行
actions: {}
})

7、配置menuUtils.js(动态路由重点)

import axios from 'axios'
/**
* 初始化菜单,从后台获取动态菜单
*
* @param {登录ID} logId
* @param {路由} router
* @param {缓存} store
*/
const initMenu = function (logId, router, store) {
	axios.post("/test/api/menu", { logId: logId }).then((resp) => {
		console.log(resp);
		if (resp.status == "200" && resp.data && resp.data.code == "200" && resp.data.data.legth != 0) {
			// 动态路由请求成功后,将路由格式化成vue能识别的路由形式
			var fmtRouters = formatRouters(resp.data.data);
			
			// 将格式化好的路由添加到router中
			fmtRouters.forEach(fmtRouter => router.addRoute(fmtRouter));
			
			// 缓存格式化好的路由
			store.commit('initRouters', fmtRouters);
		}
	});
}

/**
* 格式化动态路由
*
* @param menus 动态路由
*/
const formatRouters = (menus) => {
	if (menus.legth == 0) {
		return;
	}

	let fmtRouters = [];
	menus.forEach(menu => {
		let {name, path, compent, children} = menu;
	
		// 递归格式化children路由
		if (children && children instanceof Array) {
			children = formatRouters(children);
		}
	
		let fmtRouter = {
			name: name,
			path: '/' + path,
			// 重点,从后台返回的component实际上的一个字符串,vue不认识,需要转化成vue能认识的component,才能跳转页面
			component: () => import(`@/components/${compent}.vue`), 
			children: children
		};
	
		fmtRouters.push(fmtRouter);
	});

	return fmtRouters;
}

export default initMenu;

8、配置main.js

import { createApp } from 'vue'
import App from './App.vue'
import ElementPlus from 'element-plus'
import { ElMessage } from 'element-plus'
// 导入elementUI图标
import * as ElementPlusIconsVue from '@element-plus/icons-vue'
// 导入elementUI样式
import 'element-plus/dist/index.css'
// 导入路由
import router from './router/router'
// 导入store缓存
import store from './store/sotre';
// 导入axios,用于发送请求
import axios from 'axios'
// 导入vuex,状态管理
import Vuex from 'vuex'
// 导入自定义的菜单工具
import initMenu from './utils/menuUtils'
// 导入mock
import './mock/mock'

const app = createApp(App);
app.use(ElementPlus)
app.use(router)
for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
	app.component(key, component)
}

// 设置全局侗剧,比如在组件中可以使用this.$axios等
app.config.globalProperties.$axios = axios;
app.config.globalProperties.$store = store;
app.config.globalProperties.$message = ElMessage;
app.config.globalProperties.$vuex = Vuex;
app.mount('#app')

/**
* 路由守卫,每一次路由跳转都会进入这里。
*/
router.beforeEach((to, from, next) => {

	// 如果token不存在,也就是没登录,那么直接跳转到登录页
	const token = window.sessionStorage.getItem("token");
	if (null == token || !token || token.length == 0) {
		next();
		return;
	}

	// 如果token存在,就说明登录成功,去初始化菜单
	initMenu("toney", router, store);
	next();
});

9、编写mock.js

import Mock from 'mockjs'

/**
* 登录验证
*/
Mock.mock("/test/api/login","post",(options)=>{
	console.log("mock--/test/api/login",options)
	return Mock.mock({"code":"200","message":"登录成功","data|1":[{"id|+1":334,"name":"@cname","logId":"toney","image":"@image","token":"YUGXSIBXISBXI468327943849OONONON"}]})
})

/**
* 获取动态路由
*/
Mock.mock("/test/api/menu","post",(options)=>{
	console.log("mock--/test/api/menu",options)
	return Mock.mock({"code":"200","message":"初始化菜单菜单成功!","data":[{"id|+1":100000247,"userId":"1","name":"home","path":"home","compent":"HomePage","children":[{"id|+1":100000247,"userId":"1","name":"name1","path":"compent1Page","compent":"Compent1Page"},{"id|+1":100000247,"userId":"2","name":"name2","path":"compent2Page","compent":"Compent2Page"},{"id|+1":100000247,"userId":"2","name":"name3","path":"compent3Page","compent":"Compent3Page"},{"id|+1":100000247,"userId":"2","name":"name4","path":"compent4Page","compent":"Compent4Page"},{"id|+1":100000247,"userId":"1","name":"name5","path":"compent5Page","compent":"Compent5Page"},{"id|+1":100000247,"userId":"2","name":"name6","path":"compent6Page","compent":"Compent6Page"}]}]})
})

Mock.setup({timeout:300})

10、项目结构

请添加图片描述

11、启动:

请添加图片描述

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

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

相关文章

像ChatGPT玩转Excel数据

1.引言 最近ChatGPT的出现&#xff0c;把人工智能又带起了一波浪潮。机器人能否替代人类又成了最近热门的话题。 今天我们推荐的一个玩法和ChatGPT有点不一样。我们的课题是“让用户可以使用自然语言从Excel查询到自己想要的数据”。 要让自然语言可以从Excel中查数据&#…

论文阅读笔记《Joint Graph Learning and Matching for Semantic Feature Correspondence》

核心思想 本文提出一种联合图学习和图匹配的算法&#xff08;GLAM&#xff09;&#xff0c;将图的构建和匹配过程整合到一个端到端的注意力网络中。相比于其他启发式的建图方法&#xff0c;如Delaunay三角法、KNN方法或完全图&#xff0c;通过学习构建的图结构能够更加准确的反…

配置pytorch(gpu)分析环境

Pytorch是目前最火的深度学习框架之一&#xff0c;另一个是TensorFlow。不过我之前一直用到是CPU版本&#xff0c;几个月前买了一台3070Ti的笔记本&#xff08;是的&#xff0c;我在40系显卡出来的时候&#xff0c;买了30系&#xff0c;这确实一言难尽&#xff09;&#xff0c;…

【AutoGPT】你自己运行,我先睡了—— ChatGPT过时了吗?

系列文章目录 【AI绘画】Midjourney和Stable Diffusion教程_山楂山楂丸的博客-CSDN博客 目录 系列文章目录 前言 一、AutoGPT是什么&#xff1f; 二、AutoGPT带来的利弊 三、AutoGPT和ChatGPT区别 四、未来 总结 前言 ChatGPT是否过时&#xff1f;AutoGPT的兴起&#…

【数字图像处理】空间滤波

文章目录1. 概述2 低通&#xff08;平滑&#xff09;滤波2.1 均值滤波2.2 中值滤波2.3 高斯低通滤波2.4 双边滤波2.5 导向滤波3 高通&#xff08;锐化&#xff09;滤波3.1 Laplacian滤波器3.3 Sobel滤波器1. 概述 图像空间滤波是一种常用的图像处理技术&#xff0c;用于改变图…

基于OpenCV的人脸识别

目录 &#x1f969; 前言 &#x1f356; 环境使用 &#x1f356; 模块使用 &#x1f356; 模块介绍 &#x1f356; 模块安装问题: &#x1f969; OpenCV 简介 &#x1f356; 安装 OpenCV 模块 &#x1f969; OpenCV 基本使用 &#x1f356; 读取图片 &#x1f357; 【…

【Pytorch】利用PyTorch实现图像识别

本文参加新星计划人工智能(Pytorch)赛道&#xff1a;https://bbs.csdn.net/topics/613989052 这是目录使用torchvision库的datasets类加载常用的数据集或自定义数据集使用torchvision库进行数据增强和变换&#xff0c;自定义自己的图像分类数据集并使用torchvision库加载它们使…

安卓渐变的背景框实现

安卓渐变的背景框实现1.背景实现方法1.利用PorterDuffXfermode进行图层的混合&#xff0c;这是最推荐的方法&#xff0c;也是最有效的。2.利用canvas裁剪实现&#xff0c;这个方法有个缺陷&#xff0c;就是圆角会出现毛边&#xff0c;也就是锯齿。3.利用layer绘制边框1.背景 万…

Python 爬虫进阶必备 | 某电影站视频采集加密参数逻辑分析

点击上方“咸鱼学Python”&#xff0c;选择“加为星标”第一时间关注Python技术干货&#xff01;今日网站aHR0cHM6Ly96MS5tMTkwNy5jbi8/ang9JUU1JTkzJTg4JUU1JTg4JUE5JUMyJUI3JUU2JUIzJUEyJUU3JTg5JUI5JUU0JUI4JThFJUU1JUFGJTg2JUU1JUFFJUE0加密定位与分析分析的网站是一个电影…

强化学习分类与汇总介绍

1.强化学习&#xff08;Reinforcement Learning, RL&#xff09; 强化学习把学习看作试探评价过程&#xff0c;Agent选择一个动作用于环境&#xff0c;环境接受该动作后状态发生变化&#xff0c;同时产生一个强化信号(奖或惩)反馈给Agent&#xff0c;Agent根据强化信号和环境当…

记一次 .NET 某医疗住院系统 崩溃分析

一&#xff1a;背景 1. 讲故事 最近收到了两起程序崩溃的dump&#xff0c;查了下都是经典的 double free 造成的&#xff0c;蛮有意思&#xff0c;这里就抽一篇出来分享一下经验供后面的学习者避坑吧。 二&#xff1a;WinDbg 分析 1. 崩溃点在哪里 windbg 带了一个自动化分…

Ubuntu上搭建网站【建立数据隧道,降低开支】

上篇&#xff1a;Ubuntu搭建web站点并发布公网访问 目录 1.安装WordPress 2.创建WordPress数据库 3.安装相对URL插件 4.内网穿透将网站发布上线 1.命令行方式&#xff1a; 2.图形化操作方式 5.图书推荐 cpolar官网 1.安装WordPress 在前面的介绍中&#xff0c;我们为大…

Spring Cloud Alibaba全家桶(八)——Sentinel规则持久化

前言 本文小新为大家带来 Sentinel规则持久化 相关知识&#xff0c;具体内容包括&#xff0c;Sentinel规则推送三种模式介绍&#xff0c;包括&#xff1a;原始模式&#xff0c;拉模式&#xff0c;推模式&#xff0c;并对基于Nacos配置中心控制台实现推送进行详尽介绍~ 不积跬步…

【K8S系列】Pod详解

目录 序言 1 前言 2 为什么需要pod 3 什么是Pod&#xff1f; 3.1 Pod的组成 3.2 Pod的用途 3.3 Pod的生命周期 3.4 Pod的特点 4 Pod的使用 5 结论 序言 任何一件事情&#xff0c;只要坚持六个月以上&#xff0c;你都可以看到质的飞跃。 今天学习一下K8s-Pod相关内容&…

SQL Server的页面(pages )和盘区(extents)体系结构

pages 和 extents 体系结构一、背景二、页面和盘区2.1、页面2.2、大行支持2.3、行溢出注意事项2.4、盘区&#xff08;extents&#xff09;三、管理扩展数据块分配和可用空间3.1、管理扩展数据块分配3.2、跟踪可用空间四、管理对象使用的空间五、追踪修改后的盘区总结一、背景 …

Spring Cloud Alibaba全家桶(九)——分布式事务组件Seata

前言 本文小新为大家带来 分布式事务组件Seata 相关知识&#xff0c;具体内容包括分布式事务简介&#xff08;包括&#xff1a;事务简介&#xff0c;本地事务&#xff0c;分布式事务典型场景&#xff0c;分布式事务理论基础&#xff0c;分布式事务解决方案&#xff09;&#xf…

PyTorch 之 基于经典网络架构训练图像分类模型

文章目录一、 模块简单介绍1. 数据预处理部分2. 网络模块设置3. 网络模型保存与测试二、数据读取与预处理操作1. 制作数据源2. 读取标签对应的实际名字3. 展示数据三、模型构建与实现1. 加载 models 中提供的模型&#xff0c;并且直接用训练的好权重当做初始化参数2. 参考 pyto…

可视化CNN和特征图

卷积神经网络(cnn)是一种神经网络&#xff0c;通常用于图像分类、目标检测和其他计算机视觉任务。CNN的关键组件之一是特征图&#xff0c;它是通过对图像应用卷积滤波器生成的输入图像的表示。 理解卷积层 1、卷积操作 卷积的概念是CNN操作的核心。卷积是一种数学运算&#x…

当深度学习遇上Web开发:Spring和OpenAI如何实现图片生成?

文章目录一、简介1. 什么是Spring和OpenAI2. 生成图像的意义和应用场景二、相关技术介绍1. 深度学习模型2. GAN模型3. TensorFlow框架四、简单的Spring应用1. 搭建Spring项目2. 添加相关依赖3. 编写简单的控制器五、OpenAI API1. 介绍OpenAI API2. 搭建OpenAI API环境3. 配置AP…

Pytorch实现GCN(基于Message Passing消息传递机制实现)

文章目录前言一、导入相关库二、加载Cora数据集三、定义GCN网络3.1 定义GCN层3.1.1 消息传递阶段&#xff08;message&#xff09;3.1.2 消息聚合阶段&#xff08;aggregate&#xff09;3.1.3 节点更新阶段&#xff08;update&#xff09;3.1.4 定义传播过程&#xff08;propag…