소스 검색

Merge branch 'develop3.0' of http://106.12.23.251:10080/TEAMMODEL/TEAMModelOS into develop3.0

zhouj1203@hotmail.com 5 년 전
부모
커밋
8dc8065128
44개의 변경된 파일1111개의 추가작업 그리고 475개의 파일을 삭제
  1. 10 2
      TEAMModelGrpc/Services/ClassroomStudentService.cs
  2. 17 11
      TEAMModelOS.SDK/Context/Filters/HttpGlobalExceptionInvoke.cs
  3. 3 3
      TEAMModelOS.SDK/Module/AzureCosmosDBV3/AzureCosmosDBV3Repository.cs
  4. 8 1
      TEAMModelOS.SDK/Module/AzureCosmosDBV3/IAzureCosmosDBV3Repository.cs
  5. 3 3
      TEAMModelOS.Service/Models/Core/ClassRoomStudent.cs
  6. 3 0
      TEAMModelOS.Service/Models/Core/Classroom.cs
  7. 5 0
      TEAMModelOS.Service/TEAMModelOS.Model.xml
  8. 3 0
      TEAMModelOS/ClientApp/src/api/syllabus.js
  9. 1 0
      TEAMModelOS/ClientApp/src/assets/icon/icon_account.svg
  10. 1 0
      TEAMModelOS/ClientApp/src/assets/icon/icon_fb.svg
  11. 1 0
      TEAMModelOS/ClientApp/src/assets/icon/icon_google.svg
  12. 1 0
      TEAMModelOS/ClientApp/src/assets/icon/icon_info.svg
  13. 1 0
      TEAMModelOS/ClientApp/src/assets/icon/icon_qrcode.svg
  14. 1 0
      TEAMModelOS/ClientApp/src/assets/icon/icon_wechat.svg
  15. 1 0
      TEAMModelOS/ClientApp/src/assets/icon/tmd_account.svg
  16. 1 0
      TEAMModelOS/ClientApp/src/assets/ies5_logo.svg
  17. BIN
      TEAMModelOS/ClientApp/src/assets/image/FFFFFFFF.png
  18. BIN
      TEAMModelOS/ClientApp/src/assets/image/demoQRCode.jpg
  19. BIN
      TEAMModelOS/ClientApp/src/assets/image/headerT.png
  20. BIN
      TEAMModelOS/ClientApp/src/assets/image/lgoin_bg.jpg
  21. 2 0
      TEAMModelOS/ClientApp/src/common/Loading.vue
  22. 1 4
      TEAMModelOS/ClientApp/src/store/module/schoolBaseInfo.js
  23. 34 5
      TEAMModelOS/ClientApp/src/view/coursemgmt/CourseBaseSetting.vue
  24. 60 54
      TEAMModelOS/ClientApp/src/view/coursemgmt/CourseClassroom.vue
  25. 3 2
      TEAMModelOS/ClientApp/src/view/coursemgmt/CourseManage.vue
  26. 1 1
      TEAMModelOS/ClientApp/src/view/evaluation/bank/ExerciseList.vue
  27. 12 7
      TEAMModelOS/ClientApp/src/view/evaluation/index/TestPaper.vue
  28. 47 8
      TEAMModelOS/ClientApp/src/view/knowledge-point/index/Index.vue
  29. 141 28
      TEAMModelOS/ClientApp/src/view/login/Index.less
  30. 259 43
      TEAMModelOS/ClientApp/src/view/login/Index.vue
  31. 3 3
      TEAMModelOS/ClientApp/src/view/school-mgmt/ClassroomSetting/ClassroomSetting.less
  32. 118 51
      TEAMModelOS/ClientApp/src/view/school-mgmt/ClassroomSetting/ClassroomSetting.vue
  33. 91 23
      TEAMModelOS/ClientApp/src/view/school-mgmt/SystemSetting/SystemSetting.vue
  34. 1 32
      TEAMModelOS/ClientApp/src/view/student-account/Index.vue
  35. 2 1
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/EvaluationList/TotalIndex.vue
  36. 58 53
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/TestAnalysis/QuestionList.vue
  37. 12 18
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/TestAnalysis/TestAnalysis.vue
  38. 10 4
      TEAMModelOS/ClientApp/src/view/syllabus/newSyllabus/Index.vue
  39. 21 10
      TEAMModelOS/ClientApp/src/view/teachermgmt/components/personnel/Index.vue
  40. 36 16
      TEAMModelOS/Controllers/Core/ClassRoomController.cs
  41. 44 2
      TEAMModelOS/Controllers/Core/ClassroomStudentController.cs
  42. 93 88
      TEAMModelOS/Controllers/Core/StudentController.cs
  43. 1 1
      TEAMModelOS/Controllers/Learn/HomeWorkController.cs
  44. 1 1
      TEAMModelOS/Controllers/Learn/VoteController.cs

+ 10 - 2
TEAMModelGrpc/Services/ClassroomStudentService.cs

@@ -62,7 +62,13 @@ namespace TEAMModelGrpc.Services
                 List<ClassroomStudent> classroomStudents = await _cosmos.FindByDict<ClassroomStudent>(new Dictionary<string, object> { { "id", classroomStudent.Key } });
                 foreach (var classroomStudent1 in classroomStudent)
                 {
-                    classroomStudents[0].studentId.UnionWith(classroomStudent1.studentId);
+                    classroomStudent1.studentId.ForEach(x => {
+                        if (!classroomStudents[0].studentId.Contains(x))
+                        {
+                            classroomStudents[0].studentId.Add(x);
+                        }
+                    });
+                    //   classroomStudents[0].studentId.UnionWith(classroomStudent1.studentId);
                 }
                 classroomStudents1.AddRange(classroomStudents);
             }
@@ -94,7 +100,9 @@ namespace TEAMModelGrpc.Services
                 List<ClassroomStudent> classroomStudents = await _cosmos.FindByDict<ClassroomStudent>(new Dictionary<string, object> { { "id", item1.id } });
                 foreach (ClassroomStudent item2 in classroomStudents)
                 {
-                    item2.studentId.ExceptWith(item1.studentId);
+
+                    item1.studentId.ForEach(x => { item2.studentId.Remove(x); });
+                    //item2.studentId.ExceptWith(item1.studentId);
                 }
                 classroomStudents1.AddRange(classroomStudents);
             }

+ 17 - 11
TEAMModelOS.SDK/Context/Filters/HttpGlobalExceptionInvoke.cs

@@ -44,10 +44,11 @@ namespace TEAMModelOS.SDK.Context.Filter
                     {
                         context.Response.StatusCode = bizCode;
                     }
-                    else {
+                    else
+                    {
                         context.Response.StatusCode = 200;
                     }
-                   // context.Response.StatusCode = ((BizException)ex).code;
+                    // context.Response.StatusCode = ((BizException)ex).code;
                 }
                 //未知异常
                 else
@@ -62,7 +63,7 @@ namespace TEAMModelOS.SDK.Context.Filter
             {
                 if (!isCatched && context.Response.StatusCode != 200)//未捕捉过并且状态码不为200
                 {
-                    string msg ;
+                    string msg;
                     switch (context.Response.StatusCode)
                     {
                         case 400:
@@ -81,13 +82,13 @@ namespace TEAMModelOS.SDK.Context.Filter
                             msg = exs.Message;
                             break;
                         case 403:
-                            msg = exs.Message;
+                            msg = "金钥验证错误";
                             break;
                         default:
                             msg = "Unknown Error";
                             break;
                     }
-                    await HandleExceptionAsync(context,  bizCode, msg, exs == null ? "" : exs.StackTrace);
+                    await HandleExceptionAsync(context, bizCode, msg, exs == null ? "" : exs.StackTrace);
                 }
             }
         }
@@ -102,18 +103,22 @@ namespace TEAMModelOS.SDK.Context.Filter
         /// <returns></returns>
         private static async Task HandleExceptionAsync(HttpContext context, int bizCode, string msg, string devmsg)
         {
+            if (context.Response.StatusCode == 500)
+            {
+                context.Response.StatusCode = 200;
+            }
             var data = new ErrorResponse<string>(bizCode, msg, devmsg);
             context.Response.ContentType = Constants.CONTENT_TYPE_JSON;
-          //if (context.Response.HasStarted) {
-                await context.Response.WriteAsync(JsonNetHelper.ToJson(data));
+            //if (context.Response.HasStarted) {
+            await context.Response.WriteAsync(JsonNetHelper.ToJson(data));
             //}
-           
+
         }
         /// <summary>
         /// 异常信息封装
         /// </summary>
         /// 
-        
+
         public class ErrorResponse<T>
         {
             public ErrorResponse()
@@ -155,13 +160,14 @@ namespace TEAMModelOS.SDK.Context.Filter
             public ErrorModel<T> error { get; set; } = null;
         }
     }
-    
+
     public class ErrorModel<E>
     {
         public long responseTime = DateTime.Now.Ticks;
-        public float code { get; set; } = 1;
+        public int code { get; set; } = 1;
         public string message { get; set; }
         public string devmsg { get; set; }
         public E data { get; set; }
     }
+
 }

+ 3 - 3
TEAMModelOS.SDK/Module/AzureCosmosDBV3/AzureCosmosDBV3Repository.cs

@@ -45,7 +45,7 @@ namespace TEAMModelOS.SDK.Module.AzureCosmosDBV3
         private const string CacheCosmosPrefix = "cosmos:";
         private string[] ScanModel { get; set; }
         private const int timeoutSeconds = 86400;
-        private const int ttl = 10;
+        private const int ttl = 1;
         private string leaseId = "AleaseContainer";
         public AzureCosmosDBV3Repository(AzureCosmosDBOptions options, CosmosSerializer cosmosSerializer)
         {
@@ -992,10 +992,10 @@ namespace TEAMModelOS.SDK.Module.AzureCosmosDBV3
             return response.Resource;
         }
 
