CommonUtils.cs 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302
  1. using MailKit.Net.Smtp;
  2. using MimeKit;
  3. using Newtonsoft.Json;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Text.RegularExpressions;
  9. using System.Threading.Tasks;
  10. using System.Xml.Linq;
  11. namespace JiaZhiQuan.Common
  12. {
  13. public class MailInfo
  14. {
  15. public string Account { get; set; }
  16. public string AuthCode { get; set; }
  17. /// <summary>
  18. /// Key为Address,Value为Name
  19. /// </summary>
  20. public Dictionary<string, string> MailToDic { get; set; }
  21. public string MailFromName { get; set; }
  22. public string MailFromAddr { get; set; }
  23. public string Subject { get; set; }
  24. public string Content { get; set; }
  25. }
  26. public class CommunityTextSegment
  27. {
  28. /// <summary>
  29. /// 类型:0 纯文本 1 @的用户编号(content为通过逗号分隔,前段为id,后段为昵称)
  30. /// </summary>
  31. public int type { get; set; }
  32. public string content { get; set; }
  33. }
  34. public static class CommonUtils
  35. {
  36. /// <summary>
  37. /// 将dateTime格式转换为Unix时间戳
  38. /// </summary>
  39. public static long DateTimeToUnixTime(DateTime dateTime)
  40. {
  41. return (long)(dateTime - TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1))).TotalSeconds;
  42. }
  43. public async static Task SendEmail(MailInfo info)
  44. {
  45. var message = new MimeMessage();
  46. message.From.Add(new MailboxAddress(info.MailFromName, info.MailFromAddr));
  47. message.To.AddRange(info.MailToDic.ToList().Select(e => new MailboxAddress(e.Key, e.Value)));
  48. message.Subject = info.Subject;
  49. message.Body = new TextPart("plain") { Text = info.Content };
  50. using var client = new SmtpClient();
  51. client.Connect("smtp.exmail.qq.com", 465, true);
  52. await client.AuthenticateAsync(info.Account, info.AuthCode);
  53. await client.SendAsync(message);
  54. client.Disconnect(true);
  55. }
  56. public static string GetFirstOrDefaultImage(string imgs)
  57. {
  58. if (string.IsNullOrEmpty(imgs))
  59. {
  60. return null;
  61. }
  62. return imgs.Split(',', StringSplitOptions.RemoveEmptyEntries).FirstOrDefault();
  63. }
  64. /// <summary>
  65. /// Mock用户的数据中心Id为21
  66. /// </summary>
  67. public static bool IsMockUser(long userId)
  68. {
  69. var dataCenterId = userId >> 17 & 31;
  70. return dataCenterId == 21;
  71. }
  72. /// <summary>
  73. /// 取字符串右边多少个字符,前面的字符使用*号。rightCharCount如果<=0,则默认为1
  74. /// </summary>
  75. public static string TakeRightSubString(string original, int rightCharCount)
  76. {
  77. if (string.IsNullOrEmpty(original))
  78. {
  79. return string.Empty;
  80. }
  81. if (rightCharCount <= 0) rightCharCount = 1;
  82. StringBuilder sb = new StringBuilder();
  83. for (var i = 0; i < original.Length; i++)
  84. {
  85. sb.Append(i + rightCharCount >= original.Length ? original[i] : '*');
  86. }
  87. return sb.ToString();
  88. }
  89. /// <summary>
  90. /// 取字符串左边多少个字符,后面的字符使用*号。leftCharCount如果<=0,则默认为1
  91. /// </summary>
  92. public static string TakeLeftSubString(string original, int leftCharCount)
  93. {
  94. if (string.IsNullOrEmpty(original))
  95. {
  96. return string.Empty;
  97. }
  98. if (leftCharCount <= 0) leftCharCount = 1;
  99. StringBuilder sb = new StringBuilder();
  100. for (var i = 0; i < original.Length; i++)
  101. {
  102. sb.Append(leftCharCount + i >= original.Length ? '*' : original[i]);
  103. }
  104. return sb.ToString();
  105. }
  106. public static string Md5Encrypt(string strSource)
  107. {
  108. byte[] result = Encoding.Default.GetBytes(strSource);
  109. var md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
  110. byte[] output = md5.ComputeHash(result);
  111. return BitConverter.ToString(output).Replace("-", "");
  112. }
  113. /// <summary>
  114. /// 比较版本号,版本号如:v3.2.2 或 3.2.2
  115. /// </summary>
  116. public static int CompareVersion(string version1, string version2)
  117. {
  118. try
  119. {
  120. var chars = new char[] { 'v', 'V' };
  121. var nums1 = (version1 ?? string.Empty).Trim(chars).Split('.').Select(e => int.Parse(e)).ToList();
  122. var nums2 = (version2 ?? string.Empty).Trim(chars).Split('.').Select(e => int.Parse(e)).ToList();
  123. var maxLen = Math.Max(nums1.Count, nums2.Count);
  124. for (var i = 0; i < maxLen; i++)
  125. {
  126. var val1 = nums1.Count > i ? nums1[i] : 0;
  127. var val2 = nums2.Count > i ? nums2[i] : 0;
  128. if (val1 > val2)
  129. {
  130. return 1;
  131. }
  132. else if (val1 < val2)
  133. {
  134. return -1;
  135. }
  136. }
  137. return 0;
  138. }
  139. catch
  140. {
  141. return string.Compare(version1, version2);
  142. }
  143. }
  144. #region 动态评论相关
  145. /// <summary>
  146. /// 解析社区文本,并返回纯文本表示
  147. /// </summary>
  148. public static string GetPlainTextByCommunityText(string content)
  149. {
  150. if (string.IsNullOrWhiteSpace(content)) return string.Empty;
  151. try
  152. {
  153. var sb = new StringBuilder();
  154. var segList = TransformCommunityText(content);
  155. if (segList != null && segList.Count > 0)
  156. {
  157. return GetPlainTextByCommunityTextSegments(segList);
  158. }
  159. else
  160. {
  161. return string.Empty;
  162. }
  163. }
  164. catch
  165. {
  166. return content;
  167. }
  168. }
  169. /// <summary>
  170. /// 通过社区文本对象,获取纯文本表示
  171. /// </summary>
  172. /// <param name="segList"></param>
  173. /// <returns></returns>
  174. public static string GetPlainTextByCommunityTextSegments(IList<CommunityTextSegment> segList)
  175. {
  176. try
  177. {
  178. var sb = new StringBuilder();
  179. foreach (var item in segList)
  180. {
  181. if (item.type == 0)
  182. {
  183. sb.Append(item.content);
  184. }
  185. else if (item.type == 1)
  186. {
  187. sb.Append("@" + item.content.Split(',')[0]);
  188. }
  189. }
  190. return sb.ToString();
  191. }
  192. catch
  193. {
  194. return string.Empty;
  195. }
  196. }
  197. /// <summary>
  198. /// 解析社区文本,返回社区文本对象
  199. /// </summary>
  200. public static IList<CommunityTextSegment> TransformCommunityText(string content)
  201. {
  202. try
  203. {
  204. return JsonConvert.DeserializeObject<IList<CommunityTextSegment>>(content);
  205. }
  206. catch
  207. {
  208. return null;
  209. }
  210. }
  211. #endregion
  212. public static string GetIdCardDisplayName(string name)
  213. {
  214. if (string.IsNullOrEmpty(name)) return "";
  215. var str = "";
  216. var i = 0;
  217. name.ForEach(e =>
  218. {
  219. if (i == 0)
  220. {
  221. str += e;
  222. }
  223. else
  224. {
  225. str += "*";
  226. }
  227. i++;
  228. });
  229. return str;
  230. }
  231. public static string GetIdCardDisplayCode(string code)
  232. {
  233. if (string.IsNullOrEmpty(code)) return "";
  234. var str = "";
  235. var i = 0;
  236. code.ForEach(e =>
  237. {
  238. if (i == 0 || i == code.Length - 1)
  239. {
  240. str += e;
  241. }
  242. else
  243. {
  244. str += "*";
  245. }
  246. i++;
  247. });
  248. return str;
  249. }
  250. private static Regex ProvinceOrCityEndReg = new Regex("(市)|(省)|(自治区)|(特别行政区)|(盟)|(自治州)|(地区)|(蒙古自治州)|(柯尔克孜自治州)|(哈萨克自治州)$");
  251. private static Regex ProvinceOrCityReplaceReg =
  252. new Regex("(壮族)|(回族)|(维吾尔)|(朝鲜族)|(土家族)|(苗族)|(藏族)|(羌族)|(彝族)|(布依族)|(侗族)|(哈尼族)|(傣族)|(白族)|(景颇族)|(傈僳族)|(蒙古族)");
  253. /// <summary>
  254. /// 获取省或市简要名称
  255. /// </summary>
  256. public static string GetShortNameOfProvinceAndCity(string provinceOrCityName)
  257. {
  258. return ProvinceOrCityEndReg.Replace(ProvinceOrCityReplaceReg.Replace(provinceOrCityName, ""), "");
  259. }
  260. /// <summary>
  261. /// 计算金额
  262. /// </summary>
  263. /// <param name="numerator"></param>
  264. /// <param name="denominator"></param>
  265. /// <returns></returns>
  266. public static decimal DivideAndRound(int numerator, int denominator) {
  267. decimal result = (decimal)numerator / denominator;
  268. return Math.Round(result, 2, MidpointRounding.AwayFromZero);
  269. }
  270. }
  271. }