通向架构师的道路(第六天)之漫谈基于数据库的权限系统的设计(1).docx

上传人:rrsccc 文档编号:8954164 上传时间:2021-01-27 格式:DOCX 页数:19 大小:756.95KB
返回 下载 相关 举报
通向架构师的道路(第六天)之漫谈基于数据库的权限系统的设计(1).docx_第1页
第1页 / 共19页
通向架构师的道路(第六天)之漫谈基于数据库的权限系统的设计(1).docx_第2页
第2页 / 共19页
通向架构师的道路(第六天)之漫谈基于数据库的权限系统的设计(1).docx_第3页
第3页 / 共19页
通向架构师的道路(第六天)之漫谈基于数据库的权限系统的设计(1).docx_第4页
第4页 / 共19页
通向架构师的道路(第六天)之漫谈基于数据库的权限系统的设计(1).docx_第5页
第5页 / 共19页
点击查看更多>>
资源描述

《通向架构师的道路(第六天)之漫谈基于数据库的权限系统的设计(1).docx》由会员分享,可在线阅读,更多相关《通向架构师的道路(第六天)之漫谈基于数据库的权限系统的设计(1).docx(19页珍藏版)》请在三一文库上搜索。

1、in 26 cases, long-term measures to implement the rate is 77% deployed 40 couples free pre-pregnancy health checks. -Balanced development of education. I attach great importance to control fits and starts work, to ensure that school-age children to school on time, hope dream poor students go to schoo

2、l to help poor students, help students complete nine years of compulsory education. Township school-age children enrollment rate up to 100%. -Home to poverty alleviation work in order. Complete the rural minimum living standard security system and the effective connection between pro-poor developmen

3、t policies, establish the Township poor electronic records and paper file documentation work, and cooperate with the superior unit holders, such as the statistical work of the poor masses. As of now, I enjoy the low 94 families, a total of 305, 44310 rural minimum living standard security issued org

4、anization 7 operational training full-time staff with disabilities participated in the County Federation organized 15 disabled people to participate in free training in farming skills; organization of 14 patients with cataract receiving free checks, participate in the examination will now undergo su

5、rgery had been successful. -Waste management policy in place. Seriously implement the subsidy policies such as direct subsidies for grain, returning farmland to forests this year agriculture agricultural policy subsidies total 554940, of which: farmers direct subsidies for grain 389880; reforestatio

6、n subsidies 165060. -Comprehensive management of public security work steadily. Full implementation of the measures for comprehensive management of social security, increasing crackdown on all illegal and criminal activities. As of now, my alarm 30 received, 7 all kinds of disputes, mediation succes

7、sfully 6; State criminal case 3, case 7, has been investigating the 7. -Stabilisation work of letters and calls for further strengthening. Received mass petitions from 10 successful mediation, 8, investigation 1, collective skipping appeal event does not occur. Meanwhile, further strengthen publicit

8、y and mobilization work, carried out in schools, kindergartens and surrounding environment group woven fire safety and food safety 6 times, 1 traffic safety publicity and education, legal literacy, drug pictures and materials via issuing 600 and guard against cult of special publicity activities 2 a

9、ttended by 300 people, mixture of anti-evil propaganda 70. Advancing the law of six thematic activities, through the easy way, with the film projectionist the village broadcast education 44, 3600 people returning to watch. -Further development of spiritual civilization construction work. Evening lei

10、sure time, organizations in the elderly in the rural culture of Hui Xiang Hui fitness dance square, greatly enriched the lives of the masses. Use of Arbor Day, 51 labor day, May Fourth youth day festivals, organize the education campaign for the festive, educational guide people to foster patriotism

11、, socialism, collectivism and strengthen love and loyalty to the party, firmly follow the party go . Implementation of the one gang double responsibility established number one responsibility, team member management works. Five are team building. Open-minded, innovative ways to meet the actual needs

12、 of target, combining education and political education in party lecture, unified planning, unified plan, take active measures to enhance cadres quality and ability. (B) a solid foundation steadily promoting the construction of一、权限系统这一天将讲述一个基本的基于数据库的权限管理系统的设计,在这一天的课程的最后将讲述“左右值无限分类实现算法”如何来优化“系统菜单”的结构

