经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C# » 查看文章
C#NPOI.RabbitMQ.EF.Attribute.HttpRuntime.Cache.AD域.List<T>根据指定字段去重.前端JQuery.Cache.I18N(多语言).data-xx(自定义属性)
来源:cnblogs  作者:高1234  时间:2018/12/17 9:51:50  对本文有异议

使用NPOI 操作Excel

          个人使用的电脑基本默认安装Excel 操作起来

                       调用Excel的组件便可.如果是一台服务器.没有安装Excel,也就无法调用Excel组件.

                                  在此推荐第三方插件.NPOI 支持XLS(2007)和XLSX(2012)读写.

  1. using NPOI.HSSF.UserModel;
  2. using NPOI.SS.UserModel;
  3. using NPOI.XSSF.UserModel;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Configuration;
  7. using System.Data;
  8. using System.IO;
  9. namespace WebApplication1.Helper
  10. {
  11. public class ExcelHelper : IDisposable
  12. {
  13. private string fileName = null; //文件名
  14. private IWorkbook workbook = null;
  15. private FileStream fs = null;
  16. private bool disposed;
  17. public ExcelHelper(string fileName)
  18. {
  19. this.fileName = fileName;
  20. disposed = false;
  21. fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);
  22. if (fileName.IndexOf(".xlsx") > 0) // 2007版本
  23. workbook = new XSSFWorkbook(fs);
  24. else if (fileName.IndexOf(".xls") > 0) // 2003版本
  25. workbook = new HSSFWorkbook(fs);
  26. }
  27. public List<string> SheetName
  28. {
  29. get
  30. {
  31. List<string> data = null;
  32. if (workbook != null)
  33. {
  34. data = new List<string>();
  35. for (int i = 0; i < workbook.NumberOfSheets; i++)
  36. {
  37. data.Add(workbook.GetSheetAt(i).SheetName.ToString());
  38. }
  39. }
  40. return data;
  41. }
  42. }
  43. public int SheetCount
  44. {
  45. get
  46. {
  47. return workbook == null ? 0 : workbook.NumberOfSheets;
  48. }
  49. }
  50. /// <summary>
  51. /// 将excel中的数据导入到DataTable中
  52. /// </summary>
  53. /// <param name="sheetName">excel工作薄sheet的名称</param>
  54. /// <param name="isFirstRowColumn">第一行是否是DataTable的列名</param>
  55. /// <returns>返回的DataTable</returns>
  56. public DataTable ExcelToDataTable(string sheetName, bool isFirstRowColumn)
  57. {
  58. ISheet sheet = null;
  59. DataTable data = new DataTable();
  60. int startRow = 0;
  61. try
  62. {
  63. //fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);
  64. //if (fileName.IndexOf(".xlsx") > 0) // 2007版本
  65. // workbook = new XSSFWorkbook(fs);
  66. //else if (fileName.IndexOf(".xls") > 0) // 2003版本
  67. // workbook = new HSSFWorkbook(fs);
  68.  
  69.  
  70. if (sheetName != null)
  71. {
  72. sheet = workbook.GetSheet(sheetName);
  73. if (sheet == null) //如果没有找到指定的sheetName对应的sheet,则尝试获取第一个sheet
  74. {
  75. sheet = workbook.GetSheetAt(0);
  76. }
  77. }
  78. else
  79. {
  80. sheet = workbook.GetSheetAt(0);
  81. }
  82. if (sheet != null)
  83. {
  84. IRow firstRow = sheet.GetRow(0);
  85. int cellCount = firstRow.LastCellNum; //一行最后一个cell的编号 即总的列数
  86.  
  87. if (isFirstRowColumn)
  88. {
  89. for (int i = firstRow.FirstCellNum; i < cellCount; ++i)
  90. {
  91. ICell cell = firstRow.GetCell(i);
  92. if (cell != null)
  93. {
  94. string cellValue = cell.StringCellValue;
  95. if (cellValue != null)
  96. {
  97. DataColumn column = new DataColumn(cellValue);
  98. data.Columns.Add(column);
  99. }
  100. }
  101. }
  102. startRow = sheet.FirstRowNum + 1;
  103. }
  104. else
  105. {
  106. startRow = sheet.FirstRowNum;
  107. }
  108. //最后一列的标号
  109. int rowCount = sheet.LastRowNum;
  110. for (int i = startRow; i <= rowCount; ++i)
  111. {
  112. IRow row = sheet.GetRow(i);
  113. if (row == null) continue; //没有数据的行默认是null       
  114. DataRow dataRow = data.NewRow();
  115. for (int j = row.FirstCellNum; j < cellCount; ++j)
  116. {
  117. if (row.GetCell(j) != null) //同理,没有数据的单元格都默认是null
  118. dataRow[j] = row.GetCell(j).ToString();
  119. }
  120. data.Rows.Add(dataRow);
  121. }
  122. }
  123. return data;
  124. }
  125. catch (Exception ex)
  126. {
  127. Console.WriteLine("Exception: " + ex.Message);
  128. return null;
  129. }
  130. }
  131. public static void CreateExcel(string projectName)
  132. {
  133. try
  134. {
  135. string fileName = $"{projectName}.xlsx"; // 文件名称
  136. string filePath = $"{ConfigurationManager.AppSettings["file"].ToString()}" + "\\" + fileName;
  137. // 2.解析单元格头部,设置单元头的中文名称
  138. XSSFWorkbook workbook = new XSSFWorkbook();
  139. // 工作簿
  140. ISheet sheet = workbook.CreateSheet("sheet");
  141. //#region 设置Excel表格第一行的样式
  142. //IRow titleInfo = sheet.CreateRow(0);
  143. //ICell cellTitle = titleInfo.CreateCell(0);
  144. //cellTitle.SetCellValue("会员信息批量录入模板");
  145. //ICellStyle titleStyle = workbook.CreateCellStyle();
  146. //IFont titleFont = workbook.CreateFont();
  147. //titleFont.FontHeightInPoints = 25;
  148. //titleFont.Boldweight = short.MaxValue;//字体加粗
  149. //titleStyle.SetFont(titleFont);
  150. //cellTitle.CellStyle = titleStyle;
  151. //#endregion
  152. //IRow dataFields = sheet.CreateRow(2);
  153. //ICellStyle style = workbook.CreateCellStyle();//创建样式对象
  154. //style.Alignment = HorizontalAlignment.CENTER;//水平对齐
  155. //style.VerticalAlignment = VerticalAlignment.CENTER;//垂直对齐
  156. //IFont font = workbook.CreateFont(); //创建一个字体样式对象
  157. //font.FontName = "宋体"; //和excel里面的字体对应
  158. //font.Color = new HSSFColor.RED().GetIndex();//颜色参考NPOI的颜色对照表(替换掉PINK())
  159. //font.FontHeightInPoints = 10;//字体大小
  160. //font.Boldweight = short.MaxValue;//字体加粗
  161. //style.SetFont(font); //将字体样式赋给样式对象
  162. //sheet.SetColumnWidth(0, 20 * 256);//设置列宽
  163. //string[] colums = { "*会员卡号", "*会员手机", "*会员姓名", "*会员等级", "会员性别", "电子邮箱", "会员状态", "固定电话", "永久有效", "身份证号", "开卡费用", "会员地址", "备注信息" };
  164. //ICell Cell = null;
  165. //for (int i = 0; i < colums.Count(); i++)
  166. //{
  167. // Cell = dataFields.CreateCell(i);
  168. // Cell.CellStyle = style;
  169. // Cell.SetCellValue(colums[i]);
  170. // sheet.SetColumnWidth(i, 17 * 256);
  171. //}
  172. //sheet.AddMergedRegion(new CellRangeAddress(0, 0, 0, colums.Count()));//合并单元格
  173. // 4.生成文件
  174. FileStream file = new FileStream(filePath, FileMode.Create);
  175. workbook.Write(file); file.Close();
  176. }
  177. catch (Exception ex) { throw ex; }
  178. }
  179. public void Dispose()
  180. {
  181. Dispose(true);
  182. GC.SuppressFinalize(this);
  183. }
  184. protected virtual void Dispose(bool disposing)
  185. {
  186. if (!this.disposed)
  187. {
  188. if (disposing)
  189. {
  190. if (fs != null)
  191. fs.Close();
  192. }
  193. fs = null;
  194. disposed = true;
  195. }
  196. }
  197. }
  198. }

 

