Browse Source

处理容器

CrazyIter 4 years ago
parent
commit
f0b9e50fec

+ 3 - 3
TEAMModelOS.SDK/Context/Filters/HttpGlobalExceptionInvoke.cs

@@ -154,8 +154,8 @@ namespace TEAMModelOS.SDK.Context.Filter
                 error.devmsg = devMessage;
             }
 
-            public string jsonrpc { get; set; } = "2.0";
-            public double id { get; set; } = 1;
+           // public string jsonrpc { get; set; } = "2.0";
+           // public double id { get; set; } = 1;
             private object result { get; set; } = null;
             public ErrorModel<T> error { get; set; } = null;
         }
@@ -163,7 +163,7 @@ namespace TEAMModelOS.SDK.Context.Filter
 
     public class ErrorModel<E>
     {
-        public long responseTime = DateTime.Now.Ticks;
+      //  public long responseTime = DateTime.Now.Ticks;
         public int code { get; set; } = 1;
         public string message { get; set; }
         public string devmsg { get; set; }

+ 4 - 4
TEAMModelOS.SDK/Extension/DataResult/JsonRpcRequest/BaseJosnRPCRequest.cs

@@ -6,11 +6,11 @@ namespace TEAMModelOS.SDK.Extension.DataResult.JsonRpcRequest
     
     public abstract class BaseJosnRPCRequest
     {
-        public long requestTime { get; set; } = DateTime.Now.ToUniversalTime().Ticks - 621355968000000000;
-        public string jsonrpc { get; set; } = "2.0";
+      //  public long requestTime { get; set; } = DateTime.Now.ToUniversalTime().Ticks - 621355968000000000;
+       // public string jsonrpc { get; set; } = "2.0";
         public string method { get; set; }
-        public int id { get; set; } = 1;
-        public int timeOffset { get; set; }
+    //    public int id { get; set; } = 1;
+      //  public int timeOffset { get; set; }
         public string lang { get; set; } = "zh-CN";
     }
 }

+ 2 - 2
TEAMModelOS.SDK/Extension/DataResult/JsonRpcResponse/BaseJosnRPCResponse.cs

@@ -6,8 +6,8 @@ namespace TEAMModelOS.SDK.Extension.DataResult.JsonRpcResponse
     
     public class BaseJosnRPCResponse 
     {
-        public string jsonrpc { get; set; } = "2.0";
-        public double id { get; set; } = 1;
+      //  public string jsonrpc { get; set; } = "2.0";
+       // public double id { get; set; } = 1;
         private object result { get; set; }
         public object error { get; set; } = null;
     }

+ 21 - 14
TEAMModelOS.SDK/Extension/DataResult/JsonRpcResponse/JsonRPCResponseBuilder.cs

@@ -20,7 +20,7 @@ namespace TEAMModelOS.SDK.Extension.DataResult.JsonRpcResponse
         private Dictionary<string, object> extend;
         private Pagination page;
         private AzureTableToken token;
-        private object error=null;
+        private object error =null;
         
         public JsonRPCResponseBuilder()
         {
@@ -46,32 +46,39 @@ namespace TEAMModelOS.SDK.Extension.DataResult.JsonRpcResponse
             this.data = data;
             return this;
         }
-		public JsonRPCResponseBuilder Error(object error, string message)
-		{
-			this.code = 1;
-			this.message = message;
-			this.error = error;
-			return this;
-		}
-		public JsonRPCResponseBuilder Error(object error, int code,string message)
+		//public JsonRPCResponseBuilder Error(object error, string message)
+		//{
+		//	this.code = 1;
+		//	this.message = message;
+		//	this.error = error;
+		//	return this;
+		//}
+		public JsonRPCResponseBuilder Error( int code, string message,object error)
 		{
 			this.code = code;
 			this.message = message;
 			this.error = error;
 			return this;
 		}
-		public JsonRPCResponseBuilder Error(object error,int code)
+		public JsonRPCResponseBuilder Error( int code,object error)
 		{
 			this.code = code;
 			this.message = "Error";
 			this.error = error;
 			return this;
 		}
