七、Asp.Net MVC4.0开发CMS系统案例之用户群组模块

群组管理,主要是针对不同人建立不同的群组,这里主要是群组本身管理,至于群组与用户之间的关系,我感觉还是用领一张表建立关系比较好,毕竟他们是多对多的关系。先看代码:

一、模板Models

using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace Hillstone.Models
{
    public class Group
    {
        [Key]
        public int GroupId { get; set; }

        [Display(Name = "组织机构")]
        public Nullable<int> UnitId { get; set; }

        [Display(Name = "组织机构")]
        public string UnitName { get { return Common.Function.getUnitName(this.UnitId); } }
               
        [Display(Name="群组名称")]
        [Required(ErrorMessage="×")]
        [StringLength(50,ErrorMessage="×")]
        public string GroupName { get; set; }

        [Display(Name="群组类型")]
        public int GroupType { get; set; }

        [Display(Name = "群组类型")]
        public string GroupTypeName { get { return Common.Function.getGroupTypeName(this.GroupType); } }

        [Display(Name="排序")]
        [MaxLength(10,ErrorMessage="×")]
        public string OrderNo { get; set; }

        [Display(Name="描述")]
        public string Description { get; set; }

        [Display(Name = "创建人ID")]
        public Nullable<int> CreatedUserId { get; set; }

        [Display(Name = "创建人")]
        [Required(ErrorMessage="×")]
        [StringLength(50,ErrorMessage="×")]
        public string CreatedUserName { get; set; }

        [Display(Name="创建日期")]
        [Required(ErrorMessage="×")]
        [DataType(DataType.DateTime,ErrorMessage="×")]
        public Nullable<System.DateTime> CreatedDate { get; set; }

        /// <summary>
        /// 状态
        /// </summary>
        public Nullable<int> Flag { get; set; }
    }
}

由于在List显示页面里,有些数据需要读取字典显示,数据库只保存了对应的Value值,所以如 UnitName和GroupTypeName属性,通过get检索器,读取出来。不过这里是系统设置的好,没有从数据库中读取,如果是的话,每条数据都要查询数据库,是不是影响效率呢?还是在代码中建立枚举或者数组好些呢,或者利用视图查询,再者也可以将Value与Text一起保存到数据表中。

二、控制器Contrallers

本层涉及到一些业务逻辑,和用户管理一样,在BLL中建立SysComGroupRepository类,继承自IRepositoryBase<Group>。在这里定义一些数据操作方法。首先定义一个数据库连接类

private HillstoneContext db = new HillstoneContext();

定义AUCD方法

        /// <summary>
        /// 添加一个群组
        /// </summary>
        /// <param name="Tmodel">要添加的群组信息实例</param>
        /// <returns>TrueOrFalse</returns>
        public override bool Add(Group Tmodel)
        {
            if (Tmodel == null) { return false; }
            db.group.Add(Tmodel);
            if (db.SaveChanges() > 0)
            {
                return true;
            }
            else {
                return false;            
            }
        }

        /// <summary>
        /// 修改群组信息
        /// </summary>
        /// <param name="Tmodel">要修改的群组信息实例</param>
        /// <returns></returns>
        public override bool Update(Group Tmodel)
        {
            if(Tmodel==null){return false;}
            db.group.Attach(Tmodel);
            db.Entry<Group>(Tmodel).State = EntityState.Modified;//using System.Data
            if (db.SaveChanges() > 0) { return true; } else { return false; }
        }

        /// <summary>
        /// 删除一条群组信息
        /// </summary>
        /// <param name="Id">GroupId</param>
        /// <returns>TrueOrFalse</returns>
        public override bool Delete(int Id)
        {
            db.group.Remove(db.group.SingleOrDefault(g => g.GroupId == Id));
            if (db.SaveChanges() > 0) { return true; } else { return false; }
        }

        /// <summary>
        /// 查找指定的群组
        /// </summary>
        /// <param name="Id">GroupID</param>
        /// <returns>返回查到的群组实例</returns>
        public override Group Find(int Id)
        {
            return db.group.SingleOrDefault(g => g.GroupId == Id);

        }

        /// <summary>
        /// 群组列表
        /// </summary>
        /// <returns>群组列表</returns>
        public IQueryable<Group> List() {
            var _group = db.group;
            return _group;        
        }

        /// <summary>
        /// 根据群组类型查询
        /// </summary>
        /// <param name="groupType">群组类型ID</param>
        /// <returns>群组列表</returns>
        public IQueryable<Group> List(int groupType) {
            return db.group.Where(g => g.GroupType == groupType);       
        }

查询返回数组列用:IQueryable类型。

控制器GroupContrallers中引用业务逻辑类、公用类、模板类。

using Hillstone.Models;
using Hillstone.BLL;
using Hillstone.Common;

实例化两个业务逻辑类

        private SysComGroupRepository groupRsy = new SysComGroupRepository();
        private SysComUserRepository userRsy = new SysComUserRepository();

