MVC5 网站开发实践 2、后台管理
目录
从这一部分开始做后台管理,首先是基本框架的
一、Data项目
1、项目添加EntityFramework引用
在Data项目的引用上右键-> 管理NuGet程序包。

在弹出的窗口中选择 EntityFramework 安装

2、添加排序枚举
在Data项目上点右键新建文件夹Type。在文件夹内添加类【OrderType】,代码如下
//创建2014.12.8 namespace Data.Types
{
/// <summary>
/// 排序类型
/// </summary>
public enum OrderType
{
/// <summary>
/// 不排序
/// </summary>
No,
/// <summary>
/// 正序
/// </summary>
Asc,
/// <summary>
/// 倒序
/// </summary>
Desc
}
}
3、添加数据访问类
在Data项目上点右键新建类输入类名【BaseRepository】,这个类主要负责数数据的存取。
类内添加私有成员DbContext _baseDbContext用来在数据库进行增、删、改和查询。
BaseRepository的构造函数public BaseRepository(DbContext dbContext)中dbContext为数据上下文。在该类中写了一些数据的增删改和查询方法。整个代码如下。
using Ninesky.Data.Types;
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Linq.Expressions; namespace Ninesky.Data
{
/// <summary>
/// 数据仓储基类
/// <remarks>
/// 创建:2014.12.13
/// </remarks>
/// </summary>
/// <typeparam name="T"></typeparam>
public class BaseRepository<T> where T : class
{
private DbContext _baseDbContext;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="dbContext">数据上下文</param>
public BaseRepository(DbContext dbContext)
{
_baseDbContext = dbContext;
} /// <summary>
/// 添加
/// </summary>
/// <param name="entity">数据实体</param>
/// <param name="isSave">是否立即保存</param>
/// <returns></returns>
public T Add(T entity, bool isSave = true)
{
_baseDbContext.Set<T>().Add(entity);
if (isSave) _baseDbContext.SaveChanges();
return entity;
} /// <summary>
/// 批量添加【立即执行】
/// </summary>
/// <param name="entities">数据列表</param>
/// <returns>添加的记录数</returns>
public int AddRange(IEnumerable<T> entities, bool isSave = true)
{
_baseDbContext.Set<T>().AddRange(entities);
return isSave ? _baseDbContext.SaveChanges() : 0;
} /// <summary>
/// 修改
/// </summary>
/// <param name="entity">数据实体</param>
/// <param name="isSave">是否立即保存</param>
/// <returns></returns>
public bool Update(T entity, bool isSave = true)
{
_baseDbContext.Set<T>().Attach(entity);
_baseDbContext.Entry<T>(entity).State = EntityState.Modified;
return isSave ? _baseDbContext.SaveChanges() > 0 : true;
} /// <summary>
/// 删除
/// </summary>
/// <param name="entity">数据实体</param>
/// <param name="isSave">是否立即保存</param>
/// <returns></returns>
public bool Delete(T entity, bool isSave = true)
{
_baseDbContext.Set<T>().Attach(entity);
_baseDbContext.Entry<T>(entity).State = EntityState.Deleted;
return isSave ? _baseDbContext.SaveChanges() > 0 : true;
} /// <summary>
/// 批量删除
/// </summary>
/// <param name="entities">数据列表</param>
/// <param name="isSave">是否立即保存</param>
/// <returns>删除的记录数</returns>
public int DeleteRange(IEnumerable<T> entities, bool isSave = true)
{
_baseDbContext.Set<T>().RemoveRange(entities);
return isSave ? _baseDbContext.SaveChanges() : 0;
} /// <summary>
/// 保存
/// </summary>
/// <returns>受影响的记录数</returns>
public int Save()
{
return _baseDbContext.SaveChanges();
} /// <summary>
/// 是否有满足条件的记录
/// </summary>
/// <param name="anyLamdba">条件表达式</param>
/// <returns></returns>
public bool Any(Expression<Func<T, bool>> anyLamdba)
{
return _baseDbContext.Set<T>().Any(anyLamdba);
} /// <summary>
/// 查询记录数
/// </summary>
/// <param name="countLamdba">查询表达式</param>
/// <returns>记录数</returns>
public int Count(Expression<Func<T, bool>> countLamdba)
{
return _baseDbContext.Set<T>().Count(countLamdba);
} /// <summary>
/// 查找实体
/// </summary>
/// <param name="ID">实体ID</param>
/// <returns></returns>
public T Find(int ID)
{
return _baseDbContext.Set<T>().Find(ID);
} /// <summary>
/// 查找实体
/// </summary>
/// <param name="findLambda">Lambda表达式</param>
/// <returns></returns>
public T Find(Expression<Func<T, bool>> findLambda)
{
return _baseDbContext.Set<T>().SingleOrDefault(findLambda);
} /// <summary>
/// 查找所有列表
/// </summary>
/// <returns></returns>
public IQueryable<T> FindAll()
{
return FindList<int>(0, T => true, OrderType.No, null);
} /// <summary>
/// 查找数据列表
/// </summary>
/// <param name="number">返回的记录数【0-返回所有】</param>
/// <param name="whereLandba">查询条件</param>
/// <param name="orderType">排序方式</param>
/// <param name="orderLandba">排序条件</param>
/// <returns></returns>
public IQueryable<T> FindList<TKey>(int number, Expression<Func<T, bool>> whereLandba, OrderType orderType, Expression<Func<T, TKey>> orderLandba)
{
IQueryable<T> _tIQueryable = _baseDbContext.Set<T>().Where(whereLandba);
switch (orderType)
{
case OrderType.Asc:
_tIQueryable = _tIQueryable.OrderBy(orderLandba);
break;
case OrderType.Desc:
_tIQueryable = _tIQueryable.OrderByDescending(whereLandba);
break;
}
if (number > 0) _tIQueryable = _tIQueryable.Take(number);
return _tIQueryable;
} /// <summary>
///
/// </summary>
/// <typeparam name="TKey">排序字段类型</typeparam>
/// <param name="pageIndex">页码【从1开始】</param>
/// <param name="pageNumber">每页记录数</param>
/// <param name="totalNumber">总记录数</param>
/// <param name="whereLandba">查询表达式</param>
/// <param name="orderType">排序类型</param>
/// <param name="orderLandba">排序表达式</param>
/// <returns></returns>
public IQueryable<T> FindPageList<TKey>(int pageIndex, int pageNumber, out int totalNumber, Expression<Func<T, bool>> whereLandba, OrderType orderType, Expression<Func<T, TKey>> orderLandba)
{
IQueryable<T> _tIQueryable = _baseDbContext.Set<T>().Where(whereLandba);
totalNumber = _tIQueryable.Count();
switch (orderType)
{
case OrderType.Asc:
_tIQueryable = _tIQueryable.OrderBy(orderLandba);
break;
case OrderType.Desc:
_tIQueryable = _tIQueryable.OrderByDescending(whereLandba);
break;
}
_tIQueryable = _tIQueryable.Skip((pageIndex - 1) * pageNumber).Take(pageNumber);
return _tIQueryable;
}
}
}
4、添加业务逻辑基类
在data项目右键添加【BaseService】,此类通过调用BaseRepository进行数据处理,作为业务逻辑的基类,其他业务类继承自此类。这个类的方法与BaseRepository比较相似,建立此类的主要体现分层的思路,一些数据访问的异常处理应该放在此类中。代码如下:
using Ninesky.Data.Types;
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Linq.Expressions; namespace Ninesky.Data
{
/// <summary>
/// 业务逻辑基类
/// <remarks>
/// 创建:2014.12.13
/// </remarks>
/// </summary>
public class BaseService<T> where T : class
{
private BaseRepository<T> _baseRepository; /// <summary>
/// 创建业务逻辑类
/// </summary>
/// <param name="dbContext">数据上下文</param>
public BaseService(DbContext dbContext)
{
_baseRepository = new BaseRepository<T>(dbContext);
} /// <summary>
/// 添加
/// </summary>
/// <param name="entity">数据实体</param>
/// <returns>添加后的数据实体</returns>
public T Add(T entity, bool isSave = true)
{
return _baseRepository.Add(entity, isSave);
} ///// <summary>
///// 添加【必须先实例化才能使用】
///// </summary>
///// <param name="entity">数据实体</param>
///// <returns>添加后的记录ID</returns>
//public virtual int Add(T entity) { return 0; } /// <summary>
/// 批量添加
/// </summary>
/// <param name="entities">数据列表</param>
/// <param name="isSave">是否立即保存</param>
/// <returns></returns>
public int AddRange(IEnumerable<T> entities, bool isSave = true)
{
return _baseRepository.AddRange(entities, isSave);
} /// <summary>
/// 修改
/// </summary>
/// <param name="entity">数据实体</param>
/// <param name="isSave">是否立即保存</param>
/// <returns></returns>
public bool Update(T entity, bool isSave = true)
{
return _baseRepository.Update(entity, isSave);
} /// <summary>
/// 删除
/// </summary>
/// <param name="entity">数据实体</param>
/// <param name="isSave">是否立即保存</param>
/// <returns></returns>
public bool Delete(T entity, bool isSave = true)
{
return _baseRepository.Delete(entity, isSave);
} /// <summary>
/// 批量删除
/// </summary>
/// <param name="entities">数据列表</param>
/// <param name="isSave">是否立即保存</param>
/// <returns>删除的记录数</returns>
public int DeleteRange(IEnumerable<T> entities, bool isSave = true)
{
return _baseRepository.DeleteRange(entities, isSave);
} /// <summary>
/// 保存
/// </summary>
/// <returns>受影响的记录数</returns>
public int Save()
{
return _baseRepository.Save();
} /// <summary>
/// 查询记录数
/// </summary>
/// <param name="countLamdba">查询表达式</param>
/// <returns>记录数</returns>
public int Count(Expression<Func<T, bool>> countLamdba)
{
return _baseRepository.Count(countLamdba);
} /// <summary>
/// 查找实体
/// </summary>
/// <param name="ID">实体ID</param>
/// <returns></returns>
public T Find(int ID)
{
return _baseRepository.Find(ID);
} /// <summary>
/// 查找实体
/// </summary>
/// <param name="findLambda">Lambda表达式</param>
/// <returns></returns>
public T Find(Expression<Func<T, bool>> findLambda)
{
return _baseRepository.Find(findLambda);
} /// <summary>
/// 查找所有列表
/// </summary>
/// <returns></returns>
public IQueryable<T> FindAll()
{
return _baseRepository.FindAll();
} /// <summary>
/// 查找数据列表
/// </summary>
/// <param name="number">返回的记录数【0-返回所有】</param>
/// <param name="whereLandba">查询条件</param>
/// <param name="orderType">排序方式</param>
/// <param name="orderLandba">排序条件</param>
/// <returns></returns>
public IQueryable<T> FindList<TKey>(int number, Expression<Func<T, bool>> whereLandba, OrderType orderType, Expression<Func<T, TKey>> orderLandba)
{
return _baseRepository.FindList<TKey>(number, whereLandba, orderType, orderLandba);
} /// <summary>
///
/// </summary>
/// <typeparam name="TKey">排序字段类型</typeparam>
/// <param name="pageIndex">页码【从1开始】</param>
/// <param name="pageNumber">每页记录数</param>
/// <param name="totalNumber">总记录数</param>
/// <param name="whereLandba">查询表达式</param>
/// <param name="orderType">排序类型</param>
/// <param name="orderLandba">排序表达式</param>
/// <returns></returns>
public IQueryable<T> FindPageList<TKey>(int pageIndex, int pageNumber, out int totalNumber, Expression<Func<T, bool>> whereLandba, OrderType orderType, Expression<Func<T, TKey>> orderLandba)
{
return FindPageList<TKey>(pageIndex, pageNumber, out totalNumber, whereLandba, orderType, orderLandba);
}
}
}
二、User项目
1、建立管理员模型
在User项目的引用上点右键添加System.ComponentModel.DataAnnotations的引用和Ninesky.Data项目、E的引用。

