热门标签 | 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)">删 除

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

 



推荐阅读
  • Linux环境变量$PATH的作用及使用方法
    本文介绍了Linux环境变量$PATH的作用及使用方法。$PATH是一个由多个目录组成的变量,用冒号分隔。当执行一个指令时,系统会按照$PATH定义的目录顺序搜索同名的可执行文件,如果有多个同名指令,则先找到的会被执行。通过设置$PATH变量,可以在任何地方执行指令,无需输入绝对路径。 ... [详细]
  • Windows7企业版怎样存储安全新功能详解
    本文介绍了电脑公司发布的GHOST WIN7 SP1 X64 通用特别版 V2019.12,软件大小为5.71 GB,支持简体中文,属于国产软件,免费使用。文章还提到了用户评分和软件分类为Win7系统,运行环境为Windows。同时,文章还介绍了平台检测结果,无插件,通过了360、腾讯、金山和瑞星的检测。此外,文章还提到了本地下载文件大小为5.71 GB,需要先下载高速下载器才能进行高速下载。最后,文章详细解释了Windows7企业版的存储安全新功能。 ... [详细]
  • vb.net不用多线程如何同时运行两个过程?不用多线程?即使用多线程,也不会是“同时”执行,题主只要略懂一些计算机编译原理就能明白了。不用多线程更不可能让两个过程同步执行了。不过可 ... [详细]
  • Opencv提供了几种分类器,例程里通过字符识别来进行说明的1、支持向量机(SVM):给定训练样本,支持向量机建立一个超平面作为决策平面,使得正例和反例之间的隔离边缘被最大化。函数原型:训练原型cv ... [详细]
  • VBA操作Excel之设置单元格属性
    VBA操作Excel简介一、VBA读写Excel文件二、VBA设置单元格属性三、VBA弹出输入和输出窗口参考文档一、VBA读写Excel文件VBA简介及打开Excel文件方法见VB ... [详细]
  • 如题如示,在网上查了下c#直接操作ppt的例子,但都只是很简单的写了下打开PPT插入标题插入一个图表等,但是都没有更具体的有如何可以直接更改PPT图表的数据源数据的例子。我现在的需求是,我有一个P ... [详细]
  • vb6集成ad登录共享文件_SCSP实验2单点登录
    01—实验目的掌握单点登陆相关原理和深信服配置02—实验环境1.AC版本v12.0.42AC1地址:https:172.172.1.1AC2地址:htt ... [详细]
  • M$exceloriginprosigmaplot里面怎么画一个x(自然数序列),多个y比如10个y数据曲线,要求所有曲线都不能重叠的,但是x轴只要一个。因为在文章里面给图的位置很小,但是 ... [详细]
  • vb.net面试题,请大家帮忙,谢谢。如果需要讲详细一点,那就加我QQ531412815第4题,潜在的错误,这里的错误不是常规错误,属于那种只有在运行是才知道的错误:Catchex ... [详细]
  • quartus管脚分配后需要保存吗_嵌入式必须会的一些硬件面试题,要试一试吗?你过来呀!...
    1、下面是一些基本的数字电路知识问题,请简要回答之。(1)什么是Setup和Hold时间?答:SetupHoldTime用于测试芯片对输入 ... [详细]
  • asp.net(vb脚本)如何获取xml的节点值?xmlversion1.0encodingutf-8?rootimageimagemenusmenuurl#frame_paren ... [详细]
  • http:www.cnblogs.compirloarchive200909091563368.html以前操作Excel的话,一般都会去用Microsoft.Jet.OLEDB.4. ... [详细]
  • 【Python 爬虫】破解按照顺序点击验证码(非自动化浏览器)
    #请求到验证码base64编码json_img_datajson_raw.get(Vimage)#获取到验证码编码 #保存验证码图片到本地defbase64_to_img(bstr ... [详细]
  • 我的vb.net中没有CrystalReport控件怎么打印报表啊?不会吧,在vb.net工程中,选择新项目的追加,在实用程序的选项中,可看到有CrystalReport的选项。它 ... [详细]
  • 你是否注意到,当你在高优先级下运行应用程序是,应用程序运行得特别快(这也视你运行什么样的应用程序而定)。拿WinRar做例子 ... [详细]
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社区 版权所有