热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

vboot框架后台动态获取权限

vboot框架后台动态获取权限前言:以前用的框架总感觉有不舒服的地方,然后就一直在寻找一个理想的框架,研究了几十个框架,vboot框架让我眼前一亮,上手后发现服务端权限角色功能

vboot框架 后台动态获取权限

前言:

  以前用的框架总感觉有不舒服的地方,然后就一直在寻找一个理想的框架,研究了几十个框架,vboot框架让我眼前一亮,

上手后发现服务端权限角色功能没有实现,一度想抛弃,后来下决心费点功夫补充一下,没办法实在太喜欢这个框架了,

还有很多需要完善的地方,目前只实现了:用户的角色权限(菜单权限、按钮权限),其他的(部门权限、岗位权限、群组权限)没有实现

 基本能满足一般项目的要求

感谢框架的作者,也感谢我的好友“风清扬”给与的大力帮助,水平有限仅供参考,欢迎提出宝贵意见

 

相关文档:https://vvbin.cn/doc-next/guide/auth.html#%E5%90%8E%E5%8F%B0%E5%8A%A8%E6%80%81%E8%8E%B7%E5%8F%96

一、vboot-net后台需要修改的几个地方:

1、SysOrgUser.cs增加一个字段

    [SugarColumn(ColumnDescription = "系统管理员", DefaultValue="0", IsNullable = true)]
    
public int AdminType { get; set; }

2、AdminType.cs 修改:普通账号 NOne=0

public enum AdminType
{
///


/// 超级管理员
///

[Description("超级管理员")]
SuperAdmin
= 1,
///
/// 管理员
///

[Description("管理员")]
Admin
= 2,
///
/// 普通账号
///

[Description("普通账号")]
None
= 0
}

3、PubAuthInitService.cs 

  所有的comp = "/sys/org/dept/index.vue"去掉【.vue】,前端会自动补上.vue,
  否则找不到页面,如果数据库已生成可直接改数据库表的数据

 二、vboot-net后台

1、PubAuthApi.cs增加已下接口

     [HttpGet("/getMenuList")]
[AllowAnonymous]
public async Task<dynamic> getMenuList()
{
//生成树形菜单
List treelist = await _loginService.GetMenuList(_userManager.UserId, _userManager.User.AdminType);
return treelist;
}
[HttpGet(
"/getPermCode")]
[AllowAnonymous]
public async Taskstring>> getPermCode()
{
//按钮权限标识
List<string> permlist = await _loginService.GetPermCode(_userManager.UserId, _userManager.User.AdminType);
return permlist;
}

2、LoginService.cs增加以下代码

