CrazyIter_Bin 3 éve
szülő
commit
ff70e859f9
100 módosított fájl, 4805 hozzáadás és 2342 törlés
  1. 1 0
      BlobDownload/BlobDownload.csproj
  2. 20 0
      BlobDownload/Program.cs
  3. 8 7
      TEAMModelFunction/ActivityHttpTrigger.cs
  4. 25 67
      TEAMModelFunction/CourseServiceBus.cs
  5. 8 8
      TEAMModelFunction/MonitorServicesBus.cs
  6. 9 8
      TEAMModelFunction/TriggerCorrect.cs
  7. 21 20
      TEAMModelFunction/TriggerExam.cs
  8. 5 4
      TEAMModelFunction/TriggerSurvey.cs
  9. 3 2
      TEAMModelFunction/TriggerVote.cs
  10. 3 2
      TEAMModelOS.SDK/Context/Constant/ConstField.cs
  11. 1 1
      TEAMModelOS.SDK/Context/Constant/ContentTypeDict.cs
  12. 1 1
      TEAMModelOS.SDK/Context/Constant/FileType.cs
  13. 2 2
      TEAMModelOS.SDK/Context/Constant/FileTypeMap.cs
  14. 2 2
      TEAMModelOS.SDK/Context/Constant/GetFileType.cs
  15. 1 1
      TEAMModelOS.SDK/Context/Constant/ResponseCode.cs
  16. 1 0
      TEAMModelOS.SDK/DI/AzureCosmos/Inner/SQLHelper.cs
  17. 1 1
      TEAMModelOS.SDK/DI/AzureStorage/AzureStorageBlobExtensions.cs
  18. 40 0
      TEAMModelOS.SDK/DI/AzureStorage/AzureStorageFactory.cs
  19. 1 0
      TEAMModelOS.SDK/DI/AzureStorage/AzureStorageTableExtensions.cs
  20. 3 2
      TEAMModelOS.SDK/Extension/JwtAuthExtension.cs
  21. 0 28
      TEAMModelOS.SDK/Helper/Common/CollectionHelper/CollectionHelper.cs
  22. 1 0
      TEAMModelOS.SDK/Models/Cosmos/School/Area.cs
  23. 1 1
      TEAMModelOS.SDK/Models/Cosmos/School/School.cs
  24. 2 1
      TEAMModelOS.SDK/Models/Cosmos/Student/TmdUser.cs
  25. 1 0
      TEAMModelOS.SDK/Models/Service/FixDataService.cs
  26. 8 7
      TEAMModelOS.SDK/Models/Service/StuListService.cs
  27. 63 0
      TEAMModelOS.SDK/Models/Service/TmdUserService.cs
  28. 6 4
      TEAMModelOS.SDK/Models/Service/TriggerStuActivity.cs
  29. 1 0
      TEAMModelOS.SDK/TEAMModelOS.SDK.csproj
  30. 2 0
      TEAMModelOS/ClientApp/package.json
  31. 12 1
      TEAMModelOS/ClientApp/src/api/stuAccount.js
  32. 26 3
      TEAMModelOS/ClientApp/src/assets/iconfont/demo_index.html
  33. 7 3
      TEAMModelOS/ClientApp/src/assets/iconfont/iconfont.css
  34. 1 1
      TEAMModelOS/ClientApp/src/assets/iconfont/iconfont.js
  35. 7 0
      TEAMModelOS/ClientApp/src/assets/iconfont/iconfont.json
  36. BIN
      TEAMModelOS/ClientApp/src/assets/iconfont/iconfont.ttf
  37. BIN
      TEAMModelOS/ClientApp/src/assets/iconfont/iconfont.woff
  38. BIN
      TEAMModelOS/ClientApp/src/assets/iconfont/iconfont.woff2
  39. 1 1
      TEAMModelOS/ClientApp/src/assets/student-web/component_styles/app-nav.css
  40. 1 1
      TEAMModelOS/ClientApp/src/assets/student-web/component_styles/app-nav.less
  41. 35 12
      TEAMModelOS/ClientApp/src/assets/student-web/component_styles/home-view.css
  42. 50 19
      TEAMModelOS/ClientApp/src/assets/student-web/component_styles/home-view.less
  43. 46 19
      TEAMModelOS/ClientApp/src/common/BaseLayout.vue
  44. 1 1
      TEAMModelOS/ClientApp/src/common/BaseMyCanvas.vue
  45. 3 2
      TEAMModelOS/ClientApp/src/common/BaseSelectSchool.vue
  46. 3 3
      TEAMModelOS/ClientApp/src/components/coursemgt/StudentList.vue
  47. 1 1
      TEAMModelOS/ClientApp/src/components/evaluation/ExerciseList.vue
  48. 50 0
      TEAMModelOS/ClientApp/src/components/mark/BaseMark.vue
  49. 0 0
      TEAMModelOS/ClientApp/src/components/mark/MarkCanvas.vue
  50. 98 0
      TEAMModelOS/ClientApp/src/components/mark/MarkTools.vue
  51. 78 77
      TEAMModelOS/ClientApp/src/components/selflearn/ExerciseList.vue
  52. 740 761
      TEAMModelOS/ClientApp/src/components/selflearn/NewChooseContent.vue
  53. 59 52
      TEAMModelOS/ClientApp/src/components/student-web/EventBasicInfo.vue
  54. 8 22
      TEAMModelOS/ClientApp/src/components/student-web/EventView/BillBoardandLightBox.vue
  55. 2 0
      TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/PaperTest.vue
  56. 1 1
      TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/PaperView.vue
  57. 1 1
      TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/QuesNaire.vue
  58. 50 17
      TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/Vote.vue
  59. 1 1
      TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/VoteResultChart.vue
  60. 5 1
      TEAMModelOS/ClientApp/src/components/student-web/EventView/EventList.vue
  61. 57 17
      TEAMModelOS/ClientApp/src/components/student-web/HomeView/CourseContent.vue
  62. 26 9
      TEAMModelOS/ClientApp/src/components/student-web/HomeView/CourseList.vue
  63. 766 66
      TEAMModelOS/ClientApp/src/components/student-web/HomeView/CourseListView.vue
  64. 383 260
      TEAMModelOS/ClientApp/src/components/student-web/HomeView/HomeView.vue
  65. 4 1
      TEAMModelOS/ClientApp/src/components/student-web/HomeView/MissionListCard.vue
  66. 1 1
      TEAMModelOS/ClientApp/src/css/dark-wang-editor.less
  67. 4 2
      TEAMModelOS/ClientApp/src/locale/lang/en-US/cusMgt.js
  68. 2 0
      TEAMModelOS/ClientApp/src/locale/lang/en-US/evaluation.js
  69. 2 0
      TEAMModelOS/ClientApp/src/locale/lang/en-US/index.js
  70. 5 1
      TEAMModelOS/ClientApp/src/locale/lang/en-US/schoolBaseInfo.js
  71. 23 0
      TEAMModelOS/ClientApp/src/locale/lang/en-US/selflearn.js
  72. 4 2
      TEAMModelOS/ClientApp/src/locale/lang/zh-CN/cusMgt.js
  73. 7 1
      TEAMModelOS/ClientApp/src/locale/lang/zh-CN/evaluation.js
  74. 2 0
      TEAMModelOS/ClientApp/src/locale/lang/zh-CN/index.js
  75. 48 44
      TEAMModelOS/ClientApp/src/locale/lang/zh-CN/schoolBaseInfo.js
  76. 23 0
      TEAMModelOS/ClientApp/src/locale/lang/zh-CN/selflearn.js
  77. 1 0
      TEAMModelOS/ClientApp/src/locale/lang/zh-CN/system.js
  78. 4 2
      TEAMModelOS/ClientApp/src/locale/lang/zh-TW/cusMgt.js
  79. 7 1
      TEAMModelOS/ClientApp/src/locale/lang/zh-TW/evaluation.js
  80. 2 0
      TEAMModelOS/ClientApp/src/locale/lang/zh-TW/index.js
  81. 5 1
      TEAMModelOS/ClientApp/src/locale/lang/zh-TW/schoolBaseInfo.js
  82. 23 0
      TEAMModelOS/ClientApp/src/locale/lang/zh-TW/selflearn.js
  83. 20 2
      TEAMModelOS/ClientApp/src/router/routes.js
  84. 801 338
      TEAMModelOS/ClientApp/src/static/twJson.js
  85. 801 338
      TEAMModelOS/ClientApp/src/static/twJsonT.js
  86. 21 11
      TEAMModelOS/ClientApp/src/store/module/answerSheet.js
  87. 1 1
      TEAMModelOS/ClientApp/src/store/module/schoolBaseInfo.js
  88. 2 3
      TEAMModelOS/ClientApp/src/utils/blobTool.js
  89. 21 0
      TEAMModelOS/ClientApp/src/view/classmgt/ManageClass.less
  90. 98 51
      TEAMModelOS/ClientApp/src/view/classmgt/ManageClass.vue
  91. 1 1
      TEAMModelOS/ClientApp/src/view/evaluation/bank/ExerciseList.vue
  92. 2 0
      TEAMModelOS/ClientApp/src/view/evaluation/bank/TestPaperList.vue
  93. 5 1
      TEAMModelOS/ClientApp/src/view/evaluation/components/BaseChild.vue
  94. 1 1
      TEAMModelOS/ClientApp/src/view/evaluation/components/BaseChildList.vue
  95. 2 0
      TEAMModelOS/ClientApp/src/view/evaluation/components/BaseCreateChild.vue
  96. 17 9
      TEAMModelOS/ClientApp/src/view/evaluation/components/BaseEditExercise.vue
  97. 3 7
      TEAMModelOS/ClientApp/src/view/evaluation/components/BaseExerciseList.vue
  98. 77 0
      TEAMModelOS/ClientApp/src/view/evaluation/components/BasePasteTool.vue
  99. 5 2
      TEAMModelOS/ClientApp/src/view/evaluation/components/BasePoints.vue
  100. 0 0
      TEAMModelOS/ClientApp/src/view/evaluation/index/CommonExercise.less

+ 1 - 0
BlobDownload/BlobDownload.csproj

@@ -6,6 +6,7 @@
   </PropertyGroup>
   </PropertyGroup>
 
 
   <ItemGroup>
   <ItemGroup>
+    <PackageReference Include="Aspose.Slides.NET" Version="21.8.0" />
     <PackageReference Include="Azure.Storage.Blobs.Batch" Version="12.6.0" />
     <PackageReference Include="Azure.Storage.Blobs.Batch" Version="12.6.0" />
     <PackageReference Include="System.Drawing.Common" Version="5.0.2" />
     <PackageReference Include="System.Drawing.Common" Version="5.0.2" />
   </ItemGroup>
   </ItemGroup>

+ 20 - 0
BlobDownload/Program.cs

@@ -13,8 +13,28 @@ namespace BlobDownload
 {
 {
    public class Program
    public class Program
     {
     {
+        static bool IsNumeric(string str)
+        {
+            System.Text.RegularExpressions.Regex reg1 = new System.Text.RegularExpressions.Regex(@"^[-]?\d+[.]?\d*$");
+            return reg1.IsMatch(str);
+        }
         static async Task Main(string[] args)
         static async Task Main(string[] args)
         {
         {
+            var prs = new Aspose.Slides.Presentation(@"C:\Users\CrazyIter\Desktop\6.2.3平面图形的认识与测量(三)(3).pptx");
+            prs.Save(@"C:\Users\CrazyIter\Desktop\output.Gif", Aspose.Slides.Export.SaveFormat.Gif);
+            string reg1 = "123aewe";
+            string reg2 = "858";
+            string reg3 = "858=";
+            string reg4 = "aa858=";
+            string reg5 = "83edd58=";
+            Console.WriteLine(IsNumeric(reg1));
+            Console.WriteLine(IsNumeric(reg2));
+            Console.WriteLine(IsNumeric(reg3));
+            Console.WriteLine(IsNumeric(reg4));
+            Console.WriteLine(IsNumeric(reg5));
+
+
+
             string base64 = "/base64.txt";
             string base64 = "/base64.txt";
             StreamReader sr = new StreamReader(base64, Encoding.Default);
             StreamReader sr = new StreamReader(base64, Encoding.Default);
             StringBuilder content = new StringBuilder();
             StringBuilder content = new StringBuilder();

+ 8 - 7
TEAMModelFunction/ActivityHttpTrigger.cs

@@ -18,6 +18,7 @@ using TEAMModelOS.SDK.Models.Cosmos.Common;
 using System.Linq;
 using System.Linq;
 using TEAMModelOS.Services.Common;
 using TEAMModelOS.Services.Common;
 using TEAMModelOS.SDK.Models.Service;
 using TEAMModelOS.SDK.Models.Service;
+using HTEXLib.COMM.Helpers;
 
 
 namespace TEAMModelFunction
 namespace TEAMModelFunction
 {
 {
@@ -52,12 +53,12 @@ namespace TEAMModelFunction
             List<Course> courses = new List<Course>();
             List<Course> courses = new List<Course>();
             var client = _azureCosmos.GetCosmosClient();
             var client = _azureCosmos.GetCosmosClient();
             var query = $"select  *  from c ";
             var query = $"select  *  from c ";
-            await foreach (var item in client.GetContainer("TEAMModelOS", "School").GetItemQueryIterator<Course>(queryText: query,
+            await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<Course>(queryText: query,
                     requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"Course-{originCode}") }))
                     requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"Course-{originCode}") }))
             {
             {
                 courses.Add(item);
                 courses.Add(item);
             }
             }
-            await foreach (var item in client.GetContainer("TEAMModelOS", "Teacher").GetItemQueryIterator<Course>(queryText: query,
+            await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryIterator<Course>(queryText: query,
                     requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"Course-{originCode}") }))
                     requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"Course-{originCode}") }))
             {
             {
                 courses.Add(item);
                 courses.Add(item);
@@ -86,7 +87,7 @@ namespace TEAMModelFunction
                                     pk = "StuCourse",
                                     pk = "StuCourse",
                                     createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
                                     createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
                                 };
                                 };
-                                await client.GetContainer("TEAMModelOS", "Student").UpsertItemAsync(stuCourse, new PartitionKey(stuCourse.code));
+                                await client.GetContainer(Constant.TEAMModelOS, "Student").UpsertItemAsync(stuCourse, new PartitionKey(stuCourse.code));
                             }
                             }
                             foreach (var addTmd in tmdids)
                             foreach (var addTmd in tmdids)
                             {
                             {
@@ -102,7 +103,7 @@ namespace TEAMModelFunction
                                     pk = "StuCourse",
                                     pk = "StuCourse",
                                     createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
                                     createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
                                 };
                                 };
-                                await client.GetContainer("TEAMModelOS", "Teacher").UpsertItemAsync(tmdCourse, new PartitionKey(tmdCourse.code));
+                                await client.GetContainer(Constant.TEAMModelOS, "Student").UpsertItemAsync(tmdCourse, new PartitionKey(tmdCourse.code));
                             }
                             }
                         }
                         }
                     }
                     }
@@ -127,7 +128,7 @@ namespace TEAMModelFunction
             var query = $"select  *  from c ";
             var query = $"select  *  from c ";
             foreach (string data in datas) {
             foreach (string data in datas) {
                 List<ExamInfo> exams = new List<ExamInfo>();
                 List<ExamInfo> exams = new List<ExamInfo>();
-                await foreach (var item in client.GetContainer("TEAMModelOS", "Common").GetItemQueryStreamIterator(
+                await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Common").GetItemQueryStreamIterator(
                     queryText: query,  requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Exam-{data}") }))
                     queryText: query,  requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Exam-{data}") }))
                 {
                 {
                     using var json = await JsonDocument.ParseAsync(item.ContentStream);
                     using var json = await JsonDocument.ParseAsync(item.ContentStream);
@@ -232,7 +233,7 @@ namespace TEAMModelFunction
             foreach (string data in datas)
             foreach (string data in datas)
             {
             {
                 List<Vote> votes = new List<Vote>();
                 List<Vote> votes = new List<Vote>();
-                await foreach (var item in client.GetContainer("TEAMModelOS", "Common").GetItemQueryStreamIterator(
+                await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Common").GetItemQueryStreamIterator(
                     queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Vote-{data}") }))
                     queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Vote-{data}") }))
                 {
                 {
                     using var json = await JsonDocument.ParseAsync(item.ContentStream);
                     using var json = await JsonDocument.ParseAsync(item.ContentStream);
@@ -333,7 +334,7 @@ namespace TEAMModelFunction
             foreach (string data in datas)
             foreach (string data in datas)
             {
             {
                 List<Survey> surveys = new List<Survey>();
                 List<Survey> surveys = new List<Survey>();
-                await foreach (var item in client.GetContainer("TEAMModelOS", "Common").GetItemQueryStreamIterator(
+                await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Common").GetItemQueryStreamIterator(
                     queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Survey-{data}") }))
                     queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Survey-{data}") }))
                 {
                 {
                     using var json = await JsonDocument.ParseAsync(item.ContentStream);
                     using var json = await JsonDocument.ParseAsync(item.ContentStream);

+ 25 - 67
TEAMModelFunction/CourseServiceBus.cs

@@ -10,6 +10,7 @@ using TEAMModelOS.SDK.Extension;
 using TEAMModelOS.SDK;
 using TEAMModelOS.SDK;
 using TEAMModelOS.SDK.Models;
 using TEAMModelOS.SDK.Models;
 using TEAMModelOS.SDK.Models.Cosmos.Common;
 using TEAMModelOS.SDK.Models.Cosmos.Common;
+using HTEXLib.COMM.Helpers;
 
 
 namespace TEAMModelFunction
 namespace TEAMModelFunction
 {
 {
@@ -48,11 +49,11 @@ namespace TEAMModelFunction
                     foreach (var stu in addStudentsCls) {
                     foreach (var stu in addStudentsCls) {
                         try
                         try
                         {
                         {
-                            ItemResponse<StuCourse> stuCourse = await client.GetContainer("TEAMModelOS", "Student").ReadItemAsync<StuCourse>(courseChange.id, new PartitionKey($"StuCourse-{courseChange.school}-{stu.id}"));
+                            ItemResponse<StuCourse> stuCourse = await client.GetContainer(Constant.TEAMModelOS, "Student").ReadItemAsync<StuCourse>(courseChange.id, new PartitionKey($"StuCourse-{courseChange.school}-{stu.id}"));
                             if (!stuCourse.Value.classId.Contains(cls)) {
                             if (!stuCourse.Value.classId.Contains(cls)) {
                                 stuCourse.Value.classId.Add(cls);
                                 stuCourse.Value.classId.Add(cls);
                             }
                             }
-                            await client.GetContainer("TEAMModelOS", "Student").ReplaceItemAsync<StuCourse>(stuCourse, courseChange.id, new PartitionKey($"StuCourse-{courseChange.school}-{stu.id}"));
+                            await client.GetContainer(Constant.TEAMModelOS, "Student").ReplaceItemAsync<StuCourse>(stuCourse, courseChange.id, new PartitionKey($"StuCourse-{courseChange.school}-{stu.id}"));
                         }
                         }
                         catch (CosmosException ex)
                         catch (CosmosException ex)
                         {
                         {
@@ -71,7 +72,7 @@ namespace TEAMModelFunction
                                     pk = "StuCourse",
                                     pk = "StuCourse",
                                     createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
                                     createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
                                 };
                                 };
-                                await client.GetContainer("TEAMModelOS", "Student").CreateItemAsync(course, new PartitionKey(course.code));
+                                await client.GetContainer(Constant.TEAMModelOS, "Student").CreateItemAsync(course, new PartitionKey(course.code));
                             }
                             }
                         }
                         }
                     }
                     }
@@ -79,12 +80,12 @@ namespace TEAMModelFunction
                     {
                     {
                         try
                         try
                         {
                         {
-                            ItemResponse<StuCourse> stuCourse = await client.GetContainer("TEAMModelOS", "Teacher").ReadItemAsync<StuCourse>(courseChange.id, new PartitionKey($"StuCourse-{tmd.id}"));
+                            ItemResponse<StuCourse> stuCourse = await client.GetContainer(Constant.TEAMModelOS, "Student").ReadItemAsync<StuCourse>(courseChange.id, new PartitionKey($"StuCourse-{tmd.id}"));
                             if (!stuCourse.Value.classId.Contains(cls))
                             if (!stuCourse.Value.classId.Contains(cls))
                             {
                             {
                                 stuCourse.Value.classId.Add(cls);
                                 stuCourse.Value.classId.Add(cls);
                             }
                             }
-                            await client.GetContainer("TEAMModelOS", "Teacher").ReplaceItemAsync<StuCourse>(stuCourse, courseChange.id, new PartitionKey($"StuCourse-{tmd.id}"));
+                            await client.GetContainer(Constant.TEAMModelOS, "Student").ReplaceItemAsync<StuCourse>(stuCourse, courseChange.id, new PartitionKey($"StuCourse-{tmd.id}"));
                         }
                         }
                         catch (CosmosException ex)
                         catch (CosmosException ex)
                         {
                         {
@@ -103,7 +104,7 @@ namespace TEAMModelFunction
                                     pk = "StuCourse",
                                     pk = "StuCourse",
                                     createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
                                     createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
                                 };
                                 };
-                                await client.GetContainer("TEAMModelOS", "Teacher").CreateItemAsync(course, new PartitionKey(course.code));
+                                await client.GetContainer(Constant.TEAMModelOS, "Student").CreateItemAsync(course, new PartitionKey(course.code));
                             }
                             }
                         }
                         }
                     }
                     }
@@ -116,11 +117,11 @@ namespace TEAMModelFunction
                     {
                     {
                         try
                         try
                         {
                         {
-                            ItemResponse<StuCourse> stuCourse = await client.GetContainer("TEAMModelOS", "Student").ReadItemAsync<StuCourse>(courseChange.id, new PartitionKey($"StuCourse-{stu.schoolId}-{stu.id}"));
+                            ItemResponse<StuCourse> stuCourse = await client.GetContainer(Constant.TEAMModelOS, "Student").ReadItemAsync<StuCourse>(courseChange.id, new PartitionKey($"StuCourse-{stu.schoolId}-{stu.id}"));
                             if (!stuCourse.Value.stulist.Contains(list))
                             if (!stuCourse.Value.stulist.Contains(list))
                             {
                             {
                                 stuCourse.Value.stulist.Add(list);
                                 stuCourse.Value.stulist.Add(list);
-                                await client.GetContainer("TEAMModelOS", "Student").ReplaceItemAsync<StuCourse>(stuCourse, courseChange.id, new PartitionKey($"StuCourse-{stu.schoolId}-{stu.id}"));
+                                await client.GetContainer(Constant.TEAMModelOS, "Student").ReplaceItemAsync<StuCourse>(stuCourse, courseChange.id, new PartitionKey($"StuCourse-{stu.schoolId}-{stu.id}"));
                             }
                             }
                         }
                         }
                         catch (CosmosException ex)
                         catch (CosmosException ex)
@@ -140,7 +141,7 @@ namespace TEAMModelFunction
                                     pk = "StuCourse",
                                     pk = "StuCourse",
                                     createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
                                     createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
                                 };
                                 };
-                                await client.GetContainer("TEAMModelOS", "Student").CreateItemAsync(course, new PartitionKey(course.code));
+                                await client.GetContainer(Constant.TEAMModelOS, "Student").CreateItemAsync(course, new PartitionKey(course.code));
                             }
                             }
                         }
                         }
                     }
                     }
@@ -148,11 +149,11 @@ namespace TEAMModelFunction
                     {
                     {
                         try
                         try
                         {
                         {
-                            ItemResponse<StuCourse> stuCourse = await client.GetContainer("TEAMModelOS", "Teacher").ReadItemAsync<StuCourse>(courseChange.id, new PartitionKey($"StuCourse-{tmd.id}"));
+                            ItemResponse<StuCourse> stuCourse = await client.GetContainer(Constant.TEAMModelOS, "Student").ReadItemAsync<StuCourse>(courseChange.id, new PartitionKey($"StuCourse-{tmd.id}"));
                             if (!stuCourse.Value.stulist.Contains(list))
                             if (!stuCourse.Value.stulist.Contains(list))
                             {
                             {
                                 stuCourse.Value.stulist.Add(list);
                                 stuCourse.Value.stulist.Add(list);
-                                await client.GetContainer("TEAMModelOS", "Teacher").ReplaceItemAsync<StuCourse>(stuCourse, courseChange.id, new PartitionKey($"StuCourse-{tmd.id}"));
+                                await client.GetContainer(Constant.TEAMModelOS, "Student").ReplaceItemAsync<StuCourse>(stuCourse, courseChange.id, new PartitionKey($"StuCourse-{tmd.id}"));
                             }
                             }
                             
                             
                         }
                         }
@@ -173,7 +174,7 @@ namespace TEAMModelFunction
                                     pk = "StuCourse",
                                     pk = "StuCourse",
                                     createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
                                     createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
                                 };
                                 };
-                                await client.GetContainer("TEAMModelOS", "Teacher").CreateItemAsync(course, new PartitionKey(course.code));
+                                await client.GetContainer(Constant.TEAMModelOS, "Student").CreateItemAsync(course, new PartitionKey(course.code));
                             }
                             }
                         }
                         }
                     }
                     }
@@ -185,7 +186,7 @@ namespace TEAMModelFunction
                     {
                     {
                         try
                         try
                         {
                         {
-                            ItemResponse<StuCourse> stuCourse = await client.GetContainer("TEAMModelOS", "Student").ReadItemAsync<StuCourse>(courseChange.id, new PartitionKey($"StuCourse-{courseChange.school}-{stu.id}"));
+                            ItemResponse<StuCourse> stuCourse = await client.GetContainer(Constant.TEAMModelOS, "Student").ReadItemAsync<StuCourse>(courseChange.id, new PartitionKey($"StuCourse-{courseChange.school}-{stu.id}"));
                            
                            
                             if (stuCourse.Value.classId.Contains(delCls))
                             if (stuCourse.Value.classId.Contains(delCls))
                             {
                             {
@@ -195,10 +196,10 @@ namespace TEAMModelFunction
                             if (!stuCourse.Value.classId.IsNotEmpty() && !stuCourse.Value.stulist.IsNotEmpty())
                             if (!stuCourse.Value.classId.IsNotEmpty() && !stuCourse.Value.stulist.IsNotEmpty())
                             {
                             {
                                 //当两个列表都不存在时则直接删除
                                 //当两个列表都不存在时则直接删除
-                                await client.GetContainer("TEAMModelOS", "Student").DeleteItemAsync<StuCourse>( courseChange.id, new PartitionKey($"StuCourse-{courseChange.school}-{stu.id}"));
+                                await client.GetContainer(Constant.TEAMModelOS, "Student").DeleteItemAsync<StuCourse>( courseChange.id, new PartitionKey($"StuCourse-{courseChange.school}-{stu.id}"));
                             }
                             }
                             else {
                             else {
-                                await client.GetContainer("TEAMModelOS", "Student").ReplaceItemAsync<StuCourse>(stuCourse, courseChange.id, new PartitionKey($"StuCourse-{courseChange.school}-{stu.id}"));
+                                await client.GetContainer(Constant.TEAMModelOS, "Student").ReplaceItemAsync<StuCourse>(stuCourse, courseChange.id, new PartitionKey($"StuCourse-{courseChange.school}-{stu.id}"));
                             }
                             }
                            
                            
                         }
                         }
@@ -211,7 +212,7 @@ namespace TEAMModelFunction
                     {
                     {
                         try
                         try
                         {
                         {
-                            ItemResponse<StuCourse> stuCourse = await client.GetContainer("TEAMModelOS", "Teacher").ReadItemAsync<StuCourse>(courseChange.id, new PartitionKey($"StuCourse-{tmd.id}"));
+                            ItemResponse<StuCourse> stuCourse = await client.GetContainer(Constant.TEAMModelOS, "Student").ReadItemAsync<StuCourse>(courseChange.id, new PartitionKey($"StuCourse-{tmd.id}"));
 
 
                             if (stuCourse.Value.classId.Contains(delCls))
                             if (stuCourse.Value.classId.Contains(delCls))
                             {
                             {
@@ -221,11 +222,11 @@ namespace TEAMModelFunction
                             if (!stuCourse.Value.classId.IsNotEmpty() && !stuCourse.Value.stulist.IsNotEmpty())
                             if (!stuCourse.Value.classId.IsNotEmpty() && !stuCourse.Value.stulist.IsNotEmpty())
                             {
                             {
                                 //当两个列表都不存在时则直接删除
                                 //当两个列表都不存在时则直接删除
-                                await client.GetContainer("TEAMModelOS", "Teacher").DeleteItemAsync<StuCourse>(courseChange.id, new PartitionKey($"StuCourse-{tmd.id}"));
+                                await client.GetContainer(Constant.TEAMModelOS, "Student").DeleteItemAsync<StuCourse>(courseChange.id, new PartitionKey($"StuCourse-{tmd.id}"));
                             }
                             }
                             else
                             else
                             {
                             {
-                                await client.GetContainer("TEAMModelOS", "Teacher").ReplaceItemAsync<StuCourse>(stuCourse, courseChange.id, new PartitionKey($"StuCourse-{tmd.id}"));
+                                await client.GetContainer(Constant.TEAMModelOS, "Student").ReplaceItemAsync<StuCourse>(stuCourse, courseChange.id, new PartitionKey($"StuCourse-{tmd.id}"));
                             }
                             }
 
 
                         }
                         }
@@ -242,7 +243,7 @@ namespace TEAMModelFunction
                     {
                     {
                         try
                         try
                         {
                         {
-                            ItemResponse<StuCourse> stuCourse = await client.GetContainer("TEAMModelOS", "Student").ReadItemAsync<StuCourse>(courseChange.id, new PartitionKey($"StuCourse-{courseChange.school}-{stu.id}"));
+                            ItemResponse<StuCourse> stuCourse = await client.GetContainer(Constant.TEAMModelOS, "Student").ReadItemAsync<StuCourse>(courseChange.id, new PartitionKey($"StuCourse-{courseChange.school}-{stu.id}"));
 
 
                             if (stuCourse.Value.stulist.Contains(delList))
                             if (stuCourse.Value.stulist.Contains(delList))
                             {
                             {
@@ -252,11 +253,11 @@ namespace TEAMModelFunction
                             if (!stuCourse.Value.classId.IsNotEmpty() && !stuCourse.Value.stulist.IsNotEmpty())
                             if (!stuCourse.Value.classId.IsNotEmpty() && !stuCourse.Value.stulist.IsNotEmpty())
                             {
                             {
                                 //当两个列表都不存在时则直接删除
                                 //当两个列表都不存在时则直接删除
-                                await client.GetContainer("TEAMModelOS", "Student").DeleteItemAsync<StuCourse>(courseChange.id, new PartitionKey($"StuCourse-{courseChange.school}-{stu.id}"));
+                                await client.GetContainer(Constant.TEAMModelOS, "Student").DeleteItemAsync<StuCourse>(courseChange.id, new PartitionKey($"StuCourse-{courseChange.school}-{stu.id}"));
                             }
                             }
                             else
                             else
                             {
                             {
-                                await client.GetContainer("TEAMModelOS", "Student").ReplaceItemAsync<StuCourse>(stuCourse, courseChange.id, new PartitionKey($"StuCourse-{courseChange.school}-{stu.id}"));
+                                await client.GetContainer(Constant.TEAMModelOS, "Student").ReplaceItemAsync<StuCourse>(stuCourse, courseChange.id, new PartitionKey($"StuCourse-{courseChange.school}-{stu.id}"));
                             }
                             }
 
 
                         }
                         }
@@ -269,7 +270,7 @@ namespace TEAMModelFunction
                     {
                     {
                         try
                         try
                         {
                         {
-                            ItemResponse<StuCourse> stuCourse = await client.GetContainer("TEAMModelOS", "Teacher").ReadItemAsync<StuCourse>(courseChange.id, new PartitionKey($"StuCourse-{tmd.id}"));
+                            ItemResponse<StuCourse> stuCourse = await client.GetContainer(Constant.TEAMModelOS, "Student").ReadItemAsync<StuCourse>(courseChange.id, new PartitionKey($"StuCourse-{tmd.id}"));
 
 
                             if (stuCourse.Value.stulist.Contains(delList))
                             if (stuCourse.Value.stulist.Contains(delList))
                             {
                             {
@@ -279,11 +280,11 @@ namespace TEAMModelFunction
                             if (!stuCourse.Value.classId.IsNotEmpty() && !stuCourse.Value.stulist.IsNotEmpty())
                             if (!stuCourse.Value.classId.IsNotEmpty() && !stuCourse.Value.stulist.IsNotEmpty())
                             {
                             {
                                 //当两个列表都不存在时则直接删除
                                 //当两个列表都不存在时则直接删除
-                                await client.GetContainer("TEAMModelOS", "Teacher").DeleteItemAsync<StuCourse>(courseChange.id, new PartitionKey($"StuCourse-{tmd.id}"));
+                                await client.GetContainer(Constant.TEAMModelOS, "Student").DeleteItemAsync<StuCourse>(courseChange.id, new PartitionKey($"StuCourse-{tmd.id}"));
                             }
                             }
                             else
                             else
                             {
                             {
-                                await client.GetContainer("TEAMModelOS", "Teacher").ReplaceItemAsync<StuCourse>(stuCourse, courseChange.id, new PartitionKey($"StuCourse-{tmd.id}"));
+                                await client.GetContainer(Constant.TEAMModelOS, "Student").ReplaceItemAsync<StuCourse>(stuCourse, courseChange.id, new PartitionKey($"StuCourse-{tmd.id}"));
                             }
                             }
 
 
                         }
                         }
@@ -293,49 +294,6 @@ namespace TEAMModelFunction
                         }
                         }
                     }
                     }
                 }
                 }
-
-                ////根据新增名单获取 新增的学生id 及timdid
-                //(List<string> addTmdids, List<Students> addStudents) = await TriggerStuActivity.GetStuList(client, _dingDing, courseChange.addList, courseChange.school);
-                ////根据删除名单获取 新增的学生id 及timdid
-                //(List<string> delTmdids, List<Students> delStudents) = await TriggerStuActivity.GetStuList(client, _dingDing, courseChange.delList, courseChange.school);
-                //foreach (var addStu in addStudents)
-                //{
-                //    var course = new StuCourse
-                //    {
-                //        id = courseChange.id,
-                //        scode = courseChange.code,
-                //        name = courseChange.name,
-                //        code = $"StuCourse-{courseChange.school}-{addStu.id}",
-                //        scope = courseChange.scope,
-                //        school = courseChange.school,
-                //        creatorId = courseChange.creatorId,
-                //        pk = "StuCourse"
-                //    };
-                //    await client.GetContainer("TEAMModelOS", "Student").UpsertItemAsync(course, new PartitionKey(course.code));
-                //}
-                //foreach (var addTmd in addTmdids)
-                //{
-                //    var course = new StuCourse
-                //    {
-                //        id = courseChange.id,
-                //        scode = courseChange.code,
-                //        name = courseChange.name,
-                //        code = $"StuCourse-{addTmd}",
-                //        scope = courseChange.scope,
-                //        //school = courseChange.school,
-                //        creatorId = courseChange.creatorId,
-                //        pk = "StuCourse"
-                //    };
-                //    await client.GetContainer("TEAMModelOS", "Teacher").UpsertItemAsync(course, new PartitionKey(course.code));
-                //}
-                //foreach (var delStu in delStudents)
-                //{
-                //    await client.GetContainer("TEAMModelOS", "Student").DeleteItemStreamAsync(courseChange.id, new PartitionKey($"Course-{courseChange.school}-{delStu.id}"));
-                //}
-                //foreach (var delTmd in delTmdids)
-                //{
-                //    await client.GetContainer("TEAMModelOS", "Teacher").DeleteItemStreamAsync(courseChange.id, new PartitionKey($"Course-{delTmd}"));
-                //}
             }
             }
             catch (Exception ex)
             catch (Exception ex)
             {
             {

+ 8 - 8
TEAMModelFunction/MonitorServicesBus.cs

@@ -45,9 +45,9 @@ namespace TEAMModelFunction
                 json.RootElement.TryGetProperty("code", out JsonElement code);
                 json.RootElement.TryGetProperty("code", out JsonElement code);
                 //Dictionary<string, object> keyValuePairs = mySbMsg.ToObject<Dictionary<string, object>>();
                 //Dictionary<string, object> keyValuePairs = mySbMsg.ToObject<Dictionary<string, object>>();
                 var client = _azureCosmos.GetCosmosClient();
                 var client = _azureCosmos.GetCosmosClient();
-                ExamInfo exam = await client.GetContainer("TEAMModelOS", "Common").ReadItemAsync<ExamInfo>(id.ToString(), new PartitionKey($"{code}"));
+                ExamInfo exam = await client.GetContainer(Constant.TEAMModelOS, "Common").ReadItemAsync<ExamInfo>(id.ToString(), new PartitionKey($"{code}"));
                 exam.progress = progress.ToString();
                 exam.progress = progress.ToString();
-                await client.GetContainer("TEAMModelOS", "Common").ReplaceItemAsync(exam, id.ToString(), new PartitionKey($"{code}"));
+                await client.GetContainer(Constant.TEAMModelOS, "Common").ReplaceItemAsync(exam, id.ToString(), new PartitionKey($"{code}"));
             }
             }
             catch (Exception ex)
             catch (Exception ex)
             {
             {
@@ -65,9 +65,9 @@ namespace TEAMModelFunction
                 jsonMsg.RootElement.TryGetProperty("progress", out JsonElement progress);
                 jsonMsg.RootElement.TryGetProperty("progress", out JsonElement progress);
                 jsonMsg.RootElement.TryGetProperty("code", out JsonElement code);
                 jsonMsg.RootElement.TryGetProperty("code", out JsonElement code);
                 var client = _azureCosmos.GetCosmosClient();
                 var client = _azureCosmos.GetCosmosClient();
-                Vote vote = await client.GetContainer("TEAMModelOS", "Common").ReadItemAsync<Vote>(id.ToString(), new PartitionKey($"{code}"));
+                Vote vote = await client.GetContainer(Constant.TEAMModelOS, "Common").ReadItemAsync<Vote>(id.ToString(), new PartitionKey($"{code}"));
                 vote.progress = progress.ToString();
                 vote.progress = progress.ToString();
-                await client.GetContainer("TEAMModelOS", "Common").ReplaceItemAsync(vote, id.ToString(), new PartitionKey($"{code}"));
+                await client.GetContainer(Constant.TEAMModelOS, "Common").ReplaceItemAsync(vote, id.ToString(), new PartitionKey($"{code}"));
             }
             }
             catch (Exception ex)
             catch (Exception ex)
             {
             {
@@ -85,9 +85,9 @@ namespace TEAMModelFunction
                 jsonMsg.RootElement.TryGetProperty("progress", out JsonElement progress);
                 jsonMsg.RootElement.TryGetProperty("progress", out JsonElement progress);
                 jsonMsg.RootElement.TryGetProperty("code", out JsonElement code);
                 jsonMsg.RootElement.TryGetProperty("code", out JsonElement code);
                 var client = _azureCosmos.GetCosmosClient();
                 var client = _azureCosmos.GetCosmosClient();
-                Correct correct = await client.GetContainer("TEAMModelOS", "Common").ReadItemAsync<Correct>(id.ToString(), new PartitionKey($"{code}"));
+                Correct correct = await client.GetContainer(Constant.TEAMModelOS, "Common").ReadItemAsync<Correct>(id.ToString(), new PartitionKey($"{code}"));
                 correct.progress = progress.ToString();
                 correct.progress = progress.ToString();
-                await client.GetContainer("TEAMModelOS", "Common").ReplaceItemAsync(correct, id.ToString(), new PartitionKey($"{code}"));
+                await client.GetContainer(Constant.TEAMModelOS, "Common").ReplaceItemAsync(correct, id.ToString(), new PartitionKey($"{code}"));
             }
             }
             catch (Exception ex)
             catch (Exception ex)
             {
             {
@@ -106,9 +106,9 @@ namespace TEAMModelFunction
                 jsonMsg.RootElement.TryGetProperty("code", out JsonElement code);
                 jsonMsg.RootElement.TryGetProperty("code", out JsonElement code);
                 //Dictionary<string, object> keyValuePairs = mySbMsg.ToObject<Dictionary<string, object>>();
                 //Dictionary<string, object> keyValuePairs = mySbMsg.ToObject<Dictionary<string, object>>();
                 var client = _azureCosmos.GetCosmosClient();
                 var client = _azureCosmos.GetCosmosClient();
-                Survey survey = await client.GetContainer("TEAMModelOS", "Common").ReadItemAsync<Survey>(id.ToString(), new PartitionKey($"{code}"));
+                Survey survey = await client.GetContainer(Constant.TEAMModelOS, "Common").ReadItemAsync<Survey>(id.ToString(), new PartitionKey($"{code}"));
                 survey.progress = progress.ToString();
                 survey.progress = progress.ToString();
-                await client.GetContainer("TEAMModelOS", "Common").ReplaceItemAsync(survey, id.ToString(), new PartitionKey($"{code}"));
+                await client.GetContainer(Constant.TEAMModelOS, "Common").ReplaceItemAsync(survey, id.ToString(), new PartitionKey($"{code}"));
             }
             }
             catch (Exception ex)
             catch (Exception ex)
             {
             {

+ 9 - 8
TEAMModelFunction/TriggerCorrect.cs

@@ -12,6 +12,7 @@ using TEAMModelOS.SDK.Models;
 using TEAMModelOS.SDK.Models.Cosmos;
 using TEAMModelOS.SDK.Models.Cosmos;
 using TEAMModelOS.SDK.Models.Cosmos.Common;
 using TEAMModelOS.SDK.Models.Cosmos.Common;
 using TEAMModelOS.SDK.Models.Table;
 using TEAMModelOS.SDK.Models.Table;
+using HTEXLib.COMM.Helpers;
 
 
 namespace TEAMModelFunction
 namespace TEAMModelFunction
 {
 {
@@ -37,7 +38,7 @@ namespace TEAMModelFunction
                 return;
                 return;
             }
             }
             await _dingDing.SendBotMsg($"{Environment.GetEnvironmentVariable("Option:Location")}阅卷配置【{tdata.name}-{tdata.id}-ttl={tdata.ttl}】正在执行", GroupNames.成都开发測試群組);
             await _dingDing.SendBotMsg($"{Environment.GetEnvironmentVariable("Option:Location")}阅卷配置【{tdata.name}-{tdata.id}-ttl={tdata.ttl}】正在执行", GroupNames.成都开发測試群組);
-            Correct correct = await client.GetContainer("TEAMModelOS", "Common").ReadItemAsync<Correct>(input.Id, new Azure.Cosmos.PartitionKey($"{tdata.code}"));
+            Correct correct = await client.GetContainer(Constant.TEAMModelOS, "Common").ReadItemAsync<Correct>(input.Id, new Azure.Cosmos.PartitionKey($"{tdata.code}"));
             List<ChangeRecord> correctRecords = await _azureStorage.FindListByDict<ChangeRecord>(new Dictionary<string, object>() { { "RowKey", input.Id }, { "PartitionKey", correct.progress } });
             List<ChangeRecord> correctRecords = await _azureStorage.FindListByDict<ChangeRecord>(new Dictionary<string, object>() { { "RowKey", input.Id }, { "PartitionKey", correct.progress } });
             if (correct != null)
             if (correct != null)
             {
             {
@@ -109,7 +110,7 @@ namespace TEAMModelFunction
                                             type = 1,
                                             type = 1,
                                             createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
                                             createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
                                         };
                                         };
-                                        await client.GetContainer("TEAMModelOS", "Teacher").UpsertItemAsync<CorrectTask>(task, new Azure.Cosmos.PartitionKey(task.code));
+                                        await client.GetContainer(Constant.TEAMModelOS, "Teacher").UpsertItemAsync<CorrectTask>(task, new Azure.Cosmos.PartitionKey(task.code));
                                     }
                                     }
                                 }
                                 }
 
 
@@ -148,7 +149,7 @@ namespace TEAMModelFunction
                                             type = 2,
                                             type = 2,
                                             createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
                                             createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
                                         };
                                         };
-                                        await client.GetContainer("TEAMModelOS", "Teacher").UpsertItemAsync<CorrectTask>(task, new Azure.Cosmos.PartitionKey(task.code));
+                                        await client.GetContainer(Constant.TEAMModelOS, "Teacher").UpsertItemAsync<CorrectTask>(task, new Azure.Cosmos.PartitionKey(task.code));
                                     }
                                     }
 
 
 
 
@@ -189,7 +190,7 @@ namespace TEAMModelFunction
                                             type = 3,
                                             type = 3,
                                             createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
                                             createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
                                         };
                                         };
