HTML5技术

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

字号+ 作者:H5之家 来源:博客园 2016-08-24 11:00 我要评论( )

前言 我在博客园潜水两三年了,在这里看过很多大神的文章,也学到了很多东西。可以说我是汲取着博客园的营养成长的。 想当年,我也是拿10个G的精神粮食从一个博客园大神那里换来一套开发框架,正式走上开发之路,到后来成为主力开发,再到项目经理再后来顺利

 前言

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

    想当年,我也是拿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; NFine.Data 9 { 仓储接口 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 { 仓储实现 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) { ) 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) { ? true : false; ); MethodCallExpression resultExp = null; var tempData = dbcontext.Set<TEntity>().AsQueryable(); foreach (string item in _order) { string _orderPart = item; _orderPart = Regex.Replace(_orderPart, , " "); string[] _orderArry = _orderPart.Split(' '); string _orderField = _orderArry[0]; bool sort = isAsc; if (_orderArry.Length == 2) { isAsc = _orderArry[? true : false; } ); var property = typeof(TEntity).GetProperty(_orderField); var propertyAccess = Expression.MakeMemberAccess(parameter, property); var orderByExp = Expression.Lambda(propertyAccess, parameter); resultExp = Expression.Call(: , 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) { ? true : false; ); MethodCallExpression resultExp = null; var tempData = dbcontext.Set<TEntity>().Where(predicate); foreach (string item in _order) { string _orderPart = item; _orderPart = Regex.Replace(_orderPart, , " "); string[] _orderArry = _orderPart.Split(' '); string _orderField = _orderArry[0]; bool sort = isAsc; if (_orderArry.Length == 2) { isAsc = _orderArry[? true : false; } ); var property = typeof(TEntity).GetProperty(_orderField); var propertyAccess = Expression.MakeMemberAccess(parameter, property); var orderByExp = Expression.Lambda(propertyAccess, parameter); resultExp = Expression.Call(: , 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、源码下载地址:

     

     

    1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

    相关文章
    • 开源的那些事儿 (一)- 如何看待开源 - LeftNotEasy

      开源的那些事儿 (一)- 如何看待开源 - LeftNotEasy

      2016-08-24 10:00

    • ASP.NET 关于GridView 表格重复列合并 - 小飞飞oo

      ASP.NET 关于GridView 表格重复列合并 - 小飞飞oo

      2016-08-23 10:02

    • 开源:Taurus.MVC 框架 - 路过秋天

      开源:Taurus.MVC 框架 - 路过秋天

      2016-08-06 11:00

    • 功能齐全并且比较时髦的Jquery通用开源框架之【ejq.js】 - 孙凯旋

      功能齐全并且比较时髦的Jquery通用开源框架之【ejq.js】 - 孙凯旋

      2016-08-04 18:00

    网友点评