功能权限

 

 

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();
        }
    }
}

 

posted @ 2019-02-16 16:35  wjl910  阅读(264)  评论(0)    收藏  举报