-                                        await client.GetContainer("TEAMModelOS", "Teacher").UpsertItemAsync<CorrectTask>(task, new Azure.Cosmos.PartitionKey(task.code));
+                                        await client.GetContainer(Constant.TEAMModelOS, "Teacher").UpsertItemAsync<CorrectTask>(task, new Azure.Cosmos.PartitionKey(task.code));
                                     }
                                     }
 
 
 
 
@@ -203,7 +204,7 @@ namespace TEAMModelFunction
                                 string subjectId = sub.id;
                                 string subjectId = sub.id;
                                 //生成临时作答数据存放到redis
                                 //生成临时作答数据存放到redis
                                 var redisClient = _azureRedis.GetRedisClient(8);
                                 var redisClient = _azureRedis.GetRedisClient(8);
-                                ExamInfo info = await client.GetContainer("TEAMModelOS", "Common").ReadItemAsync<ExamInfo>(eid, new Azure.Cosmos.PartitionKey(ecode));
+                                ExamInfo info = await client.GetContainer(Constant.TEAMModelOS, "Common").ReadItemAsync<ExamInfo>(eid, new Azure.Cosmos.PartitionKey(ecode));
                                 List<ExamClassResult> classResults = new List<ExamClassResult>();
                                 List<ExamClassResult> classResults = new List<ExamClassResult>();
                                 //获取原题配分
                                 //获取原题配分
                                 int paperIndex = 0;
                                 int paperIndex = 0;
@@ -223,7 +224,7 @@ namespace TEAMModelFunction
                                 if (info.scope.Equals("school"))
                                 if (info.scope.Equals("school"))
                                 {
                                 {
 
 
-                                    await foreach (var item in client.GetContainer("TEAMModelOS", "Common").GetItemQueryIterator<ExamClassResult>(
+                                    await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Common").GetItemQueryIterator<ExamClassResult>(
                                     queryText: $"select value(c) from c where c.examId = '{eid}' and c.subjectId = '{subjectId}'",
                                     queryText: $"select value(c) from c where c.examId = '{eid}' and c.subjectId = '{subjectId}'",
                                     requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"ExamClassResult-{info.school}") }))
                                     requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"ExamClassResult-{info.school}") }))
                                     {
                                     {
@@ -232,7 +233,7 @@ namespace TEAMModelFunction
                                 }
                                 }
                                 else
                                 else
                                 {
                                 {
-                                    await foreach (var item in client.GetContainer("TEAMModelOS", "Common").GetItemQueryIterator<ExamClassResult>(
+                                    await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Common").GetItemQueryIterator<ExamClassResult>(
                                         queryText: $"select value(c) from c where c.examId = '{eid}' and c.subjectId = '{subjectId}'",
                                         queryText: $"select value(c) from c where c.examId = '{eid}' and c.subjectId = '{subjectId}'",
                                         requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"ExamClassResult-{info.creatorId}") }))
                                         requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"ExamClassResult-{info.creatorId}") }))
                                     {
                                     {
@@ -289,7 +290,7 @@ namespace TEAMModelFunction
                                                 model = sub.model
                                                 model = sub.model
 
 
                                             };
                                             };
-                                            tasks.Add(client.GetContainer("TEAMModelOS", "Teacher").CreateItemAsync<Scoring>(sc, new Azure.Cosmos.PartitionKey(sc.code)));
+                                            tasks.Add(client.GetContainer(Constant.TEAMModelOS, "Teacher").CreateItemAsync<Scoring>(sc, new Azure.Cosmos.PartitionKey(sc.code)));
                                         }
                                         }
                                         //tasks.Add(redisClient.HashSetAsync($"Exam:Scoring:{eid}-{subjectId}", stuId, new { tmdId = tmds, ans = examClass.studentAnswers[index].Count > 0 ? examClass.studentAnswers[index][0] : "", score = examClass.studentScores[index] }.ToJsonString()));
                                         //tasks.Add(redisClient.HashSetAsync($"Exam:Scoring:{eid}-{subjectId}", stuId, new { tmdId = tmds, ans = examClass.studentAnswers[index].Count > 0 ? examClass.studentAnswers[index][0] : "", score = examClass.studentScores[index] }.ToJsonString()));
                                     }
                                     }

+ 21 - 20
TEAMModelFunction/TriggerExam.cs

@@ -14,6 +14,7 @@ using TEAMModelOS.SDK.Models;
 using TEAMModelOS.SDK.Models.Cosmos;
 using TEAMModelOS.SDK.Models.Cosmos;
 using TEAMModelOS.SDK.Models.Cosmos.Common;
 using TEAMModelOS.SDK.Models.Cosmos.Common;
 using TEAMModelOS.SDK.Models.Service;
 using TEAMModelOS.SDK.Models.Service;
+using HTEXLib.COMM.Helpers;
 
 
 namespace TEAMModelFunction
 namespace TEAMModelFunction
 {
 {
@@ -22,14 +23,14 @@ namespace TEAMModelFunction
         public static async void Trigger(AzureCosmosFactory _azureCosmos, AzureServiceBusFactory _serviceBus, AzureStorageFactory _azureStorage, DingDing _dingDing,
         public static async void Trigger(AzureCosmosFactory _azureCosmos, AzureServiceBusFactory _serviceBus, AzureStorageFactory _azureStorage, DingDing _dingDing,
             CosmosClient client, Document input, string code, long stime, long etime, string school)
             CosmosClient client, Document input, string code, long stime, long etime, string school)
         {
         {
-            ExamInfo info = await client.GetContainer("TEAMModelOS", "Common").ReadItemAsync<ExamInfo>(input.Id, new Azure.Cosmos.PartitionKey($"{code}"));
+            ExamInfo info = await client.GetContainer(Constant.TEAMModelOS, "Common").ReadItemAsync<ExamInfo>(input.Id, new Azure.Cosmos.PartitionKey($"{code}"));
             List<ExamClassResult> examClassResults = new List<ExamClassResult>();
             List<ExamClassResult> examClassResults = new List<ExamClassResult>();
             List<ExamSubject> examSubjects = new List<ExamSubject>();
             List<ExamSubject> examSubjects = new List<ExamSubject>();
             try
             try
             {
             {
                 if (info.scope.Equals("teacher", StringComparison.OrdinalIgnoreCase) || info.scope.Equals("private", StringComparison.OrdinalIgnoreCase))
                 if (info.scope.Equals("teacher", StringComparison.OrdinalIgnoreCase) || info.scope.Equals("private", StringComparison.OrdinalIgnoreCase))
                 {
                 {
-                    await foreach (var item in client.GetContainer("TEAMModelOS", "Common").GetItemQueryStreamIterator(queryText: $"select value(c) from c where c.examId = '{info.id}'", requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"ExamClassResult-{info.creatorId}") }))
+                    await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Common").GetItemQueryStreamIterator(queryText: $"select value(c) from c where c.examId = '{info.id}'", requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"ExamClassResult-{info.creatorId}") }))
                     {
                     {
                         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)
@@ -43,7 +44,7 @@ namespace TEAMModelFunction
                 }
                 }
                 else
                 else
                 {
                 {
-                    await foreach (var item in client.GetContainer("TEAMModelOS", "Common").GetItemQueryStreamIterator(queryText: $"select value(c) from c where c.examId = '{info.id}'", requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"ExamClassResult-{school}") }))
+                    await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Common").GetItemQueryStreamIterator(queryText: $"select value(c) from c where c.examId = '{info.id}'", requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"ExamClassResult-{school}") }))
                     {
                     {
                         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)
@@ -64,7 +65,7 @@ namespace TEAMModelFunction
                 {
                 {
                     sub.Add(subject.id);
                     sub.Add(subject.id);
                 }
                 }
-                //ChangeRecord record = await client.GetContainer("TEAMModelOS", "Common").ReadItemAsync<ChangeRecord>(input.Id, new Azure.Cosmos.PartitionKey($"{info.progress}"));
+                //ChangeRecord record = await client.GetContainer(Constant.TEAMModelOS, "Common").ReadItemAsync<ChangeRecord>(input.Id, new Azure.Cosmos.PartitionKey($"{info.progress}"));
                 switch (info.progress)
                 switch (info.progress)
                 {
                 {
                     case "pending":
                     case "pending":
@@ -76,7 +77,7 @@ namespace TEAMModelFunction
                             long start = await _serviceBus.GetServiceBusClient().SendScheduleMessageAsync(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), message, DateTimeOffset.FromUnixTimeMilliseconds(stime));
                             long start = await _serviceBus.GetServiceBusClient().SendScheduleMessageAsync(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), message, DateTimeOffset.FromUnixTimeMilliseconds(stime));
                             records[0].sequenceNumber = start;
                             records[0].sequenceNumber = start;
                             await _azureStorage.SaveOrUpdate<ChangeRecord>(records[0]);
                             await _azureStorage.SaveOrUpdate<ChangeRecord>(records[0]);
-                            //await client.GetContainer("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}"));
                         }
                         }
                         else
                         else
                         {
                         {
@@ -89,7 +90,7 @@ namespace TEAMModelFunction
                                 msgId = message.MessageId
                                 msgId = message.MessageId
                             };
                             };
                             await _azureStorage.Save<ChangeRecord>(changeRecord);
                             await _azureStorage.Save<ChangeRecord>(changeRecord);
-                            //await client.GetContainer("TEAMModelOS", "Common").CreateItemAsync(changeRecord, new Azure.Cosmos.PartitionKey($"{changeRecord.code}"));
+                            //await client.GetContainer(Constant.TEAMModelOS, "Common").CreateItemAsync(changeRecord, new Azure.Cosmos.PartitionKey($"{changeRecord.code}"));
                         }
                         }
                         break;
                         break;
                     case "going":
                     case "going":
@@ -214,13 +215,13 @@ namespace TEAMModelFunction
                                             marks.Add(new List<Details>());
                                             marks.Add(new List<Details>());
                                             ansPoint.Add(-1);
                                             ansPoint.Add(-1);
                                         }
                                         }
-                                        var sresponse = await client.GetContainer("TEAMModelOS", "School").ReadItemStreamAsync(cla, new Azure.Cosmos.PartitionKey($"Class-{info.school}"));
+                                        var sresponse = await client.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync(cla, new Azure.Cosmos.PartitionKey($"Class-{info.school}"));
                                         if (sresponse.Status == 200)
                                         if (sresponse.Status == 200)
                                         {
                                         {
 
 
                                             using var json = await JsonDocument.ParseAsync(sresponse.ContentStream);
                                             using var json = await JsonDocument.ParseAsync(sresponse.ContentStream);
                                             Class classroom = json.ToObject<Class>();
                                             Class classroom = json.ToObject<Class>();
-                                            School sc = await client.GetContainer("TEAMModelOS", "School").ReadItemAsync<School>(info.school, new Azure.Cosmos.PartitionKey("Base"));
+                                            School sc = await client.GetContainer(Constant.TEAMModelOS, "School").ReadItemAsync<School>(info.school, new Azure.Cosmos.PartitionKey("Base"));
                                             foreach (Period period in sc.period)
                                             foreach (Period period in sc.period)
                                             {
                                             {
                                                 if (period.id.Equals(classroom.periodId))
                                                 if (period.id.Equals(classroom.periodId))
@@ -243,7 +244,7 @@ namespace TEAMModelFunction
                                             result.info.name = classroom.name;
                                             result.info.name = classroom.name;
                                             //result.gradeId = classroom.year.ToString();
                                             //result.gradeId = classroom.year.ToString();
                                             //处理班级人数
                                             //处理班级人数
-                                            await foreach (var item in client.GetContainer("TEAMModelOS", "Student").GetItemQueryStreamIterator(queryText: $"select c.id from c where c.classId = '{classroom.id}'", requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"Base-{info.school}") }))
+                                            await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Student").GetItemQueryStreamIterator(queryText: $"select c.id from c where c.classId = '{classroom.id}'", requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"Base-{info.school}") }))
                                             {
                                             {
                                                 using var json_stu = await JsonDocument.ParseAsync(item.ContentStream);
                                                 using var json_stu = await JsonDocument.ParseAsync(item.ContentStream);
                                                 if (json_stu.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
                                                 if (json_stu.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
@@ -259,7 +260,7 @@ namespace TEAMModelFunction
                                         }
                                         }
                                         if (info.scope.Equals("private", StringComparison.OrdinalIgnoreCase))
                                         if (info.scope.Equals("private", StringComparison.OrdinalIgnoreCase))
                                         {
                                         {
-                                            var stuResponse = await client.GetContainer("TEAMModelOS", "Teacher").ReadItemStreamAsync(cla, new Azure.Cosmos.PartitionKey($"StuList"));
+                                            var stuResponse = await client.GetContainer(Constant.TEAMModelOS, "Teacher").ReadItemStreamAsync(cla, new Azure.Cosmos.PartitionKey($"StuList"));
                                             if (stuResponse.Status == 200)
                                             if (stuResponse.Status == 200)
                                             {
                                             {
                                                 using var json = await JsonDocument.ParseAsync(stuResponse.ContentStream);
                                                 using var json = await JsonDocument.ParseAsync(stuResponse.ContentStream);
@@ -287,7 +288,7 @@ namespace TEAMModelFunction
                                         }
                                         }
                                         else
                                         else
                                         {
                                         {
-                                            var stuResponse = await client.GetContainer("TEAMModelOS", "School").ReadItemStreamAsync(cla, new Azure.Cosmos.PartitionKey($"StuList-{info.school}"));
+                                            var stuResponse = await client.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync(cla, new Azure.Cosmos.PartitionKey($"StuList-{info.school}"));
                                             if (stuResponse.Status == 200)
                                             if (stuResponse.Status == 200)
                                             {
                                             {
                                                 using var json = await JsonDocument.ParseAsync(stuResponse.ContentStream);
                                                 using var json = await JsonDocument.ParseAsync(stuResponse.ContentStream);
@@ -317,7 +318,7 @@ namespace TEAMModelFunction
                                         //result.progress = info.progress;
                                         //result.progress = info.progress;
                                         result.school = info.school;
                                         result.school = info.school;
                                         m++;
                                         m++;
-                                        await client.GetContainer("TEAMModelOS", "Common").CreateItemAsync(result, new Azure.Cosmos.PartitionKey($"{result.code}"));
+                                        await client.GetContainer(Constant.TEAMModelOS, "Common").CreateItemAsync(result, new Azure.Cosmos.PartitionKey($"{result.code}"));
                                     }
                                     }
                                 }
                                 }
                                 // 发送信息通知
                                 // 发送信息通知
@@ -329,7 +330,7 @@ namespace TEAMModelFunction
                                     await _serviceBus.GetServiceBusClient().cancelMessage(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), records[0].sequenceNumber);
                                     await _serviceBus.GetServiceBusClient().cancelMessage(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), records[0].sequenceNumber);
                                     records[0].sequenceNumber = end;
                                     records[0].sequenceNumber = end;
                                     await _azureStorage.SaveOrUpdate<ChangeRecord>(records[0]);
                                     await _azureStorage.SaveOrUpdate<ChangeRecord>(records[0]);
-                                    //await client.GetContainer("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}"));
                                 }
                                 }
                                 else
                                 else
                                 {
                                 {
@@ -342,7 +343,7 @@ namespace TEAMModelFunction
                                         msgId = messageEnd.MessageId
                                         msgId = messageEnd.MessageId
                                     };
                                     };
                                     await _azureStorage.Save<ChangeRecord>(changeRecord);
                                     await _azureStorage.Save<ChangeRecord>(changeRecord);
-                                    //await client.GetContainer("TEAMModelOS", "Common").CreateItemAsync(changeRecord, new Azure.Cosmos.PartitionKey($"{changeRecord.code}"));
+                                    //await client.GetContainer(Constant.TEAMModelOS, "Common").CreateItemAsync(changeRecord, new Azure.Cosmos.PartitionKey($"{changeRecord.code}"));
                                 }
                                 }
                             }
                             }
                             else
                             else
@@ -376,7 +377,7 @@ namespace TEAMModelFunction
 
 
                             //计算单次考试简易统计信息
                             //计算单次考试简易统计信息
                             List<ExamResult> examResults = new List<ExamResult>();
                             List<ExamResult> examResults = new List<ExamResult>();
-                            await foreach (var item in client.GetContainer("TEAMModelOS", "Common").GetItemQueryIterator<ExamResult>(
+                            await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Common").GetItemQueryIterator<ExamResult>(
                                                queryText: $"select value(c) from c where c.examId  = '{info.id}'", requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"ExamResult-{info.id}") }))
                                                queryText: $"select value(c) from c where c.examId  = '{info.id}'", requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"ExamResult-{info.id}") }))
                             {
                             {
                                 examResults.Add(item);
                                 examResults.Add(item);
@@ -415,7 +416,7 @@ namespace TEAMModelFunction
                                 classResult.standard = Math.Round(scount > 0 ? Math.Pow(sPowSum / scount, 0.5) : 0, 2);
                                 classResult.standard = Math.Round(scount > 0 ? Math.Pow(sPowSum / scount, 0.5) : 0, 2);
                                 classResult.average = scount > 0 ? Math.Round(subScore / scount, 2) : 0;
                                 classResult.average = scount > 0 ? Math.Round(subScore / scount, 2) : 0;
                                 classResult.progress = true;
                                 classResult.progress = true;
-                                tasks.Add(client.GetContainer("TEAMModelOS", "Common").ReplaceItemAsync(classResult, classResult.id, new Azure.Cosmos.PartitionKey($"{classResult.code}")));
+                                tasks.Add(client.GetContainer(Constant.TEAMModelOS, "Common").ReplaceItemAsync(classResult, classResult.id, new Azure.Cosmos.PartitionKey($"{classResult.code}")));
                             }
                             }
                             await Task.WhenAll(tasks);
                             await Task.WhenAll(tasks);
                             //记录某次考试所有学生得分总分
                             //记录某次考试所有学生得分总分
@@ -477,7 +478,7 @@ namespace TEAMModelFunction
                             {
                             {
                                 info.sRate = NewsRate;
                                 info.sRate = NewsRate;
                                 info.average = NewsRateScore;
                                 info.average = NewsRateScore;
-                                await client.GetContainer("TEAMModelOS", "Common").ReplaceItemAsync<ExamInfo>(info, info.id, new Azure.Cosmos.PartitionKey(info.code));
+                                await client.GetContainer(Constant.TEAMModelOS, "Common").ReplaceItemAsync<ExamInfo>(info, info.id, new Azure.Cosmos.PartitionKey(info.code));
                             }
                             }
                         }
                         }
                         catch (Exception e)
                         catch (Exception e)
@@ -666,7 +667,7 @@ namespace TEAMModelFunction
                             classResult.pc = pc;
                             classResult.pc = pc;
                             classResult.krate = persent;
                             classResult.krate = persent;
                         }
                         }
-                        //await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "Common").ReplaceItemAsync(classResult, classResult.id, new Azure.Cosmos.PartitionKey($"{classResult.code}"));
+                        //await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Common").ReplaceItemAsync(classResult, classResult.id, new Azure.Cosmos.PartitionKey($"{classResult.code}"));
                     }
                     }
                 }
                 }
 
 
@@ -766,7 +767,7 @@ namespace TEAMModelFunction
                         classResult.fpc = pc;
                         classResult.fpc = pc;
                         classResult.frate = persent;
                         classResult.frate = persent;
                     }
                     }
-                    //await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "Common").ReplaceItemAsync(classResult, classResult.id, new Azure.Cosmos.PartitionKey($"{classResult.code}"));
+                    //await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Common").ReplaceItemAsync(classResult, classResult.id, new Azure.Cosmos.PartitionKey($"{classResult.code}"));
                 }
                 }
             }
             }
             catch (Exception ex)
             catch (Exception ex)
@@ -941,7 +942,7 @@ namespace TEAMModelFunction
             result.name = info.name;
             result.name = info.name;
             result.time = info.startTime;
             result.time = info.startTime;
 
 
-            await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "Common").UpsertItemAsync(result, new Azure.Cosmos.PartitionKey($"ExamResult-{info.id}"));
+            await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Common").UpsertItemAsync(result, new Azure.Cosmos.PartitionKey($"ExamResult-{info.id}"));
 
 
         }       
         }       
     }
     }

+ 5 - 4
TEAMModelFunction/TriggerSurvey.cs

@@ -18,6 +18,7 @@ using TEAMModelOS.SDK.Models.Cosmos.Common;
 using TEAMModelOS.SDK.Models.Cosmos.Common.Inner;
 using TEAMModelOS.SDK.Models.Cosmos.Common.Inner;
 using TEAMModelOS.SDK.Module.AzureBlob.Configuration;
 using TEAMModelOS.SDK.Module.AzureBlob.Configuration;
 using TEAMModelOS.SDK.Models.Service;
 using TEAMModelOS.SDK.Models.Service;
+using HTEXLib.COMM.Helpers;
 
 
 namespace TEAMModelFunction
 namespace TEAMModelFunction
 {
 {
@@ -44,7 +45,7 @@ namespace TEAMModelFunction
                     adcode = $"Activity-{tdata.creatorId}";
                     adcode = $"Activity-{tdata.creatorId}";
                     blobcntr = tdata.creatorId;
                     blobcntr = tdata.creatorId;
                 }
                 }
