Application/IStation.Application.OpenApi/test/report/Report_ShysController.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
Application/IStation.Application.OpenApi/test/report/dto/UserLoginLogItem.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
Application/IStation.Application.OpenApi/test/report/dto/UserLoginLogReportDto.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
Application/IStation.Application.OpenApi/test/report/helper/XmlHelper.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
Entry/IStation.WebApi.Entry/Properties/PublishProfiles/FolderProfile.pubxml.user | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
Application/IStation.Application.OpenApi/test/report/Report_ShysController.cs
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,110 @@ using Microsoft.AspNetCore.Mvc; using System.Net; using System.Net.Http.Headers; using Microsoft.Extensions.Hosting.Internal; using Microsoft.AspNetCore.Http.Extensions; using IStation.Untity; using Furion.DynamicApiController; using System.ComponentModel.DataAnnotations; using Mapster; using Microsoft.AspNetCore.Authorization; namespace IStation.Application { /// <summary> /// æµè¯æ¥è¡¨ /// </summary> [Route("OpenApi/Test/Report")] [ApiDescriptionSettings("OpenApi", Name = "æµè¯æ¥è¡¨", Order = 1001)] public class Report_ShysController : IDynamicApiController { public readonly static Dictionary<string, string> ProvinceCodeDic = new Dictionary<string, string> { { "åå·ç", "510000" }, { "å京å¸", "110000" }, { "天津å¸", "120000" }, { "æ²³åç", "130000" }, { "山西ç", "140000" }, { "å èå¤èªæ²»åº", "150000" }, { "è¾½å®ç", "210000" }, { "åæç", "220000" }, { "é»é¾æ±ç", "230000" }, { "䏿µ·å¸", "310000" }, { "æ±èç", "320000" }, { "æµæ±ç", "330000" }, { "å®å¾½ç", "340000" }, { "ç¦å»ºç", "350000" }, { "æ±è¥¿ç", "360000" }, { "å±±ä¸ç", "370000" }, { "æ²³åç", "410000" }, { "æ¹åç", "420000" }, { "æ¹åç", "430000" }, { "广ä¸ç", "440000" }, { "å¹¿è¥¿èªæ²»åº", "450000" }, { "æµ·åç", "460000" }, { "éåºå¸", "500000" }, { "è´µå·ç", "520000" }, { "äºåç", "530000" }, { "西èèªæ²»åº", "540000" }, { "é西ç", "610000" }, { "çèç", "620000" }, { "éæµ·ç", "630000" }, { "å®å¤èªæ²»åº", "640000" }, { "æ°çèªæ²»åº", "650000" }, { "å°æ¹¾ç", "710000" }, { "馿¸¯ç¹å«è¡æ¿åº", "810000" }, { "æ¾³é¨ç¹å«è¡æ¿åº", "820000" } }; /// <summary> /// ç¨æ·æ¥å¿åææ¥è¡¨ /// </summary> [AllowAnonymous] [NonUnify] [Route("UserLoginLogReport")] [HttpPost] public UserLoginLogReportDto UserLoginLogReport(DateTime StartDate) { var corps = new Service.Corpration().GetAll(); if (corps == null || corps.Count < 1) return default; var users = new Service.User().GetAll(); if (users == null || users.Count < 1) return default; var logs = new Service.UserLoginLog().GetListByStartDate(StartDate); if (logs == null || logs.Count < 1) return default; var dto = new UserLoginLogReportDto(); dto.LoginLogList = new List<UserLoginLogItem>(); dto.TotalUsers = users.Count; var uniqueVisitorList = logs.DistinctBy(x => x.UserID).ToList(); var last7Days = DateTime.Now.AddDays(-7); var last30Days = DateTime.Now.AddDays(-30); dto.TodayUV = uniqueVisitorList.Where(x => x.LoginTime >= DateTime.Today).Count(); dto.Last7DaysUV = uniqueVisitorList.Where(x => x.LoginTime >= last7Days).Count(); dto.Last30DaysUV = uniqueVisitorList.Where(x => x.LoginTime >= last30Days).Count(); var logGroups = logs.GroupBy(x => x.CorpID); foreach (var logGroup in logGroups) { var corp = corps.Find(x => x.ID == logGroup.Key); foreach (var log in logGroup) { var area = RandomValues(ProvinceCodeDic, 1).First().Key; var item = new UserLoginLogItem(log, corp.ShortName, area); dto.LoginLogList.Add(item); } } var ReportPath = Path.Combine(Settings.DataFile.SaveFileUrl, @"UserloginLogReport"); if (!Directory.Exists(ReportPath)) Directory.CreateDirectory(ReportPath); var yyMM = DateTime.Today.ToString("yyyy-MM"); var filePath = Path.Combine(ReportPath, yyMM + ".xml"); filePath = filePath.Replace(@"\\", @"/"); XmlHelper<UserLoginLogReportDto>.SaveObjectXmlFile(filePath, dto); return dto; } /// <summary> /// è·åDictionaryä¸ä¸éå¤çéæºDictionary /// </summary> /// <typeparam name="TKey"></typeparam> /// <typeparam name="TValue"></typeparam> /// <param name="dict">ådictionary</param> /// <param name="count">è¿åéæºä¸ªæ°(妿dictæ»ä¸ªæ°å°äºcount åè¿ådictæ»ä¸ªæ°)</param> /// <returns></returns> public static Dictionary<TKey, TValue> RandomValues<TKey, TValue>(Dictionary<TKey, TValue> dict, int count) { Random rand = new Random(); Dictionary<TKey, TValue> dic = new Dictionary<TKey, TValue>(); int size = dict.Count; count = count > size ? size : count; List<TKey> values = Enumerable.ToList(dict.Keys); while (dic.Count < count) { TKey tk = values[rand.Next(size)]; if (!dic.Keys.Contains(tk)) { dic[tk] = dict[tk]; } } return dic; } } } Application/IStation.Application.OpenApi/test/report/dto/UserLoginLogItem.cs
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,91 @@ using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace IStation.Application { /// <summary> /// ç¨æ·æ¥å¿æ¥è¡¨é¡¹ /// </summary> public class UserLoginLogItem { /// <summary> /// /// </summary> public UserLoginLogItem() { } /// <summary> /// /// </summary> public UserLoginLogItem(Model.UserLoginLog rhs) { this.SoftType = rhs.SoftType; this.SoftTag = rhs.SoftTag; this.UserID = rhs.UserID; this.InputLoginName = rhs.InputLoginName; this.LoginTime = rhs.LoginTime; this.LoginIP = rhs.LoginIP; this.Message = rhs.Message; } /// <summary> /// /// </summary> public UserLoginLogItem(Model.UserLoginLog rhs, string corpName, string area) : this(rhs) { this.CorpName = corpName; this.Area = area; } /// <summary> /// ç¨æ·æ è¯ /// </summary> public long UserID { get; set; } /// <summary> /// è¾å ¥ç»å½åç§° /// </summary> public string InputLoginName { get; set; } /// <summary> /// ç»å½æ¶é´ /// </summary> public DateTime LoginTime { get; set; } /// <summary> /// ç»å½IP /// </summary> public string LoginIP { get; set; } /// <summary> /// å ¬å¸åç§° /// </summary> public string CorpName { get; set; } /// <summary> /// å°åº /// </summary> public string Area { get; set; } /// <summary> /// 软件类å /// </summary> public string SoftType { get; set; } /// <summary> /// 软件æ ç¾ /// </summary> public string SoftTag { get; set; } /// <summary> /// ä¿¡æ¯ /// </summary> public string Message { get; set; } } } Application/IStation.Application.OpenApi/test/report/dto/UserLoginLogReportDto.cs
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,40 @@ using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace IStation.Application { /// <summary> /// ç¨æ·æ¥å¿æ¥è¡¨Dto /// </summary> public class UserLoginLogReportDto { /// <summary> /// æ»ç¨æ·äººæ° /// </summary> public int TotalUsers { get; set; } /// <summary> /// 仿¥è®¿å®¢æ°é /// </summary> public int TodayUV { get; set; } /// <summary> /// æè¿7天访客æ°é /// </summary> public int Last7DaysUV { get; set; } /// <summary> /// æè¿30天访客æ°é /// </summary> public int Last30DaysUV { get; set; } /// <summary> /// ç»éæ¥å¿é¡¹ /// </summary> public List<UserLoginLogItem> LoginLogList { get; set; } } } Application/IStation.Application.OpenApi/test/report/helper/XmlHelper.cs
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,62 @@ using System; using System.IO; using System.Text; using System.Xml; using System.Xml.Serialization; namespace IStation.Application { /// <summary> /// /// </summary> /// <typeparam name="T"></typeparam> public class XmlHelper<T> where T : class { /// <summary> /// 对象çæXmlææ¡£ /// </summary> public string ObjectToXml(T obj) { using (StringWriter writer = new StringWriter()) { XmlSerializer serializer = new XmlSerializer(obj.GetType()); serializer.Serialize(writer, obj); return writer.ToString(); } } /// <summary> /// xmlææ¡£çæç±» /// </summary> public T XmlToObject(string xmlStr) { try { using (StringReader reader = new StringReader(xmlStr)) { XmlSerializer serializer = new XmlSerializer(typeof(T)); return serializer.Deserialize(reader) as T; } } catch (Exception ex) { var a = ex.Message; return null; } } /// <summary> /// ä¿å对象å°xmlæä»¶ä¸ /// </summary> public static void SaveObjectXmlFile<T>(string fileName, T t) where T : class { var str = new XmlHelper<T>().ObjectToXml(t); File.WriteAllText(fileName, str, Encoding.UTF8); } } } Entry/IStation.WebApi.Entry/Properties/PublishProfiles/FolderProfile.pubxml.user
@@ -5,7 +5,7 @@ <Project> <PropertyGroup> <_PublishTargetUrl>D:\WorkData\IStation\IStationV4.1\Core\Service.V4.1\Entry\IStation.WebApi.Entry\bin\Release\net6.0\publish\</_PublishTargetUrl> <History>True|2022-12-08T07:02:22.5370248Z;True|2022-12-08T13:33:49.0557037+08:00;True|2022-12-08T13:26:29.9328742+08:00;False|2022-12-08T13:24:31.2512796+08:00;False|2022-12-08T13:21:44.3184417+08:00;True|2022-12-05T14:30:36.3961706+08:00;True|2022-12-05T14:27:43.9156234+08:00;True|2022-11-29T17:14:16.9758449+08:00;True|2022-11-29T11:38:23.5655208+08:00;True|2022-11-29T11:07:46.1871980+08:00;True|2022-11-29T11:03:45.1830032+08:00;True|2022-11-23T11:33:19.0882717+08:00;False|2022-11-23T11:30:48.0902065+08:00;False|2022-11-23T11:29:51.3610102+08:00;True|2022-11-14T21:11:17.8644235+08:00;True|2022-11-14T20:14:03.5550088+08:00;True|2022-11-14T19:17:19.2326062+08:00;True|2022-11-14T19:16:47.8958868+08:00;True|2022-11-14T19:05:18.2549422+08:00;True|2022-11-14T18:26:42.3745462+08:00;True|2022-11-14T17:38:44.6271564+08:00;True|2022-11-14T17:34:15.2334450+08:00;False|2022-11-14T17:14:35.5279015+08:00;True|2022-11-14T16:24:47.6469529+08:00;True|2022-11-14T15:37:59.2295089+08:00;True|2022-11-14T09:52:42.7169668+08:00;True|2022-11-11T13:19:08.1283593+08:00;True|2022-11-09T22:12:02.6483295+08:00;True|2022-11-09T21:11:04.3739799+08:00;True|2022-11-09T21:06:00.4538306+08:00;True|2022-11-09T20:55:34.2803958+08:00;True|2022-11-09T20:17:02.9468337+08:00;True|2022-11-09T18:07:35.3930811+08:00;True|2022-11-09T18:05:51.4828275+08:00;True|2022-11-09T16:17:12.1733545+08:00;True|2022-11-09T11:43:22.1152393+08:00;True|2022-11-04T11:18:49.1736708+08:00;False|2022-11-04T11:16:30.1928291+08:00;False|2022-11-04T11:15:20.2275455+08:00;False|2022-11-04T11:14:39.1289337+08:00;True|2022-11-04T11:04:37.8317148+08:00;True|2022-11-03T14:34:55.1009241+08:00;True|2022-11-03T14:16:29.1563357+08:00;True|2022-11-03T13:46:10.8366547+08:00;True|2022-11-03T11:48:24.5399936+08:00;True|2022-10-31T14:36:59.4971398+08:00;True|2022-10-28T13:58:42.2473049+08:00;True|2022-10-28T13:42:58.7180735+08:00;True|2022-10-28T12:56:06.9517417+08:00;True|2022-10-28T09:37:04.8336241+08:00;True|2022-10-27T16:13:52.0290129+08:00;True|2022-10-27T14:51:12.0416021+08:00;True|2022-10-27T14:46:01.8195700+08:00;True|2022-10-27T14:38:00.5077582+08:00;True|2022-10-27T14:28:16.2348825+08:00;False|2022-10-27T14:27:49.2720060+08:00;False|2022-10-27T14:27:25.1445739+08:00;True|2022-10-26T11:27:54.4483138+08:00;True|2022-10-26T11:19:37.6322046+08:00;True|2022-10-26T11:10:05.4129456+08:00;True|2022-10-25T16:33:32.7872520+08:00;True|2022-10-24T16:12:49.4291001+08:00;True|2022-10-24T16:10:25.3757944+08:00;True|2022-10-24T14:04:51.7783988+08:00;True|2022-10-21T18:51:32.0221235+08:00;True|2022-10-21T18:35:12.1463858+08:00;True|2022-10-21T09:54:19.2138550+08:00;True|2022-10-21T09:38:21.1672347+08:00;True|2022-10-19T12:04:59.9103579+08:00;True|2022-10-19T11:57:45.1000513+08:00;True|2022-10-19T11:49:03.6494799+08:00;True|2022-10-19T11:06:22.4198711+08:00;True|2022-10-18T11:17:20.1435537+08:00;True|2022-10-18T09:08:58.6802639+08:00;True|2022-10-17T16:33:12.8912333+08:00;True|2022-10-17T14:23:10.0264671+08:00;True|2022-10-17T14:16:07.3590282+08:00;True|2022-10-17T11:53:21.9425089+08:00;True|2022-10-17T11:45:51.9336429+08:00;True|2022-10-14T14:37:15.6323508+08:00;True|2022-10-11T09:01:44.5831439+08:00;True|2022-10-09T14:03:43.6568874+08:00;True|2022-10-09T11:15:56.2934983+08:00;True|2022-10-09T09:39:28.1074512+08:00;True|2022-10-08T18:45:23.9581502+08:00;True|2022-10-08T18:35:18.5574217+08:00;True|2022-10-08T16:12:04.2903137+08:00;True|2022-10-08T15:59:54.5588351+08:00;True|2022-10-08T15:55:01.2711550+08:00;True|2022-10-08T15:19:08.5487617+08:00;True|2022-10-08T15:11:55.8626990+08:00;False|2022-10-08T15:02:33.5639703+08:00;True|2022-10-08T09:23:21.6592006+08:00;True|2022-10-07T15:35:37.7532304+08:00;True|2022-10-07T15:04:51.9161653+08:00;False|2022-10-07T14:58:32.8816319+08:00;False|2022-10-07T14:54:55.4175944+08:00;False|2022-10-07T14:52:46.7215376+08:00;False|2022-10-07T14:51:14.0508027+08:00;False|2022-10-07T14:49:57.6007572+08:00;</History> <History>True|2022-12-09T02:43:23.4654553Z;True|2022-12-08T15:02:22.5370248+08:00;True|2022-12-08T13:33:49.0557037+08:00;True|2022-12-08T13:26:29.9328742+08:00;False|2022-12-08T13:24:31.2512796+08:00;False|2022-12-08T13:21:44.3184417+08:00;True|2022-12-05T14:30:36.3961706+08:00;True|2022-12-05T14:27:43.9156234+08:00;True|2022-11-29T17:14:16.9758449+08:00;True|2022-11-29T11:38:23.5655208+08:00;True|2022-11-29T11:07:46.1871980+08:00;True|2022-11-29T11:03:45.1830032+08:00;True|2022-11-23T11:33:19.0882717+08:00;False|2022-11-23T11:30:48.0902065+08:00;False|2022-11-23T11:29:51.3610102+08:00;True|2022-11-14T21:11:17.8644235+08:00;True|2022-11-14T20:14:03.5550088+08:00;True|2022-11-14T19:17:19.2326062+08:00;True|2022-11-14T19:16:47.8958868+08:00;True|2022-11-14T19:05:18.2549422+08:00;True|2022-11-14T18:26:42.3745462+08:00;True|2022-11-14T17:38:44.6271564+08:00;True|2022-11-14T17:34:15.2334450+08:00;False|2022-11-14T17:14:35.5279015+08:00;True|2022-11-14T16:24:47.6469529+08:00;True|2022-11-14T15:37:59.2295089+08:00;True|2022-11-14T09:52:42.7169668+08:00;True|2022-11-11T13:19:08.1283593+08:00;True|2022-11-09T22:12:02.6483295+08:00;True|2022-11-09T21:11:04.3739799+08:00;True|2022-11-09T21:06:00.4538306+08:00;True|2022-11-09T20:55:34.2803958+08:00;True|2022-11-09T20:17:02.9468337+08:00;True|2022-11-09T18:07:35.3930811+08:00;True|2022-11-09T18:05:51.4828275+08:00;True|2022-11-09T16:17:12.1733545+08:00;True|2022-11-09T11:43:22.1152393+08:00;True|2022-11-04T11:18:49.1736708+08:00;False|2022-11-04T11:16:30.1928291+08:00;False|2022-11-04T11:15:20.2275455+08:00;False|2022-11-04T11:14:39.1289337+08:00;True|2022-11-04T11:04:37.8317148+08:00;True|2022-11-03T14:34:55.1009241+08:00;True|2022-11-03T14:16:29.1563357+08:00;True|2022-11-03T13:46:10.8366547+08:00;True|2022-11-03T11:48:24.5399936+08:00;True|2022-10-31T14:36:59.4971398+08:00;True|2022-10-28T13:58:42.2473049+08:00;True|2022-10-28T13:42:58.7180735+08:00;True|2022-10-28T12:56:06.9517417+08:00;True|2022-10-28T09:37:04.8336241+08:00;True|2022-10-27T16:13:52.0290129+08:00;True|2022-10-27T14:51:12.0416021+08:00;True|2022-10-27T14:46:01.8195700+08:00;True|2022-10-27T14:38:00.5077582+08:00;True|2022-10-27T14:28:16.2348825+08:00;False|2022-10-27T14:27:49.2720060+08:00;False|2022-10-27T14:27:25.1445739+08:00;True|2022-10-26T11:27:54.4483138+08:00;True|2022-10-26T11:19:37.6322046+08:00;True|2022-10-26T11:10:05.4129456+08:00;True|2022-10-25T16:33:32.7872520+08:00;True|2022-10-24T16:12:49.4291001+08:00;True|2022-10-24T16:10:25.3757944+08:00;True|2022-10-24T14:04:51.7783988+08:00;True|2022-10-21T18:51:32.0221235+08:00;True|2022-10-21T18:35:12.1463858+08:00;True|2022-10-21T09:54:19.2138550+08:00;True|2022-10-21T09:38:21.1672347+08:00;True|2022-10-19T12:04:59.9103579+08:00;True|2022-10-19T11:57:45.1000513+08:00;True|2022-10-19T11:49:03.6494799+08:00;True|2022-10-19T11:06:22.4198711+08:00;True|2022-10-18T11:17:20.1435537+08:00;True|2022-10-18T09:08:58.6802639+08:00;True|2022-10-17T16:33:12.8912333+08:00;True|2022-10-17T14:23:10.0264671+08:00;True|2022-10-17T14:16:07.3590282+08:00;True|2022-10-17T11:53:21.9425089+08:00;True|2022-10-17T11:45:51.9336429+08:00;True|2022-10-14T14:37:15.6323508+08:00;True|2022-10-11T09:01:44.5831439+08:00;True|2022-10-09T14:03:43.6568874+08:00;True|2022-10-09T11:15:56.2934983+08:00;True|2022-10-09T09:39:28.1074512+08:00;True|2022-10-08T18:45:23.9581502+08:00;True|2022-10-08T18:35:18.5574217+08:00;True|2022-10-08T16:12:04.2903137+08:00;True|2022-10-08T15:59:54.5588351+08:00;True|2022-10-08T15:55:01.2711550+08:00;True|2022-10-08T15:19:08.5487617+08:00;True|2022-10-08T15:11:55.8626990+08:00;False|2022-10-08T15:02:33.5639703+08:00;True|2022-10-08T09:23:21.6592006+08:00;True|2022-10-07T15:35:37.7532304+08:00;True|2022-10-07T15:04:51.9161653+08:00;False|2022-10-07T14:58:32.8816319+08:00;False|2022-10-07T14:54:55.4175944+08:00;False|2022-10-07T14:52:46.7215376+08:00;False|2022-10-07T14:51:14.0508027+08:00;</History> <LastFailureDetails /> </PropertyGroup> </Project>