13、而告终。今天的内容和前几天的基础框架是一样的它们都属于基础知识,在这些基础知识上还可以扩展出无数的变种与进化设计。二、先来看客户的一个需求2.1用户实际需求1.所有的用户、角色可动态配置2.所有的系统菜单的权限要求具体到“增,删,改、查、打印、导出”这样的小权限的设计3.所有的权限基于角色来进行划分和判断4.一个用户可能属于多个角色5.系统菜单也能够动态的“增、删、改、查”2.2系统权限菜单样例三、基于数据库的系统权限表设计3.1 ER(Entity Relationship)图围绕上述需求,我们可以在数据库内进行如下的表设计,下面直接给出ER图:3.2表关系详解上述设计有6张表,其中:T_U

14、ser表用于存放用户信息,此处只存放基础信息T_Role表用于存放系统角色信息T_User_Role表用于存放系统用户与角色的匹配关系T_Sys_Menu表这张就是用于存放系统菜单的表了,这张表的设计主要使用了如下的表设计技巧:注意这边的MENU_ID与MENU_PID如果这个菜单项是一级菜单,那么我们把它的MENU_PID设为0如果这个菜单是另一个菜单的子菜单,那么我们就把它的MENU_PID设为它的父菜单的MENU_ID。有了这样的结构,我们一个递归就能把这颗“树”显示出来了,是不是?此处以Oracle数据库为例,不使用递归,直接把树形结构在数据库中就造型造好(当然,还有更好的方法如:有人

15、喜欢设level或者是deep这样的字段来简化程序解析树型结构菜单,稍后我们会来讲一个根本不需要用递归的树型菜单的设计来最大程度优化设计。)显示整颗树型菜单结构的Oracle语句:SELECT*FROMT_SYS_MENUSTARTWITHMENU_PID=0CONNECTBYPRIORMENU_ID=MENU_PIDorderbyMENU_ID上述语句,已经用数据查询用句就将我们的这个“树”的层次关系理出来了,如果我们手上有一个控件叫dtree.js,那么一个循环就可以把这个树显示出来了,不是吗?来看dtree.js的应用/公式: d.add(menu_id, menu_pid, menud

16、escr, menu_url);d = new dTree(d); d.add(0,-1,菜单); d.add(1,0,报表查询,example01.html); d.add(2,1,月报,example01.html); d.add(3,1,季报,example01.html); d.add(4,1,年报,example01.html); d.add(5,0,系统管理,example01.html); d.add(6,5,用户管理,example01.html); d.add(7,6,新增用户,example01.html); d.add(8,6,删除用户,example01.html);

17、d.add(9,5,角色管理,example01.html); d.add(10,9,新增角色,example01.html); d.add(11,9,删除角色,example01.html) document.write(d);大家看上面,这个是dtree.js插件,一个专门用于生成树的js插件的使用方法,那么如果我们附以上述的sql语句在数据库中把数据选出来后,是不是只要一个循环就可以给这个dtree.js插件显示了,不是吗?我们如果不想显示整颗树只想显示如:只显示系统管理菜单有其下列所有的子菜单,那么我们的Oracle中的Sql应该怎么写呢?经查“系统管理”这个菜单的MENU_ID=10

18、5,于是我们的Sql语句如下:SELECT*FROMT_SYS_MENUSTARTWITHMENU_ID=105CONNECTBYPRIORMENU_ID=MENU_PIDorderbyMENU_ID对吧?很简单哈!T_Privilege表用于存放系统每个菜单的详细子权限如“增,删,改,查”T_Menu_Privilege表这张表就是我们的最终终结大BOSS表,它里面是一个完整的系统权限与角色关系间的对应。比如说:我们想要知道“user”这个角色,可以操作哪些菜单,哪些权限,那么我们的SQL语句如下:selectdistinctm.menu_id,m.menu_descr,m.menu_url

19、,m.menu_pid,p.privilege_id,p.privilege_typefromt_menu_privilege mp,t_sys_menu m,t_privilege p,t_user_role rwheremp.privilege_id=p.privilege_idandmp.role_id=r.role_idandmp.menu_id=m.menu_idandr.role_id=userorderbym.menu_id通过这个结果我们就知道了1.角色“user”能操作哪些菜单2.角色“user”对某个菜单具有什么样的权限进而,我们可以推出:我们想要知道Danzel这个人,可

20、以操作哪些菜单,以及在哪些菜单上有哪些可供操作的权限,我们使用如下的SQL语句:selectdistinctm.menu_id,m.menu_descr,m.menu_url,m.menu_pid,p.privilege_id,p.privilege_typefromt_menu_privilege mp,t_sys_menu m,t_privilege p,t_user_role rwheremp.privilege_id=p.privilege_idandmp.role_id=r.role_idandmp.menu_id=m.menu_idandr.user_id=Danzelorderb

