华企号 后端开发 结合Winform控件实现字段的权限控制

结合Winform控件实现字段的权限控制

1、字段权限表的设计和界面管理

基于SqlSugar的开发框架,对应处理的业务对象信息的,是相关的实体对象信息,我们在数据库中设计两个数据库,一个用于存储对应实体类名称的信息,如ID,实体类全名,类路径等主体信息;一个存储对应角色配置的字段列表信息,结合起来就可以实现对应角色的字段权限控制了,数据库表设计信息如下所示。

两个业务表的部分字段信息如下所示。

结合Winform控件实现字段的权限控制插图

结合Winform控件实现字段的权限控制插图1

系统中对于字段权限的设置界面如下所示。

通过列表对每个实体对象信息进行配置,如果没有对应的实体,从程序集中选择列出来即可加入进来。

加入对应的实体信息,我们可以根据名称反射接口获得对应字段参考的中文信息,然后进行展示,用于加入控制列表。

 

结合Winform控件实现字段的权限控制插图2

这样配置后,系统就记录了相关的配置信息,我们接下来就可以利用这些配置信息,在Winform界面上进行控件的显示处理操作了。

 

2、在Winform界面上进行控件的显示处理操作

在界面上,我们为了绑定界面控件和字段的关系,需要设置一个Tag来标识,然后根据系统配置信息,自动进行字段权限的控制处理(隐藏、设置只读,不限制等)

复制代码
/// <summary>
/// 设置控件字段的权限显示或者隐藏(默认不使用字段权限)
/// </summary>
private async void SetPermit()
{
    #region 设置控件和字段的对应关系

    this.txtName.Tag = "Name";
    this.txtAge.Tag = "Age";

    #endregion

    //获取列表权限的列表
    var permitDict = await BLLFactory<IFieldPermitService>.Instance.GetColumnsPermit(typeof(CustomerInfo).FullName, LoginUserInfo.Id.ToInt32());
    this.SetControlPermit(permitDict, this.layoutControl1);

    await Task.CompletedTask;
}
复制代码

设置控件的字段显示方式 SetControlPermit ,代码如下所示。

复制代码
        /// <summary>
        /// 设置控件的可见、读写权限显示
        /// </summary>
        /// <param name="panel">控件对象</param>
        /// <param name="permitDict">字段和权限字典,字典值为权限控制:0可读写,1只读,2隐藏值,3不显示</param>
        /// <param name="layoutControl">如果存在布局,则使用布局控件,否则为空</param>
        public static void SetControlPermit(this Control panel, Dictionary<string, int> permitDict, LayoutControl layoutControl = null)
        {
            foreach (Control ctrl in panel.Controls)
            {
                var baseCtrl = ctrl as BaseEdit;
                if (baseCtrl != null)
                {
                    var tag = string.Concat(baseCtrl.Tag);
                    if (!string.IsNullOrEmpty(tag) && permitDict.ContainsKey(tag))
                    {
                        var permit = permitDict[tag];
                        var visible = (permit == 0 || permit == 1);//2、3不可见

                        if (layoutControl != null)
                        {
                            var layoutItem = layoutControl.GetItemByControl(baseCtrl);
                            if (layoutItem != null)
                            {
                                layoutItem.ToVisibility(visible);
                            }
                        }
                        baseCtrl.Visible = visible;
                        baseCtrl.ReadOnly = permit == 1;
                    }
                }
                ctrl.SetControlPermit(permitDict, layoutControl);
            }
        }
复制代码

上面代码主要就是变量面板中的控件,并判断tag标签,然后进行只读、不可见、正常等的判断。

在列表界面中,我们可以通过设置隐藏字符让内容隐藏,如下界面效果所示。

结合Winform控件实现字段的权限控制插图4

如果不可见,就在界面上不显示这个列了,而非隐藏。

同样类似编辑控件界面,我们在列表界面也提供了对应的方法,用于隐藏列表字段的某些信息,如下代码所示。

//获取字段显示权限,并设置(默认不使用字段权限)        
this.winGridViewPager1.gridView1.SetColumnsPermit(permitDict);

它的实现规则也是类似,根据配置的字段权限控制点信息进行处理,决定是否显示,是否隐藏,是否正常处理。

它的permitDic也是根据配置信息读取出来进行判断即可。

复制代码
//根据业务对象获取对应的显示字段,如果没有设置,那么根据FieldPermit表的配置获取字段权限列表
var permitDict = await BLLFactory<IFieldPermitService>.Instance.GetColumnsPermit(typeof(BlackIPInfo).FullName, Portal.gc.UserInfo.Id);
var displayColumns = await BLLFactory<IBlackIPService>.Instance.GetDisplayColumns();
if (permitDict != null && permitDict.Keys.Count > 0)
{
    //0可读写,1只读,2隐藏值,3不显示
    displayColumns = string.Join(",", permitDict.Keys.Where(s => permitDict[s] < 2));
}
this.winGridViewPager1.DisplayColumns = displayColumns;
复制代码

下面是具体逻辑的通用控制方法,把它作为控件的扩展函数,我们就只需要一行代码调用就是写控制了

复制代码
/// <summary>
/// 根据参数权限字典的值:0可读写,1只读,2隐藏值,3不显示,设置列的权限。
/// </summary>
/// <param name="gridView">GridView对象</param>
/// <param name="fieNamePermitDict">字段和权限字典,字典值为权限控制:0可读写,1只读,2隐藏值,3不显示</param>
public static void SetColumnsPermit(this GridView gridView, Dictionary<string,int> fieNamePermitDict)
{
    char passwordChar = '*';
    foreach (GridColumn col in gridView.Columns)
    {
        var include = fieNamePermitDict.ContainsKey(col.FieldName);
        if (include)
        {
            int permit = fieNamePermitDict[col.FieldName];
            switch (permit)
            {
                case 0://正常可见、可读写
                    col.OptionsColumn.AllowEdit = true;
                    col.OptionsColumn.ReadOnly = false;
                    col.AppearanceHeader.ForeColor = Color.Black;

                    col.Visible = true;
                    break;

                case 1:
                    //只读
                    col.OptionsColumn.AllowEdit = false;
                    col.OptionsColumn.ReadOnly = true;
                    col.AppearanceHeader.ForeColor = Color.Gray;

                    col.Visible = true;
                    break;

                case 2:
                    //隐藏值
                    var edit = col.CreateTextEdit();                            
                    col.Tag = string.Concat(passwordChar);//用来在界面端进行判断,避免设置DisplayText
                    edit.PasswordChar = passwordChar;
                    col.Visible = true;
                    break;

                case 3:
                    //不可见
                    col.Visible = false;
                    break;
            }
        }
    }            
}
复制代码

通过上面的代码处理,我们就能实现对Winform界面中的列表,编辑窗体的控件,进行相关的字段权限控制显示了。如下是实现的界面效果。

结合Winform控件实现字段的权限控制插图5

结合Winform控件实现字段的权限控制插图6

这样在系统后台,就可以根据需要设置一些敏感字段的信息隐藏或者只读处理了。

作者: 华企网通王鹏程序员

我是程序员王鹏,热爱互联网软件开发和设计,专注于大数据、数据分析、数据库、php、java、python、scala、k8s、docker等知识总结。 我的座右铭:"业精于勤荒于嬉,行成于思毁于随"
上一篇
下一篇

发表回复

联系我们

联系我们

028-84868647

在线咨询: QQ交谈

邮箱: tech@68v8.com

工作时间:周一至周五,9:00-17:30,节假日休息

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部