CrazyIter_Bin 10 ماه پیش
والد
کامیت
ab1d397751
100فایلهای تغییر یافته به همراه1248 افزوده شده و 3 حذف شده
  1. 0 0
      TEAMModelOS.Extension/Contest.Client/.eslintrc.cjs
  2. 0 0
      TEAMModelOS.Extension/Contest.Client/.gitignore
  3. 0 0
      TEAMModelOS.Extension/Contest.Client/Contest.Client.esproj
  4. 0 0
      TEAMModelOS.Extension/Contest.Client/README.md
  5. 0 0
      TEAMModelOS.Extension/Contest.Client/babel.config.js
  6. 0 0
      TEAMModelOS.Extension/Contest.Client/index.html
  7. 0 0
      TEAMModelOS.Extension/Contest.Client/jsconfig.json
  8. 0 0
      TEAMModelOS.Extension/Contest.Client/nuget.config
  9. 0 0
      TEAMModelOS.Extension/Contest.Client/package.json
  10. 0 0
      TEAMModelOS.Extension/Contest.Client/public/favicon.ico
  11. 0 0
      TEAMModelOS.Extension/Contest.Client/public/index.html
  12. 0 0
      TEAMModelOS.Extension/Contest.Client/public/reset.css
  13. 0 0
      TEAMModelOS.Extension/Contest.Client/src/App.vue
  14. 0 0
      TEAMModelOS.Extension/Contest.Client/src/api/http.js
  15. 0 0
      TEAMModelOS.Extension/Contest.Client/src/api/index.js
  16. 0 0
      TEAMModelOS.Extension/Contest.Client/src/assets/img/events.jpg
  17. 0 0
      TEAMModelOS.Extension/Contest.Client/src/assets/img/fengj.jpg
  18. 0 0
      TEAMModelOS.Extension/Contest.Client/src/assets/img/fengjing.jpg
  19. 0 0
      TEAMModelOS.Extension/Contest.Client/src/assets/img/no-poster-cn.jpg
  20. 0 0
      TEAMModelOS.Extension/Contest.Client/src/assets/img/no-poster-cn.png
  21. 0 0
      TEAMModelOS.Extension/Contest.Client/src/assets/img/noData.png
  22. 0 0
      TEAMModelOS.Extension/Contest.Client/src/assets/img/noData1.jpg
  23. 0 0
      TEAMModelOS.Extension/Contest.Client/src/assets/img/zhProcess.png
  24. 0 0
      TEAMModelOS.Extension/Contest.Client/src/assets/logo.png
  25. 0 0
      TEAMModelOS.Extension/Contest.Client/src/assets/source/audio.png
  26. 0 0
      TEAMModelOS.Extension/Contest.Client/src/assets/source/excel.png
  27. 0 0
      TEAMModelOS.Extension/Contest.Client/src/assets/source/folder.png
  28. 0 0
      TEAMModelOS.Extension/Contest.Client/src/assets/source/image.png
  29. 0 0
      TEAMModelOS.Extension/Contest.Client/src/assets/source/item.png
  30. 0 0
      TEAMModelOS.Extension/Contest.Client/src/assets/source/link.png
  31. 0 0
      TEAMModelOS.Extension/Contest.Client/src/assets/source/pdf.png
  32. 0 0
      TEAMModelOS.Extension/Contest.Client/src/assets/source/ppt.png
  33. 0 0
      TEAMModelOS.Extension/Contest.Client/src/assets/source/unknow.png
  34. 0 0
      TEAMModelOS.Extension/Contest.Client/src/assets/source/video.png
  35. 0 0
      TEAMModelOS.Extension/Contest.Client/src/assets/source/word.png
  36. 0 0
      TEAMModelOS.Extension/Contest.Client/src/assets/source/zip.png
  37. 0 0
      TEAMModelOS.Extension/Contest.Client/src/common/Loading.vue
  38. 0 0
      TEAMModelOS.Extension/Contest.Client/src/components/HelloWorld.vue
  39. 0 0
      TEAMModelOS.Extension/Contest.Client/src/locale/i18n.js
  40. 0 0
      TEAMModelOS.Extension/Contest.Client/src/locale/index.js
  41. 0 0
      TEAMModelOS.Extension/Contest.Client/src/locale/lang/en-US.js
  42. 0 0
      TEAMModelOS.Extension/Contest.Client/src/locale/lang/zh-CN.js
  43. 0 0
      TEAMModelOS.Extension/Contest.Client/src/locale/lang/zh-TW.js
  44. 0 0
      TEAMModelOS.Extension/Contest.Client/src/main.js
  45. 0 0
      TEAMModelOS.Extension/Contest.Client/src/pinia/common.js
  46. 0 0
      TEAMModelOS.Extension/Contest.Client/src/pinia/index.js
  47. 0 0
      TEAMModelOS.Extension/Contest.Client/src/router/router.js
  48. 0 0
      TEAMModelOS.Extension/Contest.Client/src/store/index.js
  49. 0 0
      TEAMModelOS.Extension/Contest.Client/src/store/module/config.js
  50. 0 0
      TEAMModelOS.Extension/Contest.Client/src/utils/Global.js
  51. 0 0
      TEAMModelOS.Extension/Contest.Client/src/utils/blobTool.js
  52. 0 0
      TEAMModelOS.Extension/Contest.Client/src/utils/common.js
  53. 0 0
      TEAMModelOS.Extension/Contest.Client/src/utils/directive.js
  54. 0 0
      TEAMModelOS.Extension/Contest.Client/src/utils/js-fn.js
  55. 0 0
      TEAMModelOS.Extension/Contest.Client/src/view/Home.vue
  56. 0 0
      TEAMModelOS.Extension/Contest.Client/src/view/Login.vue
  57. 0 0
      TEAMModelOS.Extension/Contest.Client/src/view/activitylist/ActivityInfo.less
  58. 0 0
      TEAMModelOS.Extension/Contest.Client/src/view/activitylist/ActivityInfo.vue
  59. 0 0
      TEAMModelOS.Extension/Contest.Client/src/view/activitylist/ActivityList.less
  60. 0 0
      TEAMModelOS.Extension/Contest.Client/src/view/activitylist/ActivityList.vue
  61. 0 0
      TEAMModelOS.Extension/Contest.Client/src/view/activitylist/united.json
  62. 0 0
      TEAMModelOS.Extension/Contest.Client/src/view/basicInfo/BasicInfo.vue
  63. 0 0
      TEAMModelOS.Extension/Contest.Client/src/view/homepage/HomePage.vue
  64. 0 0
      TEAMModelOS.Extension/Contest.Client/src/view/myactivity/MyActivity.less
  65. 0 0
      TEAMModelOS.Extension/Contest.Client/src/view/myactivity/MyActivity.vue
  66. 0 0
      TEAMModelOS.Extension/Contest.Client/src/view/myactivity/MyReview.less
  67. 0 0
      TEAMModelOS.Extension/Contest.Client/src/view/myactivity/MyReview.vue
  68. 0 0
      TEAMModelOS.Extension/Contest.Client/vue.config.js
  69. 3 3
      TEAMModelOS.Contest/Contest.Server/Contest.Server.csproj
  70. 0 0
      TEAMModelOS.Extension/Contest.Server/Program.cs
  71. 0 0
      TEAMModelOS.Extension/Contest.Server/Properties/ServiceDependencies/contest - Web Deploy/profile.arm.json
  72. 0 0
      TEAMModelOS.Extension/Contest.Server/Properties/ServiceDependencies/contest-test - Web Deploy/profile.arm.json
  73. 0 0
      TEAMModelOS.Extension/Contest.Server/Properties/ServiceDependencies/contest-test - Web Deploy1/profile.arm.json
  74. 0 0
      TEAMModelOS.Extension/Contest.Server/Properties/launchSettings.json
  75. 0 0
      TEAMModelOS.Extension/Contest.Server/appsettings.Development.json
  76. 0 0
      TEAMModelOS.Extension/Contest.Server/appsettings.json
  77. 198 0
      TEAMModelOS.Extension/HTEX.Complex/Controllers/IndexController.cs
  78. 220 0
      TEAMModelOS.Extension/HTEX.Complex/Controllers/OfficialController.cs
  79. 25 0
      TEAMModelOS.Extension/HTEX.Complex/Dockerfile
  80. 19 0
      TEAMModelOS.Extension/HTEX.Complex/HTEX.Complex.csproj
  81. 6 0
      TEAMModelOS.Extension/HTEX.Complex/HTEX.Complex.http
  82. 133 0
      TEAMModelOS.Extension/HTEX.Complex/Program.cs
  83. 52 0
      TEAMModelOS.Extension/HTEX.Complex/Properties/launchSettings.json
  84. 27 0
      TEAMModelOS.Extension/HTEX.Complex/appsettings.Development.json
  85. 27 0
      TEAMModelOS.Extension/HTEX.Complex/appsettings.json
  86. 35 0
      TEAMModelOS.Extension/HTEX.Screen/Controllers/ChatController.cs
  87. 207 0
      TEAMModelOS.Extension/HTEX.Screen/Controllers/IndexController.cs
  88. 149 0
      TEAMModelOS.Extension/HTEX.Screen/Controllers/ScreenController.cs
  89. 25 0
      TEAMModelOS.Extension/HTEX.Screen/Dockerfile
  90. 20 0
      TEAMModelOS.Extension/HTEX.Screen/HTEX.Screen.csproj
  91. 6 0
      TEAMModelOS.Extension/HTEX.Screen/HTEX.Screen.http
  92. 27 0
      TEAMModelOS.Extension/HTEX.Screen/Program.cs
  93. 52 0
      TEAMModelOS.Extension/HTEX.Screen/Properties/launchSettings.json
  94. 8 0
      TEAMModelOS.Extension/HTEX.Screen/appsettings.Development.json
  95. 9 0
      TEAMModelOS.Extension/HTEX.Screen/appsettings.json
  96. 0 0
      TEAMModelOS.Extension/HTEXLib/COMM/Globals.cs
  97. 0 0
      TEAMModelOS.Extension/HTEXLib/COMM/Helpers/CollectionHelper.cs
  98. 0 0
      TEAMModelOS.Extension/HTEXLib/COMM/Helpers/ContentTypeDict.cs
  99. 0 0
      TEAMModelOS.Extension/HTEXLib/COMM/Helpers/CustomXmlResolver.cs
  100. 0 0
      TEAMModelOS.Extension/COMM/Helpers/HtmlHelper.cs

