权限设计(2)
二、模块记录的可视权限。通俗的讲哪些记录你能看,哪些记录你不能看,说起来简单,做起来不简单。
先从一个简单的需求说起。对于前面搭建的销售系统如果由一个内勤来处理所有的合同,那么就没有权限设计的问题,把内勤的部门加在“销售部”就可以看到销售一、二、三部的所有合同。但是如果每个销售部有单独的内勤来处理自己部门的销售订单,并且互不干扰,就要设计记录的可视权限了。现在系统里内置了部门的权限。例子中的部门结构如下:
| 部门编码 |
部门名称 |
操作所有记录 |
操作本级 |
其他 |
| 00 |
公司 |
|
|
|
| 0001 |
办公室 |
true |
|
|
| 0002 |
财务部 |
true |
|
|
| 0010 |
销售部 |
|
|
|
| 001001 |
销售一部 |
|
true |
|
| 001002 |
销售二部 |
|
|
|
| 001003 |
销售三部 |
|
|
|
在上面的结构中,操作员根据其所属部门来设置其记录可视权限。00部门下的人可以查看所有数据,0001,0002,由于设置了 操作所有记录 的选项,这二个部门的人也可以查看所有记录。0010可以查看001001,001002,001003的所有数据,而001002,001003只能查看自己部门下面的数据。001001设置了一个操作本级的值,表示他可以查看到0010的权限,也就和本级平级的数据都可以看到。
对应权限设置,其实就是将条件加进sql的过程。对于业务员,我们来看一下查找销售二部的业务员的sql
select
_t6020.tf_salesmanId as tf_salesmanId ,
_t6020.tf_name as tf_name ,
_t6020.tf_sex as tf_sex ,
_t6020.tf_birthday as tf_birthday ,
_t6020.tf_age as tf_age ,
_t6020.tf_telnumber as tf_telnumber ,
_t6020.tf_phonenumber as tf_phonenumber ,
_t6020.tf_eMail as tf_eMail ,
_t6020.tf_remark as tf_remark ,
_t9011.tf_departmentId as _t9011___tf_departmentId ,
_t9011.tf_name as _t9011___tf_name
from
Salesman _t6020
left outer join
_Department _t9011
on _t9011.tf_departmentId = _t6020.tf_departmentId
where
(
(
_t9011.tf_departmentId like '001020%'
)
)
查找业务二部的所有订单的sql
select
_t6040.tf_ordersId as tf_ordersId ,
_t6040.tf_ordersNumber as tf_ordersNumber ,
_t6040.tf_date as tf_date ,
_t6040.tf_finished as tf_finished ,
_t6040.tf_remark as tf_remark ,
_t6010.tf_customerId as _t6010___tf_customerId ,
_t6010.tf_name as _t6010___tf_name ,
_t6020.tf_salesmanId as _t6020___tf_salesmanId ,
_t6020.tf_name as _t6020___tf_name ,
_t9011.tf_departmentId as _t9011___tf_departmentId ,
_t9011.tf_name as _t9011___tf_name ,
from
Orders _t6040 //订单
left outer join
Salesman _t6020 //业务员
on _t6020.tf_salesmanId = _t6040.tf_salesmanId
left outer join
_Department _t9011 //部门
on _t9011.tf_departmentId = _t6020.tf_departmentId
where
_t9011.tf_departmentId like '001020%'
可以看到所有部门的子模块,不管离部门有多远,在查找数据的时候,都必须一级级的关联,最终关联到部门,并加入部门的限定条件值。对于系统结构图,可以看到的是部门的子模块有:业务员、订单、订单明细、订单收款。
不止是上面直接取得各子模块数据的时候要加入部门的限定值,在这些模块的字段作为聚合字段计数或求和时也要限定部门的值,所有的部门及其子模块作为导航值统计记录数的时候也都要加入部门的限定值。总之一句话,销售二部的人看到的和统计到的都是他部门的数据。而不管这个模块和部门的距离有多少级。如果你的系统设计到了层次10级以上,可能会考虑效率问题,但这个应该不是你应该考虑的,这是Z http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcmFjbGWjrHN5YmFzZaOsbWljcm9zb2Z0uavLvtOmuMO/vMLHtcTBy6GjPC9ibG9ja3F1b3RlPgo8YmxvY2txdW90ZT621NPa09C31rLjveG5ubXExKO/6aOsxuR3aGVyZdfTvuTKx8/zyc/D5rXE1eLR+bzTyOu1xDxwcmUgY2xhc3M9"brush:java;">where _t9011.tf_departmentId like '001020%'
这个还得优化一下,因为是最末一级了,可以使用
_t9011.tf_departmentId = '001020'
而如果是 0010权限,才用
_t9011.tf_departmentId like '0010%'
这是单个一个部门的权限,当然也可以设计成这样的权限
_t9011.tf_departmentId like '001020%' or _t9011.tf_departmentId like '001030%'
这个操作员就可以查看销售二部和销售三部的所有数据。
以上就是单个模块设计记录权限的方法。现在引申一下,可以对任何一个模块的记录加上这个限定的权限,比如说有个统计专员,专门统计“金牌客户”的订单,我们就可以在 “客户等级”这个模块上加一个权限,然后将此权限赋予此统计专员,其就只能看到金牌客户的所有数据,而其他数据就看不到了。
如果有一个行业订单分析师,那么就在行业模块上加上权限,可以选择一个行业,或几个行业,使此行业分析师只能看到这些行业下面的所有客户和所有订单。
以上这些权限是可以叠加的:比如说销售二部有一个金牌分析师,那么在查客户单位的时候是限定金牌单位,查业务员的时候限定销售二部,在查销售订单的时候要同时满意是销售二部的金牌客户的订单。
这些权限的设计也都是全部在前台设计好后立即