21、ym.menu_id;通过这个结果我们就知道了1.Danzel这个人能操作哪些菜单2.Danzel对某个菜单具有什么样的权限3.3界面制作关于jsp,什么dao层,service层的具体代码这个就不讲了,这个没有意义的哦,我们来讲设计。登录后如何显示左边的树型菜单: 取得用户名 将该用户名作为参数input进如下的SQL语句得到该用户在登录后可以看到的系统菜单:selectdistinctm.menu_id, m.menu_descr, m.menu_url, m.menu_pidfromt_menu_privilege mp,t_sys_menu m,t_privilege p,t_user

22、_role rwheremp.privilege_id=p.privilege_idandmp.role_id=r.role_idandmp.menu_id=m.menu_idandr.user_id=DanzelSTARTWITHMENU_PID=0CONNECTBYPRIORM.MENU_ID=M.MENU_PIDorderbyM.MENU_ID将该结果直接给于index.jsp页面上的dtree.js组件,一个循环,所有菜单曾树形显示。知道用户登录后能够对哪些菜单,并且在相关界面操作时有哪些子权限如:增、删、改、查、打印、报表的设计: 在登录时得到用户名等信息,然后将该用户名作为参数in

23、put进入如下的sql语句:selectdistinctm.menu_id,m.menu_descr,m.menu_url,m.menu_pid,p.privilege_id,p.privilege_typefromt_menu_privilege mp,t_sys_menu m,t_privilege p,t_user_role rwheremp.privilege_id=p.privilege_idandmp.role_id=r.role_idandmp.menu_id=m.menu_idandr.user_id=Danzelorderbym.menu_id;得到上述结果后,使用:Hasp

24、map这样的结构将该用户所属的角色分对每个菜单有哪些操作(增、删、改、查、打印、报表)进行存储,放入用户的session中,在以后用户在每个界面进行点击动作时进行判断,或者可以写个filter来进行判断,是不是就可以作到:知道该登录用户在登录后可以对哪些菜单进行操作,并且拥有什么操作权限啦?相应的我们还需要制作如下的界面: 用户的管理界面 角色的管理界面 用户与角色的分配界面 系统菜单的管理界面 具体权限项的管理界面 系统菜单与角色间具体的权限分配界面好了,有了这些界面,一个完整的基于数据库引擎的权限系统算是完成了。严重注意:在制作“系统菜单与角色间具体的权限分配界面”时,如果在界面上把某个角

25、色对该条菜单的“查看”这个选项disable后,那么该角色将不拥有任何该菜单的所有权限,举例:某角色对菜单A拥有如下权限:增、删、改、打印但是这个“查看”权限没有,也有可能是管理员误操作,但是从真实情况我们来说,这个角色连“查看”的权限都没有,连菜单都进不了,他能做什么“增、删、改。”等其它的操作啊?操作个头啊!是吧?所以一旦界面上该角色对某个系统菜单没有了查看权限后,它对这个菜单的其它权限也必须从T_MENU_PRIVILEGE这个表中删除。四、改进T_SYSTEM_MENU表的设计前面我们用的是Oracle特有的递归SQL将树形菜单在从数据库中选取出来时就已经是一颗树的结构了,但是像MYS

26、QL,SQL SERVER, DB2等可能不带有这样的特SQL,那就需我们自己动手去写递归,还有就是很多工程用的是jquery的tree或者是其它相关的ajax tree,这些tree都需要用到一个字段叫level(此处指深度、层次的意思),如果按照原来的表结构,要取得这个level,恐怕是要写递归算法了。就算有些数据库有类似的语句,那也需要你去修改你的SQL语句从未影响了性能与通用性。我们在这边说,我们无论什么数据库,如果都用相同的SQL就能把我们需要的东西在数据库中就排好树形结构然后一次性选取出来,那应该有多好啊。答案是有的,在原来的T_SYSTEM_MENU表中改动也不大,只需要增加两个