TEAMModelOS.Contest/contest.client/.eslintrc.cjs → TEAMModelOS.Extension/Contest.Client/.eslintrc.cjs


TEAMModelOS.Contest/contest.client/.gitignore → TEAMModelOS.Extension/Contest.Client/.gitignore


TEAMModelOS.Contest/contest.client/contest.client.esproj → TEAMModelOS.Extension/Contest.Client/Contest.Client.esproj


TEAMModelOS.Contest/contest.client/README.md → TEAMModelOS.Extension/Contest.Client/README.md


TEAMModelOS.Contest/contest.client/babel.config.js → TEAMModelOS.Extension/Contest.Client/babel.config.js


TEAMModelOS.Contest/contest.client/index.html → TEAMModelOS.Extension/Contest.Client/index.html


TEAMModelOS.Contest/contest.client/jsconfig.json → TEAMModelOS.Extension/Contest.Client/jsconfig.json


TEAMModelOS.Contest/contest.client/nuget.config → TEAMModelOS.Extension/Contest.Client/nuget.config


TEAMModelOS.Contest/contest.client/package.json → TEAMModelOS.Extension/Contest.Client/package.json


TEAMModelOS.Contest/contest.client/public/favicon.ico → TEAMModelOS.Extension/Contest.Client/public/favicon.ico


TEAMModelOS.Contest/contest.client/public/index.html → TEAMModelOS.Extension/Contest.Client/public/index.html


TEAMModelOS.Contest/contest.client/public/reset.css → TEAMModelOS.Extension/Contest.Client/public/reset.css


TEAMModelOS.Contest/contest.client/src/App.vue → TEAMModelOS.Extension/Contest.Client/src/App.vue


TEAMModelOS.Contest/contest.client/src/api/http.js → TEAMModelOS.Extension/Contest.Client/src/api/http.js


TEAMModelOS.Contest/contest.client/src/api/index.js → TEAMModelOS.Extension/Contest.Client/src/api/index.js


TEAMModelOS.Contest/contest.client/src/assets/img/events.jpg → TEAMModelOS.Extension/Contest.Client/src/assets/img/events.jpg


TEAMModelOS.Contest/contest.client/src/assets/img/fengj.jpg → TEAMModelOS.Extension/Contest.Client/src/assets/img/fengj.jpg


TEAMModelOS.Contest/contest.client/src/assets/img/fengjing.jpg → TEAMModelOS.Extension/Contest.Client/src/assets/img/fengjing.jpg


TEAMModelOS.Contest/contest.client/src/assets/img/no-poster-cn.jpg → TEAMModelOS.Extension/Contest.Client/src/assets/img/no-poster-cn.jpg


TEAMModelOS.Contest/contest.client/src/assets/img/no-poster-cn.png → TEAMModelOS.Extension/Contest.Client/src/assets/img/no-poster-cn.png


TEAMModelOS.Contest/contest.client/src/assets/img/noData.png → TEAMModelOS.Extension/Contest.Client/src/assets/img/noData.png


TEAMModelOS.Contest/contest.client/src/assets/img/noData1.jpg → TEAMModelOS.Extension/Contest.Client/src/assets/img/noData1.jpg


TEAMModelOS.Contest/contest.client/src/assets/img/zhProcess.png → TEAMModelOS.Extension/Contest.Client/src/assets/img/zhProcess.png


TEAMModelOS.Contest/contest.client/src/assets/logo.png → TEAMModelOS.Extension/Contest.Client/src/assets/logo.png


TEAMModelOS.Contest/contest.client/src/assets/source/audio.png → TEAMModelOS.Extension/Contest.Client/src/assets/source/audio.png


TEAMModelOS.Contest/contest.client/src/assets/source/excel.png → TEAMModelOS.Extension/Contest.Client/src/assets/source/excel.png


TEAMModelOS.Contest/contest.client/src/assets/source/folder.png → TEAMModelOS.Extension/Contest.Client/src/assets/source/folder.png


TEAMModelOS.Contest/contest.client/src/assets/source/image.png → TEAMModelOS.Extension/Contest.Client/src/assets/source/image.png


TEAMModelOS.Contest/contest.client/src/assets/source/item.png → TEAMModelOS.Extension/Contest.Client/src/assets/source/item.png


TEAMModelOS.Contest/contest.client/src/assets/source/link.png → TEAMModelOS.Extension/Contest.Client/src/assets/source/link.png


TEAMModelOS.Contest/contest.client/src/assets/source/pdf.png → TEAMModelOS.Extension/Contest.Client/src/assets/source/pdf.png


TEAMModelOS.Contest/contest.client/src/assets/source/ppt.png → TEAMModelOS.Extension/Contest.Client/src/assets/source/ppt.png


TEAMModelOS.Contest/contest.client/src/assets/source/unknow.png → TEAMModelOS.Extension/Contest.Client/src/assets/source/unknow.png


TEAMModelOS.Contest/contest.client/src/assets/source/video.png → TEAMModelOS.Extension/Contest.Client/src/assets/source/video.png


TEAMModelOS.Contest/contest.client/src/assets/source/word.png → TEAMModelOS.Extension/Contest.Client/src/assets/source/word.png


TEAMModelOS.Contest/contest.client/src/assets/source/zip.png → TEAMModelOS.Extension/Contest.Client/src/assets/source/zip.png


TEAMModelOS.Contest/contest.client/src/common/Loading.vue → TEAMModelOS.Extension/Contest.Client/src/common/Loading.vue


TEAMModelOS.Contest/contest.client/src/components/HelloWorld.vue → TEAMModelOS.Extension/Contest.Client/src/components/HelloWorld.vue


TEAMModelOS.Contest/contest.client/src/locale/i18n.js → TEAMModelOS.Extension/Contest.Client/src/locale/i18n.js


TEAMModelOS.Contest/contest.client/src/locale/index.js → TEAMModelOS.Extension/Contest.Client/src/locale/index.js


TEAMModelOS.Contest/contest.client/src/locale/lang/en-US.js → TEAMModelOS.Extension/Contest.Client/src/locale/lang/en-US.js


TEAMModelOS.Contest/contest.client/src/locale/lang/zh-CN.js → TEAMModelOS.Extension/Contest.Client/src/locale/lang/zh-CN.js


TEAMModelOS.Contest/contest.client/src/locale/lang/zh-TW.js → TEAMModelOS.Extension/Contest.Client/src/locale/lang/zh-TW.js


TEAMModelOS.Contest/contest.client/src/main.js → TEAMModelOS.Extension/Contest.Client/src/main.js


TEAMModelOS.Contest/contest.client/src/pinia/common.js → TEAMModelOS.Extension/Contest.Client/src/pinia/common.js


TEAMModelOS.Contest/contest.client/src/pinia/index.js → TEAMModelOS.Extension/Contest.Client/src/pinia/index.js


TEAMModelOS.Contest/contest.client/src/router/router.js → TEAMModelOS.Extension/Contest.Client/src/router/router.js


TEAMModelOS.Contest/contest.client/src/store/index.js → TEAMModelOS.Extension/Contest.Client/src/store/index.js


TEAMModelOS.Contest/contest.client/src/store/module/config.js → TEAMModelOS.Extension/Contest.Client/src/store/module/config.js


TEAMModelOS.Contest/contest.client/src/utils/Global.js → TEAMModelOS.Extension/Contest.Client/src/utils/Global.js


TEAMModelOS.Contest/contest.client/src/utils/blobTool.js → TEAMModelOS.Extension/Contest.Client/src/utils/blobTool.js


TEAMModelOS.Contest/contest.client/src/utils/common.js → TEAMModelOS.Extension/Contest.Client/src/utils/common.js


TEAMModelOS.Contest/contest.client/src/utils/directive.js → TEAMModelOS.Extension/Contest.Client/src/utils/directive.js


TEAMModelOS.Contest/contest.client/src/utils/js-fn.js → TEAMModelOS.Extension/Contest.Client/src/utils/js-fn.js


TEAMModelOS.Contest/contest.client/src/view/Home.vue → TEAMModelOS.Extension/Contest.Client/src/view/Home.vue


TEAMModelOS.Contest/contest.client/src/view/Login.vue → TEAMModelOS.Extension/Contest.Client/src/view/Login.vue


TEAMModelOS.Contest/contest.client/src/view/activitylist/ActivityInfo.less → TEAMModelOS.Extension/Contest.Client/src/view/activitylist/ActivityInfo.less


TEAMModelOS.Contest/contest.client/src/view/activitylist/ActivityInfo.vue → TEAMModelOS.Extension/Contest.Client/src/view/activitylist/ActivityInfo.vue


TEAMModelOS.Contest/contest.client/src/view/activitylist/ActivityList.less → TEAMModelOS.Extension/Contest.Client/src/view/activitylist/ActivityList.less


TEAMModelOS.Contest/contest.client/src/view/activitylist/ActivityList.vue → TEAMModelOS.Extension/Contest.Client/src/view/activitylist/ActivityList.vue


