NET MVC+EF6+Bootstrap

开源:ASP.NET MVC+EF6+Bootstrap开发框架

前言

我在博客园潜水两三年了,在这里看过很多大神的文章,也学到了很多东西。可以说我是汲取着博客园的营养成长的。

想当年,我也是拿10个G的精神粮食从一个博客园大神那里换来一套开发框架,正式走上开发之路,到后来成为主力开发,再到项目经理再后来顺利拿下美工妹,也算是走上人生巅峰。

只索取,不分享就是自私,大家都这么自私还怎么做技术交流,说到分享首先想到的就是我那120G的精神粮食,但是分享这个好像有点法律风险,所以我把这几年在.net开发生涯中积累的一套框架分享给大家。

早上发过一篇博客,一会儿就让管理员拿掉了,这里我解释下完全没有广告推广的意思,我不会放置任何推广信息,没那个必要,房子、车子、妹子都有了,在一家还不错的单位上着班,不然也没这个闲心来做什么开源框架,目的是有,就是出来在新手面前装个逼。这样吧大家下了代码去看,里面如果有一点点广告嫌疑作者我小JJ自动缩短一厘米。

废话少说,先来介绍下这个开发框架。

框架名称:NFine.Framwork,牛逼框架,好框架

框架使用场景:OA、ERP、BPM、CRM、WMS、TMS、MIS等业务管理系统及后台系统

框架解决方案:

解决方案简介:

1、NFine.Code 底层核心类(开发时不涉及,可编绎成dll提供)。

2、NFine.Data 数据层(开发时不涉及,可编绎成dll提供)。

3、NFine.Application  应用(有点类似业务逻辑层)

4、NFine.Domain 领域层。

5、NFine.Mapping 数据库映射。

6、NFine.Repository 数据访问。

7、NFine.Web 前端视图及控制器。

框架主要运用技术:

  • 1、前端技术
  • JS框架:jquery-2.1.1、Bootstrap.js、JQuery UI
  • CSS框架:Bootstrap v3.3.4(稳定是后台,UI方面根据需求自己升级改造吧)。
  • 客户端验证:jQuery Validation Plugin 1.9.0。
  • 在线编辑器:ckeditor、simditor
  • 上传文件:Uploadify v3.2.1
  • 动态页签:Jerichotab(自己改造)
  • 数据表格:jqGrid、Bootstrap Talbe
  • 对话框:layer-v2.3
  • 下拉选择框:jQuery Select2
  • 树结构控件:jQuery zTree、jQuery wdtree
  • 页面布局:jquery.layout.js 1.4.4
  • 图表插件:echarts、highcharts
  • 日期控件: My97DatePicker
  • 2、后端技术
  • 核心框架:ASP.NET MVC5、WEB API
  • 持久层框架:EntityFramework 6.0
  • 定时计划任务:Quartz.Net组件
  • 安全支持:过滤器、Sql注入、请求伪造
  • 服务端验证:实体模型验证、自己封装Validator
  • 缓存框架:微软自带Cache、Redis
  • 日志管理:Log4net、登录日志、操作日志
  • 工具类:NPOI、Newtonsoft.Json、验证码、丰富公共类似

框架代码风格:

数据库、仓库代码

 1 using NFine.Code;
 2 using System;
 3 using System.Collections.Generic;
 4 using System.Data.Common;
 5 using System.Linq;
 6 using System.Linq.Expressions;
 7
 8 namespace NFine.Data
 9 {
10     /// <summary>
11     /// 仓储接口
12     /// </summary>
13     /// <typeparam name="TEntity">实体类型</typeparam>
14     public interface IRepositoryBase<TEntity> where TEntity : class,new()
15     {
16         int Insert(TEntity entity);
17         int Insert(List<TEntity> entitys);
18         int Update(TEntity entity);
19         int Delete(TEntity entity);
20         int Delete(Expression<Func<TEntity, bool>> predicate);
21         TEntity FindEntity(object keyValue);
22         TEntity FindEntity(Expression<Func<TEntity, bool>> predicate);
23         IQueryable<TEntity> IQueryable();
24         IQueryable<TEntity> IQueryable(Expression<Func<TEntity, bool>> predicate);
25         List<TEntity> FindList(string strSql);
26         List<TEntity> FindList(string strSql, DbParameter[] dbParameter);
27         List<TEntity> FindList(Pagination pagination);
28         List<TEntity> FindList(Expression<Func<TEntity, bool>> predicate, Pagination pagination);
29     }
30 }