在User项目上点右键新建文件夹Models,在文件夹中添加类Administrator。代码如下:
using System;
using System.ComponentModel.DataAnnotations; namespace Ninesky.User.Models
{
/// <summary>
/// 管理员模型
/// <remarks>
/// 创建:2014.12.13
/// </remarks>
/// </summary>
public class Administrator
{
[Key]
public int AdministratorID { get; set; } /// <summary>
/// 管理员账号
/// </summary>
[Required(ErrorMessage = "必须输入{0}")]
[Display(Name = "管理员账号")]
public string Account { get; set; } /// <summary>
/// 管理员名称
/// </summary>
[Required(ErrorMessage = "必须输入{0}")]
[Display(Name = "管理员名称")]
public string Name { get; set; }
/// <summary>
/// 密码
/// </summary>
[Required(ErrorMessage = "必须输入{0}")]
[Display(Name = "密码")]
[DataType(DataType.Password)]
public string Password { get; set; } /// <summary>
/// 创建时间
/// </summary>
public DateTime CreateDate { get; set; } /// <summary>
/// 上次登陆Ip
/// </summary>
public string LoginIp { get; set; } /// <summary>
/// 上次登陆日期
/// </summary>
public Nullable<DateTime> LoginTime { get; set; }
}
}
2、建立管理员业务逻辑类
在User项目上点右键添加AdministratorService类,该类继承自BaseService。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Ninesky.Data;
using Ninesky.User.Models; namespace Ninesky.User
{
/// <summary>
/// 管理员业务逻辑类
/// <remarks>
/// 创建:2014.12.13
/// </remarks>
/// </summary>
public class AdministratorService:BaseService<Administrator>
{ public AdministratorService(DbContext dbContext) : base(dbContext) { }
}
}
三、Website项目
1、添加User项目的引用上右键添加对User项目的引用。
2、建立数据上下文
在Site项目上点右键添加类【NineskyDbContext】,继承自DbContext
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.Entity;
using Ninesky.User.Models; namespace Ninesky.Website
{
/// <summary>
/// 网站数据上下文
/// <remarks>
/// 创建:2014.12.13
/// </remarks>
/// </summary>
public class NineskyDbContext : DbContext
{
public DbSet<Administrator> Administrators { get; set; } public NineskyDbContext()
: base("name=NineskyConnection")
{
Database.SetInitializer<NineskyDbContext>(new CreateDatabaseIfNotExists<NineskyDbContext>());
}
}
}
3、建立数据库连接
打开Web.config文件,在</configSections><appSettings>之间添加数据库的连接
<connectionStrings>
<add name="NineskyConnection" connectionString="Data Source=(LocalDb)\v11.0;AttachDbFilename=|DataDirectory|\Ninesky.mdf;Initial Catalog=Ninesky;Integrated Security=True;MultipleActiveResultSets=True" providerName="System.Data.SqlClient" />
</connectionStrings>
4、建立简单工厂
在Website项目上点右键添加类【ContextFactory】,代码如下:
using System.Runtime.Remoting.Messaging; namespace Ninesky.Website
{
/// <summary>
/// 上下文简单工厂
/// <remarks>
/// 创建:2014.12.13
/// </remarks>
/// </summary>
public class ContextFactory
{
/// <summary>
/// 获取当前数据上下文
/// </summary>
/// <returns>数据上下文</returns>
public static NineskyDbContext GetCurrentContext()
{
NineskyDbContext _nineskyDbContext = CallContext.GetData("NineskyDbContext") as NineskyDbContext;
if (_nineskyDbContext == null)
{
_nineskyDbContext = new NineskyDbContext();
CallContext.SetData("NineskyDbContext", _nineskyDbContext);
}
return _nineskyDbContext;
}
}
}
5、Config区域主界面
在Site项目的Config区域的Controller文件夹上点右键添加Home控制器,类型选择【MVC5控制器-空】。在添加的控制器中添加【Index】 action
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc; namespace Ninesky.Website.Areas.Config.Controllers
{
/// <summary>
/// 主界面
/// <remarks>
/// 创建:2014.12.13
/// </remarks>
/// </summary>
public class HomeController : Controller
{
// GET: Config/Home
public ActionResult Index()
{
return View();
}
}
}
在Config区域Views/Share文件夹添加布局页【_Layout.cshtml】
在Index action上右键添加一个空视图