TEAMModelOS.Contest/contest.client/src/view/activitylist/united.json → TEAMModelOS.Extension/Contest.Client/src/view/activitylist/united.json


TEAMModelOS.Contest/contest.client/src/view/basicInfo/BasicInfo.vue → TEAMModelOS.Extension/Contest.Client/src/view/basicInfo/BasicInfo.vue


TEAMModelOS.Contest/contest.client/src/view/homepage/HomePage.vue → TEAMModelOS.Extension/Contest.Client/src/view/homepage/HomePage.vue


TEAMModelOS.Contest/contest.client/src/view/myactivity/MyActivity.less → TEAMModelOS.Extension/Contest.Client/src/view/myactivity/MyActivity.less


TEAMModelOS.Contest/contest.client/src/view/myactivity/MyActivity.vue → TEAMModelOS.Extension/Contest.Client/src/view/myactivity/MyActivity.vue


TEAMModelOS.Contest/contest.client/src/view/myactivity/MyReview.less → TEAMModelOS.Extension/Contest.Client/src/view/myactivity/MyReview.less


TEAMModelOS.Contest/contest.client/src/view/myactivity/MyReview.vue → TEAMModelOS.Extension/Contest.Client/src/view/myactivity/MyReview.vue


TEAMModelOS.Contest/contest.client/vue.config.js → TEAMModelOS.Extension/Contest.Client/vue.config.js


+ 3 - 3
TEAMModelOS.Contest/Contest.Server/Contest.Server.csproj

@@ -1,16 +1,16 @@
-<Project Sdk="Microsoft.NET.Sdk.Web">
+<Project Sdk="Microsoft.NET.Sdk.Web">
 
   <PropertyGroup>
     <TargetFramework>net8.0</TargetFramework>
     <Nullable>enable</Nullable>
     <ImplicitUsings>enable</ImplicitUsings>
-    <SpaRoot>..\contest.client</SpaRoot>
+    <SpaRoot>..\Contest.Client</SpaRoot>
     <SpaProxyLaunchCommand>npm run dev</SpaProxyLaunchCommand>
     <SpaProxyServerUrl>https://localhost:5173</SpaProxyServerUrl>
   </PropertyGroup>
 
   <ItemGroup>
-    <ProjectReference Include="..\contest.client\contest.client.esproj">
+    <ProjectReference Include="..\Contest.Client\Contest.Client.esproj">
       <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
     </ProjectReference>
   </ItemGroup>

TEAMModelOS.Contest/Contest.Server/Program.cs → TEAMModelOS.Extension/Contest.Server/Program.cs


TEAMModelOS.Contest/Contest.Server/Properties/ServiceDependencies/contest - Web Deploy/profile.arm.json → TEAMModelOS.Extension/Contest.Server/Properties/ServiceDependencies/contest - Web Deploy/profile.arm.json


TEAMModelOS.Contest/Contest.Server/Properties/ServiceDependencies/contest-test - Web Deploy/profile.arm.json → TEAMModelOS.Extension/Contest.Server/Properties/ServiceDependencies/contest-test - Web Deploy/profile.arm.json


TEAMModelOS.Contest/Contest.Server/Properties/ServiceDependencies/contest-test - Web Deploy1/profile.arm.json → TEAMModelOS.Extension/Contest.Server/Properties/ServiceDependencies/contest-test - Web Deploy1/profile.arm.json


TEAMModelOS.Contest/Contest.Server/Properties/launchSettings.json → TEAMModelOS.Extension/Contest.Server/Properties/launchSettings.json


TEAMModelOS.Contest/Contest.Server/appsettings.Development.json → TEAMModelOS.Extension/Contest.Server/appsettings.Development.json


TEAMModelOS.Contest/Contest.Server/appsettings.json → TEAMModelOS.Extension/Contest.Server/appsettings.json


+ 198 - 0
TEAMModelOS.Extension/HTEX.Complex/Controllers/IndexController.cs

@@ -0,0 +1,198 @@
+using Azure.Storage.Blobs.Models;
+using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Mvc;
+using static TEAMModelOS.SDK.Models.Service.SystemService;
+using System.Collections.Concurrent;
+using System.Text.Json;
+using System.Text;
+using TEAMModelOS.SDK.DI;
+using TEAMModelOS.SDK.Models.Service;
+using TEAMModelOS.SDK;
+using TEAMModelOS.SDK.Extension;
+using Azure.Storage.Blobs.Specialized;
+
+namespace HTEX.Complex.Controllers
+{
+    [ApiController]
+    [Route("api")]
+    public class IndexController : ControllerBase
+    {
+        private readonly DingDing _dingDing;
+        private readonly IHttpClientFactory _httpClient;
+        private readonly IConfiguration _configuration;
+        private readonly AzureStorageFactory _azureStorage;
+        private readonly AzureRedisFactory _azureRedis;
+        private readonly IPSearcher _ipSearcher;
+        private readonly Region2LongitudeLatitudeTranslator _longitudeLatitudeTranslator;
+        public IndexController(AzureRedisFactory azureRedis, Region2LongitudeLatitudeTranslator longitudeLatitudeTranslator, IHttpClientFactory httpClient, IConfiguration configuration, AzureStorageFactory azureStorage, IPSearcher searcher, DingDing dingDing)
+        {
+            _httpClient = httpClient;
+            _configuration = configuration;
+            _azureStorage = azureStorage;
+            _ipSearcher = searcher;
+            _dingDing = dingDing;
+            _azureRedis=azureRedis;
+            _longitudeLatitudeTranslator = longitudeLatitudeTranslator;
+        }
+        /// <summary>
+        ///  上传到blob
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost("http-log")]
+
+        [RequestSizeLimit(102_400_000_00)] //最大10000m左右
+        public async Task<IActionResult> HttpLog(JsonElement json)
+        {
+            try
+            {
+                string data = json.ToJsonString();
+                var gmt8Time = DateTimeOffset.Now.GetGMTTime(8);
+                var appendBlob = _azureStorage.GetBlobContainerClient("0-service-log").GetAppendBlobClient($"http-log/{gmt8Time:yyyy}/{gmt8Time:MM}/{gmt8Time:dd}/{gmt8Time:HH}.log");
+                if (!await appendBlob.ExistsAsync())
+                {
+                    await appendBlob.CreateAsync();
+                }
+                using (var stream = new MemoryStream(Encoding.UTF8.GetBytes($"{data},\n")))
+                {
+                    await appendBlob.AppendBlockAsync(stream);
+                }
+                return Ok(new { code = 1 });
+            }
+            catch (Exception ex)
+            {
+                return Ok(new { code = 1 });
+            }
+        }
+
+        [HttpPost("report-api-settle")]
+
+        [AllowAnonymous]
+        [RequestSizeLimit(102_400_000_00)] //最大10000m左右
+        public async Task<IActionResult> ReportApiSettle(JsonElement json)
+        {
+
+            List<string> times = json.GetProperty("times").ToObject<List<string>>();
+
+            return Ok(new { });
+        }
+        [HttpPost("report-api-reload")]
+
+        [AllowAnonymous]
+        [RequestSizeLimit(102_400_000_00)] //最大10000m左右
+        public async Task<IActionResult> ReportApiTest(JsonElement json)
+        {
+            try
+            {
+                List<string> times = json.GetProperty("times").ToObject<List<string>>();
+                foreach (var timeDate in times)
+                {
+                    if (DateTimeOffset.TryParse(timeDate, out DateTimeOffset date))
+                    {
+                        var gmt8Time = date.GetGMTTime(8);
+                        var nowGmt8Time = DateTimeOffset.Now.GetGMTTime(8);
+                        List<string> logs = await _azureStorage.GetBlobContainerClient("0-service-log").List($"http-log/{date:yyyy}/{date:MM}/{date:dd}");
+                        List<HttpLog> httpLogs = new List<HttpLog>();
+                        foreach (var log in logs)
+                        {
+                            string nowPath = $"{nowGmt8Time:yyyy/MM/dd/HH}.log";
+                            if (!log.Contains("index.log")  && !log.Contains(".json") &&!log.Contains(nowPath))
+                            {
+                                BlobDownloadResult result = await _azureStorage.GetBlobContainerClient("0-service-log").GetBlobBaseClient(log).DownloadContentAsync();
+                                var content = result.Content.ToString();
+                                content= content.Substring(0, content.Length-2);
+                                if (content.EndsWith("}"))
+                                {
+                                    content=$"[{content}]";
+                                }
+                                else
+                                {
+                                    content=$"[{content}}}]";
+                                }
+                                httpLogs.AddRange(content.ToObject<List<HttpLog>>());
+                            }
+                        }
+                        (ConcurrentBag<ApiVisit> visits, ConcurrentBag<(string uuid, HttpLog httpLog, List<string> tmdid, List<string> school)> uuidInfo)   =
+                            await SystemService.ConvertHttpLog(httpLogs, _azureRedis, _ipSearcher, _longitudeLatitudeTranslator, gmt8Time, true);
+                        if (visits!=null  && visits.Count>0)
+                        {
+                            var appendDayBlob = _azureStorage.GetBlobContainerClient("0-service-log").GetAppendBlobClient($"http-log/{gmt8Time:yyyy}/{gmt8Time:MM}/{gmt8Time:dd}/index.log");
+                            if (!await appendDayBlob.ExistsAsync())
+                            {
+
+                                await appendDayBlob.CreateAsync();
+                            }
+                            else
+                            {
+                                await appendDayBlob.DeleteAsync();
+                                await appendDayBlob.CreateAsync();
+                            }
+                            int maxSize = 4*1024 * 1024; // 1M
+                            List<string> parts = new List<string>();
+                            StringBuilder sb = new StringBuilder();
+
+                            foreach (var item in visits)
+                            {
+                                string jsonString = $"{item.ToJsonString()},\n";
+                                int currentSize = Encoding.UTF8.GetByteCount(sb.ToString());
+
+                                if (currentSize + Encoding.UTF8.GetByteCount(jsonString) > maxSize)
+                                {
+                                    parts.Add(sb.ToString());
+                                    sb.Clear();
+                                }
+
+                                sb.Append(jsonString);
+                            }
+
+                            if (sb.Length > 0)
+                            {
+                                parts.Add(sb.ToString());
+                            }
+
+                            foreach (string part in parts)
+                            {
+                                using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(part)))
+                                {
+                                    await appendDayBlob.AppendBlockAsync(stream);
+                                }
+                            }
+
+
+                            //using (var stream = new MemoryStream(Encoding.UTF8.GetBytes($"{sb}")))
+                            //{
+                            //    await appendDayBlob.AppendBlockAsync(stream);
+                            //}
+                        }
+                    }
+                }
+
+                //全网:用户访问数,学校访问数,学生访问数,不同业务访问量,
+                return Ok(new { });
+            }
+            catch (Exception ex)
+            {
+                await _dingDing.SendBotMsg($"{ex.Message}\n{ex.StackTrace}", GroupNames.成都开发測試群組);
+            }
+            return Ok();
+        }
+
+        /// <summary>
+        /// 使用时长,一天内累计
+        /// </summary>
+        /// <param name="json"></param>
+        /// <returns></returns>
+        [HttpPost("report-api")]
+
+        [AllowAnonymous]
+        [RequestSizeLimit(102_400_000_00)] //最大10000m左右
+        public async Task<IActionResult> ReportApi(JsonElement json)
+        {
+            var force = json.GetProperty("force").GetString();
+            List<string> times = json.GetProperty("times").ToObject<List<string>>();
+            await SystemService.VisitSettle(times, _azureStorage, _azureRedis, _longitudeLatitudeTranslator, _ipSearcher, $"{force}");
+            return Ok(new { code = 200 });
+        }
+
+    }
+}