using NFine.Code;
using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Data.Entity;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using System.Text.RegularExpressions;

namespace NFine.Data
{
    /// <summary>
    /// 仓储实现
    /// </summary>
    /// <typeparam name="TEntity"></typeparam>
    public class RepositoryBase<TEntity> : IRepositoryBase<TEntity> where TEntity : class,new()
    {
        public NFineDbContext dbcontext = new NFineDbContext();
        public int Insert(TEntity entity)
        {
            dbcontext.Entry<TEntity>(entity).State = EntityState.Added;
            return dbcontext.SaveChanges();
        }
        public int Insert(List<TEntity> entitys)
        {
            foreach (var entity in entitys)
            {
                dbcontext.Entry<TEntity>(entity).State = EntityState.Added;
            }
            return dbcontext.SaveChanges();
        }
        public int Update(TEntity entity)
        {
            dbcontext.Set<TEntity>().Attach(entity);
            PropertyInfo[] props = entity.GetType().GetProperties();
            foreach (PropertyInfo prop in props)
            {
                if (prop.GetValue(entity, null) != null)
                {
                    if (prop.GetValue(entity, null).ToString() == "&nbsp;")
                        dbcontext.Entry(entity).Property(prop.Name).CurrentValue = null;
                    dbcontext.Entry(entity).Property(prop.Name).IsModified = true;
                }
            }
            return dbcontext.SaveChanges();
        }
        public int Delete(TEntity entity)
        {
            dbcontext.Set<TEntity>().Attach(entity);
            dbcontext.Entry<TEntity>(entity).State = EntityState.Deleted;
            return dbcontext.SaveChanges();
        }
        public int Delete(Expression<Func<TEntity, bool>> predicate)
        {
            var entitys = dbcontext.Set<TEntity>().Where(predicate).ToList();
            entitys.ForEach(m => dbcontext.Entry<TEntity>(m).State = EntityState.Deleted);
            return dbcontext.SaveChanges();
        }
        public TEntity FindEntity(object keyValue)
        {
            return dbcontext.Set<TEntity>().Find(keyValue);
        }
        public TEntity FindEntity(Expression<Func<TEntity, bool>> predicate)
        {
            return dbcontext.Set<TEntity>().FirstOrDefault(predicate);
        }
        public IQueryable<TEntity> IQueryable()
        {
            return dbcontext.Set<TEntity>();
        }
        public IQueryable<TEntity> IQueryable(Expression<Func<TEntity, bool>> predicate)
        {
            return dbcontext.Set<TEntity>().Where(predicate);
        }
        public List<TEntity> FindList(string strSql)
        {
            return dbcontext.Database.SqlQuery<TEntity>(strSql).ToList<TEntity>();
        }
        public List<TEntity> FindList(string strSql, DbParameter[] dbParameter)
        {
            return dbcontext.Database.SqlQuery<TEntity>(strSql, dbParameter).ToList<TEntity>();
        }
        public List<TEntity> FindList(Pagination pagination)
        {
            bool isAsc = pagination.sord.ToLower() == "asc" ? true : false;
            string[] _order = pagination.sidx.Split(‘,‘);
            MethodCallExpression resultExp = null;
            var tempData = dbcontext.Set<TEntity>().AsQueryable();
            foreach (string item in _order)
            {
                string _orderPart = item;
                _orderPart = Regex.Replace(_orderPart, @"\s+", " ");
                string[] _orderArry = _orderPart.Split(‘ ‘);
                string _orderField = _orderArry[0];
                bool sort = isAsc;
                if (_orderArry.Length == 2)
                {
                    isAsc = _orderArry[1].ToUpper() == "ASC" ? true : false;
                }
                var parameter = Expression.Parameter(typeof(TEntity), "t");
                var property = typeof(TEntity).GetProperty(_orderField);
                var propertyAccess = Expression.MakeMemberAccess(parameter, property);
                var orderByExp = Expression.Lambda(propertyAccess, parameter);
                resultExp = Expression.Call(typeof(Queryable), isAsc ? "OrderBy" : "OrderByDescending", new Type[] { typeof(TEntity), property.PropertyType }, tempData.Expression, Expression.Quote(orderByExp));
            }
            tempData = tempData.Provider.CreateQuery<TEntity>(resultExp);
            pagination.records = tempData.Count();
            tempData = tempData.Skip<TEntity>(pagination.rows * (pagination.page - 1)).Take<TEntity>(pagination.rows).AsQueryable();
            return tempData.ToList();
        }
        public List<TEntity> FindList(Expression<Func<TEntity, bool>> predicate, Pagination pagination)
        {
            bool isAsc = pagination.sord.ToLower() == "asc" ? true : false;
            string[] _order = pagination.sidx.Split(‘,‘);
            MethodCallExpression resultExp = null;
            var tempData = dbcontext.Set<TEntity>().Where(predicate);
            foreach (string item in _order)
            {
                string _orderPart = item;
                _orderPart = Regex.Replace(_orderPart, @"\s+", " ");
                string[] _orderArry = _orderPart.Split(‘ ‘);
                string _orderField = _orderArry[0];
                bool sort = isAsc;
                if (_orderArry.Length == 2)
                {
                    isAsc = _orderArry[1].ToUpper() == "ASC" ? true : false;
                }
                var parameter = Expression.Parameter(typeof(TEntity), "t");
                var property = typeof(TEntity).GetProperty(_orderField);
                var propertyAccess = Expression.MakeMemberAccess(parameter, property);
                var orderByExp = Expression.Lambda(propertyAccess, parameter);
                resultExp = Expression.Call(typeof(Queryable), isAsc ? "OrderBy" : "OrderByDescending", new Type[] { typeof(TEntity), property.PropertyType }, tempData.Expression, Expression.Quote(orderByExp));
            }
            tempData = tempData.Provider.CreateQuery<TEntity>(resultExp);
            pagination.records = tempData.Count();
            tempData = tempData.Skip<TEntity>(pagination.rows * (pagination.page - 1)).Take<TEntity>(pagination.rows).AsQueryable();
            return tempData.ToList();
        }
    }
}

