.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);