在DotNetNuke中加入组织架构(二)
组织架构首先一定是树状的,这就是为什么我们要抛弃DotNetNuke原有的安全角色而重新另建一套的一个最主要的原因——当然,并不是抛弃,在之前说过,我们希望“安全角色”和“组织架构”可以各司其职,在我们的系统里面各自发挥作用而已。
除了体现上下级关系的“部门”之外,我们还希望仍然保留一个“组”的概念。部门体现的是层级关系,而Group则是体 现一种横向的关系,比如,把所有的“部门”的负责人都放到一个“组”里面,以方便选择等。简单来说,一种是体现现有实际组织机构的,另外一种则是为了实际 工作方便而较为随意的。看过(一)的细心的朋友可以看得出,我把这两种关系都放在一个数据结构里面了,仅仅是通过一个简单的IsDept字段,来区分当前 的架构到底是组,还是部门。组和部门可以任意嵌套,于是,有的时候,我们的组织架构看起来确实有点怪怪的:
在部门下面放一个组如果还觉得合理的话,那么,在组下面放一个部门是什么意思呢?
嗯,如果觉得没意思的话,那就别这么做嘛。
不希望出现在正式的架构中的组或者部门,我们可以将之“无效”,也就是灰掉;一方面是一些组织架构,如果不希望删除 (因为可能关联了数据和权限)的话可以这么做;另外一方面,我希望在工作流的流程里面可以绑定一些只有对管理员才有意义的组而对一般用户不可见,这样的 话,无效的组织架构,就不用给一般的用户看到。
总之,我只用了两张表,就完成了上述的组织架构:Department和DeptUser,这当然是受 DotNetNuke的启发——用最精简的数据结构完成最可扩展性的业务逻辑(崩溃,DotNetNuke有将近200张表、近千个存储过程,还精简?) 用户表当然是使用DotNetNuke的Users表了,所以才能将数据结果做的如此精简。
if not exists (select * from dbo.sysobjects where id = object_id(N'{databaseOwner}[{objectQualifier}RedStart_Department]') and OBJECTPROPERTY(id, N'IsTable') = 1)
BEGIN
CREATE TABLE {databaseOwner}[{objectQualifier}RedStart_Department]
(
[DeptID] [int] NOT NULL IDENTITY(1, 1),
[PortalID] [int] NOT NULL,
[ParentID] [int] NULL,
[DeptName] [nvarchar] (50) NOT NULL,
[DeptDescribe] [nvarchar] (200) NULL,
[DeptOrder] [int] NOT NULL,
[IsValid] [bit] NOT NULL DEFAULT(1),
[IsDept] [bit] NOT NULL DEFAULT(1),
[CreateDate] [datetime] NULL ,
[CreateUser] [int] NULL ,
)
ALTER TABLE {databaseOwner}[{objectQualifier}RedStart_Department] ADD CONSTRAINT [PK_{objectQualifier}RedStart_Department] PRIMARY KEY CLUSTERED ([DeptID])
CREATE NONCLUSTERED INDEX [IX_{objectQualifier}RedStart_Department] ON {databaseOwner}[{objectQualifier}RedStart_Department] ([PortalID])
ALTER TABLE {databaseOwner}[{objectQualifier}RedStart_Department] WITH NOCHECK ADD CONSTRAINT [FK_{objectQualifier}RedStart_Department_{objectQualifier}Portals] FOREIGN KEY ([PortalID]) REFERENCES {databaseOwner}[{objectQualifier}Portals] ([PortalID]) ON DELETE CASCADE NOT FOR REPLICATION
END
GO
if not exists (select * from dbo.sysobjects where id = object_id(N'{databaseOwner}[{objectQualifier}RedStart_DeptUser]') and OBJECTPROPERTY(id, N'IsTable') = 1)
BEGIN
CREATE TABLE {databaseOwner}[{objectQualifier}RedStart_DeptUser]
(
[DeptID] [int] NOT NULL,
[UserID] [int] NOT NULL,
[UserPrio] [int] NOT NULL,
[IsLead] [bit] NOT NULL DEFAULT(0),
[IsValid] [bit] NOT NULL DEFAULT(1)
)
ALTER TABLE {databaseOwner}[{objectQualifier}RedStart_DeptUser] ADD CONSTRAINT [PK_{objectQualifier}RedStart_DeptUser] PRIMARY KEY CLUSTERED ([DeptID], [UserID])
ALTER TABLE {databaseOwner}[{objectQualifier}RedStart_DeptUser] WITH NOCHECK ADD CONSTRAINT [FK_{objectQualifier}RedStart_DeptUser_{objectQualifier}RedStart_Department] FOREIGN KEY ([DeptID]) REFERENCES [{objectQualifier}RedStart_Department] ([DeptID]) ON DELETE CASCADE NOT FOR REPLICATION
ALTER TABLE {databaseOwner}[{objectQualifier}RedStart_DeptUser] WITH NOCHECK ADD CONSTRAINT [FK_{objectQualifier}RedStart_DeptUser_{objectQualifier}Users] FOREIGN KEY ([UserID]) REFERENCES [{objectQualifier}Users] ([UserID]) ON DELETE CASCADE NOT FOR REPLICATION
END
有了数据结构和概念之后,剩下的事情就是将之编码出来的过程了,这个相对来说比较简单一点,我们略过。