浏览代码

Merge branch 'develop' into PL/develop-BI

Li 2 年之前
父节点
当前提交
b2dfccb1dd
共有 40 个文件被更改,包括 3017 次插入2320 次删除
  1. 123 3
      TEAMModelBI/Controllers/BITest/Ies5TestController.cs
  2. 5 0
      TEAMModelOS.FunctionV4/CosmosDB/TriggerExam.cs
  3. 7 0
      TEAMModelOS.FunctionV4/CosmosDB/TriggerExamLite.cs
  4. 5 0
      TEAMModelOS.FunctionV4/CosmosDB/TriggerHomework.cs
  5. 18 0
      TEAMModelOS.FunctionV4/CosmosDB/TriggerStudy.cs
  6. 5 0
      TEAMModelOS.FunctionV4/CosmosDB/TriggerSurvey.cs
  7. 4 0
      TEAMModelOS.FunctionV4/CosmosDB/TriggerVote.cs
  8. 3 0
      TEAMModelOS.SDK/Models/Cosmos/Common/ExamLite.cs
  9. 29 1
      TEAMModelOS.SDK/Models/Cosmos/Common/GroupList.cs
  10. 3 0
      TEAMModelOS.SDK/Models/Cosmos/Common/Homework.cs
  11. 2 0
      TEAMModelOS.SDK/Models/Cosmos/Common/Study.cs
  12. 2 0
      TEAMModelOS.SDK/Models/Cosmos/Common/Survey.cs
  13. 3 0
      TEAMModelOS.SDK/Models/Cosmos/Common/Vote.cs
  14. 3 0
      TEAMModelOS.SDK/Models/Cosmos/School/ExamInfo.cs
  15. 45 0
      TEAMModelOS.SDK/Models/Service/GroupListService.cs
  16. 4 3
      TEAMModelOS/ClientApp/public/lang/zh-CN.js
  17. 1 1
      TEAMModelOS/ClientApp/src/access/login.js
  18. 1 1
      TEAMModelOS/ClientApp/src/components/coursemgt/StudentList.vue
  19. 6 0
      TEAMModelOS/ClientApp/src/components/student-web/ClassRecord/RecordView.vue
  20. 7 2
      TEAMModelOS/ClientApp/src/components/student-web/HomeView/HomeView.less
  21. 1565 1557
      TEAMModelOS/ClientApp/src/router/routes.js
  22. 1 1
      TEAMModelOS/ClientApp/src/store/module/user.js
  23. 585 584
      TEAMModelOS/ClientApp/src/view/areaMgmt/AreaLayout.vue
  24. 0 145
      TEAMModelOS/ClientApp/src/view/areaSetting/AreaSetting.vue
  25. 296 0
      TEAMModelOS/ClientApp/src/view/art/AreaArtSetting.vue
  26. 272 0
      TEAMModelOS/ClientApp/src/view/art/BaseDimensionForm.vue
  27. 1 1
      TEAMModelOS/ClientApp/src/view/art/SchoolArt.vue
  28. 2 2
      TEAMModelOS/ClientApp/src/view/classmgt/ClassStudent.vue
  29. 1 1
      TEAMModelOS/ClientApp/src/view/dashboard/Art.vue
  30. 1 1
      TEAMModelOS/ClientApp/src/view/dashboard/Research.vue
  31. 1 1
      TEAMModelOS/ClientApp/src/view/dashboard/Student.vue
  32. 1 1
      TEAMModelOS/ClientApp/src/view/dashboard/StudentAll.vue
  33. 2 2
      TEAMModelOS/ClientApp/src/view/learnactivity/tabs/AnswerTable.vue
  34. 2 2
      TEAMModelOS/ClientApp/src/view/research-center/ResearchCenter.vue
  35. 2 2
      TEAMModelOS/ClientApp/src/view/research-center/ResearchCenterMock.vue
  36. 1 1
      TEAMModelOS/ClientApp/src/view/research-center/ResearchMgt.vue
  37. 1 1
      TEAMModelOS/ClientApp/src/view/schoolmgmt/RoomMgt/HiTeachLink.vue
  38. 3 3
      TEAMModelOS/ClientApp/src/view/student-account/stuMgt/StuMgt.vue
  39. 2 2
      TEAMModelOS/ClientApp/src/view/student-web/AppiView.less
  40. 2 2
      TEAMModelOS/ClientApp/src/view/uploadEvaluation/Index.vue

+ 123 - 3
TEAMModelBI/Controllers/BITest/Ies5TestController.cs

