在DotNetNuke中加入组织架构(二)


组织架构首先一定是树状的,这就是为什么我们要抛弃DotNetNuke原有的安全角色而重新另建一套的一个最主要的原因——当然,并不是抛弃,在之前说过,我们希望“安全角色”和“组织架构”可以各司其职,在我们的系统里面各自发挥作用而已。

  除了体现上下级关系的“部门”之外,我们还希望仍然保留一个“组”的概念。部门体现的是层级关系,而Group则是体现一种横向的关系,比如,把所有的“部门”的负责人都放到一个“组”里面,以方便选择等。简单来说,一种是体现现有实际组织机构的,另外一种则是为了实际工作方便而较为随意的。看过(一)的细心的朋友可以看得出,我把这两种关系都放在一个数据结构里面了,仅仅是通过一个简单的IsDept字段,来区分当前的架构到底是组,还是部门。组和部门可以任意嵌套,于是,有的时候,我们的组织架构看起来确实有点怪怪的:

  在部门下面放一个组如果还觉得合理的话,那么,在组下面放一个部门是什么意思呢?

  嗯,如果觉得没意思的话,那就别这么做嘛。

  不希望出现在正式的架构中的组或者部门,我们可以将之“无效”,也就是灰掉;一方面是一些组织架构,如果不希望删除(因为可能关联了数据和权限)的话可以这么做;另外一方面,我希望在工作流的流程里面可以绑定一些只有对管理员才有意义的组而对一般用户不可见,这样的话,无效的组织架构,就不用给一般的用户看到。

  总之,我只用了两张表,就完成了上述的组织架构:Department和DeptUser,这当然是受 DotNetNuke的启发——用最精简的数据结构完成最可扩展性的业务逻辑(崩溃,DotNetNuke有将近200张表、近千个存储过程,还精简?)用户表当然是使用DotNetNuke的Users表了,所以才能将数据结果做的如此精简

Code

ifnotexists(select*fromdbo.sysobjectswhereid=object_id(N'{databaseOwner}[{objectQualifier}RedStart_Department]')andOBJECTPROPERTY(id,N'IsTable')=1)
  BEGIN
    CREATETABLE{databaseOwner}[{objectQualifier}RedStart_Department]
    (
      [DeptID][int]NOTNULLIDENTITY(1,1),
      [PortalID][int]NOTNULL,
      [ParentID][int]NULL,
      [DeptName][nvarchar](50)NOTNULL,
      [DeptDescribe][nvarchar](200)NULL,
      [DeptOrder][int]NOTNULL,
      [IsValid][bit]NOTNULLDEFAULT(1),
      [IsDept][bit]NOTNULLDEFAULT(1),
      [CreateDate][datetime]NULL,
      [CreateUser][int]NULL,
    )
    ALTERTABLE{databaseOwner}[{objectQualifier}RedStart_Department]ADDCONSTRAINT[PK_{objectQualifier}RedStart_Department]PRIMARYKEYCLUSTERED ([DeptID])
    CREATENONCLUSTEREDINDEX[IX_{objectQualifier}RedStart_Department]ON{databaseOwner}[{objectQualifier}RedStart_Department]([PortalID])
    ALTERTABLE{databaseOwner}[{objectQualifier}RedStart_Department]WITHNOCHECKADDCONSTRAINT[FK_{objectQualifier}RedStart_Department_{objectQualifier}Portals]FOREIGNKEY([PortalID])REFERENCES{databaseOwner}[{objectQualifier}Portals]([PortalID])ONDELETECASCADENOTFORREPLICATION
  END
GO
ifnotexists(select*fromdbo.sysobjectswhereid=object_id(N'{databaseOwner}[{objectQualifier}RedStart_DeptUser]')andOBJECTPROPERTY(id,N'IsTable')=1)
  BEGIN
    CREATETABLE{databaseOwner}[{objectQualifier}RedStart_DeptUser]
    (
      [DeptID][int]NOTNULL,
      [UserID][int]NOTNULL,
      [UserPrio][int]NOTNULL,
      [IsLead][bit]NOTNULLDEFAULT(0),
      [IsValid][bit]NOTNULLDEFAULT(1)
    )
    ALTERTABLE{databaseOwner}[{objectQualifier}RedStart_DeptUser]ADDCONSTRAINT[PK_{objectQualifier}RedStart_DeptUser]PRIMARYKEYCLUSTERED ([DeptID],[UserID])
    ALTERTABLE{databaseOwner}[{objectQualifier}RedStart_DeptUser]WITHNOCHECKADDCONSTRAINT[FK_{objectQualifier}RedStart_DeptUser_{objectQualifier}RedStart_Department]FOREIGNKEY([DeptID])REFERENCES[{objectQualifier}RedStart_Department]([DeptID])ONDELETECASCADENOTFORREPLICATION
    ALTERTABLE{databaseOwner}[{objectQualifier}RedStart_DeptUser]WITHNOCHECKADDCONSTRAINT[FK_{objectQualifier}RedStart_DeptUser_{objectQualifier}Users]FOREIGNKEY([UserID])REFERENCES[{objectQualifier}Users]([UserID])ONDELETECASCADENOTFORREPLICATION
  END


  有了数据结构和概念之后,剩下的事情就是将之编码出来的过程了,这个相对来说比较简单一点,我们略过



相关阅读:
SQLServer ntile获取每组前10%的数据
jquery之Document元素选择器篇
Windows Vista下系统评分无法完成的问题
我的mysql授课大纲,希望对大家有用
[.net] 操纵自如-页面内的配合与通信
一个简单的网上书城的例子(八)
JQuery 表单中textarea字数限制实现代码
DEDECMS网站首页随意调用栏目的代码
SQL注入漏洞全接触--高级篇(一)
Javascript 浅拷贝、深拷贝的实现代码
CSS图片翻转菜单
ASP.NET DataGrid的多行提交
Windows Server 2008添加Hyper-V组件
JavaScript延时效果比较不错的
快速导航

Copyright © 2016 phpStudy |