读:

  1. using (ExcelHelper excelHelper = new ExcelHelper(ConfigurationManager.AppSettings["ExcelFile"]))
  2. {
  3. var dataTable = excelHelper.ExcelToDataTable(null, true);
  4. }
  1. ConfigurationManager.AppSettings["ExcelFile"]) 指文件位置
  2. ExcelToDataTable(null, true); sheetNameExcel中每个Sheet的名字 isFirstRowColumn指第一行是否是列名

写:

  1. ExcelHelper.CreateExcel(projectName);
  2. FileStream fs = new FileStream($"{ConfigurationManager.AppSettings["file"].ToString()}\\{projectName}.xlsx", FileMode.Open, FileAccess.Read);
  3. IWorkbook workbook = new XSSFWorkbook(fs);
  4. for (int i = 0; i < Sheet.Count; i++)
  5. {
  6. var Srarch = data.Where(a => a.Sheet == Sheet[i]).ToList();
  7. DataTable dataTable = new DataTable();
  8. dataTable.Columns.Add("Template");
  9. dataTable.Columns.Add("Code");
  10. dataTable.Columns.Add("ZH_CN");
  11. dataTable.Columns.Add("Description");
  12. dataTable.Columns.Add("EN_US");
  13. dataTable.Columns.Add("ZH_TW");
  14. dataTable.Columns.Add("KO");
  15. dataTable.Columns.Add("ZH_HK");
  16. for (int a = 0; a < Srarch.Count; a++)
  17. {
  18. DataRow row = dataTable.NewRow();
  19. row[0] = Srarch[a].Template;
  20. row[1] = Srarch[a].Code;
  21. row[2] = Srarch[a].ZH_CN;
  22. row[3] = Srarch[a].Description;
  23. row[4] = Srarch[a].EN_US;
  24. row[5] = Srarch[a].ZH_TW;
  25. row[6] = Srarch[a].KO;
  26. row[7] = Srarch[a].ZH_HK;
  27. dataTable.Rows.Add(row);
  28. }
  29. dataTable.TableName = Sheet[i];
  30. ISheet sheet = workbook.CreateSheet(dataTable.TableName);
  31. //表头
  32. IRow row2 = sheet.CreateRow(0);
  33. for (int a = 0; a < dataTable.Columns.Count; a++)
  34. {
  35. ICell cell = row2.CreateCell(a);
  36. cell.SetCellValue(dataTable.Columns[a].ColumnName);
  37. }
  38. //数据
  39. for (int a = 0; a < dataTable.Rows.Count; a++)
  40. {
  41. IRow row1 = sheet.CreateRow(a + 1);
  42. for (int j = 0; j < dataTable.Columns.Count; j++)
  43. {
  44. ICell cell = row1.CreateCell(j);
  45. cell.SetCellValue(dataTable.Rows[a][j].ToString());
  46. }
  47. }
  48. }
  49. MemoryStream stream = new MemoryStream();
  50. workbook.Write(stream);
  51. var buf = stream.ToArray();
  52. //保存为Excel文件
  53. using (FileStream fs1 = new FileStream($"{ConfigurationManager.AppSettings["file"].ToString()}\\{projectName}.xlsx", FileMode.Open, FileAccess.Write))
  54. {
  55. fs1.Write(buf, 0, buf.Length);
  56. fs1.Flush();
  57. }
  1. ExcelHelper.CreateExcel(projectName);
    创建Excel
    projectName Excel名字,路径默认是解决方案下File文件夹
    两个For循环,第一个循环是创建列名,第二个循环是创建列下字段的内容
    当然这只是创建Datatable
    所以后面还有两个循环 将每个TABLE中列名放到Excel中的Sheet.以及内容
    最后fs1.Write写入Excel

  1. RabbitMQ
    是一种应用程序对应用程序的通信方法
    举个例子
    前端站点向服务站点发起请求。一般服务站点要考虑到并发和数据总量保持运行稳定.
    如果前端的请求发送到Rabbit并做持久化.服务端隔段时间批量响应请求。就大大减少了服务站点的压力
    接下来的栗子就是A站点向Rabbit发消息并走入队列.然后B站点拉取消息并回应,至于隔多久取,一次取多少条.这部分就没做限制(计数就好).
    下面是A站点
  1. ConnectionFactory factory = new ConnectionFactory();
  2. factory.HostName = "127.0.0.1";
  3. //默认端口
  4. factory.Port = 5672;
  5. factory.UserName = "guest";//用户名
  6. factory.Password = "guest";//密码
  7. using (IConnection conn = factory.CreateConnection())
  8. {
  9. using (IModel channel = conn.CreateModel())
  10. {
  11. //在MQ上定义一个持久化队列,如果名称相同不会重复创建
  12. channel.QueueDeclare("MQTest", true, false, false, null);
  13. while (true)
  14. {
  15. string message = string.Format("Message_{0}", Console.ReadLine());
  16. byte[] buffer = Encoding.UTF8.GetBytes(message);
  17. IBasicProperties properties = channel.CreateBasicProperties();
  18. properties.DeliveryMode = 2;
  19. channel.BasicPublish("", "MQTest", properties, buffer);
  20. Console.WriteLine("消息发送成功:" + message);
  21. }
  22. }
  23. }

                                     消息在Rabbit中.A接触Rabbit,B接触Rabbit.

                                             最终是AB交互.但是过程相互不接触

                                                       

  1. ConnectionFactory factory = new ConnectionFactory();
  2. factory.HostName = "127.0.0.1";
  3. //默认端口
  4. factory.Port = 5672;
  5. factory.UserName = "guest";//用户名
  6. factory.Password = "guest";//密码
  7. using (IConnection conn = factory.CreateConnection())
  8. {
  9. using (IModel channel = conn.CreateModel())
  10. {
  11. //在MQ上定义一个持久化队列,如果名称相同不会重复创建
  12. channel.QueueDeclare("MQTest", true, false, false, null);
  13. //输入1,那如果接收一个消息,但是没有应答,则客户端不会收到下一个消息
  14. channel.BasicQos(0, 1, false);
  15. Console.WriteLine("Listening...");
  16. //在队列上定义一个消费者
  17. QueueingBasicConsumer consumer = new QueueingBasicConsumer(channel);
  18. //消费队列,并设置应答模式为程序主动应答
  19. channel.BasicConsume("MQTest", false, consumer);
  20. while (true)
  21. {
  22. //阻塞函数,获取队列中的消息
  23. BasicDeliverEventArgs ea = (BasicDeliverEventArgs)consumer.Queue.Dequeue();
  24. byte[] bytes = ea.Body;
  25. string str = Encoding.UTF8.GetString(bytes);
  26. Console.WriteLine("队列消息:" + str.ToString());
  27. //回复确认
  28. channel.BasicAck(ea.DeliveryTag, false);
  29. }
  30. }
  31. }

    EF

         像这个被大家用的滚瓜烂熟的框架.我这会拿出来说似乎有点小儿科.不过我就是要写(还写得贼简单)

              Nuget中引入EF

                    自定义DbContext继承DbContext

                     

  1. public class HotelDbContext : DbContext
  2. {
  3. public HotelDbContext()
  4. : base("name=ConnCodeFirst")
  5. {
  6. Database.SetInitializer(new MigrateDatabaseToLatestVersion<HotelDbContext, Configuration>("ConnCodeFirst"));
  7. }
  8. public DbSet<TSM_Admin1111111111111> TSM_Admin { get; set; }
  9. }

       ConnCodeFirst 是数据库连接字符串

                Configuration 如下

  1. internal sealed class Configuration : DbMigrationsConfiguration<HotelDbContext>
  2. {
  3. public Configuration()
  4. {
  5. // 自动迁移 TRUE code frist
  6. AutomaticMigrationsEnabled = true;
  7. }
  8. protected override void Seed(HotelDbContext context)
  9. {
  10. context.TSM_Admin.AddOrUpdate(
  11. p => p.UserID,
  12. new TSM_Admin1111111111111 { UserID = "1", UserName = "111" },
  13. new TSM_Admin1111111111111 { UserID = "2", UserName = "222" },
  14. new TSM_Admin1111111111111 { UserID = "3", UserName = "333" }
  15. );
  16. }
  17. }
  1. AutomaticMigrationsEnabled 意思就是找不到数据库的时候自动创建数据库。顺带还会创建初始数据(表和数据)。在Seed
    说真的很鸡肋.用的很想骂街
    接下来是EF的各种使用方式。。婴儿教学版
  1. new Configuration();
  2. using (var data = new HotelDbContext())
  3. {
  4. //查询.全表
  5. var a = data.TSM_Admin.ToList();
  6. //插入
  7. data.TSM_Admin.Add(new TSM_Admin1111111111111 { UserID = "高1030测试" });
  8. data.SaveChanges();
  9. //修改
  10. var model = data.TSM_Admin.Where(b => b.UserID == "高1030测试").First();
  11. if (model != null)
  12. {
  13. model.UserName = "高1030测试名字";
  14. data.Entry<TSM_Admin1111111111111>(model).State = System.Data.Entity.EntityState.Modified;
  15. data.SaveChanges();
  16. }
  17. //删除
  18. var delete = data.TSM_Admin.Where(b => b.UserID == "高1030测试").First();
  19. if (delete != null)
  20. {
  21. var result = data.TSM_Admin.Where(b => b.UserID == delete.UserID).FirstOrDefault();
  22. data.TSM_Admin.Remove(result);
  23. data.SaveChanges();
  24. }
  25. var select = data.Database.SqlQuery<TSM_Admin1111111111111>("select * from tsm_123 ").ToList();
  26. var insert = data.Database.ExecuteSqlCommand("insert into TSM_Admin(UserID) values('高1030测试')");
  27. }

                能用Dapper。就别用EF..

                   

  1. Attribute
    很多人都梦想着自定义属于自己的属性.那么
    我用双手成就你的梦想
  1. StringLength是自定义属性的名字Attribute是必须加上去的。并且在使用中会被忽视
  1. [AttributeUsage(AttributeTargets.Property)]
  2. public class StringLengthAttribute : Attribute
  3. {
  4. private int _maximumLength;
  5. public StringLengthAttribute(int maximumLength)
  6. {
  7. _maximumLength = maximumLength;
  8. }
  9. public int MaximumLength
  10. {
  11. get { return _maximumLength; }
  12. }
  13. }

          接下来定义使用的实体

      

  1. public class People
  2. {
  3. [StringLength(8)]
  4. public string Name { get; set; }
  5. [StringLength(15)]
  6. public string Description { get; set; }
  7. }

         接下来定义获取属性内容的方法

               

  1. public class ValidationModel
  2. {
  3. public void Validate(object obj)
  4. {
  5. var t = obj.GetType();
  6. //由于我们只在Property设置了Attibute,所以先获取Property
  7. var properties = t.GetProperties();
  8. foreach (var property in properties)
  9. {
  10. //这里只做一个stringlength的验证,这里如果要做很多验证,需要好好设计一下,千万不要用if elseif去链接
  11. //会非常难于维护,类似这样的开源项目很多,有兴趣可以去看源码。
  12. if (!property.IsDefined(typeof(StringLengthAttribute), false)) continue;
  13. var attributes = property.GetCustomAttributes(false);
  14. foreach (var attribute in attributes)
  15. {
  16. //这里的MaximumLength 最好用常量去做
  17. var maxinumLength = (int)attribute.GetType().
  18. GetProperty("MaximumLength").
  19. GetValue(attribute);
  20. //获取属性的值
  21. var propertyValue = property.GetValue(obj) as string;
  22. if (propertyValue == null)
  23. throw new Exception("exception info");//这里可以自定义,也可以用具体系统异常类
  24.  
  25. if (propertyValue.Length > maxinumLength)
  26. throw new Exception(string.Format("属性{0}的值{1}的长度超过了{2}", property.Name, propertyValue, maxinumLength));
  27. }
  28. }
  29. }
  30. }

  

  1. 接下来是调用过程
  1. var people = new People()
  2. {
  3. Name = "qweasdzxcasdqweasdzxc",
  4. Description = "description"
  5. };
  6. try
  7. {
  8. new ValidationModel().Validate(people);
  9. }
  10. catch (Exception ex)
  11. {
  12. Console.WriteLine(ex.Message);
  13. }

              这个段子充分解释了如何使用自定义Attribute

                     核心思想是万物皆可supreme

 

 

                          HttpRuntime.Cache

                            开发中很多不常改动的数据。可以考虑将数据从数据库里取出来后的指定时间内存在本地内存中

                                      

  1. using System;
  2. using System.Web;
  3. using System.Web.Caching;
  4. namespace Chinamoney.Core
  5. {
  6. public class CacheHelper
  7. {
  8. /// <summary>
  9. /// 获取数据缓存
  10. /// </summary>
  11. /// <param name="cacheKey"></param>
  12. public static object GetCache(string cacheKey)
  13. {
  14. var objCache = HttpRuntime.Cache.Get(cacheKey);
  15. return objCache;
  16. }
  17. /// <summary>
  18. /// 设置数据缓存
  19. /// </summary>
  20. public static void SetCache(string cacheKey, object objObject)
  21. {
  22. var objCache = HttpRuntime.Cache;
  23. objCache.Insert(cacheKey, objObject);
  24. }
  25. /// <summary>
  26. /// 设置数据缓存
  27. /// </summary>
  28. public static void SetCache(string cacheKey, object objObject, int Hours)
  29. {
  30. try
  31. {
  32. if (objObject == null) return;
  33. var objCache = HttpRuntime.Cache;
  34. //相对过期
  35. //objCache.Insert(cacheKey, objObject, null, DateTime.MaxValue, timeout, CacheItemPriority.NotRemovable, null);
  36. //绝对过期时间
  37. objCache.Insert(cacheKey, objObject, null, DateTime.Now.AddHours(Hours), TimeSpan.Zero, CacheItemPriority.High, null);
  38. }
  39. catch (Exception e)
  40. {
  41. Log.Logger.Log("缓存写入异常:",e);
  42. }
  43. }
  44. /// <summary>
  45. /// 移除指定数据缓存
  46. /// </summary>
  47. public static void RemoveAllCache(string cacheKey)
  48. {
  49. var cache = HttpRuntime.Cache;
  50. cache.Remove(cacheKey);
  51. }
  52. /// <summary>
  53. /// 移除全部缓存
  54. /// </summary>
  55. public static void RemoveAllCache()
  56. {
  57. var cache = HttpRuntime.Cache;
  58. var cacheEnum = cache.GetEnumerator();
  59. while (cacheEnum.MoveNext())
  60. {
  61. cache.Remove(cacheEnum.Key.ToString());
  62. }
  63. }
  64. }
  65. }

        读取

       

  1. CacheHelper.GetCache("cacheExtraterritorial") as List<ExtraterritorialDataEntity>;

     写入

  

  1. CacheHelper.SetCache("cacheExtraterritorial", enumerable, result.Count);

   清空全部缓存(带名称清理指定缓存,不带名称清理全部缓存)

       

  1. CacheHelper.RemoveAllCache("cacheExtraterritorial");

     AD是微软推出的又一款对象数据库

                  集成了权限和员工信息。

                            在此贴出AD操作的Helper

                 

  1. using Chinamoney.Core.Log;
  2. using System;
  3. using System.Collections;
  4. using System.DirectoryServices;
  5. namespace Chinamoney.Core
  6. {
  7. /// <summary>
  8. /// AD域
  9. /// </summary>
  10. public class ADHelper
  11. {
  12. /// <summary>
  13. /// 获取单个用户
  14. /// </summary>
  15. /// <param name="user"></param>
  16. /// <returns></returns>
  17. public static DirectoryEntry GetOne(string ldap, string user, string password, string search)
  18. {
  19. try
  20. {
  21. DirectoryEntry entry = new DirectoryEntry(ldap, user, password);
  22. DirectorySearcher searcher = new DirectorySearcher(entry);
  23. //searcher.Filter = "(&(objectClass=user)(SAMAccountName=" + search + "))";//不支持中文名.改成全局搜索.
  24. searcher.Filter = "(&(objectCategory=person)(objectClass=user))";
  25. SearchResultCollection result = searcher.FindAll();
  26. foreach (SearchResult item in result)
  27. {
  28. ICollection serach = item.Properties.PropertyNames;
  29. foreach (var model in serach)
  30. {
  31. if (model.ToString() == "name")//邮件中文名 AD Name
  32. {
  33. if (item.Properties["name"][0].ToString() == search)
  34. {
  35. return item.GetDirectoryEntry();
  36. }
  37. }
  38. }
  39. }
  40. entry.Close();
  41. //return null;
  42. }
  43. catch (Exception e)
  44. {
  45. Logger.Log("AD同步异常信息.异常信息:", e);
  46. }
  47. return null;
  48. }
  49. /// <summary>
  50. /// 获取全部用户
  51. /// </summary>
  52. /// <param name="ldap"></param>
  53. /// <param name="user"></param>
  54. /// <param name="password"></param>
  55. /// <returns></returns>
  56. public static SearchResultCollection GetALL(string ldap, string user, string password)
  57. {
  58. try
  59. {
  60. using (DirectoryEntry objDE = new DirectoryEntry(ldap, user, password))
  61. {
  62. string strFilter = "(&(objectCategory=person)(objectClass=user))";
  63. using (DirectorySearcher objSearcher = new DirectorySearcher(objDE, strFilter))
  64. {
  65. // strFilter = "(objectGUID=*)";
  66. // DirectorySearcher objSearcher = new DirectorySearcher(objDE, strFilter);
  67. return objSearcher.FindAll();
  68. }
  69. }
  70. //DirectoryEntry objDE = new DirectoryEntry(ldap, user, password);//("LDAP://cftes.org", @"cftes\admin", "Pass@123");
  71. }
  72. catch (Exception e)
  73. {
  74. Logger.Log("AD同步异常信息.异常信息:", e);
  75. }
  76. return null;
  77. }
  78. /// <summary>
  79. /// 禁用指定用户
  80. /// </summary>
  81. /// <param name="entry"></param>
  82. public static void DisableUser(DirectoryEntry entry)
  83. {
  84. if (entry != null)
  85. {
  86. using (DirectoryEntry de = entry)
  87. {
  88. int control = (int)(de.Properties["userAccountControl"][0]);
  89. control = control | (int)(ADS_USER_FLAG_ENUM.ADS_UF_ACCOUNTDISABLE);
  90. de.Properties["userAccountControl"].Value = control;
  91. de.CommitChanges();
  92. }
  93. }
  94. }
  95. /// <summary>
  96. /// 用户属性定义标志
  97. /// </summary>
  98. [Flags]
  99. public enum ADS_USER_FLAG_ENUM : int
  100. {
  101. /// <summary>
  102. /// 登录脚本标志。如果通过 ADSI LDAP 进行读或写操作时,该标志失效。如果通过 ADSI WINNT,该标志为只读。
  103. /// </summary>
  104. ADS_UF_SCRIPT = 0X0001,
  105. /// <summary>
  106. /// 用户帐号禁用标志
  107. /// </summary>
  108. ADS_UF_ACCOUNTDISABLE = 0X0002,
  109. /// <summary>
  110. /// 主文件夹标志
  111. /// </summary>
  112. ADS_UF_HOMEDIR_REQUIRED = 0X0008,
  113. /// <summary>
  114. /// 过期标志
  115. /// </summary>
  116. ADS_UF_LOCKOUT = 0X0010,
  117. /// <summary>
  118. /// 用户密码不是必须的
  119. /// </summary>
  120. ADS_UF_PASSWD_NOTREQD = 0X0020,
  121. /// <summary>
  122. /// 密码不能更改标志
  123. /// </summary>
  124. ADS_UF_PASSWD_CANT_CHANGE = 0X0040,
  125. /// <summary>
  126. /// 使用可逆的加密保存密码
  127. /// </summary>
  128. ADS_UF_ENCRYPTED_TEXT_PASSWORD_ALLOWED = 0X0080,
  129. /// <summary>
  130. /// 本地帐号标志
  131. /// </summary>
  132. ADS_UF_TEMP_DUPLICATE_ACCOUNT = 0X0100,
  133. /// <summary>
  134. /// 普通用户的默认帐号类型
  135. /// </summary>
  136. ADS_UF_NORMAL_ACCOUNT = 0X0200,
  137. /// <summary>
  138. /// 跨域的信任帐号标志
  139. /// </summary>
  140. ADS_UF_INTERDOMAIN_TRUST_ACCOUNT = 0X0800,
  141. /// <summary>
  142. /// 工作站信任帐号标志
  143. /// </summary>
  144. ADS_UF_WORKSTATION_TRUST_ACCOUNT = 0x1000,
  145. /// <summary>
  146. /// 服务器信任帐号标志
  147. /// </summary>
  148. ADS_UF_SERVER_TRUST_ACCOUNT = 0X2000,
  149. /// <summary>
  150. /// 密码永不过期标志
  151. /// </summary>
  152. ADS_UF_DONT_EXPIRE_PASSWD = 0X10000,
  153. /// <summary>
  154. /// MNS 帐号标志
  155. /// </summary>
  156. ADS_UF_MNS_LOGON_ACCOUNT = 0X20000,
  157. /// <summary>
  158. /// 交互式登录必须使用智能卡
  159. /// </summary>
  160. ADS_UF_SMARTCARD_REQUIRED = 0X40000,
  161. /// <summary>
  162. /// 当设置该标志时,服务帐号(用户或计算机帐号)将通过 Kerberos 委托信任
  163. /// </summary>
  164. ADS_UF_TRUSTED_FOR_DELEGATION = 0X80000,
  165. /// <summary>
  166. /// 当设置该标志时,即使服务帐号是通过 Kerberos 委托信任的,敏感帐号不能被委托
  167. /// </summary>
  168. ADS_UF_NOT_DELEGATED = 0X100000,
  169. /// <summary>
  170. /// 此帐号需要 DES 加密类型
  171. /// </summary>
  172. ADS_UF_USE_DES_KEY_ONLY = 0X200000,
  173. /// <summary>
  174. /// 不要进行 Kerberos 预身份验证
  175. /// </summary>
  176. ADS_UF_DONT_REQUIRE_PREAUTH = 0X4000000,
  177. /// <summary>
  178. /// 用户密码过期标志
  179. /// </summary>
  180. ADS_UF_PASSWORD_EXPIRED = 0X800000,
  181. /// <summary>
  182. /// 用户帐号可委托标志
  183. /// </summary>
  184. ADS_UF_TRUSTED_TO_AUTHENTICATE_FOR_DELEGATION = 0X1000000
  185. }
  186. }
  187. }

