# 菜单权限-角色(组)模式设置表单

一、过一下大脑 在上篇基于用户的权限设置中,这次我加入组的概念,把所有组的权限规划好之后,以后添加用户只需要赋于所属组就行了,不需要一个一个权限再去设置。

界面设计如下: 用户列表多加一列,Header=所属组 增加了组合框QiyuCombobox1控件 组和用户在一个表名,用一个类型字段(u_lx 逻辑型,组=.T. 用户=.F.)区别。 用户可以设置所属组,但组不可以选择所属组。 用户选择组之后,不可以再对权限列表编辑,只可查看。 微信截图_20210303104935.png 二、数据表结构改动 user_pass 增加一个u_lx 逻辑型 默认0= 用户,roleid 组id 整型,默认值0(没有所属组)。 微信截图_20210303105638.png 三、业务代码编写 表单Load事件 在原有的代码上做一点变动 利用自联接查询,获取用户和组展现, 修改user_pass的查询语句如下,增加缓冲表设置

Set Multilocks On
*--用户列表
TEXT TO lcSQLCmd noshow
select a1.u_name,isnull(b1.u_name,'') rolename,a1.roleid,a1.id,u_lx
 from user_pass a1 left join
(select id,u_name from user_pass where u_lx=1) b1
 on a1.roleid=b1.id
ENDTEXT

oDBSQLhelper=Newobject("MSSQLHelper","MSSQLHelper.prg")
If oDBSQLhelper.SQLQuery(lcSQLCmd,"user_pass")<0
	Messagebox(oDBSQLhelper.errmsg)
	Return .F.
Endif
CursorSetProp("Buffering",5,"user_pass")  &&设置为表缓冲
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

获取角色(组)列表 为方便选择,我们追加了一个空的选项

*--角色列表
TEXT TO lcSQLCmd NOSHOW textm
SELECT 0 id,'' rolename
union all
SELECT id,u_name rolename FROM user_pass WHERE u_lx=1
ENDTEXT
If oDBSQLhelper.SQLQuery(lcSQLCmd,"rolelist")<0
	Messagebox(oDBSQLhelper.errmsg)
	Return .F.
Endif
1
2
3
4
5
6
7
8
9
10

Qiyu_combobox1组合框设置 微信截图_20210303111436.png Qiyu_combobox1组合框的Refresh事件

This.Visible=!user_pass.u_lx  &&如果是组,组合框隐藏掉
1

Qiyu_combobox1组合框的Valid事件

*--将组合框选中的组名回写用户列表(user_pass)
Replace rolename With rolelist.rolename,roleid With rolelist.Id In user_pass
Thisform.Refresh()
1
2
3

Qiyu_grid_sort2权限列表的refresh事件

*--用户没有所属组,可以编辑权限列表,否则只读
If user_pass.roleid==0 
	If Inlist(Thisform.Opcode,1,2)
		This.ReadOnly=.F.
		This.column3.Enabled=.T.
	Else
		This.ReadOnly=.T.
		This.column3.Enabled=.F.
	Endif
ELSE 
   This.ReadOnly=.T.  
   This.column3.Enabled=.F.
Endif
1
2
3
4
5
6
7
8
9
10
11
12
13

撤消按钮Qiyu_cmdcancel1按钮click事件

Tablerevert(.T.,"user_pass")
Thisform.Oca.Undo()
Thisform.Opcode=0
Thisform.qiyu_grid_sort2.Refresh()
1
2
3
4

保存按钮Qiyu_cmdsave1按钮click事件,增加了更新用户表(user_pass)的roleid字段

Tableupdate(1,.T.,"user_pass") &&保存缓冲表
*--与dal_ca共享链接
oDBSQLhelper=Newobject("MSSQLHelper","MSSQLHelper.prg","",Thisform.Oca.Datasource)
TEXT TO lcSQLCmd NOSHOW TEXTMERGE
UPDATE user_pass SET roleid = ?user_pass.roleid WHERE id=?user_pass.id
ENDTEXT

If oDBSQLhelper.ExecuteSQL(lcSQLCmd)<0
	Messagebox(Thisform.Oca.msg)  &&显示错误信息
	Return
Endif
1
2
3
4
5
6
7
8
9
10
11

这样就完成了从用户到组权限的升级,而前端用户获取菜单权限也非常简单, 判定用户的roleid不为空,就使用roleid加载权限,否则使用id来加载权限。 来个动图 GIF.gif 思考题: 如果用户设置了所属组,权限列表展现这个组的权限,而不是用户的原来的权限,又该如何做呢?