功能权限
1、表设计

1.1、sys_menu
DROP TABLE IF EXISTS `sys_menu`; CREATE TABLE `sys_menu` ( `Id` int(11) NOT NULL AUTO_INCREMENT, `Name` varchar(50) NOT NULL, `Icon` varchar(20) DEFAULT NULL, `Order` int(2) DEFAULT '0', `Url` varchar(50) NOT NULL, `IsDel` tinyint(1) NOT NULL DEFAULT '0', PRIMARY KEY (`Id`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; /*Data for the table `sys_menu` */ insert into `sys_menu`(`Id`,`Name`,`Icon`,`Order`,`Url`,`IsDel`) values (1,'差旅态势分析','fa-dashboard',1,'view/reportdashbord.html',0), (2,'统计条件查询','fa-th',2,'view/statisticsdataquery.html',0), (3,'差旅态势分析','fa-dashboard',1,'view/l2reportdashbord.html',0);
1.2、sys_role
DROP TABLE IF EXISTS `sys_role`; CREATE TABLE `sys_role` ( `Id` int(11) NOT NULL AUTO_INCREMENT, `Name` varchar(20) NOT NULL, `IsDel` tinyint(1) NOT NULL DEFAULT '0', PRIMARY KEY (`Id`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; /*Data for the table `sys_role` */ insert into `sys_role`(`Id`,`Name`,`IsDel`) values (1,'管理员',0), (2,'省厅',0), (3,'二级预算单位',0);
1.3、sys_rolemenu
DROP TABLE IF EXISTS `sys_rolemenu`; CREATE TABLE `sys_rolemenu` ( `Id` int(11) NOT NULL AUTO_INCREMENT, `RoleId` int(11) NOT NULL, `MenuId` int(11) NOT NULL, PRIMARY KEY (`Id`) ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; /*Data for the table `sys_rolemenu` */ insert into `sys_rolemenu`(`Id`,`RoleId`,`MenuId`) values (1,1,1), (2,1,2), (3,2,1), (4,2,2), (5,3,3);
1.4、sys_rolesource
DROP TABLE IF EXISTS `sys_rolesource`; CREATE TABLE `sys_rolesource` ( `Id` int(11) NOT NULL AUTO_INCREMENT, `RoleId` int(11) DEFAULT NULL, `SourceId` int(11) DEFAULT NULL, PRIMARY KEY (`Id`) ) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8; /*Data for the table `sys_rolesource` */ insert into `sys_rolesource`(`Id`,`RoleId`,`SourceId`) values (1,3,1), (2,3,2), (3,3,3), (4,3,4), (5,2,5), (6,2,6), (7,2,7), (8,2,8), (9,2,9);
1.5、sys_source
DROP TABLE IF EXISTS `sys_source`; CREATE TABLE `sys_source` ( `Id` int(11) NOT NULL AUTO_INCREMENT, `Name` varchar(50) DEFAULT NULL, `Description` varchar(50) DEFAULT NULL, `IsDel` tinyint(1) NOT NULL DEFAULT '0', PRIMARY KEY (`Id`) ) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8; /*Data for the table `sys_source` */ insert into `sys_source`(`Id`,`Name`,`Description`,`IsDel`) values (1,'api/UnitReimburse/customerusages','二级运算单位',0), (2,'api/UnitReimburse/usagessum','二级运算单位',0), (3,'api/UnitReimburse/regionusages','二级运算单位',0), (4,'api/UnitTravelReport/triproute','二级运算单位',0), (5,'api/AdmReimburse/customerusages',NULL,0), (6,'api/AdmReimburse/usagessum',NULL,0), (7,'api/AdmReimburse/regionusages',NULL,0), (8,'api/AdmTravelReport/triproute',NULL,0), (9,'api/AdmReimburse/querystatisticsdata',NULL,0);
1.6、sys_unit
DROP TABLE IF EXISTS `sys_unit`; CREATE TABLE `sys_unit` ( `Id` int(11) NOT NULL AUTO_INCREMENT, `UnitCode` varchar(10) DEFAULT NULL COMMENT '单位编码', `Name` varchar(50) DEFAULT NULL COMMENT '单位名称', `ParentCode` varchar(10) DEFAULT NULL COMMENT '父单位编码', `AdmDivCode` varchar(20) DEFAULT NULL, `L2AdmDivCode` varchar(20) DEFAULT NULL, `CompanyCode` varchar(20) DEFAULT NULL, `IsDel` tinyint(1) DEFAULT '0', PRIMARY KEY (`Id`) ) ENGINE=InnoDB AUTO_INCREMENT=61 DEFAULT CHARSET=utf8; /*Data for the table `sys_unit` */ insert into `sys_unit`(`Id`,`UnitCode`,`Name`,`ParentCode`,`AdmDivCode`,`L2AdmDivCode`,`CompanyCode`,`IsDel`) values (1,'YGO00332',NULL,NULL,'100000','100000','119001',0), (2,'YGO01491',NULL,'YGO00332','100000','100000','119135',0), (3,'YGO00333',NULL,'YGO00332','110102','110100','119145',0), (4,'YGO01509',NULL,'YGO00332','330000','330000','119166',0), (5,'YGO01499',NULL,'YGO00332','100000','100000','119150',0), (6,'YGO01480',NULL,'YGO00332','100000','100000','119125',0), (7,'YGO01463',NULL,'YGO00332','100000','100000','119106',0), (8,'YGO01464',NULL,'YGO00332','100000','100000','119107',0), (9,'YGO01465',NULL,'YGO00332','100000','100000','119108',0), (10,'YGO01466',NULL,'YGO00332','100000','100000','119109',0), (11,'YGO01467',NULL,'YGO00332','100000','100000','119110',0), (12,'YGO01468',NULL,'YGO00332','100000','100000','119111',0), (13,'YGO01469',NULL,'YGO00332','100000','100000','119112',0), (14,'YGO01470',NULL,'YGO00332','100000','100000','119113',0), (15,'YGO01471',NULL,'YGO00332','100000','100000','119114',0), (16,'YGO01472',NULL,'YGO00332','100000','100000','119115',0), (17,'YGO01473',NULL,'YGO00332','100000','100000','119117',0), (18,'YGO01474',NULL,'YGO00332','100000','100000','119118',0), (19,'YGO01475',NULL,'YGO00332','100000','100000','119119',0), (20,'YGO01476',NULL,'YGO00332','100000','100000','119121',0), (21,'YGO01477',NULL,'YGO00332','100000','100000','119122',0), (22,'YGO01478',NULL,'YGO00332','100000','100000','119123',0), (23,'YGO01479',NULL,'YGO00332','100000','100000','119124',0), (24,'YGO01481',NULL,'YGO00332','100000','100000','119126',0), (25,'YGO01482',NULL,'YGO00332','100000','100000','119127',0), (26,'YGO01483',NULL,'YGO00332','100000','100000','119128',0), (27,'YGO01484',NULL,'YGO00332','100000','100000','119129',0), (28,'YGO01485',NULL,'YGO00332','100000','100000','119130',0), (29,'YGO01486',NULL,'YGO00332','100000','100000','119131',0), (30,'YGO01487',NULL,'YGO00332','100000','100000','119120',0), (31,'YGO01488',NULL,'YGO00332','100000','100000','119132',0), (32,'YGO01489',NULL,'YGO00332','100000','100000','119133',0), (33,'YGO01490',NULL,'YGO00332','100000','100000','119134',0), (34,'YGO01492',NULL,'YGO00332','100000','100000','119137',0), (35,'YGO01493',NULL,'YGO00332','100000','100000','119138',0), (36,'YGO01494',NULL,'YGO00332','100000','100000','119141001',0), (37,'YGO01495',NULL,'YGO00332','100000','100000','119141003',0), (38,'YGO01496',NULL,'YGO00332','100000','100000','119141002',0), (39,'YGO01497',NULL,'YGO00332','100000','100000','119142',0), (40,'YGO01498',NULL,'YGO00332','100000','100000','119148',0), (41,'YGO01500',NULL,'YGO00332','100000','100000','119153',0), (42,'YGO01501',NULL,'YGO00332','100000','100000','119154',0), (43,'YGO01502',NULL,'YGO00332','100000','100000','119157',0), (44,'YGO01503',NULL,'YGO00332','100000','100000','119158',0), (45,'YGO01504',NULL,'YGO00332','100000','100000','119160',0), (46,'YGO01505',NULL,'YGO00332','100000','100000','119161',0), (47,'YGO01506',NULL,'YGO00332','100000','100000','119162',0), (48,'YGO01507',NULL,'YGO00332','100000','100000','119164',0), (49,'YGO01508',NULL,'YGO00332','100000','100000','119165',0), (50,'YGO01510',NULL,'YGO00332','100000','100000','119136',0), (51,'YGO01511',NULL,'YGO00332','100000','100000','119116',0), (52,'YGO01512',NULL,'YGO00332','100000','100000','119143',0), (53,'YGO01513',NULL,'YGO00332','100000','100000','119144',0), (54,'YGO01514',NULL,'YGO00332','100000','100000','119146',0), (55,'YGO01515',NULL,'YGO00332','100000','100000','163119',0), (56,'YGO01516',NULL,'YGO00332','100000','100000','119102001',0), (57,'YGO01517',NULL,'YGO00332','100000','100000','119102003',0), (58,'YGO00841',NULL,'YGO00332','100000','100000','119104',0), (59,'YGO01461',NULL,'YGO00332','100000','100000','119103',0), (60,'YGO01462',NULL,'YGO00332','100000','100000','119105',0);
1.7、sys_user
DROP TABLE IF EXISTS `sys_user`; CREATE TABLE `sys_user` ( `Id` bigint(20) NOT NULL AUTO_INCREMENT, `Name` varchar(50) NOT NULL, `Pwd` varchar(50) NOT NULL, `AdmDivCode` varchar(50) NOT NULL, `AdmDivName` varchar(100) DEFAULT NULL, `Remark` varchar(100) DEFAULT NULL, `IsDel` tinyint(1) NOT NULL DEFAULT '0', `Power` int(2) DEFAULT NULL, `UnitCode` varchar(10) DEFAULT NULL, PRIMARY KEY (`Id`) ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8; /*Data for the table `sys_user` */ insert into `sys_user`(`Id`,`Name`,`Pwd`,`AdmDivCode`,`AdmDivName`,`Remark`,`IsDel`,`Power`,`UnitCode`) values (2,'hebei','DATA0031big','13000','河北省','河北省差旅电子凭证网上报销大数据分析平台',0,1,'YGO00332'), (3,'liuwq','DATA0031big','13000','河北省','河北省差旅电子凭证网上报销大数据分析平台',0,1,'YGO00332'), (4,'luoning','DATA0031big','13000','河北省','河北省差旅电子凭证网上报销大数据分析平台',0,1,'YGO00332'), (5,'denggm','DATA0031big','13000','河北省','河北省差旅电子凭证网上报销大数据分析平台',0,1,'YGO00332'), (6,'hebei2','123','13000',NULL,'hebei2',0,1,'YGO00332');
1.8、sys_userrole
DROP TABLE IF EXISTS `sys_userrole`; CREATE TABLE `sys_userrole` ( `Id` int(11) NOT NULL AUTO_INCREMENT, `RoleId` int(11) NOT NULL, `UserId` int(11) NOT NULL, PRIMARY KEY (`Id`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; /*Data for the table `sys_userrole` */ insert into `sys_userrole`(`Id`,`RoleId`,`UserId`) values (1,3,6), (2,2,2);
2、过滤器
using GWHomeBigData.Model; using GWHomeBigData.Statistics.IService; using GWHomeBigData.Cache; using Microsoft.AspNetCore.Mvc.Filters; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using System.Net; using Microsoft.AspNetCore.Mvc; namespace GWHomeBigData.Statistics.WebApi.Filter { public class PermissionFilter : IActionFilter { private readonly ICache cache; private readonly IUserService userService; public PermissionFilter(ICache cache, IUserService userService) { this.cache = cache; this.userService = userService; } public void OnActionExecuted(ActionExecutedContext context) { } public void OnActionExecuting(ActionExecutingContext context) { var u = context.HttpContext.Items["userInfo"] as SysUserInfo; string permissionCacheKey = $"GWHomeReport_permission_{u.Name}"; var permissions = cache.Get<List<UserPermission>>(permissionCacheKey); if(permissions==null || permissions.Count() == 0) { permissions = userService.GetUserPermissions(u); if (permissions != null && permissions.Count() == 0) cache.Insert(permissionCacheKey, permissions); } string action = context.HttpContext.Request.Query["action"]; if (permissions.Any(t => t.Name == action)) return; context.HttpContext.Response.StatusCode = (int)HttpStatusCode.Forbidden; context.Result = new JsonResult(new { Ok=false,Error="没有权限!"}); } } }
3、控制器上以不同的方式引用它,以便通过带有参数的新构造函数的依赖注入来初始化它
services.AddScoped<PermissionFilter>();
4、添加过滤器作用范围
using Microsoft.AspNetCore.Mvc; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using GWHomeReport.Util; using Microsoft.Extensions.Logging; using Newtonsoft.Json; using GWHomeBigData.Model; using GWHomeReport.Util.Meta; using Newtonsoft.Json.Linq; using System.IO; using System.Text; using Microsoft.Extensions.Configuration; namespace GWHomeBigData.Statistics.WebApi.Controllers { [Route("api/statistic")] [ApiController] public class StatisticController : ControllerBase { private ILogger<StatisticController> logger; private IConfiguration configuration; public StatisticController(ILogger<StatisticController> logger, IConfiguration configuration) { this.logger = logger; this.configuration = configuration; } [HttpGet] public IActionResult Get() { return Ok(1); } [ServiceFilter(typeof(Filter.PermissionFilter))] [HttpPost] public IActionResult Post([FromQuery]string action) { try { Stream stream = HttpContext.Request.Body; byte[] buffer = new byte[HttpContext.Request.ContentLength.Value]; stream.Read(buffer, 0, buffer.Length); string obj = Encoding.UTF8.GetString(buffer); SysUserInfo userInfo = HttpContext.Items["userInfo"] as SysUserInfo; JObject paramObj = JsonConvert.DeserializeObject<JObject>(obj); paramObj.Add("UnitCode", userInfo.UnitCode); if (paramObj.ContainsKey("AdmDivCode")) { string _admDivCode = paramObj["AdmDivCode"].ToString(); switch (userInfo.Power) { case (int)SysUserPowerEnum.Ministry: if (userInfo.AdmDivCode.Substring(0, 2) != _admDivCode.Substring(0,2)) { return Ok(new { Ok = false, Error = "参数错误!" }); } break; case (int)SysUserPowerEnum.Office: if (userInfo.AdmDivCode.Substring(0, 4) != _admDivCode.Substring(0,4)) { return Ok(new { Ok = false, Error = "参数错误!" }); } break; default: break; } } string url = configuration["HttpRequestUrl.Report"] + action; string parm = JsonConvert.SerializeObject(paramObj); string r = HttpRequest.HttpPost(url, parm); return Content(r); } catch (Exception ex) { logger.LogError(ex.Message); } return NoContent(); } } }

浙公网安备 33010602011771号