当前位置: 首页 > 编程日记 > 正文

开源: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

转载于:https://www.cnblogs.com/huanglin/p/5783900.html

相关文章:

【iOS官方文档翻译】iOS的蓝牙连接、数据接收及发送

说明&#xff1a;苹果官方开发文档中涉及一些名词&#xff1a;Central&#xff08;中心设备&#xff09;、Peripheral&#xff08;外围设备&#xff09;、advertising&#xff08;广告&#xff09;、Services&#xff08;服务&#xff09;、Characteristic&#xff08;特征&…

checkbox全选与反选

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><title>全选与反选</title><meta http-equiv"Content-Type" content"text/html;…

元组、列表及其特性

1、 #元组&#xff1a;带了紧箍咒的列表&#xff0c;不可直接修改元组内容 #元组本身不可变数据类型&#xff0c;没有增删改差 #元组内可以存储任意数据类型 t(1,2,3,4.2,star) print t,type(t) #元组内包含可变数组类型&#xff0c;可以间接修改元组内容 t1([1,2,3.3],4,5)…

JZOJ #4722 跳楼机 (最短路模型的完美转化)

题目描述&#xff1a; 给出$h,x,y,z$&#xff0c;求在$h$以内&#xff0c;$x,y,z$可以凑出多少个不同的数。$(1\leq{h}\leq{10^{18}},1\leq{x,y,z}\leq{10^5})$ 解题思路&#xff1a; 直接做显然不好做。我们考虑取$n$个$y$和$m$个$z$&#xff0c;然后再加上$x,2*x,3*x\cdots$&…

【C++】STL队列和栈的使用

C的STL标准模板库提供了队列和栈的基本操作。下面通过两个demo分别介绍STL队列和STL栈的使用。 Demo1&#xff1a;STL队列 【题目】卡片游戏&#xff08;题目来自刘汝佳《算法竞赛入门》&#xff09; 桌上又一叠牌&#xff0c;从第一张牌&#xff08;即位于顶面的牌&#xf…

mongodb的shell命令

MongoDB常用命令&#xff1a; 超级用户相关&#xff1a; use admin #增加或修改用户密码 db.addUser(ixigua,pwd) #查看用户列表 db.system.users.find() #用户认证 db.auth(ixigua,pwd) #删除用户 db.removeUser(mongodb) #查看所有用户 show users #查看所有数据库 show dbs …

字典、集合及其特性

1、 字典的定义 """ 字典是一个无序的数据集合&#xff0c;使用print输出字典的时候 通常输出的顺序和定义的顺序是不一致的 """ message { name:tom, age:18, height:1.80, weight:75.5 } print message s {} prin…

[HDOJ2819]Swap(二分图最大匹配, 匈牙利算法)

题目链接&#xff1a;http://acm.split.hdu.edu.cn/showproblem.php?pid2819 题意&#xff1a;给一张n*n的01矩阵&#xff0c;可以任意交换其中的行或者列&#xff0c;问是否可以交换出来一个对角线上都是1的矩阵。 按行列号建图&#xff0c;如果(i,j)为1的话&#xff0c;则i和…

脚本路径问题_dirname

pwd可获取命令当前的路径 可是若我们想在脚本中获取脚本所在文件夹的路径&#xff0c;这种方法是不够用的。 例如&#xff0c;我们的脚本放在/home/user/script/下&#xff0c;名字叫做getpath.sh getpath.sh有一行脚本是了local_path$(pwd) 现在我们在/home/user/下&#xff0…

【iOS官方文档翻译】iOS蓝牙的基本概念

之前写了【iOS官方文档翻译】iOS的蓝牙连接、数据接收及发送一文&#xff0c;介绍了怎样进行蓝牙通讯&#xff0c;但是很多基本概念没有进行解释&#xff0c;看起来可能有点吃力&#xff0c;所以现在再翻译一篇苹果对官方蓝牙4.0一些基本概念介绍的文章。 1.中心设备和外围设备…