自动映射对象实体

框架界面展示:

支持多皮肤切换

下一篇给大家讲解下如何实现动态皮肤切换

总结:

1:本文并没有详细讲解实现机制。

2:本文并没有详细讲解开发方式。

但,至少你可以:看源码、看API、看Demo,还可以加入技术交流群进行交流分享。

当然,后续我会补充相关文章,更加细化和完善的机制及开发方式。

如果您支持开源精神,在精神层面可以点赞以示鼓励

另外补充:有Bug及漏洞,请私下提交

框架开源地址:

1、源码下载地址:http://download.csdn.net/detail/nfine_2016/9608074

时间: 2024-12-28 05:58:16

NET MVC+EF6+Bootstrap的相关文章

【开源分享:入门到精通ASP.NET MVC+EF6+Bootstrap】月薪过万不是梦,从这里开始,一起搭框架(1)开篇介绍

框架简介 这几年一直在做ASP.NET开发,几年前做项目都是老老实实一行行的写代码,后来发现那些高手基本都会有自己积累起来的代码库,现在称之为开发框架,基础代码不用再去堆,主要精力可以集中在业务逻辑实现上.这样开发效率高了,他们的待遇也会比我高出很多.我也想有自己的房子.车子.妹子,我也想成为开发高手,于是我想拥有一套自己的开发框架. 首先找的是李天平的动软代码生成器,生成实体什么的是没问题,但是UI层完全没有啊,而且里面有错误.后来有些人开始做收费版的开发框架了,做得确实专业,但是上万的东西,

【开源分享:入门到精通ASP.NET MVC+EF6+Bootstrap】从这里开始,一起搭框架(1)开篇介绍

框架简介 这几年一直在做ASP.NET开发,几年前做项目都是老老实实一行行的写代码,后来发现那些高手基本都会有自己积累起来的代码库,现在称之为开发框架,基础代码不用再去堆,主要精力可以集中在业务逻辑实现上.这样开发效率高了,他们的待遇也会比我高出很多.我也想有自己的房子.车子.妹子,我也想成为开发高手,于是我想拥有一套自己的开发框架. 首先找的是李天平的动软代码生成器,生成实体什么的是没问题,但是UI层完全没有啊,而且里面有错误.后来有些人开始做收费版的开发框架了,做得确实专业,但是上万的东西,

