zoukankan      html  css  js  c++  java
  • .net 工具集之SinGooCMS.Utility

    SinGooCMS.Utility 是一个工具类集合,包括配置、文件、日期、数据、序列化、反射、图像处理、网络、缓存、Web相关、加解密、压缩、类扩展等工具类,几乎囊括了开发中的所有工具需求!支持netstandard2.1和net framework 4.6.1。

    在线文档API:http://www.singoo.top/include/doc/utils/html/index.html

    开源地地:https://github.com/SinGooCMS/SinGooCMSUtility

    (注:以下代码可以在单元测试项目中找到)

    一、    HttpContext
    .net framework的system.web自带有httpcontext.
    但在.net core中必须注入才行。

    public static class ServiceCollectionExtension 扩展类实现了注入httpcontext的功能,包括两个方法:
    AddStaticHttpContext 和 UseStaticHttpContext,在Startup.cs中添加以下代码:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddStaticHttpContext();
        …
    }
    
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
       app.UseStaticHttpContext();
       …
    }

    二、    扩展类
    使用扩展类需要先引用命名空间:SinGooCMS.Utility.Extension   

    1)DataTableExtension
    数据集DataTable和实体类之间的互相转换!
    如:

    //新建一个实体类
    public class Student
    {
        public string UserName { get; set; }
        public int Age { get; set; }
    }
            
    DataTable dt = new DataTable();
    dt.Columns.Add("UserName", typeof(string));
    dt.Columns.Add("Age", typeof(int));
    
    DataRow dr1 = dt.NewRow();
    dr1["UserName"] = "jsonlee";
    dr1["Age"] = 18;
    dt.Rows.Add(dr1);
    
    DataRow dr2 = dt.NewRow();
    dr2["UserName"] = "刘备";
    dr2["Age"] = 20;
    dt.Rows.Add(dr2);
    
    var lst = dt.ToEntities<Student>();

    2)    DataTypeChangeExtension
    类型转换,如 int val = "1".ToInt();

    3)    DateExtension
    给定日期,取日期的周一、周日、月初,月尾、年初、年尾以及格式化成字符串的相关操作。
    如 :

    var now = DateTime.Now;
    Console.WriteLine($"周一:{now.GetMonday()} 周日:{now.GetSunday()}");
    Console.WriteLine($"月初:{now.GetMonthFirstDay()} 月尾:{now.GetMonthLastDay()}");
    Console.WriteLine($"季初:{now.GetQuarterFirstDay()} 季尾:{now.GetQuarterLastDay()}");
    Console.WriteLine($"年初:{now.GetYearFirstDay()} 年尾:{now.GetYearLastDay()}");
    Console.WriteLine($"本年第几周:{now.WeekOfYear()}");

    4)    IConvertibleExtension
    类型任意转换
    如:

    var b = "true";
    bool flag = b.To<bool>();

    5)    IEnumerableExtension
    可枚举类型增加foreach及去重操作
    如:

    lst.Foreach((p)=> Console.WriteLine(“元素值;” p));

    6)    ImageExtension
    图片处理类,当前对象必须是Image类型。
    在后面的图片处理中详细介绍。

    7)    IOExtension
    文件流的相关操作。
    在后面的IO操作中详细介绍。

    8)    JsonserializeExtension
    Json数据的序列化和反序列化操作。

    //序列化
    var user = new Student() { UserName="jsonlee",Age=18 };
    var json = user.ToJson();
    
    //反序列化
    var user2 = json.JsonToObject<Student>();
    
    //匿名类型序列化
    var json = "{"UserName":"jsonlee","Age":18}";
    var model = new { UserName = "", Age = 0 };
    var obj = json.JsonToAnonymousObject(model);

    9)    LinqExtension
    待处理

    10)    ObjectExtension
    对象的克隆

    11)    ReflectExtension
    反射处理,后面详细介绍。

    12)    ServiceCollectionExtension
    .net core HttpContext注入。

    13)    StreamExtension
    文件流操作。14)    StringExtension
    字符串扩展。
    如:

    var builder = new StringBuilder();
    builder.AppendFormat("123转人民币:{0} 
    ",123.9m.ToRMB());
    builder.AppendFormat("123456789转掩码:{0} 
    ", "123456789".Mask());
    Console.WriteLine(builder.ToString());
    
    var dict = new Dictionary<string, string>();
    dict.Add("username","刘备");
    dict.Add("age", "18");
    Console.WriteLine("url:" dict.ToUrlSearch());
    
    var urlText = "username=刘备&age=18";
    Console.WriteLine("username:"   urlText.ToUrlDictionary()["username"]);

    15)    ValidateExtension
    验证扩展类,满足开发中常用的的验证。
    如:

    " ".IsNullOrEmpty()  //true
    "16826375@qq.com".IsEmail() //true

    16)    XmlserializeExtension
    xml数据的序列化和反序列化操作。

    //序列化
    var user = new Student() { UserName = "jsonlee", Age = 18 };
    var xml = user.ToXml();
    Console.WriteLine("user to json:"   xml);
    
    //反序列化
    var user2 = xml.XmlToObject<Student>();

    三、    Web相关工具
    1)    WebUtils
    查询Query和Form提交的参数,没有提供参数时,取默认值。
    如:

    var queryStr= WebUtils.GetQueryString(“username”); //querystring get查询
    var queryStr= WebUtils.GetFormString(“username”); //form post提交
    var url=WebUtils.GetAbsoluteUri() //获取全路径

    注意:.net core需要先注入HttpContext

    2)    CacheUtils
    缓存工具,使用系统自带的缓存。
    如:

    DateTime dateTime = DateTime.Now;
    var cache = new CacheUtils();
    
    var cacheDT = DateTime.Now;
    if (cache.ContainKey("time"))
    cacheDT = cache.Get<DateTime>("time");
    else
    cache.Insert<DateTime>("time", dateTime, 3600);
    
    builder.Append($"当前时间:{dateTime.ToFormatString()} 
    ");
    builder.Append($"缓存时间:{cacheDT.ToFormatString()} 
    ");

    3)    CookieUtils
    一般用户登录,验证成功后会写入用户标识,比如用户ID等。CookieUtils用于对浏览器cookie的操作管理,对于现在隐私权的越来越重视,部门浏览器对保存cookie很谨慎,.net core在配置中需要设置宽松策略。
    如:

    CookieUtils.SetCookie("username", "jsonlee");
    builder.Append($"username cookie: {CookieUtils.GetCookie("username")} 
    ");

    4)    SessionUtils
    Session和Cookie的概念差不多,但Session是保存在服务端的。在跨平台的时候,建立把Session保存在数据库中,或者使用JWT。
    在.net core中需要在Startup中声明:

    public void ConfigureServices(IServiceCollection services)
    {
       services.AddSession();
       …
    }
    
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
       app.UseSession();
       …
    }

    使用方法:

    SessionUtils.SetSession("username", System.Web.HttpUtility.UrlEncode("刘备"));
    builder.Append($"username session: {System.Web.HttpUtility.UrlDecode(SessionUtils.GetSession("username"))} 
    ");

    四、    序列化
    包括对Json和XML的序列化操作。
    参考JsonserializeExtension、XmlserializeExtension

    五、    配置
    配置工具ConfigUtils。
    对于.net framework是读取Web.config/App.config
    对于.net core 是读取 appsettings.json

    Web.config/App.config 配置:

    <connectionStrings>
      <add name="SQLConnSTR" providerName="SqlServer" connectionString="server=(local);database=SinGooCMS-v1.6;uid=sa;pwd=123" />
    </connectionStrings>
    <appSettings>
      <add key="EnableCache" value="True" />
      <!--The license context used-->
      <add key="EPPlus:ExcelPackage.LicenseContext" value="NonCommercial" />
    </appSettings>

    Appsetting.json 配置:

    "ConnectionStrings": {
      "ProviderName": "Sqlite",
      "SQLConnSTR": "Data Source=db/singootop.db",
      "RedisExchangeHosts": "127.0.0.1:6379,allowadmin=true"
    },
    "AppSettings": {
      //是否启用缓存 建议开启
      "EnableCache": "True"
    },
    "EPPlus": {
      "ExcelPackage": {
        "LicenseContext": "NonCommercial"
      }
    }

    读取方式:

    //连接字符串
    Console.WriteLine($"ProviderName:{ConfigUtils.ProviderName}
    ");
    Console.WriteLine($"SQLConnSTR:{ConfigUtils.DefConnStr}
    ");
    //appsetting
    Console.WriteLine($"EnableCache:{ConfigUtils.GetAppSetting<string>("EnableCache")}
    ");

    六、    图片处理
    在项目中经常会上传图片文件,我们可以对图片进行适当的处理,比如对大文件压缩尺寸,创建缩略图供快速浏览,创建水印图用于保护权利等。
    如:

    //文件转图像类型
    var image = ImageUtils.ReadFileToImage(filePath);
    var bitmap = ImageUtils.ReadFileBitmap(filePath);
    var stream = FileUtils.ReadFileToStream(filePath);
    Console.WriteLine("image宽高:"   image.Width   " x "   image.Height);
    Console.WriteLine("bitmap宽高:"   bitmap.Width   " x "   bitmap.Height);
    Console.WriteLine("stream-length:"   stream.Length);
    
    //base64和图片互转
    var base64Str = image.ToBase64();
    Console.WriteLine("base64string:" base64Str);
    ImageUtils.Base64StrToImage(base64Str).Save(@"f:123.png");
    
    var image = ImageUtils.ReadFileToImage(filePath);
    //转黑白图片
    image.ToBWPic().Save(@"f:黑白.png");
    //调整光暗
    image.LDPic(50).Save(@"f:光暗.png");
    //反色
    image.RePic().Save(@"f:反色.png");
    //浮雕
    image.Relief().Save(@"f:浮雕.png");
    //拉伸
    image.ResizeImage(500, 300).Save(@"f:拉伸.png");
    //滤色
    image.ColorFilter().Save(@"f:滤色.png");
    //马赛克
    image.Mosaic(10).Save(@"f:马赛克.png");
    //上下翻转
    image.UpDownRev().Save(@"f:上下翻转.png");
    //左右翻转
    image.LeftRightRev().Save(@"f:左右翻转.png");
    //压缩图片
    image.Compress(1000, 600).Save(@"f:压缩.png");
    //裁切
    image.CutImage(new System.Drawing.Rectangle(0, 0, 300, 200)).Save(@"f:裁切.png");
    
    var image = ImageUtils.ReadFileToImage(filePath);
    //缩略图
    image.ThumbnailImage(300,150).Save(@"f:缩略图.png");
    ImageUtils.MakeThumbnail(filePath, 500, 450);
    
    //水印
    //文字水印
    //ImageUtils.AddTextWatermark(filePath, "这是一个测试");
    //图片水印
    string watermarkPic = @"F:jsonleestudy	estlogo.png";
    ImageUtils.AddImageWatermark(filePath, watermarkPic);

    注意:对于图片扩展类,对象必须是Image,如果是BitMap对象,需要转换成Image才能使用扩展类。缩略图和水印图片会存储在原文件同一目录下。

    七、    IO操作
    1)    压缩

    //压缩 支持压缩成 zip文件格式
    string baseDir = System.Environment.CurrentDirectory; //当前程序的目录
    string path = ZipUtils.Zip(baseDir);
    
    //解压 支持 zip、rar、7z文件格式的解压
    ZipUtils.UnZip(@"F:jsonleeW3Cschool-v2.1.0-win32-x64.zip", @"F:ABC");

    2)    共享文件
    共享文件的操作和本地文件的一样的。但首先要连接,连接使用网络命令net use。

    ShareFileUtils.DisconnectAll(); //断开所有连接
    
    string path = @"\192.168.1.120";
    string uid = @"luxshare11000890";
    string pwd = @"abc";
    
    var client = ShareFileUtils.Connect(path, uid, pwd);
    if (client != null)
    {
      //var file = client.GetFile("KPI.xlsx"); //取文件
      //client.DownFile(@"KPI.xlsx", "f:"); //下载
      client.UpFile(@"f:web.config", "ABC"); //上传
    }

    3)    二维码
    创建二维码图片

    var img = QRCodeUtils.GenerateQrCode("http://www.baidu.com", 30);
    img.Save(@"f:qrcode.png",System.Drawing.Imaging.ImageFormat.Png);

    4)    验证码

    var captcha = CaptchaUtils.Create();
    captcha.CheckCodeImg.WriteToFile(@"f:Captcha.png"); //验证码图片
    Console.WriteLine("验证码字符串:" captcha.CheckCodeString); //验证码字符串

    在web项目中可以这样输入验证码图片和记录验证码到cookie

    public IActionResult CheckCodeImg()
    {
      var iCode = CaptchaUtils.Create();
      CookieUtils.SetCookie("vcode", DEncryptUtils.DESEncode(iCode.CheckCodeString), 3600);
      return File(iCode.CheckCodeImg, @"image/png");
    }

    5)    视频截图
    VideoUtils,用于对.mp4等视频进行截图。需要首先下载视频工具ffmpeg.exe
    使用方法:

    VideoUtils.Init(“ffmpeg.exe”). Save(“视频文件”,”截图文件”);

    6)    目录/文件操作
    目录/文件的创建、读取、删除等操作

    var lst = FileUtils.GetAllFiles(@"F:jsonleestudy"); //递归读取目录下所有文件(包括子多层目录下的文件)

    八、    Excel操作
    使用第三方工具EPPlus对Excel进行操作,不依赖微软的office组件。
    EPPlus是一款开源框架,开源地址是:https://github.com/EPPlusSoftware/EPPlus
    EPPlus使用前需要在配置中加上 NonCommercial 标志!请注意查看相关授权协议!


    Web.config:

    <appSettings>
        <!--The license context used-->
        <add key="EPPlus:ExcelPackage.LicenseContext" value="NonCommercial" />
    </appSettings>

    appSettings.json:

    {
        "EPPlus": {
          "ExcelPackage": {
              "LicenseContext": " NonCommercial "
              }
          }
    }


    1)    读取单元格的值

    EPPlusUtils. ReadCell(“kpi.xlsx”,1,1); //读取第一个单元格的值

    2)    读取sheet到DataTable

    DataTable dt = EPPlusUtils.Read(“kpi.xlsx”);

    3)    DataTable导出到Excel

    EPPlusUtils. Export(dt,”export.xlsx”);


    九、    网络操作
    1)    FtpClient

    //创建ftp客户端
    // FtpClient ftp = FtpClient.GetClient(serverIP, ftpUserName,ftpUserPwd);
    FtpClient ftp = FtpClient.GetClient("39.108.247.193", "fbac32bc", "fc156f7f66");
    
    ftp.Download("/web/web.config", "f:\web.config",true); //从服务器下载文件
    
    var lst = ftp.GetFiles("/web/Upload/pdf/"); //读取目录下的所有文件信息
    Console.WriteLine(lst.ToJson());

    2)    IPUtils
    查看客户端IP,使用纯真数据库解析IP地址!

    //查看客户端IP
    Var ip = IPUtils.GetIP();
    //定位IP
    var ip = "218.95.66.68";
    Console.WriteLine("IP定位:" new IPScanner().IPLocation(ip)); //江西省吉安市电信

    注意:IP定位,需要在程序目录中有纯真数据库:IPData qqwry.dat

    3)    NetWorkUtils
    模拟http的Get方法和Post方法

    //get
    var getStr = NetWorkUtils.HttpGet("http://www.singoo.top");
    Console.WriteLine("get返回数据:" getStr); //获取网页的源代码
     
    //post 模拟用户登录
    var postStr=NetWorkUtils.HttpPost("http://passports.singoo.top/passports/login", "_loginname=admin&_loginpwd=123");
    Console.WriteLine("post返回数据:"   postStr);  //post返回数据:登录失败,账号或者密码错误!


    十、    加密解密
    为了保护数据不被泄露,常常需要加密数据。数据加密分为可逆和不可逆两种方式。用户密码大多使用MD5加密,但原生的MD5加密,网络上有许多暴力破解,其实我们可以对数据进行2次加密或者多次加密,这样就不容易破解。
    在API的数据往来传输中,同样需要加密,防止数据被截取导致信息泄露。比如支付宝、微信支付用的就是RSA加密,支付宝保存公钥,商户使用私钥。

    1)    可逆加密解密

    //可逆加密
    //des
    string desEncode = DEncryptUtils.DESEncrypt(txt, key);
    Console.WriteLine("des加密值:"   desEncode);
    Assert.AreEqual(txt, DEncryptUtils.DESDecrypt(desEncode, key));
    
    //aes
    string aesEncode = DEncryptUtils.AESEncrypt(txt);
    Console.WriteLine("aes加密值:"   aesEncode);
    Assert.AreEqual(txt, DEncryptUtils.AESDecrypt(aesEncode));
    
    //base64
    string base64Encode = DEncryptUtils.Base64Encrypt(txt);
    Console.WriteLine("base64加密值:"   aesEncode);
    Assert.AreEqual(txt, DEncryptUtils.Base64Decrypt(base64Encode));
    
    //xor 
    string xor = DEncryptUtils.GetXORCode(txt, key);
    Console.WriteLine("xor加密值:"   xor);
    Assert.AreEqual(txt, DEncryptUtils.GetXORCode(xor, key));

    2)    不可逆加密解密

    //不可逆加密
    //md5
    string md5 = DEncryptUtils.MD5Encrypt(txt); //md5是2次加密,且会截断字符串,这样网上的暴力破解不了
    Console.WriteLine("MD5:"   md5);
    Assert.AreEqual(md5, DEncryptUtils.MD5Encrypt(txt));
    
    //sha512 比md5更安全的不可逆加密方法
    string sha512 = DEncryptUtils.SHA512Encrypt(txt);
    Console.WriteLine("sha512:"   sha512);
    Assert.AreEqual(sha512, DEncryptUtils.SHA512Encrypt(txt));

    3)    RSA加密解密
    RAS的公钥和私钥是分别保存的,保证了安全。

    //公钥
    string publicKey = "";
    //私钥
    string privateKey = "";
    
    RSACryption rsa = new RSACryption();
    //生成公钥和私钥
    rsa.RSAKey(out privateKey, out publicKey);
    Console.WriteLine($"公钥:{publicKey} 私钥:{privateKey}");
    
    //利用公钥加密
    string encode = rsa.RSAEncrypt(publicKey, txt);
    Console.WriteLine($"加密后的值:{encode}");
    //利用私钥解密
    string decode = rsa.RSADecrypt(privateKey, encode);
    Console.WriteLine($"解密后的值:{decode}");
    //判断
    Assert.AreEqual(txt, decode);

    十一、字符串处理
    1)    简繁转换

    //转为简体
    var jian = StringUtils.GetSimplified(“今天天氣不錯,后天可能會下雪”);
    
    //转为繁体
    var fan = StringUtils.GetTraditional(“今天天气不错,后天可能会下雪”);


    2)    随机数

    var rnd = StringUtils.GetRandomString(); 
    var filename = StringUtils.GetNewFileName();

    3)    中文接音与首字母

    string txtZHCN = "今天天气不错,后天可能会下雪";
    Console.WriteLine($"【今天天气不错,后天可能会下雪】的拼音:{StringUtils.GetChineseSpell(txtZHCN)} 
    ");
    Console.WriteLine($"【今天天气不错,后天可能会下雪】的拼音首字母:{StringUtils.GetChineseSpellFirst(txtZHCN)}
    ");


    十二、反射操作

    //测试实体类
    [Table("DbMaintenanceTest")]
    public class DbMaintenanceTestInfo
    {
        private int id = 0;
        public string uname = "jsonlee"; //private 读不到
    
        [Key]
        [NotMapped]
        public int AutoID { get; set; }
        public string UserName { get; set; }
    }

    反射可以通过dll文件,解析出里面的类、方法、属性、字段等,并调用这些对象。

    readonly string connStr = "server=(local);database=TestDB;uid=sa;pwd=123;";
    readonly string path = AppDomain.CurrentDomain.BaseDirectory   "SinGooCMS.Ado.dll";
    readonly string className = "SinGooCMS.Ado.DbAccess.SqlServerAccess";
    
    //反射获得对象
    IDbAccess dbAccess = (IDbAccess)ReflectionUtil.CreateInstance(path, className, new object[] { connStr });
    var model = dbAccess.Find<DbMaintenanceTestInfo>(1);
    
    //反射获得对象
    var instance = ReflectionUtil.CreateInstance(path, className, new object[] { connStr });
    //反射调用泛型方法
    var model = (DbMaintenanceTestInfo)instance.InvokeMethod("Find", new Type[] { typeof(DbMaintenanceTestInfo) }, new object[] { 1 });
        
    var test = new DbMaintenanceTestInfo() { AutoID = 1, UserName = "jsonlee" };
    //属性操作注意属性不能是私有的
    var userName = test.GetProperty<string>("UserName");
    test.SetProperty("UserName", "刘备");
    
    //字段操作 注意字段不能是私有的
    var fields = test.GetFields();
    var val = test.GetField<string>("uname");
    test.SetField("uname", "张飞");

    十三、执行程序工具
    可以执行系统自带的程序

    //打开浏览器,并打网站
    ProcessUtils.Execute(@"C:Program Files (x86)GoogleChromeApplicationchrome.exe", "http://www.singoo.top");
    
    //关机
    ProcessUtils.Shutdown();
        
    //执行cmd命令
    ProcessUtils.ExecuteCMD(commandTexts);
  • 相关阅读:
    Python 必备神器
    python 常用库
    Sublime Text3 配置 Python2 Python3
    Python JSON
    Sublime Text3 3143 注册码
    EFCode First 导航属性
    EF Code First:实体映射,数据迁移,重构(1)
    Entity Framework 复杂类型
    EF 7 Code First
    EF Code First 导航属性 与外键
  • 原文地址:https://www.cnblogs.com/singoocms/p/14880741.html
Copyright © 2011-2022 走看看