1)显示List列表页面中,可以根据类别进行查询,绑定查询条件。ViewData中添加,一遍View视图使用。查询条件get方式传递参数ID,进行搜索,-1为全部。

        /// <summary>
        /// 群组列表页面
        /// </summary>
        /// <param name="groupType">用户类型:0集团1分公司2部门3其他4自定义</param>
        /// <returns></returns>
        public ActionResult GroupList(int Id = -1)
        {
            //查询条件:群组类型下拉框
            var _groupTypeList = GroupTypeList(Id);
            _groupTypeList.Insert(0, new SelectListItem() { Value = "-1", Text = "全部" });
            ViewData.Add("GroupTypeList", _groupTypeList);

            IQueryable<Group> iGroup;
            if (Id == -1)
            {
                 iGroup = groupRsy.List();
            }
            else
            {
                iGroup = groupRsy.List(Id);
            }

            return View(iGroup);
        }

2)添加群组操作,赋值ViewData,对有关下拉框数据进行绑定,添加人、添加时间、状态等默认后台赋值。

        /// <summary>
        /// 添加群组显示页面
        /// </summary>
        /// <returns></returns>
        [UserAuthorize]
        public ActionResult Create()
        {
            ViewData["UnitId"] = Common.Function.getUnitList(-1);
            ViewData["GroupType"] = GroupTypeList();

            return View();
        }

        /// <summary>
        /// 提交添加群组信息
        /// </summary>
        /// <param name="group"></param>
        /// <returns></returns>
        [UserAuthorize]
        [HttpPost]
        public ActionResult Create(Group group)
        {
            ViewData["UnitId"] = Common.Function.getUnitList(group.UnitId);
            ViewData["GroupType"] = GroupTypeList();

            HttpCookie _cookie = HttpContext.Request.Cookies["user"];
            User _user = userRsy.Find(_cookie["loginname"].ToString());
            group.CreatedUserId = _user.UnitId;
            group.CreatedUserName = _user.UserName;
            group.CreatedDate = DateTime.Now;
            group.Flag = 1;

            if (groupRsy.Add(group))
            {
                ModelState.AddModelError("Message", "成功!");
            }
            else
            {
                ModelState.AddModelError("Message", "失败");
            }
            return View();
        }

3)删除一条群组信息,View页面用JQuery技术直接调用本方法,注意这里返回是布尔值,而不是视图路径。

        /// <summary>
        /// 删除群组
        /// </summary>
        /// <param name="Id"></param>
        /// <returns></returns>
        [HttpPost]
        public bool Delete(int Id = -1) {
            var _group = groupRsy.Find(Id);
            if (_group != null)
            {
                groupRsy.Delete(Id);
                return true;

            }
            else
            {
                return false;
            }
        }

4)查看操作

        /// <summary>
        /// 查看群组页面
        /// </summary>
        /// <param name="Id">群组ID</param>
        /// <returns></returns>
        public ActionResult Details(int Id)
        {
            var _group = groupRsy.Find(Id);
            return View(_group);
        }

三、视图View代码,暂时就有三个:一个列表页GroupList.cshtml、添加页面:Create.cshtml、默认显示页:Details.cshtml

1)列表页面,查询条件:群组类型下拉框显示,因为在控制器中ViewData已经绑定了此数据,这里调用即可。当选择变化时调用Change方法,传ID参数给后台读取。

  <th colspan="7">@Html.DropDownList("GroupTypeList")</th>
  
      $("#GroupTypeList").change(function(){
        location.href="/Group/GroupList/"+$(this).children("option:selected").val();
    })

虽然数据库中对于组织机构,群组类型都是Value值,不过我们在模型中已经做了处理,详情看上面代码。所以这里直接可以调用:

    @Html.DisplayNameFor(model => model.UnitName)
    @Html.DisplayNameFor(model => model.GroupTypeName)

删掉不需要显示的内容。

对数据进行删除操作,我们通过js操作后台,并对返回结果进行判断。

 <a href="javascript:void(0)" onclick="Delete(@item.GroupId,‘@item.GroupName‘)">删除</a>
 
     function Delete(id, name)
    {
        if (confirm("你确认要删除" + name + "?")) {
            $.post("@Url.Content("~/Group/Delete")", { Id: id }, function (data) {
                if(data){
                    alert("删除成功!");
                    location.reload();
                }
            })
        }
    }

2)添加页面,再看一次下拉框的方式。

@Html.DropDownListFor(model => model.UnitId,ViewData["UnitId"] as SelectList)
@Html.DropDownListFor(model => model.GroupType,ViewData["GroupType"] as SelectList)
时间: 2024-10-02 21:14:48

七、Asp.Net MVC4.0开发CMS系统案例之用户群组模块的相关文章

三、Asp.Net MVC4.0开发CMS系统案例之用户登录模块开发