-		public JsonRPCResponseBuilder Error(object error)
+		//public JsonRPCResponseBuilder Error(object error)
+  //      {
+		//	this.code = 1;
+		//	this.message = "Error";
+  //          this.error = error;
+  //          return this;
+  //      }
+        public JsonRPCResponseBuilder Error(int code)
         {
-			this.code = 1;
-			this.message = "Error";
-            this.error = error;
+            this.code = code;
+            this.message = "Error";
+            this.error = null;
             return this;
         }
         public JsonRPCResponseBuilder Extend(Dictionary<String, object> extend)

+ 1 - 1
TEAMModelOS.SDK/Extension/DataResult/JsonRpcResponse/JsonRPCResult.cs

@@ -9,7 +9,7 @@ namespace TEAMModelOS.SDK.Extension.DataResult.JsonRpcResponse
     public class JsonRPCResult<T>
     {
         public Dictionary<string, object> extend { get; set; } = null;
-        public long responseTime { get; set; } = DateTime.Now.ToUniversalTime().Ticks - 621355968000000000;
+     //   public long responseTime { get; set; } = DateTime.Now.ToUniversalTime().Ticks - 621355968000000000;
         public T data { get; set; }
         public string message { get; set; } = "";
     }

+ 7 - 7
TEAMModelOS.SDK/Module/AzureBlob/Container/AzureBlobModel.cs