+ 220 - 0
TEAMModelOS.Extension/HTEX.Complex/Controllers/OfficialController.cs

@@ -0,0 +1,220 @@
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.Azure.Cosmos;
+using System.Text.Json;
+using TEAMModelOS.SDK.DI;
+using TEAMModelOS.SDK.Models;
+using TEAMModelOS.SDK;
+
+namespace HTEX.Complex.Controllers
+{
+    [Route("official")]
+    [ApiController]
+    public class OfficialController : ControllerBase
+    {
+
+        private readonly DingDing _dingDing;
+        // private readonly SnowflakeId _snowflakeId;
+        // private readonly ServerSentEventsService _sse;
+        private readonly AzureCosmosFactory _azureCosmos3Factory;
+        private readonly System.Net.Http.IHttpClientFactory _httpClientFactory;
+        //private readonly Models.Option _option;
+        // private readonly MailFactory _mailFactory;
+        private readonly AzureRedisFactory _azureRedis;
+        private readonly AzureStorageFactory _azureStorage;
+        private readonly IWebHostEnvironment _environment;
+        private readonly IConfiguration _configuration;
+        // private readonly CoreAPIHttpService _coreAPIHttpService;
+        private readonly IPSearcher _searcher;
+        public OfficialController(IWebHostEnvironment environment, IConfiguration configuration,
+            AzureStorageFactory azureStorage, AzureRedisFactory azureRedis, System.Net.Http.IHttpClientFactory httpClientFactory, AzureCosmosFactory azureCosmos3Factory,
+            // IOptionsSnapshot<Option> option,  
+            DingDing dingDing, IPSearcher searcher)
+        {
+            _dingDing = dingDing;
+            _azureCosmos3Factory = azureCosmos3Factory;
+            _httpClientFactory = httpClientFactory;
+            _azureRedis = azureRedis;
+            _azureStorage = azureStorage;
+            _environment = environment;
+            _configuration = configuration;
+            _searcher = searcher;
+        }
+
+        [ProducesDefaultResponseType]
+        [RequestSizeLimit(102_400_000_00)] //最大10000m左右
+        [HttpPost("video-ls")]
+        public async Task<IActionResult> VideoUpload()
+        {
+            List<string> students = new List<string>();
+            //var result= await _azureCosmos3Factory.GetCosmosClient().GetContainer("winteachos", Constant.Teacher)
+            //    .GetList<Teacher>( "select value c from c", "Base");
+
+            await foreach (var item in _azureCosmos3Factory.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Student)
+                .GetItemQueryIteratorSql<string>(queryText: "select value c.id from c", requestOptions: new QueryRequestOptions { MaxItemCount=5, PartitionKey = new PartitionKey("Base-hbcn") }))
+            {
+                students.Add(item);
+            }
+            return Ok(students);
+        }
+
+        [ProducesDefaultResponseType]
+        [HttpPost("video-list")]
+        public async Task<IActionResult> VideoList(JsonElement json)
+        {
+            List<OfficialVideo> videos = new List<OfficialVideo>();
+            var table = _azureStorage.TableServiceClient().GetTableClient("ShortUrl");
+
+            if (json.TryGetProperty("rowKey", out JsonElement _rowKey) && !string.IsNullOrWhiteSpace($"{_rowKey}"))
+            {
+                videos =    table.Query<OfficialVideo>($"{Constant.PartitionKey} {Constant.Equal} 'OfficialVideo' and {Constant.RowKey} {Constant.Equal} '{_rowKey}'").ToList();
+
+
+            }
+            else
+            {
+                videos =    table.Query<OfficialVideo>(filter: $"{Constant.PartitionKey} eq  'OfficialVideo'").ToList();
+
+            }
+            return Ok(new { videos });
+        }
+
+        [ProducesDefaultResponseType]
+        [RequestSizeLimit(102_400_000_00)] //最大10000m左右
+        [HttpPost("video-upload")]
+        public async Task<IActionResult> VideoUpload([FromForm] string name, [FromForm] string type, [FromForm] string? rowKey = null, [FromForm] IFormFile? videoFile = null)
+        {
+            OfficialVideo video = null;
+            string url = string.Empty;
+            var table = _azureStorage.TableServiceClient().GetTableClient("ShortUrl");
+            if (videoFile == null)
+            {
+                if (!string.IsNullOrWhiteSpace(rowKey))
+                {
+                    try
+                    {
+                        video=await table.GetEntityAsync<OfficialVideo>("OfficialVideo", rowKey);
+                    }
+                    catch { return BadRequest(); }
+                }
+                else
+                {
+                    return BadRequest();
+                }
+            }
+            else
+            {
+                if (!string.IsNullOrWhiteSpace(rowKey))
+                {
+                    try
+                    {
+                        video=await table.GetEntityAsync<OfficialVideo>("OfficialVideo", rowKey);
+                    }
+                    catch { }
+                }
+                if (video== null)
+                {
+                    video= new OfficialVideo { RowKey=$"{DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()}", PartitionKey="OfficialVideo" };
+                }
+                string fileExt = FileType.GetExtention(videoFile.FileName).ToLower();
+                if (fileExt.Equals("mp4", StringComparison.OrdinalIgnoreCase))
+                {
+                    var url_blob = await _azureStorage.GetBlobContainerClient("0-public").UploadFileByContainer(videoFile.OpenReadStream(), "official", $"{video.RowKey}.{fileExt}", false);
+                    url=url_blob;
+                }
+            }
+            video.name= name;
+            video.type= type;
+            video.url=string.IsNullOrWhiteSpace(url) ? video.url : url;
+            table.UpsertEntity<OfficialVideo>(video);
+            return Ok(new { video });
+        }
+    }
+    //[TableName(Name = "ShortUrl")]
+    public class OfficialVideo : HTableEntity
+    {
+        ///// <summary>
+        ///// OfficialVideo
+        ///// </summary>
+        //public string PartitionKey { get; set; }
+        ///// <summary>
+        ///// 视频id
+        ///// </summary>
+        //public string RowKey { get; set; }
+        /// <summary>
+        /// 名称
+        /// </summary>
+        public string? name { get; set; }
+        /// <summary>
+        /// 类型
+        /// </summary>
+        public string? type { get; set; }
+        /// <summary>
+        /// 地址
+        /// </summary>
+        public string? url { get; set; }
+    }
+    public class Student : CosmosEntity
+    {
+        public string mail { get; set; }
+        public string mobile { get; set; }
+        public string country { get; set; }
+        public string name { get; set; }
+        public string picture { get; set; }
+        public string schoolId { get; set; }
+        public string pw { get; set; }
+        public string salt { get; set; }
+        public int year { get; set; }
+        //座位号
+        public string no { get; set; }   //座位号
+        public string irs { get; set; }
+        //绑定班级Id
+        public string classId { get; set; }
+        //分组信息
+        public string groupId { get; set; }
+        public string groupName { get; set; }
+        public string periodId { get; set; }
+        /// <summary>
+        /// 性别 M( male,男) F (female 女)  N(secret 保密) 
+        /// </summary>
+        public string gender { get; set; }
+
+        //补充留级信息
+        //0在校,1毕业 
+        public int graduate { get; set; } = 0;
+
+        /// <summary>
+        /// 创建时间  十位 时间戳
+        /// </summary>
+        public long createTime { get; set; }
+
+        /// <summary>
+        /// 学生的专业id
+        /// </summary>
+        public string majorId { get; set; }
+        /// <summary>
+        /// 學生的OpenID (TW教育雲綁定ID)
+        /// </summary>
+        public string openId { get; set; }
+    }
+
+    /// <summary>
+    /// 教师
+    /// </summary>
+    public class Teacher : CosmosEntity
+    {
+        public Teacher()
+        {
+            pk = "Teacher";
+        }
+
+        /// <summary>
+        /// 系统权限信息
+        /// </summary>
+        public HashSet<string> permissions { get; set; } = new HashSet<string>();
+        /// <summary>
+        /// 组织信息
+        /// </summary>
+
+        //常用设备信息,及IP登录信息。
+    }
+}

