从零开始编写自己的C#框架(19)——Web层后端权限模块

简介:

不知不觉本系统写了快三个月了,最近写页面的具体功能时感觉到有点吃力,很多地方如果张嘴来讲的话可以说得很细,很全面,可写成文字的话,就不太会写了,有些地方想讲得清晰的话,得用多几倍的文字+实例+变化中的图片才能表达得清楚,而写这些又太费时间了,近段时间又特忙,所以只能是尽力而为,希望大家自行研究,如果有什么地方不明白的,发发评论或邮件给我,我再重新详细讲解。

 

  说回正题,对于页面访问权限以及每个按键的权限控制,很久以前用过好几种不同的方法,比如为每个控件分配名称或编码,然后在写代码时绑定这些值,又比如用XML来配置制权限等方法。这些方法都比较麻烦,而且由于都是使用编码方法,开发时需要一个个进行绑定,容易出错。经过后来不断的完善,最后完成了本系统所采用的页面控件注册管理来绑定控件权限(如有雷同,纯属巧合,哈哈...),首先创建菜单,并绑定好对应的文件(页面),然后将系统要用到的名称添加到公用标识库中,跟着在页面控件权限管理页面对各个页面控件进行绑定(只需要点击鼠标即可),通过职位(角色)来赋于不同的操作权限,只需要设置好管理员的职位,那么该管理员就拥有他所绑定的角色的全部权限了。

  如下面的说明

  首先在后端注册菜单(菜单绑定页面)

 

  创建公用页面权限标识,待用

  为需要绑定页面控件权限的菜单页面绑定操作控件(左列为上图录入的公共控件名称,右列为已绑定的页面控件,只需要点击鼠标就可以轻松绑定)

   创建好部门

  在不同部门创建相应的职位(角色)

  为不同角色设置菜单与页面控件操作权限

 

  开发说明:(主要讲讲与上一章中不同的内容)

  1、PagePowerSignPublicList.aspx.cs 公用页面控件权限标识列表管理文件

  这个页面是比较经典的普通列表页面,比较代码,有以下一些地方和菜单页面不一样的

复制代码
 1         #region 加载数据
 2         /// <summary>读取数据</summary>
 3         public override void LoadData()
 4         {
 5             //设置排序
 6             if (sortList == null)
 7             {
 8                 Sort(null);
 9             }
10 
11             //绑定Grid表格
12             bll.BindGrid(Grid1, Grid1.PageIndex + 1, Grid1.PageSize, null, sortList);
13         }
14 
15         #endregion
复制代码

  对于排序函数的调用,菜单页面是有层次感列表,所以要自定义排序函数,而对于正常的列表,我们直接调用父类的Sort(null)函数即可

  绑定Grid表格也与菜单页面调用的不一样,bll.BindGrid()函数使用的是参数中需要添加当前在第几页,每个页面显示多少行,null是条件参数,后面会详细解释它怎么使用,最后一个参数是排序规则参数

  另外,Delete()删除函数也使用批量删除功能,不过会在删除前进行检查,发现指定记录不能删除时,则弹出提示是那个Id的记录无法删除,大家自行比较一下两个列表文件就明白了。

 

  2、PagePowerSignPublicEdit.aspx.cs公用页面控件权限标识编辑文件

  这个文件要注意的地方是Save()函数

  View Code

  在函数中,大家可以找到下面这些代码

复制代码
 1   //定义是否更新标识——即当前记录的名称是否改变了
 2   bool isUpdate = false;
 3 
 4   //判断是否有改变名称
 5   if (id > 0 && (sName != model.CName || sEname != model.EName))
 6   {
 7     isUpdate = true;
 8   }
 9 
10   //判断是否需要同步更新关联表字段
11   if (isUpdate)
12   {
13     //调用更新函数,同步更新对应的所有记录
14     PagePowerSignBll.GetInstence().UpdateValue_For_PagePowerSignPublic_Id(this, model.Id, PagePowerSignTable.CName, model.CName, PagePowerSignTable.EName, model.EName);
15   }
复制代码

  这是用于我们修改A表记录的名称时,同步修改其他关联表引用了这个记录名称字段的所有记录

  为什么要这么处理呢?大家在看数据字典的数据库结构时,会发现很多表与其他表关联时,不单将其他表的Id引用了过来,还将这个Id对应的名称也引用了,这种操作方式使我们在编写查询语句时,几乎可以做到不用多表关联,因为我们想要显示的内容已经在查询的表中存在了,这样处理后,我们在修改相关表的名称时,就必须同步修改关联表中的名称,对于这些关联表名称的修改,我们的T4模板也生成了相应的函数,如:UpdateValue_For_表名_Id()函数,然后直接按上面代码编写方法实现就可以了。

 

  3、UseLogList.aspx.cs用户操作日志管理文件

  这个文件要注意的是InquiryCondition()函数

