# 功能权限开发

前面讲了菜单权限,现在来做一个功能权限开发。 一、数据库设计 首先来看权限表的设计:增加了 新增,修改,删除,打印权限(默认为0,无权限) 微信截图_20210304105933.png 二、权限控制界面 微信截图_20210304110302.png 所有的逻辑代码都可以不用动 只需要把DAL_RoleRight的SetupCA方法修改如下,可以利用生成器,也可以手工更改一下。 如果不用菜单名(DESCRIPTION)来查找权限而是用right_id,select 语句还可以再简单一点。

    PROCEDURE setupCA
    	Text to This.SelectCmd noshow
		select MODULE,DESCRIPTION,ENABLED,ALLOWNEW,ALLOWDEL,ALLOWEDIT,ALLOWPRT,roleright.ID from roleright inner join  rights on roleright.right_id=rights.id
        where userid=?this.uid
		EndText
		Text to This.CursorSchema noshow
		 MOdule  C(50) , DEscription C(50) , ENabled  L(1) , ALlownew L(1) , ALlowdel L(1) , ALlowedit L(1) , ALlowprt L(1) , ID   I(4) 
		EndText
		Text to This.UpdatableFieldList noshow
		ID,ENABLED,ALLOWNEW,ALLOWDEL,ALLOWEDIT,ALLOWPRT 
		EndText
		Text to This.UpdateNameList noshow
		MODULE roleright.MODULE,DESCRIPTION roleright.DESCRIPTION,ENABLED roleright.ENABLED,ALLOWNEW roleright.ALLOWNEW,ALLOWDEL roleright.ALLOWDEL,ALLOWEDIT roleright.ALLOWEDIT,ALLOWPRT roleright.ALLOWPRT,ID roleright.ID
		EndText
    ENDPROC 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

三、前台操作界面 创建框架表单,拖入框架自响应控件。刷新权限按钮为普通控件。 微信截图_20210304111146.png 在框架的开发中实际上是先把所有功能开发完毕,最后一步再开发权限。而权限的开发也非常简单,附加权限类就自动拥有了权限。

实现采购入库权限类(保存为Right_CGRKD.prg)

*-- 实现一个权限子类
Define Class Right_CGRKD As Qiyu_RightManager Of Locfile("Qiyu_RightManager.prg")	
	Userid=0  &&用户id
	Description=""   &&功能名称
	*-- DO开头为勾子方法(框架约定不得直接调用)
	*-- 取得实际权限 用于UI与BLL类,写入状态标志
	Procedure DoGetRightStatus
		Lparameters oUIBLL		
		Local lcSQLCmd

		TEXT TO lcSQLCmd NOSHOW TEXTMERGE PRETEXT 1+2
	    select * from roleright  inner join Rights
	    on RoleRight.right_id=Rights.id
	    WHERE userid=<<this.userid>> and description='<<this.description>>'
		ENDTEXT

		If This.oDbSQLhelper.SQLQuery(lcSQLCmd,"RightStatus")>0
			oUIBLL.isadd=RightStatus.allownew
			oUIBLL.isedit=RightStatus.allowedit
			oUIBLL.isDel=RightStatus.AllowDel
			oUIBLL.isprint=RightStatus.allowprt
		Else
			oUIBLL.isadd=.F.
			oUIBLL.isedit=.F.
			oUIBLL.isDel=.F.
			oUIBLL.isprint=.F.
		Endif     
	Endproc
Enddefine

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

采购入库单表单的Load事件

Thisform.oRight=Newobject("right_cgrkd","right_cgrkd.prg")
Thisform.oRight.Userid=1  &&假设是用户id=1登录
Thisform.oRight.Description="采购入库单"  &&取采购入库单权限
Thisform.oRight.SetRightStatus(This)
1
2
3
4

实际上权限就加载成功了,为方便演示,我加了一个按钮,click方法如下:

Thisform.oRight.SetRightStatus(Thisform) &&重新设置权限
1

最后,我们来看动图。 功能权限.gif