Преглед на файлове

1.修复教师没有加入学校时,获取的投票问卷活动获取在学校发布的的个人投票和问卷数据。
2.修复醍摩豆ID第一次登录IES5则默认赠送1G,并创建Blob容器,并处理当不论账号被邀请或者申请还是正式加入都会再获得1G的个人空间,并且只有当status为join时才会分配默认权限:学校内容"content-read",学校题库 "exercise-read", 知识点库"knowledge-read",学校课纲"syllabus-read"的读取权限。
3.需要总部同事整理并列出《HiTeach5客户端》已经对接的IES5服务端接口,以及直接操作AzureBlob的相关业务,目的旨在及时跟进相关接口的Bug修复和IES5服务端相关架构调整导致客服端接口异常,以及新接口对接流程标准化。
4.学校基础信息增加地理位置的 郡县字段 :county ,同时原有的 国家/地区region, 省份province ,城市city ,用于标记地理位置 ,其中address 详细地址信息也需要补全(需要订单系统推送region,province,city,county,address这一部分信息)。

CrazyIter_Bin преди 3 години
родител
ревизия
07067c27f7

+ 6 - 1
TEAMModelOS.SDK/Models/Cosmos/School/School.cs

@@ -38,11 +38,16 @@ namespace TEAMModelOS.SDK.Models
         /// 地区
         /// </summary>
         public string region { get; set; }
-        public string province { get; set; }
         /// <summary>
         /// 省份
         /// </summary>
+        public string province { get; set; }
+       /// <summary>
+       /// 城市
+       /// </summary>
         public string city { get; set; }
+        //郡县
+        public string county { get; set; }
         /// <summary>
         ///授权给 学校的Blob 容器空间大小 单位为G
         ///1252748378/1024/1024/1024

+ 15 - 38
TEAMModelOS/Controllers/Common/VoteController.cs

@@ -188,7 +188,6 @@ namespace TEAMModelOS.Controllers.Learn
         {
             try
             {
-                var (userid, _, _, school) = HttpContext.GetAuthTokenInfo();
                 //必须有学校或者教师编码
                 if (!requert.TryGetProperty("code", out JsonElement code)) return BadRequest();
                 //开始时间,默认最近三十天
@@ -239,49 +238,27 @@ namespace TEAMModelOS.Controllers.Learn
                         iscontinuation = true;
                     }
                 };
-                List<Vote> votes = new List<Vote>();
+                List<object> votes = new List<object>();
                 var client = _azureCosmos.GetCosmosClient();