using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Furion.DependencyInjection;
using Furion.FriendlyException;
using SqlSugar;
using Vboot.Core.Common;
using Vboot.Core.Module.Pub.Auth;
using Vboot.Core.Module.Sys;
namespace Vboot.Core.Module.Pub
{
public class LoginService : ITransient
{
private readonly ISqlSugarRepository _repo;
public LoginService(ISqlSugarRepository repo)
{
_repo
= repo;
}
public async Task getDbUser(string username)
{
const string sql = "select id,name,pacod,retag from sys_org_user where usnam=@username and avtag=1";
var dbUser = await _repo.Ado.SqlQuerySingleAsync(sql, new{username});
// if (dbUser == null)
// {
// throw new Exception("账号不存在或密码错误");
// }
if (dbUser == null)
{
throw Oops.Oh(ErrorCode.D1000);
}
return dbUser;
}
///


/// 根据当前登录用户生成菜单树
///

///


///


///
public async Task> GetMenuList(string userid, int admintype)
{
List
rootList = await GetRootList(userid, admintype);
List
routeList = await GetRouteList(userid, admintype);
List
treelist = GetMenuTreeList(routeList, rootList);
return treelist;
}
///


/// 获取当前登录用户的PermCode
///

///


///


///
public async Taskstring>> GetPermCode(string userid, int admintype)
{
List
<string> perm = new List<string>();
string sql;
if (admintype == (int)AdminType.SuperAdmin)
{
sql
= $@"SELECT perm
FROM sys_auth_menu
WHERE `type`='B'
";
}
else
{
sql
= $@"SELECT perm
FROM sys_auth_menu
WHERE `type`='B' AND shtag=1 AND avtag=1 AND id IN
(
SELECT `mid`
FROM sys_auth_role_menu a
LEFT JOIN sys_auth_role_org b ON b.rid=a.rid
WHERE b.oid='{userid}'
)
";
}
List
menulist = await _repo.Context.SqlQueryable(sql).ToListAsync();
for (int i = 0; i )
{
perm.Add(menulist[i].perm);
}
return perm;
}
///


/// 从数据库获取菜单列表转换成前端需要的格式
///

///


///


///
private async Task> GetRouteList(string userid, int admintype)
{
string sql;
if (admintype == (int)AdminType.SuperAdmin)
{
sql
= $@"SELECT id,pid,ornum,`name`,icon,path,comp,`code`,redirect
FROM sys_auth_menu
where `type`!='B'
ORDER BY ornum
";
}
else
{
sql
= $@"SELECT id,pid,ornum,`name`,icon,path,comp,`code`,redirect
FROM sys_auth_menu
WHERE `type`!='B' AND shtag=1 AND avtag=1 and id IN
(
SELECT a.mid
FROM sys_auth_role_menu a
LEFT JOIN sys_auth_role b ON b.id=a.rid
LEFT JOIN sys_auth_role_org c ON c.rid=b.id
WHERE c.oid='{userid}'
)
ORDER BY ornum
";
}
List
routelist = await ToWebmenuList(sql);
return routelist;
}
///


/// 取当前登录用户权限的根菜单列表
///

///


///


///
private async Task> GetRootList(string userid, int admintype)
{
string sql;
if (admintype == (int)AdminType.SuperAdmin)
{
sql
= $@"SELECT id,pid,ornum,`name`,icon,path,comp,`code`,redirect
FROM sys_auth_menu
WHERE isnull(pid)=true and `type`!='B'
ORDER BY ornum
";
}
else
{
sql
= $@"SELECT id,pid,ornum,`name`,icon,path,comp,`code`,redirect
FROM sys_auth_menu
WHERE id IN
(
SELECT pid
FROM
(
SELECT id,pid,ornum,`name`,icon,path,comp,`code`,redirect
FROM sys_auth_menu
WHERE `type`!='B' AND shtag=1 AND avtag=1 and id IN
(
SELECT a.mid
FROM sys_auth_role_menu a
LEFT JOIN sys_auth_role b ON b.id=a.rid
LEFT JOIN sys_auth_role_org c ON c.rid=b.id
WHERE c.oid='{userid}'
)
) a
)
AND id NOT IN
(
SELECT id
FROM
(
SELECT id,pid,ornum,`name`,icon,path,comp,`code`,redirect
FROM sys_auth_menu
WHERE `type`!='B' AND shtag=1 AND avtag=1 and id IN
(
SELECT a.mid
FROM sys_auth_role_menu a
LEFT JOIN sys_auth_role b ON b.id=a.rid
LEFT JOIN sys_auth_role_org c ON c.rid=b.id
WHERE c.oid='{userid}'
)
) b
)
ORDER BY ornum
";
}
List
rootlist = await ToWebmenuList(sql);
return rootlist;
}
///


/// 取菜单列表转web端格式列表
///

///


///
private async Task> ToWebmenuList(string sql)
{
List
list = new List();
var menulist = await _repo.Context
.SqlQueryable
(sql)
.ToListAsync();
for (int i = 0; i )
{
RouteMeta meta = new RouteMeta();
meta.orderNo
= menulist[i].ornum;
meta.icon
= menulist[i].icon;
meta.title
= menulist[i].name;
RouteItem item
= new RouteItem();
item.id
= menulist[i].id;
item.pid
= menulist[i].pid;
item.path
= menulist[i].path;
item.component
= menulist[i].comp;
//item.compOnent= "/sys/auth/role/index";
item.name = menulist[i].code;
item.redirect
= menulist[i].redirect;
item.meta
= meta;
item.children
= new List();
list.Add(item);
}
return list;
}
///


/// 生成树形菜单
///

///


///


///
private List GetMenuTreeList(List menulist, List rootlist)
{
if (menulist == null)
{
menulist
= new List();
}
List
treelist = new List();
treelist.AddRange(rootlist);
GetChildrenList(menulist, rootlist);
return treelist;
}
///


/// 取子菜单
///

///


///


private void GetChildrenList(List menulist, List plist)
{
foreach (RouteItem item in plist)
{
List
childrenlist = menulist.Where(p => p.pid == item.id).ToList();
item.children.AddRange(childrenlist);
GetChildrenList(menulist, childrenlist);
}
}
}
public class RouteMeta
{
public int? orderNo { get; set; }
// title
public string title { get; set; }
//// dynamic router level.
//public int? dynamicLevel{get;set;}
//// dynamic router real route path (For performance).
//public string realPath{get;set;}
//// Whether to ignore permissions
//public bool? ignoreAuth{get;set;}
//// role info RoleEnum[]
//public object roles { get; set; }
//// Whether not to cache
//ignoreKeepAlive?: boolean;
//// Is it fixed on tab
//affix?: boolean;
//icon on tab
public string icon { get; set; }
//frameSrc?: string;
//// current page transition
//transitionName?: string;
//// Whether the route has been dynamically added
//hideBreadcrumb?: boolean;
//// Hide submenu
//hideChildrenInMenu?: boolean;
//// Carrying parameters
//carryParam?: boolean;
//// Used internally to mark single-level menus
//single?: boolean;
//// Currently active menu
//currentActiveMenu?: string;
//// Never show in tab
//hideTab?: boolean;
//// Never show in menu
//hideMenu?: boolean;
//isLink?: boolean;
//// only build for Menu
//ignoreRoute?: boolean;
//// Hide path for children
//hidePathForChildren?: boolean;
}
public class RouteItem
{
public string id { get; set; }
public string pid { get; set; }
public string path { get; set; }
// component: any;
public object component { get; set; }
public RouteMeta meta { get; set; }
public string name { get; set; }
//alias?: string | string[];
public string redirect { get; set; }
//public bool? caseSensitive{get;set;}
public List children { get; set; }
}
}