27、字段即可,即:lft与rgt(left, right),这种设计其实已经有了,我在此只不过结合实际例子把它应用到实际上,并且进一步详细描述如果来实现它,它就是被称为:左右值无限分类实现算法也称为预排序遍历树算法,对于这种层次型数据(Hierarchical Data)一般我们有两种设计方法: 毗邻目录模式(adjacencylist model) 预排序遍历树算法(modifiedpreorder tree traversal algorithm)4.1基于lft, rgt的无限分类算法我们来看一个图,下面我们把我们原有的菜单画成下面这样的层次关系:我们把原有的系统菜单画成了一个个的椭圆,最外

28、层的就是我们的菜单,然后在每个椭园的两个端点即left与right,按照从左-右,开始用数字来标号,上面这个图中可以看到最外层这个大椭园的lft(左)为1,它的rgt(右)为24。那么我们可以用一条标准的SQL,而非什么数据库自带的特有的、特殊的SQL来显示出这个树形菜单,来看下面的SQL:SELECTnode.menu_id menuId,node.menu_descr menuDescr,node.lft,node.rgt,node.menu_url menuUrl,(COUNT(parent.menu_id)-1) menuLevel,node.menu_pid pidFROMt_sys

29、_menunode,t_sys_menuparentWHERE node.lftBETWEENparent.lftANDparent.rgtANDnode.menu_descr!=菜单GROUPBYnode.menu_id,node.menu_descr,node.lft,node.rgt,node.menu_url,node.menu_pidORDERBYnode.lft来看显示的结果看看上面这个结果,怎么样? 树形结构也有了(可以用于dtree来显示); 层次level也有了(可以用于ajax的一些tree); 我们用的SQL又是最标准的所有的数据库都能用到的SQL;尝到甜头了是吧?那我们

30、下面来看如何对这样的基于t, rgt的数据结构来作插入操作?4.2如何在现有节点中插入新的子节点如果现在我们要在“报表查询”这个圆里加入一个菜单,假设我们就叫“周报”,那么再来看这个原有的图发生了什么样的改变,来看:看到么,原有的最外层椭园的rgt+2,原有的报表查询这个园的右边界呢?是不是也加了2啊?而原有的“月报”这个圆的lft加了多少?也是+2!那么来看“周报”这个圆的lft与rgt关系:“周报”的lft= “报表查询”这个圆的lft+1“周报”的rgt=“报表查询”这个圆的lft+2于是我们就可以整理出在原有叶子中插入child的公式:第一步:选取要被插入new child的外面这个圆

31、的lft的值第二步:原有的数据中所有的rgt如果第一步中得到的lft的值,那么全部+2第三步:原有的数据中所有的lft如果第一步中得到的lft的值,那么全部+2第四步:将插入的节点的lft与rgt的设计,新节点的lft =第一步中的lft+1,新节点的rgt=第一步中的lft+2来看一个具体的例子:我们要在“报表查询”即menu_id=101 中插入一个新的菜单,叫“周报”,下面是按照上面四步算法的相关SQL语句:第一步SELECTlftFROMt_sys_menuwheremenu_id=101;这一步我们得到的值为:2第二步:UPDATEt_sys_menuSETrgt = rgt +2W