@@ -15,13 +15,13 @@ namespace TEAMModelOS.SDK.Module.AzureBlob.Container
 
         public AzureBlobModel()
         {
-            long time = DateTime.Now.ToUniversalTime().Ticks - 621355968000000000;
-            Timestamp = DateTimeHelper.ConvertToDateTime(time);
+            long time = new DateTimeOffset(DateTime.UtcNow).ToUnixTimeMilliseconds();
+            Timestamp = DateTime.UtcNow;
         }
 
         public AzureBlobModel(IFormFile f, string Container ,string groupName ,string newName)
         {
-            long time= DateTime.Now.ToUniversalTime().Ticks - 621355968000000000;
+            long time = new DateTimeOffset(DateTime.UtcNow).ToUnixTimeMilliseconds();
             ContentType = f.ContentType;
             ContentDisposition = f.ContentDisposition;
             FileName = f.FileName;
@@ -39,7 +39,7 @@ namespace TEAMModelOS.SDK.Module.AzureBlob.Container
 
         public AzureBlobModel(FileInfo f, string Container, string groupName, string newName ,string  contentType)
         {
-            long time = DateTime.Now.ToUniversalTime().Ticks - 621355968000000000;
+            long time = new DateTimeOffset(DateTime.UtcNow).ToUnixTimeMilliseconds();
             ContentType = contentType;
             ContentDisposition = "form-data; name=\"file\"; filename=\"" + f.Name + "\"";
             FileName = f.Name;
@@ -57,7 +57,7 @@ namespace TEAMModelOS.SDK.Module.AzureBlob.Container
 
         public AzureBlobModel(string fileName, string Container, string groupName, string newName, string contentType ,long length)
         {
-            long time = DateTime.Now.ToUniversalTime().Ticks - 621355968000000000;
+            long time = new DateTimeOffset(DateTime.UtcNow).ToUnixTimeMilliseconds();
             ContentType = contentType;
             ContentDisposition = "form-data; name=\"file\"; filename=\"" + fileName + "\"";
             FileName = fileName;
@@ -74,7 +74,7 @@ namespace TEAMModelOS.SDK.Module.AzureBlob.Container
         }
         public AzureBlobModel(string fileName, string Container, string groupName, string newName,string sha1Code, string contentType, long length)
         {
-            long time = DateTime.Now.ToUniversalTime().Ticks - 621355968000000000;
+            long time = new DateTimeOffset(DateTime.UtcNow).ToUnixTimeMilliseconds();
             ContentType = contentType;
             ContentDisposition = "form-data; name=\"file\"; filename=\"" + fileName + "\"";
             FileName = fileName;
@@ -88,7 +88,7 @@ namespace TEAMModelOS.SDK.Module.AzureBlob.Container
             PartitionKey = Container;
             RowKey = Guid.NewGuid().ToString();
             Extension = fileName.Substring(fileName.LastIndexOf(".") + 1, (fileName.Length - fileName.LastIndexOf(".") - 1)); //扩展名
-            Timestamp = DateTimeHelper.ConvertToDateTime(time);
+            Timestamp = DateTime.UtcNow;
         }
         [Required(ErrorMessage = "{0} 必须填写")]
         public string Folder { get; set; }

+ 59 - 19
TEAMModelOS.SDK/Module/AzureBlob/Implements/AzureBlobDBRepository.cs

@@ -348,26 +348,10 @@ namespace TEAMModelOS.SDK.Module.AzureBlob.Implements
         {
 
             string groupName = fileSpace + "/" + folder;
-            //  string newFileName = sha1Code;
-            // await InitializeBlob(DateTime.Now.ToString("yyyyMMdd"));
-            blobContainer =   InitializeBlob(groupName); //blobClient.GetContainerReference(groupName); 
+            blobContainer =   InitializeBlob(groupName);
             StorageUri url = blobContainer.StorageUri;
             string[] names = fileName.Split(".");
-            //  string name ;
-            //for (int i = 0; i < names.Length - 1; i++)
-            //{
-            //    name = name + names[i];
-            //}
-            //if (names.Length <= 1)
-            //{
-            //    name =  newFileName;
-            //}
-            //else
-            //{
-            //    name = newFileName + "." + names[names.Length - 1];
-            //}
-            //var parsedContentDisposition = ContentDispositionHeaderValue.Parse(file.ContentDisposition);
-            //var filename = Path.Combine(parsedContentDisposition.FileName.Trim('"'));
+            
             var blockBlob = blobContainer.GetBlockBlobReference(fileName);
             string fileext = fileName.Substring(fileName.LastIndexOf(".") > 0 ? fileName.LastIndexOf(".") : 0);
             if (!contentTypeDefault)
@@ -607,6 +591,62 @@ namespace TEAMModelOS.SDK.Module.AzureBlob.Implements
             // Return the URI string for the container, including the SAS token.
             return (blobContainer.Uri.ToString(), sasContainerToken);
         }
+
+        /// <summary>
+        /// 系统管理员 资源,题目关联,htex关联,学习活动学生上传文件关联,基本信息关联,教室平面图关联,评测冷数据关联
+        /// "system": [ "res", "item", "htex", "task", "info", "room", "exam" ],
+        /// 资源,题目关联,htex关联,学习活动学生上传文件关联,基本信息关联,教室平面图关联,评测冷数据关联
+        /// "school": [ "res", "item", "htex", "task", "info", "room", "exam" ],
+        /// 资源,题目关联,htex关联,学习活动关联,教师基本信息关联
+        /// "teacher": [ "res", "item", "htex", "task", "info" ],
+        /// 答案及学习活动上传的文件,学生基本信息关联
+        ///"student": [ "stu/{studentId}/ans", "stu/{studentId}/task" ]
+        /// </summary>
+        /// <param name="name">容器名称</param>
+        /// <param name="text">文件内容的流</param>
+        /// <param name="folder">业务文件夹</param>
+        /// <param name="fileName">文件名</param>
+        /// <param name="contentTypeDefault">是否存放文件后缀对应的contentType</param>
+        /// <returns></returns>
+        public async Task<AzureBlobModel> UploadFileByContainer(string name ,string  text, string folder, string fileName, bool contentTypeDefault = true)
+        {
+
+           // string groupName =folder;
+
+            blobContainer = await CreateContainer(name.ToLower().Replace("#","")); //blobClient.GetContainerReference(groupName); 
+            StorageUri url = blobContainer.StorageUri;
+
+            var blockBlob = blobContainer.GetBlockBlobReference(folder+"/"+fileName);
+            string fileext = fileName.Substring(fileName.LastIndexOf(".") > 0 ? fileName.LastIndexOf(".") : 0);
+            string content_type = "application/octet-stream";
+            if (!contentTypeDefault)
+            {
+                ContentTypeDict.dict.TryGetValue(fileext, out string contenttype);
+                if (!string.IsNullOrEmpty(contenttype))
+                {
+                    blockBlob.Properties.ContentType = contenttype;
+                    content_type = contenttype;
+                }
+                else
+                {
+                    blockBlob.Properties.ContentType = content_type;
+                }
+            }
+            else
+            {
+                blockBlob.Properties.ContentType = content_type;
+            }
+            await blockBlob.UploadTextAsync(text);
+            byte[] bytes = System.Text.Encoding.Default.GetBytes(text);
+            AzureBlobModel model = new AzureBlobModel(fileName, _options.Container, folder, fileName, folder, blockBlob.Properties.ContentType, bytes.Length)
+            {
+                Sha1Code = ShaHashHelper.GetSHA1(bytes),
+                BlobUrl = url.PrimaryUri.ToString().Split("?")[0] + "/" + fileName
+            };
+            return model;
+        }
+
+
         public async Task<dynamic> GetContainerSasUri(BlobSas blobSas, bool isRead)
         {
             CloudBlobContainer blobContainer;
@@ -643,7 +683,7 @@ namespace TEAMModelOS.SDK.Module.AzureBlob.Implements
                     // Omitting the start time for a SAS that is effective immediately helps to avoid clock skew.
                     SharedAccessStartTime = DateTime.UtcNow.AddMinutes(-15),
                     SharedAccessExpiryTime = dateTime,
-                    Permissions = SharedAccessBlobPermissions.Write | SharedAccessBlobPermissions.Create | SharedAccessBlobPermissions.Read
+                    Permissions = SharedAccessBlobPermissions.Write | SharedAccessBlobPermissions.Create | SharedAccessBlobPermissions.Read| SharedAccessBlobPermissions.List
                 };
             }
             // Generate the shared access signature on the container, setting the constraints directly on the signature.

+ 33 - 6
TEAMModelOS.SDK/Module/AzureBlob/Interfaces/IAzureBlobDBRepository.cs

@@ -20,17 +20,44 @@ namespace TEAMModelOS.SDK.Module.AzureBlob.Interfaces
         AzureBlobModel UploadFileByFolderNAsyn(Stream fileSteam, string folder, string fileName, string fileSpace = "pptx", bool contentTypeDefault = true);
         Task<string> GetBlobSasUri(string blobName, string containerName=null,  string policyName = null);
         Task<string> GetBlobSasUriRead(string containerName, string blobName, string policyName = null);
-        Task<dynamic> GetBlobSasUriRead(string containerName, string blobName);
-       Task<(string, string, string)> GetContainerSasUri(string containerName=null, string policyName = null);
+        Task<(string, string, string)> GetContainerSasUri(string containerName=null, string policyName = null);
         Task<(string, string)> GetContainerSasUriRead(string containerName, string policyName = null);
         Task<bool> CreateSharedAccessPolicyAsync(string policyName , string  containerName = null);
         Task DeleteSharedAccessPolicyAsync(string policyName, string  containerName = null);
         Task Deleteblob(string sasUri);
-
-         Task<List<BlobFileDto>> GetBlobDirectory(string containerName, string blobName);
-
+        Task<List<BlobFileDto>> GetBlobDirectory(string containerName, string blobName);
         Task<Dictionary<string, object>> GetBlobSasUri(BlobSas blobSas,bool isRead);
-        Task<dynamic> GetContainerSasUri(BlobSas blobSas, bool isRead);
 
+        /// <summary>
+        /// 获取某个文件的共享访问签名
+        /// </summary>
+        /// <param name="containerName"></param>
+        /// <param name="blobName"></param>
+        /// <returns></returns>
+        Task<dynamic> GetBlobSasUriRead(string containerName, string blobName);
+        /// <summary>
+        /// 获取某个角色及对应的容器的共享访问签名
+        /// </summary>
+        /// <param name="blobSas"></param>
+        /// <param name="isRead"></param>
+        /// <returns></returns>
+        Task<dynamic> GetContainerSasUri(BlobSas blobSas, bool isRead);
+        /// <summary>
+        /// 系统管理员 资源,题目关联,htex关联,学习活动学生上传文件关联,基本信息关联,教室平面图关联,评测冷数据关联
+        /// "system": [ "res", "item", "htex", "task", "info", "room", "exam" ],
+        /// 资源,题目关联,htex关联,学习活动学生上传文件关联,基本信息关联,教室平面图关联,评测冷数据关联
+        /// "school": [ "res", "item", "htex", "task", "info", "room", "exam" ],
+        /// 资源,题目关联,htex关联,学习活动关联,教师基本信息关联
+        /// "teacher": [ "res", "item", "htex", "task", "info" ],
+        /// 答案及学习活动上传的文件,学生基本信息关联
+        ///"student": [ "stu/{studentId}/ans", "stu/{studentId}/task" ]
+        /// </summary>
+        /// <param name="name">容器名称</param>
+        /// <param name="text">文件内容的流</param>
+        /// <param name="folder">业务文件夹</param>
+        /// <param name="fileName">文件名</param>
+        /// <param name="contentTypeDefault">是否存放文件后缀对应的contentType</param>
+        /// <returns></returns>
+        Task<AzureBlobModel> UploadFileByContainer(string name, string text, string folder, string fileName, bool contentTypeDefault = true);
     }
 }

