Vue3+elemetPlus支持动态路由和菜单管理UI框架。

请耐心多看内容,认真看完会受益匪浅。

这是一个基于VUECLI+Element-Plus * *的开源vue3动态路由和动态菜单开源框架。总的来说,这个项目非常好。使用它可以直接实现动态路由和菜单管理功能,实现快速开发。支持两级菜单管理和嵌套路由管理。

“元素加”:“^1.0.2-beta.70”,

“vue”:“^3.0.0”,

“vue路由器”:“^4.0.0-0”

1,UNIUICLI 3是基于vue3的项目,与时俱进,很有时代感,紧跟vue3的脚步。

2.项目只集成了两个必要的JavaScript库,element-plus和vue-router,没有集成其他的JavaScript库。这意味着你可以根据自己的项目需求安装自己需要的JavaScript库,避免项目集成库太多带来的麻烦。

3.强大的组件管理器。为了帮助您可视化地管理动态路线和菜单,我们内置了“组件管理”功能组件,使路线和菜单管理可视化。同时,为了更好的实现项目管理,我们在vue2版本的基础上增加了可选的json导出功能,让你可以快速生成json数据,生成用户权限路由和菜单。

4.美景框架。我们有一个内置的后台管理UI框架,通过它您可以快速生成和构建管理项目。当然,你也可以构建自己喜欢的UI框架结构。

5.干扰少。为了让项目更纯粹,给开发者更多的控制权,我们在src文件夹下新建了一个unitui文件夹来存放我们的内置部分。为了便于启动和理解您的项目,您可以直接清空ivews和components文件夹中的内容并重新构建您的组件,因为这些目录中的文件并不重要。

Unituicli3之所以强大,是因为组件管理,因为它是核心组件,使得动态路由(添加、删除、修改)、嵌套路由和菜单管理(添加、删除、修改)可视化,支持json数据生成,使得前后台交互成为可能。只需要将生成的json存储在数据库中,就可以实现权限编辑。

虽然我们尽量减少对开发者的影响,但是做一些改变是不可避免的。

从“vue”导入{ createApp }

从“element-plus”导入ElementPlus

从'导入应用程序。/App.vue '

从'导入路由器。/路由器'

import ' @/unitui/init _ route . js '//这是为了防止刷新路由丢失。

const app = createApp(App)

app.use(ElementPlus)

