using Microsoft.Extensions.Caching.Distributed; using NPOI.HSSF.Util; using System; using System.Collections.Generic; using System.Globalization; using System.IO; using System.IO.Compression; using System.Linq; using System.Reflection; using System.Runtime.Loader; using System.Security.Cryptography; using System.Text; using System.Text.RegularExpressions; using WalkingTec.Mvvm.Core.Extensions; using WalkingTec.Mvvm.Core.Support; using WalkingTec.Mvvm.Core.Support.Json; namespace WalkingTec.Mvvm.Core { public class Utils { private static List _allAssemblies; public static string GetCurrentComma() { if (CultureInfo.CurrentUICulture.Name == "zh-cn") { return ":"; } else { return ":"; } } public static List GetAllAssembly() { if (_allAssemblies == null) { _allAssemblies = new List(); string path = null; string singlefile = null; try { path = Assembly.GetEntryAssembly()?.Location; } catch { } if (string.IsNullOrEmpty(path)) { singlefile = System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName; path = Path.GetDirectoryName(singlefile); } var dir = new DirectoryInfo(Path.GetDirectoryName(path)); var dlls = dir.GetFiles("*.dll", SearchOption.TopDirectoryOnly); string[] systemdll = new string[] { "Microsoft.", "System.", "Swashbuckle.", "ICSharpCode", "Newtonsoft.", "Oracle.", "Pomelo.", "SQLitePCLRaw.", "Aliyun.OSS", "BouncyCastle.", "FreeSql.", "Google.Protobuf.dll", "Humanizer.dll", "IdleBus.dll", "K4os.", "MySql.Data.", "Npgsql.", "NPOI.", "netstandard", "MySqlConnector", "VueCliMiddleware" }; var filtered = dlls.Where(x => systemdll.Any(y => x.Name.StartsWith(y)) == false); foreach (var dll in filtered) { try { AssemblyLoadContext.Default.LoadFromAssemblyPath(dll.FullName); } catch { } } var dlllist = AssemblyLoadContext.Default.Assemblies.Where(x => systemdll.Any(y => x.FullName.StartsWith(y)) == false).ToList(); _allAssemblies.AddRange(dlllist); } return _allAssemblies; } public static SimpleMenu FindMenu(string url, List menus) { if (url == null) { return null; } url = url.ToLower(); if (menus == null) { return null; } //寻找菜单中是否有与当前判断的url完全相同的 var menu = menus.Where(x => x.Url != null && x.Url.ToLower() == url).FirstOrDefault(); //如果没有,抹掉当前url的参数,用不带参数的url比对 if (menu == null) { var pos = url.IndexOf("?"); if (pos > 0) { url = url.Substring(0, pos); menu = menus.Where(x => x.Url != null && (x.Url.ToLower() == url || x.Url.ToLower() + "async" == url)).FirstOrDefault(); } } //如果还没找到,则判断url是否为/controller/action/id这种格式,如果是则抹掉/id之后再对比 if (menu == null && url.EndsWith("/index")) { url = url.Substring(0, url.Length - 6); menu = menus.Where(x => x.Url != null && x.Url.ToLower() == url).FirstOrDefault(); } if (menu == null && url.EndsWith("/indexasync")) { url = url.Substring(0, url.Length - 11); menu = menus.Where(x => x.Url != null && x.Url.ToLower() == url).FirstOrDefault(); } return menu; } public static string GetIdByName(string fieldName) { return fieldName == null ? "" : fieldName.Replace(".", "_").Replace("[", "_").Replace("]", "_").Replace("-","minus"); } public static void CheckDifference(IEnumerable oldList, IEnumerable newList, out IEnumerable ToRemove, out IEnumerable ToAdd) where T : TopBasePoco { List tempToRemove = new List(); List tempToAdd = new List(); oldList = oldList ?? new List(); newList = newList ?? new List(); foreach (var oldItem in oldList) { bool exist = false; foreach (var newItem in newList) { if (oldItem.GetID().ToString() == newItem.GetID().ToString()) { exist = true; break; } } if (exist == false) { tempToRemove.Add(oldItem); } } foreach (var newItem in newList) { bool exist = false; foreach (var oldItem in oldList) { if (newItem.GetID().ToString() == oldItem.GetID().ToString()) { exist = true; break; } } if (exist == false) { tempToAdd.Add(newItem); } } ToRemove = tempToRemove.AsEnumerable(); ToAdd = tempToAdd.AsEnumerable(); } public static short GetExcelColor(string color) { var colors = typeof(HSSFColor).GetNestedTypes().ToList(); foreach (var col in colors) { var pro = col.GetField("hexString"); if (pro == null) { continue; } var hex = pro.GetValue(null); var rgb = hex.ToString().Split(':'); for (int i = 0; i < rgb.Length; i++) { if (rgb[i].Length > 2) { rgb[i] = rgb[i].Substring(0, 2); } } int r = Convert.ToInt16(rgb[0], 16); int g = Convert.ToInt16(rgb[1], 16); int b = Convert.ToInt16(rgb[2], 16); if (color.Length == 8) { color = color.Substring(2); } string c1 = color.Substring(0, 2); string c2 = color.Substring(2, 2); string c3 = color.Substring(4, 2); int r1 = Convert.ToInt16(c1, 16); int g1 = Convert.ToInt16(c2, 16); int b1 = Convert.ToInt16(c3, 16); if (r == r1 && g == g1 && b == b1) { return (short)col.GetField("index").GetValue(null); } } return HSSFColor.COLOR_NORMAL; } /// /// 获取Bool类型的下拉框 /// /// /// /// /// /// /// public static List GetBoolCombo(BoolComboTypes boolType, bool? defaultValue = null, string trueText = null, string falseText = null, string selectText = null) { List rv = new List(); string yesText = ""; string noText = ""; switch (boolType) { case BoolComboTypes.YesNo: yesText = CoreProgram._localizer?["Sys.Yes"]; noText = CoreProgram._localizer?["Sys.No"]; break; case BoolComboTypes.ValidInvalid: yesText = CoreProgram._localizer?["Sys.Valid"]; noText = CoreProgram._localizer?["Sys.Invalid"]; break; case BoolComboTypes.MaleFemale: yesText = CoreProgram._localizer?["Sys.Male"]; noText = CoreProgram._localizer?["Sys.Female"]; break; case BoolComboTypes.HaveNotHave: yesText = CoreProgram._localizer?["Sys.Have"]; noText = CoreProgram._localizer?["Sys.NotHave"]; break; case BoolComboTypes.Custom: yesText = trueText ?? CoreProgram._localizer?["Sys.Yes"]; noText = falseText ?? CoreProgram._localizer?["Sys.No"]; break; default: break; } ComboSelectListItem yesItem = new ComboSelectListItem() { Text = yesText, Value = "true" }; if (defaultValue == true) { yesItem.Selected = true; } ComboSelectListItem noItem = new ComboSelectListItem() { Text = noText, Value = "false" }; if (defaultValue == false) { noItem.Selected = true; } if(selectText != null) { rv.Add(new ComboSelectListItem { Text = selectText, Value = "" }); } rv.Add(yesItem); rv.Add(noItem); return rv; } /// /// /// /// /// public static string ZipAndBase64Encode(string input) { byte[] buffer = Encoding.UTF8.GetBytes(input); MemoryStream inputms = new MemoryStream(buffer); MemoryStream outputms = new MemoryStream(); using (GZipStream zip = new GZipStream(outputms, CompressionMode.Compress)) { inputms.CopyTo(zip); } byte[] rv = outputms.ToArray(); inputms.Dispose(); return Convert.ToBase64String(rv); } /// /// /// /// /// public static string UnZipAndBase64Decode(string input) { byte[] inputstr = Convert.FromBase64String(input); MemoryStream inputms = new MemoryStream(inputstr); MemoryStream outputms = new MemoryStream(); using (GZipStream zip = new GZipStream(inputms, CompressionMode.Decompress)) { zip.CopyTo(outputms); } byte[] rv = outputms.ToArray(); outputms.Dispose(); return Encoding.UTF8.GetString(rv); } /// /// /// /// /// public static string EncodeScriptJson(string input) { if (input == null) { return ""; } else { return input.Replace(Environment.NewLine, "").Replace("\"", "\\\\\\\"").Replace("'", "\\'"); } } /// /// /// /// public static void DeleteFile(string path) { try { System.IO.File.Delete(path); } catch { } } #region 格式化文本 add by wuwh 2014.6.12 /// /// 格式化文本 /// /// 要格式化的字符串 /// 是否是纯代码 /// public static string FormatText(string text, bool isCode = false) { if (isCode) { return FormatCode(text); } else { #region 截取需要格式化的代码段 List listInt = new List(); int index = 0; int _index; while (true) { _index = text.IndexOf("&&", index); index = _index + 1; if (_index >= 0 && _index <= text.Length) { listInt.Add(_index); } else { break; } } List listStr = new List(); for (int i = 0; i < listInt.Count; i++) { string temp = text.Substring(listInt[i] + 2, listInt[i + 1] - listInt[i] - 2); listStr.Add(temp); i++; } #endregion #region 格式化代码段 //先将 < >以及空格替换掉,防止下面替换出现 html标签后出现问题 for (int i = 0; i < listStr.Count; i++) { //将 &&代码&& 替换成&&1&& text = text.Replace("&&" + listStr[i] + "&&", FormatCode(listStr[i])); } #endregion return text; } } #endregion #region 格式化代码 edit by wuwh /// /// 格式化代码 /// /// /// public static string FormatCode(string code) { //先将 < >以及空格替换掉,防止下面替换出现 html标签后出现问题 code = code.Replace("<", "<").Replace(">", ">").Replace(" ", " "); string csKeyWords = "abstract|as|base|bool|break|byte|case|catch|char|checked|class|const|continue|decimal|default|delegate|do|double|else|enum|event|explicit|extern|false|finally|fixed|float|for|foreach|from|get|goto|group|if|implicit|in|int|interface|internal|into|is|join|let|lock|long|namespace|new|null|object|operator|orderby|out|override|params|partial|private|protected|public|readonly|ref|return|sbyte|sealed|select|set|short|sizeof|stackalloc|static|string|struct|switch|this|throw|true|try|typeof|uint|ulong|unchecked|unsafe|ushort|using|value|var|virtual|void|volatile|where|while|yield"; string r1 = "(#if DBG[\\s\\S]+?#endif)"; string r2 = "(#[a-z ]*)"; string r3 = "(///\\ *<[/\\w]+>)"; string r4 = "(/\\*[\\s\\S]*?\\*/)";//匹配三杠注释 string r5 = "(//.*)";//匹配双杠注释 string r6 = @"(@?"".*?"")";//匹配字符串 string r7 = "('.*?')";//匹配字符串 string r8 = "\\b(" + csKeyWords + ")\\b";//匹配关键字 //string r9 = "class (.+) ";//匹配类 //string r10 = "<(.+)>";//匹配泛型类 string rs = string.Format("{0}|{1}|{2}|{3}|{4}|{5}|{6}|{7}", r1, r2, r3, r4, r5, r6, r7, r8); //string rs = string.Format("{0}|{1}|{2}|{3}|{4}|{5}|{6}|{7}|{8}|{9}", r1, r2, r3, r4, r5, r6, r7, r8, r9,r10); //$9$10 string rr = "$1$2$3$4$5$6$7$8"; Regex re = new Regex(rs, RegexOptions.None); code = Regex.Replace(code, rs, rr); //替换换行符"\r\n" 以及"\r" "\n" code = code.Replace("\r\n", "
").Replace("\n", "").Replace("\r", "
"); //取消空标签 //|C#类的颜色 code = Regex.Replace(code, "|||", ""); return code; } #endregion #region 读取txt文件 /// /// 读取文件 /// /// 文件路径绝对 /// public static string ReadTxt(string path) { string result = string.Empty; if (File.Exists(path)) { using (Stream fs = File.Open(path, FileMode.Open, FileAccess.Read, FileShare.Read)) { using (TextReader sr = new StreamReader(fs, UnicodeEncoding.UTF8)) { result = sr.ReadToEnd(); } } } return result; } #endregion /// /// 得到目录下所有文件 /// /// /// public static List GetAllFileName(string dirpath) { DirectoryInfo dir = new DirectoryInfo(dirpath); var files = dir.GetFileSystemInfos(); return files.Select(x => x.Name).ToList(); } #region add by wuwh 2014.10.18 递归获取目录下所有文件 /// /// 递归获取目录下所有文件 /// /// /// /// public static List GetAllFilePathRecursion(string dirPath, List allFiles) { if (allFiles == null) { allFiles = new List(); } string[] subPaths = Directory.GetDirectories(dirPath); foreach (var item in subPaths) { GetAllFilePathRecursion(item, allFiles); } allFiles.AddRange(Directory.GetFiles(dirPath).ToList()); return allFiles; } #endregion /// /// ConvertToColumnXType /// /// /// public static string ConvertToColumnXType(Type type) { if (type == typeof(bool) || type == typeof(bool?)) { return "checkcolumn"; } else if (type == typeof(DateTime) || type == typeof(DateTime?)) { return "datecolumn"; } else if (type == typeof(decimal) || type == typeof(decimal?) || type == typeof(double) || type == typeof(double?) || type == typeof(int) || type == typeof(int?) || type == typeof(long) || type == typeof(long?)) { return "numbercolumn"; } return "textcolumn"; } public static string GetCS(string cs, string mode, Configs config) { if (string.IsNullOrEmpty(cs) || config.Connections.Any(x => x.Key.ToLower() == cs.ToLower()) == false) { cs = "default"; } int index = cs.LastIndexOf("_"); if (index > 0) { cs = cs.Substring(0, index); } if (mode?.ToLower() == "read") { var reads = config.Connections.Where(x => x.Key.StartsWith(cs + "_")).Select(x => x.Key).ToList(); if (reads.Count > 0) { Random r = new Random(); var v = r.Next(0, reads.Count); cs = reads[v]; } } return cs; } public static string GetUrlByFileAttachmentId(IDataContext dc, Guid? fileAttachmentId, bool isIntranetUrl = false, string urlHeader = null) { string url = string.Empty; var fileAttachment = dc.Set().Where(x => x.ID == fileAttachmentId.Value).FirstOrDefault(); if (fileAttachment != null) { url = "/_Framework/GetFile/" + fileAttachmentId.ToString(); } return url; } #region 加解密 /// /// 通过密钥将内容加密 /// /// 要加密的字符串 /// 加密密钥 /// public static string EncryptString(string stringToEncrypt, string encryptKey) { if (string.IsNullOrEmpty(stringToEncrypt)) { return ""; } string stringEncrypted = string.Empty; byte[] bytIn = UTF8Encoding.UTF8.GetBytes(stringToEncrypt); MemoryStream encryptStream = new System.IO.MemoryStream(); CryptoStream encStream = new CryptoStream(encryptStream, GenerateDESCryptoServiceProvider(encryptKey).CreateEncryptor(), CryptoStreamMode.Write); try { encStream.Write(bytIn, 0, bytIn.Length); encStream.FlushFinalBlock(); stringEncrypted = Convert.ToBase64String(encryptStream.ToArray(), 0, (int)encryptStream.Length); } catch { return ""; } finally { encryptStream.Close(); encStream.Close(); } return stringEncrypted; } /// /// 通过密钥讲内容解密 /// /// 要解密的字符串 /// 密钥 /// public static string DecryptString(string stringToDecrypt, string encryptKey) { if (String.IsNullOrEmpty(stringToDecrypt)) { return ""; } string stringDecrypted = string.Empty; byte[] bytIn = Convert.FromBase64String(stringToDecrypt.Replace(" ", "+")); MemoryStream decryptStream = new MemoryStream(); CryptoStream encStream = new CryptoStream(decryptStream, GenerateDESCryptoServiceProvider(encryptKey).CreateDecryptor(), CryptoStreamMode.Write); try { encStream.Write(bytIn, 0, bytIn.Length); encStream.FlushFinalBlock(); stringDecrypted = Encoding.Default.GetString(decryptStream.ToArray()); } catch { return ""; } finally { decryptStream.Close(); encStream.Close(); } return stringDecrypted; } private static DESCryptoServiceProvider GenerateDESCryptoServiceProvider(string key) { DESCryptoServiceProvider dCrypter = new DESCryptoServiceProvider(); string sTemp; if (dCrypter.LegalKeySizes.Length > 0) { int moreSize = dCrypter.LegalKeySizes[0].MinSize; while (key.Length > 8) { key = key.Substring(0, 8); } sTemp = key.PadRight(moreSize / 8, ' '); } else { sTemp = key; } byte[] bytKey = UTF8Encoding.UTF8.GetBytes(sTemp); dCrypter.Key = bytKey; dCrypter.IV = bytKey; return dCrypter; } #endregion #region MD5加密 /// /// 字符串MD5加密 /// /// /// 返回大写32位MD5值 public static string GetMD5String(string str) { byte[] buffer = Encoding.UTF8.GetBytes(str); return MD5String(buffer); } /// /// 流MD5加密 /// /// /// public static string GetMD5Stream(Stream stream) { byte[] buffer = new byte[stream.Length]; stream.Read(buffer, 0, buffer.Length); return MD5String(buffer); } /// /// 文件MD5加密 /// /// /// 返回大写32位MD5值 public static string GetMD5File(string path) { if (File.Exists(path)) { using (FileStream fs = new FileStream(path, FileMode.Open)) { return GetMD5Stream(fs); } } else { return string.Empty; } } private static string MD5String(byte[] buffer) { MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider(); byte[] cryptBuffer = md5.ComputeHash(buffer); StringBuilder sb = new StringBuilder(); foreach (byte item in cryptBuffer) { sb.Append(item.ToString("X2")); } return sb.ToString(); } #endregion /// /// 重新处理 返回所有ispage模块 /// /// /// 是否需要action /// public static List ResetModule(List modules, bool submit = true) { var m = modules.Select(x => new SimpleModule { ActionDes = x.ActionDes, Actions = x.Actions.Select(y => new SimpleAction { ActionDes = y.ActionDes, ActionName = y.ActionName, Url = y.Url, MethodName = y.MethodName, IgnorePrivillege = y.IgnorePrivillege, ID = y.ID, Module = y.Module, ModuleId = y.ModuleId, Parameter = y.Parameter, ParasToRunTest = y.ParasToRunTest }).ToList(), Area = x.Area, AreaId = x.AreaId, ClassName = x.ClassName, _name = x._name, ID = x.ID, IgnorePrivillege = x.IgnorePrivillege, IsApi = x.IsApi, ModuleName = x.ModuleName, NameSpace = x.NameSpace, }).ToList(); var mCount = m.Count; var toRemove = new List(); for (int i = 0; i < mCount; i++) { var pages = m[i].Actions?.Where(x => x.ActionDes?.IsPage == true).ToList(); if (pages != null) { for (int j = 0; j < pages.Count; j++) { if (j == 0 && !m[i].Actions.Any(x => x.MethodName.ToLower() == "index")) { m.Add(new SimpleModule { ModuleName = pages[j].ActionDes._localizer[pages[j].ActionDes.Description], NameSpace = m[i].NameSpace, ClassName = pages[j].MethodName, Actions = m[i].Actions, Area = m[i].Area }); if (submit) m[i].Actions.Remove(pages[j]); toRemove.Add(m[i]); } else { if (pages[j].MethodName.ToLower() != "index") { m.Add(new SimpleModule { ModuleName = pages[j].ActionDes._localizer[pages[j].ActionDes.Description], NameSpace = m[i].NameSpace, ClassName = pages[j].MethodName, Actions = submit ? new List() : new List() { pages[j] }, Area = m[i].Area }); m[i].Actions.Remove(pages[j]); } } } } } toRemove.ForEach(x => m.Remove(x)); return m; } } }