C#编写的代码如果不进行一定程度的混淆和加密,那么是非常容易被反编译进行破解的,特别是对于一些商业用途的C#软件来说,因为盯着的人多,更是极易被攻破。使用Dotfuscator可以实现混淆代码、变量名修改、字符串加密等功能。 这里介绍的是DotfuscatorPro_4.9.7750_2.0 版本,有需要的可以到网上搜索下载https://skydrive.live.com/?cid=d2b11227abf128d8&id=D2B11227ABF128D8%21104。安装 Dotfuscator 好 打开界面,有几个需要配置的地方: Options、Input、Rename、String Encryption、Build,其他的默认即可,下面一一讲解。 Settings->Global Options 这是全局配置选项: 把 Disable String Encryption 设为 NO,即启用字符串加密;检查 Disable Control flow、Dsiable Renaming 也为 NO,即保证控制流和混淆功能打开,其他默认。如下图: Input 选项里 选择你需要混淆加密的 dll、exe文件,其中Library不要勾选,否则有些类、变量等等不会混淆; Rename 选项 勾选“use enhanced overload induction”(使用增强模式),注意:不要勾选下方的“ Do not suppress on serializable types”,即序列化类型的变量不加密,否则编译后可能异常; “Renaming Scheme” 选择“Unprintable”(不可打印字符,即乱码),也可以选择其他如小写字母、大写字符、数字的方式。如下图: String Encryption 选项 include里勾选需要字符串加密的工程文件exe、dll等。 Settings->Build Settings 选项 设置输出目标文件夹,点击上方的按钮即可重新生成新的 exe、dll文件了。 好了,我们来看一下加密混淆后的效果: 原来的代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Program { static readonly int A = B * 10; static readonly int B = 10; //const int A = B * 10; //const int B = 10; public static void Main(string[] args) { Person p = new Person(); Console.WriteLine("A is {0},B is {1} ", A, B); } } public class Person { static int age; […]
View DetailsGoogle 和 Oracle 关于 Java 侵权案的陪审团裁定,谷歌使用 Oracle 创建的 Java 软件来创建 Android 系统是合理使用,不构成版权侵犯。 此判决标志着 Oracle 在 2012 年起诉 Google 关于侵犯 Java 版权的案子正式结束,Google 因此避免了 90 亿美元的赔偿。此案同时也给在编写不同平台上应用程序但没有许可证的程序员们最大的安慰。 甲骨文认为,谷歌需要一个许可才能在 Android 操作系统上使用 Java 编程语言,但是陪审团周四在旧金山联邦法院否认了这种说法,认为谷歌是合理使用代码,符合著作权。 IDC 分析师 Al Hilwa 表示:很多人都松了一口气!判决结果为软件企业提供保障,使得他们在开发各种可互操作的软件时没有法律风险。而数以万计使用 API 的软件开发人员更将将庆祝这一判决结果。谷歌的胜诉解决了他们在开发从游戏到企业应用中一个非常关键的问题。 from:http://www.oschina.net/news/73784/google-defeats-oracle-copyright-java-android
View Details一:背景 我们知道传统的http采用的是“拉模型”,也就是每次请求,每次断开这种短请求模式,这种场景下,client是老大,server就像一个小乌龟任人摆布, 很显然,只有一方主动,这事情就没那么完美了,所以为了能够让server也能主动点,html5就应运而生了,或许大家都知道html5中有两种server的主动 模型,第一种叫做websockect,也就是基于tcp模式的双工通讯,还有一种叫做SSE,也就是客户端来订阅服务器的一种事件模型,当然了,在html5出 来之前,如果要做到服务器主动,我们只能采用变相的longpool和foreverframe勉强实现,而signalR这吊毛就是一个对他们进行了高层封装,也就是说 signalR会在这四种技术中根据浏览器和服务器设置采取最优的一种模式,废话不多说,我们快速建立一个例子。 二:快速搭建 这里我们采用 PersistentConnection模式来构建一个持久连接让大家快速接触下: 1. PersistentConnection 在新建项目中,我们选择”Sig“这里我们就使用默认的名字MyConnection1。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using System.Web; using Microsoft.AspNet.SignalR; namespace WebApplication1 { public class MyConnection1 : PersistentConnection { protected override Task OnConnected(IRequest request, string connectionId) { return Connection.Send(connectionId, "Welcome!"); } protected override Task OnReceived(IRequest request, string connectionId, string data) { return Connection.Broadcast(data); } } } |
在上面,我们简单的看出来了,"持久连接“类有点像socket连接,有OnConnected和OnReceived事件,这里我们就不过多介绍,只要知道 Connection.Send方法中有一个叫做connectionID就好了,而这个connectionID就是客户端和服务器建立连接的唯一标识,比如上面我们看到的 return Connection.Send(connectionId, "Welcome!");就是当客户端连接到服务器之后,服务器主动将客户端推送一个”Welcome",以示欢迎。 2. Startup类 由于signalR采用的是Owin中间件的模式来把signalR和FCL进行隔离,这样的话,大家就可以相互独立,谁也不依赖于谁,也就方便signalR快速独立 发展和更新,而Startup类的Configuration方法就是将一些中间件配置送到Owin管道中,下面我们要做的就是把MyConnection1和"/myconnection" 地址的映射送到Owin管道中,这样当我访问”/myconnection“的时候,就可以触发MyConnection1这个类了,如下图:
1 2 3 4 5 6 7 8 9 10 11 12 |
[assembly: OwinStartup(typeof(WebApplication1.Startup1))] namespace WebApplication1 { public class Startup1 { public void Configuration(IAppBuilder app) { app.MapSignalR<MyConnection1>("/myconnection"); } } } |
3:新建客户端 这里我们采用web客户端的形式来连接server,这就必须引用一些js文件,比如这里的signalR.js和jquery.js,如下图:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title></title> <meta charset="utf-8" /> </head> <body> <script src="/scripts/jquery-1.10.2.js"></script> <script src="/scripts/jquery.signalR-2.1.2.js"></script> <script type="text/javascript"> var conn = $.connection("/myconnection"); conn.start().done(function (data) { console.log("当前clientID=" + data.id); }); //接受服务器的推送 conn.received(function (data) { console.log("server返回的数据: " + data); }); </script> </body> </html> |
上面的代码很简单,第一个就是$.connection("/myconnection")用于找到对应的服务器端的Myconnection处理类,第二个start()方法就是开始建 立连接,后面的 received事件就是获取服务器端推送过来的消息,也就是welcome,对吧。。。然后我们在chrome中试试看。 现在,你可以对应代码看一看,start方法成功的拿到了connectionID,而received方法成功的拿到了服务器推送的"welcome"数据,对吧。 四:用Fiddler监视一下 下面就是我用Fiddler监视到的截图,从图中的http 101状态码就可以看出,这里将http协议转换成了websocket协议。然后我们从websocket 协议中看到了服务器端推送过来的“welcome”数据。 好了,本篇大概就这么说了,是不是非常简单,当然里面还有很多的细节没有说,后续我们来慢慢解读。 from:http://www.cnblogs.com/huangxincheng/p/5280630.html
View DetailsAndroid Studio 1.0 已经放出来了,以后的Android平台开发激昂逐步从Eclipse向Android Studio迁移,为了能不落伍我也特意从Google下载了Android Studio的安装包,并且兴高采烈地创建了我的第一个android项目。但是当运行的时候就他么悲催了。
1 2 3 |
emulator: ERROR: x86 emulation currently requires hardware acceleration! Please ensure Intel <strong>HAXM </strong>is properly installed and usable. CPU acceleration status: HAX kernel module is not installed! |
妈 妈的,模拟器居然启动不起来! 随随便便扔出这样一段话就了事!我就是想开一下模拟器用得着这样子对我吗? 好吧谁让我特能忍呢,迁移的路注定不会一帆风顺。报错信息告诉我说是 HAXM没有开,可是“HAXM”到底是什么呀? 这是Inter官网告诉我的,作用是管理硬件加速的,估计是用了这个东西模拟器就能告别Eclipse时代的龟速。 你也可以在Inter官网下载这个HAXM,当然Android SDK已经集成了这个软件,你需要做的就是找到他,然后安装它就是了。 他的位置放在这个目录下: 当然你的位置可能会不一样,如果找不到就没必要死磕开发了。 如果问题就这样解决了,那也太小儿科了吧;当我双击安装,问题又来了:
1 |
this computer meets the requirements for haxm but intel virtualization technology(VT-x) is not turned onHAXM cannot be installed until VT-x is enable |
1 |
please refer to the intel HAXM documentation for more information |
好吧,继续寻求帮助Inter官方的教程有这样一段话:连接地址:https://software.intel.com/en-us/android/articles/installation-instructions-for-intel-hardware-accelerated-execution-manager-windows Intel VT-x not enabled In some cases, Intel VT-x may be disabled in the system BIOS and must be enabled within the BIOS setup utility. To access the BIOS setup utility, a key must be pressed during the computer’s boot sequence. This key is dependent on which BIOS is used but it is typically the F2, Delete, or Esc key. Within the BIOS setup utility, Intel VT […]
View DetailsStringBuilder sb = new StringBuilder(); sb.AppendFormat("{0:X2}", 10); Response.Write(sb); 输出A X2表示十六进制格式(大写),域宽2位,不足的左边填0。 [csharp] view plain copy int[] recvLen = { 10, 11, 12, 13, 14, 15, 16, 17, 18 }; StringBuilder uid = new StringBuilder(); for (int i = 0; i <= recvLen.Length – 1; i++) uid.AppendFormat("{0:X2}\r\n", recvLen[i]); Console.WriteLine(uid.ToString()); 输出: 0A 0B 0C 0D 0E 0F 10 11 12 from:http://blog.csdn.net/joyhen/article/details/41576841
View Details目录 MVC5 网站开发实践 概述 MVC5 网站开发实践 1、建立项目 从这一部分开始做后台管理,首先是基本框架的 一、Data项目 1、项目添加EntityFramework引用 在Data项目的引用上右键-> 管理NuGet程序包。 在弹出的窗口中选择 EntityFramework 安装 2、添加排序枚举 在Data项目上点右键新建文件夹Type。在文件夹内添加类【OrderType】,代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
//创建2014.12.8 namespace Data.Types { /// <summary> /// 排序类型 /// </summary> public enum OrderType { /// <summary> /// 不排序 /// </summary> No, /// <summary> /// 正序 /// </summary> Asc, /// <summary> /// 倒序 /// </summary> Desc } } |
3、添加数据访问类 在Data项目上点右键新建类输入类名【BaseRepository】,这个类主要负责数数据的存取。 类内添加私有成员DbContext _baseDbContext用来在数据库进行增、删、改和查询。 BaseRepository的构造函数public BaseRepository(DbContext dbContext)中dbContext为数据上下文。在该类中写了一些数据的增删改和查询方法。整个代码如下。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 |
using Ninesky.Data.Types; using System; using System.Collections.Generic; using System.Data.Entity; using System.Linq; using System.Linq.Expressions; namespace Ninesky.Data { /// <summary> /// 数据仓储基类 /// <remarks> /// 创建:2014.12.13 /// </remarks> /// </summary> /// <typeparam name="T"></typeparam> public class BaseRepository<T> where T : class { private DbContext _baseDbContext; /// <summary> /// 构造函数 /// </summary> /// <param name="dbContext">数据上下文</param> public BaseRepository(DbContext dbContext) { _baseDbContext = dbContext; } /// <summary> /// 添加 /// </summary> /// <param name="entity">数据实体</param> /// <param name="isSave">是否立即保存</param> /// <returns></returns> public T Add(T entity, bool isSave = true) { _baseDbContext.Set<T>().Add(entity); if (isSave) _baseDbContext.SaveChanges(); return entity; } /// <summary> /// 批量添加【立即执行】 /// </summary> /// <param name="entities">数据列表</param> /// <returns>添加的记录数</returns> public int AddRange(IEnumerable<T> entities, bool isSave = true) { _baseDbContext.Set<T>().AddRange(entities); return isSave ? _baseDbContext.SaveChanges() : 0; } /// <summary> /// 修改 /// </summary> /// <param name="entity">数据实体</param> /// <param name="isSave">是否立即保存</param> /// <returns></returns> public bool Update(T entity, bool isSave = true) { _baseDbContext.Set<T>().Attach(entity); _baseDbContext.Entry<T>(entity).State = EntityState.Modified; return isSave ? _baseDbContext.SaveChanges() > 0 : true; } /// <summary> /// 删除 /// </summary> /// <param name="entity">数据实体</param> /// <param name="isSave">是否立即保存</param> /// <returns></returns> public bool Delete(T entity, bool isSave = true) { _baseDbContext.Set<T>().Attach(entity); _baseDbContext.Entry<T>(entity).State = EntityState.Deleted; return isSave ? _baseDbContext.SaveChanges() > 0 : true; } /// <summary> /// 批量删除 /// </summary> /// <param name="entities">数据列表</param> /// <param name="isSave">是否立即保存</param> /// <returns>删除的记录数</returns> public int DeleteRange(IEnumerable<T> entities, bool isSave = true) { _baseDbContext.Set<T>().RemoveRange(entities); return isSave ? _baseDbContext.SaveChanges() : 0; } /// <summary> /// 保存 /// </summary> /// <returns>受影响的记录数</returns> public int Save() { return _baseDbContext.SaveChanges(); } /// <summary> /// 是否有满足条件的记录 /// </summary> /// <param name="anyLamdba">条件表达式</param> /// <returns></returns> public bool Any(Expression<Func<T, bool>> anyLamdba) { return _baseDbContext.Set<T>().Any(anyLamdba); } /// <summary> /// 查询记录数 /// </summary> /// <param name="countLamdba">查询表达式</param> /// <returns>记录数</returns> public int Count(Expression<Func<T, bool>> countLamdba) { return _baseDbContext.Set<T>().Count(countLamdba); } /// <summary> /// 查找实体 /// </summary> /// <param name="ID">实体ID</param> /// <returns></returns> public T Find(int ID) { return _baseDbContext.Set<T>().Find(ID); } /// <summary> /// 查找实体 /// </summary> /// <param name="findLambda">Lambda表达式</param> /// <returns></returns> public T Find(Expression<Func<T, bool>> findLambda) { return _baseDbContext.Set<T>().SingleOrDefault(findLambda); } /// <summary> /// 查找所有列表 /// </summary> /// <returns></returns> public IQueryable<T> FindAll() { return FindList<int>(0, T => true, OrderType.No, null); } /// <summary> /// 查找数据列表 /// </summary> /// <param name="number">返回的记录数【0-返回所有】</param> /// <param name="whereLandba">查询条件</param> /// <param name="orderType">排序方式</param> /// <param name="orderLandba">排序条件</param> /// <returns></returns> public IQueryable<T> FindList<TKey>(int number, Expression<Func<T, bool>> whereLandba, OrderType orderType, Expression<Func<T, TKey>> orderLandba) { IQueryable<T> _tIQueryable = _baseDbContext.Set<T>().Where(whereLandba); switch (orderType) { case OrderType.Asc: _tIQueryable = _tIQueryable.OrderBy(orderLandba); break; case OrderType.Desc: _tIQueryable = _tIQueryable.OrderByDescending(whereLandba); break; } if (number > 0) _tIQueryable = _tIQueryable.Take(number); return _tIQueryable; } /// <summary> /// /// </summary> /// <typeparam name="TKey">排序字段类型</typeparam> /// <param name="pageIndex">页码【从1开始】</param> /// <param name="pageNumber">每页记录数</param> /// <param name="totalNumber">总记录数</param> /// <param name="whereLandba">查询表达式</param> /// <param name="orderType">排序类型</param> /// <param name="orderLandba">排序表达式</param> /// <returns></returns> public IQueryable<T> FindPageList<TKey>(int pageIndex, int pageNumber, out int totalNumber, Expression<Func<T, bool>> whereLandba, OrderType orderType, Expression<Func<T, TKey>> orderLandba) { IQueryable<T> _tIQueryable = _baseDbContext.Set<T>().Where(whereLandba); totalNumber = _tIQueryable.Count(); switch (orderType) { case OrderType.Asc: _tIQueryable = _tIQueryable.OrderBy(orderLandba); break; case OrderType.Desc: _tIQueryable = _tIQueryable.OrderByDescending(whereLandba); break; } _tIQueryable = _tIQueryable.Skip((pageIndex - 1) * pageNumber).Take(pageNumber); return _tIQueryable; } } } |
4、添加业务逻辑基类 在data项目右键添加【BaseService】,此类通过调用BaseRepository进行数据处理,作为业务逻辑的基类,其他业务类继承自此类。这个类的方法与BaseRepository比较相似,建立此类的主要体现分层的思路,一些数据访问的异常处理应该放在此类中。代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 |
using Ninesky.Data.Types; using System; using System.Collections.Generic; using System.Data.Entity; using System.Linq; using System.Linq.Expressions; namespace Ninesky.Data { /// <summary> /// 业务逻辑基类 /// <remarks> /// 创建:2014.12.13 /// </remarks> /// </summary> public class BaseService<T> where T : class { private BaseRepository<T> _baseRepository; /// <summary> /// 创建业务逻辑类 /// </summary> /// <param name="dbContext">数据上下文</param> public BaseService(DbContext dbContext) { _baseRepository = new BaseRepository<T>(dbContext); } /// <summary> /// 添加 /// </summary> /// <param name="entity">数据实体</param> /// <returns>添加后的数据实体</returns> public T Add(T entity, bool isSave = true) { return _baseRepository.Add(entity, isSave); } ///// <summary> ///// 添加【必须先实例化才能使用】 ///// </summary> ///// <param name="entity">数据实体</param> ///// <returns>添加后的记录ID</returns> //public virtual int Add(T entity) { return 0; } /// <summary> /// 批量添加 /// </summary> /// <param name="entities">数据列表</param> /// <param name="isSave">是否立即保存</param> /// <returns></returns> public int AddRange(IEnumerable<T> entities, bool isSave = true) { return _baseRepository.AddRange(entities, isSave); } /// <summary> /// 修改 /// </summary> /// <param name="entity">数据实体</param> /// <param name="isSave">是否立即保存</param> /// <returns></returns> public bool Update(T entity, bool isSave = true) { return _baseRepository.Update(entity, isSave); } /// <summary> /// 删除 /// </summary> /// <param name="entity">数据实体</param> /// <param name="isSave">是否立即保存</param> /// <returns></returns> public bool Delete(T entity, bool isSave = true) { return _baseRepository.Delete(entity, isSave); } /// <summary> /// 批量删除 /// </summary> /// <param name="entities">数据列表</param> /// <param name="isSave">是否立即保存</param> /// <returns>删除的记录数</returns> public int DeleteRange(IEnumerable<T> entities, bool isSave = true) { return _baseRepository.DeleteRange(entities, isSave); } /// <summary> /// 保存 /// </summary> /// <returns>受影响的记录数</returns> public int Save() { return _baseRepository.Save(); } /// <summary> /// 查询记录数 /// </summary> /// <param name="countLamdba">查询表达式</param> /// <returns>记录数</returns> public int Count(Expression<Func<T, bool>> countLamdba) { return _baseRepository.Count(countLamdba); } /// <summary> /// 查找实体 /// </summary> /// <param name="ID">实体ID</param> /// <returns></returns> public T Find(int ID) { return _baseRepository.Find(ID); } /// <summary> /// 查找实体 /// </summary> /// <param name="findLambda">Lambda表达式</param> /// <returns></returns> public T Find(Expression<Func<T, bool>> findLambda) { return _baseRepository.Find(findLambda); } /// <summary> /// 查找所有列表 /// </summary> /// <returns></returns> public IQueryable<T> FindAll() { return _baseRepository.FindAll(); } /// <summary> /// 查找数据列表 /// </summary> /// <param name="number">返回的记录数【0-返回所有】</param> /// <param name="whereLandba">查询条件</param> /// <param name="orderType">排序方式</param> /// <param name="orderLandba">排序条件</param> /// <returns></returns> public IQueryable<T> FindList<TKey>(int number, Expression<Func<T, bool>> whereLandba, OrderType orderType, Expression<Func<T, TKey>> orderLandba) { return _baseRepository.FindList<TKey>(number, whereLandba, orderType, orderLandba); } /// <summary> /// /// </summary> /// <typeparam name="TKey">排序字段类型</typeparam> /// <param name="pageIndex">页码【从1开始】</param> /// <param name="pageNumber">每页记录数</param> /// <param name="totalNumber">总记录数</param> /// <param name="whereLandba">查询表达式</param> /// <param name="orderType">排序类型</param> /// <param name="orderLandba">排序表达式</param> /// <returns></returns> public IQueryable<T> FindPageList<TKey>(int pageIndex, int pageNumber, out int totalNumber, Expression<Func<T, bool>> whereLandba, OrderType orderType, Expression<Func<T, TKey>> orderLandba) { return FindPageList<TKey>(pageIndex, pageNumber, out totalNumber, whereLandba, orderType, orderLandba); } } } |
二、User项目 1、建立管理员模型 在User项目的引用上点右键添加System.ComponentModel.DataAnnotations的引用和Ninesky.Data项目、E的引用。 在User项目上点右键新建文件夹Models,在文件夹中添加类Administrator。代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
using System; using System.ComponentModel.DataAnnotations; namespace Ninesky.User.Models { /// <summary> /// 管理员模型 /// <remarks> /// 创建:2014.12.13 /// </remarks> /// </summary> public class Administrator { [Key] public int AdministratorID { get; set; } /// <summary> /// 管理员账号 /// </summary> [Required(ErrorMessage = "必须输入{0}")] [Display(Name = "管理员账号")] public string Account { get; set; } /// <summary> /// 管理员名称 /// </summary> [Required(ErrorMessage = "必须输入{0}")] [Display(Name = "管理员名称")] public string Name { get; set; } /// <summary> /// 密码 /// </summary> [Required(ErrorMessage = "必须输入{0}")] [Display(Name = "密码")] [DataType(DataType.Password)] public string Password { get; set; } /// <summary> /// 创建时间 /// </summary> public DateTime CreateDate { get; set; } /// <summary> /// 上次登陆Ip /// </summary> public string LoginIp { get; set; } /// <summary> /// 上次登陆日期 /// </summary> public Nullable<DateTime> LoginTime { get; set; } } } |
2、建立管理员业务逻辑类 在User项目上点右键添加AdministratorService类,该类继承自BaseService。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Ninesky.Data; using Ninesky.User.Models; namespace Ninesky.User { /// <summary> /// 管理员业务逻辑类 /// <remarks> /// 创建:2014.12.13 /// </remarks> /// </summary> public class AdministratorService:BaseService<Administrator> { public AdministratorService(DbContext dbContext) : base(dbContext) { } } } |
三、Website项目 1、添加User项目的引用上右键添加对User项目的引用。 2、建立数据上下文 在Site项目上点右键添加类【NineskyDbContext】,继承自DbContext
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Data.Entity; using Ninesky.User.Models; namespace Ninesky.Website { /// <summary> /// 网站数据上下文 /// <remarks> /// 创建:2014.12.13 /// </remarks> /// </summary> public class NineskyDbContext : DbContext { public DbSet<Administrator> Administrators { get; set; } public NineskyDbContext() : base("name=NineskyConnection") { Database.SetInitializer<NineskyDbContext>(new CreateDatabaseIfNotExists<NineskyDbContext>()); } } } |
3、建立数据库连接 打开Web.config文件,在</configSections><appSettings>之间添加数据库的连接
1 2 3 |
<connectionStrings> <add name="NineskyConnection" connectionString="Data Source=(LocalDb)\v11.0;AttachDbFilename=|DataDirectory|\Ninesky.mdf;Initial Catalog=Ninesky;Integrated Security=True;MultipleActiveResultSets=True" providerName="System.Data.SqlClient" /> </connectionStrings> |
4、建立简单工厂 在Website项目上点右键添加类【ContextFactory】,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
using System.Runtime.Remoting.Messaging; namespace Ninesky.Website { /// <summary> /// 上下文简单工厂 /// <remarks> /// 创建:2014.12.13 /// </remarks> /// </summary> public class ContextFactory { /// <summary> /// 获取当前数据上下文 /// </summary> /// <returns>数据上下文</returns> public static NineskyDbContext GetCurrentContext() { NineskyDbContext _nineskyDbContext = CallContext.GetData("NineskyDbContext") as NineskyDbContext; if (_nineskyDbContext == null) { _nineskyDbContext = new NineskyDbContext(); CallContext.SetData("NineskyDbContext", _nineskyDbContext); } return _nineskyDbContext; } } } |
5、Config区域主界面 在Site项目的Config区域的Controller文件夹上点右键添加Home控制器,类型选择【MVC5控制器-空】。在添加的控制器中添加【Index】 action
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace Ninesky.Website.Areas.Config.Controllers { /// <summary> /// 主界面 /// <remarks> /// 创建:2014.12.13 /// </remarks> /// </summary> public class HomeController : Controller { // GET: Config/Home public ActionResult Index() { return View(); } } } |
在Config区域Views/Share文件夹添加布局页【_Layout.cshtml】 在Index action上右键添加一个空视图 =========================== 代码下载:http://pan.baidu.com/s/1sj6Ya2D from:http://www.cnblogs.com/mzwhj/p/4155896.html
View Details单条: WeiXinOpenId weiXinOpenId = _db.WeiXinOpenId.Find(1); _db.WeiXinOpenId.Remove(weiXinOpenId); _db.SaveChanges(); 另一种方法: WeiXinOpenId weiXinOpenId = _db.WeiXinOpenId.Find(1); _db.Entry(weiXinOpenId).State = EntityState.Deleted; _db.SaveChanges(); ================================================ 批量: var openids = _db.WeiXinOpenId.Where(item => item.Uid == uid).ToList(); _db.WeiXinOpenId.RemoveRange(openids); return _db.SaveChanges();
View DetailsC#中的webbrowser控件比较好用. 下面本人搜索整理的几个小技巧. 1. 从C#中取得javascript的变量值. using mshtml; using System.Reflection; IHTMLDocument2 vDocument = webBrowser1.Document.DomDocument as IHTMLDocument2; IHTMLWindow2 vWindow = vDocument.parentWindow; Type vWindowType = vWindow.GetType(); object xpt = vWindowType.InvokeMember("_xpt", BindingFlags.GetProperty, null, vWindow, new object[] { }); xpt 就是取得的javascript中的变量"_xpt"的值. 2. 禁止显示脚本错误窗口. webBrowser1.ScriptErrorsSuppressed = true; 3. 如何取弹出网页的网址 string newUrl = webBrowser_temp.Document.ActiveElement.GetAttribute("href"); 4. 禁止打开新窗口, 在本窗口打开. 4.1 设置属性. void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { //将所有的链接的目标,指向本窗体 foreach (HtmlElement archor in this.webBrowser1.Document.Links) { archor.SetAttribute("target", "_self"); } //将所有的FORM的提交目标,指向本窗体 foreach (HtmlElement form in this.webBrowser1.Document.Forms) { form.SetAttribute("target", "_self"); } } 将 WebBrowser 的 AllowWebBrowserDrop 设为 false 将 WebBrowser 的 WebBrowserShortcutsEnabled […]
View Details今天一位同事想写一个全屏幕截图的代码。当然要实现的第一步是能够获取整个屏幕的位图,记得Win32 API的CreateDC, BitBlt等函数可以使用。于是上网查了下,果然屏幕截图用这些函数。但winform已经可以把API都忘记了,所以得寻找一个无Win32 API的实现方式。综合了网上的实现,以及自己的一些设计,实现思路如下: 1. 开始截图时,创建一个与屏幕大小一样的位图,然后用Graphics.CopyFromScreen()把屏幕位图拷贝到该位图上。这是很关键的一步,这样所有的操作就都可以在该位图上进行了,而无实际屏幕无关了。 复制代码代码如下: Code int width = Screen.PrimaryScreen.Bounds.Width; int height = Screen.PrimaryScreen.Bounds.Height; Bitmap bmp = new Bitmap(width, height); using (Graphics g = Graphics.FromImage(bmp)) { g.CopyFromScreen(0, 0, 0, 0, new Size(width, height)); } 2. 接下来为了方便在这之上进行截图,有一个很重要的设计实现方式:用全屏幕窗体代替现有真实屏幕,这样就可以把截图过程的所有操作都在那个窗体上实现(该窗体设置成无边框,高宽等于屏幕大小即可),另外为了显示掩蔽效果(只能正常显示选择的部分屏幕内容,而其实部分用一个如半透明层覆盖),就添加一层半透明位置位图。具体代码如下: 复制代码代码如下: Code public partial class FullScreenForm : Form { private Rectangle rectSelected = Rectangle.Empty; private bool isClipping = false; private Bitmap screen; private Bitmap coverLayer = null; private Color coverColor; private Brush rectBrush = null; private Bitmap resultBmp = null; public FullScreenForm(Bitmap screen) { InitializeComponent(); int width = Screen.PrimaryScreen.Bounds.Width; int […]
View Details有时需要用WebBrowser加载URL,来实现某些功能。而这时,我们就不希望所打开的页面中的链接,在新窗口中打开,因为这样的话,实际上是用系统默认的浏览器打开了,从而脱离了你的WebBrowser,也就不能被你所控制了。 要解决这个问题,可以使用下面的方法: 第一种解决该当推荐使用 [code=csharp] private void webBrowser1_NewWindow(object sender, CancelEventArgs e) { string url = ((WebBrowser)sender).StatusText; webBrowser1.Navigate(url); e.Cancel = true; }[/code] StatusText就是要跳转到的Url e.Cancel = true;是取消新窗口打开, 第二种方法 假设WebBrowser的Name是 webBrowser1 简单方法-利用加载完成事件将所有的链接和form的target值改为"_seft": [code=csharp]private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { //将所有的链接的目标,指向本窗体 foreach (HtmlElement archor in this.webBrowser1.Document.Links) { archor.SetAttribute("target", "_self"); } //将所有的FORM的提交目标,指向本窗体 foreach (HtmlElement form in this.webBrowser1.Document.Forms) { form.SetAttribute("target", "_self"); } } 取消新窗口事件 ? private void webBrowser1_NewWindow(object sender, CancelEventArgs e) { e.Cancel = true; }[/code] 将 WebBrowser 的 AllowWebBrowserDrop 设为 false(禁止拖放) 将 WebBrowser 的 WebBrowserShortcutsEnabled 设为 false(禁止使用快捷键)将 WebBrowser 的 IsWebBrowserContextMenuEnabled 设为 false(禁止右键上下文菜单) from:http://www.sufeinet.com/thread-2970-1-1.html
View Details