+ 40 - 0
TEAMModelOS/Controllers/Client/ClientController.cs

@@ -0,0 +1,40 @@
+using Microsoft.AspNetCore.Mvc;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+using TEAMModelOS.SDK.Extension.DataResult.JsonRpcRequest;
+using TEAMModelOS.SDK.Extension.DataResult.JsonRpcResponse;
+using TEAMModelOS.SDK.Module.AzureBlob.Configuration;
+using TEAMModelOS.SDK.Module.AzureBlob.Interfaces;
+
+namespace TEAMModelOS.Controllers.Client
+{
+    [Route("api/[controller]")]
+    [ApiController]
+    public class ClientController : BaseController
+    {
+        private readonly IAzureBlobDBRepository azureBlobDBRepository;
+        public ClientController(IAzureBlobDBRepository _azureBlobDBRepository)
+        {
+            azureBlobDBRepository = _azureBlobDBRepository;
+        }
+        /// <summary>
+        /// 某个文件的上传SAS rcw权限
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost("blobSasRCW")]
+        public async Task<BaseJosnRPCResponse> BlobSasRCW(JosnRPCRequest<BlobSas> request)
+        {
+            ///返回金钥过期时间
+            JsonRPCResponseBuilder builder = new JsonRPCResponseBuilder();
+            // Dictionary<string,object> dict=  await azureBlobDBRepository.GetBlobSasUri(request.@params,false);
+            //   Dictionary<string, object> dict = ;
+            //dict.Add(d.Key, d.Value);
+
+            builder.Error(ResponseCode.PARAMS_ERROR);
+            return builder.Data(await azureBlobDBRepository.GetContainerSasUri(request.@params, false)).build();
+        }
+    }
+}

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