-                Survey survey = await client.GetContainer("TEAMModelOS", "Common").ReadItemAsync<Survey>(input.Id, new Azure.Cosmos.PartitionKey($"{tdata.code}"));
+                Survey survey = await client.GetContainer(Constant.TEAMModelOS, "Common").ReadItemAsync<Survey>(input.Id, new Azure.Cosmos.PartitionKey($"{tdata.code}"));
                 List<ChangeRecord> changeRecords = await _azureStorage.FindListByDict<ChangeRecord>(new Dictionary<string, object>() { { "RowKey", input.Id }, { "PartitionKey", survey.progress } });
                 List<ChangeRecord> changeRecords = await _azureStorage.FindListByDict<ChangeRecord>(new Dictionary<string, object>() { { "RowKey", input.Id }, { "PartitionKey", survey.progress } });
                 if (survey != null)
                 if (survey != null)
                 {
                 {
@@ -274,7 +275,7 @@ namespace TEAMModelFunction
                             if (string.IsNullOrEmpty(survey.recordUrl))
                             if (string.IsNullOrEmpty(survey.recordUrl))
                             {
                             {
                                 survey.recordUrl = $"/survey/{survey.id}/record.json";
                                 survey.recordUrl = $"/survey/{survey.id}/record.json";
-                                await client.GetContainer("TEAMModelOS", "Common").ReplaceItemAsync<Survey>(survey, survey.id, new Azure.Cosmos.PartitionKey(survey.code));
+                                await client.GetContainer(Constant.TEAMModelOS, "Common").ReplaceItemAsync<Survey>(survey, survey.id, new Azure.Cosmos.PartitionKey(survey.code));
                             }
                             }
                             else
                             else
                             {
                             {
@@ -287,11 +288,11 @@ namespace TEAMModelFunction
                             //data.progress = "finish";
                             //data.progress = "finish";
                             //if (survey.scope .Equals("school"))
                             //if (survey.scope .Equals("school"))
                             //{
                             //{
-                            //    await client.GetContainer("TEAMModelOS", "School").ReplaceItemAsync<ActivityData>(data, data.id, new Azure.Cosmos.PartitionKey(data.code));
+                            //    await client.GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync<ActivityData>(data, data.id, new Azure.Cosmos.PartitionKey(data.code));
                             //}
                             //}
                             //else if (survey.scope .Equals("private"))
                             //else if (survey.scope .Equals("private"))
                             //{
                             //{
-                            //    await client.GetContainer("TEAMModelOS", "Teacher").ReplaceItemAsync<ActivityData>(data, data.id, new Azure.Cosmos.PartitionKey(data.code));
+                            //    await client.GetContainer(Constant.TEAMModelOS, "Teacher").ReplaceItemAsync<ActivityData>(data, data.id, new Azure.Cosmos.PartitionKey(data.code));
                             //}
                             //}
 
 
                             break;
                             break;

+ 3 - 2
TEAMModelFunction/TriggerVote.cs

@@ -15,6 +15,7 @@ using TEAMModelOS.SDK.Models.Cosmos;
 using TEAMModelOS.SDK.Models.Cosmos.Common;
 using TEAMModelOS.SDK.Models.Cosmos.Common;
 using TEAMModelOS.SDK.Models.Cosmos.Common.Inner;
 using TEAMModelOS.SDK.Models.Cosmos.Common.Inner;
 using TEAMModelOS.SDK.Models.Service;
 using TEAMModelOS.SDK.Models.Service;
+using HTEXLib.COMM.Helpers;
 
 
 namespace TEAMModelFunction
 namespace TEAMModelFunction
 {
 {
@@ -43,7 +44,7 @@ namespace TEAMModelFunction
                     blobcntr = tdata.creatorId;
                     blobcntr = tdata.creatorId;
                 }
                 }
                 await _dingDing.SendBotMsg($"{Environment.GetEnvironmentVariable("Option:Location")}投票活动【{tdata.name}-{tdata.id}-ttl={tdata.ttl}】正在操作", GroupNames.成都开发測試群組);
                 await _dingDing.SendBotMsg($"{Environment.GetEnvironmentVariable("Option:Location")}投票活动【{tdata.name}-{tdata.id}-ttl={tdata.ttl}】正在操作", GroupNames.成都开发測試群組);
-                Vote vote = await client.GetContainer("TEAMModelOS", "Common").ReadItemAsync<Vote>(input.Id, new Azure.Cosmos.PartitionKey($"{tdata.code}"));
+                Vote vote = await client.GetContainer(Constant.TEAMModelOS, "Common").ReadItemAsync<Vote>(input.Id, new Azure.Cosmos.PartitionKey($"{tdata.code}"));
                 List<ChangeRecord> voteRecords = await _azureStorage.FindListByDict<ChangeRecord>(new Dictionary<string, object>() { { "RowKey", input.Id }, { "PartitionKey", vote.progress } });
                 List<ChangeRecord> voteRecords = await _azureStorage.FindListByDict<ChangeRecord>(new Dictionary<string, object>() { { "RowKey", input.Id }, { "PartitionKey", vote.progress } });
                 if (vote != null)
                 if (vote != null)
                 {
                 {
@@ -225,7 +226,7 @@ namespace TEAMModelFunction
                             if (string.IsNullOrEmpty(vote.recordUrl))
                             if (string.IsNullOrEmpty(vote.recordUrl))
                             {
                             {
                                 vote.recordUrl = url;
                                 vote.recordUrl = url;
-                                await client.GetContainer("TEAMModelOS", "Common").ReplaceItemAsync<Vote>(vote, vote.id, new Azure.Cosmos.PartitionKey(vote.code));
+                                await client.GetContainer(Constant.TEAMModelOS, "Common").ReplaceItemAsync<Vote>(vote, vote.id, new Azure.Cosmos.PartitionKey(vote.code));
                             }
                             }
                             else
                             else
                             {
                             {

+ 3 - 2
TEAMModelOS.SDK/Context/Constant/ConstField.cs

@@ -2,11 +2,12 @@ using System;
 using System.Collections.Generic;
 using System.Collections.Generic;
 using System.Text;
 using System.Text;
 
 
-namespace TEAMModelOS.SDK
+namespace TEAMModelOS.SDK.DI
 {
 {
-    public class ConstField
+    public class Constant
     {
     {
         public static readonly List<string> BlobPrefix = new List<string> { "exam", "vote", "survey", "item", "paper", "syllabus", "records", "doc", "image", "res", "video", "audio", "other", "thum", "train", "temp", "jyzx" };
         public static readonly List<string> BlobPrefix = new List<string> { "exam", "vote", "survey", "item", "paper", "syllabus", "records", "doc", "image", "res", "video", "audio", "other", "thum", "train", "temp", "jyzx" };
         public static readonly List<string> ContentPrefix = new List<string> { "doc", "image", "res", "video", "audio", "other"};
         public static readonly List<string> ContentPrefix = new List<string> { "doc", "image", "res", "video", "audio", "other"};
+        public static string TEAMModelOS = "TEAMModelOS";
     }
     }
 }
 }

+ 1 - 1
TEAMModelOS.SDK/Context/Constant/ContentTypeDict.cs

@@ -2,7 +2,7 @@ using System;
 using System.Collections.Generic;
 using System.Collections.Generic;
 using System.Text;
 using System.Text;
 
 
-namespace TEAMModelOS.SDK.Context.Constant
+namespace TEAMModelOS.SDK
 {
 {
     public static class ContentTypeDict
     public static class ContentTypeDict
     {
     {

+ 1 - 1
TEAMModelOS.SDK/Context/Constant/FileType.cs

@@ -1,4 +1,4 @@
-namespace TEAMModelOS.SDK.Context.Constant.Common
+namespace TEAMModelOS.SDK
 {
 {
 	public class FileType
 	public class FileType
 	{
 	{

+ 2 - 2
TEAMModelOS.SDK/Context/Constant/FileTypeMap.cs

@@ -1,7 +1,7 @@
-using System.Collections.Generic;
+using System.Collections.Generic;
 
 
 
 
-namespace TEAMModelOS.SDK.Context.Constant.Common
+namespace TEAMModelOS.SDK
 {
 {
 	public class FileTypeMap
 	public class FileTypeMap
 	{
 	{

+ 2 - 2
TEAMModelOS.SDK/Context/Constant/GetFileType.cs

@@ -1,8 +1,8 @@
-using System;
+using System;
 using System.Collections.Generic;
 using System.Collections.Generic;
 using System.Text;
 using System.Text;
 
 
-namespace TEAMModelOS.SDK.Context.Constant.Common
+namespace TEAMModelOS.SDK
 {
 {
 	public class GetFileType
 	public class GetFileType
 	{
 	{

+ 1 - 1
TEAMModelOS.SDK/Context/Constant/ResponseCode.cs

@@ -1,4 +1,4 @@
-using System;
+using System;
 using System.Collections.Generic;
 using System.Collections.Generic;
 using System.Text;
 using System.Text;
 
 

+ 1 - 0
TEAMModelOS.SDK/DI/AzureCosmos/Inner/SQLHelper.cs

@@ -1,3 +1,4 @@
+using HTEXLib.COMM.Helpers;
 using Newtonsoft.Json.Linq;
 using Newtonsoft.Json.Linq;
 using System;
 using System;
 using System.Collections;
 using System.Collections;

+ 1 - 1
TEAMModelOS.SDK/DI/AzureStorage/AzureStorageBlobExtensions.cs

@@ -4,7 +4,6 @@ using Azure.Storage.Blobs;
 using Azure.Storage.Blobs.Models;
 using Azure.Storage.Blobs.Models;
 using TEAMModelOS.SDK.Module.AzureBlob.Configuration;
 using TEAMModelOS.SDK.Module.AzureBlob.Configuration;
 using TEAMModelOS.SDK.Module.AzureBlob.Container;
 using TEAMModelOS.SDK.Module.AzureBlob.Container;
-using TEAMModelOS.SDK.Context.Constant;
 using TEAMModelOS.SDK.Helper.Security.ShaHash;
 using TEAMModelOS.SDK.Helper.Security.ShaHash;
 using System;
 using System;
 using System.IO;
 using System.IO;
@@ -16,6 +15,7 @@ using Azure.Core;
 using Azure;
 using Azure;
 using TEAMModelOS.SDK;
 using TEAMModelOS.SDK;
 using TEAMModelOS.SDK.Extension;
 using TEAMModelOS.SDK.Extension;
+using HTEXLib.COMM.Helpers;
 
 
 namespace TEAMModelOS.SDK.DI
 namespace TEAMModelOS.SDK.DI
 {
 {

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

@@ -77,7 +77,47 @@ namespace TEAMModelOS.SDK.DI
                 return null;
                 return null;
             }
             }
         }
         }
+        /// <summary>
+        /// 取得Blob Container SAS (有效期預設99年)
+        /// </summary>
+        /// <param name="containerName">容器名稱</param>        
+        /// <param name="blobContainerSasPermissions">權限(可多選)Flags</param>
+        /// <param name="name"></param>
+        /// <returns></returns>
+        public (string uri, string sas) GetBlobContainerSAS99Year(string containerName, BlobContainerSasPermissions blobContainerSasPermissions, string name = "Default")
+        {
+            try
+            {
+                var keys = Utils.ParseConnectionString(_optionsMonitor.Get(name).StorageAccountConnectionString);
+                var accountname = keys["AccountName"];
+                var accountkey = keys["AccountKey"];
+                var endpoint = keys["EndpointSuffix"];
+
+                var blobSasBuilder = new BlobSasBuilder
+                {
+                    StartsOn = DateTimeOffset.UtcNow.Subtract(new TimeSpan(0, 15, 0)),
+                    ExpiresOn = DateTimeOffset.UtcNow.Add(new TimeSpan(36135, 0, 0, 0)),
+                    BlobContainerName = containerName
+                };
 
 
+                blobSasBuilder.SetPermissions(blobContainerSasPermissions);
+                var sskc = new StorageSharedKeyCredential(accountname, accountkey);
+                BlobSasQueryParameters sasQueryParameters = blobSasBuilder.ToSasQueryParameters(sskc);
+                UriBuilder fullUri = new UriBuilder()
+                {
+                    Scheme = "https",
+                    Host = $"{accountname}.blob.{endpoint}",
+                    Path = containerName
+                    //Query = sasQueryParameters.ToString()
+                };
+
+                return (fullUri.Uri.ToString(), sasQueryParameters.ToString());
+            }
+            catch
+            {
+                return (null, null);
+            }
+        }
         /// <summary>
         /// <summary>
         /// 取得Blob Container SAS (有效期預設一天)
         /// 取得Blob Container SAS (有效期預設一天)
         /// </summary>
         /// </summary>

+ 1 - 0
TEAMModelOS.SDK/DI/AzureStorage/AzureStorageTableExtensions.cs

@@ -9,6 +9,7 @@ using System.Threading.Tasks;
 using System.Linq;
 using System.Linq;
 using TEAMModelOS.SDK;
 using TEAMModelOS.SDK;
 using System.Reflection;
 using System.Reflection;
+using HTEXLib.COMM.Helpers;
 
 
 namespace TEAMModelOS.SDK.DI
 namespace TEAMModelOS.SDK.DI
 {
 {

+ 3 - 2
TEAMModelOS.SDK/Extension/JwtAuthExtension.cs

@@ -14,7 +14,7 @@ namespace TEAMModelOS.SDK.Extension
 {
 {
     public static class JwtAuthExtension
     public static class JwtAuthExtension
     {
     {
-        public static string CreateAuthToken(string issuer, string id,string name,string picture, string salt, string schoolID = "", string[] roles = null, string[] permissions = null, int expire = 1)
+        public static string CreateAuthToken(string issuer, string id,string name,string picture, string salt, string schoolID = "",string standard="", string[] roles = null, string[] permissions = null, int expire = 1)
         {
         {
             // 設定要加入到 JWT Token 中的聲明資訊(Claims)  
             // 設定要加入到 JWT Token 中的聲明資訊(Claims)  
             var payload = new JwtPayload {
             var payload = new JwtPayload {
@@ -25,7 +25,8 @@ namespace TEAMModelOS.SDK.Extension
                 { "name",name}, // 用戶的顯示名稱
                 { "name",name}, // 用戶的顯示名稱
                 { "picture",picture}, // 用戶頭像
                 { "picture",picture}, // 用戶頭像
                 { "roles",roles}, // 登入者的角色,角色類型 (Admin、Teacher、Student) 
                 { "roles",roles}, // 登入者的角色,角色類型 (Admin、Teacher、Student) 
-                { "permissions",permissions} //登入者的權限請求
+                { "permissions",permissions}, //登入者的權限請求
+                { "standard",standard} //登入者的權限請求
             };
             };
 
 
             // 建立一組對稱式加密的金鑰,主要用於 JWT 簽章之用
             // 建立一組對稱式加密的金鑰,主要用於 JWT 簽章之用

+ 0 - 28
TEAMModelOS.SDK/Helper/Common/CollectionHelper/CollectionHelper.cs

@@ -1,28 +0,0 @@
-using System;
-using System.Collections;
-using System.Collections.Generic;
-
-using System.Text;
-
-namespace TEAMModelOS.SDK
-{
-    public static class CollectionHelper
-    {
-        /// <summary>
-        /// 判断集合是否不为空
-        /// </summary>
-        /// <param name="collection"></param>
-        /// <returns></returns>
-        public static bool IsNotEmpty(this ICollection collection)
-        {
-            if (collection != null && collection.Count > 0)
-            {
-                return true;
-            }
-            else
-            {
-                return false;
-            }
-        }
-    }
-}

+ 1 - 0
TEAMModelOS.SDK/Models/Cosmos/School/Area.cs

@@ -16,5 +16,6 @@ namespace TEAMModelOS.SDK.Models
         public string provName { get; set; }
         public string provName { get; set; }
         public string cityCode { get; set; }
         public string cityCode { get; set; }
         public string cityName { get; set; }
         public string cityName { get; set; }
+        public string standard { get; set; }
     }
     }
 }
 }

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

@@ -71,7 +71,7 @@ namespace TEAMModelOS.SDK.Models
         /// 1 普教,2 高职教
         /// 1 普教,2 高职教
         /// </summary>
         /// </summary>
         public int type { get; set; }
         public int type { get; set; }
-      
+        public string standard { get; set; } 
 
 
     }
     }
     /// <summary>
     /// <summary>

+ 2 - 1
TEAMModelOS.SDK/Models/Cosmos/Student/TmdUser.cs

@@ -1,8 +1,9 @@
 using System;
 using System;
 using System.Collections.Generic;
 using System.Collections.Generic;
 using System.Text;
 using System.Text;
+using TEAMModelOS.SDK.Models;
 
 
-namespace TEAMModelOS.SDK.Models
+namespace TEAMModelOS.SDK
 {
 {
     public class TmdUser : CosmosEntity
     public class TmdUser : CosmosEntity
     {
     {

+ 1 - 0
TEAMModelOS.SDK/Models/Service/FixDataService.cs

@@ -10,6 +10,7 @@ using System.Threading.Tasks;
 using TEAMModelOS.SDK.DI;
 using TEAMModelOS.SDK.DI;
 using TEAMModelOS.SDK.Extension;
 using TEAMModelOS.SDK.Extension;
 using TEAMModelOS.SDK;
 using TEAMModelOS.SDK;
+using HTEXLib.COMM.Helpers;
 
 
 namespace TEAMModelOS.SDK.Models.Service
 namespace TEAMModelOS.SDK.Models.Service
 {
 {

+ 8 - 7
TEAMModelOS.SDK/Models/Service/StuListService.cs

@@ -11,6 +11,7 @@ using TEAMModelOS.SDK;
 using TEAMModelOS.SDK.Models;
 using TEAMModelOS.SDK.Models;
 using TEAMModelOS.SDK.Models.Cosmos.Common;
 using TEAMModelOS.SDK.Models.Cosmos.Common;
 using TEAMModelOS.SDK.Models.Service;
 using TEAMModelOS.SDK.Models.Service;
+using HTEXLib.COMM.Helpers;
 
 
 namespace TEAMModelFunction
 namespace TEAMModelFunction
 {
 {
@@ -22,7 +23,7 @@ namespace TEAMModelFunction
             try
             try
             {
             {
                 var query = $"SELECT distinct c.owner, c.id,c.code, c.classes,c.stuLists,c.subjects,c.progress,c.scope,c.startTime,c.school,c.creatorId,c.name,c.pk ,c.endTime   FROM c  where  c.pk='{type}' " +
                 var query = $"SELECT distinct c.owner, c.id,c.code, c.classes,c.stuLists,c.subjects,c.progress,c.scope,c.startTime,c.school,c.creatorId,c.name,c.pk ,c.endTime   FROM c  where  c.pk='{type}' " +
-                    $" and (( array_contains(c.classes,'{stuListChange.listid}')) or ( array_contains(c.teachclasses,'{stuListChange.listid}')))";
+                    $" and (( array_contains(c.classes,'{stuListChange.listid}')) or ( array_contains(c.stuLists,'{stuListChange.listid}')))";
                     //$"and A1 in('{stuListChange.listid}') ";
                     //$"and A1 in('{stuListChange.listid}') ";
                 List<MQActivity> datas = new List<MQActivity>();
                 List<MQActivity> datas = new List<MQActivity>();
                 if (stuListChange.scope.Equals("school", StringComparison.OrdinalIgnoreCase) && !string.IsNullOrEmpty(stuListChange.school)) {
                 if (stuListChange.scope.Equals("school", StringComparison.OrdinalIgnoreCase) && !string.IsNullOrEmpty(stuListChange.school)) {
@@ -41,7 +42,7 @@ namespace TEAMModelFunction
                     foreach (var techer in teachers) {
                     foreach (var techer in teachers) {
                         var queryTech = $"SELECT distinct c.owner, c.id,c.code, c.classes,c.stuLists,c.subjects,c.progress,c.scope,c.startTime,c.school,c.creatorId,c.name,c.pk ,c.endTime   FROM c " +
                         var queryTech = $"SELECT distinct c.owner, c.id,c.code, c.classes,c.stuLists,c.subjects,c.progress,c.scope,c.startTime,c.school,c.creatorId,c.name,c.pk ,c.endTime   FROM c " +
                             $" where c.school='{stuListChange.school}'   and   c.pk='{type}'" +
                             $" where c.school='{stuListChange.school}'   and   c.pk='{type}'" +
-                            $" and (( array_contains(c.classes,'{stuListChange.listid}')) or ( array_contains(c.teachclasses,'{stuListChange.listid}')))";
+                            $" and (( array_contains(c.classes,'{stuListChange.listid}')) or ( array_contains(c.stuLists,'{stuListChange.listid}')))";
                       //  $" and A1 in('{stuListChange.listid}') ";
                       //  $" and A1 in('{stuListChange.listid}') ";
                         await foreach (var item in client.GetContainer("TEAMModelOS", "Common").GetItemQueryIterator<MQActivity>(queryText: queryTech,
                         await foreach (var item in client.GetContainer("TEAMModelOS", "Common").GetItemQueryIterator<MQActivity>(queryText: queryTech,
                             requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"{type}-{techer.id}") }))
                             requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"{type}-{techer.id}") }))
@@ -116,14 +117,14 @@ namespace TEAMModelFunction
                             classIds = classes
                             classIds = classes
                         }; 
                         }; 
                         await _dingDing.SendBotMsg($"{Environment.GetEnvironmentVariable("Option:Location")}-StuListService-FixActivity\n名单发生变更 新建活动中间表\n{stucourse.ToJsonString()}", GroupNames.醍摩豆服務運維群組);
                         await _dingDing.SendBotMsg($"{Environment.GetEnvironmentVariable("Option:Location")}-StuListService-FixActivity\n名单发生变更 新建活动中间表\n{stucourse.ToJsonString()}", GroupNames.醍摩豆服務運維群組);
-                        await client.GetContainer("TEAMModelOS", "Teacher").UpsertItemAsync(stucourse, new PartitionKey(stucourse.code));
+                        await client.GetContainer("TEAMModelOS", "Student").UpsertItemAsync(stucourse, new PartitionKey(stucourse.code));
                     }
                     }
                     foreach (Students students in stuListChange.stuleave)
                     foreach (Students students in stuListChange.stuleave)
                     {
                     {
                         try
                         try
                         {
                         {
 
 
-                            await client.GetContainer("TEAMModelOS", "Teacher").DeleteItemAsync<StuActivity>(activity.id, new PartitionKey($"Activity-{students.code.Replace("Base-", "")}-{students.id}"));
+                            await client.GetContainer("TEAMModelOS", "Student").DeleteItemAsync<StuActivity>(activity.id, new PartitionKey($"Activity-{students.code.Replace("Base-", "")}-{students.id}"));
                         }
                         }
                         catch (CosmosException ex)
                         catch (CosmosException ex)
                         {
                         {
@@ -135,7 +136,7 @@ namespace TEAMModelFunction
                         try
                         try
                         {
                         {
 
 
-                            await client.GetContainer("TEAMModelOS", "Teacher").DeleteItemAsync<StuActivity>(activity.id, new PartitionKey($"Activity-{tmdid}"));
+                            await client.GetContainer("TEAMModelOS", "Student").DeleteItemAsync<StuActivity>(activity.id, new PartitionKey($"Activity-{tmdid}"));
                         }
                         }
                         catch(CosmosException ex )
                         catch(CosmosException ex )
                         {
                         {
@@ -210,7 +211,7 @@ namespace TEAMModelFunction
                         createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
                         createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
                     };
                     };
                     await _dingDing.SendBotMsg($"{Environment.GetEnvironmentVariable("Option:Location")}-StuListService-FixStuCourse\n名单发生变更 新建课程中间表\n{stucourse.ToJsonString()}", GroupNames.醍摩豆服務運維群組);
                     await _dingDing.SendBotMsg($"{Environment.GetEnvironmentVariable("Option:Location")}-StuListService-FixStuCourse\n名单发生变更 新建课程中间表\n{stucourse.ToJsonString()}", GroupNames.醍摩豆服務運維群組);
-                    await client.GetContainer("TEAMModelOS", "Teacher").UpsertItemAsync(stucourse, new PartitionKey(stucourse.code));
+                    await client.GetContainer("TEAMModelOS", "Student").UpsertItemAsync(stucourse, new PartitionKey(stucourse.code));
                 }
                 }
                 //移除名单的。 在点击相关的课程,再去二次校验是否存在,不存在则再去删除。
                 //移除名单的。 在点击相关的课程,再去二次校验是否存在,不存在则再去删除。
                 foreach (var delStu in stuListChange.stuleave)
                 foreach (var delStu in stuListChange.stuleave)
@@ -219,7 +220,7 @@ namespace TEAMModelFunction
                 }
                 }
                 foreach (var delTmd in stuListChange.tmdhleave)
                 foreach (var delTmd in stuListChange.tmdhleave)
                 {
                 {
-                    await client.GetContainer("TEAMModelOS", "Teacher").DeleteItemStreamAsync(course.id, new PartitionKey($"Course-{delTmd}"));
+                    await client.GetContainer("TEAMModelOS", "Student").DeleteItemStreamAsync(course.id, new PartitionKey($"Course-{delTmd}"));
                 }
                 }
             }
             }
         }
         }

+ 63 - 0
TEAMModelOS.SDK/Models/Service/TmdUserService.cs

@@ -0,0 +1,63 @@
+using Azure.Cosmos;
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Threading.Tasks;
+using TEAMModelOS.SDK.DI;
+using TEAMModelOS.SDK.Models;
+
+namespace TEAMModelOS.SDK
+{
+    public class TmdUserService
+    {
+        public static async Task<TmdUser> JoinSchool(CosmosClient client, string tmdid,string picture,string name , string schoolId, string schoolName) {
+            TmdUser tmdUser = null;
+            try {
+                tmdUser= await client.GetContainer(Constant.TEAMModelOS, "Student").ReadItemAsync<TmdUser>(tmdid, partitionKey: new PartitionKey("Base"));
+                tmdUser.picture = string.IsNullOrEmpty(picture) ? picture:tmdUser.picture;
+                tmdUser.name = string.IsNullOrEmpty(name) ? name : tmdUser.name;
+                var school= tmdUser.schools.Find(x => x.schoolId.Equals(schoolId));
+                if (school == null)
+                {
+
+                    tmdUser.schools.Add(new TmdUser.School { schoolId = schoolId, name = schoolName, status = "join", time = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() });
+                    await client.GetContainer(Constant.TEAMModelOS, "Student").ReplaceItemAsync<TmdUser>(tmdUser, tmdid, partitionKey: new PartitionKey("Base"));
+                }
+                else {
+                    school.name = schoolName;
+                    await client.GetContainer(Constant.TEAMModelOS, "Student").ReplaceItemAsync<TmdUser>(tmdUser, tmdid, partitionKey: new PartitionKey("Base"));
+                }
+            } catch (CosmosException ex) {
+                if (ex.Status == 404) {
+                    tmdUser = new TmdUser()
+                    {
+                        id = tmdid,
+                        code = "Base",
+                        schools = new List<TmdUser.School>() { 
+                            new TmdUser.School { 
+                                schoolId = schoolId, status = "join", name = schoolName, time = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
+                            } 
+                        },
+                        defaultSchool=schoolId,
+                        picture=picture,
+                        name=name,
+                        ttl=-1
+                    };
+                    await client.GetContainer(Constant.TEAMModelOS, "Student").CreateItemAsync(tmdUser, partitionKey: new PartitionKey(tmdUser.code));
+                }
+            }
+            return tmdUser;
+        }
+        public static async Task<TmdUser> LeaveSchool(CosmosClient client, string tmdid, string schoolId)
+        {
+            TmdUser tmdUser = await client.GetContainer(Constant.TEAMModelOS, "Student").ReadItemAsync<TmdUser>(tmdid, partitionKey: new PartitionKey("Base"));
+            var school = tmdUser.schools.Find(x => x.schoolId.Equals(schoolId));
+            if (school != null)
+            {
+                tmdUser.schools.Remove(school);
+                await client.GetContainer(Constant.TEAMModelOS, "Student").ReplaceItemAsync<TmdUser>(tmdUser, tmdid, partitionKey: new PartitionKey("Base"));
+            }
+            return tmdUser;
+        }
+    }
+}

+ 6 - 4
TEAMModelOS.SDK/Models/Service/TriggerStuActivity.cs

@@ -13,6 +13,7 @@ using TEAMModelOS.SDK;
 using TEAMModelOS.SDK.Models;
 using TEAMModelOS.SDK.Models;
 using TEAMModelOS.SDK.Models.Cosmos.Common;
 using TEAMModelOS.SDK.Models.Cosmos.Common;
 using TEAMModelOS.SDK.Models.Service;
 using TEAMModelOS.SDK.Models.Service;
+using HTEXLib.COMM.Helpers;
 
 
 namespace TEAMModelFunction
 namespace TEAMModelFunction
 {
 {
@@ -58,7 +59,7 @@ namespace TEAMModelFunction
                             taskStatus = -1,
                             taskStatus = -1,
                             classIds = classes
                             classIds = classes
                         };
                         };
-                        await client.GetContainer("TEAMModelOS", "Teacher").UpsertItemAsync(stucourse, new PartitionKey(stucourse.code));
+                        await client.GetContainer(Constant.TEAMModelOS, "Student").UpsertItemAsync(stucourse, new PartitionKey(stucourse.code));
                     }
                     }
                 }
                 }
                 if (students.IsNotEmpty())
                 if (students.IsNotEmpty())
@@ -104,7 +105,7 @@ namespace TEAMModelFunction
                 {
                 {
                     foreach (var x in tmdActivities)
                     foreach (var x in tmdActivities)
                     {
                     {
-                        await client.GetContainer("TEAMModelOS", "Teacher").UpsertItemAsync(x, new PartitionKey(x.code));
+                        await client.GetContainer("TEAMModelOS", "Student").UpsertItemAsync(x, new PartitionKey(x.code));
                     }
                     }
                 }
                 }
             } catch (Exception ex) {
             } catch (Exception ex) {
@@ -229,7 +230,7 @@ namespace TEAMModelFunction
                     tmdids.ForEach(x => { inids.Add($"'{x}'"); });
                     tmdids.ForEach(x => { inids.Add($"'{x}'"); });
                     var insql = string.Join(",", inids);
                     var insql = string.Join(",", inids);
                     var queryslt = $"SELECT  value(c) FROM c where c.id in ({insql})";
                     var queryslt = $"SELECT  value(c) FROM c where c.id in ({insql})";
-                    await foreach (var item in client.GetContainer("TEAMModelOS", "Teacher").GetItemQueryIterator<TmdInfo>(queryText: queryslt, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Base") }))
+                    await foreach (var item in client.GetContainer("TEAMModelOS", "Student").GetItemQueryIterator<TmdInfo>(queryText: queryslt, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Base") }))
                     {
                     {
                         infos.Add(item);
                         infos.Add(item);
                     }
                     }
@@ -393,7 +394,8 @@ namespace TEAMModelFunction
                     tmdids.ForEach(x => { inids.Add($"'{x}'"); });
                     tmdids.ForEach(x => { inids.Add($"'{x}'"); });
                     var insql = string.Join(",", inids);
                     var insql = string.Join(",", inids);
                     var queryslt = $"SELECT  value(c) FROM c where c.id in ({insql})";
                     var queryslt = $"SELECT  value(c) FROM c where c.id in ({insql})";
-                    await foreach (var item in client.GetContainer("TEAMModelOS", "Teacher").GetItemQueryIterator<TmdInfo>(queryText: queryslt, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Base") }))
+                    //合并代码/
+                    await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Student").GetItemQueryIterator<TmdInfo>(queryText: queryslt, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Base") }))
                     {
                     {
                         infos.Add(item);
                         infos.Add(item);
                     }
                     }

+ 1 - 0
TEAMModelOS.SDK/TEAMModelOS.SDK.csproj

@@ -11,6 +11,7 @@
 
 
 
 
   <ItemGroup>
   <ItemGroup>
+    <PackageReference Include="HTEXLib" Version="5.2108.19" />
     <PackageReference Include="AspectCore.Extensions.Reflection" Version="2.2.0" />
     <PackageReference Include="AspectCore.Extensions.Reflection" Version="2.2.0" />
     <PackageReference Include="Azure.Cosmos" Version="4.0.0-preview3" />
     <PackageReference Include="Azure.Cosmos" Version="4.0.0-preview3" />
     <PackageReference Include="Azure.Identity" Version="1.4.0" />
     <PackageReference Include="Azure.Identity" Version="1.4.0" />

+ 2 - 0
TEAMModelOS/ClientApp/package.json

@@ -52,6 +52,8 @@
 		"oidc-client": "^1.9.1",
 		"oidc-client": "^1.9.1",
 		"print-js": "^1.6.0",
 		"print-js": "^1.6.0",
 		"qrcodejs2": "0.0.2",
 		"qrcodejs2": "0.0.2",
+		"rtf-parser": "^1.3.3",
+		"rtf.js": "^3.0.7",
 		"snapsvg": "^0.5.1",
 		"snapsvg": "^0.5.1",
 		"svg-sprite-loader": "^5.0.0",
 		"svg-sprite-loader": "^5.0.0",
 		"unsplash-js": "^6.0.0",
 		"unsplash-js": "^6.0.0",

+ 12 - 1
TEAMModelOS/ClientApp/src/api/stuAccount.js

@@ -10,7 +10,7 @@ export default {
     format.students.push(...data)
     format.students.push(...data)
     return post('/student/student-manage', format)
     return post('/student/student-manage', format)
   },
   },
-  //��ѯѧ��
+  //查询
   findStudent: function(schoolId) {
   findStudent: function(schoolId) {
     let format = {
     let format = {
       grant_type: 'read',
       grant_type: 'read',
@@ -18,6 +18,7 @@ export default {
     }
     }
     return post('/student/student-manage', format)
     return post('/student/student-manage', format)
   },
   },
+  //更新学生信息
   saveAllStudent: function(schoolId, data) {
   saveAllStudent: function(schoolId, data) {
     let format = {
     let format = {
       grant_type: 'update',
       grant_type: 'update',
@@ -27,6 +28,16 @@ export default {
     format.students.push(...data)
     format.students.push(...data)
     return post('/student/student-manage', format)
     return post('/student/student-manage', format)
   },
   },
+  //设置学生头像
+  setStudentAvatar: function(schoolId, data) {
+    let format = {
+      grant_type: 'avatar',
+      schoolId: schoolId,
+      avatar: []
+    }
+    format.avatar.push(...data)
+    return post('/student/student-manage', format)
+  },
   /**
   /**
    * 刪除學生
    * 刪除學生
    * @param {any} data
    * @param {any} data

+ 26 - 3
TEAMModelOS/ClientApp/src/assets/iconfont/demo_index.html

@@ -54,6 +54,12 @@
       <div class="content unicode" style="display: block;">
       <div class="content unicode" style="display: block;">
           <ul class="icon_lists dib-box">
           <ul class="icon_lists dib-box">
           
           
+            <li class="dib">
+              <span class="icon iconfont">&#xe64f;</span>
+                <div class="name">公告</div>
+                <div class="code-name">&amp;#xe64f;</div>
+              </li>
+          
             <li class="dib">
             <li class="dib">
               <span class="icon iconfont">&#xe648;</span>
               <span class="icon iconfont">&#xe648;</span>
                 <div class="name">文档</div>
                 <div class="name">文档</div>
@@ -906,9 +912,9 @@
 <pre><code class="language-css"
 <pre><code class="language-css"
 >@font-face {
 >@font-face {
   font-family: 'iconfont';
   font-family: 'iconfont';
-  src: url('iconfont.woff2?t=1628756740623') format('woff2'),
-       url('iconfont.woff?t=1628756740623') format('woff'),
-       url('iconfont.ttf?t=1628756740623') format('truetype');
+  src: url('iconfont.woff2?t=1629253044790') format('woff2'),
+       url('iconfont.woff?t=1629253044790') format('woff'),
+       url('iconfont.ttf?t=1629253044790') format('truetype');
 }
 }
 </code></pre>
 </code></pre>
           <h3 id="-iconfont-">第二步:定义使用 iconfont 的样式</h3>
           <h3 id="-iconfont-">第二步:定义使用 iconfont 的样式</h3>
@@ -934,6 +940,15 @@
       <div class="content font-class">
       <div class="content font-class">
         <ul class="icon_lists dib-box">
         <ul class="icon_lists dib-box">
           
           
+          <li class="dib">
+            <span class="icon iconfont icon-notify"></span>
+            <div class="name">
+              公告
+            </div>
+            <div class="code-name">.icon-notify
+            </div>
+          </li>
+          
           <li class="dib">
           <li class="dib">
             <span class="icon iconfont icon-document"></span>
             <span class="icon iconfont icon-document"></span>
             <div class="name">
             <div class="name">
@@ -2212,6 +2227,14 @@
       <div class="content symbol">
       <div class="content symbol">
           <ul class="icon_lists dib-box">
           <ul class="icon_lists dib-box">
           
           
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-notify"></use>
+                </svg>
+                <div class="name">公告</div>
+                <div class="code-name">#icon-notify</div>
+            </li>
+          
             <li class="dib">
             <li class="dib">
                 <svg class="icon svg-icon" aria-hidden="true">
                 <svg class="icon svg-icon" aria-hidden="true">
                   <use xlink:href="#icon-document"></use>
                   <use xlink:href="#icon-document"></use>

+ 7 - 3
TEAMModelOS/ClientApp/src/assets/iconfont/iconfont.css

@@ -1,8 +1,8 @@
 @font-face {
 @font-face {
   font-family: "iconfont"; /* Project id 2000444 */
   font-family: "iconfont"; /* Project id 2000444 */
-  src: url('iconfont.woff2?t=1628756740623') format('woff2'),
-       url('iconfont.woff?t=1628756740623') format('woff'),
-       url('iconfont.ttf?t=1628756740623') format('truetype');
+  src: url('iconfont.woff2?t=1629253044790') format('woff2'),
+       url('iconfont.woff?t=1629253044790') format('woff'),
+       url('iconfont.ttf?t=1629253044790') format('truetype');
 }
 }
 
 
 .iconfont {
 .iconfont {
@@ -13,6 +13,10 @@
   -moz-osx-font-smoothing: grayscale;
   -moz-osx-font-smoothing: grayscale;
 }
 }
 
 
+.icon-notify:before {
+  content: "\e64f";
+}
+
 .icon-document:before {
 .icon-document:before {
   content: "\e648";
   content: "\e648";
 }
 }

A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 1 - 1
TEAMModelOS/ClientApp/src/assets/iconfont/iconfont.js


+ 7 - 0
TEAMModelOS/ClientApp/src/assets/iconfont/iconfont.json

@@ -5,6 +5,13 @@
   "css_prefix_text": "icon-",
   "css_prefix_text": "icon-",
   "description": "",
   "description": "",
   "glyphs": [
   "glyphs": [
+    {
+      "icon_id": "4437595",
+      "name": "公告",
+      "font_class": "notify",
+      "unicode": "e64f",
+      "unicode_decimal": 58959
+    },
     {
     {
       "icon_id": "554016",
       "icon_id": "554016",
       "name": "文档",
       "name": "文档",

BIN
TEAMModelOS/ClientApp/src/assets/iconfont/iconfont.ttf


BIN
TEAMModelOS/ClientApp/src/assets/iconfont/iconfont.woff


BIN
TEAMModelOS/ClientApp/src/assets/iconfont/iconfont.woff2


+ 1 - 1
TEAMModelOS/ClientApp/src/assets/student-web/component_styles/app-nav.css

@@ -210,7 +210,7 @@
 .myNav .avatar-link {
 .myNav .avatar-link {
   float: right;
   float: right;
   top: 10px;
   top: 10px;
-  margin: 0px 10px 0 20px;
+  margin: 0px 25px 0 25px;
   cursor: pointer;
   cursor: pointer;
 }
 }
 .myNav .ivu-avatar.ivu-avatar-circle.ivu-avatar-image.ivu-avatar-default {
 .myNav .ivu-avatar.ivu-avatar-circle.ivu-avatar-image.ivu-avatar-default {

+ 1 - 1
TEAMModelOS/ClientApp/src/assets/student-web/component_styles/app-nav.less

@@ -219,7 +219,7 @@
   .avatar-link {
   .avatar-link {
     float: right;
     float: right;
     top: 10px;
     top: 10px;
-    margin: 0px 10px 0 20px;
+    margin: 0px 25px 0 25px;
     // margin-right: 48px;
     // margin-right: 48px;
     cursor: pointer;
     cursor: pointer;
   }
   }

+ 35 - 12
TEAMModelOS/ClientApp/src/assets/student-web/component_styles/home-view.css

@@ -5,7 +5,7 @@
 .home-view {
 .home-view {
   padding: 1.875rem;
   padding: 1.875rem;
   padding-bottom: 56px;
   padding-bottom: 56px;
-  min-height: 95vh;
+  min-height: 93vh;
 }
 }
 .home-view .title {
 .home-view .title {
   position: relative;
   position: relative;
@@ -187,23 +187,46 @@
 .home-view .calenderCard .title-rect-name {
 .home-view .calenderCard .title-rect-name {
   color: #515a6e;
   color: #515a6e;
 }
 }
-.home-view .calenderCard .classtitle {
+.home-view .calenderCard .remind-course {
+  margin: 0px -28px 20px -28px;
+}
+.home-view .calenderCard .remind-course .no-data {
+  height: 5vh;
+}
+.home-view .calenderCard .remind-course .list-one {
+  border-bottom: 1px solid #E8EAEC;
+  padding: 15px 20px 15px 30px;
+  overflow: hidden;
+}
+.home-view .calenderCard .remind-course .list-one:hover {
+  background: linear-gradient(-0.75turn, #fafafa, #d4ede1);
+  cursor: pointer;
+}
+.home-view .calenderCard .remind-course .list-one .classtitle {
   font-size: 18px;
   font-size: 18px;
-  /*font-family: Arial Rounded MT Bold;*/
-  margin-top: 18px;
   animation: fadein 1s;
   animation: fadein 1s;
   color: #515a6e;
   color: #515a6e;
+  font-weight: bold;
 }
 }
-.home-view .calenderCard .time {
-  margin-top: 18px;
-  color: #24b880;
-  font-size: 18px;
+.home-view .calenderCard .remind-course .list-one .classtitle > span {
+  width: 10px;
+  height: 10px;
+  border-radius: 10px;
+  background-color: #24B880;
+  display: inline-block;
+}
+.home-view .calenderCard .remind-course .list-one .classtitle > p {
+  font-size: 16px;
+  color: #515a6e;
+  float: right;
+}
+.home-view .calenderCard .remind-course .list-one .time {
+  margin-top: 10px;
+  font-size: 16px;
   animation: fadein 1.5s;
   animation: fadein 1.5s;
 }
 }
-.home-view .calenderCard .place {
-  color: #24b880;
-  font-size: 18px;
-  margin-bottom: 40px;
+.home-view .calenderCard .remind-course .list-one .place {
+  font-size: 16px;
   animation: fadein 2s;
   animation: fadein 2s;
 }
 }
 @media screen and (max-width: 1280px) and (min-width: 992px) {
 @media screen and (max-width: 1280px) and (min-width: 992px) {

+ 50 - 19
TEAMModelOS/ClientApp/src/assets/student-web/component_styles/home-view.less

@@ -3,7 +3,7 @@
 .home-view {
 .home-view {
   padding: 1.875rem;
   padding: 1.875rem;
   padding-bottom: 56px;
   padding-bottom: 56px;
-  min-height: 95vh;
+  min-height: 93vh;
 
 
   .title {
   .title {
     position: relative;
     position: relative;
@@ -190,25 +190,56 @@
     .title-rect-name {
     .title-rect-name {
       color: #515a6e;
       color: #515a6e;
     }
     }
-    .classtitle {
-      font-size: 18px;
-      /*font-family: Arial Rounded MT Bold;*/
-      margin-top: 18px;
-      animation: fadein 1s;
-      color: #515a6e;
-    }
-    .time {
-      margin-top: 18px;
-      color: #24b880;
-      font-size: 18px;
-      animation: fadein 1.5s;
-    }
-    .place {
-      color: #24b880;
-      font-size: 18px;
-      margin-bottom: 40px;
-      animation: fadein 2s;
+    .remind-course{
+      margin: 0px -28px 20px -28px;
+
+      .no-data{
+        height: 5vh;
+      }
+      
+      .list-one{
+        border-bottom: 1px solid #E8EAEC;
+        padding: 15px 20px 15px 30px;
+        overflow: hidden;
+
+        &:hover {
+          background: linear-gradient(-0.75turn, #fafafa, #d4ede1);
+          // color: #03966a;
+          cursor: pointer;
+        }
+
+        .classtitle {
+          font-size: 18px;
+          // margin-top: 18px;
+          animation: fadein 1s;
+          color: #515a6e;
+          font-weight: bold;
+    
+          & > span{
+            width: 10px;
+            height: 10px;
+            border-radius: 10px;
+            background-color: #24B880;
+            display: inline-block;
+          }
+          & > p{
+            font-size: 16px;
+            color: #515a6e;
+            float: right;
+          }
+        }
+        .time {
+          margin-top: 10px;
+          font-size: 16px;
+          animation: fadein 1.5s;
+        }
+        .place {
+          font-size: 16px;
+          animation: fadein 2s;
+        }
+      }
     }
     }
+    
     @media screen and (max-width: 1280px) and (min-width: 992px) {
     @media screen and (max-width: 1280px) and (min-width: 992px) {
       .classtitle,
       .classtitle,
       .time,
       .time,

+ 46 - 19
TEAMModelOS/ClientApp/src/common/BaseLayout.vue

@@ -32,7 +32,7 @@
                                         <Icon v-show="!isCollapsed" :custom="item.icon" :class="isCollapsed ? 'collapse-icon-size':''" size="16" />
                                         <Icon v-show="!isCollapsed" :custom="item.icon" :class="isCollapsed ? 'collapse-icon-size':''" size="16" />
                                         <span>{{item.name}}</span>
                                         <span>{{item.name}}</span>
                                     </template>
                                     </template>
-                                    <MenuItem :name="menuItem.menuName" :to="menuItem.router" v-for="(menuItem,i) in item.child" :key="i" v-show="$access.ability(menuItem.role,menuItem.permission).validateAll">
+                                    <MenuItem :name="menuItem.menuName" :to="menuItem.router" v-for="(menuItem,i) in item.child" :key="i" v-show="$access.ability(menuItem.role,menuItem.permission).validateAll && menuItem.isShow">
                                     <Tooltip :content="menuItem.name" placement="right" transfer v-show="isCollapsed">
                                     <Tooltip :content="menuItem.name" placement="right" transfer v-show="isCollapsed">
                                         <Icon class="sub-menu-icon" :custom="menuItem.icon" size="16" />
                                         <Icon class="sub-menu-icon" :custom="menuItem.icon" size="16" />
                                     </Tooltip>
                                     </Tooltip>
@@ -48,7 +48,7 @@
                                     </span>
                                     </span>
                                     </MenuItem>
                                     </MenuItem>
                                 </Submenu>
                                 </Submenu>
-                                <MenuItem :name="item.menuName" v-else-if="$access.ability(item.role,item.permission).validateAll" :to="item.router">
+                                <MenuItem :name="item.menuName" v-else-if="$access.ability(item.role,item.permission).validateAll && item.isShow" :to="item.router">
                                 <Tooltip :content="item.name" placement="right" transfer v-show="isCollapsed">
                                 <Tooltip :content="item.name" placement="right" transfer v-show="isCollapsed">
                                     <Icon :custom="item.icon" style="width:55px;text-align:left;" :class="isCollapsed ? 'collapse-icon-size':''" size="16" />
                                     <Icon :custom="item.icon" style="width:55px;text-align:left;" :class="isCollapsed ? 'collapse-icon-size':''" size="16" />
                                 </Tooltip>
                                 </Tooltip>
@@ -163,7 +163,8 @@ export default {
                             tag: '',
                             tag: '',
                             role: 'admin',
                             role: 'admin',
                             permission: 'schoolSetting-read|schoolSetting-upd',
                             permission: 'schoolSetting-read|schoolSetting-upd',
-                            menuName: 'system'
+                            menuName: 'system',
+                            isShow: true
                         },
                         },
                         // 教师管理
                         // 教师管理
                         {
                         {
@@ -173,7 +174,8 @@ export default {
                             tag: '',
                             tag: '',
                             role: 'admin',
                             role: 'admin',
                             permission: 'teacher-read|teacher-upd',
                             permission: 'teacher-read|teacher-upd',
-                            menuName: 'teachermgmt'
+                            menuName: 'teachermgmt',
+                            isShow: true
                         },
                         },
                         // 学生管理
                         // 学生管理
                         {
                         {
@@ -183,7 +185,8 @@ export default {
                             tag: '',
                             tag: '',
                             role: 'admin',
                             role: 'admin',
                             permission: 'student-upd|student-read',
                             permission: 'student-upd|student-read',
-                            menuName: 'studentAccount'
+                            menuName: 'studentAccount',
+                            isShow: true
                         },
                         },
                         // // 教室管理
                         // // 教室管理
                         {
                         {
@@ -193,7 +196,8 @@ export default {
                             tag: '',
                             tag: '',
                             role: 'admin',
                             role: 'admin',
                             permission: 'classroom-upd|classroom-read',
                             permission: 'classroom-upd|classroom-read',
-                            menuName: 'classroom'
+                            menuName: 'classroom',
+                            isShow: true
                         },
                         },
                         // 课程管理
                         // 课程管理
                         {
                         {
@@ -203,7 +207,19 @@ export default {
                             tag: '',
                             tag: '',
                             role: 'admin',
                             role: 'admin',
                             permission: 'course-read|course-upd',
                             permission: 'course-read|course-upd',
-                            menuName: 'NewCusMgt'
+                            menuName: 'NewCusMgt',
+                            isShow: true
+                        },
+                        // 学校公告
+                        {
+                            icon: 'iconfont icon-notify',
+                            name: this.$t('system.menu.schoolNotify'),
+                            router: '/home/schoolNotify',
+                            tag: '',
+                            role: 'admin',
+                            permission: 'notify-upd',
+                            menuName: 'schoolNotify',
+                            isShow: true
                         },
                         },
                         // 授权管理
                         // 授权管理
                         {
                         {
@@ -213,7 +229,8 @@ export default {
                             tag: this.$t('system.menu.preview'),
                             tag: this.$t('system.menu.preview'),
                             role: 'admin',
                             role: 'admin',
                             permission: 'auth-read|auth-upd',
                             permission: 'auth-read|auth-upd',
-                            menuName: 'serviceDriveAuth'
+                            menuName: 'serviceDriveAuth',
+                            isShow: process.env.NODE_ENV == 'development'
                         }
                         }
                     ]
                     ]
                 },
                 },
@@ -234,7 +251,8 @@ export default {
                             tag: '',
                             tag: '',
                             role: 'admin|teacher',
                             role: 'admin|teacher',
                             permission: 'syllabus-read|syllabus-upd',
                             permission: 'syllabus-read|syllabus-upd',
-                            menuName: 'syllabus'
+                            menuName: 'syllabus',
+                            isShow: true
                         },
                         },
                         // 校本内容
                         // 校本内容
                         {
                         {
@@ -244,7 +262,8 @@ export default {
                             tag: '',
                             tag: '',
                             role: 'admin|teacher',
                             role: 'admin|teacher',
                             permission: 'content-read|content-upd',
                             permission: 'content-read|content-upd',
-                            menuName: 'schoolcontent'
+                            menuName: 'schoolcontent',
+                            isShow: true
                         },
                         },
                         // 校本题库
                         // 校本题库
                         {
                         {
@@ -254,7 +273,8 @@ export default {
                             tag: '',
                             tag: '',
                             role: 'admin|teacher',
                             role: 'admin|teacher',
                             permission: 'exercise-read|exercise-upd',
                             permission: 'exercise-read|exercise-upd',
-                            menuName: 'schoolBank'
+                            menuName: 'schoolBank',
+                            isShow: true
                         },
                         },
                         // 知识点库
                         // 知识点库
                         {
                         {
@@ -265,7 +285,8 @@ export default {
                             role: 'admin|teacher',
                             role: 'admin|teacher',
                             permission: 'knowledge-read|knowledge-upd',
                             permission: 'knowledge-read|knowledge-upd',
                             menuName: 'knowledge',
                             menuName: 'knowledge',
-                            info: this.$t('tip.menuKlg')
+                            info: this.$t('tip.menuKlg'),
+                            isShow: true
                         }
                         }
                     ]
                     ]
                 },
                 },
@@ -285,7 +306,8 @@ export default {
                             tag: '',
                             tag: '',
                             role: 'admin',
                             role: 'admin',
                             permission: 'schoolAc-read|schoolAc-upd',
                             permission: 'schoolAc-read|schoolAc-upd',
-                            menuName: 'schoolEvaluation'
+                            menuName: 'schoolEvaluation',
+                            isShow: true
                         },
                         },
                         {
                         {
                             icon: 'iconfont icon-vote',
                             icon: 'iconfont icon-vote',
@@ -294,7 +316,8 @@ export default {
                             tag: '',
                             tag: '',
                             role: 'admin',
                             role: 'admin',
                             permission: 'schoolAc-read|schoolAc-upd',
                             permission: 'schoolAc-read|schoolAc-upd',
-                            menuName: 'manageVote'
+                            menuName: 'manageVote',
+                            isShow: true
                         },
                         },
                         {
                         {
                             icon: 'iconfont icon-questionnaire',
                             icon: 'iconfont icon-questionnaire',
@@ -303,7 +326,8 @@ export default {
                             tag: '',
                             tag: '',
                             role: 'admin',
                             role: 'admin',
                             permission: 'schoolAc-read|schoolAc-upd',
                             permission: 'schoolAc-read|schoolAc-upd',
-                            menuName: 'manageQuestionnaire'
+                            menuName: 'manageQuestionnaire',
+                            isShow: true
                         },
                         },
                     ]
                     ]
                 },
                 },
@@ -316,7 +340,8 @@ export default {
                     role: 'admin',
                     role: 'admin',
                     permission: 'analysis-read',
                     permission: 'analysis-read',
                     menuName: 'totalIndex',
                     menuName: 'totalIndex',
-                    child: []
+                    child: [],
+                    isShow: true
                 },
                 },
                 //开放平台
                 //开放平台
                 {
                 {
@@ -327,7 +352,8 @@ export default {
                     role: 'admin',
                     role: 'admin',
                     permission: '',
                     permission: '',
                     menuName: 'OpenPlat',
                     menuName: 'OpenPlat',
-                    child: []
+                    child: [],
+                    isShow: process.env.NODE_ENV == 'development'
                 }
                 }
             ] : []
             ] : []
             this.teacherMenu = [
             this.teacherMenu = [
@@ -470,7 +496,7 @@ export default {
                     permission: '',
                     permission: '',
                     child: [],
                     child: [],
                     menuName: 'taskList',
                     menuName: 'taskList',
-                    isShow: this.$store.state.userInfo.hasSchool,
+                    isShow: process.env.NODE_ENV == 'development' && this.$store.state.userInfo.hasSchool,
                     info: this.$t('tip.task')
                     info: this.$t('tip.task')
                 }
                 }
             ]
             ]
@@ -506,7 +532,7 @@ export default {
                                             color: 'red'
                                             color: 'red'
                                         }
                                         }
                                     }, [
                                     }, [
-                                        h('span', this.$t('home.verifyPh')+', '),
+                                        h('span', this.$t('home.verifyPh') + ', '),
                                         h('a', {
                                         h('a', {
                                             domProps: {
                                             domProps: {
                                                 innerHTML: this.$t('home.toPhone')
                                                 innerHTML: this.$t('home.toPhone')
@@ -558,6 +584,7 @@ export default {
         }
         }
     },
     },
     created() {
     created() {
+        console.log(process.env.NODE_ENV)
         this.initMenu()
         this.initMenu()
         let cloudSetting = localStorage.getItem('cloudSetting')
         let cloudSetting = localStorage.getItem('cloudSetting')
         if (cloudSetting) {
         if (cloudSetting) {

+ 1 - 1
TEAMModelOS/ClientApp/src/common/BaseMyCanvas.vue

@@ -57,7 +57,7 @@
 	</div>
 	</div>
 </template>
 </template>
 <script>
 <script>
-	import BaseCanvas from '@/view/task/mark/MarkCanvas.vue';
+	import BaseCanvas from '@/components/mark/MarkCanvas.vue';
 	export default {
 	export default {
 		components: {
 		components: {
 			BaseCanvas
 			BaseCanvas

+ 3 - 2
TEAMModelOS/ClientApp/src/common/BaseSelectSchool.vue

@@ -64,9 +64,10 @@
 				console.log(this.user.schools)
 				console.log(this.user.schools)
 				console.log(this.joinSchools)
 				console.log(this.joinSchools)
 				this.joinSchools = this.user.schools.filter(i => i.status === 'join')
 				this.joinSchools = this.user.schools.filter(i => i.status === 'join')
-				this.$EventBus.$emit('onGlobalLoading', true)
 				this.curSchool = this.joinSchools[val]
 				this.curSchool = this.joinSchools[val]
 				let schoolCode = this.joinSchools[val].schoolId
 				let schoolCode = this.joinSchools[val].schoolId
+				this.$EventBus.$emit('onGlobalLoading', true)
+				this.$EventBus.$emit('onChangeSchool',{ schoolCode:schoolCode })
 				// 更新当前school_code
 				// 更新当前school_code
 				this.$store.dispatch('user/setSchoolCode', schoolCode)
 				this.$store.dispatch('user/setSchoolCode', schoolCode)
 				// 更新当前school_profile以及access
 				// 更新当前school_profile以及access
@@ -107,7 +108,7 @@
 			// 解绑之前的事件 防止多次触发
 			// 解绑之前的事件 防止多次触发
 			this.$EventBus.$off('onChangeSchool')
 			this.$EventBus.$off('onChangeSchool')
 			this.$EventBus.$on('onChangeSchool', params => {
 			this.$EventBus.$on('onChangeSchool', params => {
-				if (params.schoolCode !== this.curSchool.schoolId) {
+				if (params.schoolCode !== this.curSchool.schoolId && params.user) {
 					console.log('检测到切换学校')
 					console.log('检测到切换学校')
 					console.log(params)
 					console.log(params)
 					this.user = params.user
 					this.user = params.user

+ 3 - 3
TEAMModelOS/ClientApp/src/components/coursemgt/StudentList.vue

@@ -235,16 +235,16 @@ export default {
                 let classesData = this.classes.filter(function (item) {
                 let classesData = this.classes.filter(function (item) {
                     return item.id == classId
                     return item.id == classId
                 })
                 })
-                return classesData[0].name
+                return classesData[0] ? classesData[0].name : ''
             } else {
             } else {
-                return '- -'
+                return '-'
             }
             }
         },
         },
         getFirstChart(name) {
         getFirstChart(name) {
             if (name) {
             if (name) {
                 return name.substr(0, 1)
                 return name.substr(0, 1)
             } else {
             } else {
-                return '--'
+                return '-'
             }
             }
         },
         },
     },
     },

+ 1 - 1
TEAMModelOS/ClientApp/src/components/evaluation/ExerciseList.vue

@@ -32,7 +32,7 @@
 					</div>
 					</div>
 				</div>
 				</div>
 				<div class="exercise-item-children" v-if="item.children.length">
 				<div class="exercise-item-children" v-if="item.children.length">
-					<BaseChild :children="item.children" :isShowAnalysis="isShowAnalysis" :analysisJson="getChildAnalysisJson(item)" :optionRate="getChildOptionRate(item)"></BaseChild>
+					<BaseChild :children="item.children" :isShowAnalysis="isShowAnalysis" :analysisJson="getChildAnalysisJson(item)" :optionRate="getChildOptionRate(item)" inBank></BaseChild>
 				</div>
 				</div>
 				<transition name="slide" v-if="item.type !== 'compose'">
 				<transition name="slide" v-if="item.type !== 'compose'">
 					<div v-if="collapseList.includes(exerciseList.indexOf(item))" class="toggle-area">
 					<div v-if="collapseList.includes(exerciseList.indexOf(item))" class="toggle-area">

+ 50 - 0
TEAMModelOS/ClientApp/src/components/mark/BaseMark.vue

@@ -0,0 +1,50 @@
+<template>
+    <div class="mark-container">
+        <MarkTools @onStatusChange="getMouseStatus" @onDrawImg="getDarmImg" @onClear="clear"></MarkTools>
+        <MarkCanvas ref="markCanvas" :bgImg="bgImg" :status="mouseStatus" :drawImgData="darwImg" @getImg="getMarkData"></MarkCanvas>
+    </div>
+</template>
+<script>
+import MarkTools from './MarkTools.vue'
+import MarkCanvas from './MarkCanvas.vue'
+export default {
+    props: {
+        //canvas主图(eg:学生作答数据)
+        bgImg: {
+            type: [String, Object],
+            default: ''
+        },
+    },
+    components: {
+        MarkTools, MarkCanvas
+    },
+    data() {
+        return {
+            mouseStatus:'move',
+            darwImg:''
+        }
+    },
+    methods:{
+        getMouseStatus(data){
+            this.mouseStatus = data
+        },
+        getMarkData(data){
+            this.$emit('onMarkChange',data)
+        },
+        getDarmImg(data){
+            this.darwImg = data
+        },
+        //清除批注
+        clear() {
+            this.$refs['markCanvas'].clear()
+        },
+    }
+}
+</script>
+<style lang="less" scoped>
+.mark-container {
+    width: 100%;
+    height: 100%;
+    display: flex;
+}
+</style>

TEAMModelOS/ClientApp/src/view/task/mark/MarkCanvas.vue → TEAMModelOS/ClientApp/src/components/mark/MarkCanvas.vue


+ 98 - 0
TEAMModelOS/ClientApp/src/components/mark/MarkTools.vue

@@ -0,0 +1,98 @@
+<template>
+    <div class="mark-tools-container">
+        <div class="mark-tools-wrap">
+            <Icon custom="iconfont icon-move" class="tool-icon" :title="$t('learnActivity.mark.move')" @click="mouseStatus = 'move'" />
+            <Icon custom="iconfont icon-text" class="tool-icon" :title="$t('learnActivity.mark.text')" @click="mouseStatus = 'text'" />
+            <Icon custom="iconfont icon-mark" class="tool-icon" :title="$t('learnActivity.mark.brush')" @click="mouseStatus = 'line'" />
+            <Icon custom="iconfont icon-arrow-mark" class="tool-icon" :title="$t('learnActivity.mark.arrow')" @click="mouseStatus = 'arrow'" />
+            <Icon custom="iconfont icon-oval" class="tool-icon" :title="$t('learnActivity.mark.oval')" @click="mouseStatus = 'oval'" />
+            <Icon custom="iconfont icon-rect" class="tool-icon" :title="$t('learnActivity.mark.rect')" @click="mouseStatus = 'rect'" />
+            <Poptip transfer placement="right">
+                <Icon custom="iconfont icon-smile" class="tool-icon" :title="$t('learnActivity.mark.seal')" />
+                <div slot="content" class="expression-box">
+                    <img v-for="(item,index) in imgs" :key="index" :src="item" alt="" class="expression-img" @click="drawImg(index)">
+                </div>
+            </Poptip>
+            <Icon custom="iconfont icon-fresh" class="tool-icon" :title="$t('learnActivity.mark.clear')" @click="clear" />
+        </div>
+    </div>
+</template>
+<script>
+export default {
+    data() {
+        return {
+            mouseStatus: 'move',
+            imgs: [],
+        }
+    },
+    methods: {
+        clear() {
+            this.$emit('onClear')
+        },
+        drawImg(imgIndex) {
+            let curImg = new Image()
+            curImg.src = this.imgs[imgIndex]
+            curImg.onload = () => {
+                this.mouseStatus = 'img'
+                this.drawImgData = curImg
+                this.$emit('onDrawImg', curImg)
+            }
+        }
+    },
+    created() {
+        for (let i = 0; i < 9; i++) {
+            this.imgs.push(require('@/assets/mark/' + i + '.svg'))
+        }
+    },
+    watch: {
+        mouseStatus: {
+            handler(n, o) {
+                this.$emit('onStatusChange', n)
+            },
+            immediate: true
+        }
+    }
+
+}
+</script>
+<style scoped lang="less">
+.mark-tools-container {
+    position: relative;
+    box-shadow: 2px 0px 5px 0px rgba(100, 100, 100, 0.2);
+    z-index: 9;
+    width: 40px;
+    height: 100%;
+    display: flex;
+    flex-direction: column;
+    background: #fafafa;
+    .tool-icon {
+        font-size: 20px;
+        cursor: pointer;
+        height: 40px;
+        line-height: 40px;
+        width: 39px;
+        &:hover {
+            color: #1cc0f3;
+            box-shadow: 0 5px 10px -8px #1cc0f3;
+            background: white;
+            border-color: transparent;
+        }
+    }
+}
+.expression-box {
+    max-width: 300px;
+    display: flex;
+    flex-wrap: wrap;
+    max-height: 600px;
+}
+.expression-img {
+    width: 80px;
+    margin: 10px;
+    height: auto;
+}
+</style>
+<style lang="less">
+.mark-tools-wrap .ivu-poptip-title::after {
+    display: none;
+}
+</style>

+ 78 - 77
TEAMModelOS/ClientApp/src/components/selflearn/ExerciseList.vue

@@ -3,83 +3,84 @@
         <!-- 筛选部分 -->
         <!-- 筛选部分 -->
         <div class="filter-wrap">
         <div class="filter-wrap">
             <div class="filter-item">
             <div class="filter-item">
-                <span class="filter-title">来源:</span>
+                <span class="filter-title">{{$t('evaluation.filter.origin')}}:</span>
                 <RadioGroup v-model="filterOrigin" type="button" @on-change="filterOriginChange">
                 <RadioGroup v-model="filterOrigin" type="button" @on-change="filterOriginChange">
-                    <Radio :label="userId">个人题库</Radio>
-                    <Radio :label="schoolCode" v-if="hasSchool">校本题库</Radio>
+                    <Radio :label="userId">{{$t('evaluation.filter.privateBank')}}</Radio>
+                    <Radio :label="schoolCode" v-if="hasSchool">{{$t('evaluation.filter.schoolBank')}}</Radio>
                 </RadioGroup>
                 </RadioGroup>
             </div>
             </div>
             <div class="filter-item" v-show="filterOrigin == schoolCode">
             <div class="filter-item" v-show="filterOrigin == schoolCode">
-                <span class="filter-title">学段:</span>
+                <span class="filter-title">{{$t('evaluation.filter.period')}}:</span>
                 <RadioGroup v-model="filterPeriod" type="button" @on-change="filterPeriodChange">
                 <RadioGroup v-model="filterPeriod" type="button" @on-change="filterPeriodChange">
                     <Radio v-for="(item, index) in periodList" :key="index" :label="index">{{ item.name }}</Radio>
                     <Radio v-for="(item, index) in periodList" :key="index" :label="index">{{ item.name }}</Radio>
                 </RadioGroup>
                 </RadioGroup>
             </div>
             </div>
             <div class="filter-item" v-show="filterOrigin == schoolCode">
             <div class="filter-item" v-show="filterOrigin == schoolCode">
-                <span class="filter-title">年级:</span>
+                <span class="filter-title">{{$t('evaluation.filter.grade')}}:</span>
                 <CheckboxGroup v-model="filterGrade" border @on-change="filterGradeChange">
                 <CheckboxGroup v-model="filterGrade" border @on-change="filterGradeChange">
-                    <Checkbox lable="all">全部</Checkbox>
+                    <Checkbox lable="all">{{$t('evaluation.filter.all')}}</Checkbox>
                     <Checkbox v-for="(item, index) in gradeList" :key="index" :label="index">{{ item }}</Checkbox>
                     <Checkbox v-for="(item, index) in gradeList" :key="index" :label="index">{{ item }}</Checkbox>
                 </CheckboxGroup>
                 </CheckboxGroup>
             </div>
             </div>
             <div class="filter-item" v-show="filterOrigin == schoolCode">
             <div class="filter-item" v-show="filterOrigin == schoolCode">
-                <span class="filter-title">科目:</span>
+                <span class="filter-title">{{$t('evaluation.filter.subject')}}:</span>
                 <CheckboxGroup v-model="filterSubject" border @on-change="filterSubjectChange">
                 <CheckboxGroup v-model="filterSubject" border @on-change="filterSubjectChange">
-                    <Checkbox lable="all">全部</Checkbox>
+                    <Checkbox lable="all">{{$t('evaluation.filter.all')}}</Checkbox>
                     <Checkbox v-for="(item, index) in subjectList" :key="index" :label="item.id">{{ item.name }}</Checkbox>
                     <Checkbox v-for="(item, index) in subjectList" :key="index" :label="item.id">{{ item.name }}</Checkbox>
                 </CheckboxGroup>
                 </CheckboxGroup>
             </div>
             </div>
             <div class="filter-item">
             <div class="filter-item">
-                <span class="filter-title">题型:</span>
-                <CheckboxGroup v-model="filterType" border @on-change="filterTypeChange">
-                    <Checkbox label="all">全部</Checkbox>
-                    <Checkbox label="single">单选</Checkbox>
-                    <Checkbox label="multiple">多选</Checkbox>
-                    <Checkbox label="judge">判断</Checkbox>
-                    <Checkbox label="complete">填空</Checkbox>
-                    <Checkbox label="subjective">问答</Checkbox>
-                    <Checkbox label="compose">综合</Checkbox>
-                </CheckboxGroup>
+                <span class="filter-title">{{$t('evaluation.filter.type')}}:</span>
+				<CheckboxGroup v-model="filterType" border @on-change="filterTypeChange">
+					<Checkbox label="all">{{$t('evaluation.filter.all')}}</Checkbox>
+					<Checkbox label="single">{{$t('evaluation.single')}}<span class="filter-count" v-if="filterOrigin === schoolCode">({{ typeCountArr.length ? typeCountArr[0] : 0 }})</span></Checkbox>
+					<Checkbox label="multiple">{{$t('evaluation.multiple')}}<span class="filter-count" v-if="filterOrigin === schoolCode">({{ typeCountArr.length ? typeCountArr[1] : 0 }})</span></Checkbox>
+					<Checkbox label="judge">{{$t('evaluation.judge')}}<span class="filter-count" v-if="filterOrigin === schoolCode">({{ typeCountArr.length ? typeCountArr[2] : 0 }})</span></Checkbox>
+					<Checkbox label="complete">{{$t('evaluation.complete')}}<span class="filter-count" v-if="filterOrigin === schoolCode">({{ typeCountArr.length ? typeCountArr[3] : 0 }})</span></Checkbox>
+					<Checkbox label="subjective">{{$t('evaluation.subjective')}}<span class="filter-count" v-if="filterOrigin === schoolCode">({{ typeCountArr.length ? typeCountArr[4] : 0 }})</span></Checkbox>
+					<Checkbox label="connector">{{$t('evaluation.connector')}}<span class="filter-count" v-if="filterOrigin === schoolCode">({{ typeCountArr.length ? typeCountArr[5] : 0 }})</span></Checkbox>
+					<Checkbox label="correct">{{$t('evaluation.correct')}}<span class="filter-count" v-if="filterOrigin === schoolCode">({{ typeCountArr.length ? typeCountArr[6] : 0 }})</span></Checkbox>
+					<Checkbox label="compose">{{$t('evaluation.compose')}}<span class="filter-count" v-if="filterOrigin === schoolCode">({{ typeCountArr.length ? typeCountArr[7] : 0 }})</span></Checkbox>
+				</CheckboxGroup>
             </div>
             </div>
             <div class="filter-item">
             <div class="filter-item">
-                <span class="filter-title">难度:</span>
-                <CheckboxGroup v-model="filterDiff" border @on-change="filterDiffChange">
-                    <Checkbox label="all">全部</Checkbox>
+                <span class="filter-title">{{$t('evaluation.filter.diff')}}:</span>
+				<CheckboxGroup v-model="filterDiff" border @on-change="filterDiffChange">
+					<Checkbox label="all">{{$t('evaluation.filter.all')}}</Checkbox>
                     <Checkbox v-for="(item, index) in exersicesDiff" :key="index" :label="index + 1">{{ item }}</Checkbox>
                     <Checkbox v-for="(item, index) in exersicesDiff" :key="index" :label="index + 1">{{ item }}</Checkbox>
                 </CheckboxGroup>
                 </CheckboxGroup>
             </div>
             </div>
             <div class="filter-item">
             <div class="filter-item">
-                <span class="filter-title">层次:</span>
+                <span class="filter-title">{{$t('evaluation.filter.level')}}:</span>
                 <CheckboxGroup v-model="filterField" border @on-change="filterFieldChange">
                 <CheckboxGroup v-model="filterField" border @on-change="filterFieldChange">
-                    <Checkbox label="all">全部</Checkbox>
-                    <Checkbox :label="1">知识</Checkbox>
-                    <Checkbox :label="2">理解</Checkbox>
-                    <Checkbox :label="3">应用</Checkbox>
-                    <Checkbox :label="4">分析</Checkbox>
-                    <Checkbox :label="5">综合</Checkbox>
-                    <Checkbox :label="6">评鉴</Checkbox>
+                    <Checkbox label="all">{{$t('evaluation.filter.all')}}</Checkbox>
+                    <Checkbox :label="1">{{$t('evaluation.level1')}}<span class="filter-count" v-if="filterOrigin === schoolCode">({{ fieldCountArr.length ? fieldCountArr[0] : 0 }})</span></Checkbox>
+                    <Checkbox :label="2">{{$t('evaluation.level2')}}<span class="filter-count" v-if="filterOrigin === schoolCode">({{ fieldCountArr.length ? fieldCountArr[1] : 0 }})</span></Checkbox>
+                    <Checkbox :label="3">{{$t('evaluation.level3')}}<span class="filter-count" v-if="filterOrigin === schoolCode">({{ fieldCountArr.length ? fieldCountArr[2] : 0 }})</span></Checkbox>
+                    <Checkbox :label="4">{{$t('evaluation.level4')}}<span class="filter-count" v-if="filterOrigin === schoolCode">({{ fieldCountArr.length ? fieldCountArr[3] : 0 }})</span></Checkbox>
+                    <Checkbox :label="5">{{$t('evaluation.level5')}}<span class="filter-count" v-if="filterOrigin === schoolCode">({{ fieldCountArr.length ? fieldCountArr[4] : 0 }})</span></Checkbox>
+                    <Checkbox :label="6">{{$t('evaluation.level6')}}<span class="filter-count" v-if="filterOrigin === schoolCode">({{ fieldCountArr.length ? fieldCountArr[5] : 0 }})</span></Checkbox>
                 </CheckboxGroup>
                 </CheckboxGroup>
             </div>
             </div>
             <div class="filter-item">
             <div class="filter-item">
-                <span class="filter-title">排序:</span>
+                <span class="filter-title">{{$t('evaluation.filter.sort')}}:</span>
                 <RadioGroup v-model="filterSort" type="button" @on-change="filterSortChange">
                 <RadioGroup v-model="filterSort" type="button" @on-change="filterSortChange">
-                    <Radio label="createTime">
-                        新增时间
+                    <Radio label="createTime">{{$t('evaluation.filter.createTime')}}
                         <Icon type="md-arrow-round-down" />
                         <Icon type="md-arrow-round-down" />
                     </Radio>
                     </Radio>
-                    <Radio label="useCount">
+                    <!-- <Radio label="useCount">
                         使用次数
                         使用次数
                         <Icon type="md-arrow-round-down" />
                         <Icon type="md-arrow-round-down" />
-                    </Radio>
+                    </Radio> -->
                 </RadioGroup>
                 </RadioGroup>
             </div>
             </div>
         </div>
         </div>
         <!-- 筛选部分结束 -->
         <!-- 筛选部分结束 -->
         <!-- 题目列表部分 -->
         <!-- 题目列表部分 -->
-		<Loading :top="100" v-show="dataLoading" hideMask></Loading>
+        <Loading :top="100" v-show="dataLoading" hideMask></Loading>
         <div v-if="exerciseList.length === 0" class="no-data-text">
         <div v-if="exerciseList.length === 0" class="no-data-text">
             <img src="@/assets/icon/no_data_evaluation.png" width="120" />
             <img src="@/assets/icon/no_data_evaluation.png" width="120" />
-            <span style="margin-top: 15px; color: #808080">暂无数据</span>
+            <span style="margin-top: 15px; color: #808080">{{$t('evaluation.noData')}}</span>
         </div>
         </div>
         <div class="content-wrap" ref="mathJaxContainer" v-else>
         <div class="content-wrap" ref="mathJaxContainer" v-else>
             <div class="exercise-item" v-for="(item, index) of exerciseList" :key="index" @click="onQuestionToggle(index, item.id, $event)">
             <div class="exercise-item" v-for="(item, index) of exerciseList" :key="index" @click="onQuestionToggle(index, item.id, $event)">
@@ -114,7 +115,7 @@
                         <div v-if="item.type !== 'compose'">
                         <div v-if="item.type !== 'compose'">
                             <!-- 答案展示部分 -->
                             <!-- 答案展示部分 -->
                             <div class="item-explain">
                             <div class="item-explain">
-                                <span class="explain-title">【答ㅤ案】</span>
+                                <span class="explain-title">【{{$t('evaluation.answer')}}】</span>
                                 <div class="item-explain-details">
                                 <div class="item-explain-details">
                                     <!-- 问答题答案 -->
                                     <!-- 问答题答案 -->
                                     <div v-if="item.type === 'subjective' || item.type === 'complete'">
                                     <div v-if="item.type === 'subjective' || item.type === 'complete'">
@@ -128,16 +129,16 @@
                             </div>
                             </div>
                             <!-- 解析部分 -->
                             <!-- 解析部分 -->
                             <div class="item-explain">
                             <div class="item-explain">
-                                <span class="explain-title">【解ㅤ析】</span>
+                                <span class="explain-title">【{{$t('evaluation.explain')}}】</span>
                                 <div class="item-explain-details" @click="onRichTextClick($event)">
                                 <div class="item-explain-details" @click="onRichTextClick($event)">
-                                    <span v-html="item.explain || '暂无解析'"></span>
+                                    <span v-html="item.explain || $t('evaluation.noExplain')"></span>
                                 </div>
                                 </div>
                             </div>
                             </div>
                             <!-- 知识点部分 -->
                             <!-- 知识点部分 -->
                             <div class="item-explain">
                             <div class="item-explain">
-                                <span class="explain-title">【知识点】</span>
+                                <span class="explain-title">【{{$t('evaluation.knowledgePoints')}}】</span>
                                 <div class="item-explain-details">
                                 <div class="item-explain-details">
-                                    <span v-if="!item.points">暂未绑定知识点</span>
+                                    <span v-if="!item.points">{{$t('evaluation.noPoints')}}</span>
                                     <div v-else>
                                     <div v-else>
                                         <span v-for="(point, index) in item.points" class="item-point-tag" :key="index">
                                         <span v-for="(point, index) in item.points" class="item-point-tag" :key="index">
                                             {{ point }}
                                             {{ point }}
@@ -154,12 +155,12 @@
                 </transition>
                 </transition>
                 <!-- 底部题目操作栏 -->
                 <!-- 底部题目操作栏 -->
                 <div class="item-tools">
                 <div class="item-tools">
-                    <span class="item-tools-info">题型:{{ exersicesType[item.type] }}</span>
-                    <span class="item-tools-info">难度:{{ exersicesDiff[item.level - 1] }}</span>
-                    <span class="item-tools-info">使用次数:{{ item.usageCount || 0 }} 次</span>
+                    <span class="item-tools-info">{{$t('evaluation.filter.type')}}:{{ exersicesType[item.type] }}</span>
+                    <span class="item-tools-info">{{$t('evaluation.filter.diff')}}:{{ exersicesDiff[item.level - 1] }}</span>
+                    <!-- <span class="item-tools-info">{{$t('evaluation.filter.useCount')}}:{{ item.usageCount || 0 }} 次</span> -->
 
 
                     <Button type="text" @click.stop="chooseExercise(item)" :icon="ids.indexOf(item.id) > -1 ? 'md-remove' : 'md-add'" style="margin-right: 10px">
                     <Button type="text" @click.stop="chooseExercise(item)" :icon="ids.indexOf(item.id) > -1 ? 'md-remove' : 'md-add'" style="margin-right: 10px">
-                        {{ids.indexOf(item.id) > -1 ? '移除' : '选题'}}
+                        {{ids.indexOf(item.id) > -1 ? $t('evaluation.removeItem') : $t('evaluation.selectItem')}}
                     </Button>
                     </Button>
                 </div>
                 </div>
             </div>
             </div>
@@ -218,17 +219,17 @@ export default {
     methods: {
     methods: {
         /**挑选试题 */
         /**挑选试题 */
         chooseExercise(item) {
         chooseExercise(item) {
-            if(this.ids.indexOf(item.id) == -1){
+            if (this.ids.indexOf(item.id) == -1) {
                 this.selectItems.push(item) //添加题目
                 this.selectItems.push(item) //添加题目
-            }else{
-                for(let i = 0; i < this.selectItems.length; i++){
-                    if(this.selectItems[i].id == item.id){
-                        this.selectItems.splice(i,1) //移除
+            } else {
+                for (let i = 0; i < this.selectItems.length; i++) {
+                    if (this.selectItems[i].id == item.id) {
+                        this.selectItems.splice(i, 1) //移除
                         break
                         break
                     }
                     }
                 }
                 }
             }
             }
-            this.$emit('chooseQuChange',this.selectItems)
+            this.$emit('chooseQuChange', this.selectItems)
         },
         },
         /* 音频弹窗切换事件 */
         /* 音频弹窗切换事件 */
         onAudioModalChange(val) {
         onAudioModalChange(val) {
@@ -266,30 +267,30 @@ export default {
 
 
         /** 获取区班校信息 */
         /** 获取区班校信息 */
         getSchoolInfo() {
         getSchoolInfo() {
-			this.dataLoading = true;
-			if(!this.hasSchool){
-				this.userId = this.$store.state.userInfo.TEAMModelId;
-				this.filterOrigin = this.$store.state.userInfo.TEAMModelId;
-				this.doFilter();
-			}else{
-				this.$store.dispatch("user/getSchoolProfile").then((res) => {
-				    let schoolBaseInfo = res.school_base;
-				    if (schoolBaseInfo) {
-				        this.schoolInfo = schoolBaseInfo;
-				        this.schoolCode = schoolBaseInfo.id;
-				        this.userId = this.$store.state.userInfo.TEAMModelId;
-				        this.filterOrigin = this.$store.state.userInfo.TEAMModelId;
-				        this.periodList = schoolBaseInfo.period;
-				        console.log('periodList:', this.periodList)
-				        if (schoolBaseInfo.period.length) {
-				            this.gradeList = schoolBaseInfo.period[0].grades;
-				            this.subjectList = schoolBaseInfo.period[0].subjects;
-				        }
-				        this.doFilter();
-				    }
-				});
-			}
-            
+            this.dataLoading = true;
+            if (!this.hasSchool) {
+                this.userId = this.$store.state.userInfo.TEAMModelId;
+                this.filterOrigin = this.$store.state.userInfo.TEAMModelId;
+                this.doFilter();
+            } else {
+                this.$store.dispatch("user/getSchoolProfile").then((res) => {
+                    let schoolBaseInfo = res.school_base;
+                    if (schoolBaseInfo) {
+                        this.schoolInfo = schoolBaseInfo;
+                        this.schoolCode = schoolBaseInfo.id;
+                        this.userId = this.$store.state.userInfo.TEAMModelId;
+                        this.filterOrigin = this.$store.state.userInfo.TEAMModelId;
+                        this.periodList = schoolBaseInfo.period;
+                        console.log('periodList:', this.periodList)
+                        if (schoolBaseInfo.period.length) {
+                            this.gradeList = schoolBaseInfo.period[0].grades;
+                            this.subjectList = schoolBaseInfo.period[0].subjects;
+                        }
+                        this.doFilter();
+                    }
+                });
+            }
+
         },
         },
 
 
         /* 获取BLOB所有试题LIST */
         /* 获取BLOB所有试题LIST */
@@ -533,7 +534,7 @@ export default {
         deleteFalse(arr) {
         deleteFalse(arr) {
             let list = JSON.parse(JSON.stringify(arr));
             let list = JSON.parse(JSON.stringify(arr));
             list.forEach((item, index) => {
             list.forEach((item, index) => {
-                if ((!item || item === "all") && item !== 0 ) list.splice(index, 1);
+                if ((!item || item === "all") && item !== 0) list.splice(index, 1);
             });
             });
             return list;
             return list;
         },
         },
@@ -626,7 +627,7 @@ export default {
     transform: translateY(10px);
     transform: translateY(10px);
     opacity: 0;
     opacity: 0;
 }
 }
-.filter-item .ivu-checkbox{
+.filter-item .ivu-checkbox {
     display: none;
     display: none;
 }
 }
 </style>
 </style>

A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 740 - 761
TEAMModelOS/ClientApp/src/components/selflearn/NewChooseContent.vue


+ 59 - 52
TEAMModelOS/ClientApp/src/components/student-web/EventBasicInfo.vue

@@ -1,55 +1,57 @@
 <template>
 <template>
-    <Row :gutter="30">
-        <i-col :xs="24" :sm="24" :md="24" :lg="getCurrentLang() == 'tw' ? 12 : 24" class="title-part">
-            <h2 class="event-title">
-                <span class="title-mark" v-show="this.$store.getters.getItemTitle.eventType == 'Exam'" >{{$t("studentWeb.home.exam")}}</span>
-                <span class="title-mark" v-show="this.$store.getters.getItemTitle.eventType == 'Vote'" >{{$t("studentWeb.home.vote")}}</span>
-                <span class="title-mark" v-show="this.$store.getters.getItemTitle.eventType == 'Survey'" >{{$t("studentWeb.home.survey")}}</span>
-                {{ this.$store.getters.getItemTitle.name }}
-            </h2>
-        </i-col>
-        <i-col :xs="24" :sm="24" :md="24" :lg="getCurrentLang() == 'tw' ? 12 : 24" class="info-part">
-            <ul class="base-info" :class="{'base-infoEn': getCurrentLang() == 'en'}">
-                <li
-                  v-if="this.$store.getters.getItemTitle.eventType == 'Exam' && paper.length !== 0 "
-                >
-                    <svg-icon icon-class="subject" class="base-info-icon" />{{ $t('studentWeb.baseInfo.subject')}}
-                    <span class="base-info-text">{{paper.length > 1 ? $t('studentWeb.event.allSubject') : paper[0].subject.name }}</span>
-                    <!-- <span class="base-info-text" v-if="getCurrentLang()=='en'">{{ transSubjecttoEn(this.$store.getters.getItemTitle.eventSubject) }}</span> -->
-                </li>
-                <!--<li>
-                    <svg-icon icon-class="teacher" class="base-info-icon" />投票类型:
-                    <span class="base-info-text">{{ this.$store.getters.getItemTitle.times }}</span>
-                </li>-->
-                <li>
-                    <svg-icon icon-class="time" class="base-info-icon" />
-                    <span>{{ !eventType ? $t('studentWeb.baseInfo.period') : $t('studentWeb.baseInfo.postTime') }}</span>
-                    <span class="base-info-text" v-if="from != '通知' && from != 'hiteach'">
-                        <span>
-                            {{ !eventType ? dateFormat(this.$store.getters.getItemTitle.startTime) + "~" : ""}}
+    <div v-if="info">
+        <Row :gutter="30">
+            <i-col :xs="24" :sm="24" :md="24" :lg="getCurrentLang() == 'tw' ? 12 : 24" class="title-part">
+                <h2 class="event-title">
+                    <span class="title-mark" v-show="info.eventType == 'Exam'" >{{$t("studentWeb.home.exam")}}</span>
+                    <span class="title-mark" v-show="info.eventType == 'Vote'" >{{$t("studentWeb.home.vote")}}</span>
+                    <span class="title-mark" v-show="info.eventType == 'Survey'" >{{$t("studentWeb.home.survey")}}</span>
+                    {{ info.name }}
+                </h2>
+            </i-col>
+            <i-col :xs="24" :sm="24" :md="24" :lg="getCurrentLang() == 'tw' ? 12 : 24" class="info-part">
+                <ul class="base-info" :class="{'base-infoEn': getCurrentLang() == 'en'}">
+                    <li
+                    v-if="info.eventType == 'Exam' && paper.length !== 0 "
+                    >
+                        <svg-icon icon-class="subject" class="base-info-icon" />{{ $t('studentWeb.baseInfo.subject')}}
+                        <span class="base-info-text">{{paper.length > 1 ? $t('studentWeb.event.allSubject') : paper[0].subject.name }}</span>
+                        <!-- <span class="base-info-text" v-if="getCurrentLang()=='en'">{{ transSubjecttoEn(info.eventSubject) }}</span> -->
+                    </li>
+                    <li v-if="info.eventType == 'Vote'">
+                        <svg-icon icon-class="teacher" class="base-info-icon" />投票类型:
+                        <span class="base-info-text">{{ times }}</span>
+                    </li>
+                    <li>
+                        <svg-icon icon-class="time" class="base-info-icon" />
+                        <span>{{ !eventType ? $t('studentWeb.baseInfo.period') : $t('studentWeb.baseInfo.postTime') }}</span>
+                        <span class="base-info-text" v-if="from != '通知' && from != 'hiteach'">
+                            <span>
+                                {{ !eventType ? dateFormat(info.startTime) + "~" : ""}}
+                            </span>
+                            {{ dateFormat(info.endTime) }}
                         </span>
                         </span>
-                        {{ dateFormat(this.$store.getters.getItemTitle.endTime) }}
-                    </span>
-                    <!--<span
-                      class="base-info-text"
-                      v-if="from == '通知'||from == 'hiteach'"
-                    >{{ this.$store.getters.getItemTitle.endTime + " 14:20" }}54345</span>-->
-                </li>
-                <!--<li v-if=" from == 'hiteach'">
-                    <svg-icon icon-class="time" class="base-info-icon" />{{$t('studentWeb.baseInfo.classTime')}}:
-                    <span class="base-info-text">{{ this.$store.getters.getItemTitle.endTime }}</span>
-                </li>-->
-                <!--<li v-if="finishedCondition && !eventType && from != '通知'&&from!='hiteach'">
-                    <svg-icon icon-class="done" class="base-info-icon" />
-                    <span class="base-info-text">{{ $t('studentWeb.baseInfo.Fineshed')}}</span>
-                </li>
-                <li v-if="unfinishedCondition && !eventType && from != '通知'&&from!='hiteach'">
-                    <svg-icon icon-class="undone" class="base-info-icon" />
-                    <span class="base-info-text">{{ $t('studentWeb.baseInfo.unFinished')}}</span>
-                </li>-->
-            </ul>
-        </i-col>
-    </Row>
+                        <!--<span
+                        class="base-info-text"
+                        v-if="from == '通知'||from == 'hiteach'"
+                        >{{ info.endTime + " 14:20" }}54345</span>-->
+                    </li>
+                    <!--<li v-if=" from == 'hiteach'">
+                        <svg-icon icon-class="time" class="base-info-icon" />{{$t('studentWeb.baseInfo.classTime')}}:
+                        <span class="base-info-text">{{ info.endTime }}</span>
+                    </li>-->
+                    <!--<li v-if="finishedCondition && !eventType && from != '通知'&&from!='hiteach'">
+                        <svg-icon icon-class="done" class="base-info-icon" />
+                        <span class="base-info-text">{{ $t('studentWeb.baseInfo.Fineshed')}}</span>
+                    </li>
+                    <li v-if="unfinishedCondition && !eventType && from != '通知'&&from!='hiteach'">
+                        <svg-icon icon-class="undone" class="base-info-icon" />
+                        <span class="base-info-text">{{ $t('studentWeb.baseInfo.unFinished')}}</span>
+                    </li>-->
+                </ul>
+            </i-col>
+        </Row>
+    </div>
 </template>
 </template>
 
 
 <script>
 <script>
@@ -58,7 +60,9 @@ export default {
     props: [
     props: [
         "eventType",
         "eventType",
         "from",
         "from",
-        "paper"
+        "paper",
+        "info",
+        "times"
     ],
     ],
 
 
     computed: {
     computed: {
@@ -87,7 +91,10 @@ export default {
             var Y = date.getFullYear() + '-'
             var Y = date.getFullYear() + '-'
             var M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-'
             var M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-'
             var D = date.getDate() + ' '
             var D = date.getDate() + ' '
-            return Y + M + D;
+            var H = (date.getHours() < 10 ? '0' + date.getHours() : date.getHours()) + ":"
+            var Min = (date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes()) + ":"
+            var S = (date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds()) + " "
+            return Y + M + D + H + Min + S;
         },
         },
         getCurrentLang() {
         getCurrentLang() {
             return localStorage.getItem('lang');
             return localStorage.getItem('lang');

+ 8 - 22
TEAMModelOS/ClientApp/src/components/student-web/EventView/BillBoardandLightBox.vue

@@ -1,19 +1,17 @@
 <template>
 <template>
     <div class="billboard-and-LightBox">
     <div class="billboard-and-LightBox">
         <div class="title-rect-group">
         <div class="title-rect-group">
-            <!-- <div class="title-rect" /> -->
             <h2 class="title-rect-name">{{$t('studentWeb.billboard.description')}}</h2>
             <h2 class="title-rect-name">{{$t('studentWeb.billboard.description')}}</h2>
         </div>
         </div>
         <div class="dec">
         <div class="dec">
             <p><span v-html="activityData.description"></span></p>
             <p><span v-html="activityData.description"></span></p>
         </div>
         </div>
-        <div class="title-rect-group" v-if="this.$store.getters.getItemTitle.eventType  === 'vote'">
-            <!-- <div class="title-rect" /> -->
+        <div class="title-rect-group" v-if="this.$store.getters.getItemTitle.eventType  === 'Vote'">
             <h2 class="title-rect-name">{{$t("studentWeb.vote.voteRecord")}}</h2>
             <h2 class="title-rect-name">{{$t("studentWeb.vote.voteRecord")}}</h2>
         </div>
         </div>
-        <div class="dec" v-if="this.$store.getters.getItemTitle.eventType == 'vote'">
+        <div class="dec" v-if="this.$store.getters.getItemTitle.eventType == 'Vote'">
             <Table v-if="showTable" border :columns="voteColums" :data="voteColumsData"></Table>
             <Table v-if="showTable" border :columns="voteColums" :data="voteColumsData"></Table>
-            <span v-else >{{$t("studentWeb.public.noData")}}</span>
+            <span v-else>{{ $t("studentWeb.public.noData") }}</span>
         </div>
         </div>
     </div>
     </div>
 </template>
 </template>
@@ -35,35 +33,23 @@
                 }
                 }
             }
             }
         },
         },
-        created() {
-            this.openLightBox = false;
-        },
         data() {
         data() {
             return {
             return {
-                value1: 0,
-                openLightBox: false,
-                targetImg: "",
                 columns: [
                 columns: [
                     {
                     {
                         title: this.$t('studentWeb.vote.voteTime'),
                         title: this.$t('studentWeb.vote.voteTime'),
                         key: 'time',
                         key: 'time',
-                        sortable: true
+                        sortable: true,
+                        align: "center"
                     },
                     },
                 ],
                 ],
                 voteColums: [],
                 voteColums: [],
-                voteColumsData:[],
-                showTable:false,
-                setting: {
-                    autoplay: false,
-                    dots: "outside",
-                    radiusDot: true,
-                    trigger: "click",
-
-                },
+                voteColumsData: [],
+                showTable: false, //投票记录表格
             };
             };
         },
         },
         mounted() {
         mounted() {
-            if (this.voteRes.length > 0) {
+            if (this.voteRes.length) {
                 this.setVoteTable()
                 this.setVoteTable()
             }
             }
         },
         },

+ 2 - 0
TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/PaperTest.vue

@@ -660,6 +660,8 @@
                 this.WarmMessageisOpen = false
                 this.WarmMessageisOpen = false
                 if (this.checkers.length) {
                 if (this.checkers.length) {
                     this.isLoading = true;
                     this.isLoading = true;
+                    // 选了个人课程:scope == 'private'
+                    // 选了标准课程:scope == 'school'
                     let codes = this.getItemTitle.scope == 'school' ? this.getItemTitle.school : this.getItemTitle.creatorId
                     let codes = this.getItemTitle.scope == 'school' ? this.getItemTitle.school : this.getItemTitle.creatorId
                     let req = {
                     let req = {
                         id: this.getItemTitle.id,
                         id: this.getItemTitle.id,

+ 1 - 1
TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/PaperView.vue

@@ -11,7 +11,7 @@
                     </template>
                     </template>
                 </load>
                 </load>
             </div>
             </div>
-            <EventBasicInfo :paper="paperData" />
+            <EventBasicInfo :info="nowActive" :paper="paperData" />
             <Tabs :value="selectTab" v-if="paperData.length">
             <Tabs :value="selectTab" v-if="paperData.length">
                 <!-- 评测内容 -->
                 <!-- 评测内容 -->
                 <TabPane :label='$t("studentWeb.exam.examData")' name="test">
                 <TabPane :label='$t("studentWeb.exam.examData")' name="test">

+ 1 - 1
TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/QuesNaire.vue

@@ -41,7 +41,7 @@
 				</template>
 				</template>
 			</Load>
 			</Load>
 		</div>
 		</div>
-		<EventBasicInfo />
+		<EventBasicInfo :info="nowActive" />
 		<div>
 		<div>
 			<!-- 已提交 -->
 			<!-- 已提交 -->
 			<div v-if="alreadyAnswered" style="text-align: center; padding-top: 15%;">
 			<div v-if="alreadyAnswered" style="text-align: center; padding-top: 15%;">

+ 50 - 17
TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/Vote.vue

@@ -7,7 +7,7 @@
                 <p>{{ $t("studentWeb.vote.voteDes") }}</p>
                 <p>{{ $t("studentWeb.vote.voteDes") }}</p>
             </div>
             </div>
         </div>
         </div>
-        <EventBasicInfo />
+        <EventBasicInfo :info="nowActive" :times="voteTimes" />
         <div>
         <div>
             <!-- <div> -->
             <!-- <div> -->
                 <!--超时-->
                 <!--超时-->
@@ -136,6 +136,7 @@
                     img: "",
                     img: "",
                     show: false
                     show: false
                 },
                 },
+                voteTimes: null, //投票周期
             };
             };
         },
         },
         methods: {
         methods: {
@@ -152,22 +153,45 @@
                         if (res) {
                         if (res) {
                             this.timeStatus(this.voteInfo, res.records)
                             this.timeStatus(this.voteInfo, res.records)
                             if(res.records.length) {
                             if(res.records.length) {
-                                this.voteResData = res.records.sort((a, b) => {
-                                    return b > a
-                                })
-                                if(this.voteInfo.times != "once" || this.voteInfo.repeat) {
-                                    // 累计当前学生在所有投票轮次的每个选项投票数量
-                                    this.voteInfo.options.forEach(i => {
-                                        i.count = this.doCountTotal(res.records, i.code)
-                                    })
+                                if(this.voteInfo.times == "once") {
+                                    this.isVoteOK = true
+                                }
+                                // 每天
+                                else if(this.voteInfo.times == "day") {
+                                    // 最近一次投票的时间 < 当天凌晨,则表示当天还没有投票
+                                    let strdDate = (new Date(new Date(new Date().toLocaleDateString()).getTime())).getTime()
+                                    // 最新一条记录在最前面
+                                    this.isVoteOK = res.records[0].time < strdDate ? false : true
+                                }
+                                // 每周
+                                else if(this.voteInfo.times == "week") {
+                                    let days = new Date().getDay() || 7
+                                    //显示周一
+                                    let MondayTime = (new Date(new Date().getFullYear(), new Date().getMonth(), new Date().getDate() + 1 - days)).getTime()
+                                    this.isVoteOK = res.records[0].time < MondayTime ? false : true
+                                }
+                                // 每月
+                                else if(this.voteInfo.times == "month") {
+                                    // 每个月第一天
+                                    let firstDay = (new Date()).setDate(1)
+                                    firstDay = new Date(new Date(firstDay).toLocaleDateString()).getTime()
+                                    this.isVoteOK = res.records[0].time < firstDay ? false : true
                                 }
                                 }
-                                // 单次、不能重复投票
-                                else {
-                                    for(let key in res.records[0].opt) {
-                                        this.voteChecked.push(key)
+                                this.voteResData = res.records
+                                if(this.isVoteOK) {
+                                    if(this.voteInfo.times != "once" || this.voteInfo.repeat) {
+                                        // 累计当前学生在所有投票轮次的每个选项投票数量
+                                        this.voteInfo.options.forEach(i => {
+                                            i.count = this.doCountTotal(res.records, i.code)
+                                        })
+                                    }
+                                    // 单次、不能重复投票
+                                    else {
+                                        for(let key in res.records[0].opt) {
+                                            this.voteChecked.push(key)
+                                        }
                                     }
                                     }
                                 }
                                 }
-                                this.isVoteOK = true
                             }
                             }
                         }
                         }
                     }).finally(() => {
                     }).finally(() => {
@@ -217,6 +241,7 @@
                                     item.count = 0
                                     item.count = 0
                                 }
                                 }
                                 this.voteInfo = res.vote
                                 this.voteInfo = res.vote
+                                this.voteTimes = this.getVoteType(res.vote.times)
                                 this.voteChecked.length = 0
                                 this.voteChecked.length = 0
                                 if (res.vote.progress == "finish") {
                                 if (res.vote.progress == "finish") {
                                     // 投票结束,获取Blob来展示投票结果
                                     // 投票结束,获取Blob来展示投票结果
@@ -237,7 +262,7 @@
                     this.setData(data[0])
                     this.setData(data[0])
                 }
                 }
             },
             },
-            // 获取投票周期(后面可能会用)
+            // 获取投票周期
             getVoteType() {
             getVoteType() {
                 if(this.voteInfo != undefined) {
                 if(this.voteInfo != undefined) {
                     if(this.voteInfo.times == "once") {
                     if(this.voteInfo.times == "once") {
@@ -246,10 +271,10 @@
                     else if(this.voteInfo.times == "day") {
                     else if(this.voteInfo.times == "day") {
                         return "每日"
                         return "每日"
                     }
                     }
-                    else if(this.voteInfo.times == "day") {
+                    else if(this.voteInfo.times == "week") {
                         return "每周"
                         return "每周"
                     }
                     }
-                    else if(this.voteInfo.times == "week") {
+                    else if(this.voteInfo.times == "month") {
                         return "每月"
                         return "每月"
                     }
                     }
                     else if(this.voteInfo.times == "year") {
                     else if(this.voteInfo.times == "year") {
@@ -342,6 +367,14 @@
                         i++
                         i++
                     }
                     }
                 }
                 }
+                else {
+                    for (let item of this.voteInfo.options) {
+                        this.voteData.push({
+                            value: 0
+                        })
+                        this.voteList.push(item.code)
+                    }
+                }
                 this.showResult = true
                 this.showResult = true
             },
             },
             // 获取当前时间状态
             // 获取当前时间状态

+ 1 - 1
TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/VoteResultChart.vue

@@ -1,7 +1,7 @@
 <template>
 <template>
     <div class="dec">
     <div class="dec">
         <div style="height:350px; min-width:600px">
         <div style="height:350px; min-width:600px">
-            <div id="main" style=""></div>
+            <div id="main"></div>
             <span v-if="voteData.length == 0">{{$t("studentWeb.vote.noData")}}</span>
             <span v-if="voteData.length == 0">{{$t("studentWeb.vote.noData")}}</span>
         </div>
         </div>
     </div>
     </div>

+ 5 - 1
TEAMModelOS/ClientApp/src/components/student-web/EventView/EventList.vue

@@ -45,6 +45,7 @@
                                class="icon-btn"
                                class="icon-btn"
                                :title="iconBtn.title"
                                :title="iconBtn.title"
                                :class="{'icon-btn-selected': eventTypeCheckers.indexOf(iconBtn.eventType) != -1}"
                                :class="{'icon-btn-selected': eventTypeCheckers.indexOf(iconBtn.eventType) != -1}"
+                               :style="{'display': iconBtn.eventType == 'Preview' || iconBtn.eventType == 'HomeWork' ? 'none' : ''}"
                         >
                         >
                             <svg-icon :icon-class="iconBtn.iconClass"
                             <svg-icon :icon-class="iconBtn.iconClass"
                                       class="innerIcon"
                                       class="innerIcon"
@@ -304,7 +305,10 @@ import { mapGetters, mapState } from 'vuex';
                 var Y = date.getFullYear() + '-'
                 var Y = date.getFullYear() + '-'
                 var M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-'
                 var M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-'
                 var D = date.getDate() + ' '
                 var D = date.getDate() + ' '
-                return Y + M + D;
+                var H = (date.getHours() < 10 ? '0' + date.getHours() : date.getHours()) + ":"
+                var Min = (date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes()) + ":"
+                var S = (date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds()) + " "
+                return Y + M + D + H + Min + S;
             },
             },
             timeStatus(data) {
             timeStatus(data) {
                 let date = (new Date()).getTime() //当前时间
                 let date = (new Date()).getTime() //当前时间

+ 57 - 17
TEAMModelOS/ClientApp/src/components/student-web/HomeView/CourseContent.vue

@@ -12,8 +12,8 @@
             :class="{ courseContentEn: this.$store.getters.getCurrentLaguage == 'en-us' }"
             :class="{ courseContentEn: this.$store.getters.getCurrentLaguage == 'en-us' }"
             v-if="showInfo"
             v-if="showInfo"
         >
         >
-            <h2>{{ courseNow.course.name }}</h2>
-            <!-- <h3 class="course-subject">國中/二年級/{{courseNow.courseSubject}}</h3> -->
+            <h2>{{ course.course.name }}</h2>
+            <!-- <h3 class="course-subject">國中/二年級/{{course.courseSubject}}</h3> -->
             <div @click="changeGroupView()"
             <div @click="changeGroupView()"
                 :class="{ 'group-on': isChangeGroupView }"
                 :class="{ 'group-on': isChangeGroupView }"
                 v-if="name == 'tab3'"
                 v-if="name == 'tab3'"
@@ -27,28 +27,28 @@
                     <Row :gutter="30">
                     <Row :gutter="30">
                         <i-col :xs="24" :sm="24" :md="8" :lg="8">
                         <i-col :xs="24" :sm="24" :md="8" :lg="8">
                             <h4 class="basic-title">{{ $t("studentWeb.courseContent.classID") }}</h4>
                             <h4 class="basic-title">{{ $t("studentWeb.courseContent.classID") }}</h4>
-                            <h4 class="basic-data">{{ courseNow.course.no }}</h4>
+                            <h4 class="basic-data">{{ course.course.no }}</h4>
 
 
                             <h4 class="basic-title">{{ $t("studentWeb.courseContent.classTime") }}</h4>
                             <h4 class="basic-title">{{ $t("studentWeb.courseContent.classTime") }}</h4>
-                            <h4 class="basic-data">{{ courseNow.classTime }}</h4>
+                            <h4 class="basic-data">{{ course.classTime }}</h4>
 
 
                             <h4 class="basic-title">{{ $t("studentWeb.courseContent.classroom") }}</h4>
                             <h4 class="basic-title">{{ $t("studentWeb.courseContent.classroom") }}</h4>
-                            <h4 class="basic-data">{{ courseNow.roomName }}</h4>
+                            <h4 class="basic-data">{{ course.roomName }}</h4>
 
 
                             <h4 class="basic-title">{{ $t("studentWeb.courseContent.teacher") }}</h4>
                             <h4 class="basic-title">{{ $t("studentWeb.courseContent.teacher") }}</h4>
-                            <h4 class="basic-data">{{ courseNow.course.teaName }}</h4>
+                            <h4 class="basic-data">{{ course.course.teaName }}</h4>
 
 
                             <h4 class="basic-title">{{ $t("studentWeb.courseContent.co-teacher") }}</h4>
                             <h4 class="basic-title">{{ $t("studentWeb.courseContent.co-teacher") }}</h4>
                             <!-- <span class="basic-data"
                             <!-- <span class="basic-data"
-                                v-for="(teacher, index) in courseNow.assistantTeachers"
+                                v-for="(teacher, index) in course.assistantTeachers"
                                 :key="index"
                                 :key="index"
                             >
                             >
                                 {{ teacher }}
                                 {{ teacher }}
-                                <span v-if="index < courseNow.assistantTeachers.length - 1">、</span>
+                                <span v-if="index < course.assistantTeachers.length - 1">、</span>
                             </span> -->
                             </span> -->
 
 
                             <h4 class="basic-title">{{ $t("studentWeb.courseContent.addedTime") }}</h4>
                             <h4 class="basic-title">{{ $t("studentWeb.courseContent.addedTime") }}</h4>
-                            <h4 class="basic-data">{{ courseNow.courseAddDate }}</h4>
+                            <h4 class="basic-data">{{ course.courseAddDate }}</h4>
                         </i-col>
                         </i-col>
                         <i-col :xs="24" :sm="24" :md="16" :lg="16">
                         <i-col :xs="24" :sm="24" :md="16" :lg="16">
                             <h4 class="basic-title">{{ $t("studentWeb.courseContent.courseCode") }}</h4>
                             <h4 class="basic-title">{{ $t("studentWeb.courseContent.courseCode") }}</h4>
@@ -58,7 +58,7 @@
                 </TabPane>
                 </TabPane>
                 <!-- 课程概述 -->
                 <!-- 课程概述 -->
                 <TabPane :label="$t('studentWeb.courseContent.description')" name="tab2">
                 <TabPane :label="$t('studentWeb.courseContent.description')" name="tab2">
-                    {{ courseNow.notice }}
+                    {{ course.notice }}
                     <h3 style="margin-top: 30px; margin-bottom: 10px">{{ $t("studentWeb.courseContent.syllabus") }}</h3>
                     <h3 style="margin-top: 30px; margin-bottom: 10px">{{ $t("studentWeb.courseContent.syllabus") }}</h3>
                     <Collapse simple>
                     <Collapse simple>
                         <Panel name="1">
                         <Panel name="1">
@@ -177,6 +177,7 @@
 <script>
 <script>
 import loading from "vue-loading-overlay";
 import loading from "vue-loading-overlay";
 import "vue-loading-overlay/dist/vue-loading.css";
 import "vue-loading-overlay/dist/vue-loading.css";
+import { mapGetters } from 'vuex';
 export default {
 export default {
     name: "courseContent",
     name: "courseContent",
     components: {
     components: {
@@ -242,8 +243,46 @@ export default {
         roomList: {
         roomList: {
             type: Array,
             type: Array,
             default: []
             default: []
+        },
+        course: {
+            type: Object,
+            default: {}
         }
         }
     },
     },
+    mounted () {
+        if(Object.keys(this.course).length) {
+            this.isLoad = true
+            this.isNoInfo = false
+            this.showInfo = true
+            // 处理时间
+            if(this.course.course.timeWeek) {
+                this.week.map(item => {
+                    if(item.name == this.course.course.timeWeek) {
+                        this.course.classTime = item.cn + " " + this.course.time
+                    }
+                })
+            }
+            else {
+                this.course.classTime = this.$t("studentWeb.courseContent.noTime")
+            }
+            this.course.roomName = this.$t("studentWeb.courseContent.noRoom")
+            // 获取教室名称
+            if(this.roomList) {
+                for (let i = 0; i < this.roomList.length; i++) {
+                    if(this.roomList[i].id == this.course.course.room) {
+                        this.course.roomName = this.roomList[i].name
+                        break
+                    }
+                }
+            }
+            // 获取学生名单
+            if(this.course.course.classId != "" && this.course.course.classId) {
+                this.findStuInfor(this.course.course)
+            } else if(this.course.course.stuList != "") {
+                this.findPersonInfo(this.course.course)
+            }
+        }  
+    },
     methods: {
     methods: {
         changeGroupView() {
         changeGroupView() {
             this.isChangeGroupView = !this.isChangeGroupView
             this.isChangeGroupView = !this.isChangeGroupView
@@ -318,13 +357,12 @@ export default {
     },
     },
     computed: {
     computed: {
         // 当前的活动
         // 当前的活动
-        courseNow() {
-            return this.$store.getters.getItemTitle
-        }
+        ...mapGetters(["getItemTitle"]),
     },
     },
     watch: {
     watch: {
-        courseNow: {
-            handler(n, o) {
+        course: {
+            /* handler(n, o) {
+                console.log('2101010')
                 this.showInfo = false
                 this.showInfo = false
                 if(Object.keys(n).length) {
                 if(Object.keys(n).length) {
                     this.isLoad = true
                     this.isLoad = true
@@ -361,8 +399,10 @@ export default {
                 else {
                 else {
                     console.log(222222, n);
                     console.log(222222, n);
                 }
                 }
-            }
-        }
+            } */
+        },
+        immediate: true,
+        deep:true
     }
     }
 }
 }
 </script>
 </script>

+ 26 - 9
TEAMModelOS/ClientApp/src/components/student-web/HomeView/CourseList.vue

@@ -92,7 +92,7 @@
                                             <div v-if="item.timeWeek == 'MON'"
                                             <div v-if="item.timeWeek == 'MON'"
                                                 class="table-item"
                                                 class="table-item"
                                                 @click="clickCell(row, index)"
                                                 @click="clickCell(row, index)"
-                                                :class="{'table-item-selected': unique == item.unique }"
+                                                :class="{'table-item-selected': selectedCondition(item) }"
                                             >
                                             >
                                                 <p class="list-name">{{ item.name}}</p>
                                                 <p class="list-name">{{ item.name}}</p>
                                                 <p>({{ item.teaName}})</p>
                                                 <p>({{ item.teaName}})</p>
@@ -105,7 +105,7 @@
                                             <div v-if="item.timeWeek == 'TUE'"
                                             <div v-if="item.timeWeek == 'TUE'"
                                                 class="table-item"
                                                 class="table-item"
                                                 @click="clickCell(row, index)"
                                                 @click="clickCell(row, index)"
-                                                :class="{'table-item-selected': unique == item.unique }"
+                                                :class="{'table-item-selected': selectedCondition(item) }"
                                             >
                                             >
                                                 <p class="list-name">{{ item.name}}</p>
                                                 <p class="list-name">{{ item.name}}</p>
                                                 <p>({{ item.teaName}})</p>
                                                 <p>({{ item.teaName}})</p>
@@ -118,7 +118,7 @@
                                             <div v-if="item.timeWeek == 'WED'"
                                             <div v-if="item.timeWeek == 'WED'"
                                                 class="table-item"
                                                 class="table-item"
                                                 @click="clickCell(row, index)"
                                                 @click="clickCell(row, index)"
-                                                :class="{'table-item-selected': unique == item.unique }"
+                                                :class="{'table-item-selected': selectedCondition(item) }"
                                             >
                                             >
                                                 <p class="list-name">{{ item.name}}</p>
                                                 <p class="list-name">{{ item.name}}</p>
                                                 <p>({{ item.teaName}})</p>
                                                 <p>({{ item.teaName}})</p>
@@ -131,7 +131,7 @@
                                             <div v-if="item.timeWeek == 'THU'"
                                             <div v-if="item.timeWeek == 'THU'"
                                                 class="table-item"
                                                 class="table-item"
                                                 @click="clickCell(row, index)"
                                                 @click="clickCell(row, index)"
-                                                :class="{'table-item-selected': unique == item.unique }"
+                                                :class="{'table-item-selected': selectedCondition(item) }"
                                             >
                                             >
                                                 <p class="list-name">{{ item.name}}</p>
                                                 <p class="list-name">{{ item.name}}</p>
                                                 <p>({{ item.teaName}})</p>
                                                 <p>({{ item.teaName}})</p>
@@ -144,7 +144,7 @@
                                             <div v-if="item.timeWeek == 'FRI'"
                                             <div v-if="item.timeWeek == 'FRI'"
                                                 class="table-item"
                                                 class="table-item"
                                                 @click="clickCell(row, index)"
                                                 @click="clickCell(row, index)"
-                                                :class="{'table-item-selected': unique == item.unique }"
+                                                :class="{'table-item-selected': selectedCondition(item) }"
                                             >
                                             >
                                                 <p class="list-name">{{ item.name}}</p>
                                                 <p class="list-name">{{ item.name}}</p>
                                                 <p>({{ item.teaName}})</p>
                                                 <p>({{ item.teaName}})</p>
@@ -208,7 +208,7 @@
                                     <li
                                     <li
                                         class="list-item"
                                         class="list-item"
                                         v-for="(person, num) in personList"
                                         v-for="(person, num) in personList"
-                                        :class="{ 'list-item-selected': unique == person.unique }"
+                                        :class="{'list-item-selected': selectedCondition(person)}"
                                         @click="clickCell(person, num, 'list')"
                                         @click="clickCell(person, num, 'list')"
                                         :key="`j+${num}`"
                                         :key="`j+${num}`"
                                     >
                                     >
@@ -237,7 +237,7 @@
 <script>
 <script>
 import Loading from "vue-loading-overlay";
 import Loading from "vue-loading-overlay";
 import "vue-loading-overlay/dist/vue-loading.css";
 import "vue-loading-overlay/dist/vue-loading.css";
-import { mapState } from 'vuex';
+import { mapGetters, mapState } from 'vuex';
 export default {
 export default {
     name: "CourseList",
     name: "CourseList",
     components: {
     components: {
@@ -318,6 +318,9 @@ export default {
         })
         })
         this.getClassList()
         this.getClassList()
     },
     },
+    mounted () {
+        this.selectedCondition(this.getItemTitle)
+    },
     methods: {
     methods: {
         getClassList() {
         getClassList() {
             this.isLoad = true
             this.isLoad = true
@@ -386,7 +389,7 @@ export default {
             data.school = subject.stuCourse.school
             data.school = subject.stuCourse.school
             data.scope = subject.stuCourse.scope
             data.scope = subject.stuCourse.scope
             data.classId = schedule.classId
             data.classId = schedule.classId
-            data.room = schedule.room
+            data.roomId = schedule.room
             data.teacherId = schedule.teacherId
             data.teacherId = schedule.teacherId
             data.notice = schedule.notice
             data.notice = schedule.notice
             data.stuList = schedule.stulist
             data.stuList = schedule.stulist
@@ -494,6 +497,19 @@ export default {
         changeView(type) {
         changeView(type) {
             this.currentView = type
             this.currentView = type
         },
         },
+        selectedCondition(item) {
+            if(Object.keys(this.getItemTitle).length) {
+                if (this.getItemTitle.course.id == item.id
+                    && this.getItemTitle.course.teacherId == item.teacherId
+                    && this.getItemTitle.course.timeId == item.timeId
+                    && this.getItemTitle.course.timeWeek == item.timeWeek
+                    && this.getItemTitle.course.roomId == item.roomId
+                ) {
+                    console.log(11111);
+                    return true;
+                } else return false;
+            }
+        },
         // 跳转到当前课程
         // 跳转到当前课程
         sentSelectedEventTitle: function (item) {
         sentSelectedEventTitle: function (item) {
             // 改變ItemName的狀態 vuex mutations
             // 改變ItemName的狀態 vuex mutations
@@ -508,7 +524,8 @@ export default {
         ...mapState({
         ...mapState({
             userInfo: state => state.userInfo,
             userInfo: state => state.userInfo,
             studentProfile: state => state.user.studentProfile
             studentProfile: state => state.user.studentProfile
-        })
+        }),
+        ...mapGetters(["getItemTitle"])
     }
     }
 };
 };
 </script>
 </script>

+ 766 - 66
TEAMModelOS/ClientApp/src/components/student-web/HomeView/CourseListView.vue

@@ -1,81 +1,781 @@
 <template>
 <template>
-  <div class="courselist-view">
-    <CourseList :class="{ 'hide-sidebar': this.$store.getters.getSidebarisOpen == false}"
-        :period="period"
-        :teaList="teaList"
-        v-if="isShow"
-    />
-    <CourseContent :class="{'course-content-span': this.$store.getters.getSidebarisOpen == false}"
-        :roomList="roomList"
-        v-if="isShow"
-    />
-  </div>
+    <div class="courselist-view">
+        <loading :active.sync="isLoad"
+                  :is-full-page="true"
+                  background-color="#000"
+                  :opacity="0.6">
+            <template slot="default">
+                <svg-icon icon-class="loader" class="loader-icon" />
+            </template>
+        </loading>
+        <!-- 列表 -->
+        <div class="course-list"
+            :class="{ courselistEn: this.$store.getters.getCurrentLaguage == 'en-us' }"
+        >
+            <!--課程加入成功-->
+            <div class="warmMessage"
+                v-if=" this.$store.getters.getMycID.coureseMessageOpen == true &&
+                        this.$store.getters.getMycID.addSuccess == true "
+            >
+                <div class="messageCard animate__animated animate__fadeInDown">
+                    <div>
+                        <h3>課程加入成功</h3>
+                        <svg-icon icon-class="addCourseSuc" class="addCourseIcon" />
+
+                        <h3>
+                            <span class="typeMark">{{ this.$store.getters.getMycID.myCourseID[  this.$store.getters.getMycID.myCourseID.length - 1 ] }}</span>
+                            <span>新加課程名稱</span>
+                        </h3>
+                        <p>可於左側課程清單檢視課程簡介</p>
+                    </div>
+                </div>
+            </div>
+
+            <!--課程已經加入-->
+            <div class="warmMessage"
+                v-if="this.$store.getters.getMycID.coureseMessageOpen == true &&
+                    this.$store.getters.getMycID.addSuccess == 'exist'"
+            >
+                <div class="messageCard animate__animated animate__fadeInDown">
+                    <div>
+                        <h3>課程已經加入</h3>
+                        <svg-icon icon-class="addCoursefail" class="addCourseIcon" />
+                        <p>可於左側課程清單檢視該課程簡介</p>
+                    </div>
+                </div>
+            </div>
+
+            <!--課程加入失敗-->
+            <div class="warmMessage"
+                v-if="this.$store.getters.getMycID.coureseMessageOpen == true &&
+                    this.$store.getters.getMycID.addSuccess == false"
+            >
+                <div class="messageCard animate__animated animate__fadeInDown">
+                    <div>
+                        <h3>課程加入失敗</h3>
+                        <svg-icon icon-class="addCoursefail" class="addCourseIcon" />
+                        <p>查無所輸入代碼之課程,或該課程您未獲教師授權參與</p>
+                    </div>
+                </div>
+            </div>
+
+            <div class="list">
+                <ul class="list-block">
+                    <Tabs :value="onlyStu ? (this.$store.getters.getMycID.addSuccess == true ? 'tab2' : 'tab1') : 'tab2' ">
+                        <!-- 表定课程 -->
+                        <TabPane :label="$t('studentWeb.defaultClass')"
+                                name="tab1"
+                                :align="currentView == 'table' ? 'center' : 'left'"
+                                v-if="onlyStu"
+                        >
+                            <div class="list-table">
+                                <Table :columns="courseTime"
+                                        border
+                                        :data="timeTable"
+                                        v-show="currentView == 'table'"
+                                        :disabled-hover="true"
+                                >
+                                    <!-- 时间 -->
+                                    <template slot-scope="{ row }" slot="time">
+                                        <p class="list-name">{{ row.time }}</p>
+                                        <p>{{ row.label }}</p>
+                                    </template>
+                                    <!-- 周一 -->
+                                    <template slot-scope="{ row }" slot="Mon">
+                                        <div v-for="(item, index) in row.fixList" :key="index">
+                                            <div v-if="item.timeWeek == 'MON'"
+                                                class="table-item"
+                                                @click="clickCell(row, index)"
+                                                :class="{'table-item-selected': unique == item.unique }"
+                                            >
+                                                <p class="list-name">{{ item.name}}</p>
+                                                <p>({{ item.teaName}})</p>
+                                            </div>
+                                        </div>
+                                    </template>
+                                    <!-- 周二 -->
+                                    <template slot-scope="{ row }" slot="Tue">
+                                        <div v-for="(item, index) in row.fixList" :key="index">
+                                            <div v-if="item.timeWeek == 'TUE'"
+                                                class="table-item"
+                                                @click="clickCell(row, index)"
+                                                :class="{'table-item-selected': unique == item.unique }"
+                                            >
+                                                <p class="list-name">{{ item.name}}</p>
+                                                <p>({{ item.teaName}})</p>
+                                            </div>
+                                        </div>
+                                    </template>
+                                    <!-- 周三 -->
+                                    <template slot-scope="{ row }" slot="Wed">
+                                        <div v-for="(item, index) in row.fixList" :key="index">
+                                            <div v-if="item.timeWeek == 'WED'"
+                                                class="table-item"
+                                                @click="clickCell(row, index)"
+                                                :class="{'table-item-selected': unique == item.unique }"
+                                            >
+                                                <p class="list-name">{{ item.name}}</p>
+                                                <p>({{ item.teaName}})</p>
+                                            </div>
+                                        </div>
+                                    </template>
+                                    <!-- 周四 -->
+                                    <template slot-scope="{ row }" slot="Thu">
+                                        <div v-for="(item, index) in row.fixList" :key="index">
+                                            <div v-if="item.timeWeek == 'THU'"
+                                                class="table-item"
+                                                @click="clickCell(row, index)"
+                                                :class="{'table-item-selected': unique == item.unique }"
+                                            >
+                                                <p class="list-name">{{ item.name}}</p>
+                                                <p>({{ item.teaName}})</p>
+                                            </div>
+                                        </div>
+                                    </template>
+                                    <!-- 周五 -->
+                                    <template slot-scope="{ row }" slot="Fri">
+                                        <div v-for="(item, index) in row.fixList" :key="index">
+                                            <div v-if="item.timeWeek == 'FRI'"
+                                                class="table-item"
+                                                @click="clickCell(row, index)"
+                                                :class="{'table-item-selected': unique == item.unique }"
+                                            >
+                                                <p class="list-name">{{ item.name}}</p>
+                                                <p>({{ item.teaName}})</p>
+                                            </div>
+                                        </div>
+                                    </template>
+                                </Table>
+                            </div>
+                        </TabPane>
+                        <!-- 临时课程 -->
+                        <TabPane :label="$t('studentWeb.tempClass')" name="tab2">
+                            <div v-if="personList.length">
+                                <!-- <div v-for="(item, index) in timeTable" :key="index"> -->
+                                    <li
+                                        class="list-item"
+                                        v-for="(person, num) in personList"
+                                        :class="{'list-item-selected': unique == person.unique}"
+                                        @click="clickCell(person, num, 'list')"
+                                        :key="`j+${num}`"
+                                    >
+                                        <ul>
+                                            <li class="list-item-info">
+                                                <p class="list-item-title">
+                                                    <span class="list-item-typeMark">{{ person.no }}</span>
+                                                    {{ person.name }}({{ person.teaName }})
+                                                </p>
+                                            </li>
+                                        </ul>
+                                    </li>
+                                <!-- </div> -->
+                            </div>
+                            <div v-else class="list-item-no">
+                                {{ $t('studentWeb.courseContent.noCourse') }}
+                            </div>
+                        </TabPane>
+                    </Tabs>
+                </ul>
+            </div>
+        </div>
+        <!-- 基本信息 -->
+        <div class="course-content"
+            :class="{ courseContentEn: this.$store.getters.getCurrentLaguage == 'en-us' }"
+            v-if="showInfo"
+        >
+            <h2>{{ courseNow.name }}</h2>
+            <!-- <h3 class="course-subject">國中/二年級/{{courseNow.courseSubject}}</h3> -->
+            <div @click="changeGroupView()"
+                :class="{ 'group-on': isChangeGroupView }"
+                v-if="name == 'tab3'"
+            >
+                <svg-icon icon-class="group" class="group-btn" />
+            </div>
+
+            <Tabs v-model="name">
+                <!-- 基本资讯 -->
+                <TabPane :label="$t('studentWeb.courseContent.baseInfo')" name="tab1">
+                    <Row :gutter="30">
+                        <i-col :xs="24" :sm="24" :md="8" :lg="8">
+                            <h4 class="basic-title">{{ $t("studentWeb.courseContent.classID") }}</h4>
+                            <h4 class="basic-data">{{ courseNow.no }}</h4>
+
+                            <h4 class="basic-title">{{ $t("studentWeb.courseContent.classTime") }}</h4>
+                            <h4 class="basic-data">{{ courseNow.classTime }}</h4>
+
+                            <h4 class="basic-title">{{ $t("studentWeb.courseContent.classroom") }}</h4>
+                            <h4 class="basic-data">{{ courseNow.roomName }}</h4>
+
+                            <h4 class="basic-title">{{ $t("studentWeb.courseContent.teacher") }}</h4>
+                            <h4 class="basic-data">{{ courseNow.teaName }}</h4>
+
+                            <h4 class="basic-title">{{ $t("studentWeb.courseContent.co-teacher") }}</h4>
+                            <!-- <span class="basic-data"
+                                v-for="(teacher, index) in courseNow.assistantTeachers"
+                                :key="index"
+                            >
+                                {{ teacher }}
+                                <span v-if="index < courseNow.assistantTeachers.length - 1">、</span>
+                            </span> -->
+
+                            <h4 class="basic-title">{{ $t("studentWeb.courseContent.addedTime") }}</h4>
+                            <h4 class="basic-data">{{ courseNow.courseAddDate }}</h4>
+                        </i-col>
+                        <i-col :xs="24" :sm="24" :md="16" :lg="16">
+                            <h4 class="basic-title">{{ $t("studentWeb.courseContent.courseCode") }}</h4>
+                            <img src="mockqrcode.jpg" width="30%" style='margin-left: -12px'>
+                        </i-col>
+                    </Row>
+                </TabPane>
+                <!-- 课程概述 -->
+                <TabPane :label="$t('studentWeb.courseContent.description')" name="tab2">
+                    {{ courseNow.notice }}
+                    <h3 style="margin-top: 30px; margin-bottom: 10px">{{ $t("studentWeb.courseContent.syllabus") }}</h3>
+                    <Collapse simple>
+                        <Panel name="1">
+                            1. 史蒂夫·乔布斯
+                            <div slot="content">
+                                史蒂夫·乔布斯(Steve
+                                Jobs),1955年2月24日生于美国加利福尼亚州旧金山,美国发明家、企业家、美国苹果公司联合创办人。
+                                <br />
+                                <br />
+                                <Collapse simple>
+                                    <Panel name="1-1">
+                                        iPhone
+                                        <p slot="content">
+                                        iPhone,是美国苹果公司研发的智能手机,它搭载iOS操作系统。第一代iPhone于2007年1月9日由苹果公司前首席执行官史蒂夫·乔布斯发布,并在2007年6月29日正式发售。
+                                        </p>
+                                    </Panel>
+                                    <Panel name="1-2">
+                                        iPad
+                                        <p slot="content">
+                                        iPad是由苹果公司于2010年开始发布的平板电脑系列,定位介于苹果的智能手机iPhone和笔记本电脑产品之间,(屏幕中有4个虚拟程序固定栏)与iPhone布局一样,提供浏览网站、收发电子邮件、观看电子书、播放音频或视频、玩游戏等功能。由英国出生的设计主管乔纳森·伊夫(Jonathan
+                                        Ive)(有些翻译为
+                                        乔纳森·艾维)领导的团队设计的,这个圆滑、超薄的产品反映出了伊夫对德国天才设计师Dieter
+                                        Rams的崇敬之情。
+                                        </p>
+                                    </Panel>
+                                </Collapse>
+                            </div>
+                        </Panel>
+                        <Panel name="2">
+                            2. 斯蒂夫·盖瑞·沃兹尼亚克
+                            <p slot="content">
+                            斯蒂夫·盖瑞·沃兹尼亚克(Stephen Gary
+                            Wozniak),美国电脑工程师,曾与史蒂夫·乔布斯合伙创立苹果电脑(今之苹果公司)。斯蒂夫·盖瑞·沃兹尼亚克曾就读于美国科罗拉多大学,后转学入美国著名高等学府加州大学伯克利分校(UC
+                            Berkeley)并获得电机工程及计算机(EECS)本科学位(1987年)。
+                            </p>
+                        </Panel>
+                        <Panel name="3">
+                            3. 乔纳森·伊夫
+                            <p slot="content">
+                            乔纳森·伊夫是一位工业设计师,现任Apple公司设计师兼资深副总裁,英国爵士。他曾参与设计了iPod,iMac,iPhone,iPad等众多苹果产品。除了乔布斯,他是对苹果那些著名的产品最有影响力的人。
+                            </p>
+                        </Panel>
+                    </Collapse>
+                </TabPane>
+                <!-- 同学名单 -->
+                <TabPane :label="$t('studentWeb.courseContent.classmates')" name="tab3">
+                    <div v-show="!isChangeGroupView">
+                        <Table :columns="stuCol" :data="stuList">
+                            <template slot-scope="{ row }" slot="no">
+                                <p :class="{'my-name': row.id == $store.state.userInfo.sub}">
+                                    {{row.no}}
+                                </p>
+                            </template>
+                            <template slot-scope="{ row }" slot="id">
+                                <p :class="{'my-name': row.id == $store.state.userInfo.sub}">
+                                    {{row.id}}
+                                </p>
+                            </template>
+                            <template slot-scope="{ row }" slot="name">
+                                <p :class="{'my-name': row.id == $store.state.userInfo.sub}">
+                                    {{row.name}}
+                                </p>
+                            </template>
+                            <template slot-scope="{ row }" slot="groupName">
+                                <p :class="{'my-name': row.id == $store.state.userInfo.sub}">
+                                    {{row.groupName ? row.groupName : $t("studentWeb.courseContent.noGroup")}}
+                                </p>
+                            </template>
+                        </Table>
+                    </div>
+                    <!--小組模式-->
+                    <div v-show="isChangeGroupView">
+                        <Card class="group-student"
+                            v-for="(group, gIndex) in stuGroup"
+                            :key="gIndex">
+                            <h3 class="group-title" v-if="group.name">
+                                {{ group.name }}
+                            </h3>
+                            <h3 class="group-title" v-else>{{ $t("studentWeb.courseContent.noGroup") }}</h3>
+                            <table>
+                                <tr v-for="(item, index) in group.info"
+                                    :key="`a${index}`"
+                                >
+                                    <td class="student-no" :class="{ 'my-name': item.id == $store.state.userInfo.sub }">
+                                        {{ item.no }}
+                                    </td>
+                                    <td class="student-name" :class="{ 'my-name': item.id == $store.state.userInfo.sub }">
+                                        {{ item.name }}
+                                        <span v-if="item.id == $store.state.userInfo.sub">({{ $t("studentWeb.courseContent.me") }})</span>
+                                    </td>
+                                </tr>
+                            </table>
+                        </Card>
+                    </div>
+                </TabPane>
+                <!-- 醍摩豆 -->
+                <TabPane :label="$t('studentWeb.courseContent.classmates1')" name="tab4" v-if="tmdList.length > 0 || $store.state.userInfo.roles.includes('teacher')">
+                    <Table :columns="tmdCol" :data="tmdList">
+                        <template slot-scope="{ row }" slot="id">
+                            <p :class="{'my-name': row.id == $store.state.userInfo.sub}">
+                                {{row.id}}
+                            </p>
+                        </template>
+                        <template slot-scope="{ row }" slot="name">
+                            <p :class="{'my-name': row.id == $store.state.userInfo.sub}">
+                                {{row.name}}
+                            </p>
+                        </template>
+                    </Table>
+                </TabPane>
+            </Tabs>
+        </div>
+    </div>
 </template>
 </template>
 
 
 <script>
 <script>
-
-import CourseList from "./CourseList";
-import CourseContent from "./CourseContent";
+import Loading from "vue-loading-overlay";
+import "vue-loading-overlay/dist/vue-loading.css";
+import { mapGetters, mapState } from 'vuex';
 
 
 export default {
 export default {
-  name: "CourseListView",
-  components: {
-    CourseList,
-    CourseContent
-  },
-  data() {
-    return {
-      MyNo: "",
-      MyName: this.$t('studentWeb.courseList-title'),
-      isShow: false,
-      roomList: [], //教室列表
-      period: [], //年级列表
-      teaList: [], //老师列表
-    };
-  },
-
-  methods: {
-    // 查找班级
-    findSchoolInfo() {
-      let params = {}
-      // 醍摩豆登陆——> roles有teacher
-      if (this.$store.state.userInfo.roles.includes("teacher")) {
-          params = {userType: "tmdid"}
-      }
-      // 学生账号登陆
-      else {
-          params = {userType: "schoolid"}
-      }
-      this.$api.studentWeb.getSchoolInfo(params).then(res => {
-        if(res.status == 200) {
-          this.period = res.school_base.period
-          this.roomList = res.school_rooms
-        }
-      })
+    name: "CourseListView",
+    components: {
+        Loading
+    },
+    data(vm) {
+        return {
+            MyNo: "",
+            MyName: this.$t('studentWeb.courseList-title'),
+            isShow: false,
+            period: [], //年级列表
+            isLoad: false,
+            currentView: 'table',
+            onlyStu: true, //是不是学生
+            courseTime: [
+                {
+                    title: this.$t("studentWeb.week.time"),
+                    slot: "time",
+                    width: "140"
+                },
+                {
+                    title: this.$t("studentWeb.week.mon"),
+                    slot: "Mon",
+                    width: "115"
+                },
+                {
+                    title: this.$t("studentWeb.week.tue"),
+                    slot: "Tue",
+                    width: "115"
+                },
+                {
+                    title: this.$t("studentWeb.week.wed"),
+                    slot: "Wed",
+                    width: "115"
+                },
+                {
+                    title: this.$t("studentWeb.week.thu"),
+                    slot: "Thu",
+                    width: "115"
+                },
+                {
+                    title: this.$t("studentWeb.week.fri"),
+                    slot: "Fri",
+                    width: "115"
+                },
+                {
+                    title: this.$t("studentWeb.week.sat"),
+                    // slot: "Fri",
+                    width: "100"
+                },
+                {
+                    title: this.$t("studentWeb.week.sun"),
+                    // slot: "Fri",
+                    width: "100"
+                }
+            ],
+            fixList: [], //表定课程
+            personList: [], //临时课程
+            timeTable: [], //页面所有的课程
+            unique: '',
+            courseNow: {},
+            showInfo: false,
+            isChangeGroupView: false, //控制名单样式
+            name: "tab1",
+            week: [
+                {
+                    name: "MON",
+                    cn: vm.$t("studentWeb.week.mon")
+                }, {
+                    name: "TUE",
+                    cn: vm.$t("studentWeb.week.tue")
+                }, {
+                    name: "WED",
+                    cn: vm.$t("studentWeb.week.wed")
+                }, {
+                    name: "THU",
+                    cn: vm.$t("studentWeb.week.thu")
+                }, {
+                    name: "FRI",
+                    cn: vm.$t("studentWeb.week.fri")
+                }
+            ],
+            stuCol: [
+                {
+                    title: vm.$t("studentWeb.courseContent.seatNo"),
+                    slot: "no",
+                },
+                {
+                    title: vm.$t("studentWeb.courseContent.stuNum"),
+                    slot: "id",
+                },
+                {
+                    title: vm.$t("studentWeb.courseContent.name"),
+                    slot: "name",
+                },
+                {
+                    title: vm.$t("studentWeb.courseContent.group"),
+                    slot: "groupName",
+                }
+            ],
+            tmdCol: [
+                {
+                    title: vm.$t("studentWeb.courseContent.tmdNum"),
+                    slot: "id",
+                },
+                {
+                    title: vm.$t("studentWeb.courseContent.name"),
+                    slot: "name",
+                },
+            ],
+            stuGroup: [], //学生——小组名单
+            stuList: [], //学生——table
+            tmdList: [], //醍摩豆列表
+        };
+    },
+
+    methods: {
+        // 查找班级
+        findSchoolInfo() {
+            let params = {}
+            // 醍摩豆登陆——> roles有teacher
+            if (this.$store.state.userInfo.roles.includes("teacher")) {
+                params = {userType: "tmdid"}
+            }
+            // 学生账号登陆
+            else {
+                params = {userType: "schoolid"}
+            }
+            this.$api.studentWeb.getSchoolInfo(params).then(res => {
+                if(res.status == 200) {
+                    this.period = res.school_base.period
+                }
+            })
+        },
+        changeGroupView() {
+            this.isChangeGroupView = !this.isChangeGroupView
+        },
+        // 查找学生信息(标准)
+        findStuInfor(course) {
+            this.stuGroup = []
+            this.stuList = []
+            let req = {
+                school_code: course.school,
+                scope: course.scope,
+                ids: [course.classId]
+            }
+            this.$api.studentWeb.getClassroomStudent(req).then(res => {
+                this.stuList = this._.cloneDeep(res.stus[0])
+                this.getGroup(res.stus[0])
+            }).finally(() => {
+                this.isLoad = false
+            })
+        },
+        // 查找学生(个人)
+        findPersonInfo(course) {
+            this.stuGroup = []
+            this.stuList = []
+            this.tmdList = []
+            let reqList = {
+                code: course.scope == 'school' ? course.school : course.creatorId,
+                // code: course.teacherId,
+                ids: [course.stuList],
+                scope: course.scope
+            }
+            this.$api.studentWeb.findListSummary(reqList).then(res => {
+                if(res.stuList.length) {
+                    if(res.stuList[0].students.length) {
+                        this.$api.studentWeb.findStuSummary({
+                            students: res.stuList[0].students,
+                            tmdIds: res.stuList[0].tmids
+                        }).then(res => {
+                            if(res.stus.length) {
+                                this.stuList = this._.cloneDeep(res.stus)
+                                this.tmdList = this._.cloneDeep(res.tmdinfos)
+                                this.getGroup(res.stus)
+                            }
+                        }).finally(() => {
+                            this.isLoad = false
+                        })
+                    } else {
+                        this.isLoad = false
+                    }
+                } else {
+                    this.isLoad = false
+                }
+            })
+        },
+        // 学生分组
+        getGroup(data) {
+            for (let i = 0; i < data.length; i++) {
+                this.stuGroup.push({
+                    id: data[i].groupId,
+                    name: data[i].groupName,
+                    info: [data[i]]
+                })
+                for (let j = i + 1; j < data.length; j++) {
+                    if(data[i].groupId == data[j].groupId) {
+                        this.stuGroup[i].info.push(data[j])
+                        data.splice(j,1)
+                        j--
+                    }
+                }
+            }
+        },
+
+        getClassList() {
+            this.isLoad = true
+            let param = {
+                userid: this.userInfo.sub,
+                school: this.userInfo.azp
+            }
+            if(this.userInfo.roles.includes("teacher")) {
+                param.userType = "tmdid"
+            } else {
+                param.userType = "schoolid"
+            }
+            this.$api.studentWeb.getClassList(param).then(res => {
+                if(res.courses.length) {
+                    // 表定课程
+                    var fixList = []
+                    // 临时课程
+                    var personList = []
+                    var list = res.courses
+                    list.forEach(item => {
+                        if(item.course) {
+                            item.course.schedule.forEach((sch, sIn) => {
+                                // 有classId,表定课程
+                                if(sch.classId == item.stuCourse.classId[0]) {
+                                    if(sch.time.length > 0) {
+                                        for (let m = 0; m < sch.time.length; m++) {
+                                            let data = this.getNewCourse("class", item, sch, sIn, m)
+                                            fixList.push(data)
+                                        }
+                                    }
+                                    else {
+                                        let datanoTime = this.getNewCourse("class", item, sch, sIn)
+                                        fixList.push(datanoTime)
+                                    }
+                                }
+                                // 有stulist,临时课程
+                                else if (sch.stulist) {
+                                    if(sch.time.length) {
+                                        for (let m = 0; m < sch.time.length; m++) {
+                                            let data = this.getNewCourse("person", item, sch, sIn, m)
+                                            personList.push(data)
+                                        }
+                                    }
+                                    // 没有时间
+                                    else {
+                                        let data = this.getNewCourse("person", item, sch, sIn)
+                                        personList.push(data)
+                                    }
+                                }
+                            })
+                        }
+                    })
+                    this.fixList = fixList
+                    this.personList = personList
+                    this.getClassTime()
+                }
+            }).finally(()=>{
+                this.isLoad = false
+            })
+        },
+        // 课程的相关信息(attribute: "class/person")
+        getNewCourse(attribute, subject, schedule, sIndex, m) {
+            let data = this._.cloneDeep(subject.course)
+            delete data.schedule
+            data.school = subject.stuCourse.school
+            data.scope = subject.stuCourse.scope
+            data.classId = schedule.classId
+            // data.roomId = schedule.room
+            // data.teacherId = schedule.teacherId
+            data.notice = schedule.notice
+            data.stuList = schedule.stulist
+            data.classTime = this.$t("studentWeb.courseContent.noTime")
+            if(m !== undefined) {
+                data.timeId = schedule.time[m].id
+                data.timeWeek = schedule.time[m].week
+                this.week.map(item => {
+                    if(item.name == schedule.time[m].week) {
+                        data.classTime = item.cn
+                    }
+                })
+                // 拼接得到一个唯一的标识
+                data.unique = attribute + subject.course.no + sIndex + m
+            }
+            // 没有时间的情况
+            else {
+                data.timeId = 0
+                data.timeWeek = 0
+                data.unique = attribute + subject.course.no + sIndex
+            }
+            data.roomName = schedule.roomName ? schedule.roomName : this.$t("studentWeb.courseContent.noRoom")
+            data.teaName = schedule.teacherName ? schedule.teacherName : this.$t('studentWeb.courseContent.noTeacher')
+            return data
+        },
+        // 处理上课时间
+        getClassTime() {
+            // 学生登陆
+            if(this.onlyStu) {
+                this.timeTable = this.period.find(item => {
+                    return item.id == this.studentProfile.classinfo.periodId
+                }).timetable
+                this.timeTable.forEach(item => {
+                    let newfixlist = []
+                    let notime = [] //没有时间的标准课程
+                    this.fixList.forEach(fix => {
+                        if(fix.timeId == item.id && fix.timeId) {
+                            fix.classTime = fix.classTime + " " + item.time + " (" + item.label + ")"
+                            newfixlist.push(fix)
+                        }
+                        // 没有时间的标准课程
+                        else if (!fix.timeId) {
+                            notime.push(fix)
+                        }
+                    })
+                    item.fixList = newfixlist
+                    item.noTime = notime
+                })
+                // 个人课程
+                this.personList.forEach(per => {
+                    if(per.timeId) {
+                        this.timeTable.forEach(item => {
+                            if(per.timeId == item.id) {
+                                per.time = item.time
+                            }
+                        })
+                    }
+                })
+            }
+            // 醍摩豆登陆
+            else if (this.personList.length) {
+                // 年级id 存在
+                if(this.personList[0].period.id != undefined) {
+                    this.timetable = this.period.find(item => {
+                        return item.id == this.personList[0].period.id
+                    }).timetable
+                    this.timeTable.forEach(item => {
+                        let newpersonList = []
+                        this.personList.forEach(per => {
+                            if(per.timeId == item.id && per.timeId) {
+                                per.classTime = per.classTime + " " + item.time + "(" + item.label + ")"
+                                newpersonList.push(per)
+                            } else if (!per.timeId) {
+                                newpersonList.push(per)
+                            }
+                        })
+                        item.personList = newpersonList
+                    })
+                }
+                // 年级id 不存在
+                else {
+                    this.timeTable = [{
+                        personList: []
+                    }]
+                    this.personList.forEach(per => {
+                        this.timeTable[0].personList.push(per)
+                    })
+                }
+            }
+        },
+        // 点击单节课,显示基本信息
+        /*  row:timeTable的某一个
+            index:fixList/personList中的当前这一数据的下标
+            type:传'list'就是临时课程,不传就是表定课程
+        */
+        clickCell(row, index, type) {
+            let nowClassInfor = undefined
+            if(type) {
+                nowClassInfor = this._.cloneDeep(row)
+            } else {
+                nowClassInfor = this._.cloneDeep(row.fixList[index])
+            }
+            this.unique = nowClassInfor.unique
+            this.sentSelectedEventTitle(nowClassInfor)
+        },
+        // 跳转到当前课程
+        sentSelectedEventTitle(item) {
+            this.isLoad = true
+            this.courseNow = this._.cloneDeep(item)
+            // 获取学生名单
+            if(this.courseNow.classId != "" && this.courseNow.classId) {
+                this.findStuInfor(this.courseNow)
+            } else if(this.courseNow.stuList != "") {
+                this.findPersonInfo(this.courseNow)
+            }
+            // 螢幕寬度<767px時,直接關掉sidebar
+            if (window.innerWidth <= 991) {
+                this.$store.commit("ToggleSidebar", false);
+            }
+            this.showInfo = true
+        },
+        changeView(type) {
+            this.currentView = type
+        },
+    },
+
+    created() {
+        this.$emit("onNavNo", this.MyNo);
+        this.$emit("onNavName", this.MyName);
+        this.$store.commit("ToggleSidebar", true);
+        this.findSchoolInfo()
+        this.onlyStu = !this.userInfo.roles.includes("teacher")
+        this.getClassList()
     },
     },
-    // 获取所有老师
-    getSchoolTea() {
-      let req = {school_code: this.$store.state.userInfo.azp}
-      this.$api.studentWeb.getSchoolTeacher(req).then(res => {
-        this.isShow = true
-        if(res.teachers.length > 0) {
-          this.teaList = res.teachers
+    mounted () {
+        if(this.$route.params.course) {
+            this.sentSelectedEventTitle(this.$route.params.course)
+            this.unique = this.$route.params.course.unique
         }
         }
-      })
     },
     },
-  },
-
-  created() {
-    this.$emit("onNavNo", this.MyNo);
-    this.$emit("onNavName", this.MyName);
-    this.$store.commit("ToggleSidebar", true);
-    this.$store.commit("ChangeItemName", {})
-    this.findSchoolInfo()
-    this.getSchoolTea()
-  },
+    computed: {
+        ...mapState({
+            userInfo: state => state.userInfo,
+            studentProfile: state => state.user.studentProfile
+        }),
+    }
 };
 };
 </script>
 </script>
 
 
+<style scoped>
+@import "~@/assets/student-web/component_styles/course-list.css";
+@import "~@/assets/student-web/component_styles/course-content.css";
+</style>
+
 <style scoped>
 <style scoped>
 .hide-sidebar * {
 .hide-sidebar * {
   width: 0px !important;
   width: 0px !important;

+ 383 - 260
TEAMModelOS/ClientApp/src/components/student-web/HomeView/HomeView.vue

@@ -1,230 +1,256 @@
 <template>
 <template>
-    <div class="home-view">
-        <Row :gutter="30" v-if="spanCharts == false">
-            <i-col :xs="0" :sm="0" :md="0" :lg="1"></i-col>
-            <i-col :xs="24" :sm="24" :md="12" :lg="7">
-                <!-- 加入课程 -->
-                <Card :bordered="true" class="calenderCard">
-                    <p slot="title">
-                        <svg-icon class="titleIcon" icon-class="calander" />
-                        <span class="title">{{ $t("studentWeb.addCourse") }}</span>
-                    </p>
-                    <div class="addClass">
-                        <Input clearable
-                            v-model="addClassNo"
-                            :placeholder="$t('studentWeb.home.classPla')"
-                        >
-                            <Button slot="append" @click="addClass">{{ $t('studentWeb.home.joinClass') }}</Button>
-                        </Input>
-                    </div>
-                </Card>
-                <!-- 课程清单 -->
-                <router-link to="/studentWeb/courseList">
-                    <Card style="overflow: hidden; margin-bottom: 30px">
-                        <h3 style="color: #575757; font-weight: 700; margin: 10px 0 15px">
-                            <svg-icon class="titleIcon" icon-class="course" />
-                            {{ $t("studentWeb.coursesCardTitle") }}
-                            <Icon type="ios-arrow-forward" />
+    <div>
+        <loading :active.sync="isLoading"
+                 :is-full-page="true"
+                 background-color="#000"
+                 :opacity="0.6">
+            <template slot="default">
+                <svg-icon icon-class="loader" class="loader-icon" />
+            </template>
+        </loading>
+        <div class="home-view">
+            <Row :gutter="30" v-if="spanCharts == false">
+                <i-col :xs="0" :sm="0" :md="0" :lg="1"></i-col>
+                <i-col :xs="24" :sm="24" :md="12" :lg="7">
+                    <!-- 加入课程 -->
+                    <Card :bordered="true" class="calenderCard">
+                        <p slot="title">
+                            <svg-icon class="titleIcon" icon-class="calander" />
+                            <span class="title">{{ $t("studentWeb.addCourse") }}</span>
+                        </p>
+                        <div class="addClass">
+                            <Input clearable
+                                v-model="addClassNo"
+                                :placeholder="$t('studentWeb.home.classPla')"
+                            >
+                                <Button slot="append" @click="addClass">{{ $t('studentWeb.home.joinClass') }}</Button>
+                            </Input>
+                        </div>
+                    </Card>
+                    <!-- 课程清单 -->
+                    <router-link to="/studentWeb/courseList">
+                        <Card style="overflow: hidden; margin-bottom: 30px">
+                            <h3 style="color: #575757; font-weight: 700; margin: 10px 0 15px">
+                                <svg-icon class="titleIcon" icon-class="course" />
+                                {{ $t("studentWeb.coursesCardTitle") }}
+                                <Icon type="ios-arrow-forward" />
+                            </h3>
+                            <!-- <p class="course-new">{{ $t("evaluation.noData") }}</p> -->
+                            <!-- <p class="course-new">{{ $t("evaluation.noData") }}</p> -->
+                            <!-- <p class="course-new">今日课程:英语</p>
+                            <p class="course-new">{{ $t("studentWeb.newAddCourse") }}</p> -->
+                        </Card>
+                    </router-link>
+                    
+                    <!-- 行事历 -->
+                    
+                </i-col>
+                <i-col :xs="24" :sm="24" :md="12" :lg="8">
+                    <!-- 活动任务清单 -->
+                    <MissionListCard :testData="testData" />
+                </i-col>
+                <i-col :xs="24" :sm="24" :md="12" :lg="7">
+                    <Card :bordered="true" class="barCard" style="display: none">
+                        <div class="no-data-text">
+                            <img
+                                src="@/assets/icon/no_data_evaluation.png"
+                                width="120"
+                            />
+                            <span style="margin-top: 15px; color: #808080">{{
+                                $t("studentWeb.public.noData")
+                            }}</span>
+                        </div>
+                        <!-- <div style="position: relative">
+                            <div class="spanAllchartBtn" @click="setSpanCharts()">
+                                <svg-icon
+                                    class="spanAllchartIcon"
+                                    icon-class="dimensions"
+                                />
+                            </div>
+                            <ChartCarousel />
+                        </div> -->
+                    </Card>
+                    <Card class="barCard">
+                        <h3 style="color: #575757; font-weight: 700">
+                            <svg-icon class="titleIcon" icon-class="target" />
+                            {{ $t("studentWeb.myProgressBar.tasksCompletionRate") }}
                         </h3>
                         </h3>
-                        <!-- <p class="course-new">{{ $t("evaluation.noData") }}</p> -->
-                        <!-- <p class="course-new">{{ $t("evaluation.noData") }}</p> -->
-                        <!-- <p class="course-new">今日课程:英语</p>
-                        <p class="course-new">{{ $t("studentWeb.newAddCourse") }}</p> -->
+
+                        <div class="myProgressBar">
+                            <span class="myTestProgressNum">
+                                {{ finishAct }}
+                                <span style="font-size: 20px">&nbsp;%</span>
+                            </span>
+                            <Progress class="myTestProgress"
+                                    :percent="finishAct"
+                                    :stroke-color="['#108ee9', '#87d068']"
+                                    :hide-info="true"
+                            />
+                        </div>
                     </Card>
                     </Card>
-                </router-link>
-                
-                <!-- 行事历 -->
-                
-            </i-col>
-            <i-col :xs="24" :sm="24" :md="12" :lg="8">
-                <!-- 活动任务清单 -->
-                <MissionListCard :testData="testData" />
-            </i-col>
-            <i-col :xs="24" :sm="24" :md="12" :lg="7">
-                <Card :bordered="true" class="barCard" style="display: none">
-                    <div class="no-data-text">
-                        <img
-                            src="@/assets/icon/no_data_evaluation.png"
-                            width="120"
-                        />
-                        <span style="margin-top: 15px; color: #808080">{{
-                            $t("studentWeb.public.noData")
-                        }}</span>
-                    </div>
-                    <!-- <div style="position: relative">
-                        <div class="spanAllchartBtn" @click="setSpanCharts()">
+                    <Card @click.native="noData" style="display: none">
+                        <h3 style="color: #575757; font-weight: 700">
                             <svg-icon
                             <svg-icon
-                                class="spanAllchartIcon"
-                                icon-class="dimensions"
+                                class="titleIcon studyIcon"
+                                icon-class="note"
                             />
                             />
+                            {{ $t("studentWeb.myProgressBar.selfStudyClickRate") }}
+                        </h3>
+                        <div class="myProgressBar">
+                            <span class="myTestProgressNum">
+                                <!-- {{ 22 }} -->
+                                --
+                                <span style="font-size: 20px">&nbsp;%</span>
+                            </span>
+                            <div
+                                class="myTestProgressContent"
+                                :style="{ width: 0 + '%' }"
+                                style="
+                                    background: linear-gradient(
+                                        90deg,
+                                        #ffa400,
+                                        #fa6400
+                                    );
+                                "
+                            ></div>
+                            <div class="myTestProgress"></div>
                         </div>
                         </div>
-                        <ChartCarousel />
-                    </div> -->
-                </Card>
-                <Card class="barCard">
-                    <h3 style="color: #575757; font-weight: 700">
-                        <svg-icon class="titleIcon" icon-class="target" />
-                        {{ $t("studentWeb.myProgressBar.tasksCompletionRate") }}
-                    </h3>
-
-                    <div class="myProgressBar">
-                        <span class="myTestProgressNum">
-                            {{ finishAct }}
-                            <span style="font-size: 20px">&nbsp;%</span>
-                        </span>
-                        <Progress class="myTestProgress"
-                                :percent="finishAct"
-                                :stroke-color="['#108ee9', '#87d068']"
-                                :hide-info="true"
-                        />
-                    </div>
-                </Card>
-                <Card @click.native="noData" style="display: none">
-                    <h3 style="color: #575757; font-weight: 700">
-                        <svg-icon
-                            class="titleIcon studyIcon"
-                            icon-class="note"
-                        />
-                        {{ $t("studentWeb.myProgressBar.selfStudyClickRate") }}
-                    </h3>
-                    <div class="myProgressBar">
-                        <span class="myTestProgressNum">
-                            <!-- {{ 22 }} -->
-                            --
-                            <span style="font-size: 20px">&nbsp;%</span>
-                        </span>
-                        <div
-                            class="myTestProgressContent"
-                            :style="{ width: 0 + '%' }"
-                            style="
-                                background: linear-gradient(
-                                    90deg,
-                                    #ffa400,
-                                    #fa6400
-                                );
-                            "
-                        ></div>
-                        <div class="myTestProgress"></div>
-                    </div>
-                </Card>
+                    </Card>
 
 
-                <!-- 先放在这里,等自学这些有数据了,再放左边 -->
-                <!-- 行事历 -->
-                <Card :bordered="true" class="calenderCard">
-                    <p slot="title">
-                        <svg-icon class="titleIcon" icon-class="calander" />
-                        <span class="title">{{ $t("studentWeb.calenderCardTitle") }}</span>
-                    </p>
-                    <!-- 上课提醒 -->
-                    <div @click="noData">
-                        <!-- <div class="title-rect" /> -->
-                        <p class="title-rect-name">{{ $t("studentWeb.recentClass") }}</p>
-                        <p class="classtitle">{{ $t("studentWeb.public.noData") }}</p>
-                        <!-- <p class="classtitle">{{ $t("studentWeb.defaultRecentClass") }}</p>
-                        <p class="time">{{ $t("studentWeb.defaultClassTime") }}</p>
-                        <p class="place">{{ $t("studentWeb.defaultClassPlace") }}</p> -->
-                    </div>
-                    <!-- 今日截至 -->
-                    <div class="todaydayline">
-                        <div class="todaydaylinewraptitle">
-                            <p class="title-rect-name">
-                                {{ $t("studentWeb.todaydeadlineList") }}
-                                <Icon type="ios-arrow-forward" />
-                            </p>
-                            <div class="todaydaylineList">
-                                <div v-if="!todayData.length" class="no-data">{{ $t("studentWeb.public.noData") }}</div>
-                                <div class="list-block"
-                                    style='height: 40vh'
-                                    v-else
-                                >
-                                    <li :id="`tditem${index}`"
-                                        class="list-item"
-                                        v-for="(item, index) in todayData"
+                    <!-- 先放在这里,等自学这些有数据了,再放左边 -->
+                    <!-- 行事历 -->
+                    <Card :bordered="true" class="calenderCard" style="margin-bottom: 0">
+                        <p slot="title">
+                            <svg-icon class="titleIcon" icon-class="calander" />
+                            <span class="title">{{ $t("studentWeb.calenderCardTitle") }}</span>
+                        </p>
+                        <!-- 上课提醒 -->
+                        <div>
+                            <p class="title-rect-name">{{ $t("studentWeb.recentClass") }}</p>
+                            
+                            <div class="remind-course">
+                                <div style="height: 20vh; overflow: auto;" v-if="recentClass.length">
+                                    <div class="list-one"
+                                        v-for="(item, index) in recentClass"
                                         :key="index"
                                         :key="index"
-                                        @click="sentSelectedEventTitle(item)"
-                                        v-show="eventPageType.includes(item.eventType) == true && item.taskStatus != 1"
+                                        @click="getCourse(item)"
                                     >
                                     >
-                                        <ul>
-                                            <li class="list-item-icon">
-                                                <svg-icon v-if="item.eventType == 'Homework'"
-                                                        icon-class="doc"/>
-                                                <svg-icon v-if="item.eventType == 'Preview'"
-                                                        icon-class="selflearninginTime"/>
-                                                <svg-icon v-if="item.eventType == 'Exam'"
-                                                        icon-class="test"
-                                                        class="reset-testIcon"/>
-                                                <svg-icon v-if="item.eventType == 'Vote'"
-                                                        icon-class="vote"/>
-                                                <svg-icon v-if="item.eventType == 'Survey'"
-                                                        icon-class="quesnaire"/>
-                                            </li>
-                                            <li class="list-item-info">
-                                                <p class="list-item-title" :class="{'list-item-titleEn': getCurrentLang() == 'en-us'}">
-                                                    <span v-show="item.eventType == 'Exam'" class="list-item-typeMark">{{item.owner == 'school'? $t('studentWeb.public.schoolExam'):$t('studentWeb.public.privateExam')}}</span>
-                                                    <span v-show="item.eventType == 'Vote'" class="list-item-typeMark">{{item.owner == 'school'? $t('studentWeb.public.schoolVote'):$t('studentWeb.public.privateVote')}}</span>
-                                                    <span v-show="item.eventType == 'Survey'" class="list-item-typeMark">{{item.owner == 'school'? $t('studentWeb.public.schoolSurvey'):$t('studentWeb.public.privateSurvey')}}</span>
-                                                    <span>{{ item.name }}</span>
-                                                </p>
-                                                <p class="list-item-time">
-                                                    {{ $t("studentWeb.endsToday") }}{{ item.todayTime }}{{ $t("studentWeb.endsTodayTime") }}
-                                                </p>
-                                            </li>
-                                        </ul>
-                                    </li>
+                                        <div class="classtitle">
+                                            <span></span>
+                                            {{ item.name }}
+                                            <p>{{ item.teaName }}</p>
+                                        </div>
+                                        <p class="time">{{ item.classTime }}</p>
+                                        <p class="place">{{ item.roomName }}</p>
+                                    </div>
                                 </div>
                                 </div>
+                                <div v-else class="no-data">{{ $t("studentWeb.public.noData") }}</div>
                             </div>
                             </div>
                         </div>
                         </div>
-                    </div>
-                </Card>
-            </i-col>
-        </Row>
-        <Row :gutter="30" v-if="spanCharts == true">
-            <i-col :xs="0" :sm="0" :md="0" :lg="1"></i-col>
-            <i-col :xs="24" :sm="24" :md="24" :lg="22">
-                <div class="allcharts">
-                    <Row :gutter="30">
-                        <div
-                            class="spanAllchartBtn isOpen"
-                            @click="setSpanCharts()"
-                        >
-                            <svg-icon
-                                class="spanAllchartIconNow"
-                                icon-class="dimensions"
-                            />
+                        <!-- 今日截至 -->
+                        <div class="todaydayline">
+                            <div class="todaydaylinewraptitle">
+                                <p class="title-rect-name">
+                                    {{ $t("studentWeb.todaydeadlineList") }}
+                                    <Icon type="ios-arrow-forward" />
+                                </p>
+                                <div class="todaydaylineList">
+                                    <div v-if="!todayData.length" class="no-data">{{ $t("studentWeb.public.noData") }}</div>
+                                    <div class="list-block"
+                                        style='height: 27vh'
+                                        v-else
+                                    >
+                                        <li :id="`tditem${index}`"
+                                            class="list-item"
+                                            v-for="(item, index) in todayData"
+                                            :key="index"
+                                            @click="sentSelectedEventTitle(item)"
+                                            v-show="eventPageType.includes(item.eventType) == true && item.taskStatus != 1"
+                                        >
+                                            <ul>
+                                                <li class="list-item-icon">
+                                                    <svg-icon v-if="item.eventType == 'Homework'"
+                                                            icon-class="doc"/>
+                                                    <svg-icon v-if="item.eventType == 'Preview'"
+                                                            icon-class="selflearninginTime"/>
+                                                    <svg-icon v-if="item.eventType == 'Exam'"
+                                                            icon-class="test"
+                                                            class="reset-testIcon"/>
+                                                    <svg-icon v-if="item.eventType == 'Vote'"
+                                                            icon-class="vote"/>
+                                                    <svg-icon v-if="item.eventType == 'Survey'"
+                                                            icon-class="quesnaire"/>
+                                                </li>
+                                                <li class="list-item-info">
+                                                    <p class="list-item-title">
+                                                        <span v-show="item.eventType == 'Exam'" class="list-item-typeMark">{{item.owner == 'school'? $t('studentWeb.public.schoolExam'):$t('studentWeb.public.privateExam')}}</span>
+                                                        <span v-show="item.eventType == 'Vote'" class="list-item-typeMark">{{item.owner == 'school'? $t('studentWeb.public.schoolVote'):$t('studentWeb.public.privateVote')}}</span>
+                                                        <span v-show="item.eventType == 'Survey'" class="list-item-typeMark">{{item.owner == 'school'? $t('studentWeb.public.schoolSurvey'):$t('studentWeb.public.privateSurvey')}}</span>
+                                                        <span>{{ item.name }}</span>
+                                                    </p>
+                                                    <p class="list-item-time">
+                                                        {{ $t("studentWeb.endsToday") }}{{ item.todayTime }}{{ $t("studentWeb.endsTodayTime") }}
+                                                    </p>
+                                                </li>
+                                            </ul>
+                                        </li>
+                                    </div>
+                                </div>
+                            </div>
                         </div>
                         </div>
-                        <i-col :xs="24" :sm="24" :md="24" :lg="8">
-                            <h3>{{ $t("studentWeb.chartNames[0]") }}</h3>
-                            <StudyTimeChart />
-                        </i-col>
-                        <i-col :xs="24" :sm="24" :md="24" :lg="8">
-                            <h3>{{ $t("studentWeb.chartNames[1]") }}</h3>
-                            <SplineAreaChart />
-                        </i-col>
-                        <i-col :xs="24" :sm="24" :md="24" :lg="8">
-                            <h3>{{ $t("studentWeb.chartNames[2]") }}</h3>
-                            <StackBarChart />
-                        </i-col>
-                        <i-col :xs="24" :sm="24" :md="24" :lg="8">
-                            <h3>{{ $t("studentWeb.chartNames[3]") }}</h3>
-                            <TwoLineChart />
-                        </i-col>
-                        <i-col :xs="24" :sm="24" :md="24" :lg="8">
-                            <h3>{{ $t("studentWeb.chartNames[4]") }}</h3>
-                            <EventPieChart />
-                        </i-col>
-                        <i-col :xs="24" :sm="24" :md="24" :lg="8">
-                            <h3>{{ $t("studentWeb.chartNames[5]") }}</h3>
-                            <StudyHeatMap />
-                        </i-col>
-                    </Row>
-                </div>
-            </i-col>
-        </Row>
+                    </Card>
+                </i-col>
+            </Row>
+            <Row :gutter="30" v-if="spanCharts == true">
+                <i-col :xs="0" :sm="0" :md="0" :lg="1"></i-col>
+                <i-col :xs="24" :sm="24" :md="24" :lg="22">
+                    <div class="allcharts">
+                        <Row :gutter="30">
+                            <div
+                                class="spanAllchartBtn isOpen"
+                                @click="setSpanCharts()"
+                            >
+                                <svg-icon
+                                    class="spanAllchartIconNow"
+                                    icon-class="dimensions"
+                                />
+                            </div>
+                            <i-col :xs="24" :sm="24" :md="24" :lg="8">
+                                <h3>{{ $t("studentWeb.chartNames[0]") }}</h3>
+                                <StudyTimeChart />
+                            </i-col>
+                            <i-col :xs="24" :sm="24" :md="24" :lg="8">
+                                <h3>{{ $t("studentWeb.chartNames[1]") }}</h3>
+                                <SplineAreaChart />
+                            </i-col>
+                            <i-col :xs="24" :sm="24" :md="24" :lg="8">
+                                <h3>{{ $t("studentWeb.chartNames[2]") }}</h3>
+                                <StackBarChart />
+                            </i-col>
+                            <i-col :xs="24" :sm="24" :md="24" :lg="8">
+                                <h3>{{ $t("studentWeb.chartNames[3]") }}</h3>
+                                <TwoLineChart />
+                            </i-col>
+                            <i-col :xs="24" :sm="24" :md="24" :lg="8">
+                                <h3>{{ $t("studentWeb.chartNames[4]") }}</h3>
+                                <EventPieChart />
+                            </i-col>
+                            <i-col :xs="24" :sm="24" :md="24" :lg="8">
+                                <h3>{{ $t("studentWeb.chartNames[5]") }}</h3>
+                                <StudyHeatMap />
+                            </i-col>
+                        </Row>
+                    </div>
+                </i-col>
+            </Row>
+        </div>
         <br />
         <br />
     </div>
     </div>
 </template>
 </template>
 
 
 <script>
 <script>
+import Loading from "vue-loading-overlay";
+import "vue-loading-overlay/dist/vue-loading.css";
 import ChartCarousel from "./ChartCarousel/ChartCarousel";
 import ChartCarousel from "./ChartCarousel/ChartCarousel";
 import MissionListCard from "./MissionListCard";
 import MissionListCard from "./MissionListCard";
 import StudyTimeChart from "../HomeView/ChartCarousel/StudyTimeChart";
 import StudyTimeChart from "../HomeView/ChartCarousel/StudyTimeChart";
@@ -233,12 +259,12 @@ import TwoLineChart from "../HomeView/ChartCarousel/TwoLineChart";
 import StackBarChart from "../HomeView/ChartCarousel/StackBarChart";
 import StackBarChart from "../HomeView/ChartCarousel/StackBarChart";
 import SplineAreaChart from "../HomeView/ChartCarousel/SplineAreaChart";
 import SplineAreaChart from "../HomeView/ChartCarousel/SplineAreaChart";
 import StudyHeatMap from "../HomeView/ChartCarousel/StudyHeatMap";
 import StudyHeatMap from "../HomeView/ChartCarousel/StudyHeatMap";
-import studentWeb from '../../../api/studentWeb';
 import { mapState } from 'vuex';
 import { mapState } from 'vuex';
 
 
 export default {
 export default {
     name: "HomeView",
     name: "HomeView",
     components: {
     components: {
+        Loading,
         ChartCarousel,
         ChartCarousel,
         MissionListCard,
         MissionListCard,
         SplineAreaChart,
         SplineAreaChart,
@@ -248,73 +274,63 @@ export default {
         StudyHeatMap,
         StudyHeatMap,
         StudyTimeChart,
         StudyTimeChart,
     },
     },
-
     data() {
     data() {
         return {
         return {
             eventPageType: ["Preview", "Exam", "Homework", "Vote", "Survey"], //本頁出現的類型
             eventPageType: ["Preview", "Exam", "Homework", "Vote", "Survey"], //本頁出現的類型
             MyNo: "1", //接收NavBar 選定的那一頁icon標示
             MyNo: "1", //接收NavBar 選定的那一頁icon標示
             MyName: "",
             MyName: "",
-            mockdata: [
+            spanCharts: false,
+            todaydaylineListHeight: 0,
+            addClassNo: "", //加入课程的代码
+            testData: [], //活动数据
+            todayData: [], //今日活动
+            finishAct: 0, //活动完成率
+            weekTime: [
+                {
+                    title: this.$t("studentWeb.week.mon"),
+                    value: "MON",
+                },
+                {
+                    title: this.$t("studentWeb.week.tue"),
+                    value: "TUE",
+                },
+                {
+                    title: this.$t("studentWeb.week.wed"),
+                    value: "WED",
+                },
                 {
                 {
-                    eventSubject: "英文",
-                    eventID: "360000198305204644",
-                    eDes:
-                        "眼技先准角期几要毛精且将已己拉省。制力叫了连并情权了类资格深外表量。领值术农除存给么连什通单问。",
-                    eventName: "党华前置亲从性常但给",
-                    teacher: "阎娟",
-                    startTime: "2020.01.14",
-                    endTime: "2020.02.31",
-                    isDone: false,
-                    isOverEndTime: true,
-                    eventType: "作業",
+                    title: this.$t("studentWeb.week.thu"),
+                    value: "THU",
                 },
                 },
                 {
                 {
-                    eventSubject: "國文",
-                    eventID: "420000200302184824",
-                    eDes:
-                        "回全导色即院给深育完东两会白任斗了利。取。之部个变型自重周间情六天确史这节族么易。",
-                    eventName: "一斯在管石门",
-                    teacher: "薛洋",
-                    startTime: "2020.01.09",
-                    endTime: "2020.02.28",
-                    isDone: false,
-                    isOverEndTime: true,
-                    eventType: "課前預習",
+                    title: this.$t("studentWeb.week.fri"),
+                    value: "FRI",
                 },
                 },
                 {
                 {
-                    eventSubject: "英文",
-                    eventID: "32000020030706692X",
-                    eDes:
-                        "适会商你济标张或程道称育口海率。己织南系完群百相系她两意对该亲。门车个解争包看听文变声反先。",
-                    eventName: "动主利全这还便划九",
-                    teacher: "谭强",
-                    startTime: "2020.01.06",
-                    endTime: "2020.02.27",
-                    allowRetryNow: true,
-                    isDone: false,
-                    isOverEndTime: false,
-                    eventType: "問卷",
+                    title: this.$t("studentWeb.week.sat"),
+                    value: "SAT",
                 },
                 },
+                {
+                    title: this.$t("studentWeb.week.sun"),
+                    value: "SUN",
+                }
             ],
             ],
-            spanCharts: false,
-            todaydaylineListHeight: 0,
-            addClassNo: "", //加入课程的代码
-            testData: [], //活动数据
-            todayData: [], //今日活动
-            finishAct: 0, //活动完成率
+            recentClass: [], //近期上课
+            isLoading: false,
         };
         };
     },
     },
 
 
     methods: {
     methods: {
         //获取新活动信息数据
         //获取新活动信息数据
         getActivityInfo() {
         getActivityInfo() {
+            this.isLoading = true
             let params = {
             let params = {
                 userid: this.userInfo.sub,
                 userid: this.userInfo.sub,
                 userType: "",
                 userType: "",
                 school: this.user.schoolCode
                 school: this.user.schoolCode
             }
             }
             // 醍摩豆登陆——> roles有teacher
             // 醍摩豆登陆——> roles有teacher
-            if (this.$store.state.userInfo.roles.includes("teacher")) {
+            if (this.userInfo.roles.includes("teacher")) {
                 params.userType = "tmdid"
                 params.userType = "tmdid"
             }
             }
             // 学生账号登陆
             // 学生账号登陆
@@ -334,6 +350,8 @@ export default {
                     });
                     });
                     this.getTodayAct()
                     this.getTodayAct()
                 }
                 }
+            }).finally(()=>{
+                this.isLoading = false
             })
             })
         },
         },
         // 今日截至活动
         // 今日截至活动
@@ -344,7 +362,7 @@ export default {
             // 当前00:00:00
             // 当前00:00:00
             let strdDate = (new Date(new Date(new Date().toLocaleDateString()).getTime())).getTime()
             let strdDate = (new Date(new Date(new Date().toLocaleDateString()).getTime())).getTime()
             // 当前23:59:59
             // 当前23:59:59
-            let endDate = (new Date(new Date(new Date().toLocaleDateString()).getTime() +24 * 60 * 60 * 1000 -1)).getTime()
+            let endDate = (new Date(new Date(new Date().toLocaleDateString()).getTime() +24 * 60 * 60 * 1000 - 1)).getTime()
             activity.map(item => {
             activity.map(item => {
                 if(item.endTime >= strdDate && item.endTime <= endDate && item.taskStatus != 1) {
                 if(item.endTime >= strdDate && item.endTime <= endDate && item.taskStatus != 1) {
                     item.todayTime = this.handleTime(item.endTime)
                     item.todayTime = this.handleTime(item.endTime)
@@ -375,12 +393,116 @@ export default {
             let toTime = h + ":" + m + ":" + s
             let toTime = h + ":" + m + ":" + s
             return toTime
             return toTime
         },
         },
+        // 课程
+        getClassList() {
+            let param = {
+                userid: this.userInfo.sub,
+                school: this.userInfo.azp
+            }
+            if(this.userInfo.roles.includes("teacher")) {
+                param.userType = "tmdid"
+            } else {
+                param.userType = "schoolid"
+            }
+            this.$api.studentWeb.getClassList(param).then(res => {
+                if(res.courses.length) {
+                    let list = res.courses
+                    list.forEach(item => {
+                        if(item.course) {
+                            item.course.schedule.forEach((sch, sIn) => {
+                                // 有classId,表定课程
+                                if(sch.classId == item.stuCourse.classId[0]) {
+                                    // 近期上课,就表示一定要有时间
+                                    if(sch.time.length) {
+                                        for (let m = 0; m < sch.time.length; m++) {
+                                            let data = this.getNewCourse("class", item, sch, sIn, m)
+                                            this.recentClass.push(data)
+                                        }
+                                    }
+                                }
+                                // 有stulist,临时课程
+                                else if (sch.stulist) {
+                                    if(sch.time.length) {
+                                        for (let m = 0; m < sch.time.length; m++) {
+                                            let data = this.getNewCourse("person", item, sch, sIn, m)
+                                            this.recentClass.push(data)
+                                        }
+                                    }
+                                }
+                            })
+                        }
+                    })
+                    this.findSchoolInfo()
+                }
+            })
+        },
+        getNewCourse(attribute, list, sch, sIn, m) {
+            let data = this._.cloneDeep(list.course)
+            delete data.schedule
+            data.school = list.stuCourse.school
+            data.scope = list.stuCourse.scope
+            data.classId = sch.classId
+            // data.roomId = sch.room
+            // data.teacherId = sch.teacherId
+            data.notice = sch.notice
+            data.stuList = sch.stulist
+            data.timeId = sch.time[m].id
+            data.timeWeek = sch.time[m].week
+            this.weekTime.forEach(item => {
+                if(item.value == sch.time[m].week) {
+                    data.classTime = item.title
+                }
+            })
+            data.roomName = sch.roomName ? sch.roomName : this.$t("studentWeb.courseContent.noRoom")
+            data.teaName = sch.teacherName ? sch.teacherName : this.$t('studentWeb.courseContent.noTeacher')
+            data.unique = attribute + list.course.no + sIn + m
+            return data
+        },
+        // 查找班级——匹配对应的时间
+        findSchoolInfo() {
+            let params = {}
+            // 醍摩豆登陆——> roles有teacher
+            if (this.userInfo.roles.includes("teacher")) {
+                params = {userType: "tmdid"}
+            }
+            // 学生账号登陆
+            else {
+                params = {userType: "schoolid"}
+            }
+            this.$api.studentWeb.getSchoolInfo(params).then(res => {
+                if(res.status == 200 && res.school_base) {
+                    let timeList = []
+                    res.school_base.period.forEach(item => {
+                        if(this.recentClass[0].period.id == item.id) {
+                            timeList = item.timetable
+                        }
+                    })
+                    if(timeList.length) {
+                        this.recentClass.map(course => {
+                            timeList.forEach(time => {
+                                if(time.id == course.timeId) {
+                                    course.time = time.time
+                                    course.classTime = course.classTime + "  " + time.time + " (" + time.label + ")"
+                                }
+                            })
+                        })
+                    }
+                }
+            })
+        },
+        // 点击上课提醒跳转页面
+        getCourse(course) {
+            this.$router.push({
+                name: "courseList",
+                params: {
+                    course: course
+                }
+            })
+        },
+
         noData() {
         noData() {
             this.$Message.warning(this.$t("studentWeb.public.notice"))
             this.$Message.warning(this.$t("studentWeb.public.notice"))
         },
         },
-        getCurrentLang() {
-            return localStorage.getItem("lang")
-        },
         setSpanCharts() {
         setSpanCharts() {
             this.spanCharts = !this.spanCharts
             this.spanCharts = !this.spanCharts
         },
         },
@@ -388,7 +510,7 @@ export default {
         addClass() {
         addClass() {
             if(this.addClassNo) {
             if(this.addClassNo) {
                 let isStu = true
                 let isStu = true
-                this.$store.state.userInfo.roles.map(item => {
+                this.userInfo.roles.map(item => {
                     if(item == "teacher") {
                     if(item == "teacher") {
                         isStu = false
                         isStu = false
                     }
                     }
@@ -399,9 +521,9 @@ export default {
                     tmdId: ""
                     tmdId: ""
                 }
                 }
                 if(isStu) {
                 if(isStu) {
-                    req.studentId = this.$store.state.userInfo.sub
+                    req.studentId = this.userInfo.sub
                 } else {
                 } else {
-                    req.tmdId = this.$store.state.userInfo.sub
+                    req.tmdId = this.userInfo.sub
                 }
                 }
                 this.$api.studentWeb.getAddClass(req).then(res => {
                 this.$api.studentWeb.getAddClass(req).then(res => {
                     if(res.status == 0) {
                     if(res.status == 0) {
@@ -435,6 +557,7 @@ export default {
         this.$emit("onNavNo", this.MyNo)
         this.$emit("onNavNo", this.MyNo)
         this.$emit("onNavName", this.MyName)
         this.$emit("onNavName", this.MyName)
         this.getActivityInfo()
         this.getActivityInfo()
+        this.getClassList()
     },
     },
     mounted() {
     mounted() {
         /* if (document.getElementById("tditem0") != "") {
         /* if (document.getElementById("tditem0") != "") {

+ 4 - 1
TEAMModelOS/ClientApp/src/components/student-web/HomeView/MissionListCard.vue

@@ -114,7 +114,10 @@
                 var Y = date.getFullYear() + '-'
                 var Y = date.getFullYear() + '-'
                 var M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-'
                 var M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-'
                 var D = date.getDate() + ' '
                 var D = date.getDate() + ' '
-                return Y + M + D;
+                var H = (date.getHours() < 10 ? '0' + date.getHours() : date.getHours()) + ":"
+                var Min = (date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes()) + ":"
+                var S = (date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds()) + " "
+                return Y + M + D + H + Min + S;
             },
             },
             handleReachBottom() {
             handleReachBottom() {
                 return new Promise((resolve) => {
                 return new Promise((resolve) => {

+ 1 - 1
TEAMModelOS/ClientApp/src/css/dark-wang-editor.less

@@ -5,7 +5,7 @@
 }
 }
 
 
 .dark-wang-editor .w-e-toolbar .w-e-menu:hover i {
 .dark-wang-editor .w-e-toolbar .w-e-menu:hover i {
-    color: white !important;
+    // color: white !important;
 }
 }
 
 
 .dark-wang-editor .w-e-toolbar {
 .dark-wang-editor .w-e-toolbar {

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

@@ -266,8 +266,10 @@ export default {
         joinOk:'Join successfully',
         joinOk:'Join successfully',
         joinErr:'Failed to join',
         joinErr:'Failed to join',
         getListErr:'Failed to get list information',
         getListErr:'Failed to get list information',
-        hasJoin:'Congratulations, you have joined successfully! ',
+        hasJoin:'you have joined successfully! ',
         getErr:'Failed to read user information',
         getErr:'Failed to read user information',
-        parseErr:'Failed to parse login information'
+        parseErr:'Failed to parse login information',
+        cusLabel:'課程:',
+        toTeammodel:'即刻前往醍摩豆雲平台>>>'
     }
     }
 }
 }

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

@@ -67,6 +67,8 @@ export default {
 	editItem:'Edit',
 	editItem:'Edit',
 	confirm:'Confirm',
 	confirm:'Confirm',
 	cancel:'Cancel',
 	cancel:'Cancel',
+	selectItem:'Select',
+	removeItem:'Remove',
 	deleteSuc:'Delete successfully',
 	deleteSuc:'Delete successfully',
 	deleteFail:'Failed to delete',
 	deleteFail:'Failed to delete',
 	editSuc:'Edit successfully',
 	editSuc:'Edit successfully',

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

@@ -37,6 +37,7 @@ import user from './user'
 import notice from './notice'
 import notice from './notice'
 import answerSheet from './answerSheet'
 import answerSheet from './answerSheet'
 import tip from './tip'
 import tip from './tip'
+import selflearn from './selflearn'
 export default {
 export default {
   schoolBaseInfo,
   schoolBaseInfo,
   classMgmt,
   classMgmt,
@@ -77,6 +78,7 @@ export default {
   notice,
   notice,
   answerSheet,
   answerSheet,
   tip,
   tip,
+  selflearn,
   test: '测试',
   test: '测试',
   formConfigP: {
   formConfigP: {
     input: 'Please Enter ',
     input: 'Please Enter ',

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

@@ -208,5 +208,9 @@ export default {
   noProfession:'No professional subject set yet',
   noProfession:'No professional subject set yet',
   all:'All',
   all:'All',
   noSet:'Not set',
   noSet:'Not set',
-  newClass:'Create Class'
+  newClass:'Create Class',
+  gradeWarning1: '请设置学级/年级',
+  classRep: '班级重复',
+  updOk:'修改成功',
+  updErr:'修改失败'
 }
 }

+ 23 - 0
TEAMModelOS/ClientApp/src/locale/lang/en-US/selflearn.js

@@ -0,0 +1,23 @@
+export default{
+    choose:{
+        syllabus:'课纲',
+        syllubusRange:'课纲范围:',
+        privateSy:'个人课纲',
+        schoolSy:'校本课纲',
+        periodLabel:'学段:',
+        subjectLabel:'学科:',
+        book:'册别',
+        resoureCount:'内容资源数',
+        pointCount:'知识点数',
+        nodeCount:'节点数',
+        noData:'暂无数据',
+        contentLabel:'内容',
+        contentRange:'资源范围:',
+        privateContent:'个人资源',
+        schoolContent:'校本资源',
+        type:'类型:',
+        searchHolder:'搜索',
+        quLabel:'题库',
+        testLabel:'试卷库',
+    }
+}

+ 4 - 2
TEAMModelOS/ClientApp/src/locale/lang/zh-CN/cusMgt.js

@@ -268,8 +268,10 @@ export default {
         joinOk:'加入成功',
         joinOk:'加入成功',
         joinErr:'加入失败',
         joinErr:'加入失败',
         getListErr:'获取名单信息失败',
         getListErr:'获取名单信息失败',
-        hasJoin:'恭喜您,已经加入成功!',
+        hasJoin:'课程加入成功!',
         getErr:'用户信息获取失败',
         getErr:'用户信息获取失败',
-        parseErr:'登录信息解析失败'
+        parseErr:'登录信息解析失败',
+        cusLabel:'课程:',
+        toTeammodel:'即刻前往醍摩豆云平台>>>'
     }
     }
 }
 }

+ 7 - 1
TEAMModelOS/ClientApp/src/locale/lang/zh-CN/evaluation.js

@@ -66,6 +66,8 @@ export default {
 	isFalse:'错误',
 	isFalse:'错误',
 	deleteItem:'删除',
 	deleteItem:'删除',
 	editItem:'编辑',
 	editItem:'编辑',
+	selectItem:'选题',
+	removeItem:'移除',
 	confirm:'确认',
 	confirm:'确认',
 	cancel:'取消',
 	cancel:'取消',
 	deleteSuc:'删除成功',
 	deleteSuc:'删除成功',
@@ -229,7 +231,11 @@ export default {
 		tip2:'题综合题的配分',
 		tip2:'题综合题的配分',
 		tip3:'不足',
 		tip3:'不足',
 		tip4:'溢出',
 		tip4:'溢出',
-		tip5:'请检查后重试!'
+		tip5:'请检查后重试!',
+		tip6:'切换组题方式会清空当前所选试题,是否继续?',
+		tip7:'检测到当前试卷存在未入库的试题,是否需要同步到试题库?',
+		tip8:'同步入库',
+		tip9:'不同步',
 	},
 	},
 	points:{
 	points:{
 		addPoint:'新增知识点',
 		addPoint:'新增知识点',

+ 2 - 0
TEAMModelOS/ClientApp/src/locale/lang/zh-CN/index.js

@@ -37,6 +37,7 @@ import user from './user'
 import notice from './notice'
 import notice from './notice'
 import answerSheet from './answerSheet'
 import answerSheet from './answerSheet'
 import tip from './tip'
 import tip from './tip'
+import selflearn from './selflearn'
 export default {
 export default {
   schoolBaseInfo,
   schoolBaseInfo,
   classMgmt,
   classMgmt,
@@ -77,6 +78,7 @@ export default {
   notice,
   notice,
   answerSheet,
   answerSheet,
   tip,
   tip,
+  selflearn,
   test: '测试',
   test: '测试',
   formConfigP: {
   formConfigP: {
     input: '请输入',
     input: '请输入',

+ 48 - 44
TEAMModelOS/ClientApp/src/locale/lang/zh-CN/schoolBaseInfo.js

@@ -1,26 +1,26 @@
 export default {
 export default {
   // SystemSetting.vue
   // SystemSetting.vue
-  commonset:'通用设置',
-  pdMgt:'学段管理',
-  cgMgt:'学院管理',
-  updBadge:'上传校徽',
-  scType:'学校类型:',
-  scType1:'普教',
-  scType2:'高教',
-  proSetting:'专业设置',
-  curSemSta:'当前状态:',
+  commonset: '通用设置',
+  pdMgt: '学段管理',
+  cgMgt: '学院管理',
+  updBadge: '上传校徽',
+  scType: '学校类型:',
+  scType1: '普教',
+  scType2: '高教',
+  proSetting: '专业设置',
+  curSemSta: '当前状态:',
   schoolNameLabel: '学校名称:',
   schoolNameLabel: '学校名称:',
-  addSubject:'添加学科',
-  subType:'学科类型',
-  subType1:'通用',
-  subType2:'学科',
-  subType3:'专业',
-  acType:'操作类型',
-  acType1:'选择已有通用学科',
-  acType2:'新增通用学科',
-  sltSubect:'选择学科',
-  subName:'学科名称',
-  applyPd:'应用学段',
+  addSubject: '添加学科',
+  subType: '学科类型',
+  subType1: '通用',
+  subType2: '学科',
+  subType3: '专业',
+  acType: '操作类型',
+  acType1: '选择已有通用学科',
+  acType2: '新增通用学科',
+  sltSubect: '选择学科',
+  subName: '学科名称',
+  applyPd: '应用学段',
   periodSettingLabel: '学段',
   periodSettingLabel: '学段',
   order: '依建立时间排序',
   order: '依建立时间排序',
   semesterSetting: '学期(季)设置',
   semesterSetting: '学期(季)设置',
@@ -88,16 +88,16 @@ export default {
   saveErr: '保存失败!',
   saveErr: '保存失败!',
   saveWarning: '保存提醒',
   saveWarning: '保存提醒',
   leaveText: '离开',
   leaveText: '离开',
-  pdWarning:'学段名称不能重复',
-  semWarning:'学期名称不能重复',
-  gdNameWarning:'年级名称不能重复',
-  subWarning:'学科名称不能重复',
-  exWarning:'考试名称不能重复',
-  majorWarning:'专业名称不能重复',
-  addSemester:'添加学期',
-  semesterName:'名称',
-  semStartAt:'开始于',
-  admission:'入学期',
+  pdWarning: '学段名称不能重复',
+  semWarning: '学期名称不能重复',
+  gdNameWarning: '年级名称不能重复',
+  subWarning: '学科名称不能重复',
+  exWarning: '考试名称不能重复',
+  majorWarning: '专业名称不能重复',
+  addSemester: '添加学期',
+  semesterName: '名称',
+  semStartAt: '开始于',
+  admission: '入学期',
 
 
   // ClassroomSetting.vue
   // ClassroomSetting.vue
   classroomList: '教室列表',
   classroomList: '教室列表',
@@ -193,20 +193,24 @@ export default {
   link: '关联',
   link: '关联',
   confirmDelink: '请问您确定要解除关联',
   confirmDelink: '请问您确定要解除关联',
   noStu: '暂无学生',
   noStu: '暂无学生',
-  addOk:'添加成功',
-  addErr:'添加失败',
-  cusTabel:'课程表',
-  setCusTable:'设置课表',
+  addOk: '添加成功',
+  addErr: '添加失败',
+  cusTabel: '课程表',
+  setCusTable: '设置课表',
 
 
   //ClassMgt.vue
   //ClassMgt.vue
-  className:'名称',
-  yearGrade:'学级/年级',
-  untimed:'未到入学时间',
-  graduated:'已毕业',
-  classLabel:'班级',
-  profession:'专业',
-  noProfession:'暂未设置专业',
-  all:'全部',
-  noSet:'未设置',
-  newClass:'创建班级'
+  className: '名称',
+  yearGrade: '学级/年级',
+  untimed: '未到入学时间',
+  graduated: '已毕业',
+  classLabel: '班级',
+  profession: '专业',
+  noProfession: '暂未设置专业',
+  all: '全部',
+  noSet: '未设置',
+  newClass: '创建班级',
+  gradeWarning1: '请设置学级/年级',
+  classRep: '班级重复',
+  updOk:'修改成功',
+  updErr:'修改失败'
 }
 }

+ 23 - 0
TEAMModelOS/ClientApp/src/locale/lang/zh-CN/selflearn.js

@@ -0,0 +1,23 @@
+export default{
+    choose:{
+        syllabus:'课纲',
+        syllubusRange:'课纲范围:',
+        privateSy:'个人课纲',
+        schoolSy:'校本课纲',
+        periodLabel:'学段:',
+        subjectLabel:'学科:',
+        book:'册别',
+        resoureCount:'内容资源数',
+        pointCount:'知识点数',
+        nodeCount:'节点数',
+        noData:'暂无数据',
+        contentLabel:'内容',
+        contentRange:'资源范围:',
+        privateContent:'个人资源',
+        schoolContent:'校本资源',
+        type:'类型:',
+        searchHolder:'搜索',
+        quLabel:'题库',
+        testLabel:'试卷库',
+    }
+}

+ 1 - 0
TEAMModelOS/ClientApp/src/locale/lang/zh-CN/system.js

@@ -18,6 +18,7 @@ export default {
         classMgt:'教室管理',
         classMgt:'教室管理',
         cusSetting:'课程设置',
         cusSetting:'课程设置',
         cusPlanMgt:'排课管理',
         cusPlanMgt:'排课管理',
+        schoolNotify:'学校公告',
         authMgt:'授权管理',
         authMgt:'授权管理',
         preview:'Beta',
         preview:'Beta',
         scSyllabus:'学校课纲',
         scSyllabus:'学校课纲',

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

@@ -268,8 +268,10 @@ export default {
         joinOk:'加入成功',
         joinOk:'加入成功',
         joinErr:'加入失敗',
         joinErr:'加入失敗',
         getListErr:'獲取名單訊息失敗',
         getListErr:'獲取名單訊息失敗',
-        hasJoin:'恭喜您,已經加入成功! ',
+        hasJoin:'課程加入成功! ',
         getErr:'用戶訊息讀取失敗',
         getErr:'用戶訊息讀取失敗',
-        parseErr:'登入訊息讀取失敗'
+        parseErr:'登入訊息讀取失敗',
+        cusLabel:'課程:',
+        toTeammodel:'即刻前往醍摩豆雲平台>>>'
     }  
     }  
 }
 }

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

@@ -66,6 +66,8 @@ export default {
 	isFalse: '錯誤',
 	isFalse: '錯誤',
 	deleteItem: '刪除',
 	deleteItem: '刪除',
 	editItem: '編輯',
 	editItem: '編輯',
+	selectItem:'選題',
+	removeItem:'移除',
 	confirm: '確認',
 	confirm: '確認',
 	cancel: '取消',
 	cancel: '取消',
 	deleteSuc: '刪除成功',
 	deleteSuc: '刪除成功',
@@ -229,7 +231,11 @@ export default {
 		tip2: '題綜合題的配分',
 		tip2: '題綜合題的配分',
 		tip3: '不足',
 		tip3: '不足',
 		tip4: '溢出',
 		tip4: '溢出',
-		tip5: '請檢查後重試!'
+		tip5: '請檢查後重試!',
+		tip6:'切換組題方式會清空當前所選試題,是否繼續?',
+		tip7:'檢測到當前試卷存在未入庫的試題,是否需要同步到試題庫?',
+		tip8:'同步入庫',
+		tip9:'不同步',
 	},
 	},
 	points: {
 	points: {
 		addPoint: '新增知識點',
 		addPoint: '新增知識點',

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

@@ -37,6 +37,7 @@ import user from './user'
 import notice from './notice'
 import notice from './notice'
 import answerSheet from './answerSheet'
 import answerSheet from './answerSheet'
 import tip from './tip'
 import tip from './tip'
+import selflearn from './selflearn'
 export default {
 export default {
   
   
   schoolBaseInfo,
   schoolBaseInfo,
@@ -78,6 +79,7 @@ export default {
   notice,
   notice,
   answerSheet,
   answerSheet,
   tip,
   tip,
+  selflearn,
   test: '測試',
   test: '測試',
   formConfigP: {
   formConfigP: {
     input: '請輸入',
     input: '請輸入',

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

@@ -208,5 +208,9 @@ export default {
   noProfession: '暫未設置專業',
   noProfession: '暫未設置專業',
   all: '全部',
   all: '全部',
   noSet:'未設置',
   noSet:'未設置',
-  newClass:'建立班級'
+  newClass:'建立班級',
+  gradeWarning1: '請設置學級/年級',
+  classRep: '班級重複',
+  updOk:'修改成功',
+  updErr:'修改失敗'
 }
 }

+ 23 - 0
TEAMModelOS/ClientApp/src/locale/lang/zh-TW/selflearn.js

@@ -0,0 +1,23 @@
+export default{
+    choose:{
+        syllabus:'課綱',
+        syllubusRange:'課綱範圍:',
+        privateSy:'個人課綱',
+        schoolSy:'校本課綱',
+        periodLabel:'學段:',
+        subjectLabel:'學科:',
+        book:'冊別',
+        resoureCount:'內容資源數',
+        pointCount:'知識點數',
+        nodeCount:'節點數',
+        noData:'暫無數據',
+        contentLabel:'內容',
+        contentRange:'資源範圍:',
+        privateContent:'個人資源',
+        schoolContent:'校本資源',
+        type:'類型:',
+        searchHolder:'搜索',
+        quLabel:'題庫',
+        testLabel:'試卷庫',
+    }
+}

+ 20 - 2
TEAMModelOS/ClientApp/src/router/routes.js

@@ -118,7 +118,7 @@ export const routes = [
 	{
 	{
 		name: 'home',
 		name: 'home',
 		path: '/home',
 		path: '/home',
-		redirect: '/home/HomePage',
+		redirect: '/home/MyCourse',
 		component: resolve => require(['@/view/Home'], resolve),
 		component: resolve => require(['@/view/Home'], resolve),
 		meta: {
 		meta: {
 			middleware: ['login', 'role:admin|teacher'], // 强制登录(会自动跳转到登录页),角色为管理员或教师
 			middleware: ['login', 'role:admin|teacher'], // 强制登录(会自动跳转到登录页),角色为管理员或教师
@@ -703,7 +703,7 @@ export const routes = [
 				activeName: 'OpenPlat'
 				activeName: 'OpenPlat'
 			}
 			}
 		},
 		},
-		//设置
+		//个人中心
 		{
 		{
 			path: 'userCenter',
 			path: 'userCenter',
 			name: 'userCenter',
 			name: 'userCenter',
@@ -712,6 +712,24 @@ export const routes = [
 
 
 			}
 			}
 		},
 		},
+		//公告管理页面
+		{
+			path: 'schoolNotify',
+			name: 'schoolNotify',
+			component: resolve => require(['@/view/notify/NotifyMgt.vue'], resolve),
+			meta: {
+				activeName: 'schoolNotify'
+			}
+		},
+		//创建公告页面
+		{
+			path: 'createNotify',
+			name: 'createNotify',
+			component: resolve => require(['@/view/notify/CreateNotify.vue'], resolve),
+			meta: {
+				activeName: 'schoolNotify'
+			}
+		},
 		//课堂记录
 		//课堂记录
 		{
 		{
 			path: 'classRecord',
 			path: 'classRecord',

A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 801 - 338
TEAMModelOS/ClientApp/src/static/twJson.js


A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 801 - 338
TEAMModelOS/ClientApp/src/static/twJsonT.js


+ 21 - 11
TEAMModelOS/ClientApp/src/store/module/answerSheet.js

@@ -76,14 +76,14 @@ export default {
 			"pageNumBlockCount": 3, //页码块数量
 			"pageNumBlockCount": 3, //页码块数量
 			"pageNumStartValue": 1, //页码起始值, 起始是3个空格方块开始,写1; 2个空格1个实心,写0
 			"pageNumStartValue": 1, //页码起始值, 起始是3个空格方块开始,写1; 2个空格1个实心,写0
 
 
-			"threshValue": [190, 220, 10], //二值化区间(pc)-->不同扫描仪的结果图像数据有差距, 按需调整
-			"threshValuePhone": [190, 220, 10], //二值化区间(手机)
+			// "threshValue": [190, 220, 10], //二值化区间(pc)-->不同扫描仪的结果图像数据有差距, 按需调整
+			// "threshValuePhone": [190, 220, 10], //二值化区间(手机)
 
 
 			// "huiSize": ANCHORPROP.width, //单个整体回字大小
 			// "huiSize": ANCHORPROP.width, //单个整体回字大小
-			"huiSize": 24, //绘制有误差,先暂时按照实际大小写固定值(待确认)
-			"minHuiSize": 0.005, //最小回字的大小比列, 以回字最中间的方块为最小
-			"maxHuiSize": 0.1, //最大回字的大小比列, 以回字最外层的方块为最大
-			"notHuisRect": [0.3, 0.3, 0.4, 0.4], //不检测回字区域(pc版辅助效果20%, 手机版50%)
+			// "huiSize": 24, //绘制有误差,先暂时按照实际大小写固定值(待确认)
+			// "minHuiSize": 0.005, //最小回字的大小比列, 以回字最中间的方块为最小
+			// "maxHuiSize": 0.1, //最大回字的大小比列, 以回字最外层的方块为最大
+			// "notHuisRect": [0.3, 0.3, 0.4, 0.4], //不检测回字区域(pc版辅助效果20%, 手机版50%)
 
 
 			//内容块 vblockCount为该模块竖向的方块数 hblockCount为该模块横向方块数
 			//内容块 vblockCount为该模块竖向的方块数 hblockCount为该模块横向方块数
 			"contents": [],
 			"contents": [],
@@ -120,18 +120,20 @@ export default {
 		},
 		},
 		// 设置信息填写区域的配置数据
 		// 设置信息填写区域的配置数据
 		setInfoConfig(state, val) {
 		setInfoConfig(state, val) {
-			val.index = 1
+			val.index = 0
 			val.x = Number(val.x.toFixed())
 			val.x = Number(val.x.toFixed())
 			val.y = Number(val.y.toFixed())
 			val.y = Number(val.y.toFixed())
 			val.width = Number(val.width.toFixed())
 			val.width = Number(val.width.toFixed())
 			val.height = Number(val.height.toFixed())
 			val.height = Number(val.height.toFixed())
-			val.count = 0
+			val.count = val.hblockCount
 			val.id = val.pageNum + '-' + val.index
 			val.id = val.pageNum + '-' + val.index
 			if(state.config.contents.length){
 			if(state.config.contents.length){
 				let infoItem = state.config.contents.find(i => i.type === 0)
 				let infoItem = state.config.contents.find(i => i.type === 0)
 				if(infoItem){
 				if(infoItem){
-					infoItem.hblockCount = val.hblockCount
+					// infoItem.hblockCount = val.hblockCount
 				}else{
 				}else{
+					delete val.vblockCount
+					delete val.hblockCount
 					state.config.contents.push(val)
 					state.config.contents.push(val)
 				}
 				}
 			}else{
 			}else{
@@ -146,15 +148,20 @@ export default {
 			val.width = Number(val.width.toFixed())
 			val.width = Number(val.width.toFixed())
 			val.height = Number(val.height.toFixed())
 			val.height = Number(val.height.toFixed())
 			val.id = val.pageNum + '-' + val.index
 			val.id = val.pageNum + '-' + val.index
+			val.index = 1
 			if(state.config.contents.length){
 			if(state.config.contents.length){
 				let infoItem = state.config.contents.find(i => i.type === 1)
 				let infoItem = state.config.contents.find(i => i.type === 1)
 				if(infoItem){
 				if(infoItem){
 					infoItem.height= val.height
 					infoItem.height= val.height
-					infoItem.vblockCount= val.vblockCount
+					// infoItem.vblockCount= val.vblockCount
 				}else{
 				}else{
+					delete val.vblockCount
+					delete val.hblockCount
 					state.config.contents.push(val)
 					state.config.contents.push(val)
 				}
 				}
 			}else{
 			}else{
+				delete val.vblockCount
+				delete val.hblockCount
 				state.config.contents.push(val)
 				state.config.contents.push(val)
 			}
 			}
 		},
 		},
@@ -165,7 +172,6 @@ export default {
 			val.width = Number(val.width.toFixed())
 			val.width = Number(val.width.toFixed())
 			val.height = Number(val.height.toFixed())
 			val.height = Number(val.height.toFixed())
 			val.id = val.pageNum + '-' + val.index
 			val.id = val.pageNum + '-' + val.index
-			val.count = 0
 			// 如果是补充框 ID要保持和上一个ID一致
 			// 如果是补充框 ID要保持和上一个ID一致
 			if(val.index === 1 && val.isFix){
 			if(val.index === 1 && val.isFix){
 				let prePageItems = state.config.contents.filter(i => i.pageNum === val.pageNum - 1)
 				let prePageItems = state.config.contents.filter(i => i.pageNum === val.pageNum - 1)
@@ -179,9 +185,13 @@ export default {
 					infoItem.y= val.y
 					infoItem.y= val.y
 					infoItem.pageNum = val.pageNum
 					infoItem.pageNum = val.pageNum
 				}else{
 				}else{
+					val.index = val.startOrder
+					delete val.startOrder
 					state.config.contents.push(val)
 					state.config.contents.push(val)
 				}
 				}
 			}else{
 			}else{
+				val.index = val.startOrder
+				delete val.startOrder
 				state.config.contents.push(val)
 				state.config.contents.push(val)
 			}
 			}
 		},
 		},

+ 1 - 1
TEAMModelOS/ClientApp/src/store/module/schoolBaseInfo.js

@@ -53,7 +53,7 @@ export default {
                 if (objIndex >= 0) {
                 if (objIndex >= 0) {
                     state.students[objIndex] = item
                     state.students[objIndex] = item
                 } else {
                 } else {
-                    state.students.push(item)
+                    state.students.unshift(item)
                 }
                 }
             })
             })
         }
         }

+ 2 - 3
TEAMModelOS/ClientApp/src/utils/blobTool.js

@@ -1,7 +1,7 @@
 import { GLOBAL } from '@/static/Global.js';
 import { GLOBAL } from '@/static/Global.js';
 import JsFn from '@/utils/js-fn.js';
 import JsFn from '@/utils/js-fn.js';
 import API from '@/api/index.js';
 import API from '@/api/index.js';
-const blobPath = ['audio', 'doc', 'exam', 'image', 'item', 'notice', 'other', 'paper', 'syllabus', 'res', 'student', 'survey', 'temp', 'thum', 'video', 'vote']
+const blobPath = ['avatar', 'audio', 'doc', 'exam', 'image', 'item', 'notice', 'other', 'paper', 'syllabus', 'res', 'student', 'survey', 'temp', 'thum', 'video', 'vote']
 const { BlobServiceClient, BlobClient } = require("@azure/storage-blob")
 const { BlobServiceClient, BlobClient } = require("@azure/storage-blob")
 //获取文件后缀和类型
 //获取文件后缀和类型
 function getExAndType(fileName) {
 function getExAndType(fileName) {
@@ -371,8 +371,7 @@ export default class BlobTool {
                 if (handleSize) {
                 if (handleSize) {
                     cont = this.container
                     cont = this.container
                 }
                 }
-
-                if (blobs && blobs.blobList) {
+                if (blobs && blobs.blobList.length) {
                     let count = 0
                     let count = 0
                     blobs.blobList.forEach(blobItem => {
                     blobs.blobList.forEach(blobItem => {
                         let newUrl = targetFolder + blobItem.name
                         let newUrl = targetFolder + blobItem.name

+ 21 - 0
TEAMModelOS/ClientApp/src/view/classmgt/ManageClass.less

@@ -135,4 +135,25 @@
 .list-group {
 .list-group {
     min-height: 180px;
     min-height: 180px;
     padding-top:5px;
     padding-top:5px;
+}
+.item-tools{
+    display: none;
+}
+.student-avatar-box{
+    width: 150px;
+    height: 150px;
+    border-radius: 50%;
+    margin: auto;
+    margin-top: 50px;
+    margin-left: 34%;
+    display: inline-block;
+    background-size: contain !important;
+    background-repeat: no-repeat !important;
+}
+.again-text{
+    color:#2d8cf0;
+    margin-left: 15px;
+    cursor: pointer;
+    text-decoration: underline;
+    font-size: 14px;
 }
 }

+ 98 - 51
TEAMModelOS/ClientApp/src/view/classmgt/ManageClass.vue

@@ -35,7 +35,9 @@
                     </template>
                     </template>
                     <template slot-scope="{ row,index }" slot="action">
                     <template slot-scope="{ row,index }" slot="action">
                         <div class="item-tools">
                         <div class="item-tools">
-                            <Icon type="md-refresh" size="18" style="cursor:pointer;" :title="$t('cusMgt.resetPw')" @click="resetPW(row)" />
+                            <Icon type="md-contact" size="18" style="cursor:pointer;" title="设置头像" @click="setAvatar(row)" />
+                            <Icon type="md-refresh" size="18" style="cursor:pointer;margin-left:10px" :title="$t('cusMgt.resetPw')" @click="resetPW(row)" />
+                            <!-- <Icon type="md-create" size="18" style="cursor:pointer;margin-left:10px" title="设置座号" @click="resetPW(row)" /> -->
                         </div>
                         </div>
                     </template>
                     </template>
                     <template slot-scope="{ row, index }" slot="groupId">
                     <template slot-scope="{ row, index }" slot="groupId">
@@ -99,9 +101,26 @@
                 </FormItem>
                 </FormItem>
             </Form>
             </Form>
         </Modal>
         </Modal>
+        <!-- 设置头像 -->
+        <Modal v-model="avatarStatus" title="设置头像" @on-ok="confirmSetAvatar" @on-cancel="avatarUrl = ''" :loading="modalLoading">
+            <p>
+                姓名:
+                <span>{{curStudent.name}}</span>
+                <span v-show="avatarUrl" class="again-text" @click="avatarUrl = ''">重新上传</span>
+            </p>
+            <Upload style="margin-top:20px" type="drag" action="" :before-upload="onBeforeUpload" v-show="!avatarUrl">
+                <div style="padding: 20px 0">
+                    <Icon type="ios-cloud-upload" size="52" style="color: #3399ff"></Icon>
+                    <p>上传头像</p>
+                </div>
+            </Upload>
+            <div class="student-avatar-box" :style="{background: `url('${avatarUrl}?${blobSas}')`}" v-show="avatarUrl"></div>
+            <!-- <img class="student-avatar" v-show="avatarUrl" :src="avatarUrl+'?'+blobSas" alt=""> -->
+        </Modal>
     </div>
     </div>
 </template>
 </template>
 <script>
 <script>
+import BlobTool from '@/utils/blobTool.js'
 import Draggable from 'vuedraggable'
 import Draggable from 'vuedraggable'
 import excel from '@/utils/excel.js'
 import excel from '@/utils/excel.js'
 import PersonalPhoto from "@/components/public/personalPhoto/Index.vue"
 import PersonalPhoto from "@/components/public/personalPhoto/Index.vue"
@@ -111,13 +130,18 @@ export default {
     },
     },
     data() {
     data() {
         return {
         return {
+            avatarUrl: '',
+            blobSas: '',
+            modalLoading: true,
+            blobTool: undefined,
+            avatarStatus: false,
+            curStudent: {},
             curClassIndex: 0,
             curClassIndex: 0,
             groupName: '',
             groupName: '',
             groupData: [],
             groupData: [],
             tableHeight: 0,
             tableHeight: 0,
             nameEdStatus: true,
             nameEdStatus: true,
             viewType: 1,
             viewType: 1,
-            tableLoading: false,
             customGroupStatus: false,
             customGroupStatus: false,
             updated: false,
             updated: false,
             tableLoading: false,
             tableLoading: false,
@@ -194,6 +218,75 @@ export default {
         }
         }
     },
     },
     methods: {
     methods: {
+        confirmSetAvatar() {
+            if (!this.avatarUrl) {
+                this.modalLoading = false
+                setTimeout(() => {
+                    this.modalLoading = true
+                }, 0)
+                this.$Message.warning('请上传头像')
+                return
+            }
+            //保存头像
+            let schoolId = this.$store.state.userInfo.schoolCode
+            let data = [
+                {
+                    picture: this.avatarUrl,
+                    studentId: this.curStudent.id
+                }
+            ]
+            this.$api.stuAccount.setStudentAvatar(schoolId, data).then(
+                res => {
+                    this.$Message.success('设置成功')
+                    if (res.students) {
+                        res.students.forEach(item => {
+                            let index = this.classList[this.curClassIndex].students.findIndex(i => {
+                                return i.id == item.id
+                            })
+                            if (index > -1) {
+                                let students = JSON.parse(JSON.stringify(this.classList[this.curClassIndex].students))
+                                students[index].picture = item.picture
+                                this.$set(this.classList[this.curClassIndex], 'students', students)
+                                this.$store.dispatch('schoolBaseInfo/updStudentsToState', [students[index]])
+                                console.log(this.classList[this.curClassIndex])
+                                // this.$forceUpdate()
+                            }
+                        })
+                    }
+                },
+                err => {
+                    this.$Message.error('设置失败')
+                }
+            ).finally(() => {
+                this.avatarStatus = false
+                this.avatarUrl = ''
+            })
+
+        },
+        onBeforeUpload(file) {
+            this.blobTool.upload(file, 'avatar').then(
+                res => {
+                    this.avatarUrl = res.url
+                },
+                err => {
+                    this.$Message.error('头像上传失败')
+                }
+            )
+            return false
+        },
+        //设置头像
+        setAvatar(row) {
+            if (!this.blobTool) {
+                let sas = this.$store.state.user.schoolProfile.blob_sas
+                this.blobSas = sas
+                let blobUrl = JSON.parse(decodeURIComponent(localStorage.school_profile, "utf-8")).blob_uri
+                let host = blobUrl.substring(0, blobUrl.lastIndexOf('/'))
+                let cont = blobUrl.substring(blobUrl.lastIndexOf('/') + 1)
+                this.blobTool = new BlobTool(host, cont, '?' + sas, 'school')
+            }
+            this.curStudent = row
+            this.avatarStatus = true
+        },
         /**
         /**
          * 重置密碼
          * 重置密碼
          * @param row
          * @param row
@@ -342,24 +435,6 @@ export default {
         },
         },
         saveGroup() {
         saveGroup() {
             this.tableLoading = true
             this.tableLoading = true
-            // this.$api.schoolSetting.upsertGroup({
-            //     classroom: this.classList[this.curClassIndex]
-            // }).then(
-            //     (res) => {
-            //         if (!res.error) {
-            //             this.$Message.success(this.$t('cusMgt.saveOk'))
-            //         } else {
-            //             this.$Message.error('API error!')
-            //         }
-            //     },
-            //     (err) => {
-            //         this.$Message.error('API error!')
-            //     }
-            // ).finally(() => {
-            //     setTimeout(() => {
-            //         this.tableLoading = false
-            //     }, 500)
-            // })
             this.$api.schoolSetting.upsertGroup({
             this.$api.schoolSetting.upsertGroup({
                 students: this.classList[this.curClassIndex].students
                 students: this.classList[this.curClassIndex].students
             }).then(
             }).then(
@@ -499,13 +574,6 @@ export default {
         },
         },
         //导出名单
         //导出名单
         exportStudents() {
         exportStudents() {
-            /*const params = {
-                title: this.columns.map(i => i.title),
-                key: this.columns.map(i => i.key),
-                data: this.classList[this.curClassIndex].students,
-                autoWidth: true,
-                filename: '学生名单'
-            }*/
             const params = {
             const params = {
                 title: [
                 title: [
                     this.$t('cusMgt.stuClassCol1'),
                     this.$t('cusMgt.stuClassCol1'),
@@ -527,7 +595,6 @@ export default {
                 res => {
                 res => {
                     if (this.$store.state.userInfo.isHeadmaster) {
                     if (this.$store.state.userInfo.isHeadmaster) {
                         let classes = res.school_classes
                         let classes = res.school_classes
-                        console.log('class', classes)
                         this.classList = classes.filter(item => {
                         this.classList = classes.filter(item => {
                             return this.$store.state.userInfo.mgtClasses.indexOf(item.id) > -1
                             return this.$store.state.userInfo.mgtClasses.indexOf(item.id) > -1
                         })
                         })
@@ -535,7 +602,6 @@ export default {
                             this.curClassCode = this.classList[0].id
                             this.curClassCode = this.classList[0].id
                             this.findClassStu()
                             this.findClassStu()
                         }
                         }
-                        console.log('list', this.classList)
                     }
                     }
                 }
                 }
             )
             )
@@ -543,28 +609,6 @@ export default {
         //查询班级学生
         //查询班级学生
         findClassStu() {
         findClassStu() {
             this.tableLoading = true
             this.tableLoading = true
-            // API调整
-            // let params = {
-            //     'school_code': this.$store.state.userInfo.schoolCode,
-            //     'ids': [this.curClassCode],
-            //     'scope': 'school'
-            // }
-            // this.$api.schoolSetting.getClassroomStudent(params).then(
-            //     (res) => {
-            //         if (!res.error) {
-            //             this.classList[this.curClassIndex].students = res.stus.length ? res.stus[0] : []
-            //         } else {
-            //             this.$Message.error('API error!')
-            //         }
-            //     },
-            //     (err) => {
-            //         this.$Message.error('API error!')
-            //     }
-            // ).finally(() => {
-            //     setTimeout(() => {
-            //         this.tableLoading = false
-            //     }, 500)
-            // })
             let params = {
             let params = {
                 school_code: this.$store.state.userInfo.schoolCode,
                 school_code: this.$store.state.userInfo.schoolCode,
                 ids: [this.curClassCode]
                 ids: [this.curClassCode]
@@ -619,4 +663,7 @@ export default {
 .group-title-wrap fieldset[disabled] .ivu-input {
 .group-title-wrap fieldset[disabled] .ivu-input {
     cursor: pointer;
     cursor: pointer;
 }
 }
+.ivu-table-row-hover .item-tools {
+    display: inline-block;
+}
 </style>
 </style>

+ 1 - 1
TEAMModelOS/ClientApp/src/view/evaluation/bank/ExerciseList.vue

@@ -103,7 +103,7 @@
 				</div>
 				</div>
 				
 				
 				<div class="exercise-item-children" v-if="item.children.length">
 				<div class="exercise-item-children" v-if="item.children.length">
-					<BaseChild :children="item.children"></BaseChild>
+					<BaseChild :children="item.children" inBank></BaseChild>
 				</div>
 				</div>
 				
 				
 				<!-- 选项部分 -->
 				<!-- 选项部分 -->

+ 2 - 0
TEAMModelOS/ClientApp/src/view/evaluation/bank/TestPaperList.vue

@@ -200,6 +200,7 @@
 				}
 				}
 				this.dataLoading = true
 				this.dataLoading = true
 				let curPaper = paper
 				let curPaper = paper
+				sessionStorage.setItem('isSave',0)
 				try {
 				try {
 					// 获取完整试卷数据再跳转编辑页面
 					// 获取完整试卷数据再跳转编辑页面
 					let fullPaperJson = this.fullPaperJson.id === curPaper.id ? this.fullPaperJson : await this.$evTools.getFullPaper(curPaper)
 					let fullPaperJson = this.fullPaperJson.id === curPaper.id ? this.fullPaperJson : await this.$evTools.getFullPaper(curPaper)
@@ -350,6 +351,7 @@
 			 */
 			 */
 			async goToPaper(paper) {
 			async goToPaper(paper) {
 				this.dataLoading = true
 				this.dataLoading = true
+				sessionStorage.setItem('isSave',0)
 				try {
 				try {
 					// 获取完整试卷数据再跳转编辑页面
 					// 获取完整试卷数据再跳转编辑页面
 					let fullPaperJson = this.fullPaperJson.id === paper.id ? this.fullPaperJson : await this.$evTools.getFullPaper(paper)
 					let fullPaperJson = this.fullPaperJson.id === paper.id ? this.fullPaperJson : await this.$evTools.getFullPaper(paper)

+ 5 - 1
TEAMModelOS/ClientApp/src/view/evaluation/components/BaseChild.vue

@@ -14,7 +14,7 @@
 				</div>
 				</div>
 			</div>
 			</div>
 			<div class="item-btn-toggle">
 			<div class="item-btn-toggle">
-				<template>
+				<template v-if="!inBank">
 					<InputNumber  :min="0" v-model="item.score"  v-if="isShowScore" :step="0.5"
 					<InputNumber  :min="0" v-model="item.score"  v-if="isShowScore" :step="0.5"
 						style="display: inline-block ;width: 60px;margin-right: 10px;height: 30px;" @click.stop>
 						style="display: inline-block ;width: 60px;margin-right: 10px;height: 30px;" @click.stop>
 					</InputNumber>
 					</InputNumber>
@@ -127,6 +127,10 @@
 				type: Boolean,
 				type: Boolean,
 				default: false
 				default: false
 			},
 			},
+			inBank: {
+				type: Boolean,
+				default: false
+			},
 			isShowAnalysis: {
 			isShowAnalysis: {
 				type: Boolean,
 				type: Boolean,
 				default: false
 				default: false

+ 1 - 1
TEAMModelOS/ClientApp/src/view/evaluation/components/BaseChildList.vue

@@ -21,7 +21,7 @@
 		<!-- 添加子题弹窗 -->
 		<!-- 添加子题弹窗 -->
 		<Modal v-model="editChildModal" width="1080" footer-hide class="">
 		<Modal v-model="editChildModal" width="1080" footer-hide class="">
 			<div class="modal-header" slot="header">{{$t('evaluation.exerciseList.editChild')}}</div>
 			<div class="modal-header" slot="header">{{$t('evaluation.exerciseList.editChild')}}</div>
-			<BaseCreateChild @addFinish='onEditChildFinish' refId="childListEdit" :editItem="curItem" :curPeriodIndex="curPeriodIndex"
+			<BaseCreateChild v-if="editChildModal" @addFinish='onEditChildFinish' refId="childListEdit" :editItem="curItem" :curPeriodIndex="curPeriodIndex"
 			 :curSubjectIndex="curSubjectIndex"></BaseCreateChild>
 			 :curSubjectIndex="curSubjectIndex"></BaseCreateChild>
 		</Modal>
 		</Modal>
 	</div>
 	</div>

+ 2 - 0
TEAMModelOS/ClientApp/src/view/evaluation/components/BaseCreateChild.vue

@@ -281,6 +281,8 @@
 				);
 				);
 				exerciseItem.field = this.exerciseField + 1;
 				exerciseItem.field = this.exerciseField + 1;
 				exerciseItem.knowledge = this.exercisePoints;
 				exerciseItem.knowledge = this.exercisePoints;
+				exerciseItem.children = [];
+				exerciseItem.score = 0;
 				exerciseItem.code =
 				exerciseItem.code =
 					this.$parent.$parent.exerciseScope === 0 ?
 					this.$parent.$parent.exerciseScope === 0 ?
 					this.$store.state.userInfo.TEAMModelId :
 					this.$store.state.userInfo.TEAMModelId :

+ 17 - 9
TEAMModelOS/ClientApp/src/view/evaluation/components/BaseEditExercise.vue

@@ -1,6 +1,6 @@
 <template>
 <template>
 	<div class="ev-container component-ev-container" :id="refId" ref="editContainer">
 	<div class="ev-container component-ev-container" :id="refId" ref="editContainer">
-		<div class="display-flex" v-if="isSchool">
+		<div class="display-flex" v-if="isSchool && !hidePeriod">
 			<div class="exersices-attr my-radio-style">
 			<div class="exersices-attr my-radio-style">
 				<IconText :text="$t('evaluation.newExercise.choosePeriod')" :color="'#00b8ff'" :icon="'md-school'"></IconText>
 				<IconText :text="$t('evaluation.newExercise.choosePeriod')" :color="'#00b8ff'" :icon="'md-school'"></IconText>
 				<Select v-model="exercisePeriod" @on-change="onPeriodChange">
 				<Select v-model="exercisePeriod" @on-change="onPeriodChange">
@@ -9,7 +9,7 @@
 			</div>
 			</div>
 			<div class="my-radio-style exersices-attr">
 			<div class="my-radio-style exersices-attr">
 				<IconText :text="$t('evaluation.newExercise.chooseGrade')" :color="'#00b8ff'" :icon="'logo-buffer'"></IconText>
 				<IconText :text="$t('evaluation.newExercise.chooseGrade')" :color="'#00b8ff'" :icon="'logo-buffer'"></IconText>
-				<Select v-model="exerciseGrade" multiple>
+				<Select v-model="exerciseGrade" multiple :max-tag-count="3">
 					<Option v-for="(grade, gradeIndex) in gradeList" :value="gradeIndex" :key="grade" :label="grade">{{ grade }}</Option>
 					<Option v-for="(grade, gradeIndex) in gradeList" :value="gradeIndex" :key="grade" :label="grade">{{ grade }}</Option>
 				</Select>
 				</Select>
 			</div>
 			</div>
@@ -21,12 +21,6 @@
 			</div>
 			</div>
 		</div>
 		</div>
 		<div class="display-flex">
 		<div class="display-flex">
-			<!-- <div class="exersices-attr my-radio-style">
-				<IconText :text="'题目归属'" :color="'#00b8ff'" :icon="'md-cube'"></IconText>
-				<Select v-model="exerciseScope" disabled>
-					<Option v-for="(item, index) in scopeList" :value="index" :key="index">{{ item }}</Option>
-				</Select>
-			</div> -->
 			<div class="exersices-attr edit-exersices-attr-diff my-radio-style">
 			<div class="exersices-attr edit-exersices-attr-diff my-radio-style">
 				<IconText :text="$t('evaluation.newExercise.diff')" :color="'#00b8ff'" :icon="'md-pulse'"></IconText>
 				<IconText :text="$t('evaluation.newExercise.diff')" :color="'#00b8ff'" :icon="'md-pulse'"></IconText>
 				<RadioGroup v-model="exersicesDiff" type="button" ref="diffRef">
 				<RadioGroup v-model="exersicesDiff" type="button" ref="diffRef">
@@ -143,7 +137,21 @@
 
 
 	export default {
 	export default {
 		name:'BaseEditExercise',
 		name:'BaseEditExercise',
-		props: ["exerciseItem", "refId"],
+		// props: ["exerciseItem", "refId", "hidePeriod"],
+		props:{
+			exerciseItem:{
+				type:Object,
+				default:() => null
+			},
+			refId:{
+				type:String,
+				default:() => ''
+			},
+			hidePeriod:{
+				type:Boolean,
+				default:false
+			}
+		},
 		components: {
 		components: {
 			IconText,
 			IconText,
 			BaseSingle,
 			BaseSingle,

+ 3 - 7
TEAMModelOS/ClientApp/src/view/evaluation/components/BaseExerciseList.vue

@@ -24,7 +24,7 @@
 					<div class="item-tools-wrap">
 					<div class="item-tools-wrap">
 						<!-- <div class="item-tools-t flex-row-center" v-show="isShowTools" @click.stop="handleSetScore(item,exerciseList.indexOf(item),typeItem.list,index)">
 						<!-- <div class="item-tools-t flex-row-center" v-show="isShowTools" @click.stop="handleSetScore(item,exerciseList.indexOf(item),typeItem.list,index)">
 							<Icon type="ios-list-box-outline" />配分</div> -->
 							<Icon type="ios-list-box-outline" />配分</div> -->
-						<div class="item-tools-t flex-row-center" v-if="!item.blob && errorList.indexOf(item) < 0"
+						<div class="item-tools-t flex-row-center"
 							@click.stop="handleToolEdit(typeItem.list,item,index)">
 							@click.stop="handleToolEdit(typeItem.list,item,index)">
 							<Icon type="ios-brush-outline" />{{$t('evaluation.editItem')}}
 							<Icon type="ios-brush-outline" />{{$t('evaluation.editItem')}}
 						</div>
 						</div>
@@ -254,7 +254,7 @@
 		<Modal v-model="editExerciseModal" class-name="edit-exercise-modal" width="1200px" footer-hide
 		<Modal v-model="editExerciseModal" class-name="edit-exercise-modal" width="1200px" footer-hide
 			:title="$t('evaluation.exerciseList.editExercise')" @on-visible-change="editModalChange">
 			:title="$t('evaluation.exerciseList.editExercise')" @on-visible-change="editModalChange">
 			<BaseEditExercise :exerciseItem="currentExercise" @onEditSuccess="onEditSuccess" refId="paperEdit"
 			<BaseEditExercise :exerciseItem="currentExercise" @onEditSuccess="onEditSuccess" refId="paperEdit"
-				ref="paperEdit"></BaseEditExercise>
+				ref="paperEdit" hidePeriod></BaseEditExercise>
 			<div slot="footer">
 			<div slot="footer">
 				<Button type="success">{{$t('evaluation.confirm')}}</Button>
 				<Button type="success">{{$t('evaluation.confirm')}}</Button>
 			</div>
 			</div>
@@ -787,7 +787,6 @@
 						}
 						}
 					})
 					})
 				})
 				})
-				console.log(result)
 				return result
 				return result
 			}
 			}
 
 
@@ -797,16 +796,13 @@
 			this.$EventBus.$on('importFinish', list => {
 			this.$EventBus.$on('importFinish', list => {
 				this.errorList = list
 				this.errorList = list
 				this.noAnswerList = list.filter(i => i.answer.length === 0)
 				this.noAnswerList = list.filter(i => i.answer.length === 0)
-				console.log(list)
-				console.log(this.noAnswerList)
 			})
 			})
 			
 			
 			this.$EventBus.$off('getNewPaper')
 			this.$EventBus.$off('getNewPaper')
 			this.$EventBus.$on('getNewPaper', newPaper => {
 			this.$EventBus.$on('getNewPaper', newPaper => {
 				console.log(newPaper)
 				console.log(newPaper)
 				let isSave = Number(sessionStorage.getItem('isSave'))
 				let isSave = Number(sessionStorage.getItem('isSave'))
-				console.log(isSave)
-				if (newPaper && !isSave) {
+				if (newPaper.item && newPaper.item.length && !isSave) {
 					let that = this
 					let that = this
 					this.groupList = [] // 题型排序的数据
 					this.groupList = [] // 题型排序的数据
 					this.orderList = [] //顺序排列的数据
 					this.orderList = [] //顺序排列的数据

+ 77 - 0
TEAMModelOS/ClientApp/src/view/evaluation/components/BasePasteTool.vue

@@ -0,0 +1,77 @@
+<template>
+	<div>
+		<p style="color: red;margin: 10px;">* 将您从word复制的试题直接粘贴在下面编辑器并进行打点后即可一键生成试题</p>
+		<div class="exersices-content">
+			<div style="margin:  0 10px;">
+				<div ref="editor" style="text-align:left"></div>
+			</div>
+		</div>
+	</div>
+</template>
+<script>
+	import E from 'wangeditor'
+	import {
+		EMFJS,
+		RTFJS,
+		WMFJS
+	} from 'rtf.js';
+	export default {
+		data() {
+			return {
+				stemContent: '',
+				stemEditor: null,
+				answerContent: '',
+				answerEditor: null
+
+			}
+		},
+		methods: {
+			
+		},
+		mounted() {
+			let stemEditor = new E(this.$refs.editor)
+			stemEditor.config.onchange = (html) => {
+				this.stemContent = html
+			}
+			stemEditor.config.uploadImgShowBase64 = true;
+			this.$editorTools.initSimpleEditor(stemEditor,this)
+			stemEditor.config.pasteFilterStyle = true
+			stemEditor.config.height = 800
+			stemEditor.create()
+			
+
+			function hexToBase64(str) {
+			    var bString = "";
+			    for( var i = 0; i < str.length; i +=2) {
+			         bString += String.fromCharCode( parseInt( str.substr( i, 2), 16));
+			    }
+			    return "data:image/png; base64," + btoa(bString);
+			}
+
+			document.addEventListener('paste', function(e) {
+				for (var i = 0, len = e.clipboardData.items.length; i < len; i++) {
+					var item = e.clipboardData.items[i];
+					if (item.kind === "string" && item.type === 'text/rtf') {
+						item.getAsString(function(str) {
+							console.log(str)
+							var pattern = /\\pngblip.*?\}\{/g;
+							var srcReg = /src=[\'\"]?([^\'\"]*)[\'\"]?/ig;
+							let result = str.match(pattern)
+							let base64Arr = result.map(i => hexToBase64(i.split('}')[1]))
+							let html = stemEditor.txt.html()
+							if(html.match(srcReg).length){
+								html.match(srcReg).filter(j => j.includes('file://')).forEach((i,index) => {
+										html = html.replace(i,`src="${base64Arr[index]}"`)
+								})
+								stemEditor.txt.clear()
+								stemEditor.txt.html(html)
+							}
+						})
+					}
+				}
+			})
+		},
+
+	}
+</script>
+

+ 5 - 2
TEAMModelOS/ClientApp/src/view/evaluation/components/BasePoints.vue

@@ -1,7 +1,7 @@
 <template>
 <template>
 	<div class="points-container">
 	<div class="points-container">
-		<Button type="info" class="btn-add-point" @click="addPointsModal = true"
-			v-show="curScope === 'school'">{{$t('evaluation.points.addPoint')}}</Button>
+		<!-- <Button type="info" class="btn-add-point" @click="addPointsModal = true"
+			v-show="curScope === 'school'">{{$t('evaluation.points.addPoint')}}</Button> -->
 		<div class="filter-wrap">
 		<div class="filter-wrap">
 			<Select v-model="selectPeriod" @on-change="onPeriodChange" :disabled="curScope === 'school'">
 			<Select v-model="selectPeriod" @on-change="onPeriodChange" :disabled="curScope === 'school'">
 				<Option v-for="(item, index) in periodList" :value="item.id" :key="index">{{ item.name }}</Option>
 				<Option v-for="(item, index) in periodList" :value="item.id" :key="index">{{ item.name }}</Option>
@@ -175,6 +175,9 @@
 							} else {
 							} else {
 								this.$Message.warning(this.$t('evaluation.noData'),)
 								this.$Message.warning(this.$t('evaluation.noData'),)
 								this.uuid = Math.uuid()
 								this.uuid = Math.uuid()
+								this.schoolPointList = []
+								this.originSchoolList = []
+								this.originPointList = []
 								this.curPointResponse = {
 								this.curPointResponse = {
 									blocks: [],
 									blocks: [],
 									code: `Knowledge-${this.$store.state.userInfo.schoolCode}-${this.uuid}`,
 									code: `Knowledge-${this.$store.state.userInfo.schoolCode}-${this.uuid}`,

+ 0 - 0
TEAMModelOS/ClientApp/src/view/evaluation/index/CommonExercise.less


Nem az összes módosított fájl került megjelenítésre, mert túl sok fájl változott