huanghb 4 months ago
parent
commit
6b38fa9337

+ 84 - 4
TEAMModelOS.Extension/IES.Exam/IES.ExamServer/Controllers/ManageController.cs

@@ -42,18 +42,80 @@ namespace IES.ExamServer.Controllers
             _signalRExamServerHub=signalRExamServerHub;
         }
         [HttpPost("download-package")]
-      // [AuthToken("admin","teacher")]
+        [AuthToken("admin","teacher")]
         public async Task<IActionResult> DownloadPackage(JsonNode json)
         {
-     
             //C#.NET 6 后端与前端流式通信
             //https://www.doubao.com/chat/collection/687687510791426?type=Thread
             //下载日志记录:1.步骤,检查,2.获取描述信息,3.分类型,4下载文件,5.前端处理,6.返回结果 , 正在下载...==> [INFO]https://www.doubao.com/chat/collection/687687510791426?type=Thread [Size=180kb] Ok...
             //进度条 展示下载文件总大小和已下载,末尾展示 文件总个数和已下载个数
             //https://cdnjs.cloudflare.com/ajax/libs/microsoft-signalr/8.0.7/signalr.min.js
-            return Ok();
+            /* int data = 0,blob=0,webview=0, groupList=0
+             {
+                "evaluationId":"idssss",
+                "shortCode":"1234567890",
+                "ownerId":"hbcn/tmdid",
+                "data":1,
+                "blob":1,
+                "webview":1,
+                "groupList":1
+            }
+             */
+            //如果要访问中心,则需要教师登录联网。  
+            var token = GetAuthTokenInfo();
+            if (token.scope.Equals(ExamConstant.ScopeTeacher))
+            {
+                if (_connectionService.dataCenterIsConnected) 
+                {
+                    Teacher? teacher = _liteDBFactory.GetLiteDatabase().GetCollection<Teacher>().FindOne(x => x.id!.Equals(token.id));
+                    if (teacher != null)
+                    {
+                        string? CenterUrl = _configuration.GetValue<string>("ExamServer:CenterUrl");
+                        var client = _httpClientFactory.CreateClient();
+                        if (client.DefaultRequestHeaders.Contains(Constant._X_Auth_AuthToken))
+                        {
+                            client.DefaultRequestHeaders.Remove(Constant._X_Auth_AuthToken);
+                        }
+                        client.DefaultRequestHeaders.Add(Constant._X_Auth_AuthToken, teacher.x_auth_token);
+                        HttpResponseMessage message = await client.PostAsJsonAsync($"{CenterUrl}/blob/sas-read", new { containerName = $"{json["ownerId"]}" });
+                        string sas = string.Empty;
+                        string url = string.Empty;
+                        string cnt = string.Empty;
+                        if (message.IsSuccessStatusCode)
+                        {
+                            //url  sas timeout name
+                            string content = await message.Content.ReadAsStringAsync();
+                            JsonNode? jsonNode = content.ToObject<JsonNode>();
+                            if (jsonNode != null)
+                            {
+                                sas = $"{jsonNode["sas"]}";
+                                cnt = $"{jsonNode["name"]}";
+                            }
+                        }
+                        var httpClient= _httpClientFactory.CreateClient();
+                        if ($"{json["data"]}".Equals("1")) 
+                        {
+                           await httpClient.GetAsync($"{url}/{cnt}/exam/{json["evaluationId"]}/package/evaluation.json");
+                        }
+                        if ($"{json["groupList"]}".Equals("1"))
+                        {
+                            await httpClient.GetAsync($"{url}/{cnt}/exam/{json["evaluationId"]}/package/grouplist.json");
+                        }
+                        if ($"{json["blob"]}".Equals("1"))
+                        {
+                            await httpClient.GetAsync($"{url}/{cnt}/exam/{json["evaluationId"]}/paper");
+                        }
+                        if ($"{json["webview"]}".Equals("1"))
+                        {
+                            //await httpClient.GetAsync($"{url}/{cnt}/exam/{json["evaluationId"]}/evaluation.json");
+                        }
+                    }
+                }
+            }
+           return Ok();
         }
         [HttpPost("check-short-code")]
