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 ...
随机推荐
- make工作时的执行步骤
GNU的make工作时的执行步骤 (1)读入所有的Makefile (2)读入被include的其它Makefile (3)初始化文件中的变量 (4)推导隐晦规则,并分析所有的规则 (5)为所有的目标 ...
- http://devdocs.io/【文档收藏】
http://devdocs.io http://bower.io/ www.bower.iobrowserify.org jsPlumb布局 https://github.com/lndb/jsPl ...
- VB6与VB.NET对照表
VB6与VB.NET对照表 VB6.0 VB.NET AddItem Object名.AddItem Object名.Items.Add ListBox1.Items.Add ComboBox1.It ...
- CentOS搭建SVN记录
1.安装subversion(client and server) $ yum install subversion $ yum install mod_dav_svn 安装成功之后使用 svnser ...
- 在linux下Ant的环境配置
Ant(英文全称为another neat tool,另一个简洁的工具)是一个基于Java的生成工具,Ant将会被应用到Java项目中. 同样的,现在要来安装Ant(最近要安装的东西还蛮多的=m=), ...
- js判断undefined类型
js判断undefined类型 if (reValue== undefined){ alert("undefined"); } 发现判断不出来,最后查了下资料要用ty ...
- 【转】angular指令入坑
独立作用域和函数参数 通过使用本地作用域属性,你可以传递一个外部的函数参数(如定义在控制器$scope中的函数)到指令.这些使用&就可以完成.下面是一个例子,定义一个叫做add的本地作用域属性 ...
- Xcode下搭建OpenGL开发环境
#include <GLUT/GLUT.h> void display() { glClear(GL_ENABLE_BIT); glBegin(GL_POLYGON); glVertex2 ...
- 神奇的css!竟然可以这样玩转表格
这是在对一个博客模板进行移动端适配时遇到的一个场景.html结构如下: 要解决的问题是如何在不修改任何html代码的情况下,仅仅通过css实现下面的效果: 1)改变它们的显示顺序,.MainCell显 ...
- 你必须知道的指针基础-7.void指针与函数指针
一.不能动的“地址”—void指针 1.1 void指针初探 void *表示一个“不知道类型”的指针,也就不知道从这个指针地址开始多少字节为一个数据.和用int表示指针异曲同工,只是更明确是“指针” ...