调用方式

    

  1. SearchResultCollection data = ADHelper.GetALL(ldap, @name, password);

禁用账号

 

  1. ADHelper.DisableUser(ADHelper.GetOne(ldap, name, password, serach.ChinaName));

 

                      

             List<T>根据指定字段去重

                       List<string>去重很容易Distinct就可以

                           如果是List<T>在实体中根据指定字段判断重复项.如果每次都写循环是不是很累.

                                  在此贴出帮助类

                                            

  1. using System.Collections.Generic;
  2. namespace Chinamoney.Core
  3. {
  4. /// <summary>
  5. /// 去除重复项
  6. /// </summary>
  7. /// <typeparam name="T"></typeparam>
  8. /// <param name="x"></param>
  9. /// <param name="y"></param>
  10. /// <returns></returns>
  11. public delegate bool EqualsComparer<T>(T x, T y);
  12. public class ComparerHelper<T> : IEqualityComparer<T>
  13. {
  14. private EqualsComparer<T> _equalsComparer;
  15. public ComparerHelper(EqualsComparer<T> equalsComparer)
  16. {
  17. this._equalsComparer = equalsComparer;
  18. }
  19. public bool Equals(T x, T y)
  20. {
  21. if (null != this._equalsComparer)
  22. return this._equalsComparer(x, y);
  23. else
  24. return false;
  25. }
  26. public int GetHashCode(T obj)
  27. {
  28. return obj.ToString().GetHashCode();
  29. }
  30. }
  31. }

         调用方式

              

  1. rows = rows.Distinct(new ComparerHelper<ExtraterritorialDataDto>((x, y) => (null != x && null != y) && (x.senderaddress == y.senderaddress))).ToList();

                  拉姆达指定的字段就是不能相同的字段,可以根据情景变化

               

  1. JqueryCache
    Cookie有长度限制4m,
    如果真的有大量数据要存放在客户端Jquery.Cache 是个不错的考虑

                      

  1. <script src="/webStorageCache/web-storage-cache.js"></script>
  2. <script src="/webStorageCache/ajax-cache.js"></script>
  3.  
  4. var wsCache = new WebStorageCache();//缓存对象.全局通用
    wsCache.isSupported() //当前浏览器是否支持缓存
  5. wsCache.clear();//清空所有缓存
  6. wsCache.set('键', 值, { exp: 时间.单位秒。整数 });
    wsCache.get('键')

