Browse Source

Merge branch 'develop6.0-tmd' of http://52.130.252.100:10000/TEAMMODEL/TEAMModelOS into develop6.0-tmd

zhouj1203@hotmail.com 3 years ago
parent
commit
4b51499d79
52 changed files with 1173 additions and 444 deletions
  1. 98 47
      TEAMModelBI/Controllers/LoginController.cs
  2. 14 2
      TEAMModelOS.FunctionV4/CosmosDB/TriggerCorrect.cs
  3. 14 2
      TEAMModelOS.FunctionV4/CosmosDB/TriggerExam.cs
  4. 14 2
      TEAMModelOS.FunctionV4/CosmosDB/TriggerExamLite.cs
  5. 14 2
      TEAMModelOS.FunctionV4/CosmosDB/TriggerHomework.cs
  6. 14 2
      TEAMModelOS.FunctionV4/CosmosDB/TriggerStudy.cs
  7. 14 2
      TEAMModelOS.FunctionV4/CosmosDB/TriggerSurvey.cs
  8. 11 2
      TEAMModelOS.FunctionV4/CosmosDB/TriggerVote.cs
  9. 2 6
      TEAMModelOS.SDK/Models/Cosmos/School/ExamInfo.cs
  10. BIN
      TEAMModelOS/ClientApp/src/assets/image/qrcode.png
  11. 2 0
      TEAMModelOS/ClientApp/src/assets/student-web/component_styles/new-mission-list-card.less
  12. 5 5
      TEAMModelOS/ClientApp/src/components/echart/acPie/chart.vue
  13. 3 2
      TEAMModelOS/ClientApp/src/components/echart/bottom/bottomLeftChart/chart.vue
  14. 34 13
      TEAMModelOS/ClientApp/src/components/research-dashboard/LeftBottom.vue
  15. 1 1
      TEAMModelOS/ClientApp/src/components/student-web/ClassRecord/ClassRecord.vue
  16. 16 7
      TEAMModelOS/ClientApp/src/components/student-web/HomeView/CourseListView.vue
  17. 1 1
      TEAMModelOS/ClientApp/src/components/student-web/HomeView/CourseView/ActivityView.less
  18. 89 101
      TEAMModelOS/ClientApp/src/components/student-web/HomeView/CourseView/ActivityView.vue
  19. 77 0
      TEAMModelOS/ClientApp/src/components/student-web/HomeView/CourseView/SchoolReport.less
  20. 353 0
      TEAMModelOS/ClientApp/src/components/student-web/HomeView/CourseView/SchoolReport.vue
  21. 1 1
      TEAMModelOS/ClientApp/src/components/student-web/WrongQusetion/WrongQues.vue
  22. 2 2
      TEAMModelOS/ClientApp/src/components/student-web/WrongQusetion/iViewStyle.less
  23. 1 1
      TEAMModelOS/ClientApp/src/css/common-style.less
  24. 21 21
      TEAMModelOS/ClientApp/src/locale/lang/en-US/answerSheet.js
  25. 9 9
      TEAMModelOS/ClientApp/src/locale/lang/en-US/cusMgt.js
  26. 6 6
      TEAMModelOS/ClientApp/src/locale/lang/en-US/homework.js
  27. 8 5
      TEAMModelOS/ClientApp/src/locale/lang/en-US/learnActivity.js
  28. 100 86
      TEAMModelOS/ClientApp/src/locale/lang/en-US/lessonRecord.js
  29. 25 25
      TEAMModelOS/ClientApp/src/locale/lang/en-US/notice.js
  30. 2 1
      TEAMModelOS/ClientApp/src/locale/lang/en-US/schoolBaseInfo.js
  31. 2 2
      TEAMModelOS/ClientApp/src/locale/lang/en-US/settings.js
  32. 26 22
      TEAMModelOS/ClientApp/src/locale/lang/en-US/studentWeb.js
  33. 4 4
      TEAMModelOS/ClientApp/src/locale/lang/en-US/syllabus.js
  34. 5 5
      TEAMModelOS/ClientApp/src/locale/lang/en-US/system.js
  35. 1 1
      TEAMModelOS/ClientApp/src/locale/lang/en-US/teachContent.js
  36. 15 1
      TEAMModelOS/ClientApp/src/locale/lang/zh-CN/lessonRecord.js
  37. 2 1
      TEAMModelOS/ClientApp/src/locale/lang/zh-CN/schoolBaseInfo.js
  38. 5 1
      TEAMModelOS/ClientApp/src/locale/lang/zh-CN/studentWeb.js
  39. 3 3
      TEAMModelOS/ClientApp/src/locale/lang/zh-TW/answerSheet.js
  40. 1 1
      TEAMModelOS/ClientApp/src/locale/lang/zh-TW/cusMgt.js
  41. 1 1
      TEAMModelOS/ClientApp/src/locale/lang/zh-TW/homework.js
  42. 1 1
      TEAMModelOS/ClientApp/src/locale/lang/zh-TW/learnActivity.js
  43. 17 3
      TEAMModelOS/ClientApp/src/locale/lang/zh-TW/lessonRecord.js
  44. 2 2
      TEAMModelOS/ClientApp/src/locale/lang/zh-TW/researchCenter.js
  45. 2 1
      TEAMModelOS/ClientApp/src/locale/lang/zh-TW/schoolBaseInfo.js
  46. 5 1
      TEAMModelOS/ClientApp/src/locale/lang/zh-TW/studentWeb.js
  47. 36 4
      TEAMModelOS/ClientApp/src/view/Home.vue
  48. 1 1
      TEAMModelOS/ClientApp/src/view/newcourse/MyCourse.vue
  49. 10 2
      TEAMModelOS/ClientApp/src/view/research-center/ResearchMgt.less
  50. 23 15
      TEAMModelOS/ClientApp/src/view/research-center/ResearchMgt.vue
  51. 3 0
      TEAMModelOS/ClientApp/src/view/schoolmgmt/SystemSetting/SystemSetting.vue
  52. 57 18
      TEAMModelOS/Controllers/School/SchoolController.cs

+ 98 - 47
TEAMModelBI/Controllers/LoginController.cs

@@ -86,7 +86,7 @@ namespace TEAMModelBI.Controllers
                 string divide = _configuration["CustomParam:SiteScope"];
                 string divide = _configuration["CustomParam:SiteScope"];
                 if (string.IsNullOrWhiteSpace(appKey) || string.IsNullOrWhiteSpace(appSecret))
                 if (string.IsNullOrWhiteSpace(appKey) || string.IsNullOrWhiteSpace(appSecret))
                 {
                 {
-                    return Ok(new { state = 0, message = "请检查配置钉钉的信息" });
+                    return Ok(new { state = 0, msg = "请检查配置钉钉的信息" });
                 }
                 }
                 //自己传的code
                 //自己传的code
                 if (!jsonElement.TryGetProperty("code", out JsonElement LoginTempCode)) return BadRequest();
                 if (!jsonElement.TryGetProperty("code", out JsonElement LoginTempCode)) return BadRequest();
@@ -106,7 +106,7 @@ namespace TEAMModelBI.Controllers
 
 
                 if (response.Errcode.Equals(40078))
                 if (response.Errcode.Equals(40078))
                 {
                 {
-                    return Ok(new { state = 0, message = $"state:{response.Errcode};Err{response.Errmsg}/临时授权码过期请重新扫码" });
+                    return Ok(new { state = 0, msg = $"state:{response.Errcode};Err{response.Errmsg}/临时授权码过期请重新扫码" });
                 }
                 }
 
 
                 string unionid = response.UserInfo.Unionid;
                 string unionid = response.UserInfo.Unionid;
@@ -115,7 +115,7 @@ namespace TEAMModelBI.Controllers
                 OapiUserGetbyunionidResponse byunionidResponse = client2.Execute(byunionidRequest, access_token);
                 OapiUserGetbyunionidResponse byunionidResponse = client2.Execute(byunionidRequest, access_token);
                 if (byunionidResponse.IsError || byunionidResponse.Errcode == 60121)
                 if (byunionidResponse.IsError || byunionidResponse.Errcode == 60121)
                 {
                 {
-                    return Ok(new { state = 0, message = byunionidResponse.Errmsg });
+                    return Ok(new { state = 0, msg = byunionidResponse.Errmsg });
                 }
                 }
                 // 根据userId获取用户信息
                 // 根据userId获取用户信息
                 string userid = byunionidResponse.Result.Userid;
                 string userid = byunionidResponse.Result.Userid;
@@ -130,52 +130,73 @@ namespace TEAMModelBI.Controllers
                 OapiV2UserGetResponse v2GetResponse = client3.Execute(v2GetRequest, access_token);
                 OapiV2UserGetResponse v2GetResponse = client3.Execute(v2GetRequest, access_token);
                 if (v2GetResponse.IsError)
                 if (v2GetResponse.IsError)
                 {
                 {
-                    return Ok(new { state = 0, message = "扫码登录失败" });
+                    return Ok(new { state = 0, msg = "扫码登录失败" });
                 }
                 }
 
 
                 var table = _azureStorage.GetCloudTableClient().GetTableReference("BIDDUserInfo");
                 var table = _azureStorage.GetCloudTableClient().GetTableReference("BIDDUserInfo");
+                var id_token = "";
+                string osblob_uri = null, osblob_sas = null;
+                List<string> roles = new();//角色列表
+                List<string> permissions = new();//权限列表
+
                 List<DingDingUserInfo> ddusers = await table.FindListByDict<DingDingUserInfo>(new Dictionary<string, object>() { { "RowKey", $"{v2GetResponse.Result.Userid}" }, { "unionId", $"{v2GetResponse.Result.Unionid}" } });
                 List<DingDingUserInfo> ddusers = await table.FindListByDict<DingDingUserInfo>(new Dictionary<string, object>() { { "RowKey", $"{v2GetResponse.Result.Userid}" }, { "unionId", $"{v2GetResponse.Result.Unionid}" } });
 
 
+
                 if (ddusers.Count > 0)
                 if (ddusers.Count > 0)
                 {
                 {
-                    List<DingDingUserInfo> ddUserInfos = new List<DingDingUserInfo>();
-
-                    var id_token = "";
-                    string osblob_uri = null, osblob_sas = null;
-
-                    List<string> roles = new();//角色列表
-                    List<string> permissions = new List<string>();//权限列表
+                    List<DingDingUserInfo> saveInfo = new();
+                    StringBuilder strMsg = new();
 
 
                     foreach (var item in ddusers)
                     foreach (var item in ddusers)
                     {
                     {
-                        ddUserInfos.Add(item);
-                    }
-                    foreach (var item in ddUserInfos)
-                    {
-                        if (!string.IsNullOrEmpty(item.tmdId))
+                        if (string.IsNullOrEmpty(item.tmdId))
                         {
                         {
-                            roles = !string.IsNullOrEmpty($"{item.roles}") ? new List<string>(item.roles.Split(",")) : new List<string>();
-                            permissions = !string.IsNullOrEmpty($"{item.permissions}") ? new List<string>(item.permissions.Split(",")) : new List<string>();
+                            HttpClient httpClient = _http.CreateClient();
+                            string url = _configuration.GetValue<string>("HaBookAuth:CoreId:userinfo");
 
 
-                            ///在IES5 添加
-                            //id_token = JwtAuthExtension.CreateAuthToken(_option.HostName, item.tmdId?.ToString(), item.tmdName?.ToString(), item.picture?.ToString(), _option.JwtSecretKey, Website: "BI", scope: $"assist", roles: roles?.ToArray(), permissions: permissions?.ToArray(), ddsub: item.RowKey?.ToString());
-
-                            //自己写的
-                            id_token = JwtAuth.CreateAuthTokenBI(_option.HostName, item.tmdId?.ToString(), item.tmdName?.ToString(), item.picture?.ToString(), _option.JwtSecretKey, scope: "assist", Website: "BI", item.RowKey?.ToString(), item.name?.ToString(), item.avatar?.ToString(), roles: roles?.ToArray(), permissions: permissions?.ToArray(), expire: 3);
+                            List<string> mobiles = new() { $"{ item.mobile}" };
+                            HttpResponseMessage responseMessage = await httpClient.PostAsJsonAsync(url, mobiles);
+                            if (responseMessage.StatusCode == HttpStatusCode.OK)
+                            {
+                                string temp = responseMessage.Content.ReadAsStringAsync().Result;
+                                List<JsonElement> json_id = temp.ToObject<List<JsonElement>>();
+                                if (json_id.Count > 0)
+                                {
+                                    foreach (var tmd in json_id)
+                                    {
+                                        item.tmdId = tmd.GetProperty("id").ToString();
+                                        item.tmdName = tmd.GetProperty("name").ToString();
+                                        item.tmdMobile = tmd.GetProperty("mobile").ToString();
+                                        item.picture = tmd.GetProperty("picture").ToString();
+                                        item.mail = tmd.GetProperty("mail").ToString();
+                                    }
+                                }
+                                else return Ok(new { state = 404, msg = "依据钉钉手机号未找到醍摩豆账号!" });
+                            }
 
 
-                            (osblob_uri, osblob_sas) = roles.Contains("assist") ? _azureStorage.GetBlobContainerSAS("teammodelos", BlobContainerSasPermissions.Write | BlobContainerSasPermissions.Read | BlobContainerSasPermissions.List | BlobContainerSasPermissions.Delete) : _azureStorage.GetBlobContainerSAS("teammodelos", BlobContainerSasPermissions.Read | BlobContainerSasPermissions.List);
-                        }
-                        else
-                        {
-                            return Ok(new { state = 201, ddUserInfos });
+                            strMsg.Append($"{item.tmdName}【{item.tmdId}】醍摩豆账号和{item.name}【{item.RowKey}】钉钉账户绑定成功");
                         }
                         }
+                        saveInfo.Add(item);
+
+                        roles = !string.IsNullOrEmpty($"{item.roles}") ? new List<string>(item.roles.Split(",")) : new List<string>();
+                        permissions = !string.IsNullOrEmpty($"{item.permissions}") ? new List<string>(item.permissions.Split(",")) : new List<string>();
+
+                        //自己写的
+                        id_token = JwtAuth.CreateAuthTokenBI(_option.HostName, item.tmdId?.ToString(), item.tmdName?.ToString(), item.picture?.ToString(), _option.JwtSecretKey, scope: "assist", Website: "BI", item.RowKey?.ToString(), item.name?.ToString(), item.avatar?.ToString(), roles: roles?.ToArray(), permissions: permissions?.ToArray(), expire: 3);
+
+                        (osblob_uri, osblob_sas) = roles.Contains("assist") ? _azureStorage.GetBlobContainerSAS("teammodelos", BlobContainerSasPermissions.Write | BlobContainerSasPermissions.Read | BlobContainerSasPermissions.List | BlobContainerSasPermissions.Delete) : _azureStorage.GetBlobContainerSAS("teammodelos", BlobContainerSasPermissions.Read | BlobContainerSasPermissions.List);
+                    }
+                    if (saveInfo.Count > 0)
+                    {
+                        ddusers = await table.UpdateAll<DingDingUserInfo>(saveInfo);
+                        //保存操作记录
+                        await _azureStorage.SaveBILog("tabledd-update", strMsg?.ToString(), _dingDing, httpContext: HttpContext);
                     }
                     }
 
 
-                    return Ok(new { state = 200, ddUserInfos, id_token, roles, permissions, osblob_uri, osblob_sas });
                 }
                 }
                 else
                 else
                 {
                 {
-                    DingDingUserInfo dingDingUserInfo = new()
+                    DingDingUserInfo ddUserInfo = new()
                     {
                     {
                         PartitionKey = divide,
                         PartitionKey = divide,
                         RowKey = v2GetResponse.Result.Userid,
                         RowKey = v2GetResponse.Result.Userid,
@@ -190,18 +211,52 @@ namespace TEAMModelBI.Controllers
                         depts = string.Join(",", v2GetResponse.Result.DeptIdList.ToArray()),
                         depts = string.Join(",", v2GetResponse.Result.DeptIdList.ToArray()),
                         avatar = v2GetResponse.Result.Avatar,
                         avatar = v2GetResponse.Result.Avatar,
                         isAdmin = v2GetResponse.Result.Admin,
                         isAdmin = v2GetResponse.Result.Admin,
-                        tmdId = "",
-                        tmdName = "",
-                        tmdMobile = "",
-                        mail = "",
-                        picture = "",
-                        roles = "",
-                        permissions = "",
+                        roles = "assist",
+                        permissions = "abilitystandard-read,batcharea-read,batchschool-read,orgusers-read"
                     };
                     };
-                    await table.Save<DingDingUserInfo>(dingDingUserInfo);
 
 
-                    return Ok(new { state = 400, ddUserId = dingDingUserInfo });
+                    if (!string.IsNullOrEmpty($"{ddUserInfo.mobile}"))
+                    {
+                        HttpClient httpClient = _http.CreateClient();
+                        string url = _configuration.GetValue<string>("HaBookAuth:CoreId:userinfo");
+
+                        List<string> mobiles = new() { $"{ ddUserInfo.mobile}" };
+                        HttpResponseMessage responseMessage = await httpClient.PostAsJsonAsync(url, mobiles);
+                        if (responseMessage.StatusCode == HttpStatusCode.OK)
+                        {
+                            string temp = responseMessage.Content.ReadAsStringAsync().Result;
+                            List<JsonElement> json_id = temp.ToObject<List<JsonElement>>();
+                            if (json_id.Count > 0)
+                            {
+                                foreach (var tmd in json_id)
+                                {
+                                    ddUserInfo.tmdId = tmd.GetProperty("id").ToString();
+                                    ddUserInfo.tmdName = tmd.GetProperty("name").ToString();
+                                    ddUserInfo.tmdMobile = tmd.GetProperty("mobile").ToString();
+                                    ddUserInfo.picture = tmd.GetProperty("picture").ToString();
+                                    ddUserInfo.mail = tmd.GetProperty("mail").ToString();
+                                }
+                            }
+                            else return Ok(new { state = 404, msg = "依据钉钉手机号未找到醍摩豆账号!" });
+                        }
+                    }
+                    else return Ok(new { state = 404, msg = "钉钉手机号为空" });
+
+                    ddUserInfo = await table.Save<DingDingUserInfo>(ddUserInfo);
+
+                    //保存操作记录
+                    await _azureStorage.SaveBILog("tabledd-update", $"{ddUserInfo.tmdName}【{ddUserInfo.tmdId}】醍摩豆账号和{ddUserInfo.name}【{ddUserInfo.RowKey}】钉钉账户绑定成功", _dingDing, httpContext: HttpContext);
+
+                    roles = !string.IsNullOrEmpty($"{ddUserInfo.roles}") ? new List<string>(ddUserInfo.roles.Split(",")) : new List<string>();
+                    permissions = !string.IsNullOrEmpty($"{ddUserInfo.permissions}") ? new List<string>(ddUserInfo.permissions.Split(",")) : new List<string>();
+
+                    //自己写的
+                    id_token = JwtAuth.CreateAuthTokenBI(_option.HostName, ddUserInfo.tmdId?.ToString(), ddUserInfo.tmdName?.ToString(), ddUserInfo.picture?.ToString(), _option.JwtSecretKey, scope: "assist", Website: "BI", ddUserInfo.RowKey?.ToString(), ddUserInfo.name?.ToString(), ddUserInfo.avatar?.ToString(), roles: roles?.ToArray(), permissions: permissions?.ToArray(), expire: 3);
+
+                    (osblob_uri, osblob_sas) = roles.Contains("assist") ? _azureStorage.GetBlobContainerSAS("teammodelos", BlobContainerSasPermissions.Write | BlobContainerSasPermissions.Read | BlobContainerSasPermissions.List | BlobContainerSasPermissions.Delete) : _azureStorage.GetBlobContainerSAS("teammodelos", BlobContainerSasPermissions.Read | BlobContainerSasPermissions.List);
                 }
                 }