复制代码
 1         /// <summary>
 2         /// 查询条件
 3         /// </summary>
 4         /// <returns></returns>
 5         private List<ConditionHelper.SqlqueryCondition> InquiryCondition()
 6         {
 7             var wheres = new List<ConditionHelper.SqlqueryCondition>();
 8 
 9             //如果Id有值时,即表示查询的是指定管理员的操作日志
10             if (_id != 0)
11             {
12                 wheres.Add(new ConditionHelper.SqlqueryCondition(ConstraintType.Where, LoginLogTable.Manager_Id, Comparison.Equals, _id));
13             }
14 
15             //起始时间
16             if (!string.IsNullOrEmpty(dpStart.Text.Trim()))
17             {
18                 wheres.Add(new ConditionHelper.SqlqueryCondition(ConstraintType.And, LoginLogTable.AddDate, Comparison.GreaterOrEquals, StringHelper.FilterSql(dpStart.Text)));
19                 //终止时间
20                 if (!string.IsNullOrEmpty(dpEnd.Text.Trim()))
21                 {
22                     wheres.Add(new ConditionHelper.SqlqueryCondition(ConstraintType.And, LoginLogTable.AddDate, Comparison.LessOrEquals, StringHelper.FilterSql(dpEnd.Text)));
23                 }
24             }
25 
26             //ip地址
27             if (!string.IsNullOrEmpty(txtIp.Text.Trim()))
28             {
29                 wheres.Add(new ConditionHelper.SqlqueryCondition(ConstraintType.And, LoginLogTable.Ip, Comparison.Equals, StringHelper.FilterSql(txtIp.Text)));
30             }
31             //登录备注信息
32             if (!string.IsNullOrEmpty(txtloginfo.Text.Trim()))
33             {
34                 wheres.Add(new ConditionHelper.SqlqueryCondition(ConstraintType.And, LoginLogTable.Notes, Comparison.Like, "%" + StringHelper.FilterSql(txtloginfo.Text) + "%"));
35             }
36 
37             return wheres;
38         }
复制代码

 

  这是查询条件函数,ConditionHelper.SqlqueryCondition这个类是自定义封装条件类

  它的构造函数(public SqlqueryCondition(ConstraintType ctype, string columnname, Comparison cparsion, object value, bool isParentheses = false))一共有5个参数,其中4个为必填参数

  第一个参数ConstraintType ctype为查询的类型,主要是ConstraintType.Where、ConstraintType.And、ConstraintType.Or三种。

    如果有多个条件时,ConstraintType.Where只能放在最前面,且只能有一个条件使用这个参数,一般都很少用它。

    ConstraintType.And指的是当前参数与前面参数的关系是And关系

    ConstraintType.Or通常情况下指的是当前参数与前面参数的关系是Or关系

   第二个参数string columnname是条件列字段名称

  第三个参数Comparison cparsion是表达式,使用Comparison.X来设置,根据需求设置==、>、>=、<、<=、like、in、not in......

  第四个参数object value是条件值,如果是in与not in表达式时,条件值必须为数据类型,比如:string[]、int[]、object[]等

  第五个参数bool isParentheses是加左括号,而右括号使用new ConditionHelper.SqlqueryCondition()或new ConditionHelper.SqlqueryCondition(Comparison.CloseParentheses)来添加,然后in或not in表达式时,必须紧跟着右括号

 

  例子1:

  (A<2 Or A>= 10) And B=100

复制代码
1   var wheres = new List<ConditionHelper.SqlqueryCondition>();
2 
3   wheres.Add(new ConditionHelper.SqlqueryCondition(ConstraintType.Where, "A", Comparison.LessThan, 2, true));
4 
5   wheres.Add(new ConditionHelper.SqlqueryCondition(ConstraintType.Or, "A", Comparison.GreaterOrEquals, 10));
6 
7   wheres.Add(new ConditionHelper.SqlqueryCondition());
8 
9   wheres.Add(new ConditionHelper.SqlqueryCondition(ConstraintType.And, "B", Comparison.Equals, 100));
复制代码

  例子2:

  A == 2 And B in arr And C like 'abc%' (in查询必须加左右括号)