元组、列表、字典及集合练习

列表练习题&#xff1a; #假定有下面这样的列表: #names [lily, denny, jenny, apple] #输出结果为:I have lily,denny, jenny and apple. names [lily, denny, jenny, apple] print I have ,.join(names[:-1]) and names[-1] 2、后台管理前台会员信息 要求&#…

【iOS】sqlite3的使用(増删改查)

目录&#xff1a; 一、sqlite3常用函数 二、将sqlite3集成到项目&#xff0c;实现増删改查 三、封装DBManager 四、Demo 一、sqlite3常用函数及解释 &#xff08;1&#xff09;sqlite3_open: 用来创建和打开数据库文件&#xff0c;接收两个参数&#xff0c;第一个是数据库…

网上搜集了点资料,学web的人互相分享共同进步吧(php编码的好习惯必须养成)...

网上搜集了点资料&#xff0c;学web的人互相分享共同进步吧 一、优秀的代码应该是什么样的&#xff1f; 优秀的PHP代码应该是结构化的。大段的代码应该被分割整理成一个个函数或方法&#xff0c;而那些不起眼的小段代码则应该加上注释&#xff0c;以便日后清楚它们的用途。而且…

div模拟textarea文本域轻松实现高度自适应——张鑫旭

by zhangxinxu from http://www.zhangxinxu.com本文地址&#xff1a; http://www.zhangxinxu.com/wordpress/?p1362 一、关于textarea文本域以及高度自适应 textarea标签为表单元素&#xff0c;一般用在多行文字的输入。在web应用上常见的是评论输入框&#xff0c;微博信息输入…

【iOS】Mapkit的使用:地图显示、定位、大头针、气泡等

以前做项目用高德地图SDK&#xff0c;需要注册账号和AppID&#xff0c;然后下载SDK集成到项目中&#xff0c;比较麻烦&#xff0c;这几天看了下苹果自带的MapKit框架&#xff0c;感觉挺好用&#xff0c;官方文档也介绍得很详细&#xff0c;所以按照官方文档写了个demo&#xff…

java.lang.NoSuchMethodError: org.springframework.core.io.ResourceEditor错误

一般是jar包冲突&#xff0c;或者某些jar包版本不同。 如上&#xff0c;spring其他包的版本均为4.2.5&#xff0c;而spring-webmvc的jar包为1.2.6版本&#xff0c;造成版本冲突。 把该包版本改为4.2.5&#xff0c;宣告成功&#xff01; 转载于:https://www.cnblogs.com/toSeeMy…

SDUTOJ 1293 乘积最大的分解(数论)

乘积最大的分解思路&#xff1a; 让分解出来的因子有尽可能多的3&#xff0c;剩下的用2补全。 最开始思路错了&#xff0c;WA了好长时间 &#xff01; 函数中n 1的情况应该是不用&#xff0c;经测试数据中没有这组。 *注意用 long long 99的时候会超int的数据范围 1 #include …

列表及字典生成式

列表生成式&#xff1a; 列表生成式就是一个用来生成列表的特定语法形式的表达式。 语法格式&#xff1a; [exp for iter_var in iter] 迭代iter中的每个元素&#xff1b; 每次迭代都先把结果赋值给iter_var&#xff0c;然后通过exp得到一个新的计算值&#xff1b; 最后把…

[SQL基础教程] 1-5 表的删除和更新

[SQL基础教程] 1-5 表的删除和更新 表的删除 语法DROP TABLE <表名>; 法则 1-12 删除的表无法恢复 表定义的更新 语法ALTER TABLE<表名> ADD COLUMN<列的定义>; // 添加列 ALTER TABLE<表名> DROP COLUMN<列的定义>; // 删除列 ps: **Oracle、SQ…

【iOS】自定义控件入门:可拖动的环形进度