-                var query = $"select   c.id,c.name,c.code,c.startTime,c.endTime,c.progress from c where c.createTime >= {stimestamp} and c.createTime <= {etimestamp}  {progresssql } ";
-                if (string.IsNullOrEmpty(school))
+             
+                var query =$"select   c.id,c.name,c.code,c.startTime,c.endTime,c.progress from c where c.createTime >= {stimestamp} and c.createTime <= {etimestamp}  {progresssql } ";
+                await foreach (var item in client.GetContainer("TEAMModelOS", "Common").GetItemQueryStreamIterator(queryText: query,
+                    requestOptions: new QueryRequestOptions() {MaxItemCount = topcout, PartitionKey = new PartitionKey($"Vote-{code}") }))
                 {
-                    query = $"{query} and c.scope='private' ";
-                }
-                await foreach (var item in client.GetContainer("TEAMModelOS", "Common").GetItemQueryIterator<Vote>(queryText: query,
-                    requestOptions: new QueryRequestOptions() { MaxItemCount = topcout, PartitionKey = new PartitionKey($"Vote-{code}") }))
-                {
-                    if (!string.IsNullOrEmpty(school))
+                    using var json = await JsonDocument.ParseAsync(item.ContentStream);
+                    if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
                     {
-                        //只能查出相关学校的
-                        if (!item.scope.Equals("private")&& !string.IsNullOrEmpty(item.school) && item.school.Equals(school)) {
-                            votes.Add(item);
+                        foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
+                        {
+                            votes.Add(obj.ToObject<JsonElement>());
                         }
-                        //和自己私人发布的 
-                        if (item.scope.Equals("private")) {
-                            votes.Add(item);
+                        //如果需要分页则跳出
+                        if (iscontinuation) {
+                            continuationToken = item.GetContinuationToken();
+                            break;
                         }
                     }
-                    else {
-                        votes.Add(item);
-                    }
                 }
-                //var query =$"select   c.id,c.name,c.code,c.startTime,c.endTime,c.progress from c where c.createTime >= {stimestamp} and c.createTime <= {etimestamp}  {progresssql } ";
-                //await foreach (var item in client.GetContainer("TEAMModelOS", "Common").GetItemQueryStreamIterator(queryText: query,
-                //    requestOptions: new QueryRequestOptions() {MaxItemCount = topcout, PartitionKey = new PartitionKey($"Vote-{code}") }))
-                //{
-                //    using var json = await JsonDocument.ParseAsync(item.ContentStream);
-                //    if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
-                //    {
-                //        foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
-                //        {
-                //            votes.Add(obj.ToObject<JsonElement>());
-                //        }
-                //        //如果需要分页则跳出
-                //        if (iscontinuation) {
-                //            continuationToken = item.GetContinuationToken();
-                //            break;
-                //        }
-                //    }
-                //}
                 return Ok(new { votes, continuationToken });
             }
             catch (Exception ex)
@@ -357,7 +334,7 @@ namespace TEAMModelOS.Controllers.Learn
                     flag = true;
                 }
                 else {
-                    if (vote.scope .Equals("school")&& vote.school.Equals(school)) {
+                    if (vote.scope == "school"&& vote.school.Equals(school)) {
                         flag = true;
                     }
                 }

+ 9 - 14
TEAMModelOS/Controllers/Core/ImportController.cs

@@ -81,26 +81,23 @@ namespace TEAMModelOS.Controllers
         /// <param name="request"></param>
         /// <returns></returns>
         [HttpPost("parse-doc")]
+        //[RequestSizeLimit(102_400_000_00)] //最大10000m左右
         [AuthToken(Roles = "admin,teacher")]
         public async Task<IActionResult> ParseDoc(JsonElement request)
         {
+            //string id_token = HttpContext.GetXAuth("IdToken");
+            //if (string.IsNullOrEmpty(id_token)) return BadRequest();
+            //var jwt = new JwtSecurityToken(id_token);
+            //if (!jwt.Payload.Iss.Equals("account.teammodel", StringComparison.OrdinalIgnoreCase)) return BadRequest();
+            //var id = jwt.Payload.Sub;
             var (id, _, _, school) = HttpContext.GetAuthTokenInfo();
             var containerid = id;
-            string scope = "";
             if (request.TryGetProperty("scope", out JsonElement jscope))
             {
                 if (jscope.GetString().Equals("school"))
                 {
-                    scope = "school";
                     containerid = school;
                 }
-                else
-                {
-                    scope = $"{jscope}";
-                }
-            }
-            else {
-                scope = $"private";
             }
             request.TryGetProperty("file", out JsonElement code);
             string azureBlobSAS = System.Web.HttpUtility.UrlDecode(code.ToString(), Encoding.UTF8);
@@ -119,20 +116,18 @@ namespace TEAMModelOS.Controllers
                 response.EnsureSuccessStatusCode();
                 Stream stream = await response.Content.ReadAsStreamAsync();
 
-                if (ext.ToLower().Equals("pptx")  || ext.ToLower().Equals("xml"))
+                if (ext.ToLower() == "pptx" || ext.ToLower() == "xml")
                 {
                     string index = await PPTXTranslator(containerid, FileName, stream);
-                    await _azureStorage.GetBlobServiceClient().DeleteBlobs(containerid, new List<string>() { FileName });
                     return Ok(new { index = index });
                 }
-                else if (ext.ToLower() .Equals("docx")  || ext.ToLower().Equals("doc") )
+                else if (ext.ToLower() == "docx" || ext.ToLower() == "doc")
                 {
                     return Ok(new { index = "" });
                 }
-                else if (ext.ToLower() .Equals("htex"))
+                else if (ext.ToLower() == "htex")
                 {
                     var index = await HTEXTranslator(containerid, FileName, stream);
-                    await _azureStorage.GetBlobServiceClient().DeleteBlobs(containerid, new List<string>() { FileName });
                     return Ok(new { index = index });
                 }
                 else

+ 27 - 3
TEAMModelOS/Controllers/School/SchoolTeacherController.cs

@@ -253,6 +253,10 @@ namespace TEAMModelOS.Controllers
                         }
                         else
                             teacher.schools.Add(new Teacher.School() { schoolId = school_code.GetString(), name = schname, time = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(), status = grant_type.GetString() });
+                        if (teacher.schools.Count > 0 && teacher.size <= 1)
+                        {
+                            teacher.size = 2;
+                        }
                         await client.GetContainer("TEAMModelOS", "Teacher").ReplaceItemAsync<Teacher>(teacher, id.ToString(), new PartitionKey("Base"));
                     }
                     else