@@ -1,5 +1,6 @@
 using Microsoft.AspNetCore.Mvc;
 using Microsoft.Extensions.Configuration;
+using System;
 using System.Collections.Generic;
 using System.Text.Json;
 using System.Threading.Tasks;
@@ -75,6 +76,19 @@ namespace TEAMModelOS.Controllers.Core
                 throw new BizException("文件名错误", ResponseCode.PARAMS_ERROR);
             };
         }
+
+        /// <summary>
+        /// 链接只读(读)
+        /// </summary>
+        /// <param name="azureBlobSASDto"></param>
+        /// <returns></returns>
+        [HttpPost("uploadText")]
+        public async Task<BaseJosnRPCResponse> UploadText(JosnRPCRequest<string> request)
+        {
+            JsonRPCResponseBuilder responseBuilder = new JsonRPCResponseBuilder();
+            return responseBuilder.Data(await azureBlobDBRepository.UploadFileByContainer("hbcn",request.@params,"exam",Guid.NewGuid().ToString()+".json")).build();
+          
+        }
         private static string ContainerUrlString(string sasUrl)
         {
             ///移除http://

+ 1 - 58
TEAMModelOS/Controllers/Core/CommonController.cs

@@ -33,64 +33,7 @@ namespace TEAMModelOS.Controllers
             webHostEnvironment = _webHostEnvironment;
             azureCosmosDBRepository = _azureCosmosDBRepository;
         }