+ 25 - 0
TEAMModelOS.Extension/HTEX.Complex/Dockerfile

@@ -0,0 +1,25 @@
+#See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging.
+
+FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
+USER app
+WORKDIR /app
+EXPOSE 80
+EXPOSE 443
+
+FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
+ARG BUILD_CONFIGURATION=Release
+WORKDIR /src
+COPY ["TEAMModelOS.Extension/HTEX.Complex/HTEX.Complex.csproj", "TEAMModelOS.Extension/HTEX.Complex/"]
+RUN dotnet restore "./TEAMModelOS.Extension/HTEX.Complex/HTEX.Complex.csproj"
+COPY . .
+WORKDIR "/src/TEAMModelOS.Extension/HTEX.Complex"
+RUN dotnet build "./HTEX.Complex.csproj" -c $BUILD_CONFIGURATION -o /app/build
+
+FROM build AS publish
+ARG BUILD_CONFIGURATION=Release
+RUN dotnet publish "./HTEX.Complex.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false
+
+FROM base AS final
+WORKDIR /app
+COPY --from=publish /app/publish .
+ENTRYPOINT ["dotnet", "HTEX.Complex.dll"]

+ 19 - 0
TEAMModelOS.Extension/HTEX.Complex/HTEX.Complex.csproj

@@ -0,0 +1,19 @@
+<Project Sdk="Microsoft.NET.Sdk.Web">
+  <PropertyGroup>
+    <TargetFramework>net8.0</TargetFramework>
+    <Nullable>enable</Nullable>
+    <ImplicitUsings>enable</ImplicitUsings>
+    <UserSecretsId>1cd8e994-7280-465a-bd0c-ed91a6d66717</UserSecretsId>
+    <DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
+    <DockerfileContext>..\..</DockerfileContext>
+  </PropertyGroup>
+  <ItemGroup>
+    <PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.20.1" />
+	<PackageReference Include="Hangfire" Version="1.8.11" />
+	<PackageReference Include="Hangfire.Dashboard.BasicAuthorization" Version="1.0.2" />
+	<PackageReference Include="Hangfire.Redis.StackExchange" Version="1.9.3" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\TEAMModelOS.SDK\TEAMModelOS.SDK.csproj" />
+  </ItemGroup>
+</Project>

+ 6 - 0
TEAMModelOS.Extension/HTEX.Complex/HTEX.Complex.http

@@ -0,0 +1,6 @@
+@HTEX.Complex_HostAddress = http://localhost:5181
+
+GET {{HTEX.Complex_HostAddress}}/weatherforecast/
+Accept: application/json
+
+###

+ 133 - 0
TEAMModelOS.Extension/HTEX.Complex/Program.cs

@@ -0,0 +1,133 @@
+using Hangfire;
+using Hangfire.Redis.StackExchange;
+using Microsoft.AspNetCore.Authentication.JwtBearer;
+using Microsoft.Extensions.DependencyInjection.Extensions;
+using Microsoft.IdentityModel.Tokens;
+using System.IdentityModel.Tokens.Jwt;
+using TEAMModelOS.SDK.DI;
+using TEAMModelOS.SDK;
+namespace HTEX.Complex
+{
+    public class Program
+    {
+        public static void Main(string[] args)
+        {
+            var builder = WebApplication.CreateBuilder(args);
+
+
+            // Add services to the container.
+
+            JwtSecurityTokenHandler.DefaultMapInboundClaims = false;
+            builder.Services.AddAuthentication(options => options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme)
+                .AddJwtBearer(options => //AzureADJwtBearer
+                {
+                    //options.SaveToken = true; //驗證令牌由服務器生成才有效,不適用於服務重啟或分布式架構
+                    options.Authority ="https://login.chinacloudapi.cn/4807e9cf-87b8-4174-aa5b-e76497d7392b/v2.0";// builder.Configuration["Option:Authority"];
+                    options.Audience = "72643704-b2e7-4b26-b881-bd5865e7a7a5";//builder.Configuration["Option:Audience"];
+                    options.RequireHttpsMetadata = true;
+                    options.TokenValidationParameters = new TokenValidationParameters
+                    {
+                        RoleClaimType = "roles",
+                        //ValidAudiences = new string[] { builder.Configuration["Option:Audience"], $"api://{builder.Configuration["Option:Audience"]}" }
+                        ValidAudiences = new string[] { "72643704-b2e7-4b26-b881-bd5865e7a7a5", $"api://72643704-b2e7-4b26-b881-bd5865e7a7a5" }
+                    };
+                    options.Events = new JwtBearerEvents();
+                    //下列事件有需要紀錄則打開
+                    //options.Events.OnMessageReceived = async context => { await Task.FromResult(0); };
+                    //options.Events.OnForbidden = async context => { await Task.FromResult(0); };
+                    //options.Events.OnChallenge = async context => { await Task.FromResult(0); };
+                    //options.Events.OnAuthenticationFailed = async context => { await Task.FromResult(0); };
+                    options.Events.OnTokenValidated = async context =>
+                    {
+                        if (!context.Principal.Claims.Any(x => x.Type.Equals("http://schemas.microsoft.com/identity/claims/scope")) //ClaimConstants.Scope
+                        && !context.Principal.Claims.Any(y => y.Type.Equals("roles"))) //ClaimConstants.Roles //http://schemas.microsoft.com/ws/2008/06/identity/claims/role
+                        {
+                            //TODO 需處理額外授權非角色及範圍的訪問異常紀錄
+                            throw new UnauthorizedAccessException("Neither scope or roles claim was found in the bearer token.");
+                        }
+                        await Task.FromResult(0);
+                    };
+                });
+            builder.Services.AddControllers();
+#if DEBUG
+            builder.WebHost.UseUrls(new[] { "https://*:7298" });
+#endif
+            // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
+            builder.Services.AddEndpointsApiExplorer();
+            //builder.Services.AddSwaggerGen();
+            builder.Services.AddHttpClient();
+            string StorageConnectionString = builder.Configuration.GetValue<string>("Azure:Storage:ConnectionString");
+            string StorageConnectionStringTest = builder.Configuration.GetValue<string>("Azure:Storage:ConnectionString-Test");
+
+            //string ServiceBusConnectionString = builder.Configuration.GetValue<string>("Azure:ServiceBus:ConnectionString");
+            //string ServiceBusConnectionStringTest = builder.Configuration.GetValue<string>("Azure:ServiceBus:ConnectionString-Test");
+
+            string RedisConnectionString = builder.Configuration.GetValue<string>("Azure:Redis:ConnectionString");
+            string RedisConnectionStringTest = builder.Configuration.GetValue<string>("Azure:Redis:ConnectionString-Test");
+
+            string CosmosConnectionString = builder.Configuration.GetValue<string>("Azure:Cosmos:ConnectionString");
+            string CosmosConnectionStringTest = builder.Configuration.GetValue<string>("Azure:Cosmos:ConnectionString-Test");
+
+            //Storage
+            builder.Services.AddAzureStorage(StorageConnectionString, "Default");
+            builder.Services.AddAzureStorage(StorageConnectionStringTest, "Test");
+            //ServiceBus
+            //builder.Services.AddAzureServiceBus(ServiceBusConnectionString, "Default");
+            //builder.Services.AddAzureServiceBus(ServiceBusConnectionStringTest, "Test");
+            //Redis
+            builder.Services.AddAzureRedis(RedisConnectionString, "Default");
+            builder.Services.AddAzureRedis(RedisConnectionStringTest, "Test");
+            //Cosmos
+            builder.Services.AddAzureCosmos(CosmosConnectionString, "Default");
+            builder.Services.AddAzureCosmos(CosmosConnectionStringTest, "Test");
+
+            builder.Services.AddHttpContextAccessor();
+            builder.Services.AddHttpClient<DingDing>();
+            string path = $"{builder.Environment.ContentRootPath}/JsonFiles";
+            builder.Services.TryAddSingleton(new Region2LongitudeLatitudeTranslator(path));
+            builder.Services.AddIPSearcher(path);
+            builder.Services.AddCors(options =>
+            {
+                options.AddDefaultPolicy(
+                builder =>
+                {
+
+                    builder.AllowAnyOrigin()
+                            .AllowAnyHeader()
+                            .AllowAnyMethod();
+                });
+            });
+#if !DEBUG
+            builder.Services.AddHangfire(config => {
+                config.UseRedisStorage(builder.Configuration.GetValue<string>("Azure:Redis:ConnectionString"));
+            });
+            builder.Services.AddHangfireServer();
+#endif
+
+            builder.Services.AddControllersWithViews();
+
+            var app = builder.Build();
+
+            // Configure the HTTP request pipeline.
+            if (!app.Environment.IsDevelopment())
+            {
+                app.UseExceptionHandler("/Home/Error");
+                // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
+                app.UseHsts();
+            }
+
+            app.UseHttpsRedirection();
+            app.UseStaticFiles();
+
+            app.UseRouting();
+            app.UseCors(); //使用跨域設定
+            app.UseHttpsRedirection(); //開發中暫時關掉
+            app.UseAuthentication();
+            app.UseAuthorization();
+            app.MapControllerRoute(
+                name: "default",
+                pattern: "{controller=Home}/{action=Index}/{id?}");
+            app.Run();
+        }
+    }
+}

+ 52 - 0
TEAMModelOS.Extension/HTEX.Complex/Properties/launchSettings.json