@@ -396,6 +400,10 @@ namespace TEAMModelOS.Controllers
                 }
                 else
                     teacher.schools.Add(new Teacher.School() { schoolId = school_code.GetString(), name = schname,time =  DateTimeOffset.UtcNow.ToUnixTimeSeconds(), status = grant_type.GetString() });
+                var dft = new List<string>() { "content-read", "exercise-read", "knowledge-read", "syllabus-read" };
+                if (teacher.schools.Count > 0 && teacher.size<=1) {
+                    teacher.size = 2;
+                }
                 await client.GetContainer("TEAMModelOS", "Teacher").ReplaceItemAsync<Teacher>(teacher, id.ToString(), new PartitionKey("Base"));
                 //在學校表處理該學校教師帳號的狀態
                 var sresponse = await client.GetContainer("TEAMModelOS", "School").ReadItemStreamAsync(id.GetString(), new PartitionKey($"Teacher-{school_code}"));
@@ -404,6 +412,23 @@ namespace TEAMModelOS.Controllers
                     using var json = await JsonDocument.ParseAsync(sresponse.ContentStream);
                     SchoolTeacher steacher = json.ToObject<SchoolTeacher>();
                     steacher.status = grant_type.GetString();
+                    if (grant_type.ToString().Equals("join"))
+                    {
+                        if (steacher.permissions.IsNotEmpty())
+                        {
+                            foreach (var d in dft)
+                            {
+                                if (!steacher.permissions.Contains(d))
+                                {
+                                    steacher.permissions.Add(d);
+                                }
+                            }
+                        }
+                        else
+                        {
+                            steacher.permissions = dft;
+                        }
+                    }
                     var response = await client.GetContainer("TEAMModelOS", "School").ReplaceItemAsync(steacher, id.GetString(), new PartitionKey($"Teacher-{school_code}"));
                 }
                 else
@@ -418,9 +443,8 @@ namespace TEAMModelOS.Controllers
                         picture = teacher.picture,
                         roles = new List<string>(new string[] { "teacher" }),
                         /// 只是申请加入就需要开放 这几个权限吗
-                        permissions = grant_type.GetString().Equals("join")? new List<string>() { "content-read", "exercise-read", "knowledge-read", "syllabus-read" }:null,
-                        //permissions = null,
-                        size = 1,
+                        permissions = grant_type.GetString().Equals("join")? dft:null,
+                        size = 0,
                         status = grant_type.GetString()
                     };
                     var response = await client.GetContainer("TEAMModelOS", "School").CreateItemAsync(st, new PartitionKey($"Teacher-{school_code}"));

+ 38 - 12
TEAMModelOS/Controllers/Teacher/InitController.cs

@@ -77,7 +77,7 @@ namespace TEAMModelOS.Controllers
                     ///教师的总空间 包含 个人空间和学校赠送的空间累加
                     total = teacher.size;
                     //检查是否有加入学校,如果加入学校,则当个人空间size是0G的时候,则免费获得一个G空间,但无论加入多少个学校,只能获取一次 1G的免费空间。没有加入学校则默认0G空间,除非自己购买空间
-                    int joinCount = 0;
+                  
                     if (teacher.schools.IsNotEmpty()) {
                         foreach (var sc in teacher.schools) {
                             string statusNow = sc.status!=null?sc.status:"";
@@ -90,7 +90,7 @@ namespace TEAMModelOS.Controllers
                                 schoolExtobj.status =sc.status;
                                 schoolExtobj.time = sc.time;
                                 schoolExtobj.picture = school.RootElement.GetProperty("picture");
-                                joinCount += 1;
+                                
                                 var sctch = await client.GetContainer("TEAMModelOS", "School").ReadItemStreamAsync(id, new PartitionKey($"Teacher-{sc.schoolId}"));
                                 if (sctch.Status == 200)
                                 {
@@ -112,10 +112,13 @@ namespace TEAMModelOS.Controllers
                                 schools.Add(schoolExtobj);
                             }
                         }
-                        //如果加入学校的数量大于1,并且个人空间小于等于0,则可以免费获得1G空间
-                        //如果有申请或者加入学校,但是未分配空间则都可以得到1G免费空间
-                        if (total <= 0 && joinCount > 0)
+                        //如果包含任何申请,邀请,加入学校的记录 且个人空间未分配2G  则默认分配个人空间至2G.
+                        if ( teacher.size<2 && teacher.schools.Count > 0)
                         {
+                            teacher.size = 2;
+                        }
+                        //如果未包含任何申请,邀请,加入学校的记录 且 个人空间没有分配1G 则默认赠送一个G 
+                        if (teacher.schools.Count == 0 && teacher.size<1) {
                             teacher.size = 1;
                         }
                     }