-        /// <summary>
-        ///获取默认学科及默认年级等数据 bool =true 獲取全部 false 則從request.lang 篩選指定語言的,默認zh-CN
-        /// </summary>
-        /// <param name="request"></param>
-        /// <returns></returns>
-        [HttpPost("DataDefault")]
-        public async Task<BaseJosnRPCResponse> DataDefaultAsync(JosnRPCRequest<bool> request)
-        {
-            //JsonRPCResponseBuilder builder = JsonRPCResponseBuilder.custom();
-            string contentRootPath = webHostEnvironment.ContentRootPath;
-            //string data = getJson(contentRootPath, "/JsonFile/Core/BaseDataDefault.json");
-            //JArray parsedJson = JArray.Parse(data);
-            //if (!request.@params)
-            //{
-            //    List<JObject> jsonElements = new List<JObject>();
-            //    foreach (JObject element in parsedJson)
-            //    {
-            //        if (element.TryGetValue("lang", out JToken json))
-            //        {
-            //            if (json.ToString().Equals(request.lang))
-            //            {
-            //                jsonElements.Add(element);
-            //            }
-            //        }
-            //    }
-
-            //    return builder.Data(jsonElements).build();
-            //}
-            //else
-            //{
-            //    return builder.Data(parsedJson).build();
-            //}
-
-            JsonRPCResponseBuilder builder = JsonRPCResponseBuilder.custom();
-
-            JsonDocument document = await GetJson(contentRootPath, "/JsonFile/Core/BaseDataDefault.json");
-            if (!request.@params)
-            {
-                List<JsonElement> jsonElements = new List<JsonElement>();
-                foreach (JsonElement element in document.RootElement.EnumerateArray())
-                {
-                    if (element.TryGetProperty("lang", out JsonElement json))
-                    {
-                        if (json.GetString().Equals(request.lang))
-                        {
-                            jsonElements.Add(element);
-                        }
-                    }
-                }
-                //return JsonDocument.Parse(jsonElements.ToApiJson()).RootElement;
-                return builder.Data(JsonDocument.Parse(jsonElements.ToApiJson()).RootElement).build();
-            }
-            else
-            {
-                //return document.RootElement;
-                return builder.Data(document.RootElement).build();
-            }
-        }
+       
 
 
         public static string getJson(string contentRootPath, string name)

+ 1 - 1
TEAMModelOS/Controllers/Exam/ExamController.cs

@@ -76,7 +76,7 @@ namespace TEAMModelOS.Controllers
         {
             JsonRPCResponseBuilder builder = JsonRPCResponseBuilder.custom();
             IdPk items = await cosmosDBV3Repository.DeleteAsync<ExamInfo>(request.@params.id, request.@params.pk);
-            await cosmosDBV3Repository.DeleteAll<Paper>(new Dictionary<string, object>() { { "code", request.id } });
+            await cosmosDBV3Repository.DeleteAll<Paper>(new Dictionary<string, object>() { { "code", request.@params.id } });
             return builder.Data(items).build();
         }
         /// <summary>