有时候UIKit的标准控件并不能满足我们的需求&#xff0c;因此我们可以通过自定义控件得到满足我们需求的控件&#xff0c;例如这篇文章将教你如何自定义一个圆形的进度条&#xff0c;并且用户可以通过拖动进度条上的手柄来改变进度值。主要参考了这篇文章&#xff1a;HOW TO BU…

在.NET2.0中解析Json和Xml

在.NET2.0中解析Json和Xml 在.NET解析json有很多方法&#xff0c;这里介绍最简单也用的最多的一种。 一、添加引用 解析Json&#xff0c;先下载开源控件 Newtonsoft.Json.dll 下载地址&#xff1a;http://files.cnblogs.com/gosky/Newtonsoft.Json%E9%9B%86%E5%90%88.zip 解压以…

虚拟机的基本操作

1、用户界面 [kioskfoundation156 Desktop]$ kiosk #打开shell的用户 #分隔符 foundation156 #主机名称 Desktop #工作目录名称 $ ##身份提示符&#xff0c;#表示超级用户&#xff0c;$表示普通用户 特别注意&a…

strong assign属性

strong:这要求运行时自动地保留对这个对象的引用。换而言之&#xff0c;ARC&#xff08;Automatic Reference Counting&#xff09;在运行时会一直把这个对象保留在内存里&#xff0c;直到它不再被任何其他对象引用。之后&#xff0c;其所占的内存会被自动释放。assign:表示这…

iOS7的界面上移问题

第一种方法&#xff1a;修改BaseSDK XCode5的默认BaseSDK是iOS7&#xff0c;所以要修改成工程文件创建时的BaseSDK。但是XCode5中默认只带有iOS7的SDK&#xff0c;所以要想能做到更改SDK&#xff0c;我们就要添加旧的SDK。 1.从苹果开发者中心下载旧版本XCode&#xff0c;https…

【Android】ActionBar的使用(1)

前&#xff08;fei&#xff09;言&#xff08;hua&#xff09;&#xff1a;转行iOS开发半年&#xff0c;很久没接触Android了&#xff0c;前几天去上课&#xff0c;听着实在无聊&#xff0c;随手拿了同学的一本《Android UI设计》&#xff0c;发现有好多基础知识自己虽然用过&a…

装饰器及例题分析

知识点&#xff1a; 装饰器的定义&#xff1a; - 装饰器的实现是函数里面嵌套函数; - 装饰器的本质是一个函数&#xff0c; 它可以让其他函数在不需要做任何代码改动的前提下增加额外的功能; - 装饰器需要传递一个函数&#xff0c; 返回值也是一个函数对象. 1、map函数 def …

iOS开发系列--让你的应用“动”起来

概览 在iOS中随处都可以看到绚丽的动画效果&#xff0c;实现这些动画的过程并不复杂&#xff0c;今天将带大家一窥iOS动画全貌。在这里你可以看到iOS中如何使用图层精简非交互式绘图&#xff0c;如何通过核心动画创建基础动画、关键帧动画、动画组、转场动画&#xff0c;如何通…

ios app 砸壳

这里介绍使用dumpdecrypted砸壳。原理是用DYLD_INSERT_LIBRARIES这个环境变量加载脱壳的动态链接库dumpdecrypted.dylib 1.ssh连接上越狱的机器&#xff0c;输入密码alpine ssh root192.168.7.116 2.打开要砸的app&#xff0c;ps aux | grep var找到它的目录 yigewangde-iPhone…

基于visual Studio2013解决面试题之0804复杂链表

&#xfeff;&#xfeff;&#xfeff;题目解决代码及点评/*复杂链表的拷贝&#xff0c;现在有一个复杂链表&#xff0c;完成一个clone函数拷贝一个链表复杂链表是指struct Node{struct Node* _next;struct Node* _sibling; // sibling指向链表中任意一个节点&#xff0c;或者…

python考试编程题

3. a: while True: s raw_input(变量名为:) if s exit: print 退出 break #判断是否由字母或下划线组成 if s[0].isalpha() or s[0] _: for i in s[1:]: if not (i.isalnum() or i _): print %s变量…