基于ASP.NET MVC和Bootstrap搭建响应式个人博客站

1.0 为什么要做这个博客站? www.zynblog.com 在工作学习中,经常要搜索查找各种各样的资料,每次找到相关资料后都会顺手添加到浏览器书签中,时间一长,书签也就满了.而且下次再点击这个书签时,可能 就会忘记当时为什么要添加这个书签了,更有可能书签连接已经无效.这样一来,也就不方便自己查阅了.如果转载.收藏到自己的博客园账号中.CSDN账号 中,脚本之家中,知乎中等等,依然是很凌乱,不方便下次查阅. 因此,我下决心开发一个个人技术博客站.主要原因是:可以整合各种宝贵资源,将知识变为宝库

使用MiniProfiler跟踪MVC + EF + Bootstrap 2 权限管理系统的性能消耗

安装MiniProfiler 在MVC + EF + Bootstrap 2 权限管理系统入门级(附源码)文章中下载了它的源码,调试模式下打开一个页面都要再2.5秒以上,所以使用MiniProfiler.MiniProfiler.MVC4 .MiniProfiler.EF6组件进行了分析. 首先,依次序安装组件.然后,修改Global.aspx.cs 文件: protected void Application_Start() { AreaRegistration.RegisterAllArea

基于ASP.NET MVC和Bootstrap搭建响应式个人博客站(一)

1.0 为什么要做这个博客站? www.zynblog.com   在工作学习中,经常要搜索查找各种各样的资料,每次找到相关资料后都会顺手添加到浏览器书签中,时间一长,书签也就满了.而且下次再点击这个书签时,可能 就会忘记当时为什么要添加这个书签了,更有可能书签连接已经无效.这样一来,也就不方便自己查阅了.如果转载.收藏到自己的博客园账号中.CSDN账号 中,脚本之家中,知乎中等等,依然是很凌乱,不方便下次查阅. 因此,我下决心开发一个个人技术博客站.主要原因是:可以整合各种宝贵资源,将知识变为

MVC+EF6+Oracle,提示ORA-01918: user &#39;***&#39; does not exist

1.在上下文里重载OnModelCreating:        //没用到这个方法         protected override void OnModelCreating(DbModelBuilder modelBuilder)        {            modelBuilder.HasDefaultSchema("这里写你的Oracle用户名,一定要大写噢!");        } MVC+EF6+Oracle,提示ORA-01918: user '***'

ASP.NET MVC使用Bootstrap系列(3)——使用Bootstrap 组件

Bootstrap为我们提供了十几种的可复用组件,包括字体图标.下拉菜单.导航.警告框.弹出框.输入框组等.在你的Web Application中使用这些组件,将为用户提供一致和简单易用的用户体验. Bootstrap组件本质上是结合了各种现有Bootstrap元素以及添加了一些独特Class来实现.Bootstrap元素我在上一篇文章中涉及到,具体可以参考<ASP.NET MVC使用Bootstrap系列(2)——使用Bootstrap CSS和HTML元素>. 在这篇博客中,我将继续探索B

[备用]权限设计方案、如何使用session、MVC如何使用模板、DropdownList、怎么添加Bootstrape框架、使用ASP.NET MVC 4 Bootstrap Layout Template(VS2012)

1.权限设计方案: http://jingyan.baidu.com/article/9f63fb91ae22bac8410f0e70.html 2.如何使用session: 控制器中使用session namespace me.Controllers { public class LoginController : Controller { // // GET: /Login/ public ActionResult Index() { //设置session this.HttpContext

[ASP.NET MVC] 使用Bootstrap套件

[ASP.NET MVC] 使用Bootstrap套件 前言 在开发Web项目的时候,除了一些天赋异禀的开发人员之外,大多数的开发人员应该都跟我一样,对于如何建构出「美观」的用户接口而感到困扰.这时除了,加入美术人员这个选项之外,开发人员也可以自立自强,为Web项目内加入Bootstrap套件.透过使用Bootstrap套件中各种设计精美的样式.组件,来让Web项目的用户接口更加的美观大气,增加客户对于项目产出的好感度.本篇文章介绍如何在Web项目里使用Bootstrap套件,为自己留个纪录也希