本次开发是将三层架构与MVC结合一起来,我们看下面一个系统结构: View ->Contraller->Model->BLL->DAL->SQLSERVER |        |        | ----------->Extensions----->FrameWork | __>Common Extensions包括扩展类功能,例如控件的再重新,权限的重新验证等.Common是一些公共性功能. 第一步:创建用户登录模型,可以与注册模型类(SysComUe

二、Asp.Net MVC4.0开发CMS系统案例之用户注册模块开发

上一节我们建立好数据库与数据表结构之后,接下来我们在vs2012中新建MVC开发项目,默认的文件内容就不讲了,关于MVC基础知识东西可以网上查阅其他,或者阅读我的其他博文中的有关介绍. 一.首先先建立用户的Model模型类. 1)用户信息模型 using System; using System.ComponentModel.DataAnnotations; namespace Hillstone.Models {     public class SysComUser     {       

六、Asp.Net MVC4.0开发CMS系统案例之路由规则修改

今天开放的时候,发现如果我要把生成View视图页csthtml建立多个文件夹目录下面,contraller就找不到了.实际开发工作中,不可能所有生成的视图都放在View下面的一级文件夹下,对于系统的代码管理不是十分科学,于是我就尝试如何让它实现. 比如登录功能,控制器建立的路径为:Contrallers/Sys/Com/UserContraller.cs.如图: 系统添加视图默认生成View的路径为:View/User/UserLogin.cshtml.如果我要把路径改为View/Sys/Com

一、Asp.Net MVC4.0开发CMS系统案例之数据库设计

从本章开始,记录开发一个文章管理系统的过程,一般开发软件的流程无非包括以下几个方面: 1.需求调研,了解系统功能需求目标. 2.分析设计,根据调研内容分析如何实现的客户的要求,并设计系统功能模块. 3.数据设计,确定功能对应的数据库.数据表.数据字段.数据关系等 4.代码开发,实现各个功能模块. 5.整合美工,将后台的业务功能实现与前台设计的网页结合起来,并做好美工优化. 6.系统测试,检查系统BUG,以及性能等测试. 7.上线发布,正式使用. 由于我们主要是为学习和研究MVC架构技术,因此业务

四、Asp.Net MVC4.0开发CMS系统案例之密码修改模块开发

首先针对上一次的密码登录做一个补充说明,我们知道在控制器方法汇总使用过滤器[UserAuthorize]做为登录验证非常方便,验证是否成功,然后进行页面跳转,如果验证不成功我要给他们设定一个跳转页面,我们需要在config中做如下配置:     <authentication mode="Forms">       <forms loginUrl="~/SysComUser/UserLogin" timeout="2880" /

建筑材料系统 ASP.NET MVC4.0 + WebAPI + EasyUI + Knockout 的架构设计开发

框架介绍: 1.基于 ASP.NET MVC4.0 + WebAPI + EasyUI + Knockout 的架构设计开发 2.采用MVC的框架模式,具有耦合性低.重用性高.生命周期成本低.可维护性高.有利软件工程化管理等优点 3.采用WebAPI,客户端完全摆脱了代理和管道来直接进行交互 4.采用EasyUI前台UI界面插件,可轻松的打造出功能丰富并且美观的UI界面 5.采用Knockout,,提供了一个数据模型与用户UI界面进行关联的高层次方式(采用行为驱动开发) 6.数据访问层采用强大的

SNF快速开发平台之BS页面展示和九大优点-Asp.net+MVC4.0+WebAPI+EasyUI+Knockout

一)经过多年的实践不断优化.精心维护.运行稳定.功能完善: 能经得起不同实施策略下客户的折腾,能满足各种情况下客户的复杂需求. 二)编码实现简单易懂.符合设计模式等理念: 上手快,见效快.方便维护,能控制软件项目后期维护风险. 三)有严谨的分层理念.完全符合主流的SOA理念架构: 程序可以采用不同的实施策略.架构需求,方便维护.方便扩展. 四)符合RBAC的权限理念.同时也能满足国内小型软件项目的灵活性需求: 不仅符合国际通用标准,又能满足国内的小型软件项目的灵活设置需求. 五)不仅支持多数据库

基于ASP.NET 4.0开发的微商城系统OdnShop,开源发布

基于ASP.NET 4.0开发的开源微商城系统,我们的目标是构建一个核心完善而又轻量级的微商城平台,目前基本的核心功能,包括微信登陆/支付,产品管理,购物车与订单管理等,轻量级是为了更加便于理解源码和二次开发. 使用技术 ASP.NET 4.0 MySql Server 环境要求 支持ASP.NET 4.0的虚拟主机或服务器均可,数据库为开源的MySql数据库系统: 安装流程 1,把安装包上传到主机空间: 2,在MYSQL里新建一个数据库odnshop(也可以是其他数据库名),执行安装包sql目

Asp.Net MVC4.0 官方教程 入门指南之二--添加一个控制器

Asp.Net MVC4.0 官方教程 入门指南之二--添加一个控制器 MVC概念 MVC的含义是 “模型-视图-控制器”.MVC是一个架构良好并且易于测试和易于维护的开发模式.基于MVC模式的应用程序包含: · Models: 表示该应用程序的数据并使用验证逻辑来强制实施业务规则的数据类. · Views: 应用程序动态生成 HTML所使用的模板文件. · Controllers: 处理浏览器的请求,取得数据模型,然后指定要响应浏览器请求的视图模板. 本系列教程,我们将覆盖所有这些概念,并告诉