+
+                return Ok(new { state = 200, ddUserInfos = ddusers, id_token, roles, permissions, osblob_uri, osblob_sas });
             }
             }
             catch (Exception ex)
             catch (Exception ex)
             {
             {
@@ -274,7 +329,7 @@ namespace TEAMModelBI.Controllers
                         else return Ok(new { state = 404, msg = "手机号未找到醍摩豆账户" });
                         else return Ok(new { state = 404, msg = "手机号未找到醍摩豆账户" });
                     }
                     }
 
 
-                    if (string.IsNullOrEmpty($"{mobile}") && string.IsNullOrEmpty($"{idtoken}"))                    
+                    if (string.IsNullOrEmpty($"{mobile}") && string.IsNullOrEmpty($"{idtoken}"))
                         return Ok(new { state = 400, msg = "mobile、idtoken参数错误" });
                         return Ok(new { state = 400, msg = "mobile、idtoken参数错误" });
                     else
                     else
                     {
                     {
@@ -371,8 +426,6 @@ namespace TEAMModelBI.Controllers
                         }
                         }
                         else return Ok(new { state = responseMessage.StatusCode });
                         else return Ok(new { state = responseMessage.StatusCode });
                     }
                     }
-                    ////在IES5 的基础上增加参数
-                    //id_token = JwtAuthExtension.CreateAuthToken(_option.HostName, itemUser.tmdId?.ToString(), itemUser.tmdName?.ToString(), itemUser.picture?.ToString(), _option.JwtSecretKey,Website: "BI", scope: $"assist", roles: roles?.ToArray(), permissions: permissions?.ToArray(), ddsub: itemUser.RowKey?.ToString());
                     //自己写的
                     //自己写的
                     id_token = JwtAuth.CreateAuthTokenBI(_option.HostName, itemUser.tmdId?.ToString(), itemUser.tmdName?.ToString(), itemUser.picture?.ToString(), _option.JwtSecretKey, scope: "assist", Website: "BI", itemUser.RowKey?.ToString(), itemUser.name?.ToString(), itemUser.avatar?.ToString(), roles: roles?.ToArray(), permissions: permissions?.ToArray(), expire: 3);
                     id_token = JwtAuth.CreateAuthTokenBI(_option.HostName, itemUser.tmdId?.ToString(), itemUser.tmdName?.ToString(), itemUser.picture?.ToString(), _option.JwtSecretKey, scope: "assist", Website: "BI", itemUser.RowKey?.ToString(), itemUser.name?.ToString(), itemUser.avatar?.ToString(), roles: roles?.ToArray(), permissions: permissions?.ToArray(), expire: 3);
                 }
                 }
@@ -411,7 +464,7 @@ namespace TEAMModelBI.Controllers
             Company company = new();
             Company company = new();
             List<Company> companies = new();
             List<Company> companies = new();
             string id_token = "";
             string id_token = "";
-            await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", "Normal").GetItemQueryIterator<Company>(queryText: sqlTxt.ToString(), requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("Company") })) 
+            await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", "Normal").GetItemQueryIterator<Company>(queryText: sqlTxt.ToString(), requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("Company") }))
             {
             {
                 companies.Add(item);
                 companies.Add(item);
             }
             }
@@ -441,7 +494,7 @@ namespace TEAMModelBI.Controllers
         /// <param name="jsonElement"></param>
         /// <param name="jsonElement"></param>
         /// <returns></returns>
         /// <returns></returns>
         [HttpPost("set-registered")]
         [HttpPost("set-registered")]
-        public async Task<IActionResult> SetRegistered(JsonElement jsonElement) 
+        public async Task<IActionResult> SetRegistered(JsonElement jsonElement)
         {
         {
             if (!jsonElement.TryGetProperty("name", out JsonElement name)) return BadRequest();
             if (!jsonElement.TryGetProperty("name", out JsonElement name)) return BadRequest();
             if (!jsonElement.TryGetProperty("credit", out JsonElement credit)) return BadRequest();
             if (!jsonElement.TryGetProperty("credit", out JsonElement credit)) return BadRequest();
@@ -452,7 +505,7 @@ namespace TEAMModelBI.Controllers
             string salt = Utils.CreatSaltString(8);
             string salt = Utils.CreatSaltString(8);
 
 
             string sqltxt = $"select value(c) from c where c.mobile='{mobile}'";
             string sqltxt = $"select value(c) from c where c.mobile='{mobile}'";
-            await foreach (var item in  cosmosClient.GetContainer("TEAMModelOS", "Normal").GetItemQueryStreamIterator(queryText: sqltxt, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("Company") }))
+            await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", "Normal").GetItemQueryStreamIterator(queryText: sqltxt, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("Company") }))
             {
             {
                 using var json = await JsonDocument.ParseAsync(item.ContentStream);
                 using var json = await JsonDocument.ParseAsync(item.ContentStream);
                 if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
                 if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
@@ -491,7 +544,6 @@ namespace TEAMModelBI.Controllers
             return Ok(new { state = 200, company });
             return Ok(new { state = 200, company });
         }
         }
 
 
-
         public record DingDingbinds
         public record DingDingbinds
         {
         {
             public string type { get; set; }
             public string type { get; set; }
@@ -522,6 +574,5 @@ namespace TEAMModelBI.Controllers
             public string userid { get; set; }
             public string userid { get; set; }
         }
         }
 
 
-
     }
     }
 }
 }

+ 14 - 2
TEAMModelOS.FunctionV4/CosmosDB/TriggerCorrect.cs

@@ -75,7 +75,13 @@ namespace TEAMModelOS.FunctionV4
                             if (correctRecords.Count > 0)
                             if (correctRecords.Count > 0)
                             {
                             {
                                 long start = await _serviceBus.GetServiceBusClient().SendScheduleMessageAsync(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), messageCorrect, DateTimeOffset.FromUnixTimeMilliseconds(tdata.startTime));
                                 long start = await _serviceBus.GetServiceBusClient().SendScheduleMessageAsync(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), messageCorrect, DateTimeOffset.FromUnixTimeMilliseconds(tdata.startTime));
-                                await _serviceBus.GetServiceBusClient().cancelMessage(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), correctRecords[0].sequenceNumber);
+                                try
+                                {
+                                    await _serviceBus.GetServiceBusClient().cancelMessage(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), correctRecords[0].sequenceNumber);
+                                }
+                                catch (Exception)
+                                {
+                                }
                                 correctRecords[0].sequenceNumber = start;
                                 correctRecords[0].sequenceNumber = start;
                                 await table.SaveOrUpdate<ChangeRecord>(correctRecords[0]);
                                 await table.SaveOrUpdate<ChangeRecord>(correctRecords[0]);
                             }
                             }
@@ -358,7 +364,13 @@ namespace TEAMModelOS.FunctionV4
                             if (correctRecords.Count > 0)
                             if (correctRecords.Count > 0)
                             {
                             {
                                 long end = await _serviceBus.GetServiceBusClient().SendScheduleMessageAsync(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), messageCorrectEnd, DateTimeOffset.FromUnixTimeMilliseconds(tdata.endTime));
                                 long end = await _serviceBus.GetServiceBusClient().SendScheduleMessageAsync(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), messageCorrectEnd, DateTimeOffset.FromUnixTimeMilliseconds(tdata.endTime));
-                                await _serviceBus.GetServiceBusClient().cancelMessage(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), correctRecords[0].sequenceNumber);
+                                try
+                                {
+                                    await _serviceBus.GetServiceBusClient().cancelMessage(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), correctRecords[0].sequenceNumber);
+                                }
+                                catch (Exception)
+                                {
+                                }
                                 correctRecords[0].sequenceNumber = end;
                                 correctRecords[0].sequenceNumber = end;
                                 await table.SaveOrUpdate<ChangeRecord>(correctRecords[0]);
                                 await table.SaveOrUpdate<ChangeRecord>(correctRecords[0]);
                             }
                             }

+ 14 - 2
TEAMModelOS.FunctionV4/CosmosDB/TriggerExam.cs

@@ -98,7 +98,13 @@ namespace TEAMModelOS.FunctionV4
                             message.ApplicationProperties.Add("name", "Exam");
                             message.ApplicationProperties.Add("name", "Exam");
                             if (records.Count > 0)
                             if (records.Count > 0)
                             {
                             {
-                                await _serviceBus.GetServiceBusClient().cancelMessage(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), records[0].sequenceNumber);
+                                try
+                                {
+                                    await _serviceBus.GetServiceBusClient().cancelMessage(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), records[0].sequenceNumber);
+                                }
+                                catch (Exception)
+                                {
+                                }
                                 long start = await _serviceBus.GetServiceBusClient().SendScheduleMessageAsync(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), message, DateTimeOffset.FromUnixTimeMilliseconds(data.startTime));
                                 long start = await _serviceBus.GetServiceBusClient().SendScheduleMessageAsync(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), message, DateTimeOffset.FromUnixTimeMilliseconds(data.startTime));
                                 records[0].sequenceNumber = start;
                                 records[0].sequenceNumber = start;
                                 await table.SaveOrUpdate<ChangeRecord>(records[0]);
                                 await table.SaveOrUpdate<ChangeRecord>(records[0]);
@@ -354,7 +360,13 @@ namespace TEAMModelOS.FunctionV4
                                 if (records.Count > 0)
                                 if (records.Count > 0)
                                 {
                                 {
                                     long end = await _serviceBus.GetServiceBusClient().SendScheduleMessageAsync(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), messageEnd, DateTimeOffset.FromUnixTimeMilliseconds(data.endTime));
                                     long end = await _serviceBus.GetServiceBusClient().SendScheduleMessageAsync(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), messageEnd, DateTimeOffset.FromUnixTimeMilliseconds(data.endTime));
-                                    await _serviceBus.GetServiceBusClient().cancelMessage(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), records[0].sequenceNumber);
+                                    try
+                                    {
+                                        await _serviceBus.GetServiceBusClient().cancelMessage(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), records[0].sequenceNumber);
+                                    }
+                                    catch (Exception)
+                                    {
+                                    }
                                     records[0].sequenceNumber = end;
                                     records[0].sequenceNumber = end;
                                     await table.SaveOrUpdate<ChangeRecord>(records[0]);
                                     await table.SaveOrUpdate<ChangeRecord>(records[0]);
                                     //await client.GetContainer(Constant.TEAMModelOS, "Common").ReplaceItemAsync(record, record.id, new Azure.Cosmos.PartitionKey($"{record.code}"));
                                     //await client.GetContainer(Constant.TEAMModelOS, "Common").ReplaceItemAsync(record, record.id, new Azure.Cosmos.PartitionKey($"{record.code}"));

+ 14 - 2
TEAMModelOS.FunctionV4/CosmosDB/TriggerExamLite.cs

@@ -73,7 +73,13 @@ namespace TEAMModelOS.FunctionV4
                             messageWork.ApplicationProperties.Add("name", "ExamLite");
                             messageWork.ApplicationProperties.Add("name", "ExamLite");
                             if (changeRecords.Count > 0)
                             if (changeRecords.Count > 0)
                             {
                             {
-                                await _serviceBus.GetServiceBusClient().cancelMessage(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), changeRecords[0].sequenceNumber);
+                                try
+                                {
+                                    await _serviceBus.GetServiceBusClient().cancelMessage(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), changeRecords[0].sequenceNumber);
+                                }
+                                catch (Exception)
+                                {
+                                }
                                 long start = await _serviceBus.GetServiceBusClient().SendScheduleMessageAsync(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), messageWork, DateTimeOffset.FromUnixTimeMilliseconds(tdata.startTime));
                                 long start = await _serviceBus.GetServiceBusClient().SendScheduleMessageAsync(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), messageWork, DateTimeOffset.FromUnixTimeMilliseconds(tdata.startTime));
                                 changeRecords[0].sequenceNumber = start;
                                 changeRecords[0].sequenceNumber = start;
                                 await table.SaveOrUpdate<ChangeRecord>(changeRecords[0]);
                                 await table.SaveOrUpdate<ChangeRecord>(changeRecords[0]);
@@ -150,7 +156,13 @@ namespace TEAMModelOS.FunctionV4
                             if (changeRecords.Count > 0)
                             if (changeRecords.Count > 0)
                             {
                             {
                                 long end = await _serviceBus.GetServiceBusClient().SendScheduleMessageAsync(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), messageWorkEnd, DateTimeOffset.FromUnixTimeMilliseconds(tdata.endTime));
                                 long end = await _serviceBus.GetServiceBusClient().SendScheduleMessageAsync(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), messageWorkEnd, DateTimeOffset.FromUnixTimeMilliseconds(tdata.endTime));
-                                await _serviceBus.GetServiceBusClient().cancelMessage(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), changeRecords[0].sequenceNumber);
+                                try
+                                {
+                                    await _serviceBus.GetServiceBusClient().cancelMessage(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), changeRecords[0].sequenceNumber);
+                                }
+                                catch (Exception)
+                                {
+                                }
                                 changeRecords[0].sequenceNumber = end;
                                 changeRecords[0].sequenceNumber = end;
                                 await table.SaveOrUpdate<ChangeRecord>(changeRecords[0]);
                                 await table.SaveOrUpdate<ChangeRecord>(changeRecords[0]);
                             }
                             }

+ 14 - 2
TEAMModelOS.FunctionV4/CosmosDB/TriggerHomework.cs

@@ -73,7 +73,13 @@ namespace TEAMModelOS.FunctionV4
                             messageWork.ApplicationProperties.Add("name", "Homework");
                             messageWork.ApplicationProperties.Add("name", "Homework");
                             if (changeRecords.Count > 0)
                             if (changeRecords.Count > 0)
                             {
                             {
-                                await _serviceBus.GetServiceBusClient().cancelMessage(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), changeRecords[0].sequenceNumber);
+                                try
+                                {
+                                    await _serviceBus.GetServiceBusClient().cancelMessage(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), changeRecords[0].sequenceNumber);
+                                }
+                                catch (Exception)
+                                {
+                                }
                                 long start = await _serviceBus.GetServiceBusClient().SendScheduleMessageAsync(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), messageWork, DateTimeOffset.FromUnixTimeMilliseconds(tdata.startTime));
                                 long start = await _serviceBus.GetServiceBusClient().SendScheduleMessageAsync(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), messageWork, DateTimeOffset.FromUnixTimeMilliseconds(tdata.startTime));
                                 changeRecords[0].sequenceNumber = start;
                                 changeRecords[0].sequenceNumber = start;
                                 await table.SaveOrUpdate<ChangeRecord>(changeRecords[0]);
                                 await table.SaveOrUpdate<ChangeRecord>(changeRecords[0]);
@@ -99,7 +105,13 @@ namespace TEAMModelOS.FunctionV4
                             if (changeRecords.Count > 0)
                             if (changeRecords.Count > 0)
                             {
                             {
                                 long end = await _serviceBus.GetServiceBusClient().SendScheduleMessageAsync(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), messageWorkEnd, DateTimeOffset.FromUnixTimeMilliseconds(tdata.endTime));
                                 long end = await _serviceBus.GetServiceBusClient().SendScheduleMessageAsync(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), messageWorkEnd, DateTimeOffset.FromUnixTimeMilliseconds(tdata.endTime));
-                                await _serviceBus.GetServiceBusClient().cancelMessage(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), changeRecords[0].sequenceNumber);
+                                try
+                                {
+                                    await _serviceBus.GetServiceBusClient().cancelMessage(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), changeRecords[0].sequenceNumber);
+                                }
+                                catch (Exception)
+                                {
+                                }
                                 changeRecords[0].sequenceNumber = end;
                                 changeRecords[0].sequenceNumber = end;
                                 await table.SaveOrUpdate<ChangeRecord>(changeRecords[0]);
                                 await table.SaveOrUpdate<ChangeRecord>(changeRecords[0]);
                             }
                             }

+ 14 - 2
TEAMModelOS.FunctionV4/CosmosDB/TriggerStudy.cs