===========================
代码下载:http://pan.baidu.com/s/1sj6Ya2D
MVC5 网站开发实践 2、后台管理的更多相关文章
- ASP.NET MVC5 网站开发实践(二) Member区域–管理列表、回复及删除
本来想接着上次把这篇写完的,没想到后来工作的一些事落下了,放假了赶紧补上. 目录: ASP.NET MVC5 网站开发实践 - 概述 ASP.NET MVC5 网站开发实践(一) - 项目框架 ASP ...
- ASP.NET MVC5 网站开发实践(二) Member区域 - 文章管理架构
上次把member的用户部分完成,现在开始做文章管理部分.文章部分根据涉及显示现实文章列表,发布文章,修改文章,删除文章等功能.最终的实现目标是使用权限来控制用户是否能进行相应操作,管理员权限的会显示 ...
- MVC5 网站开发实践 2.2、管理员身份验证
上次完成了管理员的登录,这次要解决对管理员登录后的验证,采用AuthorizeAttribute属性的方式.之前还要解决几个问题,然后才重写验证类,最后稍微改一下界面. 目录 MVC5 网站开发实践 ...
- MVC5 网站开发实践 2.1、管理员登陆
目录 MVC5 网站开发实践 概述 MVC5 网站开发实践 1.建立项目 MVC5 网站开发实践 2.后台管理 1. 创建SHA256加密方法. 在Data项目中添加文件夹[Security ...
- MVC5 网站开发实践 概述
目录 MVC5 网站开发实践 概述 MVC5 网站开发实践 1.建立项目 MVC5 网站开发实践 2.后台管理 MVC5 网站开发实践 2.1.管理员登陆 MVC5 网站开发实践 2.2.管理 ...
- ASP.NET MVC5 网站开发实践(二) Member区域 - 修改及删除文章
上次做了显示文章列表,再实现修改和删除文章这部分内容就结束了,这次内容比较简单,由于做过了添加文章,修改文章非常类似,就是多了一个TryUpdateModel部分更新模型数据. 目录: ASP.N ...
- ASP.NET MVC5 网站开发实践(二) Member区域 - 全部文章列表
显示文章列表分两块,管理员可以显示全部文章列表,一般用户只显示自己的文章列表.文章列表的显示采用easyui-datagrid.后台需要与之对应的action返回json类型数据 目录 ASP.N ...
- ASP.NET MVC5 网站开发实践(二) Member区域 - 添加文章
上次把架构做好了,这次做添加文章.添加文章涉及附件的上传管理及富文本编辑器的使用,早添加文章时一并实现. 要点: 富文本编辑器采用KindEditor.功能很强大,国人开发,LGPL开源,自己人的好东 ...
- ASP.NET MVC5 网站开发实践(二) Member区域 - 用户部分(3)修改资料、修改密码
在上一篇博客中实现了用户的注销和登录,其实代码里落了点东西,就是用户登录要更新最后一次登录时间和登录IP,这次补上.今天做修改资料和修改密码,TryUpdateModel是新用到的东西. 目录: AS ...
随机推荐
- android 腾讯x5内核 浏览器
1.浏览器内核: 主流浏览器内核介绍(前端开发值得了解的浏览器内核历史) 浏览器内核历史介绍: 在android 4.4之前,浏览器用的还是webkit 在android 4.4之后,google就抛 ...
- db2循环
db2普通循环结构 while循环 while 条件 do 循环体 end while; LOOP循环 SET V_INDEX = 0; AUTHLOOP: LOOP V_INDEXV_INDEX = ...
- 使用js_md5加密密码
为什么在传输过程中要用md5对密码进行加密? 众所周知,我们在表单中的输入框输入了密码后,如果采用ajax的post或者get方式提交数据,在浏览器的newwork中就可以看到我们向后台传输的内容,其 ...
- Array方法
1.concat()方法 用法:用于连接两个或者多个数组. 对原数组有无影响:不会改变原有数组,会返回一个连接之后的数组. 2.join()方法 用法:以指定的分隔符把数组中每一项拆分成字符串. 对原 ...
- java分享第二十天(build.xml的语法及写法)
通常情况下,Ant构建文件build.xml应该在项目的基础目录.可以自由使用其他文件名或将构建文件中其他位置.在本练习中,创建一个名为build.xml 在电脑的任何地方的文件. <?xml ...
- java分享第十七天-01(封装操作xml类)
做自动化测试的人,都应该对XPATH很熟悉了,但是在用JAVA解析XML时,我们通常是一层层的遍历进去,这样的代码的局限性很大,也不方便,于是我们结合一下XPATH,来解决这个问题.所需要的JAR包: ...
- Unity自动寻路Navmesh之高级
隔离层自动生成寻路网格 (源码scene1.unity) 1.创建Plane实例P1,P2,两者之间出现一条鸿沟.直接控制角色位移是无法通过的. 2.打开Navigation窗口,分别选中P1,P2, ...
- java并发编程(十六)happen-before规则
转载请注明出处:http://blog.csdn.net/ns_code/article/details/17348313 happen-before规则介绍 Java语言中有一个"先行发生 ...
- mysql如何在一个字段后面加个字符?
update city set 字段=concat(字段,'内容');
- webserver几个例子
刚刚学习了web服务,实现了发布和调用电话号码归属地查询,下面我简单的说一下 第一个方法利用网页实现号码查询: 首先进入http://www.webxml.com.cn/网站 然后点这个 输入手机号码 ...