@@ -22,7 +22,7 @@ using static TEAMModelOS.SDK.Models.Teacher;
 
 namespace TEAMModelBI.Controllers.BITest
 {
-    [Route("iesapitest")]
+    [Route("ies5test")]
     [ApiController]
     public class Ies5TestController : ControllerBase
     {
@@ -78,9 +78,129 @@ namespace TEAMModelBI.Controllers.BITest
             return Ok(new { state = 200, dateHours, dateHours1, dateHours2, dateDay, dateDays, dateMonth, });
         }
 
-        public async Task<IActionResult> GetRedisToTable(JsonElement jsonElement)
+        [HttpPost("get-fmember")]
+        public async Task<IActionResult> GetFMember(JsonElement jsonElement)
         {
-            return Ok(new { state = 200 });
+            var cosmosClient = _azureCosmos.GetCosmosClient();
+
+            if (!jsonElement.TryGetProperty("id", out JsonElement id)) return BadRequest();
+            if (!jsonElement.TryGetProperty("code", out JsonElement code)) return BadRequest();
+            if (!jsonElement.TryGetProperty("actType", out JsonElement actType)) return BadRequest();
+
+            ExamInfo examInfo = new();
+            ExamLite examLite = new();
+            Survey survey = new();
+            Homework work = new();
+            Vote vote = new();
+            Study study = new();
+
+            object showAct = new();
+            List<string> classes = new();
+            List<string> stuLists = new();
+            List<string> tchLists = new();
+            List<(string pId, List<string> gid)> ps = new();
+            string school = null;
+
+            if ($"{actType}".Equals("Study"))
+            {
+                study = await cosmosClient.GetContainer("TEAMModelOS", "Common").ReadItemAsync<Study>($"{id}", new Azure.Cosmos.PartitionKey($"Study-{code}"));
+                if (study.groupLists.Count > 0)
+                {
+                    var group = study.groupLists;
+                    foreach (var gp in group)
+                    {
+                        foreach (KeyValuePair<string, List<string>> pp in gp)
+                        {
+                            ps.Add((pp.Key, pp.Value));
+                        }
+                    }
+                }
+                classes = study.classes;
+                stuLists = study.stuLists;
+                tchLists = study.tchLists;
+                school = study.school;
+            }
+            else if ($"{actType}".Equals("Vote"))
+            {
+                vote = await cosmosClient.GetContainer("TEAMModelOS", "Common").ReadItemAsync<Vote>($"{id}", new Azure.Cosmos.PartitionKey($"Vote-{code}"));
+                classes = vote.classes;
+                stuLists = vote.stuLists;
+                tchLists = vote.tchLists;
+                school = vote.school;
+            }
+            else if ($"{actType}".Equals("Homework"))
+            {
+                work = await cosmosClient.GetContainer("TEAMModelOS", "Common").ReadItemAsync<Homework>($"{id}", new Azure.Cosmos.PartitionKey($"Homework-{code}"));
+                classes = work.classes;
+                stuLists = work.stuLists;
+                tchLists = work.tchLists;
+                school = work.school;
+            }
+            else if ($"{actType}".Equals("Survey")) 
+            {
+                survey = await cosmosClient.GetContainer("TEAMModelOS", "Common").ReadItemAsync<Survey>($"{id}", new Azure.Cosmos.PartitionKey($"Survey-{code}"));
+                classes = survey.classes;
+                stuLists = survey.stuLists;
+                tchLists = survey.tchLists;
+                school = survey.school;
+            }
+            else if ($"{actType}".Equals("ExamLite")) 
+            {
+                examLite = await cosmosClient.GetContainer("TEAMModelOS", "Common").ReadItemAsync<ExamLite>($"{id}", new Azure.Cosmos.PartitionKey($"ExamLite-{code}"));
+                classes = examLite.classes;
+                stuLists = examLite.stuLists;
+                tchLists = examLite.tchLists;
+                school = examLite.school;
+            }
+            else if ($"{actType}".Equals("Exam"))
+            {
+                examInfo = await cosmosClient.GetContainer("TEAMModelOS", "Common").ReadItemAsync<ExamInfo>($"{id}", new Azure.Cosmos.PartitionKey($"Exam-{code}"));
+                classes = examInfo.classes;
+                stuLists = examInfo.stuLists;
+                school = examInfo.school;
+            }
+
+            List<FMember> idsList = await GroupListService.GetFinishMemberInfo(_coreAPIHttpService, cosmosClient, _dingDing, school, classes, stuLists, tchLists, ps);
+
+            if ($"{actType}".Equals("Study"))
+            {
+                study.staffIds = idsList;
+                study = await cosmosClient.GetContainer("TEAMModelOS", "Common").ReplaceItemAsync<Study>(study, study.id, new Azure.Cosmos.PartitionKey($"Study-{code}"));
+                showAct = study;
+            }
+            else if ($"{actType}".Equals("Vote"))
+            {
+                vote.staffIds = idsList;
+                vote = await cosmosClient.GetContainer("TEAMModelOS", "Common").ReplaceItemAsync<Vote>(vote, vote.id, new Azure.Cosmos.PartitionKey($"Vote-{code}")); 
+                showAct = vote;
+            }
+            else if ($"{actType}".Equals("Homework"))
+            {
+                work.staffIds = idsList;
+                work = await cosmosClient.GetContainer("TEAMModelOS", "Common").ReplaceItemAsync<Homework>(work, work.id, new Azure.Cosmos.PartitionKey($"Homework-{code}"));
+                showAct = work;
+            }
+            else if ($"{actType}".Equals("Survey"))
+            {
+                survey.staffIds = idsList;
+                survey = await cosmosClient.GetContainer("TEAMModelOS", "Common").ReplaceItemAsync<Survey>(survey, survey.id, new Azure.Cosmos.PartitionKey($"Survey-{code}"));
+                showAct = work;
+            }
+            else if ($"{actType}".Equals("ExamLite"))
+            {
+                examLite.staffIds = idsList;
+                examLite = await cosmosClient.GetContainer("TEAMModelOS", "Common").ReplaceItemAsync<ExamLite>(examLite, examLite.id, new Azure.Cosmos.PartitionKey($"ExamLite-{code}"));
+                showAct = work;
+            }
+            else if ($"{actType}".Equals("Exam"))
+            {
+                examInfo.staffIds = idsList;
+                examInfo = await cosmosClient.GetContainer("TEAMModelOS", "Common").ReplaceItemAsync<ExamInfo>(examInfo, examInfo.id, new Azure.Cosmos.PartitionKey($"Exam-{code}"));
+                showAct = work;
+            }
+
+
+            return Ok(new { state = 200, showAct, idsList });
         }
 
     }

+ 5 - 0
TEAMModelOS.FunctionV4/CosmosDB/TriggerExam.cs

@@ -413,6 +413,11 @@ namespace TEAMModelOS.FunctionV4
                                     info.lostStu = settlement.stus;
                                     info.stuCount = settlement.total;
                                     info.qRate = settlement.qrate;
+
+                                    //处理试卷活动结束统计账户信息
+                                    List<FMember> idList = await GroupListService.GetFinishMemberInfo(_coreAPIHttpService, client, _dingDing, info.school, info.classes, info.stuLists, null);
+                                    info.staffIds = idList;
+
                                     await client.GetContainer(Constant.TEAMModelOS, "Common").ReplaceItemAsync<ExamInfo>(info, info.id, new Azure.Cosmos.PartitionKey(info.code));
                                 }
                             }

+ 7 - 0
TEAMModelOS.FunctionV4/CosmosDB/TriggerExamLite.cs

@@ -181,6 +181,13 @@ namespace TEAMModelOS.FunctionV4
                             }
                             break;
                         case "finish":
+
+                            //处理试卷练习活动结束统计账户信息
+                            List<FMember> idList = await GroupListService.GetFinishMemberInfo(_coreAPIHttpService, client, _dingDing, lite.school, lite.classes, lite.stuLists, lite.tchLists);
+                            lite.staffIds = idList;
+
+                            await client.GetContainer("TEAMModelOS", "Common").ReplaceItemAsync<ExamLite>(lite, lite.id, new Azure.Cosmos.PartitionKey(lite.code));
+
                             break;
                     }
 

+ 5 - 0
TEAMModelOS.FunctionV4/CosmosDB/TriggerHomework.cs

@@ -135,6 +135,11 @@ namespace TEAMModelOS.FunctionV4
                             break;
                         case "finish":
                             await Activity(_coreAPIHttpService, _serviceBus, _dingDing, client, _configuration, work);
+                            //处理家庭作业活动结束统计账户信息
+                            List<FMember> idsList = await GroupListService.GetFinishMemberInfo(_coreAPIHttpService, client, _dingDing, work.school, work.classes, work.stuLists, work.stuLists);
+                            work.staffIds = idsList;
+
+                            await client.GetContainer("TEAMModelOS", "Common").ReplaceItemAsync<Homework>(work, work.id, new Azure.Cosmos.PartitionKey(work.code));
                             break;
                     }
 

+ 18 - 0
TEAMModelOS.FunctionV4/CosmosDB/TriggerStudy.cs

@@ -193,6 +193,24 @@ namespace TEAMModelOS.FunctionV4
                            
                             break;
                         case "finish":
+
+                            List<(string pId, List<string> gid)> gls = new List<(string pId, List<string> gid)>();
+                            if (study.groupLists.Count > 0)
+                            {
+                                var group = study.groupLists;
+                                foreach (var gp in group)
+                                {
+                                    foreach (KeyValuePair<string, List<string>> pp in gp)
+                                    {
+                                        gls.Add((pp.Key, pp.Value));
+                                    }
+                                }
+                            }
+                            //处理教研活动结束统计账户信息
+                            List<FMember> idList = await GroupListService.GetFinishMemberInfo(_coreAPIHttpService, client, _dingDing, study.school, study.classes, study.stuLists, study.stuLists, gls);
+                            study.staffIds = idList;
+                            await client.GetContainer("TEAMModelOS", "Common").ReplaceItemAsync<Study>(study, study.id, new Azure.Cosmos.PartitionKey(study.code));
+
                             break;
                     }
                 }

+ 5 - 0
TEAMModelOS.FunctionV4/CosmosDB/TriggerSurvey.cs

@@ -407,6 +407,11 @@ namespace TEAMModelOS.FunctionV4
                             var cods = new { records = recs, userids, question = questionRecords, urecord = surveyRecords };
                             //问卷整体情况
                             await _azureStorage.GetBlobContainerClient(blobcntr).UploadFileByContainer(cods.ToJsonString(), "survey", $"{survey.id}/record.json");