-        public async Task<T> FindById<T>(string id) where T : ID
+        public async Task<T> FindById<T>(string id, bool cache = true) where T : ID
         {
             CosmosModelInfo container = await InitializeCollection<T>();
-            if (container.cache && RedisHelper.Instance != null)
+            if (container.cache && RedisHelper.Instance != null  && cache==true)
             {
 
                 return await RedisHelper.CacheShellAsync(CacheCosmosPrefix + container.container.Id, id, timeoutSeconds, () => { return FindByIdAsSql<T>(id); });

+ 8 - 1
TEAMModelOS.SDK/Module/AzureCosmosDBV3/IAzureCosmosDBV3Repository.cs

@@ -79,7 +79,14 @@ namespace TEAMModelOS.SDK.Module.AzureCosmosDBV3
         Task<List<dynamic>> FindByDict(string CollectionName, Dictionary<string, object> dict, string partitionKey = null, List<string> propertys = null);
         Task<List<dynamic>> FindCountByDict(string CollectionName, Dictionary<string, object> dict, string partitionKey = null);
         Task<Dictionary<string,CosmosModelInfo>> InitializeDatabase();
-        Task<T>FindById<T>(string id) where T : ID;
+        /// <summary>
+        /// 根据ID获取  是否从cache获取  默认是
+        /// </summary>
+        /// <typeparam name="T"></typeparam>
+        /// <param name="id"></param>
+        /// <param name="cache"></param>
+        /// <returns></returns>
+        Task<T>FindById<T>(string id,bool cache=true) where T : ID;
         Task<List<T>> FindByIds<T>(List<string> ids) where T : ID;
         Task<dynamic> FindById(string CollectionName, string id);
         Task<List<dynamic>> FindByIds (string CollectionName, List<string> ids);

+ 3 - 3
TEAMModelOS.Service/Models/Core/ClassRoomStudent.cs

@@ -9,12 +9,12 @@ using TEAMModelOS.SDK.Module.AzureCosmosDBV3;
 namespace TEAMModelOS.Service.Models.Core
 {
     [ProtoContract]
-    [CosmosDB(RU = 400, Name = "CoreClassroomStudent", Cache = true)]
+    [CosmosDB(RU = 400, Name = "CoreClassroomStudent", Cache = false)]
     public class ClassroomStudent : ID
     {
 
         public ClassroomStudent() {
-            studentId = new HashSet<string>();
+            studentId = new List<string>();
         }
         public int? ttl { get; set; } 
         /// <summary>
@@ -30,7 +30,7 @@ namespace TEAMModelOS.Service.Models.Core
         public string scopeCode { get; set; }
 
         [ProtoMember(3)]
-        public HashSet<string> studentId { get; set; }
+        public List<string> studentId { get; set; }
 
     }
 }

+ 3 - 0
TEAMModelOS.Service/Models/Core/Classroom.cs

@@ -46,6 +46,9 @@ namespace TEAMModelOS.Service.Models.Core
         public string hiteach { get; set; }
         [ProtoMember(10)]
         public int studentCount { get; set; }
+        /// <summary>
+        /// TBL IRS 类型区分
+        /// </summary>
         [ProtoMember(11)]
         public string classroomType { get; set; }
         [ProtoMember(12)]

+ 5 - 0
TEAMModelOS.Service/TEAMModelOS.Model.xml

@@ -4,6 +4,11 @@
         <name>TEAMModelOS.Service</name>
     </assembly>
     <members>
+        <member name="P:TEAMModelOS.Service.Models.Core.Classroom.classroomType">
+            <summary>
+            TBL IRS 类型区分
+            </summary>
+        </member>
         <member name="P:TEAMModelOS.Service.Models.Core.ClassroomStudent.id">
             <summary>
             classroomCode

+ 3 - 0
TEAMModelOS/ClientApp/src/api/syllabus.js

@@ -39,4 +39,7 @@ export default {
     FindSyllabusCount: function(data) {
         return post('/api/Volume/FindSyllabusCount', data)
     },
+    FindBlockCount: function (data) {
+        return post('/api/Knowledge/FindKnowlegeCount', data)
+    },
 }

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 1 - 0
TEAMModelOS/ClientApp/src/assets/icon/icon_account.svg


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 1 - 0
TEAMModelOS/ClientApp/src/assets/icon/icon_fb.svg


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 1 - 0
TEAMModelOS/ClientApp/src/assets/icon/icon_google.svg


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 1 - 0
TEAMModelOS/ClientApp/src/assets/icon/icon_info.svg


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 1 - 0
TEAMModelOS/ClientApp/src/assets/icon/icon_qrcode.svg


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 1 - 0
TEAMModelOS/ClientApp/src/assets/icon/icon_wechat.svg


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 1 - 0
TEAMModelOS/ClientApp/src/assets/icon/tmd_account.svg


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 1 - 0
TEAMModelOS/ClientApp/src/assets/ies5_logo.svg


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


BIN
TEAMModelOS/ClientApp/src/assets/image/demoQRCode.jpg


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


BIN
TEAMModelOS/ClientApp/src/assets/image/lgoin_bg.jpg


+ 2 - 0
TEAMModelOS/ClientApp/src/common/Loading.vue

@@ -68,6 +68,8 @@
         position: absolute;
         width: 100%;
         height: 100%;
+        right: 0;
+        top:0;
         display: flex;
         flex-direction: row;
         justify-content: center;

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

@@ -78,11 +78,8 @@ export default {
         getClassroom(context) {
             return new Promise(
                 (resolve, reject) => {
-                    if (context.state.classroomList == undefined) {
+                    if (!context.state.classroomList) {
                         apiTools.schoolSetting.findClassInfo({
-                            // schoolCode: context.state.demoLoginInfo.schoolCode,
-                            // status: 1,
-                            // scope: 'school'
                           scopeCode: context.state.demoLoginInfo.schoolCode
                         }).then(
                             res => {

+ 34 - 5
TEAMModelOS/ClientApp/src/view/coursemgmt/CourseBaseSetting.vue

@@ -56,7 +56,7 @@
                            :placeholder="$t('courseManage.base.searchHolder')"
                            autofocus
                            style="width:calc(100% - 25px)"
-                           @on-click="toggleSearch"/>
+                           @on-click="toggleSearch" />
                 </div>
                 <CheckboxGroup v-model="courseInfo.assistTeacher" @on-change="saveChange">
                     <Checkbox :label="item.TEAMModelId" :disabled="!baseEditStatus" class="course-teacher-item" v-for="(item,index) in teacherList" @click.native="checkStatus">{{item.teacherName}}</Checkbox>
@@ -77,10 +77,10 @@
                     </div>
                     <div class="course-time-detail">
                         <div class="course-frequently">
-                            <Select v-model="item.frequencyCode" :disabled="editTimeIndex !== index" size="small" style="width:112px">
+                            <Select v-model="item.frequencyCode" :disabled="editTimeIndex !== index" size="small" style="width:112px" @on-change="selectFrequencyCode">
                                 <Option v-for="item in frequencyList" :value="item.value" :key="item.value">{{ item.label }}</Option>
                             </Select>
-                            <Select v-if="item.frequencyCode === 'week'" multiple v-model="item.frequencyName" class="course-date course-week" :disabled="editTimeIndex !== index" size="small" >
+                            <Select v-if="item.frequencyCode === 'week'" multiple v-model="item.frequencyName" class="course-date course-week" :disabled="editTimeIndex !== index" size="small">
                                 <Option v-for="item in weekList" :value="item.value" :key="item.value">{{ item.label }}</Option>
                             </Select>
                             <DatePicker v-if="item.frequencyCode === 'temporary' || item.frequency === 'month'" v-model="item.frequencyName" :disabled="editTimeIndex !== index" class="course-date" type="date" placeholder="选择日期" size="small" style="" format="yyyy-MM-dd"></DatePicker>
@@ -99,7 +99,7 @@
                         </div>
                         <div class="course-time-action" v-if="editTimeIndex === index">
                             <div class="smarll-confirm-btn smarll-confirm-btn-active" @click="cancelEditTime(index)">{{$t('courseManage.btnCancel')}}</div>
-                            <div class="smarll-confirm-btn smarll-confirm-btn-active" style="margin:0px 15px;" @click="deleteTime(index)">{{$t('courseManage.btnDel')}}</div>
+                            <div class="smarll-confirm-btn smarll-confirm-btn-active" style="margin:0px 15px;" @click="showDeleteTime(index)">{{$t('courseManage.btnDel')}}</div>
                             <div class="smarll-confirm-btn smarll-confirm-btn-active" @click="submit('courseTime')">{{$t('courseManage.btnSave')}}</div>
                         </div>
                     </div>
@@ -107,6 +107,11 @@
                 <NoData v-if="courseInfo.courseTime.length == 0" style="margin-top:120px;"></NoData>
             </div>
         </div>
+        <Modal v-model="delTimeStatus"
+               title="删除时段"
+               @on-ok="deleteTime(editTimeIndex)">
+            <p>确定删除课程时段吗?</p>
+        </Modal>
     </div>
 </template>
 <script>
@@ -120,6 +125,7 @@
         data() {
             return {
                 fn,
+                delTimeStatus: false,
                 keyWord:'',
                 searchTeacherStatus: false,
                 isLoading: false,
@@ -241,6 +247,12 @@
             }
         },
         methods: {
+            //选择课程频率
+            selectFrequencyCode(code) {
+                if (code == 'day') {
+                    this.courseInfo.courseTime[this.editTimeIndex].frequencyName = []
+                }
+            },
             /**切换搜索状态 */
             toggleSearch() {
                 this.searchTeacherStatus = !this.searchTeacherStatus
@@ -289,7 +301,7 @@
                         beginTime: '', // 课程开始时间
                         endTime: '', // 课程结束时间
                         classroomCode: '', // 上课班级/教室
-                        frequencyName: ''// 临时课程
+                        frequencyName: []// 临时课程
                     }
                 )
                 this.editTimeIndex = this.courseInfo.courseTime.length - 1
@@ -416,6 +428,23 @@
             deleteTime(index) {
                 this.courseInfo.courseTime.splice(index, 1)
                 this.editTimeIndex = -1
+                this.$api.courseMgmt.saveOrUpdateCourse([this.courseInfo]).then(
+                    res => {
+                        if (res.error == null) {
+                            this.$Message.success('修改成功!')
+                            this.editTimeIndex = -1
+                            this.recordEdit = {}
+                        } else {
+                            this.$Message.error('修改失败,API Error!')
+                        }
+                    },
+                    err => {
+                        this.$Message.error('修改失败,API Error!')
+                    }
+                )
+            },
+            showDeleteTime() {
+                this.delTimeStatus = true
             },
             cancelEditTime(index) {
                 if (JSON.stringify(this.recordEdit) !== '{}') {

+ 60 - 54
TEAMModelOS/ClientApp/src/view/coursemgmt/CourseClassroom.vue

@@ -26,14 +26,15 @@
                 <NoData v-if="courseInfo.classroom.length == 0" style="padding-top:100px;"></NoData>
             </div>
         </div>
-        
+
         <div class="course-classroom-info">
             <div class="course-classroom-info-header">
                 <span class="course-classroom-label">{{$t('courseManage.classroom.classroomManage')}}</span>
             </div>
-            
+
             <div class="course-classroom-info-content">
                 <NoData v-if="selectSystemStatus == 0 && courseInfo.classroom.length == 0" style="padding-top:100px;"></NoData>
+                <!--选择系统教室block-->
                 <div :class="selectSystemStatus == 1 ? 'system-classroom-box animated fadeIn': ''" v-if="selectSystemStatus == 1">
                     <p class="system-classroom-label">
                         <span>{{$t('courseManage.classroom.chooseClassroom')}}</span>
@@ -50,18 +51,23 @@
                             <Option v-for="(item,index) in gradeList" :value="item.gradeCode" :key="index">{{ item.gradeName }}</Option>
                         </Select>
                     </div>
-                    <Table :columns="systemColumns" height="600"  :data="systemClassroomList" class="system-classroom-table">
+                    <Table :columns="systemColumns" height="600" :data="systemClassroomList" class="system-classroom-table">
                         <template slot-scope="{ row ,index}" slot="action">
                             <Button class="item-tools" type="success" size="small" @click="selectClassroom(index)">{{$t('courseManage.classroom.btnChoose')}}</Button>
                         </template>
                     </Table>
                 </div>
+                
+                <!--教室基础信息和学生名单管理-->
                 <div class="classroom-box" v-if="selectSystemStatus == 0 && courseInfo.classroom.length > 0">
+                    <!--header选项卡-->
                     <div class="classroom-box-header">
                         <span :class="currentSetIndex === 0 ? 'setting-label setting-label-active':'setting-label'" @click="selectSetIndex(0)">{{$t('courseManage.classroom.baseSetting')}}</span>
                         <span :class="currentSetIndex === 1 ? 'setting-label setting-label-active':'setting-label'" @click="selectSetIndex(1)">{{$t('courseManage.classroom.studentList')}}</span>
                     </div>
+
                     <div class="classroom-box-content" v-if="courseClassroomList.length > 0">
+                        <!--教室基础信息-->
                         <div v-show="currentSetIndex === 0" :class="currentSetIndex === 0 ? 'classroom-base-set animated fadeIn':'classroom-base-set animated fadeOut'">
                             <div :class="courseClassroomList[currentClassroomIndex].scope == 'personal' ? 'class-qrcode-box animated fadeIn':'class-qrcode-box'" style="border-right: 1px solid #424242;" v-if="courseClassroomList[currentClassroomIndex].scopeCode == $store.state.userInfo.TEAMModelId">
                                 <p class="qrcode-label">{{$t('courseManage.classroom.joinCode')}}</p>
@@ -99,23 +105,25 @@
                                 <NoData style="margin-top:220px;" :textContent="$t('courseManage.classroom.schoolPlan')"></NoData>
                             </div>
                         </div>
+                        
+                        <!--学生名单-->
                         <div v-show="currentSetIndex === 1" class="classroom-student">
                             <vuescroll>
                                 <div class="classroom-student-menu">
                                     <Button type="primary" size="small" style="float:right;margin-right:60px;margin-top:10px;" @click="customGroup">{{$t('courseManage.classroom.autoGroupBtn')}}</Button>
+                                    <div style="float:right;margin-right:30px;">
+                                        <!--<span style="margin-right:5px;">{{$t('courseManage.classroom.deleteStudent')}}</span>-->
+                                        <Button type="info" size="small" style="">{{$t('courseManage.classroom.deleteStuBtn')}}</Button>
+                                    </div>
                                     <div style="float:right;margin-right:40px;">
                                         <span style="margin-right:5px;">{{$t('courseManage.classroom.removeStudent1')}}</span>
                                         <Select v-model="currentGroup" style="width:80px" size="small">
-                                            <Option v-for="(item,index) in groupList" :value="index" :key="index">{{ item.group+ '('+item.groupName+')' }}</Option>
-
+                                            <Option v-for="(item,index) in groupList" :value="index" :key="index" @click.native="setGroup">{{ item.group+ '('+item.groupName+')' }}</Option>
                                         </Select>
                                         <span style="margin-right:10px;margin-left:5px;">{{$t('courseManage.classroom.removeStudent2')}}</span>
-                                        <Button type="success" size="small" style="" @click="setGroup">{{$t('courseManage.classroom.removeStuBtn')}}</Button>
-                                    </div>
-                                    <div style="float:right;margin-right:30px;">
-                                        <span style="margin-right:5px;">{{$t('courseManage.classroom.deleteStudent')}}</span>
-                                        <Button type="info" size="small" style="">{{$t('courseManage.classroom.deleteStuBtn')}}</Button>
+                                        <!--<Button type="success" size="small" style="" @click="setGroup">{{$t('courseManage.classroom.removeStuBtn')}}</Button>-->
                                     </div>
+
                                 </div>
                                 <Table :columns="studentColumn" :data="classroomStudent" class="system-classroom-table" height="600" @on-selection-change="getSelections">
                                     <template slot-scope="{ row ,index}" slot="action">
@@ -128,48 +136,47 @@
                     </div>
                 </div>
             </div>
-            <Modal v-model="customGroupStatus"
-                   :title="$t('courseManage.classroom.autoGroupBtn')"
-                   @on-ok="comfirmCustomRules"
-                   @on-cancel="cancel" class="custom-group">
-                <Form :label-width="80" :label-colon="true">
-                    <FormItem :label="$t('courseManage.classroom.studentCountLabel')">
-                        <span>{{classroomStudent.length}}人</span>
-                    </FormItem>
-                    <FormItem :label="$t('courseManage.classroom.groupCountLabel')">
-                        <InputNumber :max="10" :min="1" v-model="groupNum"></InputNumber>
-                    </FormItem>
-                    <FormItem :label="$t('courseManage.classroom.groupTypeLabel')">
-                        <RadioGroup v-model="groupType">
-                            <Radio label="1">
-                                <span>{{$t('courseManage.classroom.groupType1')}}</span>
-                            </Radio>
-                            <Radio label="2">
-                                <span>{{$t('courseManage.classroom.groupType2')}}</span>
-                            </Radio>
-                            <Radio label="3">
-                                <span>{{$t('courseManage.classroom.groupType3')}}</span>
-                            </Radio>
-                        </RadioGroup>
-                    </FormItem>
-                </Form>
-            </Modal>
-            <Modal v-model="newPersonalStatus"
-                   :title="$t('courseManage.classroom.personalClassroomTitle')"
-                   @on-ok="confirmNewClassroom"
-                   @on-cancel="cancel" class="custom-group">
-                <Form ref="personalClassroom" :model="personalClassroom" label-position="top" label-colon>
-                    <FormItem :label="$t('courseManage.classroom.invitationCode')" prop="classroomCode">
-                        <span style="font-size:18px;">{{personalClassroom.classroomCode}}</span>
-                    </FormItem>
-                    <FormItem :label="$t('courseManage.classroom.classroomName')" prop="classroomName">
-                        <Input v-model="personalClassroom.classroomName" :placeholder="$t('courseManage.classroom.classroomName')">
-                        </Input>
-                    </FormItem>
-                </Form>
-            </Modal>
         </div>
-
+        <Modal v-model="customGroupStatus"
+               :title="$t('courseManage.classroom.autoGroupBtn')"
+               @on-ok="comfirmCustomRules"
+               @on-cancel="cancel" class="custom-group">
+            <Form :label-width="80" :label-colon="true">
+                <FormItem :label="$t('courseManage.classroom.studentCountLabel')">
+                    <span>{{classroomStudent.length}}人</span>
+                </FormItem>
+                <FormItem :label="$t('courseManage.classroom.groupCountLabel')">
+                    <InputNumber :max="10" :min="1" v-model="groupNum"></InputNumber>
+                </FormItem>
+                <FormItem :label="$t('courseManage.classroom.groupTypeLabel')">
+                    <RadioGroup v-model="groupType">
+                        <Radio label="1">
+                            <span>{{$t('courseManage.classroom.groupType1')}}</span>
+                        </Radio>
+                        <Radio label="2">
+                            <span>{{$t('courseManage.classroom.groupType2')}}</span>
+                        </Radio>
+                        <Radio label="3">
+                            <span>{{$t('courseManage.classroom.groupType3')}}</span>
+                        </Radio>
+                    </RadioGroup>
+                </FormItem>
+            </Form>
+        </Modal>
+        <Modal v-model="newPersonalStatus"
+               :title="$t('courseManage.classroom.personalClassroomTitle')"
+               @on-ok="confirmNewClassroom"
+               @on-cancel="cancel" class="custom-group">
+            <Form ref="personalClassroom" :model="personalClassroom" label-position="top" label-colon>
+                <FormItem :label="$t('courseManage.classroom.invitationCode')" prop="classroomCode">
+                    <span style="font-size:18px;">{{personalClassroom.classroomCode}}</span>
+                </FormItem>
+                <FormItem :label="$t('courseManage.classroom.classroomName')" prop="classroomName">
+                    <Input v-model="personalClassroom.classroomName" :placeholder="$t('courseManage.classroom.classroomName')">
+                    </Input>
+                </FormItem>
+            </Form>
+        </Modal>
     </div>
 </template>
 <script>
@@ -483,8 +490,6 @@
             },
             confirmNewClassroom() {
                 this.personalClassroom['scope'] = 'personal'
-                //this.personalClassroom['TEAMModelId'] = 'habook#0001'
-                //this.personalClassroom['schoolCode'] = 'HBCN'
                 this.personalClassroom['scopeCode'] = 'habook#0001'
                 this.personalClassroom['headMaster'] = 'HABOOK(测试名字)'
                 this.personalClassroom['id'] = Math.uuid()
@@ -494,8 +499,9 @@
                             let resData = res.result.data
                             let [...classrooms] = this.$store.state.schoolBaseInfo.classroomList
                             classrooms.push(resData)
+                            this.systemClassroomList.push(resData)
                             this.$store.commit('schoolBaseInfo/setClassroomList', classrooms)
-                            this.courseInfo.classroom.push(resData)
+                            this.courseInfo.classroom.push(resData.classroomCode)
                             this.$api.courseMgmt.saveOrUpdateCourse([this.courseInfo]).then(
                                 (res) => {
                                     if (res.error == null) {

+ 3 - 2
TEAMModelOS/ClientApp/src/view/coursemgmt/CourseManage.vue

@@ -6,7 +6,6 @@
             <div class="course-list-header">
                 <div v-if="!isSearch">
                     <span class="list-label">{{$t('courseManage.courseList')}}</span>
-                    <!--<Input prefix="ios-search" placeholder="" size="small" class="search-course" />-->
                     <Icon type="ios-search" color="white" size="18" class="add-icon" @click="toggleSearch" />
                     <Icon type="md-trash" color="white" size="18" class="add-icon" @click="showComfirmDelete" />
                     <Icon type="md-add" color="white" size="18" class="add-icon" :title="$t('courseManage.addCourse')" @click="addCourse" />
@@ -72,13 +71,15 @@
     import NoData from '@/common/NoData.vue'
     import CourseBaseSetting from './CourseBaseSetting.vue'
     import CourseClassroom from './CourseClassroom.vue'
+    import Loading from '@/common/Loading.vue'
     import CourseSyllabus from './CourseSyllabus.vue'
     export default {
         components: {
             CourseBaseSetting,
             CourseClassroom,
             CourseSyllabus,
-            NoData
+            NoData,
+            Loading
         },
         data() {
             return {

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

@@ -129,7 +129,7 @@
                                 <span v-if="!item.points.length">暂未绑定知识点</span>
                                 <div v-else>
                                     <span v-for="point in item.points" style="padding:0 10px;border:1px solid #808080;margin-left:10px">
-                                        <span v-if="allPointList.length">{{ allPointList.filter(i => i.id === point)[0].name }}</span>
+                                        <span v-if="allPointList.length">{{ allPointList.filter(i => i.id === point).length ? allPointList.filter(i => i.id === point)[0].name : '' }}</span>
                                     </span>
                                 </div>
                             </div>

+ 12 - 7
TEAMModelOS/ClientApp/src/view/evaluation/index/TestPaper.vue

@@ -17,6 +17,7 @@
                             <span class="base-info-item">难度:<span class="analysis-info">{{ paperDiff }}</span></span>
                         </div>
                         <div>
+                            <Button class="base-info-btn" type="success" v-show="isShowSave" @click="onBackToBank">返回</Button>
                             <Button class="base-info-btn" type="success" v-show="isShowSave" @click="savePaper">保存试卷</Button>
                             <Button class="base-info-btn" type="info" @click="onHandleToggle">{{ isAllOpen ? '全部折叠' : '全部展开'}}</Button>
                             <Button class="base-info-btn" type="info" @click="onSetScoreByType">题型配分</Button>
@@ -163,7 +164,16 @@
                 this.isAllOpen = list.length !== 0
             },
 
-            
+            /** 返回试卷库 */
+            onBackToBank() {
+                this.$router.push({
+                    name: 'testPaperList',
+                    params: {
+                        tabName: 'paper'
+                    }
+                })
+            },
+
 
             /** 保存试卷 */
             savePaper() {
@@ -181,12 +191,7 @@
                         this.$api.learnActivity.SaveExamPaper(saveParams).then(res => {
                             if (res.error == null) {
                                 this.$refs.exList.dataLoading = false
-                                this.$router.push({
-                                    name: 'testPaperList',
-                                    params: {
-                                        tabName:'paper'
-                                    }
-                                })
+                                this.onBackToBank()
                                 this.$Message.success('保存成功!')
                             } else {
                                 this.$Message.error('API ERROR!')

+ 47 - 8
TEAMModelOS/ClientApp/src/view/knowledge-point/index/Index.vue

@@ -4,6 +4,7 @@
 
 <template>
     <div class="new-syllabus-container">
+        <Loading :top="200" bgColor="rgba(103, 103, 103, 0.27)" type="1" v-if="isLoading"></Loading>
         <!-- 课纲头部 切换来源以及选择学段 -->
         <div class="new-syllabus-header">
             <div>
@@ -49,7 +50,7 @@
                              :key="index"
                              @click="hasModify ? handleConfirmSave({index},'2') : handleSubjectTap(index)">
                             <p class="gl-item-name">{{item.subjectName}}</p>
-                            <p class="gl-item-info"><span></span>知识块数:{{ 0 }}</p>
+                            <p class="gl-item-info"><span></span>知识块数:{{ tabIndex === 0  ? schoolBlockCount[index] : privateBlockCount[index]}}</p>
                         </div>
                     </div>
                 </vuescroll>
@@ -61,11 +62,11 @@
                     <!-- 切换头部以及 搜索框 -->
                     <div class="ns-header-content" v-if="!isSearchBlock">
                         <span>
-                            <Icon type="ios-photos" color="#fff" size="20"/>
+                            <Icon type="ios-photos" color="#fff" size="20" />
                             <span style="margin-left:5px">知识块</span>
                         </span>
                         <div>
-                            <Icon type="md-add"   v-if="$access.can('admin.*|Block_Add') || tabIndex === 1" color="#fff" size="18" style="cursor:pointer;margin-right:10px" @click="onAddBlock" />
+                            <Icon type="md-add" v-if="$access.can('admin.*|Block_Add') || tabIndex === 1" color="#fff" size="18" style="cursor:pointer;margin-right:10px" @click="onAddBlock" />
                             <Icon type="ios-search" color="#fff" size="18" style="cursor:pointer" @click="isSearchBlock = true" />
                         </div>
                     </div>
@@ -94,8 +95,8 @@
                                  @click="handleBlockTap(index,item)">
                                 <p class="gl-item-name" :title="item.name">{{item.name}}</p>
                                 <p class="gl-item-info"><span></span>知识点数:{{item.points ? item.points.length : 0}}</p>
-                                <span class="btn-edit"   v-if="$access.can('admin.*|Block_Edit') || tabIndex === 1" title="编辑" @click.stop="onEditBlock(item)"><Icon type="md-create" size="20" color="#d2d2d2" /></span>
-                                <span class="btn-delete"  v-if="$access.can('admin.*|Block_Delete') || tabIndex === 1" title="删除" @click.stop="onDeleteBlock(item)"><Icon type="md-trash" size="22" color="#d2d2d2" /></span>
+                                <span class="btn-edit" v-if="$access.can('admin.*|Block_Edit') || tabIndex === 1" title="编辑" @click.stop="onEditBlock(item)"><Icon type="md-create" size="20" color="#d2d2d2" /></span>
+                                <span class="btn-delete" v-if="$access.can('admin.*|Block_Delete') || tabIndex === 1" title="删除" @click.stop="onDeleteBlock(item)"><Icon type="md-trash" size="22" color="#d2d2d2" /></span>
                             </div>
                         </div>
                     </div>
@@ -217,6 +218,7 @@
                 isLoadSubject: false,
                 isLoadBlocks: false,
                 isLoadPoints: false,
+                isLoading:false,
                 schoolParams: null,
                 currentPeriodIndex: null,
                 currentSubjectIndex: null,
@@ -235,6 +237,9 @@
                 activePeriodIndex: 0,
                 activeSubjectIndex: 0,
                 activeBlockIndex: 0,
+                blockCounts: [],
+                schoolBlockCount: [],
+                privateBlockCount:[],
                 isSearchSubject: false,
                 isSearchBlock: false,
                 isSearchPoint: false,
@@ -264,6 +269,8 @@
         },
         created() {
             this.initSchoolData()
+
+            this.initBlockCount()
         },
         methods: {
             // 获取当前学校学段学科等基本信息
@@ -283,6 +290,26 @@
                 })
             },
 
+            // 获取当前册别数量
+            initBlockCount() {
+                if (this.blockCounts.length) {
+                    this.schoolBlockCount = this.blockCounts[this.currentPeriodIndex].map(i => i[0])
+                    this.privateBlockCount = this.blockCounts[this.currentPeriodIndex].map(i => i[1])
+                } else {
+                    this.$api.syllabus.FindBlockCount({ schoolCode: this.schoolInfo.schoolCode }).then(res => {
+                        if (!res.error) {
+                            this.$nextTick(() => {
+                                this.blockCounts = res.result.data
+                                this.schoolBlockCount = res.result.data[this.currentPeriodIndex || 0].map(i => i[0])
+                                this.privateBlockCount = res.result.data[this.currentPeriodIndex || 0].map(i => i[1])
+                            })
+                        } else {
+                            this.$Message.warning('获取数据失败')
+                        }
+                    })
+                }
+            },
+
             // 根据学科获取所有知识块信息
             getBlocksData() {
                 let that = this
@@ -326,12 +353,12 @@
                 switch (index) {
                     case 0:
                         this.currentParams.scopeCode = this.originData.schoolCode
-                        this.isShowPoints ? this.getPointsData() : this.getBlocksData()
+                        //this.isShowPoints ? this.getPointsData() : this.getBlocksData()
                         this.pointOwn = 'school'
                         break
                     case 1:
                         this.currentParams.scopeCode = 'habook#0001'
-                        this.isShowPoints ? this.getPointsData() : this.getBlocksData()
+                        //this.isShowPoints ? this.getPointsData() : this.getBlocksData()
                         this.pointOwn = 'personal'
                         break
                     default:
@@ -362,6 +389,7 @@
                     this.subjectList = this.periodList[index].subjects // 切换学段后更新 学科 列表
                     this.originSubjectList = this.periodList[index].subjects // 筛选学科源数据
                     this.handleSubjectTap(0)
+                    this.initBlockCount()
                     setTimeout(function() {
                         that.isLoadSubject = false
                     }, 400)
@@ -412,6 +440,8 @@
                 this.$Message.success('操作成功!')
                 this.handleSubjectTap(this.currentSubjectIndex) // 获取最新知识块数据
                 this.isAddBlock = false // 关闭窗口
+                this.blockCounts = []
+                this.initBlockCount()
             },
 
             // 添加知识点完成
@@ -441,11 +471,20 @@
                     okText: '确认',
                     cancelText: '取消',
                     onOk: () => {
+                        let that = this
+                        this.isLoading = true
                         this.$api.knowledge.DeleteSchoolBlock({ id: data.id }).then(res => {
                             if (res.result.data) {
                                 this.blockList.splice(this.blockList.indexOf(data), 1)
-                                this.$Message.success('删除成功')
                                 this.handleBlockTap(0, this.blockList.length ? this.blockList[0] : null)
+                                setTimeout(() => {
+                                    that.blockCounts = []
+                                    that.initBlockCount()
+                                    that.isLoading = false
+                                    that.$Message.success('删除成功')
+                                },1000)
+                                
+                                
                             } else {
                                 this.$Message.success('删除失败')
                             }

+ 141 - 28
TEAMModelOS/ClientApp/src/view/login/Index.less

@@ -1,47 +1,160 @@
 .login{
+    width: 100%;
+    height: 100%;
+    background-image: url('../../assets/image/lgoin_bg.jpg');
+    background-repeat: no-repeat;
+    background-attachment: fixed;
+    background-position: center;
+    background-size: cover;
+    &-mark{
+        position: fixed;
+        left:30px;
+        top:30px;
+    }
+    &-server{
+        position: fixed;
+        right:30px;
+        top:30px;
+        h5 {
+            font-weight: 100;
+            margin-bottom: 5px;
+            color: #ffffff;
+        }
+    }
     &-body{
-        height: 88%;
+        height: 95%;
         display: -webkit-flex;
         display:         flex;
         -webkit-align-items: center;
                 align-items: center;
         -webkit-justify-content: center;
                 justify-content: center;
-        .center-box{
-            width: 550px;
-            text-align: center;            
+        .loginDiv{
+            width: 700px;
+            display: flex;
+            // align-items: center;
+            justify-content: space-between;
             .loginBox{
-                background-color: #425953a1;
-                margin-top: 20px;
-                padding: 15px;
-                border: 2px solid #fff;
-                border-radius: 20px;
-                .demo{
-                    margin: 30px 0;
-                    width: 500px;
-                    margin: auto;
-                    &-carousel{
+                width: 300px;
+                height: 310px;
+                .title{
+                    display: flex;
+                    align-items: center;
+                    // align-content: center !important;
+                    margin-bottom: 5px;
+                    .logo{
+                        margin-right: 5px;
+                        height: 15px;
+                    }
+                    .text{
+                        margin-right: 15px;
+                        color: #ffffff;
+                        font-size: ;
+                    }
+                    .tooltip{
+                        height: 15px;
+                    }
+                }
+                .subTitle{
+                    font-size: 12px;
+                    color: #d1d1d3;
+                    margin-bottom: 25px;
+                }
+                .loginForm{
+                    margin-bottom: 10px;
+                    .formItem{
+                        margin: 0;
+                    }
+                    .errlable{
+                        text-align: right;
+                        color: #f22613;
+                        font-size: 12px;
+                        margin-top: 3px;
+                        height: 12px;
+                    }
+                }
+                .extra{
+                    display: flex;
+                    align-items: center;
+                    justify-content: space-between;
+                    margin-bottom: 30px;
+                    .qrlogin{
+                        display: flex;
+                        align-items: center;
+                        .logo{
+                            margin-right: 5px;
+                            height: 15px;
+                        }
+                        a{
+                            font-size: 12px;
+                            color: #668fbc;
+                            text-decoration: underline;
+                        }
+                    }
+                    .link{
+                        a{
+                            font-size: 12px;
+                            color: #668fbc;
+                            text-decoration: underline;
+                        }
+                    }
+                }
+                .communyLoging{
+                    .description{
                         text-align: center;
-                        color: #fff;
-                        padding: 10px;
-                        img{
-                            width: 100px;
-                            display: block;
-                            margin: auto;
+                        font-size: 12px;
+                        color: #d1d1d3;
+                        margin-bottom: 20px;
+                        letter-spacing: 1.5px;
+                    }
+                    .links{
+                        display: flex;
+                        align-items: center;
+                        justify-content: space-around;
+                        .icon{
+                            display: flex;
+                            align-items: center;
+                            flex-direction: column;
+                            img{
+                                width: 35px;
+                            }
+                            span{
+                                font-size: 12px;
+                                color: #d1d1d3;
+                            }
                         }
-                        span{
-                            display: block;
-                            width: 150px;
-                            margin: auto;
-                            font-size: 2em;
+                    }
+                }
+                .qrloginMode{
+                    .qrcode{
+                        width: 100%;
+                        display: block;
+                        margin-bottom: 10px;
+                    }
+                    .links{
+                        display: flex;
+                        align-items: center;
+                        justify-content: space-between;
+                        .icon-a{
+                            display: flex;
+                            align-items: center;
+                            img{
+                                margin-right: 3px;
+                                width: 15px;
+                                height: 15px;
+                            }
+                        }
+                        a{
+                            font-size: 12px;
+                            color: #668fbc;
                         }
                     }
                 }
-            }   
-        } 
+            }
+        }
     }
     &-footer{
-        height: 12%;
+        height: 5%;
         text-align: center;
         position: relative;
         .footer-title{

+ 259 - 43
TEAMModelOS/ClientApp/src/view/login/Index.vue

@@ -2,50 +2,220 @@
   @import './Index.less';
 </style>
 
+<style lang="less">
+.login{
+  &-server{
+    .ivu-select-selection{
+      border-radius: 0;
+      background-color: #0d253f;
+      color: #8a98a3;
+      border: 0;
+    }
+    .ivu-select-arrow{
+      font-size: 18px;
+    }
+    .ivu-select-dropdown{
+      background-color: #091529;
+      border-radius: 0;
+    }
+    .ivu-select-item{
+      color: #ffffff;
+      &:hover{
+        background-color:transparent;
+      }
+    }
+    .ivu-select-item-focus{
+      background-color:transparent;
+    }
+  }
+  &-body{
+    .loginBox{
+      .loginForm{
+          .formItem{
+              input{
+                  border-radius: 0;
+                  font-size: 12px;
+              }
+          }
+      }
+    }
+  }
+}
+
+
+    .demo-auto-complete-item{
+        padding: 4px 0;
+        border-bottom: 1px solid #F6F6F6;
+    }
+    .demo-auto-complete-group{
+        font-size: 12px;
+        padding: 4px 6px;
+    }
+    .demo-auto-complete-group span{
+        color: #666;
+        font-weight: bold;
+    }
+    .demo-auto-complete-group a{
+        float: right;
+    }
+    .demo-auto-complete-count{
+        float: right;
+        color: #999;
+    }
+    .demo-auto-complete-more{
+        display: block;
+        margin: 0 auto;
+        padding: 4px;
+        text-align: center;
+        font-size: 12px;
+    }
+</style>
+
 <template>
-  <div id="login" class="login backdrop-light">
+  <div id="login" class="login">
+    <div class="login-mark">
+      <img width="125" src="@/assets/ies5_logo.svg">
+    </div>
+    <div class="login-server">
+      <h5>數據中心位置</h5>
+      <Select v-model="serverType" style="width:120px">
+          <Option value="中國">{{ '中國' }}</Option>
+          <Option value="全球">{{ '全球' }}</Option>
+      </Select>
+    </div>
     <div class="login-body">
-      <div class="center-box">
-        <img style="width:400px" src="@/assets/mark.svg"/>
-        <!-- <h2 style="color:#c5b381e0;">歡迎來到醍摩豆雲平台 ! 請選擇您的身分進行登入 !</h2> -->
+
+      <div class="loginDiv">
         <div class="loginBox">
-          <Carousel class="demo" v-model="identity" arrow="always" dots="none">
-            <CarouselItem >
-                <div class="demo-carousel">
-                  <img src="@/assets/image/headerT.png">
-                  <span>{{ $t('login.teacher') }}</span>
-                </div>
-            </CarouselItem>
-            <CarouselItem>
-                <div class="demo-carousel">
-                  <img src="@/assets/image/FFFFFFFF.png">
-                  <span>{{ $t('login.student') }}</span>
+          <div class="title">
+            <div class="logo">
+              <img  width="15" height="15" src="@/assets/icon/tmd_account.svg">
+            </div>
+            <h4 class="text">
+              {{ qrloginFlag ? 'QRCode 掃瑪登入':'醍摩豆帳號登入'}}
+            </h4>
+            <Tooltip class="tooltip" placement="right-end" :transfer="true" max-width="200">
+                <img src="@/assets/icon/icon_info.svg" width="15" height="15">
+                <div slot="content">
+                  <p style="font-size: 12px;">藉由完整的醍摩豆帳號體驗教師的多校教學資源與課程串聯,以及學生的在升學過程中產生的完整學習歷程。</p>
                 </div>
-            </CarouselItem>
-          </Carousel>
-            <Form ref="loginForm" :model="loginForm" :rules="loginRule" style="width: 450px;margin: auto;" @keydown.enter.native="loginSubmit('loginForm')">
-              <FormItem class="ItemPadding" prop="id" >
-                <Input v-model="loginForm.id" :placeholder="$t('login.id')"></Input>
-              </FormItem>
-              <FormItem class="ItemPadding" style="margin-bottom: 5px;" prop="pass">
-                <Input password type="password" v-model="loginForm.pass" :placeholder="$t('login.pass')" /></Input>
+            </Tooltip>
+          </div>
+          <h4 class="subTitle">
+            {{ qrloginFlag ? '使用HiTA或AClassONE掃描進行登入':'系統管理者、教師、學生與家長登入口'}}
+          </h4>
+
+          <template v-if="!qrloginFlag">
+            <Form class="loginForm">
+              <FormItem class="formItem" prop="id" >
+                <Input v-model="loginForm.id" placeholder="醍摩豆ID / 手機號碼 / E-Mail"/>
               </FormItem>
-              <div style="text-align: right;"><a>{{ $t('login.forgetId') }}</a></div>
-              <!-- <FormItem class="ItemPadding" prop="single" style="text-align: right;">
-                <Checkbox v-model="loginForm.single" style="color: #fefefe;">記住我的登入資訊</Checkbox><a>  | 忘記帳號/密碼?</a>
-              </FormItem> -->
-              <FormItem class="ItemPadding" style="margin-top: 50px;">
-                <Button long style="background-color: #082835;color:#fefefe;" @click="loginSubmit('loginForm')">{{ $t('login.login') }}</Button>
+              <FormItem class="formItem"  prop="pass">
+                <Input  type="password" v-model="loginForm.pass" placeholder="密碼" >
+                  <Icon v-show="loginFormEnter" @click="test()" type="md-arrow-forward" slot="suffix" />
+                </Input>
               </FormItem>
+              <div class="errlable"></div>
             </Form>
+
+            <div class="extra">
+              <div class="qrlogin">
+                <div class="logo">
+                  <img  width="15" height="15" src="@/assets/icon/icon_qrcode.svg">
+                </div>
+                <a @click="qrlogin()">QRCode登入</a>
+              </div>
+              <div class="link">
+                <a>註冊帳號</a> | <a>忘記密碼</a>
+              </div>
+            </div>
+
+            <div class="communyLoging">
+              <div class="description">或使用第三方平台登入</div>
+              <div class="links">
+                <div class="icon">
+                  <img  src="@/assets/icon/icon_fb.svg">
+                  <span>Facebook</span>
+                </div>
+                <div class="icon">
+                  <img  src="@/assets/icon/icon_google.svg">
+                  <span>Google</span>
+                </div>
+                <div class="icon">
+                  <img  src="@/assets/icon/icon_wechat.svg">
+                  <span>微信</span>
+                </div>
+              </div>
+            </div>
+          </template>
+          <template v-else>
+            <div class="qrloginMode">
+              <img class="qrcode" src="@/assets/image/demoQRCode.jpg">
+              <div class="links">
+                <div class="icon-a">
+                  <img src="@/assets/icon/icon_account.svg">
+                  <a @click="qrlogin()">帳號登入</a>
+                </div>
+                <a >立即註冊</a>
+              </div>
+            </div>
+          </template>
+
+        </div>
+
+        <div class="loginBox">
+
+              <div class="title">
+                <div class="logo">
+                  <img  width="15" height="15" src="@/assets/icon/tmd_account.svg">
+                </div>
+                <h4 class="text">校內帳號登入</h4>
+                <Tooltip class="tooltip" placement="right-end" :transfer="true" max-width="200">
+                    <img src="@/assets/icon/icon_info.svg" width="15" height="15">
+                    <div slot="content">
+                      <p style="font-size: 12px;">藉由完整的醍摩豆帳號體驗教師的多校教學資源與課程串聯,以及學生的在升學過程中產生的完整學習歷程。</p>
+                    </div>
+                </Tooltip>
+              </div>
+              <h4 class="subTitle" @click="test()">由學校同一分配給學生使用的帳號登入口</h4>
+
+              <Form class="loginForm">
+                <FormItem class="formItem" prop="id" >
+                      <AutoComplete
+                        v-model="value4"
+                        icon="ios-search"
+                        placeholder="選擇學校"
+                        style="width:300px">
+                        <div class="demo-auto-complete-item" v-for="item in data4">
+                            <div class="demo-auto-complete-group">
+                                <span>{{ item.title }}</span>
+                                <a href="https://www.google.com/search?q=iView" target="_blank">更多</a>
+                            </div>
+                            <Option v-for="option in item.children" :value="option.title" :key="option.title">
+                                <span class="demo-auto-complete-title">{{ option.title }}</span>
+                                <span class="demo-auto-complete-count">{{ option.count }} 人关注</span>
+                            </Option>
+                        </div>
+                        <a href="https://www.google.com/search?q=iView" target="_blank" class="demo-auto-complete-more">查看所有结果</a>
+                    </AutoComplete>
+                </FormItem>
+                <FormItem class="formItem" prop="id" >
+                  <Input v-model="loginForm.id" placeholder="醍摩豆ID / 手機號碼 / E-Mail"/>
+                </FormItem>
+                <FormItem class="formItem"  prop="pass">
+                  <Input  type="password" v-model="loginForm.pass" placeholder="密碼" >
+                    <Icon v-show="loginFormEnter" @click="test()" type="md-arrow-forward" slot="suffix" />
+                  </Input>
+                </FormItem>
+                <div class="errlable"></div>
+              </Form>
+
+
         </div>
+
       </div>
     </div>
     <div class="login-footer">
-      <h2 class="footer-title">
-        {{ $t('login.relatedLink') }}
-      </h2>
-      <a class="link">{{ $t('login.link1') }}</a><span class="demarcation">&nbsp;&nbsp;|&nbsp;&nbsp;</span><a class="link">{{ $t('login.link1') }}</a><span class="demarcation">&nbsp;&nbsp;|&nbsp;&nbsp;</span><a class="link">{{ $t('login.link1') }}</a>
       <h5 style="position: absolute;bottom:0;width: 100%;padding: 7px;color: #515a6e;">&copy; HABOOL Group 2019</h5>
     </div>
   </div>
@@ -87,6 +257,7 @@ export default {
         }
     };    
     return {
+      qrloginFlag: false,
       identity: 0,
       single: '',
       loginForm: {
@@ -100,27 +271,72 @@ export default {
           pass: [
               { validator: validatePasswordCheck, trigger: 'blur' },
           ]
-      }
+      },
+      serverType: '中國',
+      value4: '',
+      data4: [
+          {
+              title: '话题',
+              children: [
+                  {
+                      title: 'iView',
+                      count: 10000,
+
+                  },
+                  {
+                      title: 'iView UI',
+                      count: 10600,
+
+                  }
+              ]
+          },
+          {
+              title: '问题',
+              children: [
+                  {
+                      title: 'iView UI 有多好',
+                      count: 60100,
+
+                  },
+                  {
+                      title: 'iView 是啥',
+                      count: 30010,
+
+                  }
+              ]
+          },
+          {
+              title: '文章',
+              children: [
+                  {
+                      title: 'iView 是一个设计语言',
+                      count: 100000,
+
+                  }
+              ]
+          }
+      ]
     }
   },
   computed: {
     userAccess() { return this.$access.getExtendInfo('userAccess');},
     userInfo() { return this.$access.getExtendInfo('userInfo');},
-    converIdentity(){
-      switch (this.identity) {
-        case 0:
-          return 'T'
-          break;    
-        case 1:
-          return 'S'
-          break;   
-      }
+    loginFormEnter: function(){
+      let flag = false
+      if(this.loginForm.id && this.loginForm.pass) flag = true
+      return flag
     }
   },
   created() {
     
   },
   methods: {
+    test: function(){
+      alert('sdf')
+    },
+    qrlogin: function(){
+      this.qrloginFlag = !this.qrloginFlag
+    },
     loginSubmit: function(name){
       this.$refs[name].validate((valid) => {
         if (valid) {

+ 3 - 3
TEAMModelOS/ClientApp/src/view/school-mgmt/ClassroomSetting/ClassroomSetting.less

@@ -198,11 +198,11 @@
     height:100%;
     .border(right);
     &-label{
-        display:block;
+        display:inline-block;
         color:@second-textColor;
         font-size:@second-fontSize - 4px;
-        margin-top:30px;
-        margin-bottom:10px;
+        /*margin-top:30px;
+        margin-bottom:10px;*/
     }
 }
 .hiteach-code-wrap {

+ 118 - 51
TEAMModelOS/ClientApp/src/view/school-mgmt/ClassroomSetting/ClassroomSetting.vue

@@ -29,6 +29,7 @@
         border-radius: 0px;
         font-size: 16px;
         color: white;
+        margin-left:2px;
         border-bottom: 1px solid #424242;
     }
 
@@ -101,21 +102,21 @@
                                     </p>
                                     <p class="second-text-color">
                                         <!--<span>学生人数:</span>
-                                        <span class="primary-text-color">{{item.studentCount}}</span>
-                                        <span>|</span>-->
+                                    <span class="primary-text-color">{{item.studentCount}}</span>
+                                    <span>|</span>-->
                                         <span>{{$t('schoolBaseInfo.headmaster')}}</span>
                                         <span class="primary-text-color">{{item.headMaster}}</span>
                                     </p>
                                 </div>
                                 <div class="class-list-item-tool">
-                                    <Icon type="md-trash" :title="$t('schoolBaseInfo.delete')" @click.stop="delClassroom(index)" />
+                                    <Icon type="md-trash" :title="$t('schoolBaseInfo.delete')" @click.stop="showConfirmDelete(index)" />
                                 </div>
                             </div>
                             <NoData v-if="classroomList.length == 0" style="padding-top:120px;"></NoData>
                         </vuescroll>
                     </div>
                 </div>
-                
+
                 <div class="container-right-box">
                     <div class="container-right-title">
                         <span class="first-title">{{$t('schoolBaseInfo.classroomAttr')}}</span>
@@ -123,23 +124,38 @@
                     <div style="display:flex;flex-direction:row;width:100%;height:calc(100% - 50px);" v-if="classroomList.length > 0">
                         <!--教室属性-->
                         <div class="class-attr-wrap">
-                            <span class="class-attr-wrap-label">{{$t('schoolBaseInfo.classroomCode')}}</span>
-                            <Input v-model="classroomList[currentClassroomIndex].classroomCode" clearable :placeholder="$t('schoolBaseInfo.classroomCodeHolder')" />
-                            <span class="class-attr-wrap-label">{{$t('schoolBaseInfo.classroomName')}}</span>
-                            <Input v-model="classroomList[currentClassroomIndex].classroomName" clearable :placeholder="$t('schoolBaseInfo.classroomNameHolder')" />
-                            <span class="class-attr-wrap-label">{{$t('schoolBaseInfo.headmaster')}}</span>
-                            <Input v-model="classroomList[currentClassroomIndex].headMaster" clearable :placeholder="$t('schoolBaseInfo.headmasterHolder')" />
-                            <span class="class-attr-wrap-label">{{$t('schoolBaseInfo.setPeriod')}}</span>
-                            <Select v-model="classroomList[currentClassroomIndex].periodCode" clearable>
-                                <Option v-for="(item,index) in periodList" :value="item.periodCode" :key="index">{{ item.periodName }}</Option>
-                            </Select>
-                            <span class="class-attr-wrap-label">{{$t('schoolBaseInfo.setGrade')}}</span>
-                            <Select v-model="classroomList[currentClassroomIndex].gradeCode" clearable>
-                                <Option v-for="(item,index) in fn.getPeriod($store.state.schoolBaseInfo.schoolBaseInfo,classroomList[currentClassroomIndex].periodCode).grades" :value="item.gradeCode" :key="index">{{ item.gradeName }}</Option>
-                            </Select>
-                            <span class="class-attr-wrap-label">{{$t('schoolBaseInfo.setHiteachCode')}}</span>
-                            <Input v-model="classroomList[currentClassroomIndex].hiteach" disabled :placeholder="$t('schoolBaseInfo.hiTeachHolder')" clearable />
-                           
+                            <vuescroll>
+                                <Form ref="classInfo" :model="classroomList[currentClassroomIndex]" :rules="classValidate" style="padding-top:20px;">
+                                    <FormItem prop="classroomCode">
+                                        <span slot="label" class="class-attr-wrap-label">{{$t('schoolBaseInfo.classroomCode')}}</span>
+                                        <Input v-model="classroomList[currentClassroomIndex].classroomCode" clearable :placeholder="$t('schoolBaseInfo.classroomCodeHolder')" />
+                                    </FormItem>
+                                    <FormItem prop="classroomName" :label="$t('schoolBaseInfo.classroomName')">
+                                        <span slot="label" class="class-attr-wrap-label">{{$t('schoolBaseInfo.classroomName')}}</span>
+                                        <Input v-model="classroomList[currentClassroomIndex].classroomName" clearable :placeholder="$t('schoolBaseInfo.classroomNameHolder')" />
+                                    </FormItem>
+                                    <FormItem prop="headMaster" :label="$t('schoolBaseInfo.headmaster')">
+                                        <span slot="label" class="class-attr-wrap-label">{{$t('schoolBaseInfo.headmaster')}}</span>
+                                        <Input v-model="classroomList[currentClassroomIndex].headMaster" clearable :placeholder="$t('schoolBaseInfo.headmasterHolder')" />
+                                    </FormItem>
+                                    <FormItem prop="periodCode" :label="$t('schoolBaseInfo.setPeriod')">
+                                        <span slot="label" class="class-attr-wrap-label">{{$t('schoolBaseInfo.setPeriod')}}</span>
+                                        <Select v-model="classroomList[currentClassroomIndex].periodCode" clearable>
+                                            <Option v-for="(item,index) in periodList" :value="item.periodCode" :key="index">{{ item.periodName }}</Option>
+                                        </Select>
+                                    </FormItem>
+                                    <FormItem prop="gradeCode" :label="$t('schoolBaseInfo.setGrade')">
+                                        <span slot="label" class="class-attr-wrap-label">{{$t('schoolBaseInfo.setGrade')}}</span>
+                                        <Select v-model="classroomList[currentClassroomIndex].gradeCode" clearable>
+                                            <Option v-for="(item,index) in fn.getPeriod($store.state.schoolBaseInfo.schoolBaseInfo,classroomList[currentClassroomIndex].periodCode).grades" :value="item.gradeCode" :key="index">{{ item.gradeName }}</Option>
+                                        </Select>
+                                    </FormItem>
+                                    <FormItem prop="hiteach" :label="$t('schoolBaseInfo.setHiteachCode')">
+                                        <span slot="label" class="class-attr-wrap-label">{{$t('schoolBaseInfo.setHiteachCode')}}</span>
+                                        <Input v-model="classroomList[currentClassroomIndex].hiteach" disabled :placeholder="$t('schoolBaseInfo.hiTeachHolder')" clearable />
+                                    </FormItem>
+                                </Form>
+                            </vuescroll>
                         </div>
                         <!--HiTeach序列号列表-->
                         <div class="hiteach-code-wrap">
@@ -205,6 +221,11 @@
                 </FormItem>
             </Form>
         </Modal>
+        <Modal v-model="delClassroomStatus"
+               title="删除教室"
+               @on-ok="delClassroom(delIndex)">
+            <p v-if="delIndex">确认删除 {{classroomListShow[delIndex].classroomName}} 吗?</p>
+        </Modal>
     </div>
 </template>
 
@@ -219,6 +240,21 @@
         data() {
             return {
                 fn,
+                classValidate: {
+                    classroomCode: [
+                        { required: true, message: '请设置教室编码', trigger: 'change' }
+                    ],
+                    classroomName: [
+                        { required: true, message: '请输入教室名称', trigger: 'change' }
+                    ],
+                    periodCode: [
+                        { required: true, message: '请设置学段', trigger: 'change' }
+                    ],
+                    gradeCode: [
+                        { required: true, message: '请设置年级', trigger: 'change' }
+                    ]
+                },
+                delClassroomStatus: false,
                 isListLoading: false,
                 isSaveLoading: false,
                 demoLoginInfo: {
@@ -341,7 +377,8 @@
                 maxScale: 3,
                 minScale: 0.4,
                 scaleStep: 0.1,
-                stopScale: false
+                stopScale: false,
+                delIndex: undefined
             }
         },
         methods: {
@@ -601,43 +638,64 @@
                 return false
             },
             saveClassroom() {
-                // this.classroomList[this.currentClassroomIndex]['schoolCode'] = this.demoLoginInfo.schoolCode
-                // this.classroomList[this.currentClassroomIndex]['scope'] = 'school'
-                this.classroomList[this.currentClassroomIndex]['scopeCode'] = this.demoLoginInfo.schoolCode
-                this.isSaveLoading = true
-                this.$api.schoolSetting.classroomSettingSaveOrUpdate(this.classroomList[this.currentClassroomIndex]).then(
-                    res => {
-                        if (res.error == null) {
-                            this.$Message.success(this.$t('schoolBaseInfo.csTips3'))
-                            this.updated = false
-                            this.isSaveLoading = false
-                        }
-                    },
-                    err => {
-                        this.isSaveLoading = false
+                this.$refs['classInfo'].validate((valid) => {
+                    if (!valid) {
+                        this.$Message.error('请先完善教室信息再保存!')
+                    } else {
+                        this.classroomList[this.currentClassroomIndex]['scopeCode'] = this.demoLoginInfo.schoolCode
+                        this.isSaveLoading = true
+                        this.isListLoading = true
+                        this.$api.schoolSetting.classroomSettingSaveOrUpdate(this.classroomList[this.currentClassroomIndex]).then(
+                            res => {
+                                if (res.error == null) {
+                                    this.$Message.success(this.$t('schoolBaseInfo.csTips3'))
+                                    this.classroomList[this.currentClassroomIndex].id = res.result.data.id
+                                    this.updated = false
+                                    this.isSaveLoading = false
+                                    this.isListLoading = false
+                                } else {
+                                    if (res.error.code == 4) {
+                                        this.$Message.error('教室编码已经存在,请重新设置教室编码!')
+                                        this.isSaveLoading = false
+                                        this.isListLoading = false
+                                    }
+                                }
+                            },
+                            err => {
+                                this.isSaveLoading = false
+                                this.isListLoading = false
+                            }
+                        )
                     }
-                )
+                })
+                
             },
             getClassroom() {
+                this.isListLoading = true
                 this.$store.dispatch('schoolBaseInfo/getClassroom').then(
                     (res) => {
-                        console.log(res)
                         if (res.code == 1 || res.code == 3) {
                             this.classroomList = this.$store.state.schoolBaseInfo.classroomList
                             this.filterClassname()
                         } else {
                             console.log(res)
                         }
+                        setTimeout(() => {
+                            this.isListLoading = false
+                        },500)
                     },
                     (err) => {
                         console.log(err)
+                        this.isListLoading = false
                     }
                 )
             },
-            /**显示确认删除对话框 */
-            showConfirmDelete() {
-
-            }, 
+            /**显示确认删除教室对话框 */
+            showConfirmDelete(index) {
+                this.delClassroomStatus = true
+                this.delIndex = index
+            },
+            
             delClassroom(index) {
                 this.isListLoading = true
                 if (this.classroomListShow[index].id) {
@@ -646,14 +704,20 @@
                     }).then(
                         (res) => {
                             if (res.error == null) {
-                                this.classroomList.splice(index, 1)
-                                this.classroomListShow.splice(index, 1)
-                                this.$Message.success(this.$t('schoolBaseInfo.csTips7'))
-                                this.updated = false
-                                this.isListLoading = false
                                 if (this.currentClassroomIndex >= index && index > 0) {
                                     this.currentClassroomIndex = 0
                                 }
+                                this.delIndex = undefined
+                                this.classroomList.splice(index, 1)
+                                this.classroomListShow.splice(index, 1)
+                                this.$Message.success(this.$t('schoolBaseInfo.csTips7'))
+                                //this.updated = false
+                                //this.isListLoading = false
+                                setTimeout(()=> {
+                                    this.isListLoading = false
+                                    this.updated = false
+                                },500)
+                                
                             }
                         },
                         (err) => {
@@ -664,12 +728,15 @@
                     if (this.currentClassroomIndex >= index && index > 0) {
                         this.currentClassroomIndex = 0
                     }
+                    this.delIndex = undefined
                     this.classroomList.splice(index, 1)
                     this.classroomListShow.splice(index, 1)
                     setTimeout(()=> {
                         this.isListLoading = false
+                        this.updated = false
                     },500)
                 }
+                
             },
             uploadSchoolPlan(res, file) {
                 this.$Message.success(this.$t('schoolBaseInfo.csTips5'))
@@ -779,11 +846,11 @@
                     classroomName: this.$t('schoolBaseInfo.presetClassroomName') + (this.classroomList.length + 1),
                     hiteach: '',
                     headMaster: this.$t('schoolBaseInfo.presetHeadmaster'),
-                    periodCode: '小学',
-                    gradeCode: '一年级',
+                    periodCode: '',
+                    gradeCode: '',
                     studentCount: 0,
-                    classroomType: '一般教室',
-                    classroomCode: '教室编码',
+                    classroomType: '暂无类型',
+                    classroomCode: '',
                     point: {
                         x: 5,
                         y: 5

+ 91 - 23
TEAMModelOS/ClientApp/src/view/school-mgmt/SystemSetting/SystemSetting.vue

@@ -92,7 +92,7 @@
                                     <Option v-for="(item,index) in dayList" :value="(item+1).toString()" :key="index">{{ (item+1).toString() }}</Option>
                                 </Select>
                             </div>
-                            <p class="term-item-students-num">{{$t('schoolBaseInfo.semesterDuration')+"156" + $t('schoolBaseInfo.dayUnit')  }}</p>
+                            <p class="term-item-students-num">{{$t('schoolBaseInfo.semesterDuration')+ item.days + $t('schoolBaseInfo.dayUnit')  }}</p>
                             <!--<div class="term-item-tool">
                             <Icon type="md-trash" :title="$t('schoolBaseInfo.delete')" @click.stop="delSemester(index)" />
                         </div>-->
@@ -196,6 +196,7 @@
         },
         data() {
             return {
+                updateDays: false,
                 isSaveLoading: false,
                 delSemesterStatus: false,
                 delPeriodStatus: false,
@@ -240,6 +241,24 @@
             }
         },
         methods: {
+            /**
+             * 计算两个日期的天数
+             * @param date1
+             * @param date2
+             */
+            getDays(date1 , date2){
+                var date1Str = date1.split("-");//将日期字符串分隔为数组,数组元素分别为年.月.日
+                //根据年 . 月 . 日的值创建Date对象
+                var date1Obj = new Date(date1Str[0],(date1Str[1]-1),date1Str[2]);
+                var date2Str = date2.split("-");
+                var date2Obj = new Date(date2Str[0],(date2Str[1]-1),date2Str[2]);
+                var t1 = date1Obj.getTime();
+                var t2 = date2Obj.getTime();
+                var dateTime = 1000*60*60*24; //每一天的毫秒数
+                var minusDays = Math.floor(((t2-t1)/dateTime));//计算出两个日期的天数差
+                var days = Math.abs(minusDays);//取绝对值
+                return days;
+            },
             /**确认删除学段提示框 */
             showComfirmDelPeriod() {
                 this.delPeriodStatus = true
@@ -266,11 +285,12 @@
             handleEditCampus(data, index) {
                 this.schoolSetting.campuses[index].campusName = data
             },
+            //添加校区
             addCampus() {
                 if (this.schoolSetting.campuses.length >= 2) {
                     this.$Message.error({
                         background: true,
-                        content: '对不起,系统授权最多设置两个校区!'
+                        content: '对不起,系统授权最多添加两个校区!'
                     })
                 } else {
                     this.schoolSetting.campuses.push({
@@ -292,6 +312,7 @@
             delSubject(index) {
                 this.schoolSetting.period[this.currentSchoolSysIndex].subjects.splice(index, 1)
             },
+            //删除学段
             delPeriod(index) {
                 if (this.currentSchoolSysIndex >= index && index > 0) {
                     this.currentSemesterIndex = 0
@@ -301,10 +322,15 @@
                     this.currentSchoolSysIndex = 0
                     this.currentSemesterIndex = 0
                     this.schoolSetting.period.splice(index, 1)
+                    setTimeout(() => {
+                        this.updated = false
+                    }, 500)
+                    this.saveData()
                 } else {
                     this.$Message.warning(this.$t('schoolBaseInfo.ssTips2'))
                 }
             },
+            //删除学期
             delSemester(index) {
                 if (this.schoolSetting.period[this.currentSchoolSysIndex].semesters.length > 1) {
                     this.currentSchoolSysIndex = 0
@@ -314,6 +340,7 @@
                     this.$Message.warning(this.$t('schoolBaseInfo.ssTips2'))
                 }
             },
+            //初始化数据
             initData() {
                 this.schoolSetting.schoolCode = this.demoLoginInfo.schoolCode
                 this.schoolSetting.schoolName = this.demoLoginInfo.school
@@ -360,15 +387,19 @@
                 })
                 this.updated = false
             },
+            //改变年级编辑状态
             changeGradeEditStatus(index) {
                 this.$refs.gradeName[index].handleEdit()
             },
+            //改变学科编辑状态
             changeSubjectEditStatus(index) {
                 this.$refs.subjectName[index].handleEdit()
             },
+            //选择学期
             chooseSemester(index) {
                 this.currentSemesterIndex = index
             },
+            //选择学段
             choosePeriod(index) {
                 this.currentSemesterIndex = 0
                 this.currentSchoolSysIndex = index
@@ -378,7 +409,34 @@
                         break
                     }
                 }
+                if (this.schoolSetting.period[this.currentSchoolSysIndex].semesters.length > 0) {
+                    if (!this.schoolSetting.period[this.currentSchoolSysIndex].semesters[0].days) {
+                        let count = 365
+                        let index = 0
+                        let year = new Date().getFullYear()
+                        for (let i = 0; i < this.schoolSetting.period[this.currentSchoolSysIndex].semesters.length; i++) {
+                            if (i == (this.schoolSetting.period[this.currentSchoolSysIndex].semesters.length - 1)) {
+                                index = i
+                                break
+                            } else {
+                                let sDate = year + '-' + this.schoolSetting.period[this.currentSchoolSysIndex].semesters[i].month + '-' + this.schoolSetting.period[this.currentSchoolSysIndex].semesters[i].day
+                                let eDate = year + '-' + this.schoolSetting.period[this.currentSchoolSysIndex].semesters[i+1].month + '-' + this.schoolSetting.period[this.currentSchoolSysIndex].semesters[i+1].day
+                                let d = this.getDays(sDate, eDate)
+                                console.log(d)
+                                count -= d
+                                this.updateDays = true
+                                this.$set(this.schoolSetting.period[this.currentSchoolSysIndex].semesters[i],'days',d)
+                                
+                            }
+                        }
+                        this.updateDays = true
+                        this.$set(this.schoolSetting.period[this.currentSchoolSysIndex].semesters[index], 'days', count)
+                        
+                    }
+                }
+                
             },
+            //保存数据
             saveData() {
                 this.handleData()
                 this.isSaveLoading = true
@@ -398,10 +456,32 @@
             getSchoolBaseData() {
                 this.$store.dispatch('schoolBaseInfo/getSchoolBaseData').then(
                     (res) => {
-                        console.log(res)
                         if (res.code == 1 || res.code == 3) {
                             this.isInit = true
                             this.schoolSetting = this.$store.state.schoolBaseInfo.schoolBaseInfo
+                            //计算学期天数
+                            if (this.schoolSetting.period[this.currentSchoolSysIndex].semesters.length > 0) {
+                                if (!this.schoolSetting.period[this.currentSchoolSysIndex].semesters[0].days) {
+                                    let count = 365
+                                    let index = 0
+                                    let year = new Date().getFullYear()
+                                    for (let i = 0; i < this.schoolSetting.period[this.currentSchoolSysIndex].semesters.length; i++) {
+                                        if (i == (this.schoolSetting.period[this.currentSchoolSysIndex].semesters.length - 1)) {
+                                            index = i
+                                            break
+                                        } else {
+                                            let sDate = year + '-' + this.schoolSetting.period[this.currentSchoolSysIndex].semesters[i].month + '-' + this.schoolSetting.period[this.currentSchoolSysIndex].semesters[i].day
+                                            let eDate = year + '-' + this.schoolSetting.period[this.currentSchoolSysIndex].semesters[i + 1].month + '-' + this.schoolSetting.period[this.currentSchoolSysIndex].semesters[i + 1].day
+                                            let d = this.getDays(sDate, eDate)
+                                            count -= d
+                                            this.$set(this.schoolSetting.period[this.currentSchoolSysIndex].semesters[i], 'days', d)
+
+                                        }
+                                    }
+                                    this.$set(this.schoolSetting.period[this.currentSchoolSysIndex].semesters[index], 'days', count)
+                                }
+                                this.updated = false
+                            }
                         } else {
                             // this.getDefaultData(true)//修改为本地读取默认数据
                             this.getLocalDefaultData()
@@ -409,7 +489,6 @@
                             this.schoolSetting.period[0].grades = JSON.parse(JSON.stringify(this.dataDefault.grades))
                             this.schoolSetting.period[0].subjects = JSON.parse(JSON.stringify(this.dataDefault.subjects))
                         }
-                        console.log(this.$store.state.schoolBaseInfo.schoolBaseInfo)
                     },
                     (err) => {
                         console.log(err)
@@ -515,28 +594,16 @@
                     this.$Message.info(this.$t('schoolBaseInfo.ssTips6'))
                 }
             },
-            async addPeriod() {
-                console.log(JSON.stringify(this.dataDefault))
+            addPeriod() {
                 if (JSON.stringify(this.dataDefault) == '{}') {
-                    // await this.getDefaultData()//修改为本地读取默认数据
                     this.getLocalDefaultData()
-                    console.log('1')
                     this.schoolSetting.period.push({
                         periodName: this.$t('schoolBaseInfo.presetPeriod') + (this.schoolSetting.period.length + 1),
                         periodCode: this.guid(),
                         gradeCount: 0,
                         semesterCount: 0,
                         subjectCount: 0,
-                        semesters: [
-                            // {
-                            //  semesterName: this.$t('schoolBaseInfo.persetSemester') + '1',
-                            //  semesterCode: this.guid(),
-                            //  studentCount: '学生人数',
-                            //  month: 1,
-                            //  // month: this.schoolSetting.period[this.currentSchoolSysIndex].semesters[this.currentSemesterIndex].month + 1,
-                            //  day: 26
-                            // }
-                        ],
+                        semesters: [],
                         grades: JSON.parse(JSON.stringify(this.dataDefault.grades)),
                         subjects: JSON.parse(JSON.stringify(this.dataDefault.subjects))
                     })
@@ -551,9 +618,8 @@
                             {
                                 semesterName: this.$t('schoolBaseInfo.persetSemester') + '1',
                                 semesterCode: this.guid(),
-                                studentCount: '学生人数',
+                                studentCount: 0,
                                 month: 1,
-                                // month: this.schoolSetting.period[this.currentSchoolSysIndex].semesters[this.currentSemesterIndex].month + 1,
                                 day: 26
                             }
                         ],
@@ -621,7 +687,6 @@
                         } else {
                             alert('API error!')
                         }
-                        console.log('0')
                     },
                     (err) => {
                         alert('API error!')
@@ -635,7 +700,6 @@
                     return item.lang == lang
                 })
                 this.dataDefault = result.length > 0 ? result[0] : {}
-                console.log(this.dataDefault)
             }
         },
         watch: {
@@ -644,7 +708,11 @@
                     if (this.isInit) {
                         this.isInit = false
                     } else {
-                        this.updated = true
+                        if (this.updateDays) {
+                            this.updateDays = false
+                        } else {
+                            this.updated = true
+                        }
                     }
                 },
                 deep: true

+ 1 - 32
TEAMModelOS/ClientApp/src/view/student-account/Index.vue

@@ -50,7 +50,7 @@
         </div>
         <!--学生账号table-->
         <div class="sc-content dark-iview-table" style="position:relative">
-            <Table ref="selection" :columns="tableColumns" :data="tableShowData" height="730" :loading="tableLoading" @on-select="getSelectInfo" @on-select-cancel="getSelectInfo" @on-select-all="getSelectInfo" @on-select-all-cancel="cancelAll">
+            <Table ref="selection" :columns="tableColumns" :data="tableShowData" height="730" :loading="tableLoading" @on-selection-change="getSelectInfo">
                 <Loading slot="loading"></Loading>
                 <template slot-scope="{ row,index }" slot="status">
                     <Icon v-if="index % 3 == 1" type="md-checkmark-circle-outline" size="18" color="#1CD0A1" />
@@ -194,10 +194,6 @@
             },
             /**根据学段、年级、班级搜索 */
             filterStudentInfo() {
-                console.log('------')
-                console.log(this.searchPeriod)
-                console.log(this.searchGrade)
-                console.log(this.searchClassroom)
                 if (this.searchClassroom !== '' && this.searchClassroom !== undefined) {
                     let findCountParams = {
                         "collectionName": "CoreStudent",
@@ -234,7 +230,6 @@
                     classroomCodes = classrooms.map((item) => {
                         return item.classroomCode
                     })
-                    console.log(this.classroomCodes)
                     if (classroomCodes.length == 0) {
                         if (this.searchPeriod == '' || this.searchPeriod == undefined) {
                             let findCountParams = {
@@ -275,27 +270,6 @@
                         this.baseFindStudent(params)
                     }
                 }
-                //let grade = ''
-                //if (this.searchPeriod == undefined) {
-                //    this.searchPeriod = ''
-                //}
-                //if (this.searchGrade == undefined || this.searchGrade == '') {
-                //    this.grade = ''
-                //} else {
-                //    grade = '"gradeCode":' + '"' + this.searchGrade + '"'
-                //}
-                //if (this.searchClassroom == undefined) {
-                //    this.searchClassroom = ''
-                //}
-                //this.tableLoading = true
-                //this.tableShowData = this.tableData.filter(
-                //    item => {
-                //        return JSON.stringify(item).indexOf(this.searchPeriod) !== -1 && JSON.stringify(item).indexOf(grade) !== -1 && JSON.stringify(item).indexOf(this.searchClassroom) !== -1
-                //    }
-                //)
-                //this.currentPage = 1
-                ////this.getPageData()
-                //this.tableLoading = false
 
             },
             cancelAll() {
@@ -364,8 +338,6 @@
                     this.editStudentInfo = []
                     let objStr = JSON.stringify(this.tableShowData[index])
                     this.editStudentInfo.push(JSON.parse(objStr))
-                    console.log('single')
-                    console.log(this.editStudentInfo)
                     this.tableShowData[index]._checked = true
                     this.$forceUpdate()
                     this.addStudentStatus = true
@@ -373,9 +345,6 @@
                     if (this.selections.length > 0) {
                         this.editStudentInfo.length = 0
                         this.editStudentInfo = [...this.selections]
-                        console.log(this.selections)
-                        console.log('selections')
-                        console.log(this.editStudentInfo)
                         this.addStudentStatus = true
                     }
                     else {

+ 2 - 1
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/EvaluationList/TotalIndex.vue

@@ -516,7 +516,8 @@
         background: none !important;
         border: none !important;
         padding: 0 !important;
-        width:1836px;
+        width:1770px;
+        /*width:1836px;*/
 
     }
 

+ 58 - 53
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/TestAnalysis/QuestionList.vue

@@ -3,7 +3,7 @@
         <!-- 左侧题目列表清单 -->
         <div class="ql-left-box">
             <!--<p style="font-size:28px;text-align:center;margin:20px 0">芳草小学2019年5月期中考试数学试卷</p>
-    <p style="font-size:16px;text-align:center">考试时间:120分钟&nbsp;&nbsp;&nbsp;出卷人:张纪中</p>-->
+            <p style="font-size:16px;text-align:center">考试时间:120分钟&nbsp;&nbsp;&nbsp;出卷人:张纪中</p>-->
 
             <span class="btn-back" @click="handleBackTo" ref="btnBack"><Icon type="ios-arrow-back" />{{$t('totalAnalysis.ql_text13')}}</span>
             <Loading :top="300" v-show="dataLoading" type="3"></Loading>
@@ -29,30 +29,31 @@
 
                 <!-- 如果是组合题 -->
                 <!--<div v-if="question.children.length">
-            <div v-for="(childQuestion,childIndex) in question.children" :key="childIndex">
-                <div class="item-question" style="margin-top:20px;">
-                    <p>{{childIndex+1}} : <span v-html="childQuestion.question"></span></p>
-                </div>
-                <div v-for="(childOption,childOptionIndex) in childQuestion.option" :key="childOptionIndex" style="margin:10px 0">
-                    <p>{{String.fromCharCode(64 + parseInt(childOptionIndex+1))}} : <span v-html="childOption.value"></span></p>
-                </div>
-                <div class="item-concept" style="margin-top:20px;">
-                </div>
-                <div class="item-answer">
-                    <span class="item-header-title">【答案】:</span>
-                    <span v-html="childQuestion.answer[0] || childQuestion.answer" v-if="childQuestion.type === 'Subjective'"></span>
-                    <span :class="[ childQuestion.type === 'Complete' ? 'item-answer-item':'']" v-for="(answer,answerIndex) in childQuestion.answer" :key="answerIndex" v-else-if="childQuestion.type == 'Complete'" v-html="answer"></span>
-                    <span :class="[ childQuestion.type === 'Complete' ? 'item-answer-item':'']" v-for="(answer,answerIndex) in childQuestion.answer" :key="answerIndex" v-else>{{answer}}</span>
-                </div>
-                <div class="item-explain">
-                    <div class="item-header-title">【解析】:</div>
-                    <div v-html="childQuestion.explain"></div>
-                </div>
-            </div>
-        </div>-->
+                    <div v-for="(childQuestion,childIndex) in question.children" :key="childIndex">
+                        <div class="item-question" style="margin-top:20px;">
+                            <p>{{childIndex+1}} : <span v-html="childQuestion.question"></span></p>
+                        </div>
+                        <div v-for="(childOption,childOptionIndex) in childQuestion.option" :key="childOptionIndex" style="margin:10px 0">
+                            <p>{{String.fromCharCode(64 + parseInt(childOptionIndex+1))}} : <span v-html="childOption.value"></span></p>
+                        </div>
+                        <div class="item-concept" style="margin-top:20px;">
+                        </div>
+                        <div class="item-answer">
+                            <span class="item-header-title">【答案】:</span>
+                            <span v-html="childQuestion.answer[0] || childQuestion.answer" v-if="childQuestion.type === 'Subjective'"></span>
+                            <span :class="[ childQuestion.type === 'Complete' ? 'item-answer-item':'']" v-for="(answer,answerIndex) in childQuestion.answer" :key="answerIndex" v-else-if="childQuestion.type == 'Complete'" v-html="answer"></span>
+                            <span :class="[ childQuestion.type === 'Complete' ? 'item-answer-item':'']" v-for="(answer,answerIndex) in childQuestion.answer" :key="answerIndex" v-else>{{answer}}</span>
+                        </div>
+                        <div class="item-explain">
+                            <div class="item-header-title">【解析】:</div>
+                            <div v-html="childQuestion.explain"></div>
+                        </div>
+                    </div>
+                </div>-->
 
                 <Collapse simple @on-change="handleCollapseChange">
                     <Panel :name="index+'answer'">
+                        <!-- 查看答案与解析 -->
                         <span>{{$t('totalAnalysis.ql_text9')}}</span>
                         <div class="answerAndExplain" slot="content" style="margin-top:10px;margin-left: 25px;">
                             <div class="item-answer" v-show="question.type !== 'Compose'">
@@ -63,21 +64,22 @@
                             </div>
                             <div class="item-explain" v-show="question.type !== 'Compose'">
                                 <div class="item-header-title">【{{$t('totalAnalysis.ql_text12')}}】</div>
-                                <div v-html="question.explain"></div>
+                                <div v-html="question.explain || '暂无解析'"></div>
                             </div>
                         </div>
                     </Panel>
                     <Panel :name="index+''">
-                <span>{{$t('totalAnalysis.ql_text10')}}</span>
-                <div class="answerAndExplain" slot="content" style="margin-top:10px" v-if="collapseList.indexOf(index.toString()) > -1">
-                    <Table :columns="dataColumns" :data="tableData.filter((item,index2) => index2 === index)"></Table>
-                    <Table :columns="optionColumns" :data="optionsData" style="margin-top:20px"></Table>
-                    <div class="analysis-charts">
-                        <BaseLine :ids="'myLine' + index" :echartsData="tableData[index]"></BaseLine>
-                        <BaseRateLine :ids="'myRateLine' + index" :echartsData="optionsData"></BaseRateLine>
-                    </div>
-                </div>
-            </Panel>
+                        <!-- 查看数据分析 -->
+                        <span>{{$t('totalAnalysis.ql_text10')}}</span>
+                        <div class="answerAndExplain" slot="content" style="margin-top:10px" v-if="collapseList.indexOf(index.toString()) > -1">
+                            <Table :columns="dataColumns" :data="tableData.filter((item,index2) => index2 === index)"></Table>
+                            <Table :columns="optionColumns" :data="optionsData" style="margin-top:20px"></Table>
+                            <div class="analysis-charts">
+                                <BaseLine :ids="'myLine' + index" :echartsData="tableData[index]"></BaseLine>
+                                <BaseRateLine :ids="'myRateLine' + index" :echartsData="optionsData"></BaseRateLine>
+                            </div>
+                        </div>
+                    </Panel>
                 </Collapse>
 
             </div>
@@ -194,7 +196,7 @@
                         title: '鉴别度',
                         key: 'identify',
                         align: 'center',
-                        render: function(h, params) {
+                        render: function (h, params) {
                             return h('span', (Number(params.row.identify)).toFixed(2))
                         }
                     },
@@ -207,64 +209,64 @@
                         title: '高分组正答率',
                         align: 'center',
                         key: 'PH',
-                        render: function(h, params) {
-                            return h('span', (Number(params.row.PH)).toFixed(2) * 100 + '%')
+                        render: function (h, params) {
+                            return h('span', ((Number(params.row.PH)) * 100).toFixed(0) + '%')
                         }
                     },
                     {
                         title: '低分组正答率',
                         align: 'center',
                         key: 'PL',
-                        render: function(h, params) {
-                            return h('span', (Number(params.row.PL)).toFixed(2) * 100 + '%')
+                        render: function (h, params) {
+                            return h('span', ((Number(params.row.PL)) * 100).toFixed(0) + '%')
                         }
                     },
                     {
                         title: 'R1',
                         align: 'center',
                         key: 'R1',
-                        render: function(h, params) {
-                            return h('span', (Number(params.row.R1)).toFixed(2) * 100 + '%')
+                        render: function (h, params) {
+                            return h('span', ((Number(params.row.R1)) * 100).toFixed(0) + '%')
                         }
                     },
                     {
                         title: 'R2',
                         key: 'R2',
                         align: 'center',
-                        render: function(h, params) {
-                            return h('span', (Number(params.row.R2)).toFixed(2) * 100 + '%')
+                        render: function (h, params) {
+                            return h('span', ((Number(params.row.R2)) * 100).toFixed(0) + '%')
                         }
                     },
                     {
                         title: 'R3',
                         align: 'center',
                         key: 'R3',
-                        render: function(h, params) {
-                            return h('span', (Number(params.row.R3)).toFixed(2) * 100 + '%')
+                        render: function (h, params) {
+                            return h('span', ((Number(params.row.R3)) * 100).toFixed(0) + '%')
                         }
                     },
                     {
                         title: 'R4',
                         align: 'center',
                         key: 'R4',
-                        render: function(h, params) {
-                            return h('span', (Number(params.row.R4)).toFixed(2) * 100 + '%')
+                        render: function (h, params) {
+                            return h('span', ((Number(params.row.R4)) * 100).toFixed(0) + '%')
                         }
                     },
                     {
                         title: 'R5',
                         align: 'center',
                         key: 'R5',
-                        render: function(h, params) {
-                            return h('span', (Number(params.row.R5)).toFixed(2) * 100 + '%')
+                        render: function (h, params) {
+                            return h('span', ((Number(params.row.R5)) * 100).toFixed(0) + '%')
                         }
                     },
                     {
                         title: 'R6',
                         align: 'center',
                         key: 'R6',
-                        render: function(h, params) {
-                            return h('span', (Number(params.row.R6)).toFixed(2) * 100 + '%')
+                        render: function (h, params) {
+                            return h('span', ((Number(params.row.R6)) * 100).toFixed(0) + '%')
                         }
                     }
                 ],
@@ -299,7 +301,7 @@
                         title: '高分组选答率',
                         align: 'center',
                         key: 'PH',
-                        render: function(h, params) {
+                        render: function (h, params) {
                             return h('span', params.row.PH + '%')
                         }
                     },
@@ -307,7 +309,7 @@
                         title: '低分组选答率',
                         align: 'center',
                         key: 'PL',
-                        render: function(h, params) {
+                        render: function (h, params) {
                             return h('span', params.row.PL + '%')
                         }
                     }
@@ -322,6 +324,7 @@
             let parentVm = this.$parent.$parent.$parent
             parentVm.isShowQuestions = true
             this.$store.dispatch('getExamPaper').then(res => {
+                console.log(res)
                 this.rightTableData = this.$store.state.totalAnalysis.classList
                 this.questionList = res[0].item
                 this.SingleList = this.questionList.filter(item => item.type === 'Single')
@@ -338,7 +341,7 @@
                         let index = +this.$route.query.QIndex - 1
                         this.handleCollapseChange([index.toString()])
                         this.activeCollapseIndex.push(index + 'answer')
-                        setTimeout(function() {
+                        setTimeout(function () {
                             that.$refs['indexRef' + index][0].click() // 根据路由携带的题序 来触发对应题序的点击事件 完成滚动
                         }, 1000)
                     })
@@ -362,6 +365,8 @@
 
             let testScatter = this.$store.state.totalAnalysis.testScatter
 
+            console.log(this.tableData)
+
             this.optionsData = [
                 {
                     option: 'A',

+ 12 - 18
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/TestAnalysis/TestAnalysis.vue

@@ -150,7 +150,7 @@
                         title: this.$t('totalAnalysis.ta_table_text6'),
                         key: 'identify',
                         renderType: function(h, params) {
-                            return h('span', Number(params.row.identify).toFixed(2))
+                            return h('span', Number(params.row.identify).toFixed(0))
                         },
                         minWidth: 120
                     },
@@ -159,7 +159,7 @@
                         key: 'R1',
                         sortable: true,
                         renderType: function(h, params) {
-                            return h('span', (Number(params.row.R1) * 100).toFixed(2) + '%')
+                            return h('span', (Number(params.row.R1) * 100).toFixed(0) + '%')
                         },
                         minWidth: 100
                     },
@@ -168,7 +168,7 @@
                         key: 'R2',
                         sortable: true,
                         renderType: function(h, params) {
-                            return h('span', (Number(params.row.R2) * 100).toFixed(2) + '%')
+                            return h('span', (Number(params.row.R2) * 100).toFixed(0) + '%')
                         },
                         minWidth: 100
                     },
@@ -177,7 +177,7 @@
                         sortable: true,
                         key: 'R3',
                         renderType: function(h, params) {
-                            return h('span', (Number(params.row.R3) * 100).toFixed(2) + '%')
+                            return h('span', (Number(params.row.R3) * 100).toFixed(0) + '%')
                         },
                         minWidth: 100
                     },
@@ -186,7 +186,7 @@
                         sortable: true,
                         key: 'R4',
                         renderType: function(h, params) {
-                            return h('span', (Number(params.row.R4) * 100).toFixed(2) + '%')
+                            return h('span', (Number(params.row.R4) * 100).toFixed(0) + '%')
                         },
                         minWidth: 100
                     },
@@ -195,7 +195,7 @@
                         sortable: true,
                         key: 'R5',
                         renderType: function(h, params) {
-                            return h('span', (Number(params.row.R5) * 100).toFixed(2) + '%')
+                            return h('span', (Number(params.row.R5) * 100).toFixed(0) + '%')
                         },
                         minWidth: 100
                     },
@@ -204,7 +204,7 @@
                         sortable: true,
                         key: 'R6',
                         renderType: function(h, params) {
-                            return h('span', (Number(params.row.R6) * 100).toFixed(2) + '%')
+                            return h('span', (Number(params.row.R6) * 100).toFixed(0) + '%')
                         },
                         minWidth: 100
                     }
@@ -222,7 +222,7 @@
                         key: 'PH',
                         sortable: true,
                         renderType: function(h, params) {
-                            return h('span', (Number(params.row.PH) * 100).toFixed(2) + '%')
+                            return h('span', (Number(params.row.PH) * 100).toFixed(0) + '%')
                         },
                         width: 150
                     },
@@ -231,22 +231,16 @@
                         key: 'PL',
                         sortable: true,
                         renderType: function(h, params) {
-                            return h('span', (Number(params.row.PL) * 100).toFixed(2) + '%')
+                            return h('span', (Number(params.row.PL) * 100).toFixed(0) + '%')
                         },
                         width: 150
                     },
-                    // {
-                    //    title: this.$t('totalAnalysis.ta_table_text7'),
-                    //    key: 'classScoreRate',
-                    //    sortable: true,
-                    //    width: 150
-                    // },
                     {
                         title: this.$t('totalAnalysis.ta_table_text8'),
                         key: 'gradeScoreRate',
                         sortable: true,
                         renderType: function(h, params) {
-                            return h('span', (Number(params.row.gradeScoreRate)).toFixed(2) + '%')
+                            return h('span', (Number(params.row.gradeScoreRate)).toFixed(0) + '%')
                         },
                         width: 150
                     },
@@ -255,7 +249,7 @@
                         key: 'areaScoreRate',
                         sortable: true,
                         renderType: function(h, params) {
-                            return h('span', (Number(params.row.areaScoreRate)).toFixed(2) + '%')
+                            return h('span', (Number(params.row.areaScoreRate)).toFixed(0) + '%')
                         },
                         width: 150
                     }
@@ -276,7 +270,7 @@
                         sortable: 'custom',
                         key: item,
                         render: (h, params) => {
-                            return h('span', (Number(params.row[item])).toFixed(2) + '%')
+                            return h('span', (Number(params.row[item])).toFixed(0) + '%')
                         },
                         minWidth: 150
                     }

+ 10 - 4
TEAMModelOS/ClientApp/src/view/syllabus/newSyllabus/Index.vue

@@ -4,6 +4,7 @@
 
 <template>
     <div class="new-syllabus-container">
+        <Loading :top="200" bgColor="rgba(103, 103, 103, 0.27)" type="1" v-if="isLoading"></Loading>
         <!-- 课纲头部 切换来源以及选择学段 -->
         <div class="new-syllabus-header">
             <div>
@@ -109,8 +110,8 @@
                                 <p class="gl-item-info">{{item.gradeName}}<span></span>{{item.semesterName}}</p>
                                 <p class="gl-item-info">共编使用者:{{item.editors ? item.editors.length : '0'}}</p>
                                 <div class="count-nums">
-                                    <Icon type="md-folder" title="内容资源数" style="margin-left:0" /> {{ item.itemCount }}
-                                    <Icon type="md-cube" title="关联知识点数" /> {{ item.resourceCount }}
+                                    <Icon type="md-folder" title="内容资源数" style="margin-left:0" /> {{ item.resourceCount }}
+                                    <Icon type="md-cube" title="关联题目数" /> {{ item.itemCount }}
                                 </div>
                                 <span class="btn-edit" v-if="$access.can('admin.*|Volumn_Edit') || tabIndex === 1" title="编辑" @click.stop="onEditVolume(item)"><Icon type="md-create" size="20" color="#d2d2d2" /></span>
                                 <span class="btn-users" v-if="$access.can('admin.*|Volumn_Edit') || tabIndex === 1" title="共编使用者管理" @click.stop="onEditEditors(item)"><Icon type="md-people" size="22" color="#d2d2d2" /></span>
@@ -192,6 +193,7 @@
                 isLoadSubject: false,
                 isLoadVolumes: false,
                 isLoadSyllabus: false,
+                isLoading:false,
                 volumnCounts: [],
                 currentPeriodIndex: null,
                 currentSubjectIndex: null,
@@ -261,8 +263,8 @@
                         if (!res.error) {
                             this.$nextTick(() => {
                                 this.volumnCounts = res.result.data
-                                this.schoolVolCount = res.result.data[this.currentPeriodIndex].map(i => i[0])
-                                this.privateVolCount = res.result.data[this.currentPeriodIndex].map(i => i[1])
+                                this.schoolVolCount = res.result.data[this.currentPeriodIndex || 0].map(i => i[0])
+                                this.privateVolCount = res.result.data[this.currentPeriodIndex || 0].map(i => i[1])
                             })
                         } else {
                             this.$Message.warning('获取数据失败')
@@ -389,11 +391,15 @@
                     okText: '确认',
                     cancelText: '取消',
                     onOk: () => {
+                        this.isLoading = true
                         this.$api.syllabus.DeleteVolume(data).then(res => {
                             if (res.result.data) {
                                 this.volumeList.splice(this.volumeList.indexOf(data), 1)
                                 this.$Message.success('删除成功')
                                 this.handleVolumeTap(0, this.volumeList.length ? this.volumeList[0] : null)
+                                this.volumnCounts = []
+                                this.initSyllabusCount()
+                                this.isLoading = false
                             } else {
                                 this.$Message.success('删除失败')
                             }

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 21 - 10
TEAMModelOS/ClientApp/src/view/teachermgmt/components/personnel/Index.vue


+ 36 - 16
TEAMModelOS/Controllers/Core/ClassRoomController.cs

@@ -11,6 +11,7 @@ using TEAMModelOS.SDK.Module.AzureCosmosDB.Interfaces;
 using TEAMModelOS.SDK.Module.AzureCosmosDBV3;
 using TEAMModelOS.SDK.Helper.Common.ValidateHelper;
 using TEAMModelOS.SDK.Helper.Common.CollectionHelper;
+using System.Linq;
 
 namespace TEAMModelOS.Controllers.Syllabus
 {
@@ -26,22 +27,42 @@ namespace TEAMModelOS.Controllers.Syllabus
         public async ValueTask<BaseJosnRPCResponse> SaveOrUpdate(JosnRPCRequest<Classroom> request)
         {
             JsonRPCResponseBuilder builder = JsonRPCResponseBuilder.custom();
-            
+            List<Student> students = null;
+
             if (request.@params.id != null)
             {
                 await cosmosrepository.SaveOrUpdate(request.@params);
-
+                students = await cosmosrepository.FindByDict<Student>(new Dictionary<string, object>() { { "classroomCode", request.@params.classroomCode }, { "schoolCode", request.@params.scopeCode } });
             }
             else
             {
+                List<Classroom> sc = await cosmosrepository.FindByDict<Classroom>(new Dictionary<string, object> { { "classroomCode", request.@params.classroomCode },{ "scopeCode", request.@params.scopeCode } });
+                if (sc.IsNotEmpty()) {
+                    throw new  BizException("°à¼¶´úÂëÒѾ­´æÔÚ£¡",ResponseCode.DATA_EXIST);
+                }
                 request.@params.id = Guid.NewGuid().ToString();
-                ClassroomStudent students = new ClassroomStudent();
-                students.scopeCode = request.@params.scopeCode;
-                students.id = request.@params.classroomCode;
-                await cosmosrepository.SaveOrUpdate<ClassroomStudent>(students);
+
                 await cosmosrepository.SaveOrUpdate<Classroom>(request.@params);
                 
             }
+            ClassroomStudent classroomStudent = new ClassroomStudent();
+            List<ClassroomStudent> classroomStudents = await cosmosrepository.FindByDict<ClassroomStudent>(new Dictionary<string, object> { { "id", request.@params.classroomCode }, { "scopeCode", request.@params.scopeCode } });
+            if (classroomStudents.IsNotEmpty())
+            {
+                classroomStudent = classroomStudents[0];
+                if (students.IsNotEmpty()) {
+                    students.ForEach(x=> {
+                        if (!classroomStudent.studentId.Contains(x.studentId)) {
+                            classroomStudent.studentId.Add(x.studentId);
+                        }
+                    });
+                }
+            }
+            else {
+                classroomStudent.scopeCode = request.@params.scopeCode;
+                classroomStudent.id = request.@params.classroomCode;
+            }
+            await cosmosrepository.SaveOrUpdate<ClassroomStudent>(classroomStudent);
             return builder.Data(request.@params).build();
         }
 
@@ -65,16 +86,15 @@ namespace TEAMModelOS.Controllers.Syllabus
                 List<Classroom> sc = await cosmosrepository.FindByDict<Classroom>(request.@params);
                 if (sc.IsNotEmpty())
                 {
-                    List<ClassroomStudent> students = new List<ClassroomStudent>();
-                    foreach (Classroom classroom in sc)
-                    {
-                        List<ClassroomStudent> classroomStudents = await cosmosrepository.FindByDict<ClassroomStudent>(new Dictionary<string, object> { { "id", classroom.classroomCode }, { "scopeCode", classroom.scopeCode } });
-                        students.AddRange(classroomStudents);
-                    }
-                    if (students.Count > 0)
-                    {
-                        await cosmosrepository.DeleteAll<ClassroomStudent>(students);
-                    }
+                    //List<IdPk> students = new List<IdPk>();
+                    //foreach (Classroom classroom in sc)
+                    //{
+                    //   // List<ClassroomStudent> classroomStudents = await cosmosrepository.FindByDict<ClassroomStudent>(new Dictionary<string, object> { { "id", classroom.classroomCode }, { "scopeCode", classroom.scopeCode } });
+                    //    students.AddRange(classroomStudents.Select(x=>new IdPk {id=x.id,pk=x.scopeCode }));
+                    //}
+                    List<IdPk> students = new List<IdPk>();
+                    students.AddRange(sc.Select(x => new IdPk { id = x.classroomCode, pk = x.scopeCode }));
+                    await cosmosrepository.DeleteAll<ClassroomStudent>(students);
                     List<IdPk> idPks = await cosmosrepository.DeleteAll<Classroom>(sc);
                     builder.Data(idPks);
                 }

+ 44 - 2
TEAMModelOS/Controllers/Core/ClassroomStudentController.cs

@@ -27,6 +27,40 @@ namespace TEAMModelOS.Controllers.Core
             _cosmos = cosmos;
         }
 
+        /// <summary>
+        ///  获取实时的学生-班级关联信息
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpPost("OnTime")]
+        public async Task<BaseJosnRPCResponse> ClassroomStudentOnTime(JosnRPCRequest<Dictionary<string,string>> request) {
+            JsonRPCResponseBuilder builder = JsonRPCResponseBuilder.custom();
+            if (request.@params.TryGetValue("classroomCode", out string classroomCode) &&
+                request.@params.TryGetValue("scopeCode", out string scopeCode))
+            {
+                List<ClassroomStudent> classroomStudents = await _cosmos.FindByDict<ClassroomStudent>(new Dictionary<string, object> { { "id", classroomCode }, { "scopeCode", scopeCode } });
+                List<Student> students = await _cosmos.FindByDict<Student>(new Dictionary<string, object>() { { "classroomCode", classroomCode }, { "schoolCode", scopeCode } });
+                ClassroomStudent classroomStudent = new ClassroomStudent() { id = classroomCode, scopeCode = scopeCode };
+                if (classroomStudents.IsNotEmpty())
+                {
+                    classroomStudent = classroomStudents[0];
+                    if (students.IsNotEmpty())
+                    {
+                        students.ForEach(x =>
+                        {
+                            if (!classroomStudent.studentId.Contains(x.studentId))
+                            {
+                                classroomStudent.studentId.Add(x.studentId);
+                            }
+                        });
+                    }
+                }
+                classroomStudent = await _cosmos.SaveOrUpdate(classroomStudent);
+                return builder.Data(classroomStudent).build();
+            }
+            else { throw new BizException("参数异常classroomCode,scopeCode", ResponseCode.PARAMS_ERROR); }
+          
+        }
 
         /// <summary>
         /// 保存 或 修改 教室学生关联
@@ -66,7 +100,13 @@ namespace TEAMModelOS.Controllers.Core
                     List<ClassroomStudent> classroomStudents = await _cosmos.FindByDict<ClassroomStudent>(new Dictionary<string, object> { { "id", classroomStudent.Key } });
                     foreach (var classroomStudent1 in classroomStudent) 
                     {
-                        classroomStudents[0].studentId.UnionWith(classroomStudent1.studentId);
+                        classroomStudent1.studentId.ForEach(x=> {
+                            if (!classroomStudents[0].studentId.Contains(x)) {
+                                classroomStudents[0].studentId.Add(x);
+                            }
+                        });
+                      
+                      //  classroomStudents[0].studentId.UnionWith(classroomStudent1.studentId);
                     }
                     classroomStudents1.AddRange(classroomStudents);
                 }
@@ -93,7 +133,9 @@ namespace TEAMModelOS.Controllers.Core
                     List<ClassroomStudent> classroomStudents = await _cosmos.FindByDict<ClassroomStudent>(new Dictionary<string, object> { { "id", item1.id } });
                     foreach (ClassroomStudent item2 in classroomStudents)
                     {
-                        item2.studentId.ExceptWith(item1.studentId);
+                        item1.studentId.ForEach(x=> { item2.studentId.Remove(x); });
+
+                       // item2.studentId.ExceptWith(item1.studentId);
                     }
                     classroomStudents1.AddRange(classroomStudents);
                 }

+ 93 - 88
TEAMModelOS/Controllers/Core/StudentController.cs

@@ -16,6 +16,7 @@ using TEAMModelOS.SDK.Helper.Security.TmdCrypt;
 using TEAMModelOS.SDK.Module.AzureCosmosDBV3;
 using TEAMModelOS.SDK.Helper.Common.ValidateHelper;
 using TEAMModelOS.SDK.Context.Exception;
+using OpenXmlPowerTools;
 
 namespace TEAMModelOS.Controllers.Syllabus
 {
@@ -40,26 +41,35 @@ namespace TEAMModelOS.Controllers.Syllabus
                 request.@params.password.value = TmdCrypt.Encrypt(request.@params.password.value);
                 request.@params.password.isSet = true;
             }
-            //Classroom classroom = new Classroom
-            //{
-            //    classroomCode = request.@params.classroom.classroomCode,
-            //    gradeCode = request.@params.classroom.gradeCode,
-            //    periodCode = request.@params.classroom.periodCode,
-            //    scopeCode = request.@params.classroom.scopeCode,
-            //};
-            request.@params.id = request.@params.studentId.Replace("#","-");
-            //request.@params.classroom = classroom;
+            request.@params.id = request.@params.studentId.Replace("#", "-");
+            ///假如更新了班级则先获取更新之前的班级
+            var olStudent= await azureCosmosDBRepository.FindById<Student>(request.@params.studentId,false);
+            if (olStudent != null && !olStudent.classroomCode.Equals(request.@params.classroomCode) ) {
+                ClassroomStudent classroomstu=await azureCosmosDBRepository.FindById<ClassroomStudent>(olStudent.classroomCode);
+                if (classroomstu != null) {
+                    if (classroomstu.studentId.Contains(request.@params.studentId)) {
+                        classroomstu.studentId.Remove(request.@params.studentId);
+                        await azureCosmosDBRepository.SaveOrUpdate(classroomstu);
+                    }
+                }
+            }
+           
             Student data = await azureCosmosDBRepository.SaveOrUpdate<Student>(request.@params);
             ///更新学生关系表
-            ClassroomStudent classroomStudent = await azureCosmosDBRepository.FindById<ClassroomStudent>(data.classroomCode);
+            ClassroomStudent classroomStudent = await azureCosmosDBRepository.FindById<ClassroomStudent>(data.classroomCode,false);
             if (classroomStudent == null)
             {
-                classroomStudent = new ClassroomStudent { id = data.classroomCode, scopeCode = data.schoolCode, studentId = new HashSet<string> { data.studentId } };
+                classroomStudent = new ClassroomStudent { id = data.classroomCode, scopeCode = data.schoolCode, studentId = new List<string> { data.studentId } };
             }
             else {
-                classroomStudent.studentId.UnionWith(new List<string> { data.studentId });
+                if (!classroomStudent.studentId.Contains(data.studentId))
+                {
+                    classroomStudent.studentId.Add(data.studentId);
+                    await azureCosmosDBRepository.SaveOrUpdate(classroomStudent);
+                }
+               // classroomStudent.studentId.UnionWith(new List<string> { data.studentId });
             }
-            await azureCosmosDBRepository.SaveOrUpdate(classroomStudent);
+           
             return builder.Data(data).build();
         }
 
@@ -84,7 +94,35 @@ namespace TEAMModelOS.Controllers.Syllabus
         {
             JsonRPCResponseBuilder builder = JsonRPCResponseBuilder.custom();
 
-            if (ValidateHelper.IsValid(request.@params)) {
+            if (ValidateHelper.IsValid(request.@params) && request.@params.IsNotEmpty()) {
+
+                ///假如更新了班级则先获取更新之前的班级
+                string[] ids = request.@params.Select(x=>x.studentId).ToArray();
+                List<Student> oldStudent = await azureCosmosDBRepository.FindByDict<Student>(new Dictionary<string, object>() { { "studentId", ids } });
+                if (oldStudent.IsNotEmpty()) {
+                    foreach (var old in oldStudent.GroupBy(x=>x.classroomCode))
+                    {
+                        List<string> idsold = new List<string>();
+                        foreach (var oldstu in old) {
+                            Student student = request.@params.Where(x => x.studentId == oldstu.studentId).FirstOrDefault();
+                            if (student != null)
+                            {
+                                if (!student.classroomCode.Equals(oldstu.classroomCode))
+                                {
+                                    idsold.Add(student.studentId);
+                                }
+                            }
+                        }
+                        ClassroomStudent classroomStudent = await azureCosmosDBRepository.FindById<ClassroomStudent>(old.Key, false);
+                        if (classroomStudent != null) {
+                            idsold.ForEach(x => {
+                                classroomStudent.studentId.Remove(x);
+                            });
+                            await azureCosmosDBRepository.SaveOrUpdate(classroomStudent);
+                        }
+                    }
+                }
+
                 long createDate = DateTimeOffset.UtcNow.Ticks;
                 request.@params.ForEach(
                     x => {
@@ -103,64 +141,25 @@ namespace TEAMModelOS.Controllers.Syllabus
                 foreach (var classroom in students.GroupBy(x => x.classroomCode).ToList())
                 {
 
-                    ClassroomStudent classroomStudent = await azureCosmosDBRepository.FindById<ClassroomStudent>(classroom.Key);
+                    ClassroomStudent classroomStudent = await azureCosmosDBRepository.FindById<ClassroomStudent>(classroom.Key,false);
                     if (classroomStudent == null)
                     {
-                        classroomStudent = new ClassroomStudent { id = classroom.Key,studentId= new HashSet<string>()};
+                        classroomStudent = new ClassroomStudent { id = classroom.Key,studentId= new List<string>()};
                     }
                     foreach (var classroomStudent1  in classroom)
                     {
                         classroomStudent.scopeCode = classroomStudent1.schoolCode;
-                        classroomStudent.studentId.UnionWith(new List<string> { classroomStudent1.studentId });
+                        if (!classroomStudent.studentId.Contains(classroomStudent1.studentId))
+                        {
+                            classroomStudent.studentId.Add(classroomStudent1.studentId);
+                        }
+                      //  classroomStudent.studentId.UnionWith(new List<string> { classroomStudent1.studentId });
                     }
-                    classroomStudents.AddRange(classroomStudents);
+                    classroomStudents.Add(classroomStudent);
                 }
-                 await  azureCosmosDBRepository.SaveOrUpdateAll(classroomStudents);
+                await  azureCosmosDBRepository.SaveOrUpdateAll(classroomStudents);
                 builder.Data(students);
             }
-            //Dictionary<string, List<Student>> dictInfo = new Dictionary<string, List<Student>>();
-            //foreach (IGrouping<string, Student> group in request.@params.GroupBy(c => c.classroomCode))
-            //{
-            //    dictInfo.Add(group.Key, group.ToList());
-            //}
-            //List<Student> students = new List<Student>();
-            //foreach (string key in dictInfo.Keys)
-            //{
-            //    List<Classroom> classrooms = await azureCosmosDBRepository.FindByDict<Classroom>(new Dictionary<string, object> { { "classroomCode", key } } );
-            //    if (classrooms.IsNotEmpty())
-            //    {
-            //        long createDate = DateTimeOffset.UtcNow.Ticks;
-            //        dictInfo.TryGetValue(key, out List<Student> sts);
-            //        sts.ForEach(x => {
-            //            Student student = new Student
-            //            {
-            //                schoolCode = classrooms[0].scopeCode,
-            //                id = x.studentId.Replace("#","-"),
-            //             //   TEAMModelId = x.studentId,
-            //               // virtualId = x.studentId,
-            //                createDate = createDate,
-            //                name = x.name,
-            //                //seatNo = x.seatNo,
-            //                studentId = x.studentId
-            //            };
-            //            //设置密码 isSet 是否加密 如果加密则不会再次加密
-            //            if (!x.password.isSet) {
-            //                student.password.value = TmdCrypt.Encrypt(x.password.value);
-            //                student.password.isSet = true;
-            //            }
-            //            //Classroom classroom = new Classroom
-            //            //{
-            //            //    classroomCode = x.classroom.classroomCode,
-            //            //    gradeCode = classrooms[0].gradeCode,
-            //            //    periodCode = classrooms[0].periodCode,
-            //            //    scopeCode = classrooms[0].scopeCode,
-            //            //};
-            //            //student.classroom = classroom;
-            //            students.Add(student);
-            //        });
-            //        await azureCosmosDBRepository.SaveOrUpdateAll(students);
-            //    }
-            //}
             return builder.build();
         }
 
@@ -174,34 +173,39 @@ namespace TEAMModelOS.Controllers.Syllabus
                 request.@params.password.value = TmdCrypt.Encrypt(request.@params.password.value);
                 request.@params.password.isSet = true;
             }
+            ///假如更新了班级则先获取更新之前的班级 并移除相关联的
+            var olStudent = await azureCosmosDBRepository.FindById<Student>(request.@params.studentId, false);
+            if (olStudent != null && !olStudent.classroomCode.Equals(request.@params.classroomCode))
+            {
+                ClassroomStudent classroomstu = await azureCosmosDBRepository.FindById<ClassroomStudent>(olStudent.classroomCode);
+                if (classroomstu != null)
+                {
+                    if (classroomstu.studentId.Contains(request.@params.studentId))
+                    {
+                        classroomstu.studentId.Remove(request.@params.studentId);
+                        await azureCosmosDBRepository.SaveOrUpdate(classroomstu);
+                    }
+                }
+            }
+
             Student data = await azureCosmosDBRepository.SaveOrUpdate<Student>(request.@params);
             ///更新学生关系表
-            ClassroomStudent classroomStudent = await azureCosmosDBRepository.FindById<ClassroomStudent>(data.classroomCode);
+            ClassroomStudent classroomStudent = await azureCosmosDBRepository.FindById<ClassroomStudent>(data.classroomCode,false);
             if (classroomStudent == null)
             {
-                classroomStudent = new ClassroomStudent { id = data.classroomCode, scopeCode = data.schoolCode, studentId = new HashSet<string> { data.studentId } };
+                classroomStudent = new ClassroomStudent { id = data.classroomCode, scopeCode = data.schoolCode, studentId = new List<string> { data.studentId } };
             }
             else
             {
-                classroomStudent.studentId.UnionWith(new List<string> { data.studentId });
+                if (!classroomStudent.studentId.Contains(data.studentId)) {
+                    classroomStudent.studentId.Add(data.studentId);
+                }
+               // classroomStudent.studentId.UnionWith(new List<string> { data.studentId });
             }
             await azureCosmosDBRepository.SaveOrUpdate(classroomStudent);
             return builder.Data(data).build();
         }
-        //[HttpPost("UpdateAllStudent")]
-        //public async Task<BaseJosnRPCResponse> UpdateAllStudent(JosnRPCRequest<Dictionary<string, Dictionary<string, object>>> request)
-        //{
-        //    JsonRPCResponseBuilder builder = JsonRPCResponseBuilder.custom();
-        //    bool find = request.@params.TryGetValue("find", out Dictionary<string, object> findObj);
-        //    bool update = request.@params.TryGetValue("update", out Dictionary<string, object> updateObj);
-        //    List<Student> data = null ;
-        //    if (find && update)
-        //    {
-        //        data = await azureCosmosDBRepository.FindByDict<Student>(findObj);
-        //        data = await azureCosmosDBRepository.UpdateAll<Student>(findObj, updateObj);
-        //    }
-        //    return builder.Data(data).build();
-        //}
+     
         /// <summary>
         /// 根据ID删除
         /// </summary>
@@ -213,11 +217,12 @@ namespace TEAMModelOS.Controllers.Syllabus
             JsonRPCResponseBuilder builder = JsonRPCResponseBuilder.custom();
             IdPk data = await azureCosmosDBRepository.DeleteAsync<Student>(request.@params.id, request.@params.schoolCode);
             ///更新学生关系表
-            Student student= await azureCosmosDBRepository.FindById<Student>(request.@params.id);
-            ClassroomStudent classroomStudent = await azureCosmosDBRepository.FindById<ClassroomStudent>(student.classroomCode);
+            Student student= await azureCosmosDBRepository.FindById<Student>(request.@params.id,false);
+            ClassroomStudent classroomStudent = await azureCosmosDBRepository.FindById<ClassroomStudent>(student.classroomCode,false);
             if (classroomStudent != null)
             {
-                classroomStudent.studentId.ExceptWith(new List<string> { student.studentId });
+                classroomStudent.studentId.Remove(student.studentId);
+                //classroomStudent.studentId.ExceptWith(new List<string> { student.studentId });
                 await azureCosmosDBRepository.SaveOrUpdate(classroomStudent);
             }
             return builder.Data(data).build();
@@ -233,20 +238,20 @@ namespace TEAMModelOS.Controllers.Syllabus
             List<Student> students= await azureCosmosDBRepository.FindByDict<Student>(request.@params);
             await azureCosmosDBRepository.DeleteAll<Student>(students);
             ///更新学生关系表
-            List<ClassroomStudent> classroomStudents = new List<ClassroomStudent>();
+           // List<ClassroomStudent> classroomStudents = new List<ClassroomStudent>();
             foreach (var classroom in students.GroupBy(x => x.classroomCode).ToList())
             {
-
-                ClassroomStudent classroomStudent = await azureCosmosDBRepository.FindById<ClassroomStudent>(classroom.Key);
+                ClassroomStudent classroomStudent = await azureCosmosDBRepository.FindById<ClassroomStudent>(classroom.Key,false);
                 if (classroomStudent != null)
                 {
                     foreach (var classroomStudent1 in classroom)
                     {
                         classroomStudent.scopeCode = classroomStudent1.schoolCode;
-                        classroomStudent.studentId.ExceptWith(new List<string> { classroomStudent1.studentId });
+                        // classroomStudent.studentId.ExceptWith(new List<string> { classroomStudent1.studentId });
+                        classroomStudent.studentId.Remove(classroomStudent1.studentId);
                     }
-                    classroomStudents.AddRange(classroomStudents);
-                    await azureCosmosDBRepository.SaveOrUpdateAll(classroomStudents);
+                 //   classroomStudents.AddRange(classroomStudents);
+                    await azureCosmosDBRepository.SaveOrUpdate(classroomStudent);
                 }
             }
             return builder.build();

+ 1 - 1
TEAMModelOS/Controllers/Learn/HomeWorkController.cs

@@ -141,7 +141,7 @@ namespace TEAMModelOS.Controllers.Learn
                         foreach (string studentid in classroom[0].studentId)
                         {
                             HomeWorkStudent homeWorkStudent = new HomeWorkStudent();
-                            homeWorkStudent.id = studentid;
+                            homeWorkStudent.id = studentid.Replace("#","-");
                             homeWorkStudent.homeWorkId = request.@params.homeWork.id;
                             homeWorkStudent.studentId = studentid;
                             homeWorkStudent.classroom.code = target.classroomCode;

+ 1 - 1
TEAMModelOS/Controllers/Learn/VoteController.cs

@@ -90,7 +90,7 @@ namespace TEAMModelOS.Controllers.Learn
                         foreach (string studentid in classroom[0].studentId)
                         {
                             VoteStudent voteStudent = new VoteStudent();
-                            voteStudent.id = studentid;
+                            voteStudent.id = studentid.Replace("#","-");
                             voteStudent.voteWorkId = request.@params.vote.id;
                             voteStudent.studentId = studentid;
                             voteStudent.classroom.code = target.classroomCode;