开源: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、验证码、丰富公共类似
框架代码风格:
数据库、仓库代码
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() == " ")
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[];
bool sort = isAsc;
if (_orderArry.Length == )
{
isAsc = _orderArry[].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 - )).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[];
bool sort = isAsc;
if (_orderArry.Length == )
{
isAsc = _orderArry[].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 - )).Take<TEntity>(pagination.rows).AsQueryable();
return tempData.ToList();
}
}
}
自动映射对象实体
框架界面展示:
支持多皮肤切换
下一篇给大家讲解下如何实现动态皮肤切换
总结:
1:本文并没有详细讲解实现机制。
2:本文并没有详细讲解开发方式。
但,至少你可以:看源码、看API、看Demo,还可以加入技术交流群进行交流分享。
当然,后续我会补充相关文章,更加细化和完善的机制及开发方式。
如果您支持开源精神,在精神层面可以点赞以示鼓励
另外补充:有Bug及漏洞,请私下提交
框架开源地址:
1、源码下载地址:http://download.csdn.net/detail/nfine_2016/9608074
开源:ASP.NET MVC+EF6+Bootstrap开发框架的更多相关文章
- 【开源分享:入门到精通ASP.NET MVC+EF6+Bootstrap】从这里开始,一起搭框架(1)开篇介绍
框架简介 这几年一直在做ASP.NET开发,几年前做项目都是老老实实一行行的写代码,后来发现那些高手基本都会有自己积累起来的代码库,现在称之为开发框架,基础代码不用再去堆,主要精力可以集中在业务逻辑实 ...
- NET MVC+EF6+Bootstrap
开源:ASP.NET MVC+EF6+Bootstrap开发框架 前言 我在博客园潜水两三年了,在这里看过很多大神的文章,也学到了很多东西.可以说我是汲取着博客园的营养成长的. 想当年,我也是拿1 ...
- 基于ASP.NET MVC和Bootstrap搭建响应式个人博客站(一)
1.0 为什么要做这个博客站? www.zynblog.com 在工作学习中,经常要搜索查找各种各样的资料,每次找到相关资料后都会顺手添加到浏览器书签中,时间一长,书签也就满了.而且下次再点击这个 ...
- ASP.NET MVC使用Bootstrap系列(3)——使用Bootstrap 组件
阅读目录 Bootstrap 导航条 列表组 徽章 媒体对象 页头 路径导航 分页 输入框组 按钮式下拉菜单 警告框 进度条 小结 Bootstrap为我们提供了十几种的可复用组件,包括字体图标.下拉 ...
- [ASP.NET MVC] 使用Bootstrap套件
[ASP.NET MVC] 使用Bootstrap套件 前言 在开发Web项目的时候,除了一些天赋异禀的开发人员之外,大多数的开发人员应该都跟我一样,对于如何建构出「美观」的用户接口而感到困扰.这时除 ...
- 开源Asp.Net MVC网上商城BrnShop
开源Asp.Net MVC网上商城BrnShop正式发布,提供源码下载 BrnShop网上商城是以Asp.Net mvc3为基础开发的网上商城,源代码完全开源(企业版的源代码目前还没有完全整理完成,一 ...
- 用开源 ASP.NET MVC 程序 Bonobo Git Server 搭建 Git 服务器(转)
用开源 ASP.NET MVC 程序 Bonobo Git Server 搭建 Git 服务器 现在不用Git,都不好意思说自己是程序员. 当你想用Git,而源代码服务器是Windows系统时,你 ...
- 如何提高码农产量,基于ASP.NET MVC的敏捷开发框架开发随笔一
公司业务量比较大,接了很多项目,为了缩短开发周期老板让我牵头搭建了一个敏捷开发框架. 我们主要的业务是做OA.CRM.ERP一类的管理系统,一个通用的后台搭出来,再配合一些快速开发的组件开发效率能提高 ...
- ASP.NET MVC使用Bootstrap系列(5)——创建ASP.NET MVC Bootstrap Helpers
阅读目录 序言 内置的HTML Helpers 创建自定义的Helpers 使用静态方法创建Helpers 使用扩展方法创建Helpers 创建Fluent Helpers 创建自动闭合的Helper ...
随机推荐
- ASP.NET features need application service database support
搭建的web程序出现如上图所示的错误 原因程序使用以下ASP.NET 特性 Membership (the SqlMembershipProvider class). Role management ...
- CentOS 6.3下配置LVM(逻辑卷管理)
一.简介 LVM是逻辑盘卷管理(Logical Volume Manager)的简称,它是Linux环境下对磁盘分区进行管理的一种机制,LVM是建立在硬盘和分区之上的一个逻辑层,来提高磁盘分区管理的灵 ...
- linux 接口地址全部清除才清理从此接口发出的下一跳路由
接口地址全部清除才清理从此接口发出的下一跳路由 如: eth7配置两个地址 eth7: 192.168.1.1 10.1.1.1 添加一条路由: route add -net 2.2.2.0/24 g ...
- Linux下Redis开机自启(Centos)
废话少说,直接来步骤: 1.设置redis.conf中daemonize为yes,确保守护进程开启. 2.编写开机自启动脚本 vi /etc/init.d/redis 脚本内容如下: # chkcon ...
- margin-top无效的解决方法
先上代码: <div id="content" style=" width:750px; height:300px; background:#C29A29; mar ...
- [转]Java 常用排序算法/程序员必须掌握的 8大排序算法
本文转自:http://www.cnblogs.com/qqzy168/archive/2013/08/03/3219201.html 本文由网络资料整理转载而来,如有问题,欢迎指正! 分类: 1)插 ...
- 《2016ThoughtWorks技术雷达峰会----微服务架构》
微服务架构 王键,ThoughtWorks, 首席咨询师 首先微服务架构的定义,thoughtWorks在2012年3月的技术雷达中这样定义: “微服务架构是一种架构,它提倡将单一应用程序划分为一 ...
- spring mvc拦截器
Java里的拦截器是动态拦截Action调用的对象.它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行,同时也提供了一种可以提取act ...
- bzoj-4517 4517: [Sdoi2016]排列计数(组合数学)
题目链接: 4517: [Sdoi2016]排列计数 Time Limit: 60 Sec Memory Limit: 128 MBSubmit: 846 Solved: 530[Submit][ ...
- POJ3494Largest Submatrix of All 1’s[单调栈]
Largest Submatrix of All 1’s Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 5883 Ac ...