LoginService.cs

三、前端vboot-vben

1、projectSetting.ts 权限模式改为 BACK 模式

// Permission mode
//permissionMode: PermissionModeEnum.ROUTE_MAPPING,
permissionMode: PermissionModeEnum.BACK,

2、BACK模式下默认访问views路径不是pages路径,所以要把pages下相应的目录及文件要拷贝到views下,如下图所示:

3、前端按钮权限的实现 v-auth="'权限标识'"

"'dept:delete'" @click="deleteEvent($refs.xGrid)">删 除

到此,用户的菜单权限、按钮权限基本就完成了,亲测可用

 



推荐阅读
  • R语言及RStudio的安装步骤详解
    本文详细介绍了如何正确安装R语言及其集成开发环境RStudio。首先,需要确保安装R语言的基础环境,然后再安装RStudio。虽然先安装RStudio在技术上可行,但为了遵循最佳实践,建议先安装R语言。以下是R语言安装包的下载链接。 ... [详细]
  • 本文对SQL Server系统进行了基本概述,并深入解析了其核心功能。SQL Server不仅提供了强大的数据存储和管理能力,还支持复杂的查询操作和事务处理。通过MyEclipse、SQL Server和Tomcat的集成开发环境,可以高效地构建银行转账系统。在实现过程中,需要确保表单参数与后台代码中的属性值一致,同时在Servlet中处理用户登录验证,以确保系统的安全性和可靠性。 ... [详细]
  • 帝国CMS中的信息归档功能详解及其重要性
    本文详细解析了帝国CMS中的信息归档功能,并探讨了其在内容管理中的重要性。通过归档功能,用户可以有效地管理和组织大量内容,提高网站的运行效率和用户体验。此外,文章还介绍了如何利用该功能进行数据备份和恢复,确保网站数据的安全性和完整性。 ... [详细]
  • 在处理 XML 数据时,如果需要解析 `` 标签的内容,可以采用 Pull 解析方法。Pull 解析是一种高效的 XML 解析方式,适用于流式数据处理。具体实现中,可以通过 Java 的 `XmlPullParser` 或其他类似的库来逐步读取和解析 XML 文档中的 `` 元素。这样不仅能够提高解析效率,还能减少内存占用。本文将详细介绍如何使用 Pull 解析方法来提取 `` 标签的内容,并提供一个示例代码,帮助开发者快速解决问题。 ... [详细]
  • HTML 中的 meta 和 script 标签属性是否区分大小写? ... [详细]
  • 在使用 SQL Server 时,连接故障是用户最常见的问题之一。通常,连接 SQL Server 的方法有两种:一种是通过 SQL Server 自带的客户端工具,例如 SQL Server Management Studio;另一种是通过第三方应用程序或开发工具进行连接。本文将详细分析导致连接故障的常见原因,并提供相应的解决策略,帮助用户有效排除连接问题。 ... [详细]
  • 手指触控|Android电容屏幕驱动调试指南
    手指触控|Android电容屏幕驱动调试指南 ... [详细]
  • Linux Shell变量初探:初始值解析与使用指南
    本文探讨了Linux Shell中变量的基本概念及其在BASH中的应用。变量是用于存储可变数据的标识符,能够代表不同的值。文章详细介绍了BASH shell的主要优势,包括强大的命令编辑能力、自动补全功能、命令别名设置、作业控制以及前后台任务管理。此外,还涵盖了编程脚本编写和通配符的使用方法,为初学者提供了全面的指导。 ... [详细]
  • 本文总结了JavaScript的核心知识点和实用技巧,涵盖了变量声明、DOM操作、事件处理等重要方面。例如,通过`event.srcElement`获取触发事件的元素,并使用`alert`显示其HTML结构;利用`innerText`和`innerHTML`属性分别设置和获取文本内容及HTML内容。此外,还介绍了如何在表单中动态生成和操作``元素,以便更好地处理用户输入。这些技巧对于提升前端开发效率和代码质量具有重要意义。 ... [详细]
  • 本文介绍了如何在iOS平台上使用GLSL着色器将YV12格式的视频帧数据转换为RGB格式,并展示了转换后的图像效果。通过详细的技术实现步骤和代码示例,读者可以轻松掌握这一过程,适用于需要进行视频处理的应用开发。 ... [详细]
  • 开发了一款Windows API查看器,支持VBA语句导出,并提供超过两万个API的MSDN链接查询功能。
    开发了一款名为Windows API Viewer的工具,支持导出VBA语句,并集成了超过两万个API的MSDN链接查询功能,方便用户快速查找和使用相关API信息。 ... [详细]
  • 如何使用FindWindow360问答功能?探索其专业应用与技巧 ... [详细]
  • 通过以下步骤可以确定SharePoint网站集对应的W3WP进程及其运行状态:首先,打开命令提示符(CMD),然后输入 `iisapp` 命令,该命令将列出当前IIS中所有Web应用程序及其对应的w3wp.exe进程。此外,还可以使用任务管理器或PowerShell脚本来进一步检查这些进程的详细信息和运行状态,以确保网站集的正常运行。 ... [详细]
  • 本文详细介绍了 Excel VBA 3.16 版本中的多种组合筛选技巧,帮助用户高效地处理复杂数据。通过丰富的示例和详细的代码解析,读者可以轻松掌握这些强大的数据筛选方法,提高日常工作中的数据处理效率。无论是初学者还是资深用户,都能从中受益匪浅。 ... [详细]
  • 机顶盒,即数字电视机顶盒(Digital TV Set-Top Box,简称STB),是一种放置在电视机旁的设备。它主要用于将数字信号转换为电视能够识别的模拟信号,从而实现高质量的视频和音频播放。机顶盒不仅支持基本的电视节目接收功能,还具备多种增值服务,如互动点播、网络浏览等。随着技术的发展,现代机顶盒集成了更多的智能功能,成为家庭娱乐的重要组成部分。 ... [详细]
author-avatar
西北人6668_733
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有