提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
转帖|使用教程|编辑:龚雪|2023-08-11 10:58:09.940|阅读 105 次
概述:在Winform框架中,其中权限管理系统、字典管理系统,都是可以做成独立的程序来使用,本文主要为大家介绍其中的权限管理系统。
# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>
相关链接:
在之前的文章《Winform开发框架之字典数据管理》中介绍过Winform开发框架的总体情况,其中最重要的思路就是把常用的模块封装成控件进行重复使用,一则可以避免重复开发,提高开发效率;二则可以使用成熟的控件及技术,使得用户体验更好,更加专业,在前面介绍过的Winfrom开发框架总体思路如下所示。
在Winform框架中,其中权限管理系统、字典管理系统,都是可以做成独立的程序来使用,而且应该可以在程序中引用来查询或者获取相关的字典数据,如找某个键值的字典列表作为下拉列表,而且由于实际项目中,有的是SqlServer、有的是Access数据库的或者其他数据库,所以支持多数据库是最好的选择。
PS:给大家推荐一个C#开发可以用到的界面组件——DevExpress WinForms,它能完美构建流畅、美观且易于使用的应用程序,无论是Office风格的界面,还是分析处理大批量的业务数据,它都能轻松胜任!
DevExpress技术交流群8:523159565 欢迎一起进群讨论
本篇主要介绍经过优化完善的权限管理系统, 其既独立又具整合性的权限管理系统,既相互独立,有相互整合,方便重用,又不需重新开发,非常方便、更提高效率。 由于权限系统精简而又能满足日常绝大多数的需要,不会复杂的难于管理,而且也是基于角色的授权访问机制(RBAC),最重要是非常适合软件的整合使用。
权限管理系统作为一个独立的模块,其主要由登陆界面、权限管理主界面(管理用户、角色、机构、功能,以及控制角色的权限等操作功能,部分界面如下所示。
给用户分配权限,首先是给相应角色授权,角色授权功能如下所示,可以编辑角色使用的功能,也可以管理该角色包含的用户,从而实现间接实现给用户分配权限的功能(这也是基于业界通用的基于角色的访问控制(RBAC)的控制法则)。
经过优化后的权限管理系统,界面及业务逻辑封装到一个类库中,我们开发的业务管理系统中集成就很简单了,主要的项目工程界面如下所示:
我编写了一个测试工程,用来模拟业务系统中调用权限管理模块的例子,界面如下所示:
相关的代码很简单,这也是利用权限管理系统后简化很多代码的根本所在:
private void Form1_Load(object sender, EventArgs e) { //获取所有权限管理系统的用户,并在下拉列表中展示 List<UserInfo> userList = BLLFactory<User>.Instance.GetAll(); this.txtLogin.Items.Clear(); foreach (UserInfo info in userList) { this.txtLogin.Items.Add(info.Name); } } private void btnSecurity_Click(object sender, EventArgs e) { //独立启动权限管理系统,只需一行代码即可 WHC.Security.UI.Portal.StartLogin(); }
当然,如果要判断用户的登录及角色等,可以通过下面代码来实现。
//判断用户是否登录成功 string identity = BLLFactory<User>.Instance.VerifyUser(this.txtLogin.Text, this.txtPassword.Text, Guid.NewGuid().ToString()); if (!string.IsNullOrEmpty(identity)) { //进一步判断用户角色 if (BLLFactory<User>.Instance.UserInRole(this.txtLogin.Text, "管理员")) { MessageUtil.ShowTips(string.Format("用户【{0}】身份验证正确", this.txtLogin.Text)); } else { MessageUtil.ShowWarning("该用户没有管理员权限"); return; } } else { MessageUtil.ShowWarning("用户名或密码错误"); return; }
权限控制的精髓就是,用户登录后,通过把用户拥有的权限获取出来,放到一个功能列表中,然后在每一个窗体中,根据用户的功能列表,显示或者屏蔽对应的功能即可,获取功能列表代码如下所示:
UserInfo info = userBLL.GetUserByName(loginName); #region 获取用户的功能列表 Function functionBLL = new Function(); List<FunctionInfo> list = functionBLL.GetFunctionsByUser(info.ID, "WareMis"); if (list != null && list.Count > 0) { foreach (FunctionInfo functionInfo in list) { if (!Portal.gc.FunctionDict.ContainsKey(functionInfo.ControlID)) { Portal.gc.FunctionDict.Add(functionInfo.ControlID, functionInfo); } } } #endregion
判断的时候,放在一个函数,判断用户访问的功能是否在列表中即可,代码如下所示:
/// <summary> /// 看用户是否具有某个功能 /// </summary> /// <param name="controlID"></param> /// <returns></returns> public bool HasFunction(string controlID) { bool result = false; if (FunctionDict.ContainsKey(controlID)) { result = true; } return result; }
那么控制用户显示的界面代码如下所示:
#region KTV包间管理 if (Portal.gc.HasFunction("KTV")) { OutlookBarBand myBasicBand = new OutlookBarBand("KTV包间管理"); myBasicBand.SmallImageList = this.imageList; myBasicBand.LargeImageList = this.imageList; if (Portal.gc.HasFunction("KTV/View")) { myBasicBand.Items.Add(new OutlookBarItem("KTV包间状态视图", 0)); } if (Portal.gc.HasFunction("KTV/Setting")) { myBasicBand.Items.Add(new OutlookBarItem("KTV包间设置", 1)); } if (Portal.gc.HasFunction("KTV/Goods")) { myBasicBand.Items.Add(new OutlookBarItem("KTV商品设置", 3)); } if (Portal.gc.HasFunction("KTV/Waiter")) { myBasicBand.Items.Add(new OutlookBarItem("KTV服务生管理", 4)); } if (Portal.gc.HasFunction("KTV/BookIn")) { myBasicBand.Items.Add(new OutlookBarItem("KTV预订管理", 5)); } if (Portal.gc.HasFunction("KTV/OtherIncome")) { myBasicBand.Items.Add(new OutlookBarItem("KTV其他款项登记", 6)); } myBasicBand.Background = SystemColors.AppWorkspace; myBasicBand.TextColor = Color.White; outlookBar1.Bands.Add(myBasicBand); } #endregion
判断菜单或者功能按钮,也只需要判断某功能点是否在已有集合中即可,如下所示:
/// <summary> /// 根据权限屏蔽功能 /// </summary> private void InitAuthorizedUI() { this.tool_Report.Enabled = Portal.gc.HasFunction("Report"); this.tool_Dict.Enabled= Portal.gc.HasFunction("Dictionary"); this.tool_ItemDetail.Enabled = Portal.gc.HasFunction("ItemDetail"); this.tool_Purchase.Enabled = Portal.gc.HasFunction("Purchase"); this.tool_StockSearch.Enabled = Portal.gc.HasFunction("StockSearch"); this.tool_TakeOut.Enabled = Portal.gc.HasFunction("TakeOut"); this.menu_WareHouse.Enabled = Portal.gc.HasFunction("WareHouse"); this.menu_Dictionary.Enabled = Portal.gc.HasFunction("Dictionary"); this.menu_run_systemLog.Enabled = Portal.gc.HasFunction("LoginLog"); this.menu_Parameters.Enabled = Portal.gc.HasFunction("Parameters"); this.menu_MonthlyStatistic.Enabled = Portal.gc.HasFunction("MonthlyStatistic"); this.menu_AnnualStatistic.Enabled = Portal.gc.HasFunction("AnnualStatistic"); this.menu_ClearAll.Enabled = Portal.gc.HasFunction("ClearAllData"); this.menu_ImportItemDetail.Enabled = Portal.gc.HasFunction("ImportItemDetail"); }
至此,权限管理模块介绍已经完毕,下面给出一个调用例子Demo程序给大家参考学习,下载地址如下:
前一篇文件的字典组件模块调用例子Demo程序下载地址也一并提供下载,下载地址如下:
本文转载自:
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@pclwef.cn
文章转载自:本文探讨 SQL Server 中 NULL 和空值之间的区别,并讨论如何有效地处理它们。
Unity 是一款功能极其丰富的游戏引擎,允许开发人员将各种媒体集成到他们的项目中。但是,它缺少最令人兴奋的功能之一 - 将 Web 内容(例如 HTML、CSS 和 JavaScript)直接渲染到 3D 场景中的纹理上的能力。在本文中,我们将介绍如何使用 DotNetBrowser 在 Unity3D 中将 Web 内容渲染为纹理。
DevExpress v24.2帮助文档正式发布上线了,请按版本按需下载~
本教程将向您展示如何用MyEclipse构建一个Web项目,欢迎下载最新版IDE体验!
行业领先的界面控件开发包,帮助企业构建卓越应用!
DevExpress DXperience Subscription高性价比的企业级.NET用户界面套包,助力企业创建卓越应用!
DevExpress WinForms Subscription为Windows Forms平台创建具有影响力的业务解决方案,高性价比WinForms界面控件套包。
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@pclwef.cn
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