+
+                            //处理问卷调查活动结束统计账户信息
+                            List<FMember> idsList = await GroupListService.GetFinishMemberInfo(_coreAPIHttpService, client, _dingDing, survey.school, survey.classes, survey.stuLists, survey.tchLists);
+                            survey.staffIds = idsList;
+
                             if (string.IsNullOrEmpty(survey.recordUrl))
                             {
                                 survey.recordUrl = $"/survey/{survey.id}/record.json";

+ 4 - 0
TEAMModelOS.FunctionV4/CosmosDB/TriggerVote.cs

@@ -352,6 +352,10 @@ namespace TEAMModelOS.FunctionV4
                             tasks.Add(_azureStorage.GetBlobContainerClient(blobcntr).UploadFileByContainer(new { options = countcds, records = recordsBlob }.ToJsonString(), "vote", $"{vote.id}/record.json"));
                             //处理投票者的记录
 
+                            //处理投票活动结束统计账户信息
+                            List<FMember> idsList = await GroupListService.GetFinishMemberInfo(_coreAPIHttpService, client, _dingDing, vote.school, vote.classes, vote.stuLists, vote.tchLists);
+                            vote.staffIds = idsList;
+
                             if (string.IsNullOrEmpty(vote.recordUrl))
                             {
                                 vote.recordUrl = url;

+ 3 - 0
TEAMModelOS.SDK/Models/Cosmos/Common/ExamLite.cs

@@ -79,6 +79,9 @@ namespace TEAMModelOS.SDK.Models
         public string progress { get; set; }
         //发布层级 0校级,1区级
         public int? publish { get; set; } = 0;
+
+        //结束后账户统计
+        public List<FMember> staffIds { get; set; } = new List<FMember>();
     }
     public class Record
     {

+ 29 - 1
TEAMModelOS.SDK/Models/Cosmos/Common/GroupList.cs

@@ -128,7 +128,35 @@ namespace TEAMModelOS.SDK.Models
         //0在校,1毕业 
         public int graduate { get; set; } = 0;
     }
-    
+
+    /// <summary>
+    /// 活动结束后的结算接结构
+    /// </summary>
+    public class FMember 
+    {
+        /// <summary>
+        /// 账号id
+        /// </summary>
+        public string id { get; set; }
+        /// <summary>
+        /// 所在学校的学校id
+        /// </summary>
+        public string code { get; set; }
+        /// <summary>
+        /// 账户类型
+        /// </summary>
+        public int type { get; set; }
+        /// <summary>
+        /// 分组id
+        /// </summary>
+        public string groupId { get; set; }
+        /// <summary>
+        /// 分组名称
+        /// </summary>
+        public string groupName { get; set; }
+    }
+
+
     public class RMember
     {
         /// <summary>

+ 3 - 0
TEAMModelOS.SDK/Models/Cosmos/Common/Homework.cs

@@ -117,6 +117,9 @@ namespace TEAMModelOS.SDK.Models
         public int? publish { get; set; } = 0;
 
         public bool mustSubmit { get; set; } = false;
+
+        //结束后账户统计
+        public List<FMember> staffIds { get; set; } = new List<FMember>();
     }
 
     public class Submits

+ 2 - 0
TEAMModelOS.SDK/Models/Cosmos/Common/Study.cs

@@ -70,6 +70,8 @@ namespace TEAMModelOS.SDK.Models
         public string examId { get; set; }
         //发布层级 0校级,1区级
         public int? publish { get; set; } = 0;
+        //结束后账户统计
+        public List<FMember> staffIds { get; set; } = new List<FMember>();
     }
     /*public class Setting
     {

+ 2 - 0
TEAMModelOS.SDK/Models/Cosmos/Common/Survey.cs

@@ -115,6 +115,8 @@ namespace TEAMModelOS.SDK.Models
         public string pId { get; set; }
         //发布层级 0校级,1区级
         public int? publish { get; set; } = 0;
+        //结束后账户统计
+        public List<FMember> staffIds { get; set; } = new List<FMember>();
     }
 
     /// <summary>

+ 3 - 0
TEAMModelOS.SDK/Models/Cosmos/Common/Vote.cs

@@ -127,6 +127,9 @@ namespace TEAMModelOS.SDK.Models
         public string areaId { get; set; }
         public string pId { get; set; }
         public int? publish { get; set; } = 0;
+
+        //结束后账户统计
+        public List<FMember> staffIds { get; set; } = new List<FMember>();
     }
     /// <summary>
     /// 投票选项

+ 3 - 0
TEAMModelOS.SDK/Models/Cosmos/School/ExamInfo.cs

@@ -123,6 +123,9 @@ namespace TEAMModelOS.SDK.Models
         public int sStatus { get; set; } = 0;
         //容器名称 container name
         //public string cn { get; set; }
+
+        //结束后账户统计
+        public List<FMember> staffIds { get; set; } = new List<FMember>();
     }
     public class Custom {
         public string id { get; set; }

+ 45 - 0
TEAMModelOS.SDK/Models/Service/GroupListService.cs

@@ -1299,6 +1299,51 @@ namespace TEAMModelOS.SDK
             }
             return (null, null);
         }
+
+
+        /// <summary>
+        /// 处理活动结束的
+        /// </summary>
+        /// <param name="_coreAPIHttpService"></param>
+        /// <param name="cosmosClient">数据库</param>
+        /// <param name="_dingDing">钉钉消息</param>
+        /// <param name="school">学校编码</param>
+        /// <param name="classes">行政班</param>
+        /// <param name="stuLists">学生</param>
+        /// <param name="tchLists">教师</param>
+        /// <param name="_groupLists">分组</param>
+        /// <param name="graduate">毕业类型0在校,1毕业 , -1查全部。</param>
+        /// <returns></returns>
+        public static async Task<List<FMember>> GetFinishMemberInfo(CoreAPIHttpService _coreAPIHttpService, CosmosClient cosmosClient, DingDing _dingDing, string school, List<string> classes, List<string> stuLists, List<string> tchLists, List<(string, List<string>)> _groupLists = null, int graduate = -1)
+        {
+            List<FMember> fMembers = new();
+
+            if (classes != null && classes.Count > 0)
+            {
+                (List<RMember> staffList, List<RGroupList> classInfos) = await GetMemberByListids(_coreAPIHttpService, cosmosClient, _dingDing, classes, school);
+                staffList.ForEach(x => fMembers.Add(new FMember() { id = x.id, code = school, type = 1, }));
+            }
+
+            if (stuLists != null && stuLists.Count > 0)
+            {
+                (List<RMember> staffList, List<RGroupList> classInfos) = await GetMemberByListids(_coreAPIHttpService, cosmosClient, _dingDing, stuLists, school);
+                staffList.ForEach(x => fMembers.Add(new FMember() { id = x.id, code = school, type = 2 }));
+            }
+
+            if (tchLists != null && tchLists.Count > 0)
+            {
+                (List<RMember> staffList, List<RGroupList> classInfos) = await GetMemberByListids(_coreAPIHttpService, cosmosClient, _dingDing, tchLists, school);
+                staffList.ForEach(x => fMembers.Add(new FMember() { id = x.id, code = school, type = 2 }));
+            }
+
+            if (_groupLists != null && _groupLists.Count > 0) 
+            {
+                (List<RMember> staffList, List<RGroupList> groupLists1) = await GetMemberByListids(_coreAPIHttpService, cosmosClient, _dingDing, classes, school, _groupLists);
+                staffList.ForEach(x => fMembers.Add(new FMember() { id = x.id, code = school, type = 2 }));
+            }
+
+            return fMembers;        
+        }
     }
 
 

+ 4 - 3
TEAMModelOS/ClientApp/public/lang/zh-CN.js

@@ -430,8 +430,8 @@ const LANG_ZH_CN = {
             study: '学业',
             studyAll: '学生学业质量监测',
             studyMenu: '学情分析',
-            art1:'艺术看板',
-            art2:'艺术设置'
+            art1: '艺术看板',
+            art2: '艺术设置'
         }
     },
     // 授权相关
@@ -3137,7 +3137,8 @@ const LANG_ZH_CN = {
             dingding: '钉钉',
         },
         apiError: {
-            text1: '您的账号或密码不正确'
+            text1: '您的账号或密码不正确',
+            text2: '你已毕业,暂不能登录!',
         },
         sse: {
             error: {

+ 1 - 1
TEAMModelOS/ClientApp/src/access/login.js

@@ -106,7 +106,7 @@ export default {
 			try {
 				let studentInfo = withToken ? await $api.login.getStuInfoByToken(params) : await $api.login.getStudentInfoByAccount(params)
 				if (studentInfo.error) {
-					app.$Message.warning(studentInfo.error === 1 ? app.$t('login.apiError.text1') : app.$t('login.infoErr'))
+					app.$Message.warning(studentInfo.error === 1 ? app.$t('login.apiError.text1') : studentInfo.error === 3 ? app.$t('login.apiError.text2') : app.$t('login.infoErr'))
 					j(studentInfo)
 					return
 				}

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

@@ -142,7 +142,7 @@ export default {
         },
         /**基础查询数据 */
         baseFindStudent(params) {
-            if (!this.$store.state.user.schoolCode) return
+            if (!this.$store.state.userInfo.schoolCode) return
             this.tableLoading = true
             this.$store.dispatch('student/getStudentList').then(
                 res => {

+ 6 - 0
TEAMModelOS/ClientApp/src/components/student-web/ClassRecord/RecordView.vue

@@ -452,6 +452,11 @@ export default {
             this.pageList = []
             this.showPageList = []
             this.markers = []
+            this.pushData = []
+            this.irsData = []
+            this.taskData = []
+            this.baseData = undefined
+            this.filtertype = {push: 0, task: 0, irs: 0, exam: 0}
             let sas = await this.$tools.getBlobSas(this.recordInfo.scope === 'school' ? this.recordInfo.school : this.recordInfo.tmdid)
             this.recordInfo.eNote = `${sas.url}/${sas.name}/records/${this.recordInfo.id}/Note.pdf?${sas.sas}`
             // 如果只会存在一个视频,文件名是否可以固定?
@@ -493,6 +498,7 @@ export default {
             
             // 数据异常
             if (dataErr) {
+                this.isLoad = false
                 this.$Message.error(this.$t('cusMgt.rcd.dataErr'))
                 return
             }

+ 7 - 2
TEAMModelOS/ClientApp/src/components/student-web/HomeView/HomeView.less

@@ -71,11 +71,11 @@
             display: inline-block;
             width: 18%;
             border-radius: 10px;
-            border: 1px solid #e7f2ea;
+            border: 1px solid #f4f7f4;
             padding: 10px;
             margin: 5px 15px 10px;
             cursor: pointer;
-            background-color: #e7f2ea;
+            background-color: #f4f7f4;
 
             .class-name {
                 // color: #02B35A;
@@ -126,6 +126,11 @@
                     // border-radius: 0 5px 5px 0;
                 }
             }
+
+            &:hover {
+                background: linear-gradient(-270deg, #fafafa, #d4ede1);
+                color: #03966a;
+            }
         }
     }
 

文件差异内容过多而无法显示
+ 1565 - 1557
TEAMModelOS/ClientApp/src/router/routes.js


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

@@ -209,7 +209,7 @@ export default {
             state.userProfile.lessonLimit = data.lessonLimit
         },
         setSchoolProfile(state, data) {
-            state.schoolCode = data.school_base.schoolCode
+            state.schoolCode = data.school_base.id
             state.schoolProfile.blob_sas = data.blob_sas // 老師在學校的Blob金鑰,讀寫
             state.schoolProfile.blob_uri = data.blob_uri // 老師在學校的Blob網址
             state.schoolProfile.school_courses = data.school_courses // 学校排课

文件差异内容过多而无法显示
+ 585 - 584
TEAMModelOS/ClientApp/src/view/areaMgmt/AreaLayout.vue


+ 0 - 145
TEAMModelOS/ClientApp/src/view/areaSetting/AreaSetting.vue

@@ -1,8 +1,5 @@
 <template>
   <div class="areaMgmt-container areaSetting-container">
-    <!-- <div class="header">
-            <span class="title">区级基础设置</span>
-        </div> -->
     <div class="content area-setting-box">
       <div class="setting-block">
         <p class="title">研修合格学时设置
@@ -103,38 +100,6 @@
           <Tag size="large" style="cursor: pointer;" @click.native="addDimensionModal = true">+ 添加</Tag>
         </div>
       </div>
-      <div class="setting-block">
-        <p class="title">艺术测评指标设置</p>
-        <span class="btn-add-dimension" @click="onAddArtDimension">+ 新增指标</span>
-        <div class="content art-setting-wrap">
-          <Collapse simple v-if="artDimensions.length">
-            <Panel v-for="(dimension,index) in artDimensions" color="primary" :name="index+1+''">
-              <span style="display:inline-flex;align-items: center">
-                <span style="margin-right:10px">{{ dimension.dimension }}</span>
-                <Tag color="purple">{{ dimension.type.join(',') }}</Tag>
-                <Tag color="blue">{{ dimension.subject }}</Tag>
-                <span class="tools">
-                  <Icon type="md-create" title="编辑" @click.stop="onEditDimension(dimension,index)" />
-                  <Icon type="md-trash" title="删除" />
-                </span>
-              </span>
-              <template #content>
-                <p class="part-title">知识块</p>
-                <div class="dimension-blocks">
-                  <Tag class="dimension-item" size="medium" v-for="(item,index) in dimension.blocks" color="geekblue">{{ item }}</Tag>
-                </div>
-                <p class="part-title">指标描述</p>
-                <div v-for="(desc,descIndex) in dimension.descs" style="padding:5px 0;margin-left: 10px;">
-                  <span class="desc-grade">【{{ desc.grades.join(',') }} 年级】</span>
-                  <div>
-                    <p v-for="(item,index) in desc.contents" class="desc-item">{{ item }}</p>
-                  </div>
-                </div>
-              </template>
-            </Panel>
-          </Collapse>
-        </div>
-      </div>
       <div class="setting-block">
         <p class="title">接口配置</p>
         <div class="content">
@@ -153,18 +118,11 @@
         <Button type="primary" @click="onAddDimension">确定</Button>
       </div>
     </Modal>
-    <Modal v-model="addArtDimensionModal" :title="isEditDimensional ? '编辑艺术维度' : '添加艺术维度'" footer-hide width="700px">
-      <BaseDimensionForm :dimension="dimensionInfo" v-if="addArtDimensionModal" @onFinish="onDimensionEditFinish"></BaseDimensionForm>
-    </Modal>
   </div>
 </template>
 
 <script>
-import BaseDimensionForm from "./BaseDimensionForm"
 export default {
-  components: {
-    BaseDimensionForm
-  },
   data() {
     return {
       addArtDimensionModal: false,
@@ -200,49 +158,8 @@ export default {
   },
   created() {
     this.getAreaSetting()
-    let artSettings = require('@/static/artDimension.json')
-    console.error(artSettings);
-    this.artDimensions = artSettings.dimensions
-    this.artDimensions.forEach(i => i.type = i.type.map(j => this.$GLOBAL.ART_PERIOD_TYPES[j]))
-
-    this.$api.areaArt.findArtSetting({
-      areaId: sessionStorage.getItem('areaId')
-    }).then(res => {
-      if (res.setting) {
-        console.log(res)
-      } else {
-        // this.$Message.warning('未查询到设置信息!')
-      }
-    })
   },
   methods: {
-    onEditDimension(info, index) {
-      this.dimensionIndex = index
-      this.dimensionInfo = info
-      this.addArtDimensionModal = true
-      this.isEditDimensional = true
-    },
-    onAddArtDimension() {
-      this.dimensionInfo = {
-        dimension: '',
-        subject: '',
-        subjectId: '',
-        type: [],
-        blocks: [],
-        descs: []
-      }
-      this.addArtDimensionModal = true
-      this.isEditDimensional = false
-    },
-    onDimensionEditFinish(dimensionInfo) {
-      if (this.isEditDimensional) {
-        this.artDimensions[this.dimensionIndex] = dimensionInfo
-      } else {
-        this.artDimensions.push(dimensionInfo)
-      }
-      this.addArtDimensionModal = false
-      this.$Message.success('操作成功')
-    },
     /* 获取当前区级设置数据 */
     getAreaSetting() {
       this.$api.ability.getAreaSetting({
@@ -338,68 +255,6 @@ export default {
       cursor: pointer;
     }
 
-    .art-setting-wrap {
-      .tools {
-        .ivu-icon {
-          margin-left: 10px;
-          color: rgb(160, 158, 158);
-        }
-      }
-    }
-
-    .ivu-collapse {
-      border: none;
-    }
-    .ivu-collapse-header {
-      height: 60px;
-      line-height: 60px;
-      font-size: 16px;
-      font-weight: bold;
-    }
-
-    .ivu-collapse-content {
-      padding: 0 45px;
-    }
-
-    .desc-item {
-      padding: 10px 0;
-      &::before {
-        content: "";
-        display: inline-block;
-        border: 4px solid #4685c4;
-        border-radius: 50%;
-        margin-right: 10px;
-        margin-bottom: 2px;
-      }
-    }
-
-    .desc-grade {
-      font-weight: bold;
-      color: #5ca2ff;
-    }
-
-    .part-title {
-      font-weight: bold;
-      font-size: 14px;
-      padding: 10px 0;
-
-      &::before {
-        content: "";
-        display: inline-block;
-        width: 6px;
-        border: 2px solid #0fa4c1;
-        margin-right: 10px;
-        margin-bottom: 5px;
-      }
-    }
-
-    .dimension-blocks {
-      margin-left: 10px;
-      .ivu-icon-ios-close {
-        color: #242424 !important;
-      }
-    }
-
     .title {
       font-weight: bold;
       margin-top: 20px;

+ 296 - 0
TEAMModelOS/ClientApp/src/view/art/AreaArtSetting.vue

@@ -0,0 +1,296 @@
+<template>
+  <div class="artSetting-container">
+    <div class="content area-setting-box">
+      <div class="setting-block">
+        <p class="title">艺术测评指标设置</p>
+        <span class="btn-add-dimension" @click="onAddArtDimension">+ 新增指标</span>
+        <div class="content art-setting-wrap">
+          <Collapse simple v-if="artDimensions.length">
+            <Panel v-for="(dimension,index) in artDimensions" color="primary" :name="index+1+''">
+              <span style="display:inline-flex;align-items: center">
+                <span style="margin-right:10px">{{ dimension.dimension }}</span>
+                <Tag color="purple">{{ getTypeName(dimension.type).join(',') }}</Tag>
+                <Tag color="blue">{{ dimension.subject }}</Tag>
+                <span class="tools">
+                  <Icon type="md-create" title="编辑" @click.stop="onEditDimension(dimension,index)" />
+                  <Icon type="md-trash" title="删除" @click.stop="onDeleteDimension(dimension,index)" />
+                </span>
+              </span>
+              <template #content>
+                <p class="part-title">知识块</p>
+                <div class="dimension-blocks">
+                  <Tag class="dimension-item" size="medium" v-for="(item,index) in dimension.blocks" color="geekblue">{{ item }}</Tag>
+                </div>
+                <p class="part-title">指标描述</p>
+                <div v-for="(desc,descIndex) in dimension.descs" style="padding:5px 0;margin-left: 10px;">
+                  <span class="desc-grade">【{{ desc.grades.join(',') }} 年级】</span>
+                  <div>
+                    <p v-for="(item,index) in desc.contents" class="desc-item">{{ item }}</p>
+                  </div>
+                </div>
+              </template>
+            </Panel>
+          </Collapse>
+        </div>
+      </div>
+    </div>
+    <Modal v-model="addArtDimensionModal" :title="isEditDimensional ? '编辑艺术维度' : '添加艺术维度'" footer-hide width="700px">
+      <BaseDimensionForm :dimension="dimensionInfo" v-if="addArtDimensionModal" @onFinish="onDimensionEditFinish"></BaseDimensionForm>
+    </Modal>
+  </div>
+</template>
+
+<script>
+import BaseDimensionForm from "./BaseDimensionForm"
+export default {
+  components: {
+    BaseDimensionForm
+  },
+  data() {
+    return {
+      addArtDimensionModal: false,
+      openCustom: false,
+      isEditDimensional: false,
+      dimensionIndex: 0,
+      newDimensionName: '',
+      addDimensionModal: false,
+      btnLoading: false,
+      artDimensions: [],
+      dimensionInfo: null
+    }
+  },
+  created() {
+    this.getAreaSetting()
+
+  },
+  methods: {
+    /* 获取当前区级设置数据 */
+    getAreaSetting() {
+      this.$api.areaArt.findArtSetting({
+        areaId: sessionStorage.getItem('areaId')
+      }).then(res => {
+        if (res.setting) {
+          console.log(res)
+          this.artDimensions = res.setting.dimensions
+          //   this.artDimensions.forEach(i => {
+          //     console.log(i.type)
+          //     i.type = i.type.map(j => this.$GLOBAL.ART_PERIOD_TYPES[j])
+          //   })
+        } else {
+          this.artDimensions = []
+        }
+      })
+    },
+    /* 删除指标 */
+    onDeleteDimension(info, index) {
+      this.$Modal.confirm({
+        title: `删除指标`,
+        content: `确认删除指标 ${info.dimension} 吗?`,
+        onOk: () => {
+          this.artDimensions.splice(index, 1)
+          this.$api.areaArt.upsertArtSetting({
+            "opt": "UpsertDimensions",
+            "areaId": sessionStorage.getItem('areaId'),
+            "dimensions": this.artDimensions
+          }).then(res => {
+            if (!res.error) {
+              this.addArtDimensionModal = false
+              this.$Message.success('操作成功')
+            } else {
+              this.$Message.error('操作失败')
+            }
+          })
+        }
+      });
+
+    },
+    /* 编辑指标 */
+    onEditDimension(info, index) {
+      this.dimensionIndex = index
+      this.dimensionInfo = this._.cloneDeep(info)
+      this.addArtDimensionModal = true
+      this.isEditDimensional = true
+    },
+    /* 新增指标 */
+    onAddArtDimension() {
+      this.dimensionInfo = {
+        dimension: '',
+        subject: '',
+        subjectBind: '',
+        type: [],
+        blocks: [],
+        descs: []
+      }
+      this.addArtDimensionModal = true
+      this.isEditDimensional = false
+    },
+    /* 指标编辑结束回调 */
+    onDimensionEditFinish(dimensionInfo) {
+      if (this.isEditDimensional) {
+        this.artDimensions[this.dimensionIndex] = dimensionInfo
+      } else {
+        this.artDimensions.push(dimensionInfo)
+      }
+      // 指标更新后进行更新保存
+      this.$api.areaArt.upsertArtSetting({
+        "opt": "UpsertDimensions",
+        "areaId": sessionStorage.getItem('areaId'),
+        "dimensions": this.artDimensions
+      }).then(res => {
+        if (!res.error) {
+          this.addArtDimensionModal = false
+          this.$Message.success('操作成功')
+        } else {
+          this.$Message.error('操作失败')
+        }
+      })
+    },
+  },
+  computed: {
+    getTypeName() {
+      return arr => {
+        return arr.map(i => this.$GLOBAL.ART_PERIOD_TYPES[i])
+      }
+    }
+  }
+}
+</script>
+
+<style lang="less">
+.artSetting-container {
+  overflow: hidden;
+  min-height: 100vh;
+  background-color: #f4f4f4;
+
+  .ivu-btn {
+    margin: 20px;
+  }
+}
+
+.area-setting-box {
+  display: flex;
+  flex-direction: column;
+
+  .setting-block {
+    position: relative;
+    padding: 10px 20px;
+    margin: 10px 20px;
+    font-size: 18px;
+    background-color: #fff;
+
+    .btn-add-dimension {
+      position: absolute;
+      right: 30px;
+      top: 30px;
+      font-size: 14px;
+      font-weight: bold;
+      color: #0fa4c1;
+      cursor: pointer;
+    }
+
+    .art-setting-wrap {
+      .tools {
+        .ivu-icon {
+          margin-left: 10px;
+          color: rgb(160, 158, 158);
+        }
+      }
+    }
+
+    .ivu-collapse {
+      border: none;
+    }
+    .ivu-collapse-header {
+      height: 60px;
+      line-height: 60px;
+      font-size: 16px;
+      font-weight: bold;
+    }
+
+    .ivu-collapse-content {
+      padding: 0 45px;
+    }
+
+    .desc-item {
+      padding: 10px 0;
+      &::before {
+        content: "";
+        display: inline-block;
+        border: 4px solid #4685c4;
+        border-radius: 50%;
+        margin-right: 10px;
+        margin-bottom: 2px;
+      }
+    }
+
+    .desc-grade {
+      font-weight: bold;
+      color: #5ca2ff;
+    }
+
+    .part-title {
+      font-weight: bold;
+      font-size: 14px;
+      padding: 10px 0;
+
+      &::before {
+        content: "";
+        display: inline-block;
+        width: 6px;
+        border: 2px solid #0fa4c1;
+        margin-right: 10px;
+        margin-bottom: 5px;
+      }
+    }
+
+    .dimension-blocks {
+      margin-left: 10px;
+      .ivu-icon-ios-close {
+        color: #242424 !important;
+      }
+    }
+
+    .title {
+      font-weight: bold;
+      margin-top: 20px;
+
+      &::before {
+        content: "";
+        display: inline-block;
+        border: 4px solid #0fa4c1;
+        border-radius: 50%;
+        margin-right: 10px;
+        margin-bottom: 2px;
+      }
+    }
+
+    .dimension-list {
+      display: flex;
+      flex-direction: row !important;
+      flex-wrap: wrap;
+
+      .dimension-item {
+        display: inline-block;
+      }
+    }
+
+    .content {
+      display: flex;
+      flex-direction: column;
+      font-size: 14px;
+      margin: 18px;
+
+      .setting-item {
+        display: flex;
+        align-items: center;
+        margin: 15px 0;
+
+        .ivu-input-number,
+        .ivu-select {
+          margin: 0 10px;
+        }
+      }
+    }
+  }
+}
+</style>

+ 272 - 0
TEAMModelOS/ClientApp/src/view/art/BaseDimensionForm.vue

@@ -0,0 +1,272 @@
+<template>
+  <div class="dimension-form-container">
+    <Form ref="dimensionForm" :model="dimensionInfo" :rules="ruleValidate" :label-width="80">
+      <FormItem label="维度名称" prop="dimension">
+        <Input v-model="dimensionInfo.dimension" placeholder="请输入维度名称"></Input>
+      </FormItem>
+      <FormItem label="关联科目" prop="subjectBind">
+        <RadioGroup v-model="dimensionInfo.subjectBind">
+          <Radio label="subject_music">音乐</Radio>
+          <Radio label="subject_painting">美术</Radio>
+        </RadioGroup>
+      </FormItem>
+      <FormItem label="关联学段" prop="type">
+        <CheckboxGroup v-model="dimensionInfo.type">
+          <Checkbox v-for="(item,index) in periodKeyList" :key="index" :label="item">{{ $GLOBAL.ART_PERIOD_TYPES[item] }}</Checkbox>
+        </CheckboxGroup>
+      </FormItem>
+      <FormItem label="知识块" prop="blocks">
+        <div class="blocks-wrap">
+          <Tag size="medium" class="block-item" v-for="(block,blockIndex) in dimensionInfo.blocks" :key="blockIndex" closable @on-close="onDeleteBlock(block,blockIndex)" color="geekblue">{{ block }}</Tag>
+          <Tag size="medium" style="cursor: pointer;" @click.native="addBlockModal = true; newBlockName = ''">+ 添加知识块</Tag>
+        </div>
+      </FormItem>
+      <FormItem label="描述信息" prop="desc">
+        <div class="desc-wrap">
+          <Tag size="medium" style="cursor: pointer;" @click.native="onAddDesc">+ 添加描述</Tag>
+          <span class="desc-item" v-for="(desc,descIndex) in dimensionInfo.descs" :key="descIndex" v-if="desc.contents.length" style="margin-left: -6px;margin-top: 10px;">
+            <p class="grade-title">【适用 {{ desc.grades.join(",") }} 年级】</p>
+            <p class="desc-single-item" v-for="(item,index) in desc.contents">
+              {{ item }}
+              <span class="tools">
+                <Icon type="md-create" title="编辑" @click.stop="onDescClick(item,index,desc,descIndex)" />
+                <Icon type="md-trash" title="删除" @click.stop="onDeleteContent(index,desc,descIndex)" />
+              </span>
+            </p>
+          </span>
+        </div>
+      </FormItem>
+      <FormItem>
+        <Button type="primary" @click="handleSubmit('dimensionForm')">保存</Button>
+      </FormItem>
+    </Form>
+    <Modal v-model="addBlockModal" title="添加知识块">
+      <Input v-model="newBlockName" placeholder="输入新知识块名称..." />
+      <div slot="footer">
+        <Button type="text" @click="addBlockModal = false">取消</Button>
+        <Button type="primary" @click="onAddBlock">确定</Button>
+      </div>
+    </Modal>
+    <Modal v-model="descModal" :title="isEditDesc ? '编辑描述' : '新增描述'">
+      <p style="margin:10px 0">描述内容</p>
+      <Input v-model="newDescContent" placeholder="输入新的描述内容..." />
+      <p style="margin:10px 0">适用年级</p>
+      <Select v-model="newDescGrades" multiple>
+        <Option v-for="item in gradeList" :value="item" :key="item">{{ item }} 年级</Option>
+      </Select>
+      <div slot="footer">
+        <Button type="text" @click="descModal = false">取消</Button>
+        <Button type="primary" @click="onConfirmAddDesc">确定</Button>
+      </div>
+    </Modal>
+  </div>
+</template>
+<script>
+export default {
+  props: {
+    dimension: {
+      type: Object,
+      default: () => { }
+    }
+  },
+  data() {
+    return {
+      isEditDesc: false,
+      addBlockModal: false,
+      descModal: false,
+      newBlockName: '',
+      newDescGrades: [],
+      newDescContent: '',
+      newContentIndex: 0,
+      currentDescIndex: 0,
+      currentDesc: null,
+      periodKeyList: [],
+      periodValueList: [],
+      gradeList: [1, 2, 3, 4, 5, 6, 7, 8, 9],
+      dimensionInfo: {
+        dimension: '',
+        subject: '',
+        subjectBind: '',
+        type: [],
+        blocks: [],
+        desc: []
+      },
+      ruleValidate: {
+        dimension: [
+          { required: true, message: '维度名称不能为空', trigger: 'blur' }
+        ],
+        subjectBind: [
+          { required: true, message: '请选择关联科目', trigger: 'change' }
+        ],
+        type: [
+          { required: true, type: 'array', min: 1, message: '至少选择一个关联学段', trigger: 'change' },
+        ]
+      }
+    }
+  },
+  created() {
+    this.periodKeyList = Object.keys(this.$GLOBAL.ART_PERIOD_TYPES)
+    this.periodValueList = Object.values(this.$GLOBAL.ART_PERIOD_TYPES)
+  },
+  methods: {
+    /* 点击新增描述按钮 */
+    onAddDesc() {
+      this.newDescContent = ''
+      this.newDescGrades = []
+      this.descModal = true
+      this.isEditDesc = false
+    },
+    /* 点击描述进行编辑 */
+    onDescClick(content, contentIndex, desc, descIndex) {
+      this.newDescContent = content
+      this.newContentIndex = contentIndex
+      this.newDescGrades = this._.cloneDeep(desc.grades)
+      this.currentDesc = this._.cloneDeep(desc)
+      this.currentDescIndex = descIndex
+      this.descModal = true
+      this.isEditDesc = true
+    },
+    /* 删除描述 */
+    onDeleteContent(contentIndex, desc, descIndex) {
+      this.$Modal.confirm({
+        title: `删除描述`,
+        content: `确认删除该描述吗?`,
+        onOk: () => {
+          desc.contents.splice(contentIndex, 1)
+          this.currentDesc = this._.cloneDeep(desc)
+          this.currentDescIndex = descIndex
+          if (this.currentDesc.contents.length === 0) {
+            this.dimensionInfo.descs.splice(this.currentDescIndex, 1)
+          }
+        }
+      });
+
+    },
+    /* 确认保存描述 */
+    onConfirmAddDesc() {
+      if (!this.newDescContent || this.newDescGrades.length === 0) {
+        this.$Message.warning('内容或关联年级不能为空!')
+        return
+      }
+      // 判断两个数组是否相等
+      let scalarArrayEquals = function (array1, array2) {
+        return array1.length == array2.length && array1.every(function (v, i) { return v === array2[i] });
+      }
+      //  新增描述操作
+      let addNewFn = () => {
+        let hasSameGradeIndex = this.dimensionInfo.descs.findIndex(i => scalarArrayEquals(i.grades, this.newDescGrades))
+        if (hasSameGradeIndex > -1) {
+          this.dimensionInfo.descs[hasSameGradeIndex].contents.push(this.newDescContent)
+        } else {
+          this.dimensionInfo.descs.push({
+            grades: this.newDescGrades,
+            contents: [this.newDescContent]
+          })
+        }
+      }
+      this.newDescGrades = this.newDescGrades.sort()
+      // 如果是编辑描述
+      if (this.isEditDesc) {
+        let isModifyGrade = !scalarArrayEquals(this.currentDesc.grades, this.newDescGrades)
+        // 如果修改了适用年级
+        if (isModifyGrade) {
+          this.currentDesc.contents.splice(this.newContentIndex, 1)
+          if (this.currentDesc.contents.length === 0) {
+            this.dimensionInfo.descs.splice(this.currentDescIndex, 1)
+          }
+          addNewFn()
+        } else {
+          this.currentDesc.contents[this.newContentIndex] = this.newDescContent
+          this.dimensionInfo.descs[this.currentDescIndex] = this.currentDesc
+        }
+      } else {
+        // 如果是新增描述
+        addNewFn()
+      }
+      this.descModal = false
+      this.$Message.success('操作成功')
+    },
+    /* 添加知识块 */
+    onAddBlock() {
+      let isEmpty = !Boolean(this.newBlockName.trim())
+      let isExist = this.dimensionInfo.blocks.includes(this.newBlockName)
+      if (isEmpty) {
+        this.$Message.warning('知识块名称不能为空!')
+      } else if (isExist) {
+        this.$Message.warning('该知识块已存在,请重新输入!')
+      } else {
+        this.dimensionInfo.blocks.push(this.newBlockName)
+        this.addBlockModal = false
+        this.newBlockName = ''
+      }
+    },
+    /* 删除知识块 */
+    onDeleteBlock(block, blockIndex) {
+      this.dimensionInfo.blocks.splice(blockIndex, 1)
+    },
+    /* 提交表单 */
+    handleSubmit(name) {
+      this.$refs[name].validate((valid) => {
+        if (valid) {
+          console.error(this.dimensionInfo)
+          this.dimensionInfo.subject = this.dimensionInfo.subjectBind === 'subject_music' ? '音乐' : '美术'
+          this.$emit('onFinish', this.dimensionInfo)
+        } else {
+          this.$Message.error('请先填写完整!');
+        }
+      })
+    }
+  },
+  watch: {
+    dimension: {
+      handler(n, o) {
+        console.error(n)
+        this.dimensionInfo = this._.cloneDeep(n)
+      },
+      immediate: true,
+      deep: true
+    }
+  }
+}
+</script>
+
+<style lang="less" scoped>
+/deep/ .ivu-icon-ios-close {
+  color: #153e73 !important;
+}
+.grade-title {
+  font-weight: bold;
+  color: #5ca2ff;
+}
+
+.desc-single-item {
+  padding: 5px;
+
+  .tools {
+    .ivu-icon {
+      margin-left: 10px;
+      font-size: 16px;
+      color: #fff;
+    }
+  }
+
+  &:hover {
+    background: #0e4ce27a;
+    color: #fff;
+    cursor: pointer;
+    border-radius: 4px;
+
+    .tools {
+      display: inline-block;
+    }
+  }
+  &::before {
+    content: "";
+    display: inline-block;
+    border: 4px solid #6ca3da;
+    border-radius: 50%;
+    margin-right: 5px;
+    margin-bottom: 2px;
+  }
+}
+</style>

+ 1 - 1
TEAMModelOS/ClientApp/src/view/art/SchoolArt.vue

@@ -143,7 +143,7 @@ export default {
             this.$api.lessonRecord.getDashboardData({
                 "stime": semesterRange.st,
                 "etime": semesterRange.et,
-                "code": this.$store.state.user.schoolCode,
+                "code": this.$store.state.userInfo.schoolCode,
                 "periodId": this.$store.state.user.curPeriod.id
             }).then(res => {
                 this.$store.commit('setRearchDashboardData', res)

+ 2 - 2
TEAMModelOS/ClientApp/src/view/classmgt/ClassStudent.vue

@@ -522,7 +522,7 @@ export default {
                         delete row.no
                         ids.push(row)
                         this.tableLoading = true
-                        this.$api.stuAccount.updStudent(this.$store.state.user.schoolCode, ids).then(
+                        this.$api.stuAccount.updStudent(this.$store.state.userInfo.schoolCode, ids).then(
                             res => {
                                 this.$Message.success(this.$t('cusMgt.resetPwOk'))
                                 this.tableLoading = false
@@ -549,7 +549,7 @@ export default {
                                 return d
                             })
 
-                            this.$api.stuAccount.updStudent(this.$store.state.user.schoolCode, apiData).then(
+                            this.$api.stuAccount.updStudent(this.$store.state.userInfo.schoolCode, apiData).then(
                                 res => {
                                     this.selections.length = 0
                                     this.$Message.success(this.$t('cusMgt.resetPwOk'))

+ 1 - 1
TEAMModelOS/ClientApp/src/view/dashboard/Art.vue

@@ -158,7 +158,7 @@ export default {
       this.$api.lessonRecord.getDashboardData({
         "stime": semesterRange.st,
         "etime": semesterRange.et,
-        "code": this.$store.state.user.schoolCode,
+        "code": this.$store.state.userInfo.schoolCode,
         "periodId": this.$store.state.user.curPeriod.id
       }).then(res => {
         this.$store.commit('setRearchDashboardData', res)

+ 1 - 1
TEAMModelOS/ClientApp/src/view/dashboard/Research.vue

@@ -117,7 +117,7 @@
 				this.$api.lessonRecord.getDashboardData({
 					"stime": semesterRange.st,
 					"etime": semesterRange.et,
-					"code": this.$store.state.user.schoolCode,
+					"code": this.$store.state.userInfo.schoolCode,
 					"periodId":this.$store.state.user.curPeriod.id
 				}).then(res => {
 					if(res.code && res.code == 404){

+ 1 - 1
TEAMModelOS/ClientApp/src/view/dashboard/Student.vue

@@ -263,7 +263,7 @@ export default {
       this.$api.lessonRecord.getDashboardData({
         "stime": semesterRange.st,
         "etime": semesterRange.et,
-        "code": this.$store.state.user.schoolCode,
+        "code": this.$store.state.userInfo.schoolCode,
         "periodId": this.$store.state.user.curPeriod.id
       }).then(res => {
         this.$store.commit('setRearchDashboardData', res)

+ 1 - 1
TEAMModelOS/ClientApp/src/view/dashboard/StudentAll.vue

@@ -337,7 +337,7 @@ export default {
       this.$api.lessonRecord.getDashboardData({
         "stime": semesterRange.st,
         "etime": semesterRange.et,
-        "code": this.$store.state.user.schoolCode,
+        "code": this.$store.state.userInfo.schoolCode,
         "periodId": this.$store.state.user.curPeriod.id
       }).then(res => {
         this.$store.commit('setRearchDashboardData', res)

+ 2 - 2
TEAMModelOS/ClientApp/src/view/learnactivity/tabs/AnswerTable.vue

@@ -754,7 +754,7 @@ export default {
                 cList.forEach(c => {
                     let requestData = {
                         id: this.examInfo.id,
-                        code: this.examInfo.scope == 'school' ? this.$store.state.user.schoolCode : this.$store.state.userInfo.TEAMModelId,
+                        code: this.examInfo.scope == 'school' ? this.$store.state.userInfo.schoolCode : this.$store.state.userInfo.TEAMModelId,
                         subjectId: subject.id,
                         classId: c
                     }
@@ -1003,7 +1003,7 @@ export default {
             this.dataLoading = true
             let requestData = {
                 id: this.examInfo.id,
-                code: this.examInfo.scope == 'school' ? this.$store.state.user.schoolCode : this.$store.state.userInfo.TEAMModelId,
+                code: this.examInfo.scope == 'school' ? this.$store.state.userInfo.schoolCode : this.$store.state.userInfo.TEAMModelId,
                 subjectId: this.chooseSubject,
                 classId: this.chooseClass,
             };

+ 2 - 2
TEAMModelOS/ClientApp/src/view/research-center/ResearchCenter.vue

@@ -218,7 +218,7 @@
 				this.$api.lessonRecord.getDashboardData({
 					"stime": semesterRange.st,
 					"etime": semesterRange.et,
-					"code": this.$store.state.user.schoolCode,
+					"code": this.$store.state.userInfo.schoolCode,
 					"periodId":this.$store.state.user.curPeriod.id
 				}).then(res => {
 					console.error(res)
@@ -238,7 +238,7 @@
 					"etime": semesterRange.et,
 					"tmdid": this.$store.state.user.TEAMModelId,
 					"scope": "school",
-					"school": this.$store.state.user.schoolCode,
+					"school": this.$store.state.userInfo.schoolCode,
 					"periodId":this.$store.state.user.curPeriod.id
 				}).then(res => {
 					this.introVideos = this.getFullInfo(res.excellentRcd)

+ 2 - 2
TEAMModelOS/ClientApp/src/view/research-center/ResearchCenterMock.vue

@@ -283,7 +283,7 @@
 				this.$api.lessonRecord.getDashboardData({
 					"stime": semesterRange.st,
 					"etime": semesterRange.et,
-					"code": this.$store.state.user.schoolCode,
+					"code": this.$store.state.userInfo.schoolCode,
 					"periodId":this.$store.state.user.curPeriod.id
 				}).then(res => {
 					console.error(res)
@@ -303,7 +303,7 @@
 					"etime": semesterRange.et,
 					"tmdid": this.$store.state.user.TEAMModelId,
 					"scope": "school",
-					"school": this.$store.state.user.schoolCode,
+					"school": this.$store.state.userInfo.schoolCode,
 					"periodId":this.$store.state.user.curPeriod.id
 				}).then(res => {
 					// this.introVideos = this.getFullInfo(res.excellentRcd)

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

@@ -626,7 +626,7 @@ export default {
       this.$api.lessonRecord.getAnalysisCount({
         "stime": semesterRange.st,
         "etime": semesterRange.et,
-        "code": this.$store.state.user.schoolCode,
+        "code": this.$store.state.userInfo.schoolCode,
         "periodId": this.$store.state.user.curPeriod.id
       }).then(res => {
         console.log(res)

+ 1 - 1
TEAMModelOS/ClientApp/src/view/schoolmgmt/RoomMgt/HiTeachLink.vue

@@ -239,7 +239,7 @@ export default {
         },
         getHiteachList: async function () {
             let data = []
-            await this.$api.classroom.GetHiteachList(this.$store.state.user.schoolCode).then(
+            await this.$api.classroom.GetHiteachList(this.$store.state.userInfo.schoolCode).then(
                 (res) => {
                     this.hiteachListLoading = false;
                     data = res.serial

+ 3 - 3
TEAMModelOS/ClientApp/src/view/student-account/stuMgt/StuMgt.vue

@@ -408,7 +408,7 @@ export default {
                 content: `<p>${row ? this.$t('cusMgt.resetPwContent1') : this.$t('cusMgt.resetPwContent3')}<strong style='color:red;'>${row ? row.name : this.selections.length}</strong>${this.$t('cusMgt.resetPwContent4')}?</p>`,
                 onOk: () => {
                     this.tableLoading = true
-                    this.$api.stuAccount.updStudent(this.$store.state.user.schoolCode, requestData).then(
+                    this.$api.stuAccount.updStudent(this.$store.state.userInfo.schoolCode, requestData).then(
                         res => {
                             this.selections.length = 0
                             this.$refs.selection.selectAll(false)
@@ -640,7 +640,7 @@ export default {
                         delIds.push({ id: row.id })
                         this.tableLoading = true
 
-                        this.$api.stuAccount.deleteStudent(this.$store.state.user.schoolCode, delIds).then(
+                        this.$api.stuAccount.deleteStudent(this.$store.state.userInfo.schoolCode, delIds).then(
                             res => {
                                 this.$store.dispatch('student/delStudentsToState', res.ids)
                                 this.filterData()
@@ -665,7 +665,7 @@ export default {
                             let delIds = this.selections.map(item => {
                                 return { id: item.id }
                             })
-                            this.$api.stuAccount.deleteStudent(this.$store.state.user.schoolCode, delIds).then(
+                            this.$api.stuAccount.deleteStudent(this.$store.state.userInfo.schoolCode, delIds).then(
                                 res => {
                                     //分页查询后,直接重新访问API
                                     this.selections.length = 0

+ 2 - 2
TEAMModelOS/ClientApp/src/view/student-web/AppiView.less

@@ -52,8 +52,8 @@
 
         .ivu-select-selection {
             border-radius: 15px;
-            background-color: #b4d4bb;
-            border-color: #b4d4bb;
+            background-color: #d8e5dc;
+            border-color: #d8e5dc;
         }
 
         .ivu-select-input {

+ 2 - 2
TEAMModelOS/ClientApp/src/view/uploadEvaluation/Index.vue

@@ -31,7 +31,7 @@ export default {
   data() {
     return {
       file: null,
-      code: this.$store.state.user.schoolCode,
+      code: this.$store.state.userInfo.schoolCode,
       id: '',
       classResult: ''
     }
@@ -70,7 +70,7 @@ export default {
     },
     send(){
         post('/analysis/importResult', {
-            code: this.$store.state.user.schoolCode,
+            code: this.$store.state.userInfo.schoolCode,
             id: this.id,
             classResult: this.classResult['classResult']
         }).then(res => {