以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  [求助]  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=109538)

--  作者:沪上游客
--  发布时间:2017/11/14 13:55:00
--  [求助]
老师你好!下面的代码是设置授权表,是根据用户名设置的,因为人数和表数较多,加一个人每次要增加很多行设置。现在我想有角色决定用户的表和列可见或不可见,这样我在平时工作中,只要设置人员的角色就可以了。因为角色与用户名、分组名的命令不同,请老师指教。谢谢!

项目事件LoadUserSetting中,加入如下代码:

For Each t As Table In Tables
t.Visible =
True
t.AllowEdit =
true
For Each c As Col In t.Cols
c.Visible =
True
c.AllowEdit =
True
Next

Next
Tables
("授权表").Visible = (User.Type <> UserTypeEnum.User )
If
User.Type = UserTypeEnum.User Then
For Each dr As DataRow In DataTables("授权表").Select("用户名 = \'" & User.Name & "\'" )
If
dr.IsNull("列名")
Then
Tables(dr("表名")).Visible = Not dr("不可见")
Tables
(dr("表名")).AllowEdit = Not dr("不可编辑")

Else
Tables(dr("表名")).Cols(dr("列名")).Visible = Not dr("不可见")
Tables
(dr("表名")).Cols(dr("列名")).AllowEdit = Not dr("不可编辑")
End
If
Next
End
If

上面的代码,条理清晰,原理简单,相信不用我解释,大家也能看明白。
代码是通用的,如果你需要禁止某用户编辑某个表或列,或者禁止某用户查看某个表或列,只需在授权表中加入相应的设置即可。
也就说是,需要禁止某个权限的时候,才需要在授权表加入相应的条目。
例如按照上图的设置,张三看不到表A,不能编辑表B,李四则看不到表B,不能编辑表C,至于王五,比较特殊,他看不到表A的第三列,不能编辑表A的第八列。


--  作者:沪上游客
--  发布时间:2017/11/14 13:59:00
--  

图片点击可在新窗口打开查看此主题相关图片如下:qq图片20171114135927.png
图片点击可在新窗口打开查看

我想把用户名改成角色?能一次性开发好。
[此贴子已经被作者于2017/11/14 14:01:06编辑过]

--  作者:有点甜
--  发布时间:2017/11/14 14:19:00
--  

 

For Each dr As DataRow In DataTables("授权表").Select("角色 = \'" & User.Roles & "\'" )


--  作者:有点甜
--  发布时间:2017/11/14 14:19:00
--  

设置权限,可以看这里

 

http://www.foxtable.com/bbs/dispbbs.asp?BoardID=5&ID=23959&skin=0

 


--  作者:沪上游客
--  发布时间:2017/11/18 19:17:00
--  
谢谢老师!
如果一个用户只有一个角色,能实现隐藏(不载入)表,只要用户有两上个或以上角色,就失效加载所有表。
请老师指教,有更好的办法吗?
再次感谢!

以下是我更改后的LoadUserSetting代码:
For Each t As Table In Tables
    t.Visible = True
    t.AllowEdit = True
    For Each c As Col In t.Cols
        c.Visible = True
        c.AllowEdit = True
    Next
Next
Tables("授权表").Visible = (User.Type <> UserTypeEnum.User )
If User.Type = UserTypeEnum.User Then
    For Each dr As DataRow In DataTables("授权表").Select("角色 = \'" & User.Roles & "\'" )
        If dr.IsNull("列名") Then
            Tables(dr("表名")).Visible = Not dr("不可见")
            Tables(dr("表名")).AllowEdit = Not dr("不可编缉")
        Else
            Tables(dr("表名")).Cols(dr("列名")).Visible = Not dr("不可见")
            Tables(dr("表名")).Cols(dr("列名")).AllowEdit = Not dr("不可编缉")
        End If
    Next
End If

[此贴子已经被作者于2017/11/18 19:26:47编辑过]

--  作者:沪上游客
--  发布时间:2017/11/18 19:29:00
--  
这是我的授权表

图片点击可在新窗口打开查看此主题相关图片如下:qq图片20171118192758.png
图片点击可在新窗口打开查看

另外最好能设置代码使角色列能把系统所有角色自动载入可以选择,不用输入?
如果所有表名也能这样,更好了。
谢谢!
[此贴子已经被作者于2017/11/18 19:33:36编辑过]

--  作者:有点甜
--  发布时间:2017/11/19 16:42:00
--  

1、

 

Dim filter As String = "1=2"
For Each s As String In user.Roles.split(",")
    filter &= " or 角色 = \'" & s & "\'"
Next
For Each dr As DataRow In DataTables("授权表").Select(filter)


 

2、AfterOpenProject事件

 

Dim ls As new List(Of String)
For Each u As UserInfo In users
    If u.Roles > "" Then
        For Each s As String In u.Roles.Split(",")
            If s > "" AndAlso ls.Contains(s) = False Then
                ls.Add(s)
            End If
        Next
    End If
Next
Tables("表A").cols("第一列").ComboList = String.Join("|", ls.ToArray)