+        [AuthToken("admin", "teacher", "visitor")]
         public async Task<IActionResult> CheckShortCode(JsonNode json)
         {
            
@@ -452,7 +514,23 @@ namespace IES.ExamServer.Controllers
                     status=Constant._Message_status_warning,
                     content=$"最终检测结果:总数({checkTotal}),成功({checkSuccess}),警告({checkWarning}),异常({checkError})。"
                 });
-            return Ok(new {code=200, evaluation= evaluationLocal,data,blob,webview,dataSize,blobSize,webviewSize,status ,groupList,studentCount});
+            return Ok(new {
+                code = 200,
+                evaluation = evaluationLocal,
+                data,
+                blob,
+                webview,
+                dataSize,
+                blobSize,
+                webviewSize,
+                status,
+                groupList,
+                studentCount,
+                checkTotal,
+                checkSuccess,
+                checkError,
+                checkWarning
+            });
         }
 
         /// <summary>
@@ -461,6 +539,7 @@ namespace IES.ExamServer.Controllers
         /// <param name="json"></param>
         /// <returns></returns>
         [HttpPost("activate-evaluation")]
+        [AuthToken("admin", "teacher", "visitor")]
         public IActionResult ActivateEvaluation(JsonNode json)
         {
             string id = $"{json["id"]}";
@@ -481,6 +560,7 @@ namespace IES.ExamServer.Controllers
         /// <param name="json"></param>
         /// <returns></returns>
         [HttpPost("list-local-evaluation")]
+        [AuthToken("admin", "teacher", "visitor")]
         public IActionResult ListLocalEvaluation(JsonNode json) 
         {
 

+ 50 - 0
TEAMModelOS.SDK/DI/AzureStorage/AzureStorageFactory.cs

@@ -155,7 +155,57 @@ namespace TEAMModelOS.SDK.DI
                 return (null, null);
             }
         }
+        /// <summary>
+        /// 取得Blob Container SAS (有效期預設一天)
+        /// </summary>
+        /// <param name="containerName">容器名稱</param>
+        /// <param name="blobName"></param>
+        /// <param name="blobContainerSasPermissions"></param>
+        /// <param name="name"></param>
+        /// <returns></returns>
+        public BlobAuth GetContainerSasUri(string containerName,  string name = "Default")
+        {
+            try
+            {
+                if (!string.IsNullOrWhiteSpace(containerName))
+                {
+                    var keys = Utils.ParseConnectionString(_optionsMonitor.Get(name).StorageAccountConnectionString);
+                    var accountname = keys["AccountName"];
+                    var accountkey = keys["AccountKey"];
+                    var endpoint = keys["EndpointSuffix"];
 
+                    DateTimeOffset dateTime = DateTimeOffset.UtcNow.Add(new TimeSpan(1, 0, 15, 0));
+                    long time = dateTime.ToUnixTimeMilliseconds();
+                    var blobSasBuilder = new BlobSasBuilder
+                    {
+                        StartsOn = DateTimeOffset.UtcNow.Subtract(new TimeSpan(0, 15, 0)),
+                        ExpiresOn = dateTime,
+                        BlobContainerName = containerName
+                    };
+                    BlobContainerSasPermissions blobContainerSasPermissions = BlobContainerSasPermissions.Read;
+                    blobContainerSasPermissions = BlobContainerSasPermissions.Read | BlobContainerSasPermissions.List;
+                    blobSasBuilder.SetPermissions(blobContainerSasPermissions);
+                    var sskc = new StorageSharedKeyCredential(accountname, accountkey);
+                    BlobSasQueryParameters sasQueryParameters = blobSasBuilder.ToSasQueryParameters(sskc);
+                    UriBuilder fullUri = new UriBuilder()
+                    {
+                        Scheme = "https",
+                        Host = $"{accountname}.blob.{endpoint}",
+                        Path = containerName
+                        //Query = sasQueryParameters.ToString()
+                    };
+                    return new BlobAuth { url = fullUri.Uri.ToString().Replace(fullUri.Uri.LocalPath, ""), sas = sasQueryParameters.ToString(), timeout = time, name = containerName };
+                }
+                else {
+                    return null;
+                }
+                // return (fullUri.Uri.ToString(), sasQueryParameters.ToString());
+            }
+            catch
+            {
+                return null;
+            }
+        }
         /// <summary>
         /// 取得Blob Container SAS (有效期預設一天)
         /// </summary>