@@ -0,0 +1,52 @@
+{
+  "profiles": {
+    "http": {
+      "commandName": "Project",
+      "launchBrowser": true,
+      "launchUrl": "weatherforecast",
+      "environmentVariables": {
+        "ASPNETCORE_ENVIRONMENT": "Development"
+      },
+      "dotnetRunMessages": true,
+      "applicationUrl": "http://localhost:5181"
+    },
+    "https": {
+      "commandName": "Project",
+      "launchBrowser": true,
+      "launchUrl": "weatherforecast",
+      "environmentVariables": {
+        "ASPNETCORE_ENVIRONMENT": "Development"
+      },
+      "dotnetRunMessages": true,
+      "applicationUrl": "https://localhost:7121;http://localhost:5181"
+    },
+    "IIS Express": {
+      "commandName": "IISExpress",
+      "launchBrowser": false,
+      "launchUrl": "weatherforecast",
+      "environmentVariables": {
+        "ASPNETCORE_ENVIRONMENT": "Development"
+      }
+    },
+    "Container (Dockerfile)": {
+      "commandName": "Docker",
+      "launchBrowser": false,
+      "launchUrl": "{Scheme}://{ServiceHost}:{ServicePort}/weatherforecast",
+      "environmentVariables": {
+        "ASPNETCORE_HTTPS_PORTS": "8081",
+        "ASPNETCORE_HTTP_PORTS": "8080"
+      },
+      "publishAllPorts": true,
+      "useSSL": true
+    }
+  },
+  "$schema": "http://json.schemastore.org/launchsettings.json",
+  "iisSettings": {
+    "windowsAuthentication": false,
+    "anonymousAuthentication": true,
+    "iisExpress": {
+      "applicationUrl": "http://localhost:37012",
+      "sslPort": 44329
+    }
+  }
+}

+ 27 - 0
TEAMModelOS.Extension/HTEX.Complex/appsettings.Development.json

@@ -0,0 +1,27 @@
+{
+  "Logging": {
+    "LogLevel": {
+      "Default": "Information",
+      "Microsoft.AspNetCore": "Warning"
+    }
+  },
+  "AllowedHosts": "*",
+  "Azure": {
+    "Storage": {
+      "ConnectionString": "DefaultEndpointsProtocol=https;AccountName=teammodelos;AccountKey=Dl04mfZ9hE9cdPVO1UtqTUQYN/kz/dD/p1nGvSq4tUu/4WhiKcNRVdY9tbe8620nPXo/RaXxs+1F9sVrWRo0bg==;EndpointSuffix=core.chinacloudapi.cn",
+      "ConnectionString-Test": "DefaultEndpointsProtocol=https;AccountName=teammodeltest;AccountKey=O2W2vadCqexDxWO+px+QK7y1sHwsYj8f/WwKLdOdG5RwHgW/Dupz9dDUb4c1gi6ojzQaRpFUeAAmOu4N9E+37A==;EndpointSuffix=core.chinacloudapi.cn"
+    },
+    "ServiceBus": {
+      "ConnectionString": "Endpoint=sb://coreservicebuscn.servicebus.chinacloudapi.cn/;SharedAccessKeyName=TEAMModelOS;SharedAccessKey=xO8HcvXXuuEkuFI0KlV5uXs8o6vyuVqTR+ASbPGMhHo=",
+      "ConnectionString-Test": "Endpoint=sb://coreservicebuscn.servicebus.chinacloudapi.cn/;SharedAccessKeyName=TEAMModelOS;SharedAccessKey=xO8HcvXXuuEkuFI0KlV5uXs8o6vyuVqTR+ASbPGMhHo="
+    },
+    "Redis": {
+      "ConnectionString": "CoreRedisCN.redis.cache.chinacloudapi.cn:6380,password=LyJWP1ORJdv+poXWofAF97lhCEQPg1wXWqvtzXGXQuE=,ssl=True,abortConnect=False",
+      "ConnectionString-Test": "52.130.252.100:6379,password=habook,ssl=false,abortConnect=False,writeBuffer=10240"
+    },
+    "Cosmos": {
+      "ConnectionString": "AccountEndpoint=https://cdhabookdep-free.documents.azure.cn:443/;AccountKey=JTUVk92Gjsx17L0xqxn0X4wX2thDPMKiw4daeTyV1HzPb6JmBeHdtFY1MF1jdctW1ofgzqkDMFOtcqS46by31A==;",
+      "ConnectionString-Test": "AccountEndpoint=https://cdhabookdep-free.documents.azure.cn:443/;AccountKey=JTUVk92Gjsx17L0xqxn0X4wX2thDPMKiw4daeTyV1HzPb6JmBeHdtFY1MF1jdctW1ofgzqkDMFOtcqS46by31A==;"
+    }
+  }
+}

+ 27 - 0
TEAMModelOS.Extension/HTEX.Complex/appsettings.json

@@ -0,0 +1,27 @@
+{
+  "Logging": {
+    "LogLevel": {
+      "Default": "Information",
+      "Microsoft.AspNetCore": "Warning"
+    }
+  },
+  "AllowedHosts": "*",
+  "Azure": {
+    "Storage": {
+      "ConnectionString": "DefaultEndpointsProtocol=https;AccountName=teammodelos;AccountKey=Dl04mfZ9hE9cdPVO1UtqTUQYN/kz/dD/p1nGvSq4tUu/4WhiKcNRVdY9tbe8620nPXo/RaXxs+1F9sVrWRo0bg==;EndpointSuffix=core.chinacloudapi.cn",
+      "ConnectionString-Test": "DefaultEndpointsProtocol=https;AccountName=teammodeltest;AccountKey=O2W2vadCqexDxWO+px+QK7y1sHwsYj8f/WwKLdOdG5RwHgW/Dupz9dDUb4c1gi6ojzQaRpFUeAAmOu4N9E+37A==;EndpointSuffix=core.chinacloudapi.cn"
+    },
+    "ServiceBus": {
+      "ConnectionString": "Endpoint=sb://coreservicebuscn.servicebus.chinacloudapi.cn/;SharedAccessKeyName=TEAMModelOS;SharedAccessKey=xO8HcvXXuuEkuFI0KlV5uXs8o6vyuVqTR+ASbPGMhHo=",
+      "ConnectionString-Test": "Endpoint=sb://coreservicebuscn.servicebus.chinacloudapi.cn/;SharedAccessKeyName=TEAMModelOS;SharedAccessKey=xO8HcvXXuuEkuFI0KlV5uXs8o6vyuVqTR+ASbPGMhHo="
+    },
+    "Redis": {
+      "ConnectionString": "CoreRedisCN.redis.cache.chinacloudapi.cn:6380,password=LyJWP1ORJdv+poXWofAF97lhCEQPg1wXWqvtzXGXQuE=,ssl=True,abortConnect=False",
+      "ConnectionString-Test": "52.130.252.100:6379,password=habook,ssl=false,abortConnect=False,writeBuffer=10240"
+    },
+    "Cosmos": {
+      "ConnectionString": "AccountEndpoint=https://teammodelos.documents.azure.cn:443/;AccountKey=clF73GwPECfP1lKZTCvs8gLMMyCZig1HODFbhDUsarsAURO7TcOjVz6ZFfPqr1HzYrfjCXpMuVD5TlEG5bFGGg==;",
+      "ConnectionString-Test": "AccountEndpoint=https://cdhabookdep-free.documents.azure.cn:443/;AccountKey=JTUVk92Gjsx17L0xqxn0X4wX2thDPMKiw4daeTyV1HzPb6JmBeHdtFY1MF1jdctW1ofgzqkDMFOtcqS46by31A==;"
+    }
+  }
+}

+ 35 - 0
TEAMModelOS.Extension/HTEX.Screen/Controllers/ChatController.cs

@@ -0,0 +1,35 @@
+using HTEXGpt.Models;
+using HTEXGpt.Services;
+using Microsoft.AspNetCore.Mvc;
+using System.Diagnostics.Tracing;
+using System.Net;
+
+namespace HTEX.Screen.Controllers
+{
+    [ProducesResponseType(StatusCodes.Status200OK)]
+    [ProducesResponseType(StatusCodes.Status400BadRequest)]
+    [Route("chat")]
+    [ApiController]
+    public class ChatController : ControllerBase
+    {
+        private static int _eventCounter = 0;
+        private readonly IAiAppService _aiAppService;
+        public ChatController(IAiAppService aiAppService)
+        {
+            _aiAppService=aiAppService;
+        }
+        /// <summary>
+        /// 混元大模型
+        /// SecretId:AKIDthPvHSSEnCTXNyVfjfWCvZVNLNJ8lBXi
+        ///SecretKey:CKKA0e7MROFyY1JPQMD90kLl1JXnw20n
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost("message")]
+        public async Task<IActionResult> Message(ChatRequest dto)
+        {
+            var chatResponse = await _aiAppService.ChatMessage(dto.modelType, dto, HttpContext, Response);
+            return Ok(new { response = chatResponse });
+        }
+    }
+}

+ 207 - 0
TEAMModelOS.Extension/HTEX.Screen/Controllers/IndexController.cs