@@ -133,10 +136,13 @@ namespace TEAMModelOS.Controllers
                             code = "Base", 
                             name = name?.ToString(),
                             picture = picture?.ToString(),
-                            size = 0,
+                            //创建账号并第一次登录IES5则默认赠送1G
+                            size = 1,
                             defaultSchool = null,
                             schools = new List<Teacher.School>(),
                         };
+                        var container = _azureStorage.GetBlobContainerClient(id);
+                        await container.CreateIfNotExistsAsync(PublicAccessType.None); //嘗試創建Teacher私有容器,如存在則不做任何事,保障容器一定存在
                         teacher = await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "Teacher").CreateItemAsync<Teacher>(teacher, new PartitionKey("Base"));
                     } 
                 }
@@ -180,10 +186,7 @@ namespace TEAMModelOS.Controllers
 
                 //換取AuthToken,提供給前端
                 var auth_token = JwtAuthExtension.CreateAuthToken(_option.HostName, id, name?.ToString(), picture?.ToString(), _option.JwtSecretKey, roles: new[] { "teacher" });
-
                 //取得Teacher Blob 容器位置及SAS 
-                var container = _azureStorage.GetBlobContainerClient(id);
-                await container.CreateIfNotExistsAsync(PublicAccessType.None); //嘗試創建Teacher私有容器,如存在則不做任何事,保障容器一定存在
                 var (blob_uri, blob_sas) = _azureStorage.GetBlobContainerSAS(id, BlobContainerSasPermissions.Write | BlobContainerSasPermissions.Read | BlobContainerSasPermissions.List | BlobContainerSasPermissions.Delete);
                 return Ok(new { auth_token, blob_uri, blob_sas, schools, defaultschool, courses, total, tsize });
 
@@ -557,12 +560,21 @@ namespace TEAMModelOS.Controllers
                             inSchools.ForEach(x => teacher.schools.Remove(x));
                         }
                     }
+                    
+                    if (teacher.schools.Count > 0 && teacher.size <= 1)
+                    {
+                        teacher.size = 2;
+                    }
                     await client.GetContainer("TEAMModelOS", "Teacher").ReplaceItemAsync<Teacher>(teacher, id, new PartitionKey("Base"));
                     var sresponse = await client.GetContainer("TEAMModelOS", "School").DeleteItemStreamAsync(id, new PartitionKey($"Teacher-{school_code}"));
                     return Ok(new { stauts = 1 });
                 }
                 else {
-                    
+                    var dft = new List<string>() { "content-read", "exercise-read", "knowledge-read", "syllabus-read" };
+                    if (teacher.schools.Count > 0 && teacher.size <= 1)
+                    {
+                        teacher.size = 2;
+                    }
                     await client.GetContainer("TEAMModelOS", "Teacher").ReplaceItemAsync<Teacher>(teacher, id, new PartitionKey("Base"));
                     //在學校表處理該學校教師帳號的狀態
                     var sresponse = await client.GetContainer("TEAMModelOS", "School").ReadItemStreamAsync(id, new PartitionKey($"Teacher-{school_code}"));
@@ -571,6 +583,20 @@ namespace TEAMModelOS.Controllers
                         using var json = await JsonDocument.ParseAsync(sresponse.ContentStream);
                         SchoolTeacher steacher = json.ToObject<SchoolTeacher>();
                         steacher.status = grant_type.GetString();
+                        if (grant_type.ToString().Equals("join")) {
+                            if (steacher.permissions.IsNotEmpty())
+                            {
+                                foreach (var d in dft) {
+                                    if (!steacher.permissions.Contains(d))
+                                    {
+                                        steacher.permissions.Add(d);
+                                    }
+                                }
+                            }
+                            else {
+                                steacher.permissions = dft;
+                            }
+                        }
                         var response = await client.GetContainer("TEAMModelOS", "School").ReplaceItemAsync(steacher, id, new PartitionKey($"Teacher-{school_code}"));
                     }
                     else
@@ -583,9 +609,9 @@ namespace TEAMModelOS.Controllers
                             id = id,
                             name = name.ToString(),
                             picture = picture?.ToString(),
-                            permissions = new List<string>() { "content-read", "exercise-read", "knowledge-read", "syllabus-read" },
+                            permissions = grant_type.ToString().Equals("join")? dft : null,
                             roles = new List<string>() { "teacher" },
-                            size = 1,
+                            size = 0,
                             status = grant_type.GetString()
                         };
                         var response = await client.GetContainer("TEAMModelOS", "School").CreateItemAsync(st, new PartitionKey($"Teacher-{school_code}"));