【ABP】 动态菜单修改过程asp.netcore+vue
无论用什么框架,第一件事情就是实现动态菜单,从数据库中读取菜单配置项输出前台,网上翻了一大堆翻译文档,也看了官方英文文档,关键点在于如何实现NavigationProvider
和在前端调用abp.nav.menus.MainMenu
。
后台处理
1、建表UiMenu
public class UiMenu : FullAuditedEntity<int>, IMustHaveTenant
{
public int Pid { get; set; }
[Required]
[StringLength(50)]
public string Name { get; set; }
[Required]
[StringLength(50)]
public string DisplayName { get; set; }
[Required]
[StringLength(50)]
public string MenuType { get; set; }
[StringLength(200)]
public string Path { get; set; }
[StringLength(500)]
public string CustomData { get; set; }
[StringLength(200)]
public string Remark { get; set; }
public string Icon { get; set; }
public string Action { get; set; }
public int Order { get; set; }
public int TenantId { get; set; }
}
2、实现MyNavigationProvider
在Core项目里新建文件夹Navigations
,新建类MyNavigationProvider
,需继承NavigationProvider
。
如下实现UiMneu的仓储操作对象
private readonly IRepository<UiMenu> _repository;
public MyNavigationProvider(IRepository<UiMenu> repository)
{
_repository = repository;
}
然后重写SetNavigation
。
var allMenus = _repository.GetAllList();
foreach (var item in allMenus)
{
if (item.Pid>0)
{
//子项
context.Manager.MainMenu.GetItemByName(allMenus.Find(p => p.Id == item.Pid).Name).AddItem(
new MenuItemDefinition(
item.Name,
new LocalizableString(item.DisplayName, MyConsts.LocalizationSourceName),
url: item.Path,
icon: item.Icon,
isVisible: item.IsDeleted,
requiredPermissionName: ""
)
);
}
else
{
//父级菜单
context.Manager.MainMenu.AddItem(new MenuItemDefinition(
item.Name,
new LocalizableString(item.DisplayName, MyConsts.LocalizationSourceName),
url: item.Path,
icon: item.Icon,
isVisible:item.IsDeleted,
requiredPermissionName:""//配置权限,可在UiMenu表中新加字段配置
));
}
}
至于如何对菜单表进行增删改查维护,不是本篇主题,故略过。
前端实现
前端实现的主要是依靠官方提供的方法abp.nav.menus.MainMenu
1、创建router帮助方法 router-util.ts
import main from '../views/main.vue'
//import ParentView from '@/components/parent-view'
// 加载路由菜单,从localStorage拿到路由,在创建路由时使用
// @函数: 引入组件
export const lazyLoadingCop = file => require('../views' + file + '.vue').default
class RouterHelper {
dynamicRouterAdd(): Array<Router> {
let dynamicRouter = []
window.abp.nav.menus.MainMenu.items.forEach(el => {
let obj = {
path: '/' + el.name,
name: el.name,
icon: el.icon,
permission: undefined,
meta: { title: el.displayName },
component: 'main',
children: [],
}
if (el.items.length > 0) {
el.items.forEach(child => {
obj.children.push({
path: child.name,
name: child.name,
icon: child.icon,
permission: undefined,
meta: { title: child.displayName },
component: child.url,
children: null,
})
})
dynamicRouter.push(obj)
} else {
dynamicRouter.push({
path: '/' + el.items[0].name,
name: el.items[0].name,
icon: el.items[0].icon,
permission: undefined,
meta: { title: el.items[0].displayName },
component: el.items[0].url,
children: [],
})
}
});
dynamicRouter = this.filterAsyncRouter(dynamicRouter)
return dynamicRouter
}
// @函数: 遍历后台传来的路由字符串,转换为组件对象
filterAsyncRouter(asyncRouterMap) {
const accessedRouters = asyncRouterMap.filter(route => {
if (route.component) {
if (route.component === 'main' || route.component.name === 'main') { // Main组件特殊处理
route.component = main
}
// else if (route.component === 'parentView') { // parentView组件特殊处理
// route.component = ParentView
// }
else {
route.component = lazyLoadingCop(route.component)
}
}
if (route.children && route.children.length) {
route.children = this.filterAsyncRouter(route.children)
}
return true
})
return accessedRouters
}
}
const routerHelper = new RouterHelper();
export default routerHelper;
parentView
为多级菜单,如果有需求可以使用,该组件摘自iView admin 2.0
解释:
循环abp.nav.menus.MainMenu.items
,将其格式转换为Router
。方便菜单调用。
2、修改router/index.ts
找到router/index.ts,
在beforeEach
方法里添加如下代码
let dyRouters = RouterHelper.dynamicRouterAdd()
dyRouters.forEach(element => {
appRouters.push(element);
});
router.addRoutes(appRouters)
注意引用 import RouterHelper from '../lib/router-util'
总结
一开始没有丝毫头绪,后台参照使用iview admin时构建的方法进行尝试,加之刚刚接触typescript,用起来不是特别顺手,问题的关键在于router/router.ts
->appRouters处无法获得abp.nav.menus.MainMenu.items
在store/modules/app里虽然可以获取,但是router中不存在,无法正常点击跳转,taglist同样也无从获取。
最终想到这种不是很完美的方法,前端仍然需要进行循环转换Model。但终归是实现了动态菜单,可以进行下一步操作了。
【ABP】 动态菜单修改过程asp.netcore+vue的更多相关文章
- .net core3.1 abp动态菜单和动态权限(思路) (二)
ps:本文需要先把abp的源码下载一份来下,跟着一起找实现,更容易懂 在abp中,对于权限和菜单使用静态来管理,菜单的加载是在登陆页面的地方(具体是怎么知道的,浏览器按F12,然后去sources中去 ...
- .net core3.1 abp动态菜单和动态权限(动态菜单实现和动态权限添加) (三)
我们来创建动态菜单吧 首先,先对动态菜单的概念.操作.流程进行约束:1.Host和各个Tenant有自己的自定义菜单2.Host和各个Tenant的权限与自定义菜单相关联2.Tenant有一套默认的菜 ...
- 循序渐进VUE+Element 前端应用开发(3)--- 动态菜单和路由的关联处理
在我开发的很多系统里面,包括Winform混合框架.Bootstrap开发框架等系列产品中,我都倾向于动态配置菜单,并管理对应角色的菜单权限和页面权限,实现系统对用户权限的控制,菜单一般包括有名称.图 ...
- 【vue】iView-admin2.0动态菜单路由
vue项目实现动态路由有俩种方式 一.前端在routers中写好--所有--路由表 <前端控制路由>,登录时根据用户的角色权限来动态的显示菜单路由 二.前端通过调用接口请求拿到当前用户-- ...
- vue、iview动态菜单(可折叠)
vue项目与iview3实现可折叠动态菜单. 菜单实现一下效果: 动态获取项目路由生成动态三级菜单导航 可折叠展开 根据路由name默认打开子目录,选中当前项 自动过滤需要隐藏的路由(例:登陆) 在手 ...
- 【vue】iView-admin2.0动态菜单路由【版2】
依照iView-admin2.0动态菜单路由[版1] 归纳几个节点动态路由获取方式2 ——> easymock假数据 ——> 数据转组件处理.addRoutes ——> localS ...
- asp.netcore 深入了解配置文件加载过程
前言 配置文件中程序运行中,担当着不可或缺的角色:通常情况下,使用 visual studio 进行创建项目过程中,项目配置文件会自动生成在项目根目录下,如 appsettings.json, ...
- abp添加动态菜单
abp中MenuDefinition封装了导航栏上的主菜单的属性,MenuItemDefinition则封装了子菜单的属性,子菜单可以引用其他子菜单构成一个菜单树. MenuDefinitio成员如下 ...
- ABP+NetCore+Vue.js实现增删改查
ABP我就不多介绍了,不知道的可以自己百度 本篇开发工具VS2017,数据库SQL SERVER2012,系统Win7 1.去ABP官网下载对应的模板,下载地址:https://aspnetboile ...
随机推荐
- Cocos2d-x 学习笔记(14.2) EventListener _paused _isEnabled _isRegistered
监听器3个bool类型成员变量. 监听器能设置是否能够接收事件. 能随时接收事件进行处理,此时把它看做工作状态,需要满足条件: _paused = false; _isEnabled ...
- B/S 端基于 HTML5 + WebGL 的 VR 3D 机房数据中心可视化
前言 在 3D 机房数据中心可视化应用中,随着视频监控联网系统的不断普及和发展, 网络摄像机更多的应用于监控系统中,尤其是高清时代的来临,更加快了网络摄像机的发展和应用. 在监控摄像机数量的不断庞大的 ...
- 概念理解-Libevent
可移植性: 使用 LibEvent 编写的程序应该在 LibEvent 支持跨越的所有平台上工作,即使没有更好的方法来处理. 非阻塞式IO:LibEvent也应该支持一般的方法使程序可以运行在某些限制 ...
- Eureka错误解决方法
# Eureka错误解决方法 ## security.basic.enabled 配置过时或不可用默认情况下:用户名:user密码:启动应用在控制台会输出,如下图: 也可以通过如下属性配置:sprin ...
- 9.Nginx常用模块
1.nginx开启目录浏览 提供下载功能 默认情况下,网站返回index指定的主页,若该网站不存在主页,则将请求交给autoindex模块 如果开启autoindex模块,则提供一个下载的页面, 如果 ...
- 04 python学习笔记-函数、函数参数和返回值(四)
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段.函数能提高应用的模块性,和代码的重复利用率.Python提供了许多内建函数,比如print(),我们也可以自己创建函数,这叫做用户自定 ...
- SQL手工注入方法
SQL手工注入漏洞测试(MySQL数据库) 的靶场练习 流程与方法 注意:加粗部分给重点 查询数据库名http://219.153.49.228:46939/new_list.php?id=22 ...
- 身为一个 CS专业的留学生,你还在为堆积如山的编程assignment而发愁吗?
每个人都渴望圆梦,当我们看见梦想在别人身上实现时,总在抱怨幸运之神为何不眷顾自己:其实更多的时候,梦想就在你身边的不远处,只要你迈出正确的步伐. 记得刚入大学时,意气风发.我以全班前几名的优异成绩考入 ...
- javascript运行时中的堆栈和队列
下面是一个理论上的模型,js引擎着重实现和优化了描述的这几个语义 可视化描述 栈(stack) var a = 10; function bar(x) { var b = 5; fn(x + b); ...
- unity 基于scrollRect实现翻页显示
unity 基于scrollRect实现翻页显示,并定为到某一页,而不是某一页的中间方法(第二个脚本采用实际位置计算,并在update里实现平滑过渡): 组场景时,经常需要获取鼠标(或者点击)开始结束 ...