app.use(路由器)。挂载(#app)

//注册全局组件

从'导入Uicon。/unitui/sub/Uicon.vue '

app.component('Uicon ',Uicon)

如果你不用elementPlus作为你的UI,可以参考上面的,做适当的改动。

这是一个全局注册的图标选择器。您可以在任何组件中使用图标选择器,该组件安装在main.js文件中。如果不使用element,就需要进行修改,否则可能会影响图标选择的功能。

真实效果

这是一个非常重要的内置组件,主要用来模拟登录时的操作和信息生成。它读取位于assets/json/文件夹中的两个json生成菜单和路由信息,json内容模拟后端返回的内容。

其中最重要的是路线的生成。登录并路由json信息返回后,调用init_route方法。代码如下:

init_route(route_data) {

//根据后端返回的json数据生成路由。

const init _ route _ data =[];//定义一个路由数组来存储生成的路由信息。

for(设索引= 0;index & lt路由_数据.长度;index++) {

//循环后端返回的json

//循环

if (route_data[index].孩子!=未定义){

//有子节点时生成路由数组的方法

init_route_data[index] = {

路径:route_data[index]。路径,//路由url。

名称:route_data[index]。name,//路由名称。

component:()= & gt;import(`@/${route_data[index])。组件} `),

//component:(resolve)= & gt;require([`@/views/$ { route _ data[index])。component }`],resolve),//加载后端json描述的vue文件。

元:{

//路由一些附加信息

show _ site:route _ data[索引]。meta。show _ site,//是否全屏显示?

web _ title:route _ data[索引]。meta . web _ title//网站标题

},

子级:[] //嵌套路由

};

for(设I = 0;我& ltroute _ data[index]. children . length;i++) {

init _ route _ data[索引]。儿童[i] = {

路径:route _ data [index]。孩子[我]。路径,//路由url。

名称:route _ data [index]。孩子[我]。name,//路由名称。

component:()= & gt;import(`@/${route_data[index])。孩子[我]。组件} `),

//component:(resolve)= & gt;require([`@/views/$ { route _ data[index])。孩子[我]。component }`],resolve),//加载后端json描述的vue文件。

元:{

//路由一些附加信息

show _ site:route _ data[索引]。孩子[我]。meta。show _ site,//是否全屏显示?

web _ title:route _ data[索引]。孩子[我]。meta . web _ title//网站标题。

}

};

}

}否则{

//生成无子路由数组的方法

init_route_data[index] = {

路径:route_data[index]。路径,//路由url。

名称:route_data[index]。name,//路由名称。

component:()= & gt;import(`@/${route_data[index])。组件} `),

//component:(resolve)= & gt;require([`@/views/$ { route _ data[index])。component }`],resolve),//加载后端json描述的vue文件。

元:{

show _ site:route _ data[索引]。meta。show _ site,//是否全屏显示?

web _ title:route _ data[索引]。meta . web _ title//网站标题

}

};

//console . log(index);

}

}

//console . log(init _ route _ data);//打印生成初始化路由数组。

for(设索引= 0;index & lt路由_数据.长度;index++) {

//因为addRoutes已经被放弃,所以需要重新使用AddRoutes进行数组添加。

这个。$ router . add route(init _ route _ data[index]);//循环添加数组

}

this . init _ menu();//执行菜单生成方法

},

其他三个可以随意修改。

在vue2的动态路由项目中,调用app.vue文件的mounted方法中的路由生成方法,可以刷新路由,防止路由丢失。但是在vue3中同样的方式会出现异常,因为我们在添加路由之前跳转,所以刷新后的页面上不会有内容,所以我们在unitui文件夹中新建一个init_route.js,在login.vue文件中写一些类似路由初始化的东西,然后在main.js中

Init_route.js内容

从' @/router '导入路由器

函数init_route() {

//根据后端返回的json数据生成路由。

if(session storage . getitem(" route _ data ")!= null) {

const route _ data = JSON . parse(session storage . getitem(" route _ data "));

//console . log(route _ data);

const init _ route _ data =[];//定义一个路由数组来存储生成的路由信息。

for(设索引= 0;index & lt路由_数据.长度;index++) {

//循环后端返回的json

//循环

if (route_data[index].孩子!=未定义){

//有子节点时生成路由数组的方法

init_route_data[index] = {

路径:route_data[index]。路径,//路由url。

名称:route_data[index]。name,//路由名称。

component:()= & gt;import(`@/${route_data[index])。组件} `),

//component:(resolve)= & gt;require([`@/views/$ { route _ data[index])。component }`],resolve),//加载后端json描述的vue文件。

元:{

//路由一些附加信息

show _ site:route _ data[索引]。meta。show _ site,//是否全屏显示?

web _ title:route _ data[索引]。meta . web _ title//网站标题

},

子级:[] //嵌套路由

};

for(设I = 0;我& ltroute _ data[index]. children . length;i++) {

init _ route _ data[索引]。儿童[i] = {

路径:route _ data [index]。孩子[我]。路径,//路由url。

名称:route _ data [index]。孩子[我]。name,//路由名称。

component:()= & gt;

import(`@/${route_data[index])。孩子[我]。组件} `),

//component:(resolve)= & gt;require([`@/views/$ { route _ data[index])。孩子[我]。component }`],resolve),//加载后端json描述的vue文件。

元:{

//路由一些附加信息

show _ site:route _ data[索引]。孩子[我]。meta。show _ site,//是否全屏显示?

web _ title:route _ data[索引]。孩子[我]。meta . web _ title//网站标题。

}

};

}

}否则{

//生成无子路由数组的方法

init_route_data[index] = {

路径:route_data[index]。路径,//路由url。

名称:route_data[index]。name,//路由名称。

component:()= & gt;import(`@/${route_data[index])。组件} `),

//component:(resolve)= & gt;require([`@/views/$ { route _ data[index])。component }`],resolve),//加载后端json描述的vue文件。

元:{

show _ site:route _ data[索引]。meta。show _ site,//是否全屏显示?

web _ title:route _ data[索引]。meta . web _ title//网站标题

}

};

//console . log(index);

}

}

//console . log(init _ route _ data);//打印生成初始化路由数组。

for(设索引= 0;index & lt路由_数据.长度;index++) {

//因为addRoutes已经被放弃,所以需要重新使用AddRoutes进行数组添加。

router . add route(init _ route _ data[index]);//循环添加数组

}

//将刷新放在这里

//console . log(' app ');

//const index = window . location . href . lastindexof(" # ")

//const URL = window . location . href . substring(index+1,window . location . href . length);

//这个。$router.push(url)

}

}

init_route()

main.js中的引用:

import ' @/unitui/init _ route . js '//这是为了防止刷新路由丢失。

至此,刷新自动初始化即可完成。

我们通过获取meta的值来控制显示位置。在app.vue文件中的route中显示_site(全屏显示0,视图显示1),然后用v-if控制不同router-view的显示。

App.vue源代码:

1.如果不喜欢我们的ui框架,需要开发新的ui,没有ui框架的支持,组件管理的功能可能无法正常显示(空白显示)。您可以将文件unitui/ subadmin/ SubAdmin.vue中的样式部分更改为:

#sub_admin_back {

宽度:100%;

/*非ui框架把高度写成height:100 VH;*/

身高:100 VH;

背景-尺寸:封面;

位置:相对;

背景色:# ffffff

边框-半径:10px;

}

1,对框架的干扰还没有尽可能的减少,还是需要对main.js做适当的改动