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

Posted DotNet

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了开源:ASP.NET MVC+EF6+Bootstrap开发框架相关的知识,希望对你有一定的参考价值。


来源:NFine

链接:cnblogs.com/huanglin/p/5783900.html#top#undefined


框架名称: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、验证码、丰富公共类似


    框架代码风格:


    using NFine.Code;

    using System;

    using System.Collections.Generic;

    using System.Data.Common;

    using System.Linq;

    using System.Linq.Expressions;


    namespace NFine.Data

    {

        /// <summary>

        /// 仓储接口

        /// </summary>

        /// <typeparam name="TEntity">实体类型</typeparam>

        public interface IRepositoryBase<TEntity> where TEntity : class,new()

        {

            int Insert(TEntity entity);

            int Insert(List<TEntity> entitys);

            int Update(TEntity entity);

            int Delete(TEntity entity);

            int Delete(Expression<Func<TEntity, bool>> predicate);

            TEntity FindEntity(object keyValue);

            TEntity FindEntity(Expression<Func<TEntity, bool>> predicate);

            IQueryable<TEntity> IQueryable();

            IQueryable<TEntity> IQueryable(Expression<Func<TEntity, bool>> predicate);

            List<TEntity> FindList(string strSql);

            List<TEntity> FindList(string strSql, DbParameter[] dbParameter);

            List<TEntity> FindList(Pagination pagination);

            List<TEntity> FindList(Expression<Func<TEntity, bool>> predicate, Pagination pagination);

        }

    }


    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();

            }

        }

    }


    自动映射对象实体


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

     

    框架界面展示:


    支持多皮肤切换


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


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


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

     

     

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


    总结:


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


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


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


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


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


    框架开源地址:


    ------------------ 推荐 ------------------


    范品社推出了十几款程序员、电影、美剧和物理题材的极客T恤单件 ¥59.9、两件减¥12、四件减¥28,详见网店商品页介绍。

    淘口令:复制以下红色内容,然后打开手淘即可购买

    范品社,使用¥极客T恤¥抢先预览(长按复制整段文案,打开手机淘宝即可进入活动内容)

    以上是关于开源:ASP.NET MVC+EF6+Bootstrap开发框架的主要内容,如果未能解决你的问题,请参考以下文章

    如何使用 MVC3 ASP.NET 4.5 和 EF6 基于实体属性注释对 TextBoxFor 进行舍入

    在 asp.net MVC5 EF6 中使用流利的 api 映射表?

    ASP.NET MVC5+EF6搭建三层实例

    如何仅保存/更新父实体而不将其子实体保存在 asp.net mvc 的 EF6 中?

    ASP.NET MVC 4 EF6 无法连接到 SQL Server Express 数据库

    ASP.NET MVC Core/6:EF 6 脚手架错误