环境: VFP9 SP2 7423+祺佑三层开发框架(猫框)
一、过一下大脑
在上篇基于用户的权限设置中,这次我加入组的概念,把所有组的权限规划好之后,以后添加用户只需要赋于所属组就行了,不需要一个一个权限再去设置。
界面设计如下:
用户列表多加一列,Header=所属组
增加了组合框QiyuCombobox1控件
组和用户在一个表名,用一个类型字段(u_lx 逻辑型,组=.T. 用户=.F.)区别。
用户可以设置所属组,但组不可以选择所属组。
用户选择组之后,不可以再对权限列表编辑,只可查看。
二、数据表结构改动
user_pass 增加一个u_lx 逻辑型 默认0= 用户,roleid 组id 整型,默认值0(没有所属组)。
三、业务代码编写
表单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") &&设置为表缓冲
获取角色(组)列表
为方便选择,我们追加了一个空的选项
*--角色列表
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
Qiyu_combobox1组合框设置
Qiyu_combobox1组合框的Refresh事件
This.Visible=!user_pass.u_lx &&如果是组,组合框隐藏掉
Qiyu_combobox1组合框的Valid事件
*--将组合框选中的组名回写用户列表(user_pass)
Replace rolename With rolelist.rolename,roleid With rolelist.Id In user_pass
Thisform.Refresh()
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
撤消按钮Qiyu_cmdcancel1按钮click事件
Tablerevert(.T.,"user_pass")
Thisform.Oca.Undo()
Thisform.Opcode=0
Thisform.qiyu_grid_sort2.Refresh()
保存按钮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
这样就完成了从用户到组权限的升级,而前端用户获取菜单权限也非常简单,
判定用户的roleid不为空,就使用roleid加载权限,否则使用id来加载权限。
来个动图
思考题:
如果用户设置了所属组,权限列表展现这个组的权限,而不是用户的原来的权限,又该如何做呢?