复制代码
1   var wheres = new List<ConditionHelper.SqlqueryCondition>();
2 
3   wheres.Add(new ConditionHelper.SqlqueryCondition(ConstraintType.Where, "A", Comparison.Equals, 2));
4   //加左括号
5   wheres.Add(new ConditionHelper.SqlqueryCondition(ConstraintType.And, "B", Comparison.In, arr, true));
6   //加右括号
7   wheres.Add(new ConditionHelper.SqlqueryCondition());
8 
9   wheres.Add(new ConditionHelper.SqlqueryCondition(ConstraintType.And, "C", Comparison.Like, "abc%"));
复制代码

   这个封装类最终会生成SubSonic3.0底层调用的条件参数,经过测试发现,SubSonic3.0底层调用的条件参数只支持单括号,不支持括号的嵌套,多重嵌套后最终生成的也只是单括号且会出错,所以多重嵌套括号时,最好使用其它方法来实现,比如Linq、存储过程、SQL语句拼接等。

 

  4、小结

  本次更新的代码功能比如多,已将部门、职位、公用页面控件权限标识、页面控件权限管理、在线用户列表、用户登陆日志、用户操作日志、错误日志等功能都已完成了,同时也对在线用户相关类和函数进行了优化处理。

  内容看起来好像挺多了,其实都是对之前所写的模板函数以及其他公共函数的调用,这么多页面查看cs代码时可以发现,里面的内容都差不多,都是很格式化的东西,如果你尝试过用这些已完成的模板页面添加新功能,就可以发现很简单,开发也很迅速。

  至于每个页面如何去实现,接下来就不必再像之前那样讲得很细致了,会针对一些特殊功能或函数的调用进行解说,往细讲也只能从逻辑层的各个函数应用来说起,所以就不再罗嗦一一细说,代码中有大量的注释,大家慢慢研究吧。

 

  最好附上几张页面的效果图

 





    本文转自 AllEmpty 博客园博客,原文链接:http://www.cnblogs.com/EmptyFS/p/3799824.html,如需转载请自行联系原作者




相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
7天前
|
中间件 Go API
【Go 语言专栏】Go 语言中的 Web 框架比较与选择
【4月更文挑战第30天】本文对比了Go语言中的四个常见Web框架:功能全面的Beego、轻量级高性能的Gin、简洁高效的Echo,以及各自的性能、功能特性、社区支持。选择框架时需考虑项目需求、性能要求、团队经验和社区生态。开发者应根据具体情况进行权衡,以找到最适合的框架。
|
7天前
|
机器学习/深度学习 前端开发 数据可视化
数据分析web可视化神器---streamlit框架,无需懂前端也能搭建出精美的web网站页面
数据分析web可视化神器---streamlit框架,无需懂前端也能搭建出精美的web网站页面
|
7天前
|
开发框架 前端开发 JavaScript
学会Web UI框架--Bootstrap,快速搭建出漂亮的前端界面
学会Web UI框架--Bootstrap,快速搭建出漂亮的前端界面
|
7天前
|
缓存 前端开发 安全
Python web框架fastapi中间件的使用,CORS跨域详解
Python web框架fastapi中间件的使用,CORS跨域详解
|
7天前
|
API 数据库 Python
Python web框架fastapi数据库操作ORM(二)增删改查逻辑实现方法
Python web框架fastapi数据库操作ORM(二)增删改查逻辑实现方法
|
16天前
|
开发框架 前端开发 .NET
C#编程与Web开发
【4月更文挑战第21天】本文探讨了C#在Web开发中的应用,包括使用ASP.NET框架、MVC模式、Web API和Entity Framework。C#作为.NET框架的主要语言,结合这些工具,能创建动态、高效的Web应用。实际案例涉及企业级应用、电子商务和社交媒体平台。尽管面临竞争和挑战,但C#在Web开发领域的前景将持续拓展。
|
5天前
|
关系型数据库 MySQL
web简易开发(二){html5+php实现文件上传及通过关键字搜索已上传图片)}
web简易开发(二){html5+php实现文件上传及通过关键字搜索已上传图片)}
|
2天前
|
安全 测试技术 PHP
掌握现代Web开发:PHP 8的新特性与最佳实践
【5月更文挑战第5天】 在当今快速发展的网络世界中,PHP作为一种流行的服务器端脚本语言,持续地演化着。最新的PHP 8版本引入了一系列令人兴奋的新特性和性能改进,为开发者提供了更加强大和灵活的工具。本文将深入探讨PHP 8中的新特性,包括联合类型、名称参数、匹配表达式等,并分享一些最佳实践,帮助开发者提高代码质量,优化性能,并确保安全性。通过这些实用技巧和示例,您将能够构建更高效、更安全的PHP应用程序。
|
6天前
|
开发框架 JavaScript 前端开发
【JavaScript 与 TypeScript 技术专栏】TypeScript 在 Web 开发中的前沿应用
【4月更文挑战第30天】TypeScript在Web开发中日益重要,以其强大的类型系统提升代码质量,支持组件化开发,与React、Vue、Angular等框架良好集成。在大型项目管理中,TypeScript助于代码组织和优化,提高团队协作效率。此外,它提升开发体验,提供智能提示和错误检测。众多成功案例证明其前沿应用,未来将在Web开发领域持续发挥关键作用。
|
8天前
|
前端开发 JavaScript 测试技术
【PHP开发专栏】PHP Web开发基础与流程
【4月更文挑战第29天】本文介绍了PHP Web开发的基础和流程,帮助初学者入门。内容包括Web服务器与PHP解释器的工作原理、HTML/CSS/JavaScript基础知识、PHP语法与数据库操作。开发流程涵盖项目规划、环境搭建、数据库设计、代码编写、测试与调试,以及部署与维护。此外,文中还强调了使用框架、代码组织、安全性及性能优化等进阶知识和最佳实践,旨在培养优秀PHP开发者。