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 ...
随机推荐
- ssh自动输入密码脚本 切换目录脚本
利用expect的,首先查看expect,命令:which expect #!/usr/bin/expect -f spawn ssh 用户名@ip地址 expect "assword:&q ...
- WindowManager massge和handler
在一个可移动浮动按钮的demo源码学习中,有一些WindowManager的使用,在此做下总结. 1.翻译过来就是窗口管理,是和应用框架层的窗口管理器交互的接口,通过 mWindowManager = ...
- 第2章 新手必须掌握的Linux命令
第2章 新手必须掌握的Linux命令 章节简述: 本章节讲述系统内核.Bash解释器的关系与作用,教给读者如何正确的执行Linux命令以及常见排错方法. 经验丰富的运维人员可以恰当的组合命令与参数 ...
- javascript变量的作用域
javascript变量的作用域 基本类型和引用类型 基本类型值指的是简单的数据段,而引用类型值指的是那个可能由多个值组成的对象 讲一个值赋值给变量时,javascript解析器首先要确定是基本类型 ...
- zepto区别于jquery获取select表单选中的值
在jquery下,我们获取select表单选中的值通常是通过$('select').val()来实现,这样的方式简单又明了,或者通过$('select option[selected]').text( ...
- Python之路【第七篇】python基础 之socket网络编程
本篇文章大部分借鉴 http://www.cnblogs.com/nulige/p/6235531.html python socket 网络编程 一.服务端和客户端 BS架构 (腾讯通软件:ser ...
- Smart3D系列教程2之 《为什么三维重建效果这么差?——探探那些被忽略的拍照要求和技巧》
一.照片采集的实用概念 根据照片进行三维重建的过程中,有人没怎么遇到坑,有人被坑的不轻.可能是模型的纹理失真,模型的法线错了,模型会生成我们各种也想不到的结果,那么,是什么导致三维重建效果这么差的?是 ...
- hibernate不同版本获取获取sessionFactory
hibernate4时,我们采用以下方式获取会话工厂: // 1. 解析我们在hibernate.cfg.xml中的配置 Configuration configuration = new Confi ...
- Javascript初学篇章_8(事件)
事件 HTML 事件是发生在 HTML 元素上的事情.例如用户点击按钮时,点击也是一个事件.事件可以用于处理表单验证,用户输入,用户行为及浏览器动作,如: 页面加载时触发事件 页面关闭时触发事件 用户 ...
- jquery/zepto 圣诞节雪花飞扬
下载地址: http://www.html5tricks.com/jquery-html5-christ-snow.html 演示地址: http://www.html5tricks.com/jque ...