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=%E5%88%98%E5%A4%87&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()} \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);