@@ -0,0 +1,207 @@
+using Azure.Storage.Blobs.Models;
+using Azure.Storage.Blobs.Specialized;
+using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Cors;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.Extensions.Options;
+using System.Collections.Concurrent;
+using System.Configuration;
+using System.Drawing;
+using System.IO;
+using System.Net;
+using System.Runtime.InteropServices;
+using System.ServiceModel.Channels;
+using System.Text;
+using System.Text.Json;
+using System.Text.RegularExpressions;
+using System.Web;
+using TEAMModelOS.SDK;
+using TEAMModelOS.SDK.DI;
+using static TEAMModelOS.SDK.Models.Service.SystemService;
+using TEAMModelOS.SDK.Extension;
+using TEAMModelOS.SDK.Models.Service;
+namespace HTEX.Screen.Controllers
+{
+    [ApiController]
+    [Route("api")]
+    public class IndexController : ControllerBase
+    {
+        private readonly DingDing _dingDing;
+        private readonly IHttpClientFactory _httpClient;
+        private readonly IConfiguration _configuration;
+        private readonly AzureStorageFactory _azureStorage;
+        private readonly AzureRedisFactory _azureRedis;
+        private readonly IPSearcher _ipSearcher;
+        private readonly Region2LongitudeLatitudeTranslator _longitudeLatitudeTranslator;
+        public IndexController(AzureRedisFactory azureRedis, Region2LongitudeLatitudeTranslator longitudeLatitudeTranslator, IHttpClientFactory httpClient, IConfiguration configuration, AzureStorageFactory azureStorage, IPSearcher searcher, DingDing dingDing)
+        {
+            _httpClient = httpClient;
+            _configuration = configuration;
+            _azureStorage = azureStorage;
+            _ipSearcher = searcher;
+            _dingDing = dingDing;
+            _azureRedis=azureRedis;
+            _longitudeLatitudeTranslator = longitudeLatitudeTranslator;
+        }
+        /// <summary>
+        ///  上传到blob
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost("http-log")]
+
+        [RequestSizeLimit(102_400_000_00)] //最大10000m左右
+        public async Task<IActionResult> HttpLog(JsonElement json)
+        {
+            try
+            {
+                string data = json.ToJsonString();
+                var gmt8Time = DateTimeOffset.Now.GetGMTTime(8);
+                var appendBlob = _azureStorage.GetBlobContainerClient("0-service-log").GetAppendBlobClient($"http-log/{gmt8Time:yyyy}/{gmt8Time:MM}/{gmt8Time:dd}/{gmt8Time:HH}.log");
+                if (!await appendBlob.ExistsAsync())
+                {
+                    await appendBlob.CreateAsync();
+                }
+                using (var stream = new MemoryStream(Encoding.UTF8.GetBytes($"{data},\n")))
+                {
+                    await appendBlob.AppendBlockAsync(stream);
+                }
+                return Ok(new { code = 1 });
+            }
+            catch (Exception ex)
+            {
+                return Ok(new { code = 1 });
+            }
+        }
+
+        [HttpPost("report-api-settle")]
+
+        [AllowAnonymous]
+        [RequestSizeLimit(102_400_000_00)] //最大10000m左右
+        public async Task<IActionResult> ReportApiSettle(JsonElement json)
+        {
+
+            List<string> times = json.GetProperty("times").ToObject<List<string>>();
+
+            return Ok(new { });
+        }
+        [HttpPost("report-api-reload")]
+
+        [AllowAnonymous]
+        [RequestSizeLimit(102_400_000_00)] //最大10000m左右
+        public async Task<IActionResult> ReportApiTest(JsonElement json)
+        {
+            try
+            {
+                List<string> times = json.GetProperty("times").ToObject<List<string>>();
+                foreach (var timeDate in times)
+                {
+                    if (DateTimeOffset.TryParse(timeDate, out DateTimeOffset date))
+                    {
+                        var gmt8Time = date.GetGMTTime(8);
+                        var nowGmt8Time = DateTimeOffset.Now.GetGMTTime(8);
+                        List<string> logs = await _azureStorage.GetBlobContainerClient("0-service-log").List($"http-log/{date:yyyy}/{date:MM}/{date:dd}");
+                        List<HttpLog> httpLogs = new List<HttpLog>();
+                        foreach (var log in logs)
+                        {
+                            string nowPath = $"{nowGmt8Time:yyyy/MM/dd/HH}.log";
+                            if (!log.Contains("index.log")  && !log.Contains(".json") &&!log.Contains(nowPath))
+                            {
+                                BlobDownloadResult result = await _azureStorage.GetBlobContainerClient("0-service-log").GetBlobBaseClient(log).DownloadContentAsync();
+                                var content = result.Content.ToString();
+                                content= content.Substring(0, content.Length-2);
+                                if (content.EndsWith("}"))
+                                {
+                                    content=$"[{content}]";
+                                }
+                                else
+                                {
+                                    content=$"[{content}}}]";
+                                }
+                                httpLogs.AddRange(content.ToObject<List<HttpLog>>());
+                            }
+                        }
+                        (ConcurrentBag<ApiVisit> visits, ConcurrentBag<(string uuid, HttpLog httpLog, List<string> tmdid, List<string> school)> uuidInfo)   =
+                            await SystemService.ConvertHttpLog(httpLogs, _azureRedis, _ipSearcher, _longitudeLatitudeTranslator, gmt8Time, true);
+                        if (visits!=null  && visits.Count>0)
+                        {
+                            var appendDayBlob = _azureStorage.GetBlobContainerClient("0-service-log").GetAppendBlobClient($"http-log/{gmt8Time:yyyy}/{gmt8Time:MM}/{gmt8Time:dd}/index.log");
+                            if (!await appendDayBlob.ExistsAsync())
+                            {
+
+                                await appendDayBlob.CreateAsync();
+                            }
+                            else
+                            {
+                                await appendDayBlob.DeleteAsync();
+                                await appendDayBlob.CreateAsync();
+                            }
+                            int maxSize = 4*1024 * 1024; // 1M
+                            List<string> parts = new List<string>();
+                            StringBuilder sb = new StringBuilder();
+
+                            foreach (var item in visits)
+                            {
+                                string jsonString = $"{item.ToJsonString()},\n";
+                                int currentSize = Encoding.UTF8.GetByteCount(sb.ToString());
+
+                                if (currentSize + Encoding.UTF8.GetByteCount(jsonString) > maxSize)
+                                {
+                                    parts.Add(sb.ToString());
+                                    sb.Clear();
+                                }
+
+                                sb.Append(jsonString);
+                            }
+
+                            if (sb.Length > 0)
+                            {
+                                parts.Add(sb.ToString());
+                            }
+
+                            foreach (string part in parts)
+                            {
+                                using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(part)))
+                                {
+                                    await appendDayBlob.AppendBlockAsync(stream);
+                                }
+                            }
+
+
+                            //using (var stream = new MemoryStream(Encoding.UTF8.GetBytes($"{sb}")))
+                            //{
+                            //    await appendDayBlob.AppendBlockAsync(stream);
+                            //}
+                        }
+                    }
+                }
+
+                //全网:用户访问数,学校访问数,学生访问数,不同业务访问量,
+                return Ok(new { });
+            }
+            catch (Exception ex)
+            {
+                await _dingDing.SendBotMsg($"{ex.Message}\n{ex.StackTrace}", GroupNames.成都开发測試群組);
+            }
+            return Ok();
+        }
+
+        /// <summary>
+        /// 使用时长,一天内累计
+        /// </summary>
+        /// <param name="json"></param>
+        /// <returns></returns>
+        [HttpPost("report-api")]
+
+        [AllowAnonymous]
+        [RequestSizeLimit(102_400_000_00)] //最大10000m左右
+        public async Task<IActionResult> ReportApi(JsonElement json)
+        {
+            var force = json.GetProperty("force").GetString();
+            List<string> times = json.GetProperty("times").ToObject<List<string>>();
+            await SystemService.VisitSettle(times, _azureStorage, _azureRedis, _longitudeLatitudeTranslator, _ipSearcher, $"{force}");
+            return Ok(new { code = 200 });
+        }
+
+    }
+}

+ 149 - 0
TEAMModelOS.Extension/HTEX.Screen/Controllers/ScreenController.cs