@@ -73,7 +73,13 @@ namespace TEAMModelOS.FunctionV4
                             messageWork.ApplicationProperties.Add("name", "Study");
                             messageWork.ApplicationProperties.Add("name", "Study");
                             if (changeRecords.Count > 0)
                             if (changeRecords.Count > 0)
                             {
                             {
-                                await _serviceBus.GetServiceBusClient().cancelMessage(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), changeRecords[0].sequenceNumber);
+                                try
+                                {
+                                    await _serviceBus.GetServiceBusClient().cancelMessage(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), changeRecords[0].sequenceNumber);
+                                }
+                                catch (Exception)
+                                {
+                                }
                                 long start = await _serviceBus.GetServiceBusClient().SendScheduleMessageAsync(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), messageWork, DateTimeOffset.FromUnixTimeMilliseconds(tdata.startTime));
                                 long start = await _serviceBus.GetServiceBusClient().SendScheduleMessageAsync(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), messageWork, DateTimeOffset.FromUnixTimeMilliseconds(tdata.startTime));
                                 changeRecords[0].sequenceNumber = start;
                                 changeRecords[0].sequenceNumber = start;
                                 await table.SaveOrUpdate<ChangeRecord>(changeRecords[0]);
                                 await table.SaveOrUpdate<ChangeRecord>(changeRecords[0]);
@@ -156,7 +162,13 @@ namespace TEAMModelOS.FunctionV4
                                 if (changeRecords.Count > 0)
                                 if (changeRecords.Count > 0)
                                 {
                                 {
                                     long end = await _serviceBus.GetServiceBusClient().SendScheduleMessageAsync(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), messageWorkEnd, DateTimeOffset.FromUnixTimeMilliseconds(tdata.endTime));
                                     long end = await _serviceBus.GetServiceBusClient().SendScheduleMessageAsync(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), messageWorkEnd, DateTimeOffset.FromUnixTimeMilliseconds(tdata.endTime));
-                                    await _serviceBus.GetServiceBusClient().cancelMessage(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), changeRecords[0].sequenceNumber);
+                                    try
+                                    {
+                                        await _serviceBus.GetServiceBusClient().cancelMessage(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), changeRecords[0].sequenceNumber);
+                                    }
+                                    catch (Exception)
+                                    {
+                                    }
                                     changeRecords[0].sequenceNumber = end;
                                     changeRecords[0].sequenceNumber = end;
                                     await table.SaveOrUpdate<ChangeRecord>(changeRecords[0]);
                                     await table.SaveOrUpdate<ChangeRecord>(changeRecords[0]);
                                 }
                                 }

+ 14 - 2
TEAMModelOS.FunctionV4/CosmosDB/TriggerSurvey.cs

@@ -81,7 +81,13 @@ namespace TEAMModelOS.FunctionV4
                             messageSurvey.ApplicationProperties.Add("name", "Survey");
                             messageSurvey.ApplicationProperties.Add("name", "Survey");
                             if (changeRecords.Count > 0)
                             if (changeRecords.Count > 0)
                             {
                             {
-                                await _serviceBus.GetServiceBusClient().cancelMessage(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), changeRecords[0].sequenceNumber);
+                                try
+                                {
+                                    await _serviceBus.GetServiceBusClient().cancelMessage(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), changeRecords[0].sequenceNumber);
+                                }
+                                catch (Exception)
+                                {
+                                }
                                 long start = await _serviceBus.GetServiceBusClient().SendScheduleMessageAsync(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), messageSurvey, DateTimeOffset.FromUnixTimeMilliseconds(tdata.startTime));
                                 long start = await _serviceBus.GetServiceBusClient().SendScheduleMessageAsync(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), messageSurvey, DateTimeOffset.FromUnixTimeMilliseconds(tdata.startTime));
                                 changeRecords[0].sequenceNumber = start;
                                 changeRecords[0].sequenceNumber = start;
                                 await table.SaveOrUpdate<ChangeRecord>(changeRecords[0]);
                                 await table.SaveOrUpdate<ChangeRecord>(changeRecords[0]);
@@ -270,7 +276,13 @@ namespace TEAMModelOS.FunctionV4
                             if (changeRecords.Count > 0)
                             if (changeRecords.Count > 0)
                             {
                             {
                                 long end = await _serviceBus.GetServiceBusClient().SendScheduleMessageAsync(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), messageSurveyEnd, DateTimeOffset.FromUnixTimeMilliseconds(tdata.endTime));
                                 long end = await _serviceBus.GetServiceBusClient().SendScheduleMessageAsync(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), messageSurveyEnd, DateTimeOffset.FromUnixTimeMilliseconds(tdata.endTime));
-                                await _serviceBus.GetServiceBusClient().cancelMessage(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), changeRecords[0].sequenceNumber);
+                                try
+                                {
+                                    await _serviceBus.GetServiceBusClient().cancelMessage(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), changeRecords[0].sequenceNumber);
+                                }
+                                catch (Exception)
+                                {
+                                }
                                 changeRecords[0].sequenceNumber = end;
                                 changeRecords[0].sequenceNumber = end;
                                 await table.SaveOrUpdate<ChangeRecord>(changeRecords[0]);
                                 await table.SaveOrUpdate<ChangeRecord>(changeRecords[0]);
                             }
                             }

+ 11 - 2
TEAMModelOS.FunctionV4/CosmosDB/TriggerVote.cs

@@ -80,7 +80,10 @@ namespace TEAMModelOS.FunctionV4
                             if (voteRecords.Count > 0)
                             if (voteRecords.Count > 0)
                             {
                             {
                                 long start = await _serviceBus.GetServiceBusClient().SendScheduleMessageAsync(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), messageVote, DateTimeOffset.FromUnixTimeMilliseconds(tdata.startTime));
                                 long start = await _serviceBus.GetServiceBusClient().SendScheduleMessageAsync(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), messageVote, DateTimeOffset.FromUnixTimeMilliseconds(tdata.startTime));
-                                await _serviceBus.GetServiceBusClient().cancelMessage(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), voteRecords[0].sequenceNumber);
+                                try {
+                                    await _serviceBus.GetServiceBusClient().cancelMessage(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), voteRecords[0].sequenceNumber);
+                                } catch (Exception) { 
+                                }
                                 voteRecords[0].sequenceNumber = start;
                                 voteRecords[0].sequenceNumber = start;
                                 await table.SaveOrUpdate<ChangeRecord>(voteRecords[0]);
                                 await table.SaveOrUpdate<ChangeRecord>(voteRecords[0]);
                             }
                             }
@@ -277,7 +280,13 @@ namespace TEAMModelOS.FunctionV4
                             if (voteRecords.Count > 0)
                             if (voteRecords.Count > 0)
                             {
                             {
                                 long end = await _serviceBus.GetServiceBusClient().SendScheduleMessageAsync(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), messageVoteEnd, DateTimeOffset.FromUnixTimeMilliseconds(tdata.endTime));
                                 long end = await _serviceBus.GetServiceBusClient().SendScheduleMessageAsync(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), messageVoteEnd, DateTimeOffset.FromUnixTimeMilliseconds(tdata.endTime));
-                                await _serviceBus.GetServiceBusClient().cancelMessage(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), voteRecords[0].sequenceNumber);
+                                try
+                                {
+                                    await _serviceBus.GetServiceBusClient().cancelMessage(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), voteRecords[0].sequenceNumber);
+                                }
+                                catch (Exception)
+                                {
+                                }
                                 voteRecords[0].sequenceNumber = end;
                                 voteRecords[0].sequenceNumber = end;
                                 await table.SaveOrUpdate<ChangeRecord>(voteRecords[0]);
                                 await table.SaveOrUpdate<ChangeRecord>(voteRecords[0]);
                             }
                             }

+ 2 - 6
TEAMModelOS.SDK/Models/Cosmos/School/ExamInfo.cs

@@ -22,8 +22,7 @@ namespace TEAMModelOS.SDK.Models
             subjects = new List<ExamSubject>();
             subjects = new List<ExamSubject>();
             papers = new List<PaperSimple>();
             papers = new List<PaperSimple>();
             classes = new List<string>();
             classes = new List<string>();
-            stuLists = new List<string>();
-            attachments = new List<string>();
+            stuLists = new List<string>();            
         }
         }
         /// <summary>
         /// <summary>
         ///发布层级 类型 school  teacher
         ///发布层级 类型 school  teacher
@@ -71,10 +70,7 @@ namespace TEAMModelOS.SDK.Models
         /// 書面問答類型 0:書面問答 1:紙本測驗
         /// 書面問答類型 0:書面問答 1:紙本測驗
         /// </summary>
         /// </summary>
         public int qamode { get; set; }
         public int qamode { get; set; }
-        /// <summary>
-        /// 添附檔案 [例]:["abc.png","def.png", "ykk.pnb"]
-        /// </summary>
-        public List<string> attachments { get; set; }
+        
         /// <summary>
         /// <summary>
         ///class行政班/teach教学班
         ///class行政班/teach教学班
         /// </summary>
         /// </summary>

BIN
TEAMModelOS/ClientApp/src/assets/image/qrcode.png


+ 2 - 0
TEAMModelOS/ClientApp/src/assets/student-web/component_styles/new-mission-list-card.less