缓存插入成功后可以再浏览器中看到(开发者工具)


  1. I18N
  1. <script src="~/Scripts/jquery-3.3.1.js"></script>
  2. <script src="~/Scripts/jquery.json.min.js"></script>
  3. <script src="~/Scripts/jquery.i18n.properties.js"></script>

    HTML

                   <div>
                    <p id="text"></p>
                     <button onclick="switchLang()" id="lang"></button>
                   </div>

              SCRIPT 

                  <script>
                    var LANGUAGE_CODE = "en_US"; //标识语言

                       function loadProperties(type) {
                             jQuery.i18n.properties({
                                name: 'strings', // 资源文件名称
                                path: 'static/', // 资源文件所在目录路径
                                mode: 'map', // 模式:变量或 Map
                                language: type, // 对应的语言
                                cache: false,
                                encoding: 'UTF-8',
                                callback: function () { // 回调方法
                                   $('#text').html($.i18n.prop('string_text'));
                                  $('#lang').html($.i18n.prop('string_lang'));
                                }
                            });
                          }

                 function switchLang() {
                    LANGUAGE_CODE = LANGUAGE_CODE == 'zh_CN' ? 'en_US' : 'zh_CN';
                     loadProperties(LANGUAGE_CODE);
                  }

$(document).ready(function () {
LANGUAGE_CODE = jQuery.i18n.normaliseLanguageCode({}); //获取浏览器的语言
loadProperties(LANGUAGE_CODE);
})
</script>

 

 

 

        来一顿专业的BB压压惊

              在HTML中需要设置多国语言的元素上添加ID

                      properties.name+ LANGUAGE_CODE 就是当前加载的语种文件

                          如果需要改变语言的话

                                  赋值     LANGUAGE_CODE

                                      重新加载    loadProperties(LANGUAGE_CODE);

                                            页面无刷新喔

                                                  完美

                     HTML 自定义属性 DATA-XX

                                        HTML允许我们自定义的属性.都以DATA-开头

                                               举个栗子

                                                     再JS中或者直接写HTML

                                                        

  1. html += "<li class='cl' dataurl='" + data[i].Content + "' datatitle='" + data[i].Title + "' datadesc='" + data[i].Describe + "' time='" + data[i].ShowTime + "'>";
  2. $('#courseData').append($(html));

 

 

                                                                               栗子中是dataurl,datatitle,datadesc

                                                                                          dataurl或者data-url并没有什么区别。

                                                                                                  因为data-xx 浏览器会认为是用户自定义属性。不做任何处理              

                                                                                                         至于dataxx浏览器根本不认识。所以也不做任何处理

                                                                                                                     大概就是我开心就好的意思

                                                                                                                                       

  1. var dataurl = $(this).attr("dataurl");
    $("div").attr("data-my-value", "使用attr改变的数据");

 

 

                                            



 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号