zoukankan      html  css  js  c++  java
  • 创建用户权限管理范例程序2

    ASP.NET MVC 企业级实战 —— 创建用户权限管理范例程序(二)

    2012-11-21 14:56 by E2Home, 1142 阅读, 6 评论, 收藏编辑

    上一篇,大家反应比较热烈,给了我很大的鼓励,不管是褒奖的还是贬低的,都是认真看过之后对框架的一个反馈。

    由于上一篇没有说清楚开发环境,导致很多用户在VS 2012 无法安装NBlock框架模版。这次我着重说明一下,NBlock框架目前在支持 VS 2010 ,其他的开发环境没有测试过。

    NBlock框架采用ASP.NET MVC3作为UI展现,用JQuery 插件提高用户交互体验,ORM采用微软的Entity Framework 4.3.1的一套快速开发框架。

    用户权限管理的访问地址:http://42.121.122.31/, 速度可能会慢,因为我是通过园豆购买的阿里云主机,最差的那种配置。

     

    下面进入我们的正题,一步一步来创建用户权限管理范例程序,接上一篇的内容如下:

    五、 创建数据库

    我们将使用SQL Server 2005数据库来存储范例程序OrgAuth的所有数据,首先我们要创建一个数据库名叫OrgAuth,然后向数据库增加用户信息表(NB_UserInfo)。如下图所示。在OrgAuth数据库的NB_UserInfo表,需要设置Id为主键,存放的是Guid的字符串,同时有CreateUserId、CreateUser、CreateDate、UpdateUserId、UpdateUser、UpdateDate六个必填字段的创建信息和修改信息。

    clip_image001[6]

    说明:NBlock框架会自动处理创建和修改信息的六个字段,开发人员不需要额外处理。

    NBlock框架模板创建的应用系统会默认自带枚举字典的管理,用到两张表NB_EnumItem和 NB_EnumType,而这两张表是放在Sqlite数据库的,所以我们需要将这两张表移植到我们上面创建的OrgAuth数据库(Sql Server 2005)。

    在OrgAuth数据库中,执行以下Sql脚本,生成应用系统默认自带的两种表NB_EnumItem和 NB_EnumType。

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    CREATE TABLE [dbo].[NB_EnumItem](
    [Id] [nvarchar](50) NOT NULL,
    [EnumCode] [nvarchar](50) NOT NULL,
    [EnumName] [nvarchar](100) NOT NULL,
    [FirstChar] [nvarchar](50) NULL,
    [TypeId] [nvarchar](50) NULL,
    [TypeCode] [nvarchar](50) NULL,
    [ParentId] [nvarchar](50) NULL,
    [ParentCode] [nvarchar](50) NULL,
    [SeqNo] [int] NOT NULL,
    [Remark] [nvarchar](1000) NULL,
    [CreateUserId] [nvarchar](50) NOT NULL,
    [CreateUser] [nvarchar](100) NOT NULL,
    [CreateDate] [datetime] NOT NULL,
    [UpdateUserId] [nvarchar](50) NOT NULL,
    [UpdateUser] [nvarchar](100) NOT NULL,
    [UpdateDate] [datetime] NOT NULL,
    CONSTRAINT [PK_NB_EnumItem] PRIMARY KEY CLUSTERED
    (
    [Id] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    GO
    CREATE TABLE [dbo].[NB_EnumType](
    [Id] [nvarchar](50) NOT NULL,
    [TypeCode] [nvarchar](50) NOT NULL,
    [TypeName] [nvarchar](100) NOT NULL,
    [IsSystem] [bit] NULL,
    [SeqNo] [int] NULL,
    [Remark] [nvarchar](1000) NULL,
    [CreateUserId] [nvarchar](50) NOT NULL,
    [CreateUser] [nvarchar](100) NOT NULL,
    [CreateDate] [datetime] NOT NULL,
    [UpdateUserId] [nvarchar](50) NOT NULL,
    [UpdateUser] [nvarchar](100) NOT NULL,
    [UpdateDate] [datetime] NOT NULL,
    CONSTRAINT [PK_NB_EnumType] PRIMARY KEY CLUSTERED
    (
    [Id] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    GO

    最后我们增加一些用户信息数据到NB_UserInfo表,这些数据在随后的应用系统开发中会用到,如下图所示。

    clip_image002

    六、 创建Model对象

    在Model-View-Controller 框架中,Model 表示应用程序的数据对象,以及相应的业务领域逻辑,包括数据验证和业务规则。Model 是NBlock框架创建的应用程序的核心部分,下面我们会看到Model 的作用。

    ASP.NET MVC 框架支持使用任意数据访问技术,开发人员可以选择大量的.NET 数据访问技术实现Model层,如Entity Framework、LINQ to Entities、NHibernate、LLBLGen Pro、SubSonic、WilsonORM或者基本的ADO.NET DataReaders、DataSets 等等。

    对于本范例程序OrgAuth,我们将采用 Entity Framework 来创建一个简单的业务领域模型,非常接近于数据库的设计。接下来利用NBlock框架自带的IRepository泛型接口,来帮助封装抽象化数据访问。

       6.1 Entity Framework

    Entity Framework是.NET 4.0 的ORM(Object Relational Mapper)部分。Entity Framework提供了一个简单的方式映射数据表到.NET 类。对于我们的OrgAuth 范例程序,我们将映射NB_UserInfo数据表到UserInfo模型类。NB_UserInfo数据表中的列将映射为UserInfo模型类的属性。每一个UserInfo对象将表示NB_UserInfo数据表中的一条单独的数据记录。

    说明:NBNBlock框架的关键字符,在生成模型类的时候,会自动省略。

    Entity Framework 避免让我们手动创建SQL 脚本从数据库中检索和更新UserInfo对象。在访问或更新数据库记录时,Entity Framework将负责生成合适的SQL执行逻辑。我们可以使用LINQ 语言写查询表达式,检索UserInfo对象。这样可以大量减少代码行,构建清晰的应用程序。

       6.2 增加模型类到Model类库项目中

    现在终于可以回到我们的OrgAuth 应用程序了!双击打开OrgAuth.Model类库项目的App.Config文件,如下图所示,修改Entity Framework的连接字符串。

    clip_image002[5]

    前面我们已经修改了Entity Framework的连接字符串,所以我们这里可以通过在Model.edmx文件中点击 右键 -> 从数据库更新模型 ,在弹出的对话框中,选择需要建模的数据表来创建对象模型。我们这里将NB_UserInfo数据表勾中,点击“完成”按钮并保存Model.edmx文件就可以创建UserInfo对象模型了,如下图所示。

    clip_image002[7]

    默认情况下,NBlock框架中的设计器在基于数据表创建类时,会通过T4模板自动创建UserInfo类的相关文件,NB_UserInfo.cs、NB_UserInfo_Mapping.cs和修改Model_Context.cs文件。如下图所示。

    clip_image002[9]

       6.3 OrgAuthRepository泛型类

    对于一个小应用程序而言,有时让Conrollers 类直接使用Entity Framework DbContext 类,并将LINQ 查询语句写在Controllers 中。但随着应用程序越来越大,这一方法的维护和扩展将变得麻烦,并且导致重复的LINQ 查询在多个地方出现。让维护和扩展更方便的方法是使用Repository 模式。Repository 类帮助封装数据查询和存储逻辑,从应用程序中抽象隔离具体的数据存储实现。除了是应用程序代码更加简洁外,使用 Repository 模式使将来更改数据库存储实现更加方便。

    NBlock框架默认自带了IRepository<T>接口,而利用NBlock框架模板创建的应用系统会自动创建继承于IRepository<T>的类,我们的OrgAuth范例程序就自动创建了IOrgAuthRepository<T>接口和OrgAuthRepository<T>实现类。而IRepository<T>内部已经封装了对DbContext的引用。如下图所示,数据库的增删改查和分页查询等

    clip_image002[11]

       6.4 使用OrgAuthRepository泛型类实现增删改查操作

    现在我们已经创建了OrgAuthRepository类,下面我们看看一些示例代码。

    查询代码

    下面的代码使用UserCode 检索一条UserInfo 记录:

    1
    2
    3
    var userRepository = ServiceLocator.Current.GetInstance<IOrgAuthRepository<UserInfo>>();
    // 获取指定UserCode为Admin的用户信息
    var user = userRepository.Find(u => u.UserCode == "admin");

    下面的代码用来检索所有状态为停用的UserInfo集合,并遍历:

    1
    2
    3
    4
    5
    6
    // 获取所有状态为停用的用户信息集合
    var users = userRepository.FindAll(u => u.AccountState == "停用");
    foreach (var user in users)
    {
    // TODO 循环处理User的逻辑
    }

    插入和更新代码

    下面的代码演示新增2 个UserInfo,新增或更新的信息不会提交到数据库,直到调用Commit () 方法。Entity Framework自动包装所有更新的数据库事务,因此在调用OrgAuthRepository的Save() 方法时,所有的变更都没有更新到数据库中,只有调用了Commit () 方法才会提交。

    注意:NBlock框架会在每次请求结束前调用Commit () 方法数据到数据库的,除非我们需要在代码中主动调用Commit ()来及时提交数据到数据库中。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    var userRepository = ServiceLocator.Current.GetInstance<IOrgAuthRepository<UserInfo>>();
    // 创建第一个用户信息
    var user1 = new UserInfo();
    user1.UserCode = "NewUser1";
    user1.UserName = "新用户1";
    user1.AccountState = "正常";
    // 创建第二个用户信息
    var user2 = new UserInfo();
    user2.UserCode = "NewUser2";
    user2.UserName = "新用户2";
    user2.AccountState = "正常";
    // 将用户信息插入到userRepository中,这时在内存数据库中有两个用户信息了。
    userRepository.Insert(user1);
    userRepository.Insert(user2);
    // 提交两个用户信息到数据库
    userRepository.Commit();

    下面的代码首先检索一个存在的UserInfo 对象,然后更新2个属性,最后调用OrgAuthRepository对象的Commit () 方法,提交更新到数据库。

    var userRepository = ServiceLocator.Current.GetInstance<IOrgAuthRepository<UserInfo>>();

    // 获取指定Id的用户信息
    var user = userRepository.Find("9D707138-C328-4364-A227-A1AEDA1452D7");

    // 更新用户的属性
    user.UserName = "新管理员";
    user.Remark = "用户信息被修改过";

    // 提交变更过的用户信息到数据库
    userRepository.Commit();

    删除操作代码

    下面的代码首先调用OrgAuthRepository对象的Delete() 方法,标记该条记录删除。然后再调用OrgAuthRepository对象的Commit () 方法时,从数据库表中删除该记录。

    1
    2
    3
    4
    5
    var userRepository = ServiceLocator.Current.GetInstance<IOrgAuthRepository<UserInfo>>();
    // 删除指定Id的用户信息
    userRepository.Delete("9345CEF2-833A-4F74-8A25-AE38A2E0B86B");
    // 提交删除的用户信息到数据库
    userRepository.Commit();

    到这里,我们介绍完如何创建Model对象以及利用Repository模式对Model对象进行简单的数据库增删改查的操作。

    下一篇我们会讲解控制器和视图以及用户管理界面的雏形,敬请期待!

    代码下载:/Files/lfzx_1227/OrgAuth.rar

  • 相关阅读:
    内核随记(三)同步(1)
    排列算法
    SQLite入门与分析(八)存储模型(3)
    内核随记(一)——理解中断(2)
    dup与dup2系统调用
    内核随记(四)文件系统(1)
    SQLite入门与分析(八)存储模型(2)
    SQLite入门与分析(九)VACUUM命令分析
    c中static变量局部变量
    (i++)+(i++)与(++i)+(++i)
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2782298.html
Copyright © 2011-2022 走看看