+ 10 - 4
TEAMModelOS.SDK/Models/Cosmos/Normal/EvaluationSyncInfo.cs

@@ -46,8 +46,12 @@ namespace TEAMModelOS.SDK.Models.Cosmos.Normal
     /// <summary>
     /// 活动客户端同步信息
     /// </summary>
-    public class EvaluationClientSync :CosmosEntity
+    public class EvaluationClientDevice : CosmosEntity
     {
+        /*
+         id= 设备id
+         code ="EvaluationClientDevice-活动id"
+         */
         /// <summary>
         /// 活动数据包客户端更新时间戳
         /// </summary>
@@ -60,6 +64,11 @@ namespace TEAMModelOS.SDK.Models.Cosmos.Normal
         /// 活动页面代码文件客户端更新时间戳
         /// </summary>
         public long webviewTime { get; set; }
+        public List <DeviceAdmin> admins { get; set; }=new List<DeviceAdmin>();
+        public ClientDevice device { get; set; }
+    }
+    public class DeviceAdmin 
+    {
         /// <summary>
         /// 上线时间戳
         /// </summary>
@@ -80,11 +89,8 @@ namespace TEAMModelOS.SDK.Models.Cosmos.Normal
         /// 手机号
         /// </summary>
         public string mobile { get; set; }
-
-        public ClientDevice device { get; set; }
     }
 
-     
     /// <summary>
     /// 普通评测或者艺术评测的主体信息
     /// </summary>

+ 3 - 3
TEAMModelOS/Controllers/Both/EvaluationSyncInfoController.cs

@@ -59,7 +59,7 @@ namespace TEAMModelOS.Controllers.Both
         }
 
         /// <summary>
-        /// 评测信息打包
+        /// 局域网端搜寻云端评测
         /// </summary>
         /// <param name="request"></param>
         /// <returns></returns>
@@ -71,8 +71,8 @@ namespace TEAMModelOS.Controllers.Both
         //#endif
         public async Task<IActionResult> FindSyncInfo(JsonNode json) 
         {
-            int code =0;
-            string msg = string.Empty;
+           // int code =0;
+            //string msg = string.Empty;
             var tokenInfo =  HttpContext.GetAuthTokenInfo();
 
             string shortCode = $"{json["shortCode"]}";

+ 14 - 0
TEAMModelOS/Controllers/System/BlobController.cs

@@ -164,6 +164,20 @@ namespace TEAMModelOS.Controllers
         /// </summary>
         /// <param name="request"></param>
         /// <returns></returns>
+        [HttpPost("sas-read")]
+        [AuthToken(Roles = "teacher,admin,student")]
+        public IActionResult BlobSasR(JsonNode json)
+        {
+            ///返回金钥过期时间 
+            // Dictionary<string, object> dict = await azureBlobDBRepository.GetBlobSasUri(request.@params,true);
+            // dict.Add(d.Key, d.Value);
+            return Ok(_azureStorage.GetContainerSasUri($"{json["containerName"]}"));
+        }
+        /// <summary>
+        /// 获取某个容器的只读权限
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
         [HttpPost("sas-r")]
         [AuthToken(Roles = "teacher,admin,student")]
         [Authorize(Roles = "IES")]