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 ...
随机推荐
- 【填坑向】bzoj2038小Z的袜子 莫队
学莫队必做题,,,但是懒得写.今天来填个坑 莫队水题 莫队实际上就是按一个玄学顺序来离线计算询问,保证复杂度只会多一个n1/2,感觉是玄学(离线算法都很玄学) 易错点:要开long long(卡我半天 ...
- 【BZOJ1857】[Scoi2010]传送带 三分法
三分套三分,挺神奇的...每次找到,每个传送带的上下两个三等分点,下面那个小,则一定有更优的在中间. #include <iostream> #include <cstdio> ...
- Android 无标题 全屏设置
标题栏和状态栏 Android程序默认情况下是包含状态栏和标题栏的. 在Eclipse中新建一个Android程序,运行后显示如下: 图中标出了状态栏(显示时间.电池电量.网络等)和标题栏(显示应用的 ...
- 分布式数据库的四分结构设计 BCDE
首先,对关系型数据库的表进行四种分类定义: Basis 根基,Content 内容, Description 说明, Extension 扩展. Basis:Baisis 表是唯一的,为了实现标准而得 ...
- xcode 版本控制推送代码到远程git仓库的步骤
一 代码推送到远程git仓库 1.在git中建立一个下项目(假设项目名称为->Mygit) 2.在xocde上新建一个测试项目(假设项目名称为GitTest) 3.打开电脑终端: 1)首先利用终 ...
- python 安装
http://www.aichengxu.com/view/37456 http://blog.csdn.net/tiantiandjava/article/details/17242345 tar ...
- 运用TensorFlow处理简单的NLP问题
当前无论是学术界还是工业界,深度学习都受到极大的追捧,尤其是在Google开源深度学习平台TensorFlow之后,更是给深度学习火上浇油.目前在开源社区Github上所有开源项目中,TensorFl ...
- SectionIndexer示例
This small tutorial will show you how to create a ListView, enable fast scrolling, and create a alph ...
- 基于webdriver的jmeter性能测试-Selenium IDE
前言: 由于某些项目使用了WebGL技术,需要高版本的Firefox和Chrome浏览器才能支持浏览,兼容性很弱,导致Loadrunner和jmeter(badboy)无法正常进行录制脚本.因此我们采 ...
- dos清除缓存
ipconfig /flushdns ,DNS缓存就被清除了. ipconfig /displaydns查看DNS缓存