32、HERErgt 2;第三步:UPDATEt_sys_menuSETlft = lft +2WHERElft 2;第四步:INSERTINTOt_sys_menu(menu_id, menu_descr, menu_url, lft, rgt)VALUES(113,周报,周报的url, (2+1), (2+2);插完后我们运行查询SQL:SELECTnode.menu_id menuId,node.menu_descr menuDescr,node.lft,node.rgt,node.menu_url menuUrl,(COUNT(parent.menu_id)-1) menuLevel,nod

33、e.menu_pid pidFROMt_sys_menunode,t_sys_menuparentWHERE node.lftBETWEENparent.lftANDparent.rgtANDnode.menu_descr!=菜单GROUPBYnode.menu_id,node.menu_descr,node.lft,node.rgt,node.menu_url,node.menu_pidORDERBYnode.lftLook, 数据正确无误,我们来看整个t_sys_menu表里的数据:Look,整个最外层的“圆”,右边界增加了2,从原有的24变成了26。1.3 如何插入一个新的节点上面讲的是

34、在原有的节点中插入一个子节点,现在来讲,如何插入一个新的节点,比如说:我们现在有:报表查询,系统管理两大菜单,我们还想加一个菜单:保单审核,怎么来做?我们把4.2节中“如何在现有节点中插入新的子节点”里四步公式,稍稍改动一下第一步:选取要被插入新的节点左边节点的rgt的值第二步:原有的数据中所有的rgt如果第一步中得到的rgt的值,那么全部+2第三步:原有的数据中所有的lft如果第一步中得到的rgt的值,那么全部+2第四步:将插入的节点的lft与rgt的设计,新节点的lft =第一步中的rgt+1,新节点的rgt=第一步中的rgt+2下面来看我们在“报表查询”与“系统管理”中间,插入一个菜单叫

35、“保单审核”。第一步SELECTrgtFROMt_sys_menuwheremenu_id=101;这一步我们得到的值为:11第二步:UPDATEt_sys_menuSETrgt = rgt +2WHERErgt 11;第三步:UPDATEt_sys_menuSETlft = lft +2WHERElft 11;第四步:INSERTINTOt_sys_menu(menu_id, menu_descr, menu_url, lft, rgt)VALUES(114,保单审核, (11+1), (11+2);运行下面的SQL语句我们来检查一下插入的效果:SELECTnode.menu_id menu

36、Id,node.menu_descr menuDescr,node.lft,node.rgt,node.menu_url menuUrl,(COUNT(parent.menu_id)-1) menuLevel, node.menu_pid pidFROMt_sys_menunode,t_sys_menuparentWHERE node.lftBETWEENparent.lftANDparent.rgtANDnode.menu_descr!=菜单GROUPBYnode.menu_id,node.menu_descr,node.lft,node.rgt,node.menu_url,node.men

37、u_pidORDERBYnode.lft怎么样,结果对了吧,呵呵!看看整个菜单的右边界吧,从原来的26变成了28了,是不是哦?1.3 如何删除一个节点来看公式第一步:选取要被删除的菜单的lft的值,rgt的值,以及宽度(width=rgt-lft+1);第二步:删除所有的位于第一步中得到的lft与rgt之间的节点;第三步:将所有的右边界大于第一步中得到的rgt的所有节点的rgt的值减去第一步中得到的width第四步:将所有的左边界大于第一步中得到的rgt的所有节点的lft的值减去第一步中得到的width来看实际例子,我们有下面这样的数据:我们想将menu_id=114的保单审核删除,当然,这是

38、一个父节点,如果把它删了,其子节点115即手工审核也必须被一起删除,要不然它就成为脏数据了是不是?套用上述四步公式:第一步:SELECTlft, rgt, (rgt - lft +1) widthFROMt_sys_menuWHEREmenu_id =114第二步:DELETEFROMt_sys_menuWHERElftBETWEEN12AND15第三步:UPDATEt_sys_menuSETrgt = rgt -4WHERErgt 15第四部:UPDATEt_sys_menuSETlft = lft -4WHERElft 15全部步骤完成后,我们来运行检验的SQL:SELECTnode.me

39、nu_id menuId,node.menu_descr menuDescr,node.lft,node.rgt,node.menu_url menuUrl,(COUNT(parent.menu_id)-1) menuLevel, node.menu_pid pidFROMt_sys_menunode,t_sys_menuparentWHERE node.lftBETWEENparent.lftANDparent.rgtANDnode.menu_descr!=菜单GROUPBYnode.menu_id,node.menu_descr,node.lft,node.rgt,node.menu_ur

40、l,node.menu_pidORDERBYnode.lft结果正确,再来看整个“菜单”的边界,从原来的28缩减成了26了,结果正确。上述这种基于lft, rgt左右值无限分类实现算法的个菜单的好处在于: SQL语句不受特定的数据库的限制 SQL语句通用 直接从数据库中远取出来的结构化的数据即可满足需要pid的如:dtree.js这样的JS控件的需要也可以满足需要level的ajax tree控件的需要。grass-roots party organizations is focus of new party members. Further strengthening the party e

41、ducation campaign, party organization to more excellent talents absorbed, constantly enhance the partys vitality and vigor, a solid job discovery, training activists. The initiative to broaden the scope of training, at the village level organization of young cadres, wealth experts and other personne

42、l in the discovery, selection, training, and guide them to move closer to the party and injected fresh vitality to the building of rural grass-roots party organizations. Second is to further improve the site present situation of grass-roots party branches. With an emphasis on construction of village

43、-level activities, comprehensive corrosion activities of grass-roots party organization construction in various fields, with village-level party organization function setting, achieving more efficient use of venues, activities for grass-roots party organizations and party members, and create good conditions for serving the masses, by using village-level activities. Third is to conscientiously implement the village group living subsidy distribution work. In strict accordance with the pa

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1