1. 程式人生 > 其它 >.net 工具集之SinGooCMS.Utility

.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} \r\n",123.9m.ToRMB());
builder.AppendFormat("123456789轉掩碼:{0} \r\n", "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
"[email protected]".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()} \r\n");
builder.Append($"快取時間:{cacheDT.ToFormatString()} \r\n");

3) CookieUtils
一般使用者登入,驗證成功後會寫入使用者標識,比如使用者ID等。CookieUtils用於對瀏覽器cookie的操作管理,對於現在隱私權的越來越重視,部門瀏覽器對儲存cookie很謹慎,.net core在配置中需要設定寬鬆策略。
如:

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

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"))} \r\n");

四、 序列化
包括對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}\r\n");
Console.WriteLine($"SQLConnSTR:{ConfigUtils.DefConnStr}\r\n");
//appsetting
Console.WriteLine($"EnableCache:{ConfigUtils.GetAppSetting<string>("EnableCache")}\r\n");

六、 圖片處理
在專案中經常會上傳圖片檔案,我們可以對圖片進行適當的處理,比如對大檔案壓縮尺寸,建立縮圖供快速瀏覽,建立水印圖用於保護權利等。
如:

//檔案轉影象型別
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:\jsonlee\study\test\logo.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:\jsonlee\W3Cschool-v2.1.0-win32-x64.zip", @"F:\ABC");

2) 共享檔案
共享檔案的操作和本地檔案的一樣的。但首先要連線,連線使用網路命令net use。

ShareFileUtils.DisconnectAll(); //斷開所有連線

string path = @"\\192.168.1.120";
string uid = @"luxshare\11000890";
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:\jsonlee\study"); //遞迴讀取目錄下所有檔案(包括子多層目錄下的檔案)

八、 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)} \r\n");
Console.WriteLine($"【今天天氣不錯,後天可能會下雪】的拼音首字母:{StringUtils.GetChineseSpellFirst(txtZHCN)}\r\n");


十二、反射操作

//測試實體類
[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)\Google\Chrome\Application\chrome.exe", "http://www.singoo.top");

//關機
ProcessUtils.Shutdown();
 
//執行cmd命令
ProcessUtils.ExecuteCMD(commandTexts);