@@ -2,6 +2,8 @@
 
 
 /*修改iviewCard控件,局部清單修正*/
 /*修改iviewCard控件,局部清單修正*/
 .mission-list-card {
 .mission-list-card {
+    width: 100%;
+    
     .mission-list-card-title {
     .mission-list-card-title {
         display: block;
         display: block;
         position: relative;
         position: relative;

+ 5 - 5
TEAMModelOS/ClientApp/src/components/echart/acPie/chart.vue

@@ -8,11 +8,11 @@
 <script>
 <script>
 	import Echart from '@/common/echart'
 	import Echart from '@/common/echart'
 	export default {
 	export default {
-		data() {
+		data(vm) {
 			return {
 			return {
 				options: {},
 				options: {},
 				acData:[],
 				acData:[],
-				acArr: ['线上评测(校)',  '课中评测(校)', '阅卷评测(校)', '线上评测(个)', '课中评测(个)','阅卷评测(个)', '作业活动', '自主学习']
+				acArr: [vm.$t('lessonRecord.echarts.ac1'),vm.$t('lessonRecord.echarts.ac2'),vm.$t('lessonRecord.echarts.ac3'),vm.$t('lessonRecord.echarts.ac4'),vm.$t('lessonRecord.echarts.ac5'),vm.$t('lessonRecord.echarts.ac6'),vm.$t('lessonRecord.echarts.ac7'),vm.$t('lessonRecord.echarts.ac8')]
 			};
 			};
 		},
 		},
 		components: {
 		components: {
@@ -108,15 +108,15 @@
 								},
 								},
 								data: [{
 								data: [{
 										value: acJson[0] + acJson[3],
 										value: acJson[0] + acJson[3],
-										name: '线上'
+										name: that.$t('lessonRecord.echarts.online')
 									},
 									},
 									{
 									{
 										value: acJson[2] + acJson[5],
 										value: acJson[2] + acJson[5],
-										name: '线下'
+										name: that.$t('lessonRecord.echarts.online')
 									},
 									},
 									{
 									{
 										value: acJson[1] + acJson[4],
 										value: acJson[1] + acJson[4],
-										name: '课中'
+										name: that.$t('lessonRecord.echarts.mid')
 									},
 									},
 								]
 								]
 							},
 							},

+ 3 - 2
TEAMModelOS/ClientApp/src/components/echart/bottom/bottomLeftChart/chart.vue

@@ -90,7 +90,8 @@
 
 
 						yAxis: [{
 						yAxis: [{
 							type: "value",
 							type: "value",
-							name: "单位:堂",
+							name: this.$t('lessonRecord.echarts.unit'),
+							minInterval:1,
 							nameTextStyle: {
 							nameTextStyle: {
 							  color: '#cecece',
 							  color: '#cecece',
 							  padding: [0, 0, 0, -40],
 							  padding: [0, 0, 0, -40],
@@ -129,7 +130,7 @@
 							end: 35
 							end: 35
 						}],
 						}],
 						series: [{
 						series: [{
-							name: "课例总数",
+							name: this.$t('lessonRecord.echarts.count'),
 							type: "line",
 							type: "line",
 							symbolSize: 10,
 							symbolSize: 10,
 							symbol: 'circle',
 							symbol: 'circle',

+ 34 - 13
TEAMModelOS/ClientApp/src/components/research-dashboard/LeftBottom.vue

@@ -7,16 +7,16 @@
 		</p>
 		</p>
 		<div class="bg-color-black">
 		<div class="bg-color-black">
 			<div class="pie-item">
 			<div class="pie-item">
-				<BasePie :title="$t('lessonRecord.echarts.pie1')" :pieData="groupData"/>
+				<BasePie :title="$t('lessonRecord.echarts.pie3')" :pieData="gradeData"/>
 			</div>
 			</div>
 			<div class="pie-item">
 			<div class="pie-item">
-				<BasePie :title="$t('lessonRecord.echarts.pie2')" :pieData="cateData"/>
+				<BasePie :title="$t('lessonRecord.echarts.pie4')" :pieData="subjectData"/>
 			</div>
 			</div>
 			<div class="pie-item">
 			<div class="pie-item">
-				<BasePie :title="$t('lessonRecord.echarts.pie3')" :pieData="gradeData"/>
+				<BasePie :title="$t('lessonRecord.echarts.pie1')" :pieData="groupData"/>
 			</div>
 			</div>
 			<div class="pie-item">
 			<div class="pie-item">
-				<BasePie :title="$t('lessonRecord.echarts.pie4')" :pieData="subjectData"/>
+				<BasePie :title="$t('lessonRecord.echarts.pie2')" :pieData="cateData"/>
 			</div>
 			</div>
 		</div>
 		</div>
 	</div>
 	</div>
@@ -41,27 +41,48 @@
 			let curPeriod = this.$store.state.user.curPeriod
 			let curPeriod = this.$store.state.user.curPeriod
 			console.log(curPeriod.subjects.map(i => i.id))
 			console.log(curPeriod.subjects.map(i => i.id))
 			if(pieJson){
 			if(pieJson){
-				console.log(pieJson.classify_sub.map(i => i.name))
-				this.cateData = pieJson.classify_type
 				this.gradeData = pieJson.classify_grade.map(i => {
 				this.gradeData = pieJson.classify_grade.map(i => {
 					return {
 					return {
 						name:curPeriod.grades[+i.name],
 						name:curPeriod.grades[+i.name],
 						value:i.value
 						value:i.value
 					}
 					}
 				})
 				})
+				
 				this.subjectData = pieJson.classify_sub.map(i => {
 				this.subjectData = pieJson.classify_sub.map(i => {
 					return {
 					return {
 						name:curPeriod.subjects.find(j => j.id === i.name).name,
 						name:curPeriod.subjects.find(j => j.id === i.name).name,
 						value:i.value
 						value:i.value
 					}
 					}
 				})
 				})
-				this.groupData = pieJson.classify_group.map(i => {
-					return {
-						name:i.name,
-						value:i.value
-					}
-				})
-				console.log(this.groupData)
+				
+				if(!pieJson.classify_group.length){
+					this.groupData = [{
+						name:this.$t('lessonRecord.echarts.noGroup'),
+						value:0
+					}]
+				}else{
+					this.groupData = pieJson.classify_group.map(i => {
+						return {
+							name:i.name,
+							value:i.value
+						}
+					})
+				}
+				
+				if(!pieJson.classify_type.length){
+					this.cateData = [{
+						name:this.$t('lessonRecord.echarts.noType'),
+						value:0
+					}]
+				}else{
+					this.cateData = pieJson.classify_type.map(i => {
+						return {
+							name:i.name,
+							value:i.value
+						}
+					})
+				}
+				
 			}
 			}
 		},
 		},
 	}
 	}

+ 1 - 1
TEAMModelOS/ClientApp/src/components/student-web/ClassRecord/ClassRecord.vue

@@ -361,7 +361,7 @@ export default {
             this.isLoad = true
             this.isLoad = true
             this.pageList = []
             this.pageList = []
             this.markers = []
             this.markers = []
-            let sas = await this.$tools.getBlobSas(this.recordInfo.tmdid)
+            let sas = await this.$tools.getBlobSas(this.recordInfo.scope === 'school' ? this.recordInfo.school : this.recordInfo.tmdid)
             this.recordInfo.eNote = `${sas.url}/${sas.name}/records/${this.recordInfo.id}/Note.pdf?${sas.sas}`
             this.recordInfo.eNote = `${sas.url}/${sas.name}/records/${this.recordInfo.id}/Note.pdf?${sas.sas}`
             // 如果只会存在一个视频,文件名是否可以固定?
             // 如果只会存在一个视频,文件名是否可以固定?
             this.playerOptions.sources[0].src = `${sas.url}/${sas.name}/records/${this.recordInfo.id}/Record/CourseRecord.mp4?${sas.sas}`
             this.playerOptions.sources[0].src = `${sas.url}/${sas.name}/records/${this.recordInfo.id}/Record/CourseRecord.mp4?${sas.sas}`

+ 16 - 7
TEAMModelOS/ClientApp/src/components/student-web/HomeView/CourseListView.vue

@@ -84,7 +84,9 @@
                                                     <span class="tag-style" style="border-color: #76ae38; color: #76ae38;">{{ fix.subject.name }}</span>
                                                     <span class="tag-style" style="border-color: #76ae38; color: #76ae38;">{{ fix.subject.name }}</span>
                                                     <span class="tag-style" v-show="fix.className" style="border-color: #499c8d; color: #499c8d;">{{ fix.className }}</span>
                                                     <span class="tag-style" v-show="fix.className" style="border-color: #499c8d; color: #499c8d;">{{ fix.className }}</span>
                                                     <span class="tag-style" style="border-color: #6b6ba9; color: #6b6ba9;">{{ fix.teaName }}</span>
                                                     <span class="tag-style" style="border-color: #6b6ba9; color: #6b6ba9;">{{ fix.teaName }}</span>
-                                                    <span v-if="fix.timeId">{{ fix.classTime }}</span>
+                                                </p>
+                                                <p style="margin-top: 10px; font-size: 12px;" v-if="fix.timeId">
+                                                    <span>{{ fix.classTime }}</span>
                                                 </p>
                                                 </p>
                                             </li>
                                             </li>
                                         </ul>
                                         </ul>
@@ -117,6 +119,9 @@
                                                     <span class="tag-style" v-if="person.className" style="border-color: #499c8d; color: #499c8d;">{{ person.className }}</span>
                                                     <span class="tag-style" v-if="person.className" style="border-color: #499c8d; color: #499c8d;">{{ person.className }}</span>
                                                     <span class="tag-style" style="border-color: #6b6ba9; color: #6b6ba9;">{{ person.teaName }}</span>
                                                     <span class="tag-style" style="border-color: #6b6ba9; color: #6b6ba9;">{{ person.teaName }}</span>
                                                 </p>
                                                 </p>
+                                                <p style="margin-top: 10px; font-size: 12px;" v-if="person.timeId">
+                                                    <span>{{ person.classTime }}</span>
+                                                </p>
                                             </li>
                                             </li>
                                         </ul>
                                         </ul>
                                     </li>
                                     </li>
@@ -279,8 +284,12 @@
                     <ActivityView :needParam="needParam" :activityType="name" v-if="name === 'Vote'" />
                     <ActivityView :needParam="needParam" :activityType="name" v-if="name === 'Vote'" />
                 </TabPane> -->
                 </TabPane> -->
                 <!-- 问卷 -->
                 <!-- 问卷 -->
-                <!-- <TabPane :label="$t('studentWeb.courseContent.surRecord')" name="Survey">
-                    <ActivityView :needParam="needParam" :activityType="name" v-if="name === 'Survey'" />
+                <!-- <TabPane :label="$t('studentWeb.courseContent.activityList')" name="Survey">
+                    <ActivityView :needParam="needParam" />
+                </TabPane> -->
+                <!-- 成绩清单 -->
+                <!-- <TabPane :label="$t('studentWeb.courseContent.scoreList')" name="tab4">
+                    <SchoolReport :classInfo="courseNow" />
                 </TabPane> -->
                 </TabPane> -->
                 <!-- 同学名单 -->
                 <!-- 同学名单 -->
                 <TabPane :label="$t('studentWeb.courseContent.classmates')" name="tab3">
                 <TabPane :label="$t('studentWeb.courseContent.classmates')" name="tab3">
@@ -489,6 +498,7 @@ import Loading from '@/common/Loading.vue';
 import ClassRecord from './../ClassRecord/ClassRecord';
 import ClassRecord from './../ClassRecord/ClassRecord';
 import { mapGetters, mapState } from 'vuex';
 import { mapGetters, mapState } from 'vuex';
 import ActivityView from './CourseView/ActivityView.vue';
 import ActivityView from './CourseView/ActivityView.vue';
+import SchoolReport from "./CourseView/SchoolReport";
 
 
 export default {
 export default {
     name: "CourseListView",
     name: "CourseListView",
@@ -496,6 +506,7 @@ export default {
         Loading,
         Loading,
         ClassRecord,
         ClassRecord,
         ActivityView,
         ActivityView,
+        SchoolReport,
     },
     },
     data(vm) {
     data(vm) {
         return {
         return {
@@ -656,9 +667,6 @@ export default {
                 req.ids = [course.stuList]
                 req.ids = [course.stuList]
             }
             }
             this.$api.common.getGroupListByIds(req).then(res => {
             this.$api.common.getGroupListByIds(req).then(res => {
-                if(res.groups.length) {
-                    this.needParam.className = res.groups[0].name
-                }
                 if(res.members.length) {
                 if(res.members.length) {
                     let arr = this._.cloneDeep(res.members)
                     let arr = this._.cloneDeep(res.members)
                     // type表示角色类型,1:醍摩豆登陆,2:学生登陆
                     // type表示角色类型,1:醍摩豆登陆,2:学生登陆
@@ -955,7 +963,7 @@ export default {
             this.isLoad = true
             this.isLoad = true
             this.courseNow = this._.cloneDeep(item)
             this.courseNow = this._.cloneDeep(item)
             this.needParam = {
             this.needParam = {
-                className: undefined,
+                className: this.courseNow.className,
                 classes: [],
                 classes: [],
                 pk: "Exam",
                 pk: "Exam",
                 school: this.userInfo.azp,
                 school: this.userInfo.azp,
@@ -992,6 +1000,7 @@ export default {
             return Y + M + D + H + Min;
             return Y + M + D + H + Min;
         },
         },
         getRecordList() {
         getRecordList() {
+            this.recordList = []
             let param = {
             let param = {
                 tmdid: "",
                 tmdid: "",
                 scope: this.courseNow.scope, //school:传school,private:传tmdid
                 scope: this.courseNow.scope, //school:传school,private:传tmdid

+ 1 - 1
TEAMModelOS/ClientApp/src/components/student-web/HomeView/CourseView/ActivityView.less

@@ -2,7 +2,7 @@
 
 
 .activity-view {
 .activity-view {
     height: 69vh;
     height: 69vh;
-    // display: flex;
+    display: flex;
 
 
     .activity-list{
     .activity-list{
         width: 25%;
         width: 25%;

+ 89 - 101
TEAMModelOS/ClientApp/src/components/student-web/HomeView/CourseView/ActivityView.vue

@@ -1,107 +1,104 @@
 <template>
 <template>
     <div>
     <div>
         <Loading v-show="isLoad" bgColor="rgba(0, 0, 0, 0.3)"></Loading>
         <Loading v-show="isLoad" bgColor="rgba(0, 0, 0, 0.3)"></Loading>
-        <div class="activity-view" :style="{'display': !getSidebarisOpen ? 'flex' : 'block'}" v-if="activityList.length">
+        <div class="activity-view" v-if="activityList.length">
             <!-- 列表 -->
             <!-- 列表 -->
-            <div :class="{'activity-list': !getSidebarisOpen}">
+            <div class="activity-list">
                 <vuescroll>
                 <vuescroll>
-                    <template v-if="activityList.length">
-                        <div :id="`event${item.id}`"
-                            class="list-new"
-                            v-for="(item, index) in activityList"
-                            :key="index"
-                            @click="sentSelectedEventTitle(item)"
-                            :class="{ 'list-item-selected': selectedCondition(item) && !getSidebarisOpen}"
-                            v-show="item.type === needParam.pk"
-                        >
-                            <div>
-                                <div v-if="item.type === 'Exam'">
-                                    <div class="paper-item-school">
-                                        <span class="paper-owner" v-if="item.owner === 'school'" style="background-color: #88a1d8;">{{ $t('studentWeb.public.school') }}</span>
-                                        <span class="paper-owner" v-else>{{ $t('studentWeb.public.private') }}</span>
-                                        <span class="paper-source" :style="{'border-color': item.owner === 'school' ? '#88a1d8' :'#ababab'}" v-if="item.source === '0'">
-                                            {{ $t("studentWeb.exam.source.evMode1") }}
-                                        </span>
-                                        <span class="paper-source" :style="{'border-color': item.owner === 'school' ? '#88a1d8' :'#ababab', color: '#2f98a9'}" v-if="item.source === '1'">
-                                            {{ $t("studentWeb.exam.source.evMode2") }}
-                                        </span>
-                                        <span class="paper-source" :style="{'border-color': item.owner === 'school' ? '#88a1d8' :'#ababab', color: '#b68268'}" v-if="item.source === '2'">
-                                            {{ $t("studentWeb.exam.source.evMode3") }}
-                                        </span>
-                                        <span v-if="item.ext.type === 'regular'" class="paper-extType"
-                                                style="color: #dc8f57;"
-                                        >
-                                            {{ $t('totalAnalysis.ti_text6') }}
-                                        </span>
-                                        <span v-if="item.ext.type === 'simulation'" class="paper-extType"
-                                                style="color: #76ae38;"
-                                        >
-                                            {{ $t('totalAnalysis.ti_text7') }}
-                                        </span>
-                                        <span v-if="item.ext.type === 'normal'" class="paper-extType"
-                                                style="color: #a69b17;"
-                                        >
-                                            {{ $t('totalAnalysis.ti_text8') }}
-                                        </span>
-                                    </div>
-                                    <p class="list-item-title">
-                                        <span>{{ item.name }}</span>
-                                    </p>
-                                </div>
-                                <div class="paper-item-school" v-else>
-                                    <span class="other-owner" v-if="item.owner === 'school'" style="background-color: #88a1d8;">{{ $t('studentWeb.public.school') }}</span>
-                                    <span class="other-owner" v-else>{{ $t('studentWeb.public.private') }}</span>
-                                    <p>{{ item.name }}</p>
+                    <div :id="`event${item.id}`"
+                        class="list-new"
+                        v-for="(item, index) in activityList"
+                        :key="index"
+                        @click="sentSelectedEventTitle(item)"
+                        :class="{ 'list-item-selected': selectedCondition(item)}"
+                    >
+                        <div>
+                            <div v-if="item.type === 'Exam'">
+                                <div class="paper-item-school">
+                                    <span class="paper-owner" v-if="item.owner === 'school'" style="background-color: #88a1d8;">{{ $t('studentWeb.public.school') }}</span>
+                                    <span class="paper-owner" v-else>{{ $t('studentWeb.public.private') }}</span>
+                                    <span class="paper-source" :style="{'border-color': item.owner === 'school' ? '#88a1d8' :'#ababab'}" v-if="item.source === '0'">
+                                        {{ $t("studentWeb.exam.source.evMode1") }}
+                                    </span>
+                                    <span class="paper-source" :style="{'border-color': item.owner === 'school' ? '#88a1d8' :'#ababab', color: '#2f98a9'}" v-if="item.source === '1'">
+                                        {{ $t("studentWeb.exam.source.evMode2") }}
+                                    </span>
+                                    <span class="paper-source" :style="{'border-color': item.owner === 'school' ? '#88a1d8' :'#ababab', color: '#b68268'}" v-if="item.source === '2'">
+                                        {{ $t("studentWeb.exam.source.evMode3") }}
+                                    </span>
+                                    <span v-if="item.ext.type === 'regular'" class="paper-extType"
+                                            style="color: #dc8f57;"
+                                    >
+                                        {{ $t('totalAnalysis.ti_text6') }}
+                                    </span>
+                                    <span v-if="item.ext.type === 'simulation'" class="paper-extType"
+                                            style="color: #76ae38;"
+                                    >
+                                        {{ $t('totalAnalysis.ti_text7') }}
+                                    </span>
+                                    <span v-if="item.ext.type === 'normal'" class="paper-extType"
+                                            style="color: #a69b17;"
+                                    >
+                                        {{ $t('totalAnalysis.ti_text8') }}
+                                    </span>
                                 </div>
                                 </div>
-                                <p style="font-size:12px; margin-top: 5px; word-break: keep-all;">
-                                    <span v-if="item.type === 'Exam' && item.ext">
-                                        <span v-if="item.ext.subjects">
-                                            <span v-for="(item, index) in item.ext.subjects" :key="index" class="tag-style"
-                                                    style="border-color: #499c8d; color: #499c8d;"
-                                            >
-                                                {{ item.name }}
-                                            </span>
+                                <p class="list-item-title">
+                                    <span>{{ item.name }}</span>
+                                </p>
+                            </div>
+                            <div class="paper-item-school" v-else>
+                                <span class="other-owner" v-if="item.owner === 'school'" style="background-color: #88a1d8;">{{ $t('studentWeb.public.school') }}</span>
+                                <span class="other-owner" v-else>{{ $t('studentWeb.public.private') }}</span>
+                                <p>{{ item.name }}</p>
+                            </div>
+                            <p style="font-size:12px; margin-top: 5px; word-break: keep-all;">
+                                <span v-if="item.type === 'Exam' && item.ext">
+                                    <span v-if="item.ext.subjects">
+                                        <span v-for="(item, index) in item.ext.subjects" :key="index" class="tag-style"
+                                                style="border-color: #499c8d; color: #499c8d;"
+                                        >
+                                            {{ item.name }}
                                         </span>
                                         </span>
                                     </span>
                                     </span>
-                                    <span v-if="item.type === 'Exam' && item.className.length">
-                                        <span v-for="(clasNa, index) in item.className" :key="index" class="tag-style"
-                                            style="border-color: #8f8787; color: #8f8787;">
-                                            {{ clasNa }}
-                                        </span>
+                                </span>
+                                <span v-if="item.type === 'Exam' && item.className.length">
+                                    <span v-for="(clasNa, index) in item.className" :key="index" class="tag-style"
+                                        style="border-color: #8f8787; color: #8f8787;">
+                                        {{ clasNa }}
                                     </span>
                                     </span>
-                                    <span class="tag-style" style="border-color: #6b6ba9; color: #6b6ba9;" v-if="item.creatorName">{{ item.creatorName }}</span>
-                                </p>
-                                <p class="list-item-time">
-                                    {{ item.startTime2 }} ~ {{ item.endTime2 }}
-                                </p>
+                                </span>
+                                <span class="tag-style" style="border-color: #6b6ba9; color: #6b6ba9;" v-if="item.creatorName">{{ item.creatorName }}</span>
+                            </p>
+                            <p class="list-item-time">
+                                {{ item.startTime2 }} ~ {{ item.endTime2 }}
+                            </p>
+                        </div>
+                        <div class="list-new-type">
+                            <span style="font-size: 12px; text-align: center;">{{ item.tempsub }}</span>
+                            <div class="list-new-unDone isAllowRetry" v-show="item.progress === 'going'">
+                                <span>{{$t("studentWeb.public.going")}}</span>
                             </div>
                             </div>
-                            <div class="list-new-type">
-                                <span style="font-size: 12px; text-align: center;">{{ item.tempsub }}</span>
-                                <div class="list-new-unDone isAllowRetry" v-show="item.progress === 'going'">
-                                    <span>{{$t("studentWeb.public.going")}}</span>
-                                </div>
-                                <div class="list-new-unDone" v-show="item.progress === 'finish'">
-                                    <span class="isOvertime">{{ item.type === 'Exam' ? $t("studentWeb.exam.finishOk") : $t("studentWeb.public.finish")}}</span>
-                                </div>
-                                <div class="list-new-unDone" v-show="item.progress === 'noAns'" style="border-color: red;">
-                                    <span style="color: red;">{{$t("studentWeb.exam.missExam")}}</span>
-                                </div>
-                                <div class="list-new-unDone" v-show="item.progress === 'noScore'" style="border-color: #ac9263;">
-                                    <span style="color: #ac9263;">{{$t("studentWeb.exam.noScoreType")}}</span>
-                                </div>
+                            <div class="list-new-unDone" v-show="item.progress === 'finish'">
+                                <span class="isOvertime">{{ item.type === 'Exam' ? $t("studentWeb.exam.finishOk") : $t("studentWeb.public.finish")}}</span>
+                            </div>
+                            <div class="list-new-unDone" v-show="item.progress === 'noAns'" style="border-color: red;">
+                                <span style="color: red;">{{$t("studentWeb.exam.missExam")}}</span>
+                            </div>
+                            <div class="list-new-unDone" v-show="item.progress === 'noScore'" style="border-color: #ac9263;">
+                                <span style="color: #ac9263;">{{$t("studentWeb.exam.noScoreType")}}</span>
                             </div>
                             </div>
                         </div>
                         </div>
-                    </template>
+                    </div>
                 </vuescroll>
                 </vuescroll>
             </div>
             </div>
             <!-- 内容 -->
             <!-- 内容 -->
-            <div v-if="!getSidebarisOpen && activityList.length" class="activity-content">
+            <div v-if="activityList.length" class="activity-content">
                 <vuescroll>
                 <vuescroll>
                     <div style="margin: 0 70px;">
                     <div style="margin: 0 70px;">
-                        <PaperView v-if="needParam.pk === 'Exam'" />
-                        <Homework v-if="needParam.pk === 'Homework'" />
-                        <Vote v-if="needParam.pk === 'Vote'" />
-                        <QuesNaire v-if="needParam.pk === 'Survey'" />
+                        <PaperView v-if="getItemTitle.type === 'Exam'" />
+                        <Homework v-if="getItemTitle.type === 'Homework'" />
+                        <Vote v-if="getItemTitle.type === 'Vote'" />
+                        <QuesNaire v-if="getItemTitle.type === 'Survey'" />
                     </div>
                     </div>
                 </vuescroll>
                 </vuescroll>
             </div>
             </div>
@@ -140,8 +137,8 @@ export default {
         needParam: {
         needParam: {
             type: Object,
             type: Object,
             default: () => {
             default: () => {
-                    return {}
-                }
+                return {}
+            }
         }
         }
     },
     },
     mounted () {
     mounted () {
@@ -224,7 +221,7 @@ export default {
                         let ownerClass = item.classIds.find(classId => {
                         let ownerClass = item.classIds.find(classId => {
                             return this.needParam.classes.includes(classId)
                             return this.needParam.classes.includes(classId)
                         })
                         })
-                        return item.type === this.needParam.pk && ownerClass
+                        return ownerClass
                     })
                     })
                     if(this.activityList.length) {
                     if(this.activityList.length) {
                         let twoDay = 24 * 3600 * 1000 * 2
                         let twoDay = 24 * 3600 * 1000 * 2
@@ -342,7 +339,8 @@ export default {
         },
         },
         // 展示活动
         // 展示活动
         async sentSelectedEventTitle(item) {
         async sentSelectedEventTitle(item) {
-            this.$store.commit("ToggleSidebar", false);
+            console.log(item);
+            // this.$store.commit("ToggleSidebar", false);
             // 活动信息
             // 活动信息
             this.$store.commit("SetPaperInfo", item)
             this.$store.commit("SetPaperInfo", item)
             ////改變ItemName的狀態 vuex mutations
             ////改變ItemName的狀態 vuex mutations
@@ -359,16 +357,6 @@ export default {
             this.$store.commit("SetTrytestCount", [0, 0, 0]);
             this.$store.commit("SetTrytestCount", [0, 0, 0]);
         },
         },
     },
     },
-    watch: {
-        needParam: {
-            handler(val, oldVal) {
-                console.log(111111111111111111111111);
-                console.log(val);
-                this.getActivity()
-            },
-            deep: true,
-        }
-    },
     computed: {
     computed: {
         ...mapState({
         ...mapState({
             userInfo: state => state.userInfo,
             userInfo: state => state.userInfo,

+ 77 - 0
TEAMModelOS/ClientApp/src/components/student-web/HomeView/CourseView/SchoolReport.less

@@ -0,0 +1,77 @@
+@import '~@/assets/student-web/component_styles/color.less';
+
+.report-head {
+    display: flex;
+    justify-content: space-between;
+
+    .base-info {
+        display: flex;
+        flex-direction: column;
+        align-items: flex-start;
+        margin-right: 50px;
+        padding-top: 1%;
+
+        & > span {
+            margin-bottom: 5px;
+        }
+    }
+
+    .filter-type{
+        padding: 1%;
+        margin-bottom: 20px;
+
+        & > div{
+            margin-bottom: 12px;
+
+            &:last-child {
+                margin-bottom: 0;
+                // margin-top: 10px;
+            }
+        }
+
+        .type-name {
+            margin-right: 10px;
+            font-weight: bold;
+        }
+        
+        .point-box {
+            border: 1px solid #24B880;
+            background-color: @primary;
+            color: #fff;
+            padding: 3px 5px;
+            border-radius: 5px;
+            margin-right: 10px;
+            display: inline-block;
+
+            .ivu-icon{
+                cursor: pointer;
+                margin-left: 5px;
+            }
+        }
+
+        .ivu-icon-md-add-circle {
+            // font-weight: bold;
+            cursor: pointer;
+        }
+
+        .have-total {
+            display: inline-block;
+            float: right;
+
+            & > span{
+                font-size: 18px;
+                font-weight: bold;
+                color: #de0000;
+                margin: 0 5px;
+            }
+        }
+    }
+}
+
+.tag-style {
+    border: 1px solid;
+    padding: 0 5px;
+    border-radius: 3px;
+    margin-right: 10px;
+    font-size: 12px;
+}

+ 353 - 0
TEAMModelOS/ClientApp/src/components/student-web/HomeView/CourseView/SchoolReport.vue

@@ -0,0 +1,353 @@
+<template>
+    <div>
+        <div class="report-head student-check">
+            <div class="filter-type">
+                <div>
+                    <span class="type-name">{{ $t('studentWeb.baseInfo.examMode') }}:</span>
+                    <RadioGroup v-model="sourceType" type="button" button-style="solid">
+                        <Radio v-for="(item, index) in sourceTypeList" :key="index" :label="item.type">{{ item.name }}</Radio>
+                    </RadioGroup>
+                </div>
+                <div>
+                    <span class="type-name">{{ $t('studentWeb.baseInfo.examStatus') }}:</span>
+                    <RadioGroup v-model="examType" type="button" button-style="solid">
+                        <Radio v-for="(item, index) in examTypeList" :key="index + 1" :label="item.type">{{ item.name }}</Radio>
+                    </RadioGroup>
+                </div>
+                <!-- <div>
+                    <span class="type-name">{{ $t('studentWeb.wrongTopic.subject') }}:</span>
+                    <RadioGroup v-model="ownerType" type="button" button-style="solid">
+                        <Radio v-for="(item, index) in ownerTypeList" :key="index" :label="item.type">{{ item.name }}</Radio>
+                    </RadioGroup>
+                </div> -->
+            </div>
+            <p class="base-info">
+                <span v-if="classInfo.teaName">
+                    <Icon type="ios-contact-outline" style="font-weight: bold; margin-right: 5px;" />{{ $t('studentWeb.baseInfo.teacher') }}
+                    <span class="base-info-text">{{ classInfo.teaName }}</span>
+                </span>
+                <span v-if="classInfo.name">
+                    <Icon custom="iconfont icon-mingdan" style="font-weight: bold; margin-right: 5px;" />{{ $t('studentWeb.baseInfo.teacher') }}
+                    <span class="base-info-text">{{ classInfo.name }}</span>
+                </span>
+                <span>
+                    <Icon type="ios-contact-outline" style="font-weight: bold; margin-right: 5px;" />{{ $t('studentWeb.baseInfo.nowStu') }}
+                    <span class="base-info-text">{{ $store.state.userInfo.name }}</span>
+                </span>
+            </p>
+        </div>
+        <Table :columns="schoolRepCol" :data="showSchoolRep" row-key="id">
+            <template slot-scope="{ row }" slot="tag">
+                <!-- <p>{{ row.name }}</p> -->
+                <span class="tag-style">{{ row.tag.owner }}</span>
+                <span class="tag-style">{{ row.tag.source }}</span>
+                <span class="tag-style">{{ row.tag.type }}</span>
+                <!-- <span class="tag-style">{{ row.tag.class }}</span> -->
+                <span class="tag-style">{{ row.tag.list }}</span>
+            </template>
+            <template slot-scope="{ row }" slot="score">
+                <span v-for="(item, index) in row.score" :key="index" style="margin-right: 10px;">{{ item }}</span>
+            </template>
+        </Table>
+    </div>
+</template>
+
+<script>
+export default {
+    name: "",
+    props: {
+        classInfo: {
+            type: Object,
+            default: () => {
+                return {}
+            }
+        },
+    },
+    data () {
+        return {
+            schoolRepCol: [
+                {
+                    title: '评测名称',
+                    // slot: "name",
+                    key: 'name',
+                    tree: true,
+                    // width: 500,
+                },
+                /* {
+                    title: '课程',
+                    key: 'class'
+                }, */
+                {
+                    title: '创建人',
+                    key: 'creator'
+                },
+                {
+                    title: '标签',
+                    slot: "tag",
+                    width: 500,
+                },
+                /* {
+                    title: '名单',
+                    key: 'list'
+                }, */
+                {
+                    title: '分数',
+                    slot: "score",
+                },
+                {
+                    title: '时间',
+                    key: 'time'
+                }
+            ],
+            schoolRep: [
+                {
+                    id: "1111111111111111",
+                    name: '评测名称11111111',
+                    class: '课程111',
+                    tag: {
+                        owner: "校级",
+                        source: "课中评测",
+                        type: "正规考",
+                        class: '课程111',
+                        list: '名单1111111111',
+                    },
+                    creator: '罗老师',
+                    list: '名单1111111111',
+                    score: [67, 85],
+                    time: '2021-06-27',
+                    children: [
+                        {
+                            id: "1111111111111112",
+                            name: '英语',
+                            class: '课程111',
+                            tag: {
+                                owner: "校级",
+                                source: "课中评测",
+                                type: "正规考",
+                                class: '课程111',
+                                list: '名单1111111111',
+                            },
+                            creator: '罗老师',
+                            list: '名单1111111111',
+                            score: [67],
+                            time: '2021-06-27',
+                        },
+                        {
+                            id: "1111111111111113",
+                            name: '数学',
+                            class: '课程111',
+                            tag: {
+                                owner: "校级",
+                                source: "课中评测",
+                                type: "正规考",
+                                class: '课程111',
+                                list: '名单1111111111',
+                            },
+                            creator: '罗老师',
+                            list: '名单1111111111',
+                            score: [85],
+                            time: '2021-06-27',
+                        },
+                    ]
+                },
+                {
+                    id: "2222222222222222",
+                    name: '评测名称222222222',
+                    class: '课程3222222222',
+                    tag: {
+                        owner: "个人",
+                        source: "线上评测",
+                        type: "模拟考",
+                        class: '课程3222222222',
+                        list: '名单22222',
+                    },
+                    creator: '罗老师',
+                    list: '名单22222',
+                    score: [97],
+                    time: '2022-01-14',
+                },
+                {
+                    id: "33333333333",
+                    name: '评测名称3333333',
+                    class: '课程3333333',
+                    tag: {
+                        owner: "个人",
+                        source: "线上评测",
+                        type: "模拟考",
+                        class: '课程3333333',
+                        list: '名单43333333333',
+                    },
+                    creator: '罗老师',
+                    list: '名单43333333333',
+                    score: [10],
+                    time: '2022-01-14',
+                },
+                {
+                    id: "4444444444",
+                    name: '评测名称4444',
+                    class: '课程444',
+                    tag: {
+                        owner: "个人",
+                        source: "线上评测",
+                        type: "模拟考",
+                        class: '课程444',
+                        list: '名单4444',
+                    },
+                    creator: '罗老师',
+                    list: '名单4444',
+                    score: [61],
+                    time: '2022-01-14',
+                },
+                {
+                    id: "555555555555",
+                    name: '评测名称55',
+                    class: '课程5555555555555555555',
+                    tag: {
+                        owner: "个人",
+                        source: "线上评测",
+                        type: "模拟考",
+                        class: '课程5555555555555555555',
+                        list: '名单5555555',
+                    },
+                    creator: '罗老师',
+                    list: '名单5555555',
+                    score: [27],
+                    time: '2022-01-14',
+                },
+            ],
+            nowRow: undefined,
+            ownerType: "all",
+            sourceType: -1,
+            examType: "all",
+            ownerTypeList: [
+                {
+                    type: "all",
+                    name: this.$t('studentWeb.type.all')
+                },
+                {
+                    type: "private",
+                    name: this.$t('studentWeb.public.private')
+                },
+                {
+                    type: "school",
+                    name: this.$t('studentWeb.public.school')
+                },
+            ],
+            sourceTypeList: [
+                {
+                    type: -1,
+                    name: this.$t('studentWeb.type.all')
+                },
+                {
+                    type: 0,
+                    name: this.$t("studentWeb.exam.source.evMode1")
+                },
+                {
+                    type: 1,
+                    name: this.$t("studentWeb.exam.source.evMode2")
+                },
+                {
+                    type: 2,
+                    name: this.$t("studentWeb.exam.source.evMode3")
+                },
+            ],
+            examTypeList: [
+                {
+                    type: "all",
+                    name: this.$t('studentWeb.type.all')
+                },
+                {
+                    type: "normal",
+                    name: this.$t('totalAnalysis.ti_text8')
+                },
+                {
+                    type: "simulation",
+                    name: this.$t('totalAnalysis.ti_text7')
+                },
+                {
+                    type: "regular",
+                    name: this.$t('totalAnalysis.ti_text6')
+                },
+            ],
+            showSchoolRep: [],
+        }
+    },
+    mounted () {
+        this.showSchoolRep = this.schoolRep
+    },
+    methods: {
+        handleSpan ({ row, column, rowIndex, columnIndex }) {
+            console.log(this.schoolRep[rowIndex + 1]);
+            if(this.schoolRep[rowIndex + 1]) {
+                if(row.id === this.schoolRep[rowIndex + 1].id) {
+                    // if (columnIndex === 0) {
+                        return [row + 1, 1];
+                    // }
+                    // return [2, 3]
+                }
+            }
+            // console.log(row, column, rowIndex, columnIndex);
+            /* if (rowIndex === 0 && columnIndex === 0) {
+                return [2, 3]; //2行3列
+            } else if (rowIndex === 0 && columnIndex === 1) {
+                return  [0, 0];
+            } */
+            /* if (rowIndex === 1 && columnIndex === 0) {
+                return {
+                    rowspan: 3, //向下合并3格
+                    colspan: 4, //向右合并4格
+                };
+            } else if (rowIndex === 3 && columnIndex === 0) {
+                return {
+                    rowspan: 0,
+                    colspan: 0
+                };
+            } */
+        }
+    },
+    watch: {
+        ownerType: {
+            handler(n, o) {
+                if(n === "private") {
+                    this.showSchoolRep = this.schoolRep.filter(item => {
+                        return item.tag.owner === "个人"
+                    })
+                } else if(n === "school") {
+                    this.showSchoolRep = this.schoolRep.filter(item => {
+                        return item.tag.owner === "校级"
+                    })
+                } else {
+                    this.showSchoolRep = this.schoolRep
+                }
+            }
+        },
+        sourceType: {
+            handler(n, o) {
+                if(n === 0) {
+                    this.showSchoolRep = this.schoolRep.filter(item => {
+                        return item.tag.owner === "线上评测"
+                    })
+                } else if(n === 1) {
+                    this.showSchoolRep = this.schoolRep.filter(item => {
+                        return item.tag.owner === "课中评测"
+                    })
+                } else if(n === 2) {
+                    this.showSchoolRep = this.schoolRep.filter(item => {
+                        return item.tag.owner === "阅卷评测"
+                    })
+                } else {
+                    this.showSchoolRep = this.schoolRep
+                }
+            }
+        }
+    }
+}
+</script>
+
+<style lang="less" scoped>
+@import "./SchoolReport.less";
+</style>
+
+<style lang="less">
+@import "../../WrongQusetion/iViewStyle.less";
+</style>

+ 1 - 1
TEAMModelOS/ClientApp/src/components/student-web/WrongQusetion/WrongQues.vue

@@ -1,5 +1,5 @@
 <template>
 <template>
-    <div class="wrong-ques">
+    <div class="wrong-ques student-check">
         <!-- 筛选 -->
         <!-- 筛选 -->
         <div class="filter-type">
         <div class="filter-type">
             <div>
             <div>

+ 2 - 2
TEAMModelOS/ClientApp/src/components/student-web/WrongQusetion/iViewStyle.less

@@ -1,6 +1,6 @@
 @import '~@/assets/student-web/component_styles/color.less';
 @import '~@/assets/student-web/component_styles/color.less';
 
 
-.wrong-ques {
+.student-check {
     .ivu-radio-wrapper {
     .ivu-radio-wrapper {
         margin-right: 10px;
         margin-right: 10px;
         // border-radius: 5px;
         // border-radius: 5px;
@@ -29,7 +29,7 @@
         &,
         &,
         &:hover {
         &:hover {
             border-color: @primary;
             border-color: @primary;
-            background-color: @primary;
+            background-color: @primary !important;
             color: #fff;
             color: #fff;
         }
         }
     }
     }

+ 1 - 1
TEAMModelOS/ClientApp/src/css/common-style.less

@@ -107,7 +107,7 @@
 
 
 .tab-box {
 .tab-box {
     display: inline-block;
     display: inline-block;
-    width: 30%;
+    // width: 30%;
     min-width: 303px;
     min-width: 303px;
     .pane{
     .pane{
         margin-right: 50px;
         margin-right: 50px;

+ 21 - 21
TEAMModelOS/ClientApp/src/locale/lang/en-US/answerSheet.js

@@ -1,26 +1,26 @@
 export default {
 export default {
 	dp:{
 	dp:{
-		secret:'Secret',
-		editTip:'edit content',
-		edit:'edit content',
-		download:'Download',
-		settings:'Settings',
-		setting1:'left sealing line',
-		setting2:'Test Information',
-		setting3:' Custom content',
-		setting4:'Seal label',
-		setting5:'Answer and Analysis',
-		totalScore:'Total score',
-		score:'score',
-		tip1:'Tips',
-		tip2:'Fill in your name, class level, test number and other information before answering the question.',
-		tip3:'Fill in the answer correctly on the answer card.',
-		loading:'Volume generation in progress',
-		school:'School',
-		className:'Class',
-		name:'Name',
-		id:'ID',
-		lineTip:'Do not answer in the dashed line area.'
+		secret: 'Confidential',
+		editTip: 'Click to edit content',
+		edit: 'Edit Content',
+		download: 'Download',
+		settings: 'Settings',
+		setting1: 'Dashed Line',
+		setting2: 'Test Information',
+		setting3: 'Custom Content',
+		setting4: 'Seal label',
+		setting5: 'Answer and Explanation',
+		totalScore: 'Total score',
+		score: 'points',
+		tip1: 'Tips',
+		tip2: 'Fill in your name, class, and other information before answering the questions.',
+		tip3: 'Fill in the answer on the answer card.',
+		loading: 'Exam file generation in progress',
+		school: 'School',
+		className: 'Class',
+		name: 'Name',
+		id: 'ID',
+		lineTip: 'Do not write on the area below the dashed line'
 	},
 	},
 	sheetTip1:'Note',
 	sheetTip1:'Note',
 	sheetTip2:'1. The height of subjective question answer area can be quickly adjusted by clicking and dragging on the lower border.',
 	sheetTip2:'1. The height of subjective question answer area can be quickly adjusted by clicking and dragging on the lower border.',

+ 9 - 9
TEAMModelOS/ClientApp/src/locale/lang/en-US/cusMgt.js

@@ -149,15 +149,15 @@ export default {
     listSchoolTips3: 'Other',
     listSchoolTips3: 'Other',
     qrcodeErr: 'Failed to generate QR code',
     qrcodeErr: 'Failed to generate QR code',
     edRdName: 'Change class record name',
     edRdName: 'Change class record name',
-    delAcTitle: '刪除活動記錄',
-    delAcContent: '活動記錄數據刪除後將無法找回,確認刪除當前活動記錄嗎?',
-    fvt: '收藏',
-    unfvt: '取消收藏',
-    fvtOk: '已添加到我的收藏',
-    fvtErr: '收藏失敗',
-    unfvtOk: '已取消收藏',
-    unfvtErr: '取消失敗',
-    recordTips:'溫馨提示:個人課程課堂記錄只保留最近30條記錄,超過30條會自動刪除最早的記錄。',
+    delAcTitle: 'Delete Activity Record',
+    delAcContent: 'The activity record data cannot be recovered after deletion, are you sure to delete this activity record?',
+    fvt: 'Collect',
+    unfvt: 'Cancel Collecting',
+    fvtOk: 'Added to my collection',
+    fvtErr: 'Failed to collect',
+    unfvtOk: 'Removed from collection',
+    unfvtErr: 'Failed to remove',
+    recordTips: '溫馨提示:個人課程課堂記錄只保留最近30條記錄,超過30條會自動刪除最早的記錄。',
 
 
     //ManageClass.vue
     //ManageClass.vue
     stuMgt: 'Student Management',
     stuMgt: 'Student Management',

+ 6 - 6
TEAMModelOS/ClientApp/src/locale/lang/en-US/homework.js

@@ -1,15 +1,15 @@
 export default {
 export default {
-	notPreview: '該文件暫不支持預覽,請保存活動後重試!',
-	chooseContent: '從站內資源挑選',
-	notFoundData: '未查詢到作答數據',
-	copyAc: '復製活動',
+	notPreview: 'The file is not available for preview, please save the activity and try again!',
+	chooseContent: "Select from the IES's resources",
+	notFoundData: 'No response data was found.',
+	copyAc: 'Copy Activity',
 	modifyAcName: 'Change Name',
 	modifyAcName: 'Change Name',
 	modifyAcTime: 'Modify Ending Time',
 	modifyAcTime: 'Modify Ending Time',
 	modifyAcNameTip: 'Please enter the name',
 	modifyAcNameTip: 'Please enter the name',
 	modifyAcTimeTip: 'Please select the ending time',
 	modifyAcTimeTip: 'Please select the ending time',
 	noEndTimeTip: 'Please select the ending time!',
 	noEndTimeTip: 'Please select the ending time!',
-	endTitle: '結束活動',
-	endTip: 'Do you want to end this activity now?',
+	endTitle: 'End Activity',
+	endTip: 'Do you want to end',
 	endSuc: 'The activity has ended',
 	endSuc: 'The activity has ended',
 	noAttachments:'No attachments uploaded',
 	noAttachments:'No attachments uploaded',
 	noSaveTip:'The current activity is not saved, leaving will automatically remove the activity, do you want to continue?',
 	noSaveTip:'The current activity is not saved, leaving will automatically remove the activity, do you want to continue?',

+ 8 - 5
TEAMModelOS/ClientApp/src/locale/lang/en-US/learnActivity.js

@@ -57,6 +57,7 @@ export default {
         edName: 'Edit Name',
         edName: 'Edit Name',
         edNameHolder: 'Please enter the assessment name',
         edNameHolder: 'Please enter the assessment name',
         scoreStatus: 'To be graded',
         scoreStatus: 'To be graded',
+        scoreStatus1: 'Graded',
         hasDel: 'This assessment has been deleted',
         hasDel: 'This assessment has been deleted',
         actionErr: 'Failure to operate',
         actionErr: 'Failure to operate',
         classInfoErr: 'Failed to search class information',
         classInfoErr: 'Failed to search class information',
@@ -76,7 +77,7 @@ export default {
         copy: 'Copy',
         copy: 'Copy',
         copyTitle: 'Copy Assessment',
         copyTitle: 'Copy Assessment',
         copyContent: 'Are you sure to copy the assessment?',
         copyContent: 'Are you sure to copy the assessment?',
-        copyContent1:'課中評測不能進行復製操作。'
+        copyContent1: 'Smarter Classroom Assessment cannot be copied.'
     },
     },
 
 
     //CreateEv
     //CreateEv
@@ -272,13 +273,15 @@ export default {
         exportTips: 'The assessment is in progress and some students have not yet answered. Are you sure you want to export the data?',
         exportTips: 'The assessment is in progress and some students have not yet answered. Are you sure you want to export the data?',
         noQuMark: 'All questions have been graded, no unmarked questions',
         noQuMark: 'All questions have been graded, no unmarked questions',
         noUpd: 'Score not modified yet',
         noUpd: 'Score not modified yet',
-        totalScore: 'Total Score'
+        totalScore: 'Total Score',
+        delMark: 'Delete Annotation',
+        delMarkContent: 'Are you sure to delete the annotation for this question?'
     },
     },
 
 
     //SimpleAnalysis.vue
     //SimpleAnalysis.vue
     simple: {
     simple: {
-        totalPeople: 'Total number of people',
-        missExam: 'Number of absentee',
+        totalPeople: 'Total No. of people',
+        missExam: 'No. of absentee',
         classLabel: 'Class',
         classLabel: 'Class',
         sjLabel: 'Subject',
         sjLabel: 'Subject',
         avgScore: 'Average Score',
         avgScore: 'Average Score',
@@ -292,7 +295,7 @@ export default {
         clickFresh: 'Click here to refresh',
         clickFresh: 'Click here to refresh',
         inCalc: 'The data is being processed, please check later',
         inCalc: 'The data is being processed, please check later',
         total: 'Total Score',
         total: 'Total Score',
-        avgScore1: 'Average Statistics',
+        avgScore1: 'Total Average Score',
         totalLabel: 'Total Quantity',
         totalLabel: 'Total Quantity',
         scoreMat: 'Score Segment',
         scoreMat: 'Score Segment',
         complyNum: 'Passer',
         complyNum: 'Passer',

+ 100 - 86
TEAMModelOS/ClientApp/src/locale/lang/en-US/lessonRecord.js

@@ -1,92 +1,106 @@
 export default {
 export default {
-	all:'不限',
-	cate:'憿𧼮ê̌',
-	range:'範圍',
-	rangeTip:'選擇起止時間',
-	more:'更多',
-	close:'收起',
-	edit:'編輯記錄',
-	editTitle:'編輯課例',
-	addTitle:'新增課例',
-	week:'本周',
-	month:'本月',
-	semester:'本學期',
-	custom:'自定義範圍',
-	lessonInfo:'課程信息',
+	all:'不限',
+	cate:'類別',
+	range:'範圍',
+	rangeTip:'選擇起止時間',
+	more:'更多',
+	close:'收起',
+	edit:'編輯記錄',
+	editTitle:'編輯課例',
+	addTitle:'新增課例',
+	week:'本周',
+	month:'本月',
+	semester:'本學期',
+	custom:'自定義範圍',
+	lessonInfo:'課程信息',
 	form:{
 	form:{
-		name:'課例名稱',
-		place1:'請輸入課例的名稱...',
-		teacher:'授課教師',
-		place2:'請輸入授課教師姓名...'
+		name:'課例名稱',
+		place1:'請輸入課例的名稱...',
+		teacher:'授課教師',
+		place2:'請輸入授課教師姓名...'
 	},
 	},
-	count1:'課堂記錄總數',
-	count2:'教師數',
-	count3:'累計任務數',
-	count4:'累計作品數',
-	count5:'累計測驗總題數',
-	count6:'累計互動總數',
-	count7:'本學期新增課堂記錄數',
-	export:'導出數據',
-	tagMg:'類別管理',
-	tchName:'教師',
-	lessonName:'課堂名稱',
-	lessonNamePlace:'請輸入課例名稱...',
-	grade:'年級',
-	subject:'蝘𤑳𤌍',
-	search:'查詢',
-	reset:'重置',
-	resultTip1:'共查詢到',
-	resultTip2:'條課堂記錄',
-	action1:'下載總表',
-	action2:'預覽筆記',
-	action3:'刪除課例',
-	tagTitle:'課例類別管理',
-	addNewTag:'添加新類別',
-	cancel:'取消',
-	save:'保存變更',
-	className:'班級',
-	date:'日期',
-	attendCount:'出席率',
-	groupCount:'小組數',
-	totalPoint:'總計分',
-	collateTaskCount:'任務總數',
-	collateCount:'作品總數',
-	pushCount:'推送總數',
-	score:'總互動分',
-	interactionCount:'互動題數',
-	clientInteractionCount:'互動總數',
-	examQuizCount:'測驗總題數',
-	examPointRate:'測驗得分率',
-	action:'操作',
-	allTable:'課例數據匯總表',
-	delTip:'確定刪除課堂記錄',
-	delSuc:'刪除成功!',
-	tagTip1:'請將類別填寫完整',
-	tagTip2:'已存在相同類別',
-	tagTip3:'不能存在空類別',
-	saveSuc:'保存成功',
+	count1: 'Total Lesson',
+	count2: 'Teacher No.',
+	count3: 'Accumulated Task',
+	count4: 'Accumulated Work',
+	count5: 'Accumulated Test Question',
+	count6: 'Accumulated Interaction',
+	count7: 'New lesson records this semester',
+	export: 'Export Data',
+	tagMg: 'Category',
+	tchName: 'Teacher',
+	lessonName: 'Lesson Name',
+	lessonNamePlace: 'Please enter lesson name...',
+	grade: 'Grade',
+	subject: 'Subject',
+	search: 'Search',
+	reset: 'Reset',
+	resultTip1: 'Total of',
+	resultTip2: 'lesson records were found',
+	action1: 'Download summary report',
+	action2: 'View',
+	action3: 'Delete',
+	tagTitle: 'Lesson Category Management',
+	addNewTag: 'Add',
+	cancel: 'Cancel',
+	save: 'Save Changes',
+	className: 'Class',
+	date: 'Date',
+	attendCount: 'Attendance',
+	groupCount: 'Group No.',
+	totalPoint: 'Total Points',
+	collateTaskCount: 'Task No.',
+	collateCount: 'Work No.',
+	pushCount: 'Push No.',
+	score: 'Interactive Score',
+	interactionCount: 'Interactive Qs',
+	clientInteractionCount: 'Response',
+	examQuizCount: 'Test Qs',
+	examPointRate: 'Test Scoring Rate',
+	action: 'Operation',
+	allTable: 'Summary Table of Lesson Records Data',
+	delTip: 'Are you sure to delete lesson record',
+	delSuc: 'Deleted successfully!',
+	tagTip1: 'Please fill in the category completely',
+	tagTip2: 'The same category already exists',
+	tagTip3: 'There can be no empty categories',
+	saveSuc: 'Save successfully',
 	echarts:{
 	echarts:{
-		count1:'課例總數',
-		count2:'今日課例',
-		count3:'本周課例',
-		count4:'本月課例',
-		count5:'本學期課例',
-		count6:'教師數',
-		count7:'累計任務數',
-		count8:'累計作品數',
-		count9:'累計測驗題數',
-		count10:'累計互動總數',
-		title1:'智慧課堂統計',
-		pie1:'教研組',
-		pie2:'課例類別',
-		pie3:'年級',
-		pie4:'蝘𤑳𤌍',
-		title2:'課例趨勢圖',
-		title3:'活動類型分析',
-		title4:'常用科技手段統計',
-		noData:'暫無數據',
-		weekUtil:'第',
-		week:'周',
-		count:'課例數量'
+		count1:'課例總數',
+		count2:'今日課例',
+		count3:'本周課例',
+		count4:'本月課例',
+		count5:'本學期課例',
+		count6:'教師數',
+		count7:'累計任務數',
+		count8:'累計作品數',
+		count9:'累計測驗題數',
+		count10:'累計互動總數',
+		title1:'智慧課堂統計',
+		pie1:'教研組',
+		pie2:'課例類別',
+		pie3:'年級',
+		pie4:'科目',
+		title2:'課例趨勢圖',
+		title3:'活動類型分析',
+		title4:'常用科技手段統計',
+		noData:'暫無數據',
+		weekUtil:'第',
+		week:'周',
+		count:'課例數量',
+		ac1:'線上評測(校)',
+		ac2:'課中評測(校)',
+		ac3:'閱卷評測(校)',
+		ac4:'線上評測(個)',
+		ac5:'課中評測(個)',
+		ac6:'閱卷評測(個)',
+		ac7:'作業活動',
+		ac8:'自主學習',
+		online:'線上',
+		offline:'線下',
+		mid:'課中',
+		noGroup:'未分組',
+		noType:'未分類',
+		unit:'單位:堂'
 	}
 	}
 }
 }

+ 25 - 25
TEAMModelOS/ClientApp/src/locale/lang/en-US/notice.js

@@ -1,27 +1,27 @@
 export default {
 export default {
-    noData:'No notification',
-	type1:'Application Notification',
-	type2:'Invitation Notification',
-	type3:'Removal Notification',
-	type4:'Syllabus Notification',
-	type5:'Administrator Transfer Notification',
-	type6:'Marking Test Assignment Notification',
-	type7:'Scan Code Join Notification',
-	type8:'作業提交通知',
-	tip1:'applies to join',
-	tip2:'has invited you to join',
-	tip3:'has granted your request to join',
-	tip4:'has accepted the invitation to join',
-	tip5:"",
-	tip6:'has removed you',
-	tip7:'You are invited to co-edit the school syllabus',
-	tip8:'shared a syllabus with you',
-	tip9:'transfers the administrator status to you',
-	tip10:'has assigned you a marking task',
-	tip11:'has assigned you an abnormal marking task',
-	tip12:'has assigned you an arbitration marking task',
-	tip13:'scanned the code to join',
-	tip14:'scanned the code to join the list',
-	tip15:'在活動',
-	tip16:'中完成了作業提交'
+	noData: 'No notification',
+	type1: 'Application Notification',
+	type2: 'Invitation Notification',
+	type3: 'Removal Notification',
+	type4: 'Syllabus Notification',
+	type5: 'Administrator Transfer Notification',
+	type6: 'Marking Test Assignment Notification',
+	type7: 'Scan Code Join Notification',
+	type8: 'Homework Submission Notification',
+	tip1: 'applies to join',
+	tip2: 'has invited you to join',
+	tip3: 'has granted your request to join',
+	tip4: 'has accepted the invitation to join',
+	tip5: "",
+	tip6: 'has removed you',
+	tip7: 'You are invited to co-edit the school syllabus',
+	tip8: 'shared a syllabus with you',
+	tip9: 'transfers the administrator status to you',
+	tip10: 'has assigned you a marking task',
+	tip11: 'has assigned you an abnormal marking task',
+	tip12: 'has assigned you an arbitration marking task',
+	tip13: 'scanned the code to join',
+	tip14: 'scanned the code to join the list',
+	tip15: 'completed the homework submission of',
+	tip16: ''
 }
 }

+ 2 - 1
TEAMModelOS/ClientApp/src/locale/lang/en-US/schoolBaseInfo.js

@@ -24,7 +24,8 @@ export default {
   periodSettingLabel: 'School System',
   periodSettingLabel: 'School System',
   order: 'Sort by creation time',
   order: 'Sort by creation time',
   semesterSetting: 'Semester (Quarter) Setting',
   semesterSetting: 'Semester (Quarter) Setting',
-  gradeSetting: 'Grade Level Settings',
+  gradeSetting: '年級名稱順序設置',
+  gradeTips: '年級順序設置,例如:\n一年級\n二年級\n三年級',
   subjectSetting: 'Subject Settings',
   subjectSetting: 'Subject Settings',
   semesterNum: 'Semester Number:',
   semesterNum: 'Semester Number:',
   gradeNum: 'Grade Number:',
   gradeNum: 'Grade Number:',

+ 2 - 2
TEAMModelOS/ClientApp/src/locale/lang/en-US/settings.js

@@ -38,9 +38,9 @@ export default {
 	modalTip8:'as your default school?',
 	modalTip8:'as your default school?',
 	modalTip9:'Are you sure you want to switch school?',
 	modalTip9:'Are you sure you want to switch school?',
 	columnName: 'School Name',
 	columnName: 'School Name',
-	columnArea: 'Areal',
+	columnArea: 'Area',
 	columnId: 'School Short Code',
 	columnId: 'School Short Code',
-	columnTool: 'Operations',
+	columnTool: 'Operation',
 	modalTip4: 'Friendly Reminder',
 	modalTip4: 'Friendly Reminder',
 	modalTip5: 'Confirm joining ',
 	modalTip5: 'Confirm joining ',
 	modalTip6: 'Confirm cancellation of joining ',
 	modalTip6: 'Confirm cancellation of joining ',

+ 26 - 22
TEAMModelOS/ClientApp/src/locale/lang/en-US/studentWeb.js

@@ -31,7 +31,7 @@ export default {
         day: "D",
         day: "D",
         hour: "H",
         hour: "H",
         minute: "M",
         minute: "M",
-        mustFile: "必須上傳作業",
+        mustFile: "Must Upload",
     },
     },
     type: {
     type: {
         home: "Home",
         home: "Home",
@@ -46,7 +46,7 @@ export default {
         vote: "Poll",
         vote: "Poll",
         survey: "Survey",
         survey: "Survey",
         wrongTopic: "Incorrectly Answered Question Book",
         wrongTopic: "Incorrectly Answered Question Book",
-        classInteraction: "課堂互動",
+        classInteraction: "Web IRS",
     },
     },
     testType: [
     testType: [
         {
         {
@@ -305,7 +305,9 @@ export default {
         Fineshed: 'Completed',
         Fineshed: 'Completed',
         Closed: 'Ended',
         Closed: 'Ended',
         duration: "Duration",
         duration: "Duration",
-        subjectName: "課程名稱:"
+        subjectName: "Course Name:",
+        examMode: "Mode",
+        examStatus: "Status",
     },
     },
     billboard: {
     billboard: {
         description: 'Description',
         description: 'Description',
@@ -399,12 +401,12 @@ export default {
         message2: "Please rate and write comments first",
         message2: "Please rate and write comments first",
         message3: "There are no other students in this class at this time",
         message3: "There are no other students in this class at this time",
         message4: "No other students have submitted yet",
         message4: "No other students have submitted yet",
-        message5: "必須上傳文件,您還未選擇檔案!",
+        message5: "You must upload a file, you haven't selected one yet!",
         uploadTime: "Submit Time",
         uploadTime: "Submit Time",
         upload: "Download",
         upload: "Download",
         fileSize: "File Size",
         fileSize: "File Size",
         maxSize: "Less than 50MB",
         maxSize: "Less than 50MB",
-        mustFile: "必須上傳文件",
+        mustFile: "Must upload a homework",
         fileType: "Format Restriction",
         fileType: "Format Restriction",
         placeholder1: "Homework answers...",
         placeholder1: "Homework answers...",
         scoreNum: 'Point',
         scoreNum: 'Point',
@@ -673,29 +675,29 @@ export default {
         material: 'Lesson Content',
         material: 'Lesson Content',
         classInteractionRecord: 'Class Interaction Record',
         classInteractionRecord: 'Class Interaction Record',
         qA: 'Pop Quiz',
         qA: 'Pop Quiz',
-        qaAgain: "二次作答",
+        qaAgain: "Retake IRS",
         qAMulti: 'Pop Quiz (multiple answers)',
         qAMulti: 'Pop Quiz (multiple answers)',
         reference: 'Reference Answer',
         reference: 'Reference Answer',
         correct: 'The answer is correct',
         correct: 'The answer is correct',
         groupQAMulti: 'Group Pop Quiz (multiple answers)',
         groupQAMulti: 'Group Pop Quiz (multiple answers)',
         poImg: 'The teacher send a picture from HiTeach:',
         poImg: 'The teacher send a picture from HiTeach:',
         link: 'Share Link',
         link: 'Share Link',
-        noContent: "沒有互動記錄",
-        yourFile: "您上傳的作品:",
-        noFile: "未上傳作品",
-        noanswer: "未作答",
+        noContent: "No interaction record",
+        yourFile: "Work you uploaded:",
+        noFile: "Not uploaded works",
+        noanswer: "Not answered",
         dataCount: {
         dataCount: {
-            attendTrue: "已出席",
-            attendFalse: "未出席",
-            attendType: "出席狀態",
-            getCount: "計分",
-            intCount: "互動分",
-            taskNum: "任務數",
-            colctNum: "作品數",
-            pushNum: "推送數",
-            examNum: "測驗題數",
-            intExamNum: "互動題數",
-            examCount: "測驗得分",
+            attendTrue: "Present",
+            attendFalse: "Absent",
+            attendType: "Attendance Status",
+            getCount: "Point",
+            intCount: "Interactive Score",
+            taskNum: "Task No.",
+            colctNum: "Work No.",
+            pushNum: "Push No.",
+            examNum: "Test Qs",
+            intExamNum: "Interactive Qs",
+            examCount: "SelfPace Test Score",
         },
         },
     },
     },
     'courseList-title': 'My Course List',
     'courseList-title': 'My Course List',
@@ -707,13 +709,15 @@ export default {
         description: 'Course Overview',
         description: 'Course Overview',
         tableMode: "課表模式",
         tableMode: "課表模式",
         nameList: "Classmates Name List",
         nameList: "Classmates Name List",
+        scoreList: "成績清單",
         classmates: 'Classmates list',
         classmates: 'Classmates list',
         classmates1: 'TEAM Model List',
         classmates1: 'TEAM Model List',
         classRecord: "Lesson Records",
         classRecord: "Lesson Records",
-        examRecord: "Assesment List",
+        examRecord: "Assessment List",
         hwRecord: "Homework List",
         hwRecord: "Homework List",
         voteRecord: "Poll Activity",
         voteRecord: "Poll Activity",
         surRecord: "Survey Activity",
         surRecord: "Survey Activity",
+        activityList: "活動清單",
         classID: 'Course Code',
         classID: 'Course Code',
         classTime: 'Class Time',
         classTime: 'Class Time',
         classroom: 'Classroom',
         classroom: 'Classroom',

+ 4 - 4
TEAMModelOS/ClientApp/src/locale/lang/en-US/syllabus.js

@@ -1,8 +1,8 @@
 export default {
 export default {
-	shareContentText1: '課綱分享',
-	shareContentText2: '分享者',
-	shareContentText3: '課綱名稱',
-	shareContentText4: '快速登入醍摩豆雲平臺IES接收分享',
+	shareContentText1: 'Syllabus Sharing',
+	shareContentText2: 'Sharer',
+	shareContentText3: 'Syllabus Name',
+	shareContentText4: 'Quick login to receive sharing on the IES:',
 	receivedSuc1: 'Received successfully, you can go to ',
 	receivedSuc1: 'Received successfully, you can go to ',
 	receivedSuc2: ' IES 5 - Personal Syllabus ',
 	receivedSuc2: ' IES 5 - Personal Syllabus ',
 	receivedSuc3: ' to view',
 	receivedSuc3: ' to view',

+ 5 - 5
TEAMModelOS/ClientApp/src/locale/lang/en-US/system.js

@@ -36,7 +36,7 @@ export default {
         evAna:'Learning Analysis',
         evAna:'Learning Analysis',
         scAna:'Statistical Data',
         scAna:'Statistical Data',
         scAc:'Activity',
         scAc:'Activity',
-        scEv:'Assesment',
+        scEv:'Assessment',
         scVote:'Poll',
         scVote:'Poll',
         scQu:'Survey',
         scQu:'Survey',
         classCus:'Class Course',
         classCus:'Class Course',
@@ -67,7 +67,7 @@ export default {
         appAssassment:'Application Appraisal',
         appAssassment:'Application Appraisal',
         discuss:'Discussion Center',
         discuss:'Discussion Center',
         policy:'Policy Document',
         policy:'Policy Document',
-        research:'AI Lecture Observation Lounge',
+        research:'Lesson',
         researchBoard:'Data Board',
         researchBoard:'Data Board',
         cusVideos:'Lesson Data',
         cusVideos:'Lesson Data',
         cusVideoMgt:'Lesson Management',
         cusVideoMgt:'Lesson Management',
@@ -94,7 +94,7 @@ export default {
     basic: 'Basic Version',
     basic: 'Basic Version',
     advanced: 'Standard Version',
     advanced: 'Standard Version',
     flagship: 'Advanced Version',
     flagship: 'Advanced Version',
-    add: '新增功能',
-    opt: '優化功能',
-    bug: '修復已知Bug'
+    add: 'Add Function',
+    opt: 'Optimize Function',
+    bug: 'Fixing known bug'
 }
 }

+ 1 - 1
TEAMModelOS/ClientApp/src/locale/lang/en-US/teachContent.js

@@ -9,7 +9,7 @@ export default {
   filterOther: 'Others',
   filterOther: 'Others',
   space: 'Storage:',
   space: 'Storage:',
   tableC1: 'File Name',
   tableC1: 'File Name',
-  tableC2: 'Operations',
+  tableC2: 'Operation',
   tableC3: 'Key Concept',
   tableC3: 'Key Concept',
   tableC4: 'File Size',
   tableC4: 'File Size',
   tableC5: 'Number of associations',
   tableC5: 'Number of associations',

+ 15 - 1
TEAMModelOS/ClientApp/src/locale/lang/zh-CN/lessonRecord.js

@@ -87,6 +87,20 @@ export default {
 		noData:'暂无数据',
 		noData:'暂无数据',
 		weekUtil:'第',
 		weekUtil:'第',
 		week:'周',
 		week:'周',
-		count:'课例数量'
+		count:'课例数量',
+		ac1:'线上评测(校)',
+		ac2:'课中评测(校)',
+		ac3:'阅卷评测(校)',
+		ac4:'线上评测(个)',
+		ac5:'课中评测(个)',
+		ac6:'阅卷评测(个)',
+		ac7:'作业活动',
+		ac8:'自主学习',
+		online:'线上',
+		offline:'线下',
+		mid:'课中',
+		noGroup:'未分組',
+		noType:'未分类',
+		unit:'单位:堂'
 	}
 	}
 }
 }

+ 2 - 1
TEAMModelOS/ClientApp/src/locale/lang/zh-CN/schoolBaseInfo.js

@@ -24,7 +24,8 @@ export default {
   periodSettingLabel: '学段',
   periodSettingLabel: '学段',
   order: '依建立时间排序',
   order: '依建立时间排序',
   semesterSetting: '学期(季)设置',
   semesterSetting: '学期(季)设置',
-  gradeSetting: '年级设置',
+  gradeSetting: '年级名称顺序设置',
+  gradeTips: '年级顺序设置,例如:\n一年级\n二年级\n三年级',
   subjectSetting: '学科设置',
   subjectSetting: '学科设置',
   semesterNum: '学期数:',
   semesterNum: '学期数:',
   gradeNum: '年级数:',
   gradeNum: '年级数:',

+ 5 - 1
TEAMModelOS/ClientApp/src/locale/lang/zh-CN/studentWeb.js

@@ -305,7 +305,9 @@ export default {
         Fineshed: '已完成',
         Fineshed: '已完成',
         Closed: '已结束',
         Closed: '已结束',
         duration: "时长",
         duration: "时长",
-        subjectName: "课程名称:"
+        subjectName: "课程名称:",
+        examMode: "模式",
+        examStatus: "状态",
     },
     },
     billboard: {
     billboard: {
         description: '描述',
         description: '描述',
@@ -707,6 +709,7 @@ export default {
         description: '课程概述',
         description: '课程概述',
         tableMode: "课表模式",
         tableMode: "课表模式",
         nameList: "班级名单",
         nameList: "班级名单",
+        scoreList: "成绩清单",
         classmates: '同学名单',
         classmates: '同学名单',
         classmates1: '醍摩豆名单',
         classmates1: '醍摩豆名单',
         classRecord: "课堂记录",
         classRecord: "课堂记录",
@@ -714,6 +717,7 @@ export default {
         hwRecord: "作业列表",
         hwRecord: "作业列表",
         voteRecord: "投票活动",
         voteRecord: "投票活动",
         surRecord: "问卷活动",
         surRecord: "问卷活动",
+        activityList: "活动列表",
         classID: '课程代码',
         classID: '课程代码',
         classTime: '上课时间',
         classTime: '上课时间',
         classroom: '上课教室',
         classroom: '上课教室',

+ 3 - 3
TEAMModelOS/ClientApp/src/locale/lang/zh-TW/answerSheet.js

@@ -6,14 +6,14 @@ export default {
 		download:'列印試卷',
 		download:'列印試卷',
 		settings:'試卷設置',
 		settings:'試卷設置',
 		setting1:'左側密封線',
 		setting1:'左側密封線',
-		setting2:'考試信息欄',
+		setting2:'考試資訊欄',
 		setting3:'自定義內容',
 		setting3:'自定義內容',
 		setting4:'密封標識',
 		setting4:'密封標識',
 		setting5:'答案與解析',
 		setting5:'答案與解析',
 		totalScore:'考試總分',
 		totalScore:'考試總分',
 		score:'分',
 		score:'分',
-		tip1:'意事項',
-		tip2:'答題前填寫好自己的姓名、班級、考號等信息',
+		tip1:'意事項',
+		tip2:'答題前填寫好自己的姓名、班級、考號等資訊',
 		tip3:'請將答案正確填寫在答題卡上',
 		tip3:'請將答案正確填寫在答題卡上',
 		loading:'試卷生成中',
 		loading:'試卷生成中',
 		school:'學校',
 		school:'學校',

+ 1 - 1
TEAMModelOS/ClientApp/src/locale/lang/zh-TW/cusMgt.js

@@ -153,7 +153,7 @@ export default {
     delAcContent:'活動記錄數據刪除後將無法找回,確認刪除當前活動記錄嗎?',
     delAcContent:'活動記錄數據刪除後將無法找回,確認刪除當前活動記錄嗎?',
     fvt:'收藏',
     fvt:'收藏',
     unfvt:'取消收藏',
     unfvt:'取消收藏',
-    fvtOk:'已加到我的收藏',
+    fvtOk:'已加到我的收藏',
     fvtErr:'收藏失敗',
     fvtErr:'收藏失敗',
     unfvtOk:'已取消收藏',
     unfvtOk:'已取消收藏',
     unfvtErr:'取消失敗',
     unfvtErr:'取消失敗',

+ 1 - 1
TEAMModelOS/ClientApp/src/locale/lang/zh-TW/homework.js

@@ -2,7 +2,7 @@ export default {
 	notPreview:'該文件暫不支持預覽,請保存活動後重試!',
 	notPreview:'該文件暫不支持預覽,請保存活動後重試!',
 	chooseContent:'從站內資源挑選',
 	chooseContent:'從站內資源挑選',
 	notFoundData:'未查詢到作答數據',
 	notFoundData:'未查詢到作答數據',
-	copyAc:'製活動',
+	copyAc:'製活動',
 	modifyAcName:'修改活動名稱',
 	modifyAcName:'修改活動名稱',
 	modifyAcTime:'修改活動結束時間',
 	modifyAcTime:'修改活動結束時間',
 	modifyAcNameTip:'請輸入活動名稱',
 	modifyAcNameTip:'請輸入活動名稱',

+ 1 - 1
TEAMModelOS/ClientApp/src/locale/lang/zh-TW/learnActivity.js

@@ -77,7 +77,7 @@ export default {
         copy:'複製',
         copy:'複製',
         copyTitle: '複製評量',
         copyTitle: '複製評量',
         copyContent: '確認複製當前評量嗎?',
         copyContent: '確認複製當前評量嗎?',
-        copyContent1: '課中評量不能進行製操作。'
+        copyContent1: '課中評量不能進行製操作。'
     },
     },
 
 
     //建立評量學校/個人
     //建立評量學校/個人

+ 17 - 3
TEAMModelOS/ClientApp/src/locale/lang/zh-TW/lessonRecord.js

@@ -41,7 +41,7 @@ export default {
 	action2:'預覽筆記',
 	action2:'預覽筆記',
 	action3:'刪除課例',
 	action3:'刪除課例',
 	tagTitle:'課例類別管理',
 	tagTitle:'課例類別管理',
-	addNewTag:'加新類別',
+	addNewTag:'加新類別',
 	cancel:'取消',
 	cancel:'取消',
 	save:'保存變更',
 	save:'保存變更',
 	className:'班級',
 	className:'班級',
@@ -86,7 +86,21 @@ export default {
 		title4:'常用科技手段統計',
 		title4:'常用科技手段統計',
 		noData:'暫無數據',
 		noData:'暫無數據',
 		weekUtil:'第',
 		weekUtil:'第',
-		week:'周',
-		count:'課例數量'
+		week:'週',
+		count:'課例數量',
+		ac1:'線上評測(校)',
+		ac2:'課中評測(校)',
+		ac3:'閱卷評測(校)',
+		ac4:'線上評測(個)',
+		ac5:'課中評測(個)',
+		ac6:'閱卷評測(個)',
+		ac7:'作業活動',
+		ac8:'自主學習',
+		online:'線上',
+		offline:'線下',
+		mid:'課中',
+		noGroup:'未分組',
+		noType:'未分類',
+		unit:'單位:堂'
 	}
 	}
 }
 }

+ 2 - 2
TEAMModelOS/ClientApp/src/locale/lang/zh-TW/researchCenter.js

@@ -1,7 +1,7 @@
 export default {
 export default {
 	dashboard: {
 	dashboard: {
-		title: '智慧校園大數據駕駛艙',
-		block1: '教學教研',
+		title: '智慧校園大數據',
+		block1: '教學數據',
 		block2: '教室物聯',
 		block2: '教室物聯',
 		block3: '德育評價',
 		block3: '德育評價',
 		block4: '學情分析',
 		block4: '學情分析',

+ 2 - 1
TEAMModelOS/ClientApp/src/locale/lang/zh-TW/schoolBaseInfo.js

@@ -24,7 +24,8 @@ export default {
   periodSettingLabel: '學制',
   periodSettingLabel: '學制',
   order: '依建立時間排序',
   order: '依建立時間排序',
   semesterSetting: '學期(季)設定',
   semesterSetting: '學期(季)設定',
-  gradeSetting: '年級設定',
+  gradeSetting: '年級名稱順序設置',
+  gradeTips: '年級順序設置,例如:\n一年級\n二年級\n三年級',
   subjectSetting: '學科設定',
   subjectSetting: '學科設定',
   semesterNum: '學期數:',
   semesterNum: '學期數:',
   gradeNum: '年級數:',
   gradeNum: '年級數:',

+ 5 - 1
TEAMModelOS/ClientApp/src/locale/lang/zh-TW/studentWeb.js

@@ -305,7 +305,9 @@ export default {
         Fineshed: '已完成',
         Fineshed: '已完成',
         Closed: '已結束',
         Closed: '已結束',
         duration: "時長",
         duration: "時長",
-        subjectName: "課程名稱:"
+        subjectName: "課程名稱:",
+        examMode: "模式",
+        examStatus: "狀態",
     },
     },
     billboard: {
     billboard: {
         description: '描述',
         description: '描述',
@@ -707,6 +709,7 @@ export default {
         description: '課程概述',
         description: '課程概述',
         tableMode: "課表模式",
         tableMode: "課表模式",
         nameList: "課程名單",
         nameList: "課程名單",
+        scoreList: "成績清單",
         classmates: '同學名單',
         classmates: '同學名單',
         classmates1: '醍摩豆名單',
         classmates1: '醍摩豆名單',
         classRecord: "課堂記錄",
         classRecord: "課堂記錄",
@@ -714,6 +717,7 @@ export default {
         hwRecord: "作業清單",
         hwRecord: "作業清單",
         voteRecord: "投票活動",
         voteRecord: "投票活動",
         surRecord: "問卷活動",
         surRecord: "問卷活動",
+        activityList: "活動清單",
         classID: '課程代號',
         classID: '課程代號',
         classTime: '上課時間',
         classTime: '上課時間',
         classroom: '上課教室',
         classroom: '上課教室',

+ 36 - 4
TEAMModelOS/ClientApp/src/view/Home.vue

@@ -7,10 +7,14 @@
 				<Icon style="display:block" custom="iconfont icon-home" :color="isHomeLight ? '#1CC0F3':'#d0d0d0'"
 				<Icon style="display:block" custom="iconfont icon-home" :color="isHomeLight ? '#1CC0F3':'#d0d0d0'"
 					@click="toHome" :title="$t('system.goHome')" />
 					@click="toHome" :title="$t('system.goHome')" />
 				<Icon type="md-open" @click="changePlatform" :title="$t('system.changePlat')" v-if="hasArea" />
 				<Icon type="md-open" @click="changePlatform" :title="$t('system.changePlat')" v-if="hasArea" />
-				<Icon type="md-help-circle" @click="goHelpDoc" :title="$t('system.help')" v-if="!inJinNiu"/>
+				<Icon type="md-help-circle" @click="goHelpDoc" :title="$t('system.help')" v-if="!inGlobalSite"/>
+				<!-- <Icon type="md-text" @click="isShowQrCode = !isShowQrCode" v-if="!inGlobalSite"/> -->
 				<BaseNotification :msgs="msgs"></BaseNotification>
 				<BaseNotification :msgs="msgs"></BaseNotification>
 				<span class="header-split"></span>
 				<span class="header-split"></span>
 				<BaseUserPoptip @logout="basicMenu('quit')"></BaseUserPoptip>
 				<BaseUserPoptip @logout="basicMenu('quit')"></BaseUserPoptip>
+				<div class="overlay-qrcode" v-show="isShowQrCode">
+					<img src="../assets/image/qrcode.png" width="150px">
+				</div>
 			</div>
 			</div>
 			<div id="content" slot="content">
 			<div id="content" slot="content">
 				<router-view v-if="!$route.meta.isKeep && isRouterAlive" :key="this.$route.name"></router-view>
 				<router-view v-if="!$route.meta.isKeep && isRouterAlive" :key="this.$route.name"></router-view>
@@ -70,6 +74,7 @@
 		},
 		},
 		data() {
 		data() {
 			return {
 			return {
+				isShowQrCode:false,
 				updStatus: false,
 				updStatus: false,
 				isRouterAlive: true,
 				isRouterAlive: true,
 				msgs: [],
 				msgs: [],
@@ -317,6 +322,9 @@
 			},
 			},
 			inJinNiu(){
 			inJinNiu(){
 				return window.location.host === 'jinniu.teammodel.cn'
 				return window.location.host === 'jinniu.teammodel.cn'
+			},
+			inGlobalSite(){
+				return localStorage.getItem('location') === 'Global'
 			}
 			}
 		},
 		},
 		watch: {
 		watch: {
@@ -391,25 +399,49 @@
 	}
 	}
 
 
 	.header-right-box {
 	.header-right-box {
+		position: relative;
 		margin: 12px 0;
 		margin: 12px 0;
 		line-height: 1.5;
 		line-height: 1.5;
 		float: right;
 		float: right;
 		height: 25px;
 		height: 25px;
 		padding-right: 20px;
 		padding-right: 20px;
 	}
 	}
+	
+	.header-right-box .overlay-qrcode{
+		position: absolute;
+		right: 115px;
+		bottom: -180px;
+		background-color: #e1e1e1;
+		padding: 10px;
+		border-radius: 8px;
+	}
+	
+	.header-right-box .overlay-qrcode::before{
+		width: 0;
+		height: 0;
+		border-style: solid;
+		border-width: 12px 12px 12px 0;
+		border-color: transparent #F7F7F7 transparent transparent;
+		content: '\A';
+		position: absolute;
+		left: 78px;
+		top: -18px;
+		border-right-color: #d0d0d0;
+		transform: rotate(90deg);
+	}
 
 
 	.header-right-box .ivu-icon {
 	.header-right-box .ivu-icon {
 		font-size: 20px;
 		font-size: 20px;
 		margin-right: 20px;
 		margin-right: 20px;
-		color: #d0d0d0;
+		color: #e7e7e7;
 		cursor: pointer;
 		cursor: pointer;
 	}
 	}
 
 
-	.header-right-box img {
+	/* .header-right-box img {
 		width: 40px;
 		width: 40px;
 		border-radius: 50%;
 		border-radius: 50%;
 		border: 2px solid #595959;
 		border: 2px solid #595959;
-	}
+	} */
 
 
 	.fl-around {
 	.fl-around {
 		display: flex;
 		display: flex;

+ 1 - 1
TEAMModelOS/ClientApp/src/view/newcourse/MyCourse.vue

@@ -68,7 +68,7 @@
                         </div>
                         </div>
                     </div>
                     </div>
                     <div class="course-classroom-info common-save-btn" id="table-height" slot="right">
                     <div class="course-classroom-info common-save-btn" id="table-height" slot="right">
-                        <div class="course-classroom-info-header tab-box" style="padding-right:30px;">
+                        <div class="course-classroom-info-header tab-box">
                             <span @click="selectTab('record')" :class="tabName == 'record' ? 'course-classroom-label pane active':'course-classroom-label pane'">{{$t('cusMgt.cusRecord')}}</span>
                             <span @click="selectTab('record')" :class="tabName == 'record' ? 'course-classroom-label pane active':'course-classroom-label pane'">{{$t('cusMgt.cusRecord')}}</span>
                             <span @click="selectTab('activity')" :class="tabName == 'activity' ? 'course-classroom-label pane active':'course-classroom-label pane'">{{$t('cusMgt.acRecord')}}</span>
                             <span @click="selectTab('activity')" :class="tabName == 'activity' ? 'course-classroom-label pane active':'course-classroom-label pane'">{{$t('cusMgt.acRecord')}}</span>
                             <span @click="selectTab('stus')" :class="tabName == 'stus' ? 'course-classroom-label pane active':'course-classroom-label pane'">{{$t('courseManage.classroom.studentList')}}</span>
                             <span @click="selectTab('stus')" :class="tabName == 'stus' ? 'course-classroom-label pane active':'course-classroom-label pane'">{{$t('courseManage.classroom.studentList')}}</span>

+ 10 - 2
TEAMModelOS/ClientApp/src/view/research-center/ResearchMgt.less

@@ -18,7 +18,9 @@
 		}
 		}
 		.filter-section{
 		.filter-section{
 			max-width: 90%;
 			max-width: 90%;
-			
+			display: flex;
+			justify-content: flex-start;
+			align-items: flex-start;
 			.search-count{
 			.search-count{
 				font-size: 18px;
 				font-size: 18px;
 				font-weight: bold;
 				font-weight: bold;
@@ -27,7 +29,8 @@
 		}
 		}
 		.filter-title{
 		.filter-title{
 			font-weight: bold;
 			font-weight: bold;
-			margin-right: 20px;
+			width: 60px;
+			padding: 10px 0px;
 			&::before{
 			&::before{
 				content: '';
 				content: '';
 				width: 3px;
 				width: 3px;
@@ -39,6 +42,11 @@
 			}
 			}
 		}
 		}
 		
 		
+		.filter-items{
+			display: inline-block;
+			width: calc(100% - 60px);
+		}
+		
 		.filter-item{
 		.filter-item{
 			display: inline-block;
 			display: inline-block;
 			margin: 8px 10px;
 			margin: 8px 10px;

+ 23 - 15
TEAMModelOS/ClientApp/src/view/research-center/ResearchMgt.vue

@@ -4,30 +4,38 @@
 		<div class="filter-box">
 		<div class="filter-box">
 			<div class="filter-section">
 			<div class="filter-section">
 				<span class="filter-title">{{ $t('lessonRecord.subject') }}</span>
 				<span class="filter-title">{{ $t('lessonRecord.subject') }}</span>
-				<span :class="['filter-item',!subjectIndexArr.length ? 'filter-item-active' : '']" @click="onFilterChange('subject',-1)">{{ $t('lessonRecord.all') }}</span>
-				<span :class="['filter-item',subjectIndexArr.includes(index) ? 'filter-item-active' : '']"
-					v-for="(item,index) in curPeriod.subjects" :key="index"
-					@click="onFilterChange('subject',index)">{{ item.name }}</span>
+				<div class="filter-items">
+					<span :class="['filter-item',!subjectIndexArr.length ? 'filter-item-active' : '']" @click="onFilterChange('subject',-1)">{{ $t('lessonRecord.all') }}</span>
+					<span :class="['filter-item',subjectIndexArr.includes(index) ? 'filter-item-active' : '']"
+						v-for="(item,index) in curPeriod.subjects" :key="index"
+						@click="onFilterChange('subject',index)">{{ item.name }}</span>
+				</div>
 			</div>
 			</div>
 			<div class="filter-section">
 			<div class="filter-section">
 				<span class="filter-title">{{ $t('lessonRecord.grade') }}</span>
 				<span class="filter-title">{{ $t('lessonRecord.grade') }}</span>
-				<span :class="['filter-item',!gradeIndexArr.length ? 'filter-item-active' : '']" @click="onFilterChange('grade',-1)">{{ $t('lessonRecord.all') }}</span>
-				<span :class="['filter-item',gradeIndexArr.includes(index) ? 'filter-item-active' : '']"
-					v-for="(item,index) in curPeriod.grades" :key="index"
-					@click="onFilterChange('grade',index)">{{ item }}</span>
+				<div class="filter-items">
+					<span :class="['filter-item',!gradeIndexArr.length ? 'filter-item-active' : '']" @click="onFilterChange('grade',-1)">{{ $t('lessonRecord.all') }}</span>
+					<span :class="['filter-item',gradeIndexArr.includes(index) ? 'filter-item-active' : '']"
+						v-for="(item,index) in curPeriod.grades" :key="index"
+						@click="onFilterChange('grade',index)">{{ item }}</span>
+				</div>	
 			</div>
 			</div>
 			<div class="filter-section">
 			<div class="filter-section">
 				<span class="filter-title">{{ $t('lessonRecord.cate') }}</span>
 				<span class="filter-title">{{ $t('lessonRecord.cate') }}</span>
-				<span :class="['filter-item',!tagIndexArr.length ? 'filter-item-active' : '']" @click="onFilterChange('tag',-1)">{{ $t('lessonRecord.all') }}</span>
-				<span :class="['filter-item',tagIndexArr.includes(index) ? 'filter-item-active' : '']"
-					v-for="(item,index) in tagList" :key="index"
-					@click="onFilterChange('tag',index)">{{ item }}</span>
+				<div class="filter-items">
+					<span :class="['filter-item',!tagIndexArr.length ? 'filter-item-active' : '']" @click="onFilterChange('tag',-1)">{{ $t('lessonRecord.all') }}</span>
+					<span :class="['filter-item',tagIndexArr.includes(index) ? 'filter-item-active' : '']"
+						v-for="(item,index) in tagList" :key="index"
+						@click="onFilterChange('tag',index)">{{ item }}</span>
+				</div>	
 			</div>
 			</div>
 			<div class="filter-section">
 			<div class="filter-section">
 				<span class="filter-title">{{ $t('lessonRecord.range') }}</span>
 				<span class="filter-title">{{ $t('lessonRecord.range') }}</span>
-				<span :class="['filter-item',curRangeIndex === index ? 'filter-item-active' : '']"
-					v-for="(item,index) in rangeArr" :key="index"
-					@click="onFilterChange('range',index)">{{ item }}</span>
+				<div class="filter-items">	
+					<span :class="['filter-item',curRangeIndex === index ? 'filter-item-active' : '']"
+						v-for="(item,index) in rangeArr" :key="index"
+						@click="onFilterChange('range',index)">{{ item }}</span>
+				</div>
 			</div>
 			</div>
 			<div class="ad-filter" >
 			<div class="ad-filter" >
 				<div class="ad-filter-item" v-show="!hideAdFilter && !showRangePicker">
 				<div class="ad-filter-item" v-show="!hideAdFilter && !showRangePicker">

+ 3 - 0
TEAMModelOS/ClientApp/src/view/schoolmgmt/SystemSetting/SystemSetting.vue

@@ -167,6 +167,9 @@
                                 <div class="setting-content grade-content" style="width:100%;height:fit-content">
                                 <div class="setting-content grade-content" style="width:100%;height:fit-content">
                                     <p class="block-title bf-color3">
                                     <p class="block-title bf-color3">
                                         {{$t('schoolBaseInfo.gradeSetting')}}
                                         {{$t('schoolBaseInfo.gradeSetting')}}
+                                        <Tooltip :content="$t('schoolBaseInfo.gradeTips')" max-width="200">
+                                            <Icon type="ios-information-circle-outline" color="#1cc0f3" size="16" style="margin-right:5px;cursor:pointer;"/>
+                                        </Tooltip>
                                         <span class="block-action-box">
                                         <span class="block-action-box">
                                             <Icon type="md-add" @click.stop="addGrade" class="action-btn-icon" v-if="$access.ability('admin','schoolSetting-upd').validateAll" />
                                             <Icon type="md-add" @click.stop="addGrade" class="action-btn-icon" v-if="$access.ability('admin','schoolSetting-upd').validateAll" />
                                         </span>
                                         </span>

+ 57 - 18
TEAMModelOS/Controllers/School/SchoolController.cs

@@ -23,6 +23,8 @@ using static TEAMModelOS.SDK.Models.Teacher;
 using Microsoft.Extensions.Configuration;
 using Microsoft.Extensions.Configuration;
 using TEAMModelOS.Filter;
 using TEAMModelOS.Filter;
 using Microsoft.AspNetCore.Authorization;
 using Microsoft.AspNetCore.Authorization;
+using System.Net.Http.Headers;
+using System.Net.Http.Json;
 
 
 namespace TEAMModelOS.Controllers
 namespace TEAMModelOS.Controllers
 {
 {
@@ -350,24 +352,27 @@ namespace TEAMModelOS.Controllers
                            .ToList();
                            .ToList();
                     foreach (deviceFromCoreService deviceRow in coreUuid)
                     foreach (deviceFromCoreService deviceRow in coreUuid)
                     {
                     {
-                        //前端顯示用
-                        deviceForCoreService deviceBoundRow = uuidList.Where(u => u.sn == deviceRow.sn && u.uuid1 == deviceRow.uuid1 && u.uuid2 == deviceRow.uuid2).FirstOrDefault();
-                        deviceBoundExt deviceBoundExt = new deviceBoundExt();
-                        deviceBoundExt.uuid = deviceBoundRow.uuid1;
-                        deviceBoundExt.uuid2 = deviceBoundRow.uuid2;
-                        deviceBoundExt.classId = deviceBoundRow.class_id;
-                        deviceBoundExt.deviceId = deviceRow.device_id;
-                        deviceBoundExt.os = deviceRow.os;
-                        deviceBoundExt.ip = deviceRow.local_ip;
-                        deviceBoundExt.cpu = deviceRow.cpu;
-                        deviceBoundExt.pcname = deviceRow.pc_name;
-                        deviceBoundExt.osver = deviceRow.os_ver;
-                        deviceBoundArray.Add(deviceBoundExt);
-                        //DB更新用
-                        deviceBound serialDeviceBoundRow = serialRow.deviceBound.Where(d => (d.uuid == deviceBoundRow.uuid1 && d.uuid2 == deviceBoundRow.uuid2) || (d.uuid == deviceBoundRow.uuid2 && d.uuid2 == deviceBoundRow.uuid1)).FirstOrDefault();
-                        if (serialDeviceBoundRow != null)
+                        if (!string.IsNullOrWhiteSpace(deviceRow.uuid1) || !string.IsNullOrWhiteSpace(deviceRow.uuid2) || !string.IsNullOrWhiteSpace(deviceRow.device_id)) //uuid1、uuid2、device_id 任一欄有值
                         {
                         {
-                            serialDeviceBoundRow.deviceId = deviceRow.device_id;
+                            //前端顯示用
+                            deviceForCoreService deviceBoundRow = uuidList.Where(u => u.sn == deviceRow.sn && u.uuid1 == deviceRow.uuid1 && u.uuid2 == deviceRow.uuid2).FirstOrDefault();
+                            deviceBoundExt deviceBoundExt = new deviceBoundExt();
+                            deviceBoundExt.uuid = deviceBoundRow.uuid1;
+                            deviceBoundExt.uuid2 = deviceBoundRow.uuid2;
+                            deviceBoundExt.classId = deviceBoundRow.class_id;
+                            deviceBoundExt.deviceId = deviceRow.device_id;
+                            deviceBoundExt.os = deviceRow.os;
+                            deviceBoundExt.ip = deviceRow.local_ip;
+                            deviceBoundExt.cpu = deviceRow.cpu;
+                            deviceBoundExt.pcname = deviceRow.pc_name;
+                            deviceBoundExt.osver = deviceRow.os_ver;
+                            deviceBoundArray.Add(deviceBoundExt);
+                            //DB更新用
+                            deviceBound serialDeviceBoundRow = serialRow.deviceBound.Where(d => (d.uuid == deviceBoundRow.uuid1 && d.uuid2 == deviceBoundRow.uuid2) || (d.uuid == deviceBoundRow.uuid2 && d.uuid2 == deviceBoundRow.uuid1)).FirstOrDefault();
+                            if (serialDeviceBoundRow != null)
+                            {
+                                serialDeviceBoundRow.deviceId = deviceRow.device_id;
+                            }
                         }
                         }
                     }
                     }
                     //序號更新
                     //序號更新
@@ -789,7 +794,10 @@ namespace TEAMModelOS.Controllers
             {
             {
                 string url = _configuration.GetValue<string>("HaBookAuth:CoreService:deviceinfo"); 
                 string url = _configuration.GetValue<string>("HaBookAuth:CoreService:deviceinfo"); 
                 HttpClient client = new HttpClient();
                 HttpClient client = new HttpClient();
-                var content = new StringContent(JsonConvert.SerializeObject(uuidList), Encoding.UTF8, "application/json");
+                string AccessToken = await getCoreAccessToken();
+                client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", AccessToken);
+                string uuidListJson = JsonConvert.SerializeObject(uuidList);
+                var content = new StringContent(uuidListJson, Encoding.UTF8, "application/json");
                 HttpResponseMessage responseMessage = await client.PostAsync(url, content);
                 HttpResponseMessage responseMessage = await client.PostAsync(url, content);
                 if (responseMessage.StatusCode == HttpStatusCode.OK)
                 if (responseMessage.StatusCode == HttpStatusCode.OK)
                 {
                 {
@@ -804,6 +812,37 @@ namespace TEAMModelOS.Controllers
             }
             }
         }
         }
 
 
+        private async Task<string> getCoreAccessToken()
+        {
+            string AccessToken = "";
+            try
+            {
+                string Url = _configuration.GetValue<string>("HaBookAuth:IES5Auth:url");
+                HttpClient client = new HttpClient();
+                string GrantType = "device";
+                string ClientID = _configuration.GetValue<string>("HaBookAuth:IES5Auth:token:client_id");
+                string Secret = _configuration.GetValue<string>("HaBookAuth:IES5Auth:token:client_secret");
+                var content = new { grant_type = GrantType, client_id = ClientID, client_secret = Secret };
+                var response = await client.PostAsJsonAsync($"{Url}", content);
+                if (response.IsSuccessStatusCode)
+                {
+                    string responseBody = response.Content.ReadAsStringAsync().Result;
+                    using (JsonDocument document = JsonDocument.Parse(responseBody.ToString()))
+                    {
+                        if (document.RootElement.TryGetProperty("access_token", out JsonElement AccessTokenObj))
+                        {
+                            AccessToken = AccessTokenObj.ToString();
+                        }
+                    }
+                }
+                return AccessToken;
+            }
+            catch (Exception ex)
+            {
+                return AccessToken;
+            }
+        }
+
         /// <summary>
         /// <summary>
         /// 計算各產品的初始結束時間及可用數
         /// 計算各產品的初始結束時間及可用數
         /// </summary>
         /// </summary>