@@ -0,0 +1,149 @@
+using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Mvc;
+
+using System.Configuration;
+using System.Drawing;
+using System.IO;
+using System.Runtime.InteropServices;
+using System.Text;
+using System.Text.Json;
+using System.Text.RegularExpressions;
+using System.Web;
+using TEAMModelOS.SDK.DI;
+
+namespace HTEX.Screen.Controllers
+{
+    [ApiController]
+    [Route("screen")]
+    public class ScreenController : ControllerBase
+    {
+        private readonly AzureStorageFactory _azureStorage;
+        private readonly HttpClient _httpClient;
+        private readonly IConfiguration _configuration;
+        //  private readonly HttpContext _httpContext;
+        public ScreenController(HttpClient httpClient, AzureStorageFactory azureStorage, IConfiguration configuration)
+        {
+            _httpClient = httpClient;
+            _azureStorage = azureStorage;
+            _configuration = configuration;
+            //   _httpContext=httpContext;
+        }
+
+
+        /// <summary>
+        ///  上传到blob
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost("from-miniapp-delete")]
+        [Authorize(Roles = "AClassONE")]
+        [RequestSizeLimit(102_400_000_00)] //最大10000m左右
+        public async Task<IActionResult> FromMiniAPPDelete(JsonElement json)
+        {
+
+            List<string>? urls = json.GetProperty("urls").Deserialize<List<string>>();
+            string? cnt = json.GetProperty("cnt").GetString();
+            string? test = json.GetProperty("test").GetString();
+            if (urls!=null)
+            {
+                foreach (var url in urls)
+                {
+                    string dev = "Default";
+                    if (test.Equals("Test", StringComparison.OrdinalIgnoreCase))
+                    {
+                        dev="Test";
+                    }
+                    string uri = url.Split("?")[0];
+                    var blobinfo = BlobUrlString(uri);
+                    if (blobinfo.ContainerName.Equals(cnt))
+                    {
+                        var uld = HttpUtility.UrlDecode(blobinfo.blob);
+                        bool ds = await _azureStorage.GetBlobContainerClient(cnt, dev).DeleteBlobIfExistsAsync(uld);
+                    }
+                }
+            }
+            return Ok();
+        }
+        private static (string ContainerName, string blob) BlobUrlString(string sasUrl)
+        {
+            sasUrl = sasUrl.Substring(8);
+            string[] sasUrls = sasUrl.Split("/");
+            string ContainerName;
+            ContainerName = sasUrls[1].Clone().ToString();
+            string item = sasUrls[0] + "/" + sasUrls[1] + "/";
+            string blob = sasUrl.Replace(item, "");
+            return (ContainerName, blob);
+        }
+        /// <summary>
+        ///  上传到blob
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost("from-miniapp-v2")]
+        [Authorize(Roles = "AClassONE")]
+        [RequestSizeLimit(102_400_000_00)] //最大10000m左右
+        public async Task<IActionResult> FromMiniAPPV2()
+        {
+
+            try
+            {
+                List<dynamic> urls = new List<dynamic>();
+                var request = HttpContext.Request;
+                var files = request.Form.Files;
+                var cnt = request.Form["cnt"].ToString();
+                var test = request.Form["test"].ToString();
+                var path = request.Form["path"].ToString();
+                foreach (var file in files)
+                {
+
+                    string dev = "Default";
+                    if (test.Equals("Test", StringComparison.OrdinalIgnoreCase))
+                    {
+                        dev="Test";
+                    }
+                    if (path.EndsWith("/"))
+                    {
+                        path=path.Substring(0, path.Length -1);
+                    }
+                    (string name, string url) = await _azureStorage.GetBlobContainerClient(cnt, dev).UploadFileByContainerBName(file.OpenReadStream(), path, $"{file.FileName}", true);
+                    var auth = _azureStorage.GetBlobContainerClient(cnt, dev).GetBlobSasUriRead(_configuration, cnt, name, dev);
+                    var ext = file.FileName.Split(".");
+                    urls.Add(new { url = $"{url}?{auth.sas}", name = file.FileName, size = file.Length, extension = ext[ext.Length-1], type = file.ContentType.Split("/")[0], blob = name, cnt = cnt });
+                }
+                return Ok(new { code = 200, urls, });
+            }
+            catch (Exception vErr)
+            {
+                return Ok(new { code = 500, msg = vErr.Message });
+            }
+        }
+        /// <summary>
+        ///  上传到blob
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost("from-miniapp")]
+        [Authorize(Roles = "AClassONE")]
+        [RequestSizeLimit(102_400_000_00)] //最大10000m左右
+        public async Task<IActionResult> FromMiniAPP([FromForm] IFormFile[] files, [FromForm] string path, [FromForm] string cnt, [FromForm] string test)
+        {
+            List<string> urls = new List<string>();
+            foreach (var file in files)
+            {
+                string dev = "Default";
+                if (test.Equals("Test", StringComparison.OrdinalIgnoreCase))
+                {
+                    dev="Test";
+                }
+                if (path.EndsWith("/"))
+                {
+                    path=path.Substring(0, path.Length -1);
+                }
+                (string name, string url) = await _azureStorage.GetBlobContainerClient(cnt, dev).UploadFileByContainerBName(file.OpenReadStream(), path, $"{file.FileName}", true);
+                var auth = _azureStorage.GetBlobContainerClient(cnt, dev).GetBlobSasUriRead(_configuration, cnt, name, dev);
+                urls.Add($"{url}?{auth.sas}");
+            }
+            return Ok(new { urls });
+        }
+    }
+}

+ 25 - 0
TEAMModelOS.Extension/HTEX.Screen/Dockerfile

@@ -0,0 +1,25 @@
+#See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging.
+
+FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
+USER app
+WORKDIR /app
+EXPOSE 8080
+EXPOSE 8081
+
+FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
+ARG BUILD_CONFIGURATION=Release
+WORKDIR /src
+COPY ["TEAMModelOS.Extension/HTEX.Screen/HTEX.Screen.csproj", "TEAMModelOS.Extension/HTEX.Screen/"]
+RUN dotnet restore "./TEAMModelOS.Extension/HTEX.Screen/HTEX.Screen.csproj"
+COPY . .
+WORKDIR "/src/TEAMModelOS.Extension/HTEX.Screen"
+RUN dotnet build "./HTEX.Screen.csproj" -c $BUILD_CONFIGURATION -o /app/build
+
+FROM build AS publish
+ARG BUILD_CONFIGURATION=Release
+RUN dotnet publish "./HTEX.Screen.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false
+
+FROM base AS final
+WORKDIR /app
+COPY --from=publish /app/publish .
+ENTRYPOINT ["dotnet", "HTEX.Screen.dll"]

+ 20 - 0
TEAMModelOS.Extension/HTEX.Screen/HTEX.Screen.csproj

@@ -0,0 +1,20 @@
+<Project Sdk="Microsoft.NET.Sdk.Web">
+
+  <PropertyGroup>
+    <TargetFramework>net8.0</TargetFramework>
+    <Nullable>enable</Nullable>
+    <ImplicitUsings>enable</ImplicitUsings>
+    <UserSecretsId>1de6c514-ad8e-479c-a038-7d3d0a238a0e</UserSecretsId>
+    <DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
+    <DockerfileContext>..\..</DockerfileContext>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.20.1" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\..\TEAMModelOS.SDK\TEAMModelOS.SDK.csproj" />
+  </ItemGroup>
+
+</Project>

+ 6 - 0
TEAMModelOS.Extension/HTEX.Screen/HTEX.Screen.http

@@ -0,0 +1,6 @@
+@HTEX.Screen_HostAddress = http://localhost:5210
+
+GET {{HTEX.Screen_HostAddress}}/weatherforecast/
+Accept: application/json
+
+###

+ 27 - 0
TEAMModelOS.Extension/HTEX.Screen/Program.cs

@@ -0,0 +1,27 @@
+namespace HTEX.Screen
+{
+    public class Program
+    {
+        public static void Main(string[] args)
+        {
+            var builder = WebApplication.CreateBuilder(args);
+
+            // Add services to the container.
+
+            builder.Services.AddControllers();
+
+            var app = builder.Build();
+
+            // Configure the HTTP request pipeline.
+
+            app.UseHttpsRedirection();
+
+            app.UseAuthorization();
+
+
+            app.MapControllers();
+
+            app.Run();
+        }
+    }
+}

+ 52 - 0
TEAMModelOS.Extension/HTEX.Screen/Properties/launchSettings.json

@@ -0,0 +1,52 @@
+{
+  "profiles": {
+    "http": {
+      "commandName": "Project",
+      "launchBrowser": true,
+      "launchUrl": "weatherforecast",
+      "environmentVariables": {
+        "ASPNETCORE_ENVIRONMENT": "Development"
+      },
+      "dotnetRunMessages": true,
+      "applicationUrl": "http://localhost:5210"
+    },
+    "https": {
+      "commandName": "Project",
+      "launchBrowser": true,
+      "launchUrl": "weatherforecast",
+      "environmentVariables": {
+        "ASPNETCORE_ENVIRONMENT": "Development"
+      },
+      "dotnetRunMessages": true,
+      "applicationUrl": "https://localhost:7181;http://localhost:5210"
+    },
+    "IIS Express": {
+      "commandName": "IISExpress",
+      "launchBrowser": true,
+      "launchUrl": "weatherforecast",
+      "environmentVariables": {
+        "ASPNETCORE_ENVIRONMENT": "Development"
+      }
+    },
+    "Container (Dockerfile)": {
+      "commandName": "Docker",
+      "launchBrowser": true,
+      "launchUrl": "{Scheme}://{ServiceHost}:{ServicePort}/weatherforecast",
+      "environmentVariables": {
+        "ASPNETCORE_HTTPS_PORTS": "8081",
+        "ASPNETCORE_HTTP_PORTS": "8080"
+      },
+      "publishAllPorts": true,
+      "useSSL": true
+    }
+  },
+  "$schema": "http://json.schemastore.org/launchsettings.json",
+  "iisSettings": {
+    "windowsAuthentication": false,
+    "anonymousAuthentication": true,
+    "iisExpress": {
+      "applicationUrl": "http://localhost:61928",
+      "sslPort": 44370
+    }
+  }
+}

+ 8 - 0
TEAMModelOS.Extension/HTEX.Screen/appsettings.Development.json

@@ -0,0 +1,8 @@
+{
+  "Logging": {
+    "LogLevel": {
+      "Default": "Information",
+      "Microsoft.AspNetCore": "Warning"
+    }
+  }
+}

+ 9 - 0
TEAMModelOS.Extension/HTEX.Screen/appsettings.json

@@ -0,0 +1,9 @@
+{
+  "Logging": {
+    "LogLevel": {
+      "Default": "Information",
+      "Microsoft.AspNetCore": "Warning"
+    }
+  },
+  "AllowedHosts": "*"
+}

TEAMModelOS.Extension/COMM/Globals.cs → TEAMModelOS.Extension/HTEXLib/COMM/Globals.cs


TEAMModelOS.Extension/COMM/Helpers/CollectionHelper.cs → TEAMModelOS.Extension/HTEXLib/COMM/Helpers/CollectionHelper.cs


TEAMModelOS.Extension/COMM/Helpers/ContentTypeDict.cs → TEAMModelOS.Extension/HTEXLib/COMM/Helpers/ContentTypeDict.cs


TEAMModelOS.Extension/COMM/Helpers/CustomXmlResolver.cs → TEAMModelOS.Extension/HTEXLib/COMM/Helpers/CustomXmlResolver.cs


+ 0 - 0
TEAMModelOS.Extension/COMM/Helpers/HtmlHelper.cs


برخی فایل ها در این مقایسه diff نمایش داده نمی شوند زیرا تعداد فایل ها بسیار زیاد است