Procházet zdrojové kódy

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

CrazyIter před 4 roky
rodič
revize
fc2664cc13
83 změnil soubory, kde provedl 458877 přidání a 1014 odebrání
  1. 12 0
      TEAMModelOS.SDK/DI/AzureCosmos/AzureCosmosExtensions.cs
  2. 17 19
      TEAMModelOS/ClientApp/src/access/index.js
  3. 2 2
      TEAMModelOS/ClientApp/src/api/courseMgmt.js
  4. 1 19
      TEAMModelOS/ClientApp/src/api/http.js
  5. 8 8
      TEAMModelOS/ClientApp/src/api/knowledge.js
  6. 3 3
      TEAMModelOS/ClientApp/src/api/learnActivity.js
  7. 1 1
      TEAMModelOS/ClientApp/src/api/login.js
  8. 5 5
      TEAMModelOS/ClientApp/src/api/newEvaluation.js
  9. 6 0
      TEAMModelOS/ClientApp/src/assets/student-web/component_styles/app-nav.css
  10. 6 3
      TEAMModelOS/ClientApp/src/assets/student-web/component_styles/dist/small-navbar.css
  11. 2 0
      TEAMModelOS/ClientApp/src/boot-app.js
  12. 5 6
      TEAMModelOS/ClientApp/src/common/BaseLayout.vue
  13. 2 2
      TEAMModelOS/ClientApp/src/common/BasePackage.vue
  14. 25 18
      TEAMModelOS/ClientApp/src/common/BaseSelectSchool.vue
  15. 9 6
      TEAMModelOS/ClientApp/src/common/BaseUserPoptip.vue
  16. 1 1
      TEAMModelOS/ClientApp/src/components/coursemgmt/StudentList.vue
  17. 2 2
      TEAMModelOS/ClientApp/src/components/learnactivity/BaseHwTable.vue
  18. 7 7
      TEAMModelOS/ClientApp/src/components/learnactivity/ChooseContent.vue
  19. 6 1
      TEAMModelOS/ClientApp/src/components/learnactivity/ClassList.vue
  20. 3 3
      TEAMModelOS/ClientApp/src/components/learnactivity/ContentFileList.vue
  21. 1 0
      TEAMModelOS/ClientApp/src/components/learnactivity/GradeList.less
  22. 36 38
      TEAMModelOS/ClientApp/src/components/learnactivity/GradeList.vue
  23. 11 1
      TEAMModelOS/ClientApp/src/components/learnactivity/GradeTable.vue
  24. 9 9
      TEAMModelOS/ClientApp/src/components/learnactivity/RecordChart.vue
  25. 2 3
      TEAMModelOS/ClientApp/src/components/student-analysis/total/BaseKnowledgeDetail.vue
  26. 1 4
      TEAMModelOS/ClientApp/src/components/student-analysis/total/BaseKnowledgeRadar.vue
  27. 16 6
      TEAMModelOS/ClientApp/src/components/student-analysis/total/BaseMyTable.vue
  28. 4 4
      TEAMModelOS/ClientApp/src/components/student-analysis/total/BaseRadar.vue
  29. 2 2
      TEAMModelOS/ClientApp/src/components/student-analysis/total/ExportTables.vue
  30. 5 0
      TEAMModelOS/ClientApp/src/locale/lang/en-US/login.js
  31. 5 0
      TEAMModelOS/ClientApp/src/locale/lang/zh-CN/login.js
  32. 8 12
      TEAMModelOS/ClientApp/src/locale/lang/zh-CN/schoolBaseInfo.js
  33. 5 0
      TEAMModelOS/ClientApp/src/locale/lang/zh-TW/login.js
  34. 5 9
      TEAMModelOS/ClientApp/src/locale/lang/zh-TW/schoolBaseInfo.js
  35. 24 5
      TEAMModelOS/ClientApp/src/router/routes.js
  36. 8 5
      TEAMModelOS/ClientApp/src/service/User.js
  37. 1 1
      TEAMModelOS/ClientApp/src/store/index.js
  38. 31 33
      TEAMModelOS/ClientApp/src/store/module/schoolBaseInfo.js
  39. 8 7
      TEAMModelOS/ClientApp/src/view/Home.vue
  40. 13 4
      TEAMModelOS/ClientApp/src/view/evaluation/bank/ExerciseList.vue
  41. 7 2
      TEAMModelOS/ClientApp/src/view/evaluation/bank/TestPaperList.vue
  42. 8 1
      TEAMModelOS/ClientApp/src/view/evaluation/bank/index.vue
  43. 1 1
      TEAMModelOS/ClientApp/src/view/evaluation/components/BaseEditExercise.vue
  44. 10 1
      TEAMModelOS/ClientApp/src/view/evaluation/components/BaseFilter.vue
  45. 2 2
      TEAMModelOS/ClientApp/src/view/evaluation/index/CreateExercises.vue
  46. 3 3
      TEAMModelOS/ClientApp/src/view/evaluation/index/CreatePaper.vue
  47. 1 1
      TEAMModelOS/ClientApp/src/view/evaluation/index/index.vue
  48. 40 34
      TEAMModelOS/ClientApp/src/view/learnactivity/CreateEvaluation.vue
  49. 16 3
      TEAMModelOS/ClientApp/src/view/learnactivity/ManageEvaluation.vue
  50. 4 3
      TEAMModelOS/ClientApp/src/view/learnactivity/ManageRecord.vue
  51. 59 7
      TEAMModelOS/ClientApp/src/view/login/Index.vue
  52. 2 2
      TEAMModelOS/ClientApp/src/view/newcourse/CourseBaseSetting.vue
  53. 3 1
      TEAMModelOS/ClientApp/src/view/newcourse/ManageCourse.vue
  54. 146 144
      TEAMModelOS/ClientApp/src/view/schoolmgmt/ClassroomSetting/ClassroomSetting.vue
  55. 1 1
      TEAMModelOS/ClientApp/src/view/schoolmgmt/SystemSetting/SystemSetting.vue
  56. 3 3
      TEAMModelOS/ClientApp/src/view/student-account/AddStudent.vue
  57. 1 1
      TEAMModelOS/ClientApp/src/view/student-account/ImportStudent.vue
  58. 3 3
      TEAMModelOS/ClientApp/src/view/student-account/Index.vue
  59. 1 23
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/AchievementAnalysis/EntryTables.vue
  60. 2 2
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/KnowledgeAnalysis/ScoreDetails.vue
  61. 2 2
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/LevelAnalysis/ScoreDetails.vue
  62. 1 0
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/TestAnalysis/QuestionList.vue
  63. 1 0
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/TestAnalysis/TestAnalysis.vue
  64. 44 1
      TEAMModelOS/ClientApp/src/view/student-web/App.vue
  65. 3 3
      TEAMModelOS/ClientApp/src/view/teachcontent/index.vue
  66. 2 2
      TEAMModelOS/ClientApp/src/view/teachermgmt/Index.vue
  67. 4 4
      TEAMModelOS/ClientApp/src/view/teachermgmt/components/personnel/Index.vue
  68. 3 3
      TEAMModelOS/ClientApp/src/view/teachermgmt/components/userList/Index.vue
  69. 109 24
      TEAMModelOS/Controllers/Analysis/AchievementController.cs
  70. 31 36
      TEAMModelOS/Controllers/Analysis/ChangeController.cs
  71. 7 7
      TEAMModelOS/Controllers/Exam/PaperController.cs
  72. 40 26
      TEAMModelOS/Controllers/School/ClassRoomController.cs
  73. 14 76
      TEAMModelOS/Controllers/School/CourseController.cs
  74. 1382 0
      TEAMModelOS/Controllers/School/StudentController.cs
  75. 0 323
      TEAMModelOS/Controllers/Student/StudentController.cs
  76. 4 4
      TEAMModelOS/Controllers/Syllabus/ItemInfoController.cs
  77. 2 1
      TEAMModelOS/Controllers/Teacher/InitController.cs
  78. 94140 0
      TEAMModelOS/JsonFile/IES/19890.json
  79. 362380 0
      TEAMModelOS/JsonFile/IES/19910.json
  80. 20 0
      TEAMModelOS/Models/Base/TeacherBase.cs
  81. 47 11
      TEAMModelOS/Models/SchoolInfo/Classroom.cs
  82. 6 0
      TEAMModelOS/Models/SchoolInfo/ExamInfo.cs
  83. 4 4
      TEAMModelOS/Services/Analysis/AchievementService.cs

+ 12 - 0
TEAMModelOS.SDK/DI/AzureCosmos/AzureCosmosExtensions.cs

@@ -55,6 +55,18 @@ namespace TEAMModelOS.SDK.DI
                 return 0;
             }
         }
+        public static string GetContinuationToken(this Response response)
+        {
+            try
+            {
+                response.Headers.TryGetValue("x-ms-continuation", out var value);
+                return value;
+            }
+            catch (Exception)
+            {
+                return null;
+            }
+        }
         public static async Task<T> FindByIdPk<T>(this AzureCosmosFactory azureCosmosFactory, string id, string pk) where T : ID
         {
             AzureCosmosModel container = azureCosmosFactory.GetCosmosModel(typeof(T).Name);

+ 17 - 19
TEAMModelOS/ClientApp/src/access/index.js

@@ -3,24 +3,22 @@ import Vue from 'vue';
 import { User } from '../service/User';
 
 Vue.use(VueAccessControl, {
-    globalMiddleware: ['login?'], // 定义默认的中间件
-    vueRouter: true,
-    loginRoute: { // 登入路由
-        path: '/login'
-      },
-    // globalMiddleWares: ['login'],
-    // foreignKeyName: 'user_id',
-    // notLoginRoleName: 'Guest',
-    permissionDenyRedirectRoute: {  // 權限拒絕重定向路由
-      path: '/404'
-    },
-    defaultRoute: {  // 基本路由
-      path: '/home'
-    },
+  vueRouter: true,
+  globalMiddleWares: ['login?'], // 定义默认的中间件
+  loginRoute: { // 登入路由
+    path: '/login'
+  },
+  // permissionDenyRedirectRoute: {  // 權限拒絕重定向路由
+  //   path: '404'
+  // },
+  // defaultRoute: {  // 基本路由
+  //   name: 'home'
+  // },
 });
 
+
 LoginMiddleware.handleExtend = function(next, ...arg) {
-  let token = localStorage.getItem('access_token')
+  let identity = localStorage.getItem('identity')
   let toNextPath = arg[1].path
   let userAccess, userInfo
 
@@ -33,9 +31,9 @@ LoginMiddleware.handleExtend = function(next, ...arg) {
   
   if (userAccess && userInfo) {
     if(toNextPath === '/login' && userAccess.isLogin){
-      window.location.href = '/home'
+      window.location.href = identity == 'student' ? '/studentWeb' : '/home'
     } else {
-      User.freshLogin(token).then(() => {
+      User.freshLogin().then(() => {
         next(true);
       }).catch(() => {
         next(false);
@@ -47,8 +45,8 @@ LoginMiddleware.handleExtend = function(next, ...arg) {
 };
 
 const access = new VueAccessControl.Access({
-    routes: []
-    //routes: AsyncTeacherRoute.concat(AsyncStudentRoute),
+  routes: []
+  //routes: AsyncTeacherRoute.concat(AsyncStudentRoute),
 });
   
 

+ 2 - 2
TEAMModelOS/ClientApp/src/api/courseMgmt.js

@@ -4,10 +4,10 @@ export default {
         return post('/school/course/find', data)
     },
     saveOrUpdateCourse: function (data) {
-        return post('/api/Course/upsert', data)
+        return post('/school/course/upsert', data)
     },
     deleteCourse: function (data) {
-        return post('/api/Course/Delete', data)
+        return post('/school/course/delete', data)
     },
     //ÅúÁ¿É¾³ý¿Î³Ì
     deleteCourseAll: function (data) {

+ 1 - 19
TEAMModelOS/ClientApp/src/api/http.js

@@ -97,28 +97,11 @@ axios.interceptors.response.use(
             Message.error('登录状态已过期!请重新登录!')
         } else if (error.response.status === 500) {
             Message.error('服务器错误!')
-        } else {
-            return Promise.reject(error)
         }
+        return Promise.reject(error)
     }
 )
 
-// getTocken()
-// function getTocken() {
-//     axios.post('/api/auth/token', {
-//         "grant_type": "driver",
-//         "client_id": "c7317f88-7cea-4e48-ac57-a16071f7b884",
-//         "client_secret": "kguxh:V.PLmxBdaI@jnrTrDSth]A3346"
-//     }).then(
-//         res => {
-//             localStorage.setItem("access_token", res.data.access_token)
-//             localStorage.setItem("expires_in", res.data.expires_in)
-//         },
-//         err => {
-//             console.log(err)
-//         }
-//     )
-// }
 /**检测token是否快过期 */
 function checkToken() {
     if(!localStorage.getItem('expires_in') || localStorage.getItem('expires_in') == undefined) return false
@@ -210,7 +193,6 @@ export function post(url, params) {
                 }
             }, err => {
                 reject(err)
-                Message.error('数据访问错误!')
             })
     })
 }

+ 8 - 8
TEAMModelOS/ClientApp/src/api/knowledge.js

@@ -6,34 +6,34 @@ export default {
     },
     // 获取标准的知识块及包含的知识点
     GetStantardBlocks: function(data) {
-        return post('/api/Knowledge/findStdBlockPoint', data)
+        return post('/common/Knowledge/findStdBlockPoint', data)
     },
     // 获取知识块知识点
     GetSchoolPoints: function(data) {
-        return post('/api/Knowledge/find', data)
+        return post('/common/Knowledge/find', data)
     },
     // 获取知识块知识点
     GetSchoolBlocks: function(data) {
-        return post('/api/Knowledge/find', data)
+        return post('/common/Knowledge/find', data)
     },
     // 批量更新保存知识点知识块
     SaveOrUpdateKnowledge: function(data) {
-        return post('/api/Knowledge/upsertAll', data)
+        return post('/common/Knowledge/upsertAll', data)
     },
     // �ֶ�����ѧУ��˽��֪ʶ��
     SaveOrUpdateSchoolPoint: function(data) {
-        return post('/api/Knowledge/SaveOrUpdateAllSchoolPoint', data)
+        return post('/common/Knowledge/SaveOrUpdateAllSchoolPoint', data)
     },
     // 删除知识点知识块
     DeleteSchoolPoint: function(data) {
-        return post('/api/Knowledge/delete', data)
+        return post('/common/Knowledge/delete', data)
     },
     // 删除知识点知识块
     DeleteSchoolBlock: function(data) {
-        return post('/api/Knowledge/delete', data)
+        return post('/common/Knowledge/delete', data)
     },
     // 根据id集合获取知识点知识块
     FindKnowledgebyId: function(data) {
-        return post('/api/Knowledge/findByIds', data)
+        return post('/common/Knowledge/findByIds', data)
     },
 }

+ 3 - 3
TEAMModelOS/ClientApp/src/api/learnActivity.js

@@ -4,19 +4,19 @@ export default {
      *保存试卷
      */
     SaveExamPaper: function (data) {
-        return post('/api/Paper/upsert', data)
+        return post('/school/Paper/upsert', data)
     },
     /*
      *查询试卷
      */
     FindExamPaper: function (data) {
-        return post('/api/Paper/find', data)
+        return post('/school/Paper/find', data)
     },
     /*
      *删除试卷
      */
     DeleteExamPaper: function (data) {
-        return post('/api/Paper/delete', data)
+        return post('/school/Paper/delete', data)
     },
     /*
      *删除评测信息

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

@@ -121,7 +121,7 @@ export default {
       await this.studLoginbyIES(data).then( res => {
         // 儲存大雲Token
         localStorage.setItem("auth_token", res.auth_token)
-        store.dispatch('user/setSchoolCode', data.schoolCode)
+        store.dispatch('user/setSchoolCode', data.school_code)
         // store.dispatch('user/setStudentProfile', res) // 暫時註解 要是有再補寫
         result = res
       })

+ 5 - 5
TEAMModelOS/ClientApp/src/api/newEvaluation.js

@@ -8,14 +8,14 @@ export default {
      * @param {any} data
      */
     SaveSingleExercise: function(data) {
-        return post('/api/ItemInfo/upsert', data)
+        return post('/common/item/upsert', data)
     },
     /**
      * 批量更新保存试题
      * @param {any} data
      */
     SaveAllExercise: function(data) {
-        return post('/api/ItemInfo/upsertAll', data)
+        return post('/common/item/upsertAll', data)
     },
 
     /**
@@ -23,7 +23,7 @@ export default {
      * @param {any} data
      */
     FindExerciseList: function(data) {
-        return post('/api/ItemInfo/find', data)
+        return post('/common/item/find', data)
     },
 
     /**
@@ -39,7 +39,7 @@ export default {
      * @param {any} data
      */
     FindExerciseById: function(data) {
-        return post('/api/ItemInfo/findByIds', data)
+        return post('/common/item/findByIds', data)
     },
 
     /**
@@ -47,7 +47,7 @@ export default {
      * @param {any} data
      */
     DeleteExamItem: function(data) {
-        return post('/api/ItemInfo/delete', data)
+        return post('/common/item/delete', data)
     }
 
 }

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

@@ -133,6 +133,12 @@
   border-top: 1px solid rgba(0, 0, 0, 0.1);
   color: #575757;
 }
+#profile-pop .profile-pop-item a{
+  color: #575757;
+}
+#profile-pop .profile-pop-item:hover a{
+  color: #03966a;
+}
 #profile-pop .profile-pop-item:hover {
   background: linear-gradient(-0.75turn, #fafafa, #d4ede1);
   color: #03966a;

+ 6 - 3
TEAMModelOS/ClientApp/src/assets/student-web/component_styles/dist/small-navbar.css

@@ -93,15 +93,18 @@
     border-top: 1px solid rgba(0, 0, 0, 0.1);
     color: #575757 !important;
   }
-  .myNav-small .menu-group .profile-dropdown:hover #profile-pop .profile-pop-item:hover {
+  .myNav-small .menu-group .profile-dropdown:hover #profile-pop .profile-pop-item:hover ,
+  .myNav-small .menu-group .profile-dropdown:hover #profile-pop .profile-pop-item a:hover {
     color: #03966a !important;
   }
   .myNav-small .menu-group .profile-dropdown:hover #profile-pop .profile-pop-item:hover .profile-pop-itemIcon1 *,
-  .myNav-small .menu-group .profile-dropdown:hover #profile-pop .profile-pop-item:hover .profile-pop-itemIcon2 * {
+  .myNav-small .menu-group .profile-dropdown:hover #profile-pop .profile-pop-item:hover .profile-pop-itemIcon2 *,
+  .myNav-small .menu-group .profile-dropdown:hover #profile-pop .profile-pop-item:hover .profile-pop-itemIcon3 a * {
     color: #03966a !important;
   }
   .myNav-small .menu-group .profile-dropdown:hover #profile-pop .profile-pop-item .profile-pop-itemIcon1 *,
-  .myNav-small .menu-group .profile-dropdown:hover #profile-pop .profile-pop-item .profile-pop-itemIcon2 * {
+  .myNav-small .menu-group .profile-dropdown:hover #profile-pop .profile-pop-item .profile-pop-itemIcon2 *,
+  .myNav-small .menu-group .profile-dropdown:hover #profile-pop .profile-pop-item .profile-pop-itemIcon3 a * {
     color: #575757 !important;
   }
 }

+ 2 - 0
TEAMModelOS/ClientApp/src/boot-app.js

@@ -35,6 +35,7 @@ import vueAudioNative from 'vue-audio-native'
 import konva from 'konva'
 import "@/assets/student-web/component_styles/common.css";
 import "@/assets/student-web/icons";
+import { User } from '@/service/User'
 
 import { firestorePlugin } from "vuefire";
 Vue.use(firestorePlugin);
@@ -85,6 +86,7 @@ Vue.prototype.$api = apiTools
 Vue.prototype.$post = post
 Vue.prototype.$get = fetch
 Vue.prototype.$axios = axios
+Vue.prototype.$User = User
 
 // 工具类
 Vue.prototype.$Mock = mockTools

+ 5 - 6
TEAMModelOS/ClientApp/src/common/BaseLayout.vue

@@ -160,7 +160,7 @@
                             {
                                 icon: 'iconfont icon-question-bank',
                                 name: '校本题目/库',
-                                router: '/home/evaluation/testPaperList',
+                                router: '/home/evaluation/schoolBank',
                                 tag: '',
                                 role: 'teacher|admin',
                                 permission: '',
@@ -210,7 +210,7 @@
                             {
                                 icon: 'iconfont icon-test',
                                 name: '评量测验',
-                                router: '/home/manageEvaluation',
+                                router: '/home/schoolEvaluation',
                                 tag: '',
                                 role: 'admin',
                                 permission: 'analysis'
@@ -292,7 +292,7 @@
                             {
                                 icon: 'iconfont icon-question-bank',
                                 name: '个人题目/库',
-                                router: '/home/evaluation/testPaperList',
+                                router: '/home/evaluation/personalBank',
                                 tag: '',
                                 role: 'teacher|admin',
                                 permission: '',
@@ -309,7 +309,7 @@
                             {
                                 icon: 'iconfont icon-test',
                                 name: '评量测验',
-                                router: '/home/manageEvaluation',
+                                router: '/home/classEvaluation',
                                 tag: '',
                                 role: 'teacher|admin',
                                 permission: '',
@@ -419,9 +419,8 @@
         text-overflow: ellipsis;
         white-space: nowrap;
         font-size: 16px;
-        /*color:var(--primary-text-color);*/
         width: 118px;
-        vertical-align: middle;
+        vertical-align: top;
         transition: width 0.1s ease 0.1s;
         font-family: Roboto,-apple-system,BlinkMacSystemFont,Segoe UI,Microsoft JhengHei !important;
     }

+ 2 - 2
TEAMModelOS/ClientApp/src/common/BasePackage.vue

@@ -29,11 +29,11 @@
                             this.sasString = res.result.data.SAS
                             this.downloadFile(list)
                         } else {
-                            alert('API error!')
+                            this.$Message.error('API error!')
                         }
                     },
                     (err) => {
-                        alert('API error!')
+                        this.$Message.error('API error!')
                     }
                 )
             },

+ 25 - 18
TEAMModelOS/ClientApp/src/common/BaseSelectSchool.vue

@@ -1,16 +1,16 @@
 <template>
 	<div class="base-school-select">
 			<Dropdown @on-click="onSchoolSelect">
-				<img class="school-logo" :src="curSchool.logo" />
-				<a href="javascript:void(0)" class="base-user-post">
+				<img class="school-logo" :src="curSchool.logo || 'http://sokrates.teammodel.cn/images/app/cn/teammodel/original-black-small.png'" />
+				<a href="javascript:void(0)" :class="['base-user-post', user.schools.length === 1 ? 'single-school' : '']">
 					{{ curSchool.name }}
 					<Icon type="ios-arrow-down"></Icon>
 				</a>
 				<DropdownMenu slot="list">
-					<div v-for="(item,index) in user.schoolList" :key="index">
+					<div v-for="(item,index) in user.schools" :key="index">
 						<DropdownItem :name="index">
 							<div class="school-item">
-								<img :src="item.logo" alt="">
+								<img :src="item.logo || 'http://sokrates.teammodel.cn/images/app/cn/teammodel/original-black-small.png'" alt="">
 								<span>{{ item.name }}</span>
 							</div>
 						</DropdownItem>
@@ -26,28 +26,29 @@
 	export default {
 		data() {
 			return {
-				curSchool: '醍摩豆学院',
+				curSchool: null,
 				user:{
-					schoolList:[{
-						logo:'http://sokrates.teammodel.cn/images/app/cn/teammodel/original-black-small.png',
-						name:'醍摩豆学院'
-					},{
-						logo:'http://sokrates.teammodel.cn/images/app/cn/teammodel/original-black-small.png',
-						name:'成都青城山学校'
-					},{
-						logo:'http://sokrates.teammodel.cn/images/app/cn/teammodel/original-black-small.png',
-						name:'高新区芳草小学'
-					}]
+					schools:[]
 				}
-				
 			}
 		},
 		created() {
-			this.curSchool = this.user.schoolList[0]
+			// 获取本地存储中的 用户信息
+			let user = JSON.parse(decodeURIComponent(localStorage.user_profile, "utf-8"));
+			if(user.schools){
+				// 拿到用户管理的schools 必须是已加入的学校
+				let schools = user.schools.filter(i => i.status === 'join')
+				if(schools.length){
+					this.user.schools = schools
+					this.curSchool = user.defaultschool ? schools.filter(i => i.schoolId === user.defaultschool)[0] : schools[0]
+				}
+			}else{
+				this.$Message.warning('用户暂无学校列表数据')
+			}
 		},
 		methods: {
 			onSchoolSelect(val){
-				this.curSchool = this.user.schoolList[val]
+				this.curSchool = this.user.schools[val]
 			}
 		},
 
@@ -92,6 +93,12 @@
 			}
 		}
 		
+		.single-school{
+			&::after{
+				display: none !important;
+			}
+		}
+		
 		.school-logo{
 			width: 30px;
 			border-radius: 50%;

+ 9 - 6
TEAMModelOS/ClientApp/src/common/BaseUserPoptip.vue

@@ -10,10 +10,8 @@
 						<Icon type="ios-arrow-down"></Icon>
 					</a>
 					<DropdownMenu slot="list">
-						<div v-for="(item, index) in user.roles" :key="index">
-							<DropdownItem :name="item">{{ getRoleName(item) }}</DropdownItem>
-						</div>
-
+						<DropdownItem :name="'teacher'">教师</DropdownItem>
+						<DropdownItem :name="'student'">學生</DropdownItem>
 					</DropdownMenu>
 				</Dropdown>
 			</div>
@@ -108,7 +106,12 @@
 		},
 		methods: {
 			onRoleSelect(val){
-				this.curRole = val
+				if(localStorage.getItem('identity') != val){
+					this.curRole = val
+					let path = val === 'student' ? '/studentWeb' : '/home'
+					localStorage.setItem('identity', val)
+					this.$router.push({ path: path })					
+				}
 			},
 			onQuit() {
 				this.$emit('logout')
@@ -136,7 +139,7 @@
 			},
 			getRoleName() {
 				return val => {
-					return val === 'admin' ? '管理员' : val === 'teacher' ? '教师' : '学生'
+					return val === 'student' ? '学生' : '教师'
 				}
 			}
 		},

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

@@ -217,7 +217,7 @@
                             [...this.tableShowData] = this.tableData
                             this.tableLoading = false
                         } else {
-                            alert('API error!')
+                            this.$Message.error('API error!')
                             this.tableLoading = false
                         }
                     },

+ 2 - 2
TEAMModelOS/ClientApp/src/components/learnactivity/BaseHwTable.vue

@@ -574,11 +574,11 @@
                         if (res.error == null) {
                             this.sasString = res.result.data.SAS
                         } else {
-                            alert('API error!')
+                            this.$Message.error('API error!')
                         }
                     },
                     (err) => {
-                        alert('API error!')
+                        this.$Message.error('API error!')
                     }
                 )
             },

+ 7 - 7
TEAMModelOS/ClientApp/src/components/learnactivity/ChooseContent.vue

@@ -554,7 +554,7 @@
                                 }
                             },
                             (err) => {
-                                alert('API error!')
+                                this.$Message.error('API error!')
                             }
                         )
                     } else {
@@ -579,7 +579,7 @@
                                 }
                             },
                             (err) => {
-                                alert('API error!')
+                                this.$Message.error('API error!')
                             }
                         )
                     } else {
@@ -634,11 +634,11 @@
                         if (res.error == null) {
                             this.syllabusList = res.result.data
                         } else {
-                            alert('API error!')
+                            this.$Message.error('API error!')
                         }
                     },
                     (err) => {
-                        alert('API error!')
+                        this.$Message.error('API error!')
                     }
                 )
             },
@@ -664,7 +664,7 @@
                         this.getVolumes()
                     },
                     (err) => {
-                        alert('API error!')
+                        this.$Message.error('API error!')
                     }
                 )
             },
@@ -682,11 +682,11 @@
                                 this.getSyllabus()
                             }
                         } else {
-                            alert('API error111!')
+                            this.$Message.error('API error111!')
                         }
                     },
                     (err) => {
-                        alert('API error222!')
+                        this.$Message.error('API error222!')
                     }
                 )
             },

+ 6 - 1
TEAMModelOS/ClientApp/src/components/learnactivity/ClassList.vue

@@ -30,7 +30,7 @@
                         </div>
                         <p style="color:#EEEEEE;padding-left:15px;font-size:16px;margin-top:10%;margin-bottom:10px;">学生成绩数据</p>
                         <div class="table-show">
-                            <Table v-if="studentList.length !== 0" :studentData="studentList"></Table>
+                            <Table v-if="studentList.length !== 0" @fixScore="getScore" :studentData="studentList"></Table>
                         </div>
                     </vuescroll>
                 </div>
@@ -93,6 +93,11 @@
             }
         },
         methods: {
+            getScore(data) {
+                console.log(data)
+                this.currentActivityIndex = 1
+                this.getData()
+            },
             getTestData() {
                 this.testStatus = !this.testStatus
             },

+ 3 - 3
TEAMModelOS/ClientApp/src/components/learnactivity/ContentFileList.vue

@@ -1,4 +1,4 @@
-<template>
+<template>
     <div class="content-file-wrap">
         <div v-for="(item,index) in sasRes" class="content-file-item" :key="index">
             <div class="file-icon">
@@ -59,11 +59,11 @@
                             this.blobContainer = res.result.data.Container
                             this.urlString = res.result.data.Url
                         } else {
-                            alert('API error!')
+                            this.$Message.error('API error!')
                         }
                     },
                     (err) => {
-                        alert('API error!')
+                        this.$Message.error('API error!')
                     }
                 )
             },

+ 1 - 0
TEAMModelOS/ClientApp/src/components/learnactivity/GradeList.less

@@ -67,6 +67,7 @@
     margin: auto;
     height:730px;
     border: 1px solid @borderColor;
+    position:relative;
 }
 
 .top-bar {

+ 36 - 38
TEAMModelOS/ClientApp/src/components/learnactivity/GradeList.vue

@@ -1,48 +1,46 @@
 <template>
     <div class="body">
-        <div >
-            <div class="top-bar">
-                <div class="type-list">
-                    <span class="base-info-item">学生姓名:<span class="analysis-info">{{studentName === ''? '请选择作答学生' : studentName}}</span></span>
-                    <span class="base-info-item">已评人数:<span class="analysis-info">{{ isReview }}</span></span>
-                    <span class="base-info-item">未评试题:<span class="analysis-info">{{answer.length - reviewIndex}}</span></span>
-                    <span class="base-info-item">总分:<span class="analysis-info">{{scoreTotal}}</span></span>
-                </div>
-                <div class="button-list">
-                    <Button class="base-info-btn" @click="openAnswer" type="info">{{ isAllOpen ? '显示答案' : '隐藏答案'}}</Button>
-                    <Button class="base-info-btn" type="success" @click="savePaper">提交分数</Button>
-                </div>
+        <div class="top-bar">
+            <div class="type-list">
+                <span class="base-info-item">学生姓名:<span class="analysis-info">{{studentName === ''? '请选择作答学生' : studentName}}</span></span>
+                <span class="base-info-item">已评人数:<span class="analysis-info">{{ isReview }}</span></span>
+                <span class="base-info-item">未评试题:<span class="analysis-info">{{answer.length - reviewIndex}}</span></span>
+                <span class="base-info-item">总分:<span class="analysis-info">{{scoreTotal}}</span></span>
+            </div>
+            <div class="button-list">
+                <Button class="base-info-btn" @click="openAnswer" type="info">{{ isAllOpen ? '显示答案' : '隐藏答案'}}</Button>
+                <Button class="base-info-btn" type="success" @click="savePaper">提交分数</Button>
             </div>
-            <Loading :top="200" v-show="dataLoading" type="1" style="margin-left:20%"></Loading>
-            <div v-if="!dataLoading" class="content">
-                <div class="left-box">
-                    <div class="student-box">
-                        <div class="search-box dark-iview-input">
-                            <Input placeholder="查询学生姓名..." v-model="inputData" style="width:90%;margin-left:5px;margin-bottom:5px">
-                            <Icon type="ios-contact" slot="prefix" />
-                            </Input>
-                        </div>
-                        <div class="student-list">
-                            <vuescroll>
-                                <ul>
-                                    <li :class="index == selectIndex ?' block-bg-active block-bg':' block-bg'" :key="index" v-for="(item,index) in studentList" @click="getStudentInfo(item,index)">
-                                        <div class="student-show">
-                                            <span>{{item.name}}</span>
-                                            <span :style="{ background: (item.mark === 0 ? '#949594' : item.mark === 1 ? '#0BADD4' : '#1CC0F3')}" class="activity-status">{{item.mark === 0 ? '未开始' : item.mark === 2 ? '已完成' : '未完成'}}</span>
-                                        </div>
-                                    </li>
-                                </ul>
-                            </vuescroll>
-                        </div>
+        </div>
+        <div class="content" >
+            <Loading :top="200" v-show="dataLoading" type="1" style="text-align:center"></Loading>
+            <div class="left-box" v-if="!dataLoading">
+                <div class="student-box">
+                    <div class="search-box dark-iview-input">
+                        <Input placeholder="查询学生姓名..." v-model="inputData" style="width:90%;margin-left:5px;margin-bottom:5px">
+                        <Icon type="ios-contact" slot="prefix" />
+                        </Input>
+                    </div>
+                    <div class="student-list">
+                        <vuescroll>
+                            <ul>
+                                <li :class="index == selectIndex ?' block-bg-active block-bg':' block-bg'" :key="index" v-for="(item,index) in studentList" @click="getStudentInfo(item,index)">
+                                    <div class="student-show">
+                                        <span>{{item.name}}</span>
+                                        <span :style="{ background: (item.mark === 0 ? '#949594' : item.mark === 1 ? '#0BADD4' : '#1CC0F3')}" class="activity-status">{{item.mark === 0 ? '未开始' : item.mark === 2 ? '已完成' : '未完成'}}</span>
+                                    </div>
+                                </li>
+                            </ul>
+                        </vuescroll>
                     </div>
                 </div>
-                <div class="grade-box">
-                    <vuescroll>
+            </div>
+            <div class="grade-box" v-if="!dataLoading">
+                <vuescroll>
                     <ReviewPaper :paper="paperData" :answer="answerInfo" ref="exPaper" style="color:#515a6e;" :isShowTools="isShowTools"> </ReviewPaper>
-                    </vuescroll>
-                </div>
+                </vuescroll>
             </div>
-        </div> 
+        </div>
     </div>
 </template>
 

+ 11 - 1
TEAMModelOS/ClientApp/src/components/learnactivity/GradeTable.vue

@@ -2,7 +2,7 @@
     <div class="grade-table dark-iview-table">
         <Table border :columns="columns" :data="studentPageData"  class="dark-iview-page">
             <template slot-scope="{ row, index }" slot="action">
-                <Button type="primary" size="small" style="margin-right: 5px" @click="show(index)">查看</Button>
+                <Button type="success" size="small" style="margin-right: 5px" @click="fixScore(row)">修改</Button>
             </template>
         </Table>
         <div style="width:100%;text-align:center;margin-top:20px;" class="dark-iview-page">
@@ -60,6 +60,13 @@
             getData() {
                 this.studentList = this.studentData
             },
+            fixScore(data) {
+                console.log(data)
+                if (data !== undefined) {
+                    this.$emit('fixScore',data)
+                }
+
+            },
             getPageData(number, type) {  //分页
                 let starIndex = this.pageSize * (this.currentPage - 1)
                 let endIndex = this.pageSize * this.currentPage > this.studentList.length ? this.studentList.length : this.pageSize * this.currentPage
@@ -80,4 +87,7 @@
     }
 </script>
 <style scoped >
+    .grade-table{
+        width:calc(100% - 10px);
+    }
 </style>

+ 9 - 9
TEAMModelOS/ClientApp/src/components/learnactivity/RecordChart.vue

@@ -21,7 +21,7 @@
         methods: {
             setChart() {
                 let myChart = this.$echarts.init(document.getElementById('chart'));
-                var scale = 1;
+                var scale = 0.7;
                 var echartData = [{
                     value: 21,
                     name: '问卷调查'
@@ -73,11 +73,11 @@
                     title: {
                         text: '活动数量统计',
                         left: 'center',
-                        top: '2%',
+                        top: '-1%',
                         padding: [10, 0],
                         textStyle: {
                             color: '#fff',
-                            fontSize: 16,
+                            fontSize: 14,
                             //fontWeight: '800',
                             align: 'center'
                         }
@@ -236,17 +236,17 @@
                     title: {
                         text: '活动完成率',
                         left: 'center',
-                        top: '-2%',
+                        top: '-1%',
                         padding: [10, 0],
                         textStyle: {
                             color: '#fff',
-                            fontSize: 16 ,
+                            fontSize: 14 ,
                             //fontWeight: '800',
                             align: 'center'
                         }
                     },
                     grid: {
-                        top: '10%',
+                        top: '12%',
                         bottom: '54%',
                         left: "50%",
                         containLabel: false
@@ -269,7 +269,7 @@
                             inside: true,
                             textStyle: {
                                 color: "#333",
-                                fontSize: 14,
+                                fontSize: 12,
                                 rich: {
                                     line: {
                                         width: 10,
@@ -320,9 +320,9 @@
                         textStyle: {
                             align: 'center',
                             color: '#fff',
-                            fontSize: 16,
+                            fontSize: 14,
                         },
-                        top: '10%',
+                        top: '1%',
                         left: 'center',
                     },
                     tooltip: {

+ 2 - 3
TEAMModelOS/ClientApp/src/components/student-analysis/total/BaseKnowledgeDetail.vue

@@ -37,7 +37,7 @@
                                 color: 'rgba(128,128,128,0.1)'
                             }
                         },
-                        padding: 5,
+                        padding: 15,
                         textStyle: {
                             // 提示框内容的样式
                             color: '#fff'
@@ -50,6 +50,7 @@
                     grid: {
                         show: false, // 是否显示直角坐标系网格
                         top: 50, // 相对位置 top\bottom\left\right
+						left:20,
                         height: 480,
                         containLabel: true // gird 区域是否包含坐标轴的刻度标签
                     },
@@ -163,14 +164,12 @@
                                         return '#1b9dff'
                                     }
                                 },
-                                width: 20
                             },
                             emphasis: {
                                 itemStyle: {
                                     color: '#ff9999'
                                 }
                             },
-                            barWidth: 30,
                             data: this.y
                         }]
                 }

+ 1 - 4
TEAMModelOS/ClientApp/src/components/student-analysis/total/BaseKnowledgeRadar.vue

@@ -13,12 +13,9 @@
                 radarData: []
             }
         },
-        mounted() {
-            this.radarData = this.getRadarData
-            this.drawLine(this.radarData)
-        },
         methods: {
             drawLine(indicator, data) {
+				console.log(indicator)
                 // 基于准备好的dom,初始化echarts实例
                 let that = this
                 let myRadar = this.$echarts.init(document.getElementById(this.echartsId), 'chalk')

+ 16 - 6
TEAMModelOS/ClientApp/src/components/student-analysis/total/BaseMyTable.vue

@@ -98,7 +98,8 @@
             
         },
         methods: {
-
+			
+			// 导出表格
             exportData (type) {
                 if (type === 1) {
                     this.$refs.table.exportCsv({
@@ -119,7 +120,7 @@
                     const params = {
                           title: this.columns.map(i => i.title),
                           key: this.columns.map(i => i.key),
-                          data: this.tableDatas,
+                          data: this.tableData,
                           autoWidth: true,
                           filename: this.tableName
                         }
@@ -127,7 +128,8 @@
                     excel.export_array_to_excel(params)
                 }
             },      
-
+			
+			// 排序操作
             onSortChange(data) {
                 let order = data.order // 当前排序方式 升序、降序、正常
                 let key = data.key // 当前排序依据
@@ -146,7 +148,8 @@
                 }
                 this.pageChange(1)
             },
-
+			
+			// 筛选操作
             onFilterChange(val) {
                 let filterValue = val._filterChecked[0]
                 switch (filterValue) {
@@ -179,12 +182,14 @@
                 this.currentPage = page
                 this.tableData = this.originData.slice(start, end)
             },
-
+			
+			// 页码操作
             pageSizeChange(val) {
                 this.pageSizes = val
                 this.pageChange(1)
             },
-
+			
+			// 下拉选择
             onSelectChange(val) {
                 this.$emit('onSelectChange', val)
             },
@@ -506,7 +511,12 @@
 
             .myTable .ivu-table-sort i {
                 color: #fff;
+				margin-left: 1px;
             }
+			
+			.myTable .ivu-table-sort i.on{
+				color: #4cf8da;
+			}
 
         .myTable .ivu-table-header .ivu-table-cell {
             font-size: 14px;

+ 4 - 4
TEAMModelOS/ClientApp/src/components/student-analysis/total/BaseRadar.vue

@@ -13,10 +13,9 @@
                 radarData: []
             }
         },
-        mounted() {
-            this.radarData = this.getRadarData
-            this.drawLine(this.radarData)
-        },
+		created() {
+			console.log('1111')
+		},
         methods: {
             drawLine(indicator, data) {
                 // 基于准备好的dom,初始化echarts实例
@@ -46,6 +45,7 @@
                             }
                         },
                         center: ['50%', '50%'],
+						radius:'60%',
                         tooltip: {
                             trigger: 'item'
                         },

+ 2 - 2
TEAMModelOS/ClientApp/src/components/student-analysis/total/ExportTables.vue

@@ -38,14 +38,14 @@
                     this.checkAll = !this.checkAll
                 }
                 this.indeterminate = false
-
                 if (this.checkAll) {
-                    this.checkAllGroup = this.tableList.map(item => item.name + '.xls')
+                    this.checkAllGroup = this.tableList.map(item => item.tableName)
                 } else {
                     this.checkAllGroup = []
                 }
             },
             checkAllGroupChange(data) {
+				console.log(data)
                 if (data.length === this.tableList.length) {
                     this.indeterminate = false
                     this.checkAll = true

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

@@ -45,5 +45,10 @@ export default {
             text1: '快速登入code 无效'
         },
         text1: 'IES5智慧服务平台'
+    },
+    modal: {
+        title: '选择身分',
+        btn1: '老师',
+        btn2: '学生'
     }
 }

+ 5 - 0
TEAMModelOS/ClientApp/src/locale/lang/zh-CN/login.js

@@ -45,5 +45,10 @@ export default {
             text1: '快速登入code 无效'
         },
         text1: 'IES5智慧服务平台'
+    },
+    modal: {
+        title: '选择身分',
+        btn1: '老师',
+        btn2: '学生'
     }
 }

+ 8 - 12
TEAMModelOS/ClientApp/src/locale/lang/zh-CN/schoolBaseInfo.js

@@ -1,8 +1,4 @@
 export default {
-  // Index.vue
-  createPeriod: '建立学级制度',
-  classroomSetting: '教室设置',
-
   // SystemSetting.vue
   schoolNameLabel: '学校名称:',
   periodSettingLabel: '学制设置',
@@ -30,13 +26,13 @@ export default {
   ssTips6: '年级数已达上限!',
   ssTips7: '学期数已达上限!',
   ssTips8: '您修改信息后还未保存,如果离开数据将会丢失!',
-  presetPeriod: '预设学段',
-  persetSemester: '预设学期',
-  persetGrade: '预设年级',
+  presetPeriod: '学段',
+  persetSemester: '学期',
+  persetGrade: '年级',
   presetGrade1: '一年级',
   presetGrade2: '二年级',
   presetGrade3: '三年级',
-  presetSubject: '预设学科',
+  presetSubject: '学科',
   presetSubject1: '语文',
   presetSubject2: '数学',
   presetSubject3: '英语',
@@ -56,9 +52,9 @@ export default {
   uploadPlan: '上传平面图',
   hiteachList: 'HiTeach序号列表',
   codeSearchHolder: '请输入关键字搜索',
-  classroomCodeHolder: '请输入教室编码...',
-  classroomNameHolder: '请输入教室名称...',
-  headmasterHolder: '请指定教师名称...',
+  classroomCodeHolder: 'eg: HBCN0101',
+  classroomNameHolder: 'eg: 一年级一班',
+  headmasterHolder: '可通过名字搜索...',
   hiTeachHolder: '请在右侧列表选择可用序号...',
   noHiTeachTips: '没有可用序号',
   suportCanvas: '当前浏览器不支持Canvas,请更换浏览器再试试。',
@@ -75,7 +71,7 @@ export default {
   csTips5: '上传成功!',
   csTips6: '此序号已绑定到教室!',
   csTips7: '删除成功!',
-  presetClassroomName: '预设教室',
+  presetClassroomName: '教室',
   presetHeadmaster: '未指定班主任'
 
 }

+ 5 - 0
TEAMModelOS/ClientApp/src/locale/lang/zh-TW/login.js

@@ -45,5 +45,10 @@ export default {
             text1: '快速登入code 無效'
         },
         text1: 'IES5智慧服務平台'
+    },
+    modal: {
+        title: '選擇身分',
+        btn1: '老師',
+        btn2: '學生'
     }
 }

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

@@ -1,8 +1,4 @@
 export default {
-  // Index.vue
-  createPeriod: '建立學級制度',
-  classroomSetting: '教室設定',
-
   // SystemSetting.vue
   schoolNameLabel: '學校名稱:',
   periodSettingLabel: '學制設定',
@@ -30,13 +26,13 @@ export default {
   ssTips6: '年級數已達上限!',
   ssTips7: '學期數已達上限!',
   ssTips8: '您修改資訊後還未保存,如果離開數據將會遺失!',
-  presetPeriod: '預設學段',
-  persetSemester: '預設學期',
-  persetGrade: '預設年級',
+  presetPeriod: '學段',
+  persetSemester: '學期',
+  persetGrade: '年級',
   presetGrade1: '一年級',
   presetGrade2: '二年級',
   presetGrade3: '三年級',
-  presetSubject: '預設學科',
+  presetSubject: '學科',
   presetSubject1: '語文',
   presetSubject2: '數學',
   presetSubject3: '英語',
@@ -74,7 +70,7 @@ export default {
   csTips5: '上傳成功!',
   csTips6: '此序號已綁定到教室!',
   csTips7: '刪除成功!',
-  presetClassroomName: '預設教室',
+  presetClassroomName: '教室',
   presetHeadmaster: '未指定班主任'
 
 }

+ 24 - 5
TEAMModelOS/ClientApp/src/router/routes.js

@@ -4,7 +4,10 @@ import FrontEndMain from '@/components/public/frontEndMain/Index.vue'
 // import HTTP404 from '@/view/404'
 // import { resolve } from 'url'
 
-export const routes = [{
+let identity = localStorage.getItem('identity')
+
+export const routes = [
+	{
 		path: '*',
 		redirect: '/404'
 	},
@@ -16,7 +19,7 @@ export const routes = [{
 	{
 		name: 'index',
 		path: '',
-		redirect: '/home'
+		redirect: identity == 'student' ? '/studentWeb' : '/home'
 	},
 	{
 		path: '/login',
@@ -228,6 +231,16 @@ export const routes = [{
 						name: 'testPaperList',
 						component: resolve => require(['@/view/evaluation/bank/index.vue'], resolve)
 					},
+					{
+						path: 'schoolBank',
+						name: 'schoolBank',
+						component: resolve => require(['@/view/evaluation/bank/index.vue'], resolve)
+					},
+					{
+						path: 'personalBank',
+						name: 'personalBank',
+						component: resolve => require(['@/view/evaluation/bank/index.vue'], resolve)
+					},
 					{
 						path: 'createCompose',
 						name: 'createCompose',
@@ -324,10 +337,16 @@ export const routes = [{
 				name: 'createOrderLearn',
 				component: resolve => require(['@/view/selfstudy/CreateOrderLearn.vue'], resolve)
 			},
-			//管理评测页面
+			//管理评测页面(学校)
+			{
+				path: 'schoolEvaluation',
+				name: 'schoolEvaluation',
+				component: resolve => require(['@/view/learnactivity/ManageEvaluation.vue'], resolve)
+			},
+			//管理评测页面(班级)
 			{
-				path: 'manageEvaluation',
-				name: 'manageEvaluation',
+				path: 'classEvaluation',
+				name: 'classEvaluation',
 				component: resolve => require(['@/view/learnactivity/ManageEvaluation.vue'], resolve)
 			},
 			//管理活动记录页面

+ 8 - 5
TEAMModelOS/ClientApp/src/service/User.js

@@ -36,7 +36,7 @@ export class User {
     }
     
     // 刷新登录信息,这个方法可以获取至当前登录用户的角色及权限等信息
-    static freshLogin(token) {        
+    static freshLogin() {        
       return new Promise(function(resolve, reject) {
           // 把信息放到access当中,类似vuex状态管理,在组件中,可以通过`computed`再获取到信息 
             // computed: {
@@ -71,8 +71,11 @@ export class User {
           localStorage.removeItem('user_details')
           localStorage.removeItem('access_token')
           localStorage.removeItem('expires_in')
-          localStorage.removeItem('id_token')          
-
+          localStorage.removeItem('id_token')
+          localStorage.removeItem('auth_token')
+          localStorage.removeItem('user_profile')
+          localStorage.removeItem('school_profile')
+          
           // 重置登录状态
           User.$access.reset();
           // 清空登录信息
@@ -80,9 +83,9 @@ export class User {
             'userAccess': {},
             'userInfo' : {}
           });          
-          window.location.href = '/'
+          // window.location.href = '/'
           resolve(true);
-        }, 1000);
+        }, 100);
       });
     }
 }

+ 1 - 1
TEAMModelOS/ClientApp/src/store/index.js

@@ -50,7 +50,7 @@ export default new Vuex.Store({
             user: 'admin',
             TEAMModelId: '1595321354',
             school: '醍摩豆书院',
-            schoolCode: 'HBCN'
+            schoolCode: 'hbcn'
         }
     },
     modules: {

+ 31 - 33
TEAMModelOS/ClientApp/src/store/module/schoolBaseInfo.js

@@ -80,44 +80,42 @@ export default {
                             'id_token': localStorage.getItem('id_token')
                         }).then(
                             res => {
-                                if (res) {
-                                    if (res.length > 0) {
-                                        let resData = res.classrooms
-                                        context.dispatch('getSchoolBaseData').then(
-                                            (res) => {
-                                                if (res.code == 1 || res.code == 3) {
-                                                    for (let index in resData) {
-                                                        let currentSchoolInfo = JSONPath.query(context.state.schoolBaseInfo, "$..period[?(@.periodCode=='" + resData[index].periodCode + "')]")
-                                                        if (currentSchoolInfo.length > 0) {
-                                                            resData[index].periodName = currentSchoolInfo[0].periodName
-                                                            resData[index].gradeName = JSONPath.query(context.state.schoolBaseInfo, "$..grades[?(@.gradeCode=='" + resData[index].gradeCode + "')]")[0].gradeName
-                                                        }
-                                                    }
-                                                    context.commit('setClassroomList', resData)
-                                                    resolve({
-                                                        code: 1,
-                                                        message: '数据请求成功'
-                                                    })
-                                                } else {
-                                                    console.log(res)
-                                                }
-                                            },
-                                            (err) => {
-                                                console.log(err)
-                                            }
-                                        )
-                                    } else {
-                                        resolve({
-                                            code: 2,
-                                            message: '请求成功,数据为空'
-                                        })
-                                    }
-                                } else {
+                                if (!res) {
                                     resolve({
                                         code: 0,
                                         message: '请求失败,API error!'
                                     })
+                                } 
+                                if (res.classrooms.length == 0) {
+                                    resolve({
+                                        code: 2,
+                                        message: '请求成功,数据为空'
+                                    })
                                 }
+                                let resData = res.classrooms
+                                context.dispatch('getSchoolBaseData').then(
+                                    (res) => {
+                                        if (res.code == 1 || res.code == 3) {
+                                            for (let index in resData) {
+                                                let currentSchoolInfo = JSONPath.query(context.state.schoolBaseInfo, "$..period[?(@.periodCode=='" + resData[index].periodCode + "')]")
+                                                if (currentSchoolInfo.length > 0) {
+                                                    resData[index].periodName = currentSchoolInfo[0].periodName
+                                                    resData[index].gradeName = JSONPath.query(context.state.schoolBaseInfo, "$..grades[?(@.gradeCode=='" + resData[index].gradeCode + "')]")[0].gradeName
+                                                }
+                                            }
+                                            context.commit('setClassroomList', resData)
+                                            resolve({
+                                                code: 1,
+                                                message: '数据请求成功'
+                                            })
+                                        } else {
+                                            console.log(res)
+                                        }
+                                    },
+                                    (err) => {
+                                        console.log(err)
+                                    }
+                                )
                             },
                             err => {
                                 resolve({

+ 8 - 7
TEAMModelOS/ClientApp/src/view/Home.vue

@@ -10,7 +10,7 @@
 				<BaseUserPoptip @logout="basicMenu('quit')"></BaseUserPoptip>
             </div>
             <div id="content" class="custom-scroll-bar" slot="content">
-                <router-view></router-view>
+                <router-view :key="this.$route.name"></router-view>
             </div>
         </BaseLayout>
 		<Modal v-model="isShowMock" title="作答数据模拟生成" width="400px" class="related-point-modal" style="z-index:99999">
@@ -60,7 +60,7 @@
                         }
                     },
                     (err) => {
-                        alert('API error!')
+                        this.$Message.error('API error!')
                     }
                 )
             },
@@ -69,11 +69,12 @@
             },
             basicMenu(name) {
                 if (name == 'quit') {
-                    localStorage.removeItem('access_token')
-                    localStorage.removeItem('expires_in')
-                    localStorage.removeItem('userInfo')
-                    localStorage.removeItem('userAccess')
-                    localStorage.removeItem('user_details')
+                //     localStorage.removeItem('access_token')
+                //     localStorage.removeItem('expires_in')
+                //     localStorage.removeItem('userInfo')
+                //     localStorage.removeItem('userAccess')
+                //     localStorage.removeItem('user_details')
+                    this.$User.logout()
                     this.$router.push({
                         path: '/login'
                     })

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

@@ -3,11 +3,11 @@
 		<!-- 筛选部分 -->
 		<Loading :top="100" v-show="importLoading" type="1"></Loading>
 		<div class="filter-wrap">
-			<div class="filter-item">
+			<div class="filter-item" v-show="!isShowSchoolBank">
 				<span class="filter-title">来源:</span>
 				<RadioGroup v-model="filterOrigin" type="button" @on-change="filterOriginChange">
-					<Radio :label="userId">个人题库</Radio>
 					<Radio :label="schoolCode">学校公用库</Radio>
+					<Radio :label="userId">个人题库</Radio>
 				</RadioGroup>
 			</div>
 			<div class="filter-item">
@@ -212,6 +212,7 @@
 			return {
 				userId: '',
 				schoolCode: '',
+				isShowSchoolBank:false,
 				dataLoading: false,
 				editExerciseModal: false,
 				currentExercise: {},
@@ -258,6 +259,13 @@
 			}
 		},
 		created() {
+			this.$EventBus.$on('showSchoolBank',(val)=> {
+				if(val){
+					this.isShowSchoolBank = val
+				}else{
+					this.isShowSchoolBank = false
+				}
+			})
 			this.getSchoolInfo()
 			this.uploadUrl = 'https://' + window.location.host + '/api/ImportExercise/uploadWord'
 		},
@@ -298,10 +306,11 @@
 			/** 获取区班校信息 */
 			getSchoolInfo() {
 				this.$store.dispatch('schoolBaseInfo/getSchoolBaseData').then(res => {
+					console.log(res)
 					this.schoolInfo = JSON.parse(JSON.stringify(res.data))
-					this.schoolCode = res.data.schoolCode
+					this.schoolCode = res.data.id
 					this.userId = this.$store.state.userInfo.TEAMModelId
-					this.filterOrigin = this.$store.state.userInfo.TEAMModelId
+					this.filterOrigin = this.$store.state.userInfo.schoolCode
 					this.periodList = res.data.period
 					this.gradeList = res.data.period[0].grades
 					this.subjectList = res.data.period[0].subjects

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

@@ -93,7 +93,7 @@
                 dataLoading: false,
                 randomModal: false,
                 isFilterPaper:true,
-                paperList: new Array(10).fill('1'),
+                paperList: [],
                 periodList: [],
                 gradeList: [],
                 subjectList: [],
@@ -162,7 +162,12 @@
                     setTimeout(() => {
                         that.dataLoading = false
                     }, 1000)
-                })
+                }).catch(err => {
+					setTimeout(() => {
+						this.$Message.error('试卷数据获取失败')
+					    that.dataLoading = false
+					}, 1000)
+				})
             },
 
             /**

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

@@ -36,7 +36,7 @@
 			}
 		},
 		created() {
-
+			
 		},
 		methods: {
 
@@ -84,6 +84,13 @@
 				this.currentTab = this.$route.params.tabName
 				this.tabName = this.$route.params.tabName
 			}
+			
+			console.log(this.$route)
+			if(this.$route.name === 'schoolBank'){
+				this.$EventBus.$emit('showSchoolBank',true)
+			}else{
+				this.$EventBus.$emit('showSchoolBank',false)
+			}
 		}
 	}
 </script>

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

@@ -490,7 +490,7 @@
 			// 重置编辑器
 			resetEditor() {
 				this.$router.push({
-					name: 'testPaperList',
+					name: 'personalBank',
 					params: {
 						tabName: 'exercise'
 					}

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

@@ -1,6 +1,6 @@
 <template>
     <div class="filter-wrap">
-        <div class="filter-item">
+        <div class="filter-item" v-show="!isShowSchoolBank">
             <span class="filter-title">来源:</span>
             <RadioGroup v-model="filterOrigin" type="button" @on-change="filterOriginChange">
                 <Radio :label="userId">个人试卷库</Radio>
@@ -89,6 +89,7 @@
                 userId: '',
                 schoolCode: '',
                 schoolInfo: {},
+				isShowSchoolBank:false,
                 isShowUploadList: false,
                 exersicesType: {
                     Single: '单选',
@@ -117,6 +118,14 @@
         },
         created() {
             this.getSchoolInfo()
+			this.$EventBus.$on('showSchoolBank',(val)=> {
+				if(val){
+					this.isShowSchoolBank = val
+					this.filterOrigin = this.schoolCode
+				}else{
+					this.isShowSchoolBank = false
+				}
+			})
         },
         methods: {
             /** 获取区班校信息 */

+ 2 - 2
TEAMModelOS/ClientApp/src/view/evaluation/index/CreateExercises.vue

@@ -379,7 +379,7 @@
 						console.log(this.getSimpleText(exerciseItem.question))
 						this.saveExercise(exerciseItem).then(res => {
 							this.$router.push({
-								name: 'testPaperList',
+								name: 'personalBank',
 								params: {
 									tabName: 'exercise'
 								}
@@ -540,7 +540,7 @@
 			// 重置编辑器
 			backToBank() {
 				this.$router.push({
-					name: 'testPaperList',
+					name: 'personalBank',
 					params: {
 						tabName: 'exercise'
 					}

+ 3 - 3
TEAMModelOS/ClientApp/src/view/evaluation/index/CreatePaper.vue

@@ -202,7 +202,7 @@
 
 			goBack() {
 				this.$router.push({
-					name: 'testPaperList',
+					name: 'personalBank',
 					params: {
 						tabName: 'paper'
 					}
@@ -320,7 +320,7 @@
 							}
 						},
 						(err) => {
-							alert('API error!')
+							this.$Message.error('API error!')
 						}
 					)
 				})
@@ -439,7 +439,7 @@
 													this.$Message.success(isEdit ? '编辑成功' : '保存成功')
 													this.isLoading = false
 													this.$router.push({
-														name: 'testPaperList',
+														name: 'personalBank',
 														params: {
 															tabName: 'paper'
 														}

+ 1 - 1
TEAMModelOS/ClientApp/src/view/evaluation/index/index.vue

@@ -13,7 +13,7 @@
             <ul>
                 <li @click="goRouter('createExercises')">创建习题</li>
                 <li @click="goRouter('exercisesList')">组卷中心</li>
-                <li @click="goRouter('testPaperList')">试卷试题库</li>
+                <li @click="goRouter('personalBank')">试卷试题库</li>
             </ul>
             <!--<Icon type="md-list" />-->
         </div>

+ 40 - 34
TEAMModelOS/ClientApp/src/view/learnactivity/CreateEvaluation.vue

@@ -3,27 +3,26 @@
         <div class="create-header">
             <p class="create-header-title">创建评测活动</p>
             <Button class="btn-save" type="text" :loading="isLoading" ghost icon="ios-albums-outline" @click="saveEvaluation">发布评测</Button>
+            <Button class="btn-save" type="text" :loading="isLoading" ghost icon="md-arrow-dropleft" @click="confirmToManage">返回上级</Button>
         </div>
         <div class="create-body">
             <div class="evaluation-attr-wrap">
                 <p class="wrap-label">基础信息</p>
                 <div style="width:100%; height:calc(100% - 45px);padding-top:30px;">
-                    <!--<vuescroll>-->
                     <Form ref="evaluationInfo" :model="evaluationInfo" label-position="top" class="evaluation-attr-form" label-colon :rules="ruleValidate">
                         <FormItem label="评测名称" prop="name">
                             <Input v-model="evaluationInfo.name" placeholder="评测名称" @on-change="handlePaperName"></Input>
                         </FormItem>
-                        <FormItem label="课程名称" prop="classType">
+                        <!--<FormItem label="课程名称" prop="classType">
                             <Select v-model="evaluationInfo.classType" @on-change="getClassType">
                                 <Option v-for="(item,index) in classList" :value="item.value" :key="index">{{ item.label }}</Option>
                             </Select>
-                        </FormItem>             
+                        </FormItem>-->             
                         <FormItem label="测试类型" prop="type">
                             <Select v-model="evaluationInfo.type">
                                 <Option v-for="(item,index) in typeList" :value="item.value" :key="index">{{ item.label }}</Option>
                             </Select>
                         </FormItem>
-
                         <FormItem label="施测对象">
                             <Select v-model="evaluationInfo.target" multiple>
                                 <Option v-for="(item,index) in classroomList" :value="item.classroomCode" :key="index">{{ item.classroomName }}</Option>
@@ -45,11 +44,10 @@
                         </FormItem>
 
                     </Form>
-                    <!--</vuescroll>-->
                 </div>
             </div>
             <div class="evaluation-question-wrap">
-                <div class="wrap-label" v-if="evaluationInfo.classType == '1'">
+                <div class="wrap-label" v-if="mode == 'school'">
                     <p>测试科目:</p>
                     <span v-for="(item,index) in evaluationInfo.testPaper" :key="index" :class="index == currentSubjectIndex ? 'subject-item subject-item-active':'subject-item'" @click="selectSubject(index)">
                         {{ jsFn.getPeriod($store.state.schoolBaseInfo.schoolBaseInfo, item.periodCode).periodName}}
@@ -61,7 +59,7 @@
                 </div>
                 <div class="evaluation-question-main">
                     <EmptyData :top="0" style="padding-top:100px;" v-if="evaluationInfo.testPaper.length == 0" textContent="暂无科目,请添加科目"></EmptyData>
-                    <div class="create-type-wrap" v-if="evaluationInfo.testPaper.length > 0 ||evaluationInfo.classType == '0'" >
+                    <div class="create-type-wrap" v-if="evaluationInfo.testPaper.length > 0 || mode == 'class'" >
                         <span>创建方式:</span>
                         <RadioGroup v-model="evaluationInfo.testPaper[currentSubjectIndex].createType" style="margin-left:25px;" @on-change="setActiveTab">
                             <Radio label="auto">自动组题</Radio>
@@ -70,7 +68,7 @@
                             <Radio label="import">试卷导入</Radio>
                         </RadioGroup>
                     </div>
-                    <Tabs v-model="activeTab" type="card" class="question-main-tabs" v-if="evaluationInfo.testPaper.length > 0 || evaluationInfo.classType == '0' " name="createTest">
+                    <Tabs v-model="activeTab" type="card" class="question-main-tabs" v-if="evaluationInfo.testPaper.length > 0 || mode == 'class' " name="createTest">
                         <TabPane label="组题条件" name="auto" v-if="evaluationInfo.testPaper[currentSubjectIndex].createType == 'auto'" :index="1" tab="createTest">
                             <AutoCreate :subjectCode="evaluationInfo.testPaper[currentSubjectIndex].subjectCode" :periodCode="evaluationInfo.testPaper[currentSubjectIndex].periodCode" @goToPreview="goToPreview" @autoQuestions="getAutoQuestions"></AutoCreate>
                         </TabPane>
@@ -161,12 +159,10 @@
     import ImportCreate from './ImportCreate.vue'
     import TeacherPreview from './TeacherPreview.vue'
     import StudentPreview from './StudentPreview.vue'
-    
     import jsFn from '@/utils/js-fn.js'
-import router from '../../router'
+    import router from '../../router'
     export default {
         components: {
-            
             AutoCreate,
             ManualCreate,
             TeacherPreview,
@@ -194,9 +190,9 @@ import router from '../../router'
                     type: [
                         { required: true, message: '测试类型不能为空!', trigger: 'change' }
                     ],
-                    classType: [
-                        { required: true, message: '测试课程不能为空!', trigger: 'change' }
-                    ],
+                    //classType: [
+                    //    { required: true, message: '测试课程不能为空!', trigger: 'change' }
+                    //],
                     publish: [
                         { required: true, message: '请设置发布方式!', trigger: 'change' }
                     ],
@@ -218,7 +214,7 @@ import router from '../../router'
                     name: '',
                     target: [],
                     type: '',
-                    classType:'',
+                    //classType:'',
                     publish: '',
                     startTime: undefined,
                     endTime: undefined,
@@ -262,7 +258,8 @@ import router from '../../router'
                         value: '1',
                         label:'定时发布'
                     }
-                ]
+                ],
+                mode:''
             }
         },
         methods: {
@@ -276,13 +273,25 @@ import router from '../../router'
                     item.name = this.evaluationInfo.name + '--' + item.subjectName
                 }
             },
+            /*
+             * 返回上一级
+             */
+            confirmToManage() {
+                if (this.mode == 'class') {
+                    this.$router.push({
+                        name: 'classEvaluation'
+                    })
+                } else {
+                    this.$router.push({
+                        name: 'schoolEvaluation'
+                    })
+                }
+            },
             /**
              * 处理挑选试卷事件
              * @param data
              */
             selectPaper(data) {
-                console.log('选择试卷')
-                console.log(data)
                 this.selectedPaper = data
                 this.confirmPaperStatus = true
             },
@@ -291,15 +300,9 @@ import router from '../../router'
                 //this.evaluationInfo.testPaper[this.currentSubjectIndex].markConfig = this.selectedPaper.markConfig
                 this.evaluationInfo.testPaper[this.currentSubjectIndex] = JSON.parse(JSON.stringify(this.selectedPaper))
                 this.evaluationInfo.testPaper[this.currentSubjectIndex].id = undefined
-                console.log('确认挑选试卷')
-                console.log(this.evaluationInfo.testPaper[this.currentSubjectIndex])
                 this.goToPreview()
             },
-            confirmToManage() {
-                this.$router.push({
-                    name: 'manageEvaluation'
-                })
-            },
+           
             /**
              * 将日期控件时间格式转成时间戳
              * @param value
@@ -402,9 +405,8 @@ import router from '../../router'
             setActiveTab(data) {
                 this.activeTab = data
             },
-            getClassType(data) {
-                console.log(data)
-                if (data == '0' && this.evaluationInfo.testPaper.length == 0) {
+            getClassType() {
+                if (this.evaluationInfo.testPaper.length == 0) {
                     this.evaluationInfo.testPaper.push({
                         periodName: '默认学段',
                         periodCode: '80650390',
@@ -451,7 +453,7 @@ import router from '../../router'
                         }
                     },
                     (err) => {
-                        alert('API error!')
+                        this.$Message.error('API error!')
                     }
                 )
             },
@@ -459,13 +461,16 @@ import router from '../../router'
              * 查找教师课程下的班级
              * */
             findClassroom() {
+                this.classroomList.length = 0
                 if (this.classroomList.length == 0) {
+                    console.log('测试模式')
                         this.$api.learnActivity.FindClassroomByTeacherId({
                             code:this.$store.state.userInfo.TEAMModelId
                         }).then(
                         res => {
                             if (res.error == null) {
                                 this.classroomList = res.result.data
+                                console.log(this.classroomList)
                             } else {
                                 this.$Message.error('API ERROR!')
                             }
@@ -589,7 +594,6 @@ import router from '../../router'
         },
         created() {
             let routerData = this.$route.params.evaluationInfo
-            console.log(routerData)
             if (routerData !== undefined) {
                 this.startTime = new Date(routerData.startTime)    
                 this.endTime = new Date(routerData.endTime)   
@@ -602,18 +606,20 @@ import router from '../../router'
                 处理无接口数据时返回为个人课程或校本课程
                 */  
                 if (routerData.testPaper.length > 1) {
-                    this.evaluationInfo.classType = '1'
+                    this.mode = 'school'
                 } else {
-                     this.evaluationInfo.classType = '0'
+                    this.mode = 'class'
                 }
-                console.log(this.evaluationInfo)
                 this.activeTab = 'preview'
             }
             this.getSchoolBaseInfo()
             this.findClassroom()
         },
         mounted() {
-
+            this.mode = this.$route.query.type
+            if (this.mode == 'class') {
+                this.getClassType()
+            }
         }
     }
 </script>

+ 16 - 3
TEAMModelOS/ClientApp/src/view/learnactivity/ManageEvaluation.vue

@@ -266,9 +266,22 @@
                 )
             },
             goToCreate() {
-                this.$router.push({
-                    name: 'createEvaluation'
-                })
+                let code = window.location.pathname.indexOf('school')
+                if (code >= 0) {
+                    this.$router.push({
+                        name: 'createEvaluation',
+                        query: {
+                            type: 'school'
+                        }
+                    })
+                } else {
+                    this.$router.push({
+                        name: 'createEvaluation',
+                        query: {
+                            type: 'class'
+                        }
+                    })
+                }
             },
             drawPie(flag) {
                 if (flag) {

+ 4 - 3
TEAMModelOS/ClientApp/src/view/learnactivity/ManageRecord.vue

@@ -38,9 +38,9 @@
                         </div>
                         <div class="chart-box">
                             <vuescroll>
-                                <div v-if="item.code == 1">
+                                <div v-if="item.code == 1" style="margin-left:5px">
                                     <Loading :top="200" bgColor="rgba(103, 103, 103, 0.27)" type="1" v-show="isLoading"></Loading>
-                                    <span style="float:right;margin-right:25px;margin-top:5px;cursor:pointer" @click="getTestData"><Icon :type="testStatus ? 'md-list-box':'md-stats'" style="margin-right:5px;" />{{testStatus ? '成绩列表':'成绩分析'}}</span>
+                                    <span style="text-align: right; margin-top: 5px; width: 100%; display: block; padding-right: 20px; cursor: pointer;" @click="getTestData"><Icon :type="testStatus ? 'md-list-box':'md-stats'" style="margin-right:5px;" />{{testStatus ? '成绩列表':'成绩分析'}}</span>
                                     <div v-if="!testStatus" class="chart" style="margin:auto">
                                         <Grade v-if="studentList.length !== 0" :studentData="studentList"></Grade>
                                     </div>
@@ -51,8 +51,9 @@
                                 </div>
                                 <div v-if="item.code == 2">
                                     <div style="height:400px">
-                                        <ProgressBar  :countData="countData"></ProgressBar>
                                         <PassBar :passData="passData"></PassBar>
+                                        <ProgressBar :countData="countData"></ProgressBar>
+
                                     </div>
                                 </div>
                                 <div v-if="item.code == 3">

+ 59 - 7
TEAMModelOS/ClientApp/src/view/login/Index.vue

@@ -30,6 +30,39 @@
     }
   }
 }
+.identityModal{
+  .ivu-modal{
+    .ivu-modal-content{
+      background-color: #2a292e;
+      padding: 12px;
+      border: 1px solid #ccc;
+      .ivu-modal-header, .ivu-modal-footer{
+        border: 0;
+      }
+      .ivu-modal-footer{
+        padding: 0;
+      }
+      .ivu-modal-header{
+        padding: 5px 16px;
+        p{
+          color: whitesmoke;
+        }
+      }
+      .identity-body{
+        display: flex;
+        justify-content: space-around;
+        align-items: center;
+        .ivu-btn{
+          background-color: #1cc0f2;
+          color: white;
+          font-weight: bold;
+          border: 0;
+          padding: 0 22px;
+        }
+      }
+    }        
+  }
+}
 </style>
 
 <template>
@@ -38,7 +71,7 @@
       <!-- 保留 可能以後有校徽 <img src=""> -->
       <span>{{ defaultSchool.name }}</span>
     </div>
-    <div class="formDiv" style="">
+    <div class="formDiv">
       <div class="loginBox">
         <div class="title">
           <div class="logo">
@@ -167,6 +200,15 @@
       </Form>
       </div>
     </div>
+    <!-- 提示視窗 -->
+    <Modal v-model="identityFlag" width="360" :mask-closable="false" :closable="false" class-name="identityModal">
+        <p slot="header">{{ $t('login.modal.title') }}</p>
+        <div class="identity-body">
+            <Button size="large" @click="goWhere('teacher')">{{ $t('login.modal.btn1') }}</Button>
+            <Button size="large" @click="goWhere('student')">{{ $t('login.modal.btn2') }}</Button>
+        </div>
+        <div slot="footer"></div>
+    </Modal>
   </div>
 </template>
 <script>
@@ -296,8 +338,8 @@ export default {
       defaultSchool: {
         name: '',
         code: ''
-      }
-
+      },
+      identityFlag: false
     }
   },
   computed: {
@@ -369,6 +411,7 @@ export default {
               }              
               break;
             case 'studForm':
+
               // 學生登入大雲
               await this.$api.login.studLogin({schoolCode: this.studForm.schoolCode, id: this.studForm.id, pw: this.studForm.pass}).then( res => {
                 result = res
@@ -383,8 +426,8 @@ export default {
                 //設定權限並登入
                 User.login(result).then(res => {
                   if(res) {
-                    let path = (name == 'studForm' ? 'studentWeb' : '/home' )
-                    this.$router.push({ path: path })
+                    localStorage.setItem('identity', 'student')
+                    this.$router.push({ path: '/studentWeb' })
                   }
                 })
               }              
@@ -489,9 +532,13 @@ export default {
       })
 
       //設定權限並登入
+      let identity = localStorage.getItem('identity')
       User.login(result).then(res => {
-        if(res) {
-          this.$router.push({ path: '/home' })
+        if(res && identity) {
+          let path = identity == 'student' ? '/studentWeb' : '/home'
+          this.$router.push({ path: path })
+        } else {
+          this.identityFlag = true;
         }
       })
     },
@@ -539,6 +586,11 @@ export default {
           this.studForm.schoolCode = this.defaultSchool.code
         })
       }
+    },
+    goWhere: function(identity){
+      localStorage.setItem('identity', identity)
+      let path = identity == 'student' ? '/studentWeb' : '/home'
+      this.$router.push({ path: path })
     }
   }
 }

+ 2 - 2
TEAMModelOS/ClientApp/src/view/newcourse/CourseBaseSetting.vue

@@ -150,7 +150,7 @@
                         }
                     },
                     (err) => {
-                        alert('API error!')
+                        this.$Message.error('API error!')
                     }
                 )
             },
@@ -162,7 +162,7 @@
                         }
                     },
                     (err) => {
-                        alert('API error!')
+                        this.$Message.error('API error!')
                     }
                 )
             },

+ 3 - 1
TEAMModelOS/ClientApp/src/view/newcourse/ManageCourse.vue

@@ -238,7 +238,8 @@
                     periodCode: '',
                     subjectCode: '',
                     semesterCode: '',
-                    courseCode:''
+                    courseCode: '',
+                    school_code:''
                 }
             },
             //显示确认删除对话框
@@ -310,6 +311,7 @@
                 this.$refs['courseBaseInfo'].validate((valid) => {
                     if (valid) {
                         this.courseBaseInfo.code = this.$store.state.userInfo.schoolCode
+                        this.courseBaseInfo.school_code = this.$store.state.userInfo.schoolCode
                         this.$api.courseMgmt.saveOrUpdateCourse(this.courseBaseInfo).then(
                             (res) => {
                                 if (res.error == null) {

+ 146 - 144
TEAMModelOS/ClientApp/src/view/schoolmgmt/ClassroomSetting/ClassroomSetting.vue

@@ -23,17 +23,16 @@
             </div>
             <div class="class-list">
                 <vuescroll>
-
-                    <div class="class-list-item" v-for="(item,index) in classroomListShow" :key="index" @click="chooseClassroom(index)" :class="currentClassroomIndex == index ? 'block-bg block-bg-active':'block-bg'">
+                    <div class="class-list-item" v-for="(item,index) in classroomListShow" :key="index" @click="chooseClassroom(index)" :class="curClassIndex == index ? 'block-bg block-bg-active':'block-bg'">
                         <div class="class-list-item-left">
-                            <p class="class-name">{{item.classroomName}}</p>
+                            <p class="class-name">{{item.name}}</p>
                             <p class="class-hiteach-code second-text-color">{{item.hiteach}}</p>
                             <p class="class-type">
                                 <Icon type="md-arrow-dropright" size="18" />{{item.classroomType}}
                             </p>
                             <p class="second-text-color">
                                 <span>{{$t('schoolBaseInfo.headmaster')}}</span>
-                                <span class="primary-text-color">{{item.headMaster}}</span>
+                                <span class="primary-text-color">{{item.teacher.name}}</span>
                             </p>
                         </div>
                     </div>
@@ -57,42 +56,49 @@
                     <!--班级属性-->
                     <div class="class-attr-wrap disabled-iview-select">
                         <vuescroll>
-                            <Form v-if="classroomList[currentClassroomIndex]" ref="classInfo" :model="classroomList[currentClassroomIndex]" :rules="classValidate" style="padding-top:20px;">
-                                <FormItem prop="classroomCode" @click.native.stop>
+                            <Form v-if="classroomList[curClassIndex]" ref="classInfo" :model="classroomList[curClassIndex]" :rules="classValidate" style="padding-top:20px;">
+                                <FormItem prop="id" @click.native.stop>
                                     <span slot="label" class="class-attr-wrap-label">{{$t('schoolBaseInfo.classroomCode')}}</span>
-                                    <Input :disabled="editStatus" v-model="classroomList[currentClassroomIndex].classroomCode" clearable :placeholder="$t('schoolBaseInfo.classroomCodeHolder')" />
+                                    <Input :disabled="editStatus" v-model="classroomList[curClassIndex].id" clearable :placeholder="$t('schoolBaseInfo.classroomCodeHolder')" />
                                 </FormItem>
-                                <FormItem prop="classroomName" :label="$t('schoolBaseInfo.classroomName')" @click.native.stop>
+                                <FormItem prop="name" :label="$t('schoolBaseInfo.classroomName')" @click.native.stop>
                                     <span slot="label" class="class-attr-wrap-label">{{$t('schoolBaseInfo.classroomName')}}</span>
-                                    <Input :disabled="editStatus" v-model="classroomList[currentClassroomIndex].classroomName" clearable :placeholder="$t('schoolBaseInfo.classroomNameHolder')" />
+                                    <Input :disabled="editStatus" v-model="classroomList[curClassIndex].name" clearable :placeholder="$t('schoolBaseInfo.classroomNameHolder')" />
                                 </FormItem>
-                                <FormItem prop="classroomName" @click.native.stop>
+                                <FormItem prop="openType" @click.native.stop>
                                     <span slot="label" class="class-attr-wrap-label">班级属性</span>
-                                    <Select :disabled="editStatus" v-model="classroomList[currentClassroomIndex].openType" clearable>
+                                    <Select :disabled="editStatus" v-model="classroomList[curClassIndex].openType" clearable>
                                         <Option v-for="(item,index) in attributeList" :value="item.value" :key="index">{{ item.label }}</Option>
                                     </Select>
                                 </FormItem>
-                                <FormItem prop="headMaster" :label="$t('schoolBaseInfo.headmaster')" @click.native.stop>
-                                    <span slot="label" class="class-attr-wrap-label">{{$t('schoolBaseInfo.headmaster')}}</span>
-                                    <Select :disabled="editStatus" v-model="classroomList[currentClassroomIndex].headMaster" clearable>
-                                        <Option v-for="(item,index) in $store.state.teachers.teacherList" :value="item.id" :key="index">{{ item.name }}</Option>
-                                    </Select>
-                                </FormItem>
-                                <FormItem prop="periodCode" :label="$t('schoolBaseInfo.setPeriod')" @click.native.stop>
+                                <FormItem prop="period.periodCode" :label="$t('schoolBaseInfo.setPeriod')" @click.native.stop>
                                     <span slot="label" class="class-attr-wrap-label">{{$t('schoolBaseInfo.setPeriod')}}</span>
-                                    <Select :disabled="editStatus" v-model="classroomList[currentClassroomIndex].periodCode" clearable>
-                                        <Option v-for="(item,index) in $store.state.schoolBaseInfo.schoolBaseInfo.period" :value="item.periodCode" :key="index">{{ item.periodName }}</Option>
+                                    <Select :disabled="editStatus" v-model="classroomList[curClassIndex].period.periodCode" clearable>
+                                        <Option v-for="(item,index) in $store.state.schoolBaseInfo.schoolBaseInfo.period" :value="item.periodCode" :key="index" @click.native="classroomList[curClassIndex].period = { periodCode: item.periodCode, periodName: item.periodName }">
+                                            {{ item.periodName }}
+                                        </Option>
                                     </Select>
                                 </FormItem>
-                                <FormItem prop="gradeCode" :label="$t('schoolBaseInfo.setGrade')" @click.native.stop>
+                                <FormItem prop="grade.gradeCode" :label="$t('schoolBaseInfo.setGrade')" @click.native.stop>
                                     <span slot="label" class="class-attr-wrap-label">{{$t('schoolBaseInfo.setGrade')}}</span>
-                                    <Select :disabled="editStatus" v-model="classroomList[currentClassroomIndex].gradeCode" clearable>
-                                        <Option v-for="(item,index) in $jsFn.getPeriod($store.state.schoolBaseInfo.schoolBaseInfo,classroomList[currentClassroomIndex].periodCode).grades" :value="item.gradeCode" :key="index">{{ item.gradeName }}</Option>
+                                    <Select :disabled="editStatus" v-model="classroomList[curClassIndex].grade.gradeCode" clearable>
+                                        <Option v-for="(item,index) in $jsFn.getPeriod($store.state.schoolBaseInfo.schoolBaseInfo,classroomList[curClassIndex].period.periodCode).grades" :value="item.gradeCode" :key="index"
+                                                @click.native="classroomList[curClassIndex].grade = {gradeName: item.gradeName, gradeCode:item.gradeCode}">
+                                            {{ item.gradeName }}
+                                        </Option>
+                                    </Select>
+                                </FormItem>
+                                <FormItem prop="teacher" :label="$t('schoolBaseInfo.headmaster')" @click.native.stop>
+                                    <span slot="label" class="class-attr-wrap-label">{{$t('schoolBaseInfo.headmaster')}}</span>
+                                    <Select :disabled="editStatus" v-model="classroomList[curClassIndex].teacher.id" clearable>
+                                        <Option v-for="(item,index) in $store.state.teachers.teacherList" :value="item.id" :key="index" @click.native="classroomList[curClassIndex].teacher = {id:item.id, name:item.name}">
+                                            {{ item.name }}
+                                        </Option>
                                     </Select>
                                 </FormItem>
                                 <FormItem prop="hiteach" :label="$t('schoolBaseInfo.setHiteachCode')" @click.native.stop>
                                     <span slot="label" class="class-attr-wrap-label">{{$t('schoolBaseInfo.setHiteachCode')}}</span>
-                                    <Input ref="hiteachCode" @on-focus="toBlur" v-model="classroomList[currentClassroomIndex].hiteach" :disabled="editStatus" :placeholder="$t('schoolBaseInfo.hiTeachHolder')" clearable />
+                                    <Input ref="hiteachCode" @on-focus="toBlur" v-model="classroomList[curClassIndex].hiteach" :disabled="editStatus" :placeholder="$t('schoolBaseInfo.hiTeachHolder')" clearable />
                                 </FormItem>
                             </Form>
                         </vuescroll>
@@ -102,7 +108,7 @@
                         <div class="hiteach-code-wrap-header">
                             <p>
                                 {{$t('schoolBaseInfo.hiteachList')}}
-                                <Icon style="float:right;margin-right:12px;margin-top:2px;cursor:pointer;" class="label-icon" color="white" type="md-add" @click="addHiTeachCode" />
+                                <Icon style="float:right;margin-right:12px;margin-top:2px;cursor:pointer;" class="label-icon" color="white" type="md-add" @click="addCode = true" />
                             </p>
                             <Input clearable v-model="serchCode" :placeholder="$t('schoolBaseInfo.codeHolder')" style="width: 100%;height:30px;" @on-change="filterCode">
                             <Icon style="margin-top:0px;" type="ios-search" slot="suffix" />
@@ -142,7 +148,6 @@
         <Modal v-model="addCode"
                :title="$t('schoolBaseInfo.addCodeTitle')"
                @on-ok="confirmAdd"
-               @on-cancel="cancelAdd"
                class-name="dark-iview-modal dark-iview-form">
             <Form :model="hiTeachItem" :label-width="80" label-position="left">
                 <FormItem :label="$t('schoolBaseInfo.hiTeach')">
@@ -156,69 +161,28 @@
                 </FormItem>
             </Form>
         </Modal>
-        <Modal v-model="delClassroomStatus"
+        <Modal v-model="delClassStatus"
                title="删除班级"
                @on-ok="delClassroom(delIndex)">
-            <p v-if="delIndex">确认删除 {{classroomListShow[delIndex].classroomName}} 吗?</p>
+            <p v-if="delIndex">确认删除 {{classroomListShow[delIndex].name}} 吗?</p>
         </Modal>
     </div>
 </template>
 
 <script>
-
-    import Loading from '@/common/Loading.vue'
     export default {
-        components: {
-            Loading
-        },
         data() {
             return {
-                attributeList: [
-                    {
-                        value: '1',
-                        label: '常规班级(有固定学生)'
-                    },
-                    {
-                        value: '2',
-                        label: '专科班级(无固定学生)'
-                    }
-                ],
                 editStatus: true,//可切换编辑状态
                 noStatus: false,
-                teacherList: [],
                 isSearch: false,
                 currentTabIndex: 0,
-                classValidate: {
-                    classroomCode: [
-                        { required: true, message: '请设置班级编码', trigger: 'change' }
-                    ],
-                    classroomName: [
-                        { required: true, message: '请输入班级名称', trigger: 'change' }
-                    ],
-                    headMaster: [
-                        { required: true, message: '请设置班主任', trigger: 'change' }
-                    ],
-                    periodCode: [
-                        { required: true, message: '请设置学段', trigger: 'change' }
-                    ],
-                    gradeCode: [
-                        { required: true, message: '请设置年级', trigger: 'change' }
-                    ]
-                },
-                delClassroomStatus: false,
+                delClassStatus: false,
                 isListLoading: false,
                 isSaveLoading: false,
-                hiTeachItem: {
-                    code: '',
-                    single: undefined,
-                    using: 0
-                },
                 addCode: false,
                 isInit: true,
                 updated: false,
-                model1: '',
-                headMaster: '',
-                className: '',
                 hiTeachsShow: [],
                 hiTeachs: [
                     {
@@ -288,23 +252,8 @@
                 ],
                 classroomList: [],
                 classroomListShow: [],
-                periodList: [
-                    {
-                        periodName: '暂无学段信息',
-                        periodCode: '',
-                        grades: [
-                            {
-                                gradeName: '暂无年级信息',
-                                gradeCode: ''
-                            }
-                        ]
-                    }
-                ],
-                gradeList: [],
-                currentClassroomIndex: 0,
+                curClassIndex: 0,
                 schoolPlan: '',
-                file: '',
-                imgUrl: '',
                 point: {},
                 clickPoint: {},
                 isMouseDown: false,
@@ -317,16 +266,51 @@
                 textStatus: true,
                 serchClassName: '',
                 serchCode: '',
-                serchHiteach: '',
                 scaleDefault: 1,
                 maxScale: 3,
                 minScale: 0.4,
                 scaleStep: 0.1,
                 stopScale: false,
-                delIndex: undefined
+                delIndex: undefined,
+                hiTeachItem: {
+                    code: '',
+                    single: undefined,
+                    using: 0
+                },
+                attributeList: [
+                    {
+                        value: '1',
+                        label: '常规班级(有固定学生)'
+                    },
+                    {
+                        value: '2',
+                        label: '专科班级(无固定学生)'
+                    }
+                ],
+                classValidate: {
+                    id: [
+                        { required: true, message: '请设置班级编码', trigger: 'change' }
+                    ],
+                    name: [
+                        { required: true, message: '请输入班级名称', trigger: 'change' }
+                    ],
+                    openType: [
+                        { required: true, message: '请教室属性', trigger: 'change' }
+                    ],
+                    'period.periodCode': [
+                        { required: true, message: '请设置学段', trigger: 'change' }
+                    ],
+                    'grade.gradeCode': [
+                        { required: true, message: '请设置年级', trigger: 'change' }
+                    ]
+                },
             }
         },
         methods: {
+            setPeriodObj(item) {
+                this.classroomList[this.curClassIndex].period.periodName = item.periodName
+                this.classroomList[this.curClassIndex].period.periodCode = item.periodCode
+            },
             //处理失去焦点
             toBlur() {
                 this.$Message.warning('请从右侧序列号列表中选择')
@@ -338,9 +322,6 @@
                     this.bundleScoll()
                 }
             },
-            addHiTeachCode() {
-                this.addCode = true
-            },
             confirmAdd() {
                 this.hiTeachs.push(this.hiTeachItem)
                 this.filterCode()
@@ -349,9 +330,6 @@
                     single: undefined,
                     using: 0
                 }
-            },
-            cancelAdd() {
-
             },
             bundleScoll() {
                 let schoolPlanBox = document.getElementById('school-plan-box')
@@ -438,7 +416,7 @@
                 if (this.serchClassname == '') {
                     this.classroomListShow = [...this.classroomList]
                 } else {
-                    this.classroomListShow = this.classroomList.filter(item => item.classroomName.indexOf(_this.serchClassName) != -1)
+                    this.classroomListShow = this.classroomList.filter(item => item.name.indexOf(_this.serchClassName) != -1)
                 }
             },
             drawText(text, x, y) {
@@ -470,7 +448,7 @@
                 this.schoolPlan = document.getElementById('school-plan')
                 let ctx = this.schoolPlan.getContext('2d')
                 for (let i = 0; i < this.classroomList.length; i++) {
-                    let icon = i == this.currentClassroomIndex ? this.greenImageData : this.whiteImageData
+                    let icon = i == this.curClassIndex ? this.greenImageData : this.whiteImageData
                     ctx.drawImage(icon,
                         this.classroomList[i].point.x * this.scaleDefault, this.classroomList[i].point.y * this.scaleDefault,
                         20 * this.scaleDefault, 20 * this.scaleDefault)
@@ -497,7 +475,7 @@
                 this.point = this.getCanvasPoint(e.clientX, e.clientY)
                 this.clickPoint = this.getCanvasPoint(e.clientX, e.clientY)
                 this.activeIcon = this.checkActivieIcon(this.point)
-                if (this.activeIcon != -1 && this.activeIcon != this.currentClassroomIndex) {
+                if (this.activeIcon != -1 && this.activeIcon != this.curClassIndex) {
                     this.$Message.warning('当前班级未选中,不能移动!')
                     this.activeIcon = -1
                 } else {
@@ -521,7 +499,7 @@
                     let index = this.checkActivieIcon(this.point)
                     if (index != -1) {
                         if (this.textStatus == true) {
-                            this.drawText(this.classroomList[index].classroomName, (this.classroomList[index].point.x + 25) * this.scaleDefault, (this.classroomList[index].point.y + 20) * this.scaleDefault)
+                            this.drawText(this.classroomList[index].name, (this.classroomList[index].point.x + 25) * this.scaleDefault, (this.classroomList[index].point.y + 20) * this.scaleDefault)
                             this.textStatus = false
                         }
                     } else {
@@ -595,8 +573,9 @@
                 reader.readAsDataURL(file)
                 reader.onload = () => {
                     const _base64 = reader.result
-                    this.imgUrl = _base64 // 将_base64赋值给图片的src,实现图片预览
-                    _this.drawSchoolPlan(this.imgUrl)
+                    //this.imgUrl = _base64 // 将_base64赋值给图片的src,实现图片预览
+                    //_this.drawSchoolPlan(this.imgUrl)
+                    _this.drawSchoolPlan(_base64)
                 }
                 return false
             },
@@ -605,26 +584,37 @@
                     if (!valid) {
                         this.$Message.error('请先完善班级信息再保存!')
                     } else {
-                        this.classroomList[this.currentClassroomIndex]['code'] = this.$store.state.userInfo.schoolCode
+                        let option = this.classroomList[this.curClassIndex].option
+                        if (!option) {
+                            option = 'update'
+                        }
+                        delete this.classroomList[this.curClassIndex].option
+                        this.classroomList[this.curClassIndex]['code'] = this.$store.state.userInfo.schoolCode
                         this.isSaveLoading = true
                         this.isListLoading = true
-                        this.$api.schoolSetting.classroomSettingSaveOrUpdate(this.classroomList[this.currentClassroomIndex]).then(
+                        this.$api.schoolSetting.classroomSettingSaveOrUpdate({
+                            classroom: this.classroomList[this.curClassIndex],
+                            option: option
+                        }).then(
                             res => {
                                 if (res) {
-                                    this.$Message.success(this.$t('schoolBaseInfo.csTips3'))
-                                    this.classroomList[this.currentClassroomIndex].id = res.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
+                                    if (res.error) {
+                                        this.classroomList[this.curClassIndex].option = 'insert'
+                                        this.$Message.error(res.v)
+                                    } else {
+                                        this.$Message.success(this.$t('schoolBaseInfo.csTips3'))
+                                        this.updated = false
                                     }
+                                    
+                                } else {
+                                    this.$Message.error('API error!')
                                 }
                             },
                             err => {
+                                console.log(err)
+                            }
+                        ).finally(
+                            () => {
                                 this.isSaveLoading = false
                                 this.isListLoading = false
                             }
@@ -640,8 +630,7 @@
                         if (res.code == 1 || res.code == 3) {
                             this.classroomList = this.$store.state.schoolBaseInfo.classroomList
                             this.filterClassname()
-                        } else {
-                        }
+                        } 
                         setTimeout(() => {
                             this.isListLoading = false
                         }, 500)
@@ -649,12 +638,16 @@
                     (err) => {
                         this.isListLoading = false
                     }
-                )
+                ).finally(() => {
+                    setTimeout(() => {
+                        this.isListLoading = false
+                    }, 500)
+                })
             },
             /**显示确认删除班级对话框 */
             showConfirmDelete(index) {
-                this.delClassroomStatus = true
-                this.delIndex = this.currentClassroomIndex
+                this.delClassStatus = true
+                this.delIndex = this.curClassIndex
             },
 
             delClassroom(index) {
@@ -665,8 +658,8 @@
                     }).then(
                         (res) => {
                             if (res.error == null) {
-                                if (this.currentClassroomIndex >= index && index > 0) {
-                                    this.currentClassroomIndex = 0
+                                if (this.curClassIndex >= index && index > 0) {
+                                    this.curClassIndex = 0
                                 }
                                 this.delIndex = undefined
                                 this.classroomList.splice(index, 1)
@@ -684,8 +677,8 @@
                         }
                     )
                 } else {
-                    if (this.currentClassroomIndex >= index && index > 0) {
-                        this.currentClassroomIndex = 0
+                    if (this.curClassIndex >= index && index > 0) {
+                        this.curClassIndex = 0
                     }
                     this.delIndex = undefined
                     this.classroomList.splice(index, 1)
@@ -701,7 +694,7 @@
                 this.$Message.success(this.$t('schoolBaseInfo.csTips5'))
             },
             chooseClassroom(index) {
-                if (index != this.currentClassroomIndex) {
+                if (index != this.curClassIndex) {
                     if (this.updated) {
                         let config = {
                             render: (h) => {
@@ -715,7 +708,7 @@
                                 })
                             },
                             onOk: () => {
-                                this.delClassroom(this.currentClassroomIndex)
+                                this.delClassroom(this.curClassIndex)
                             },
                             onCancel: () => {
 
@@ -723,7 +716,7 @@
                         }
                         this.$Modal.confirm(config)
                     } else {
-                        this.currentClassroomIndex = index
+                        this.curClassIndex = index
                     }
                     if (this.currentTabIndex == 1) {
                         this.initIcon()
@@ -746,16 +739,16 @@
                         if (this.hiTeachs[i].using > 0) {
                             this.$Message.warning(this.$t('schoolBaseInfo.csTips6'))
                         } else {
-                            if (!this.isEmpty(this.classroomList[this.currentClassroomIndex].hiteach)) {
+                            if (!this.isEmpty(this.classroomList[this.curClassIndex].hiteach)) {
                                 let showIndex = -1
                                 let allIndex = -1
                                 this.hiTeachsShow.forEach((v, i) => {
-                                    if (v.code == this.classroomList[this.currentClassroomIndex].hiteach) {
+                                    if (v.code == this.classroomList[this.curClassIndex].hiteach) {
                                         showIndex = i
                                     }
                                 })
                                 this.hiTeachs.forEach((v, i) => {
-                                    if (v.code == this.classroomList[this.currentClassroomIndex].hiteach) {
+                                    if (v.code == this.classroomList[this.curClassIndex].hiteach) {
                                         allIndex = i
                                     }
                                 })
@@ -765,20 +758,20 @@
                                 }
                             }
                             this.hiTeachs[i].using = 1
-                            this.classroomList[this.currentClassroomIndex].hiteach = this.hiTeachsShow[index].code
-                            this.classroomList[this.currentClassroomIndex].classroomType = '智慧班级'
+                            this.classroomList[this.curClassIndex].hiteach = this.hiTeachsShow[index].code
+                            this.classroomList[this.curClassIndex].classroomType = '智慧班级'
                         }
                     } else {
-                        if (!this.isEmpty(this.classroomList[this.currentClassroomIndex].hiteach)) {
+                        if (!this.isEmpty(this.classroomList[this.curClassIndex].hiteach)) {
                             let showIndex = -1
                             let allIndex = -1
                             this.hiTeachsShow.forEach((v, i) => {
-                                if (v.code == this.classroomList[this.currentClassroomIndex].hiteach) {
+                                if (v.code == this.classroomList[this.curClassIndex].hiteach) {
                                     showIndex = i
                                 }
                             })
                             this.hiTeachs.forEach((v, i) => {
-                                if (v.code == this.classroomList[this.currentClassroomIndex].hiteach) {
+                                if (v.code == this.classroomList[this.curClassIndex].hiteach) {
                                     allIndex = i
                                 }
                             })
@@ -787,8 +780,8 @@
                             }
                         }
                         this.hiTeachs[i].using++
-                        this.classroomList[this.currentClassroomIndex].hiteach = this.hiTeachsShow[index].code
-                        this.classroomList[this.currentClassroomIndex].classroomType = '智慧班级'
+                        this.classroomList[this.curClassIndex].hiteach = this.hiTeachsShow[index].code
+                        this.classroomList[this.curClassIndex].classroomType = '智慧班级'
                     }
                     this.filterCode()
                 }
@@ -825,23 +818,32 @@
             addClassroom() {
                 this.serchClassName = ''
                 this.classroomList.unshift({
-                    classroomName: this.$t('schoolBaseInfo.presetClassroomName') + (this.classroomList.length + 1),
-                    hiteach: '',
-                    headMaster: this.$t('schoolBaseInfo.presetHeadmaster'),
-                    periodCode: '',
-                    gradeCode: '',
-                    studentCount: 0,
+                    id: '',
+                    name: this.$t('schoolBaseInfo.presetClassroomName') + (this.classroomList.length + 1),
                     classroomType: '一般班级',
-                    classroomCode: '',
+                    hiteach: '',
+                    openType: '1',
+                    teacher: {
+                        id: '',
+                        name: ''
+                    },
+                    period: {
+                        periodCode: '',
+                        periodName: ''
+                    },
+                    grade: {
+                        gradeName: '',
+                        gradeCode:''
+                    },
                     point: {
                         x: 5,
                         y: 5
-                    }
+                    },
+                    option:'insert'
                 })
                 this.classroomListShow = [...this.classroomList]
                 this.drawIcon(5, 6)
-                //this.currentClassroomIndex = this.classroomList.length - 1
-                this.currentClassroomIndex = 0
+                this.curClassIndex = 0
             }
         },
         mounted() {

+ 1 - 1
TEAMModelOS/ClientApp/src/view/schoolmgmt/SystemSetting/SystemSetting.vue

@@ -96,7 +96,7 @@
                                         <li v-for="(item,index) in monthList" :key="index" :title="timeLineColor(index).text">
                                             <span class="time-label" :style="{color: timeLineColor(index).color}">{{item}}</span>
                                             <span class="time-dot" :style="{borderColor: timeLineColor(index).color}">
-                                                <span v-show="timeLineColor(index).color != '#606060'" class="time-inner-dot" :style="{backgroundColor: timeLineColor(index).color}"></span>
+                                                <span class="time-inner-dot" :style="{backgroundColor: timeLineColor(index).color}"></span>
                                                 <span class="time-line-tail"></span>
                                             </span>
                                             <div v-show="timeLineColor(index).color != '#606060'">

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

@@ -313,12 +313,12 @@
                                     // this.initData();
                                     this.uploadLoading = false
                                 } else {
-                                    alert('API error!')
+                                    this.$Message.error('API error!')
                                 }
                                 this.isLoading = false
                             },
                             (err) => {
-                                alert('API error!')
+                                this.$Message.error('API error!')
                                 this.isLoading = false
                             }
                         )
@@ -339,7 +339,7 @@
                                 this.isLoading = false
                             },
                             (err) => {
-                                alert('API error!')
+                                this.$Message.error('API error!')
                                 this.isLoading = false
                             }
                         )

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

@@ -338,7 +338,7 @@
                                 this.initData()
                                 this.uploadLoading = false
                             } else {
-                                alert('API error!')
+                                this.$Message.error('API error!')
                             }
                         },
                         (err) => {

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

@@ -390,7 +390,7 @@
                                     this.tableLoading = false
                                 },
                                 (err) => {
-                                    alert('API error!')
+                                    this.$Message.error('API error!')
                                     this.tableLoading = false
                                 }
                             )
@@ -451,7 +451,7 @@
                         }
                     },
                     (err) => {
-                        alert('API error!')
+                        this.$Message.error('API error!')
                     }
                 )
             },
@@ -553,7 +553,7 @@
                             [...this.tableShowData] = this.tableData
                             this.tableLoading = false
                         } else {
-                            alert('API error!')
+                            this.$Message.error('API error!')
                             this.tableLoading = false
                         }
                     },

+ 1 - 23
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/AchievementAnalysis/EntryTables.vue

@@ -10,7 +10,6 @@
                        :tableName="$t('totalAnalysis.ach_title4')"
                        :tableDatas="entryTableData"
                        tableRef="entryTable"
-                       @onSortChange="onSortChange"
                        :pageSize="10"
                        :tips="'* 绿色代表进线,蓝色代表踩线'"></BaseTable>
         </Row>
@@ -22,7 +21,6 @@
             <BaseTable :columns="entryRateColumns"
                        :tableName="$t('totalAnalysis.ach_title5')"
                        :tableDatas="entryBarData"
-                       @onSortChange="onSortChange"
                        tableRef="entryRateTable"
                        :isScroll="false"
                        ref="rateTable"></BaseTable>
@@ -90,7 +88,7 @@
                     {
                         title: this.$t('totalAnalysis.ach_table_text1'),
                         key: 'gradeRank',
-                        sortable: true
+                        sortable: 'custom'
                     },
                     {
                         title: this.$t('totalAnalysis.base_class'),
@@ -140,26 +138,6 @@
 				// 清除之前的科目columns 添加当前评测的科目columns
 				this.entryNumberColumns.splice(4,this.entryNumberColumns.length - 4,...subjectColumns)
             },
-
-            // 表格排序方法
-            onSortChange(data) {
-                let order = data.order // 当前排序方式 升序、降序、正常
-                let key = data.key // 当前排序依据
-                let tableData = JSON.parse(JSON.stringify(data.origin)) // 当前表格源数据
-                switch (order) {
-                    case 'asc':
-                        this.entryTableData = this.entryTableData.sort((a, b) => { return a[key] - b[key] })
-                        break
-                    case 'desc':
-                        this.entryTableData = this.entryTableData.sort((a, b) => { return b[key] - a[key] })
-                        break
-                    case 'normal':
-                        this.entryTableData = tableData
-                        break
-                    default:
-                        break
-                }
-            }
         },
         mounted() {
             this.$refs.rateTable.$el.childNodes[1].style.borderRight = '0'

+ 2 - 2
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/KnowledgeAnalysis/ScoreDetails.vue

@@ -7,7 +7,7 @@
                 <div v-show="!isShowRadar">
                     <BaseDetailBar echartsId="knowDetailBar" :echartData="knowledgeData" @handleItemClick="handleItemClick" ref="detailsBar"></BaseDetailBar>
                 </div>
-                <div v-show="isShowRadar">
+                <div v-if="isShowRadar">
                     <BaseRadar echartsId="knowRadar"></BaseRadar>
                 </div>
             </Col>
@@ -49,7 +49,7 @@
         },
         data() {
             return {
-                isShowRadar: true,
+                isShowRadar: false,
                 tableData: [],
                 classDatas: [],
                 currentPoint: '',

+ 2 - 2
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/LevelAnalysis/ScoreDetails.vue

@@ -7,7 +7,7 @@
                 <div v-show="!isShowRadar">
                     <BaseDetailBar echartsId="levelDetailBar" :echartData="levelData" @handleItemClick="handleItemClick" ref="detailsBar"></BaseDetailBar>
                 </div>
-                <div v-show="isShowRadar">
+                <div v-if="isShowRadar">
                     <BaseRadar echartsId="levelRadar"></BaseRadar>
                 </div>
             </Col>
@@ -45,7 +45,7 @@
         },
         data() {
             return {
-                isShowRadar: true,
+                isShowRadar: false,
                 tableData: [],
                 classDatas: [],
                 currentPoint: '应用',

+ 1 - 0
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/TestAnalysis/QuestionList.vue

@@ -470,6 +470,7 @@
 
             // 返回题目区域总分 字符串换算
             sumArr(arr) {
+				console.log(arr)
                 return arr.reduce((a,b) => a + b)
             }
         },

+ 1 - 0
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/TestAnalysis/TestAnalysis.vue

@@ -54,6 +54,7 @@
                     <div slot="content" class="index-wrap">
                         <span v-for="(item,index) in exerciseIndexList"
                               :key="index"
+							  :title="index"
                               class="exercise-item-index"
                               @click="onIndexClick(item)"
                               :style="{background: (+item > 9 ? item : '0' + item) === currentExerciseIndex ? '#d482ab':'#018B99' }">

+ 44 - 1
TEAMModelOS/ClientApp/src/view/student-web/App.vue

@@ -26,6 +26,19 @@
           <div id="profile-pop">
             <span class="profile-pop-triangle"></span>
             <h5 class="profileName">Nancy Chen (ST11096)</h5>
+            <Dropdown v-if="users.roles.length > 1" @on-click="onRoleSelect" trigger="click" style="width: 100%;" transfer-class-name="test">
+              <li class="profile-pop-item">
+                <a href="javascript:void(0)">
+                  <Icon size="15" type="ios-person" class="profile-pop-itemIcon3" />
+                  {{ getRoleName(curRole) }}
+                  <Icon type="ios-arrow-down"></Icon>
+                </a>
+              </li>
+              <DropdownMenu slot="list">
+                  <DropdownItem :name="'teacher'">{{ '教师' }}</DropdownItem>
+                  <DropdownItem :name="'student'">{{ '學生' }}</DropdownItem>
+              </DropdownMenu>
+            </Dropdown>
             <router-link to="/studentWeb/Setting">
               <li class="profile-pop-item">
                 <svg-icon
@@ -34,7 +47,7 @@
                 />{{ $t("studentWeb.setting") }}
               </li>
             </router-link>
-            <li class="profile-pop-item">
+            <li class="profile-pop-item" @click="onQuit">
               <svg-icon icon-class="logout" class="profile-pop-itemIcon2" />{{
                 $t("studentWeb.logout")
               }}
@@ -264,8 +277,17 @@ export default {
       eventPageType: ["課前預習", "評量", "作業", "投票", "問卷"], //活動頁出現的類型
       isClickInfoPop: false,
       isTyping: false,
+      curRole: '',
+      users: ''
     };
   },
+  computed: {
+    getRoleName() {
+      return val => {
+        return val === 'student' ? '学生' : '教师'
+      }
+    }
+  },
   watch: {
     courseID: function (value) {
       if (value != "") {
@@ -278,6 +300,7 @@ export default {
   created() {
     this.createMockdataOriginal();
     this.createMockdata();
+    this.getUsers();
   },
   mounted() {
     this.$nextTick(() => {
@@ -397,6 +420,26 @@ export default {
         this.isClickInfoPop = false;
       }, 1000);
     },
+    getUsers: function(){
+      this.users = JSON.parse(decodeURIComponent(localStorage.userInfo, "utf-8"));
+			if(this.users.roles.length){
+				this.curRole = localStorage.getItem('identity')
+			}
+    },
+    onRoleSelect(val){
+      if(localStorage.getItem('identity') != val){
+        this.curRole = val
+        let path = val === 'student' ? '/studentWeb' : '/home'
+        localStorage.setItem('identity', val)
+        this.$router.push({ path: path })					
+      }
+    },
+    onQuit() {
+      this.$User.logout()
+      this.$router.push({
+          path: '/login'
+      })
+    },
   },
 };
 </script>

+ 3 - 3
TEAMModelOS/ClientApp/src/view/teachcontent/index.vue

@@ -474,7 +474,7 @@
                             }
                         },
                         (err) => {
-                            alert('API error!')
+                            this.$Message.error('API error!')
                         }
                     )
                 }
@@ -495,7 +495,7 @@
                         this.acticveFileIndex = -1
                     },
                     (err) => {
-                        alert('API error!')
+                        this.$Message.error('API error!')
                     }
                 )
             },
@@ -615,7 +615,7 @@
                         }
                     },
                     (err) => {
-                        alert('API error!')
+                        this.$Message.error('API error!')
                     }
                 )
             },

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

@@ -58,11 +58,11 @@ export default {
         this.$store.dispatch('user/getSchoolTeacher').then(
               (res) => {
                   if (res.code == 0) {
-                      alert('無法取得使用者資料')
+                      this.$Message.error('無法取得使用者資料')
                   }
               },
               (err) => {
-                  alert('user/setSchoolTeacher API error!')
+                  this.$Message.error('user/setSchoolTeacher API error!')
               }
           )
     },

+ 4 - 4
TEAMModelOS/ClientApp/src/view/teachermgmt/components/personnel/Index.vue

@@ -369,7 +369,7 @@ export default {
                             }
                         },
                         (err) => {
-                            alert('user/setSchoolUser API error!')
+                            this.$Message.error('user/setSchoolUser API error!')
                         }
                     )
                 },
@@ -491,7 +491,7 @@ export default {
                     }
                 },
                 (err) => {
-                    alert('user/addSchoolUser API error!')
+                    this.$Message.error('user/addSchoolUser API error!')
                 })
             }
         },
@@ -555,7 +555,7 @@ export default {
                         }
                     },
                     (err) => {
-                        alert('user/setSchoolUser API error!')
+                        this.$Message.error('user/setSchoolUser API error!')
                     }
                 )
             }
@@ -582,7 +582,7 @@ export default {
                             }
                         },
                         (err) => {
-                            alert('user/updSchoolUserStatus API error!')
+                            this.$Message.error('user/updSchoolUserStatus API error!')
                         }
                     )
                 }

+ 3 - 3
TEAMModelOS/ClientApp/src/view/teachermgmt/components/userList/Index.vue

@@ -616,11 +616,11 @@ export default {
                             if (res.code === 1) {
                                 this.$Message.info(this.$t('teachermgmt.message.info1'))
                             } else {
-                                alert('Can not set Auth.')
+                                this.$Message.error('Can not set Auth.')
                             }
                         },
                         (err) => {
-                            alert('user/setSchoolUser API error: ' + err)
+                            this.$Message.error('user/setSchoolUser API error: ' + err)
                         }
                     )
                 }
@@ -744,7 +744,7 @@ export default {
                         this.closeAuthSeting()
                 },
                 (err) => {
-                    alert('user/setSchoolUser API error: ' + err)
+                    this.$Message.error('user/setSchoolUser API error: ' + err)
                 })
             } else {
                 this.$Modal.warning({

+ 109 - 24
TEAMModelOS/Controllers/Analysis/AchievementController.cs

@@ -95,6 +95,7 @@ namespace TEAMModelOS.Controllers.Analysis
             //
             dict.TryGetValue("subjectCode", out object subjectCode);
             dict.TryGetValue("code", out object code);
+            dict.TryGetValue("schoolCode", out object schoolCode);
             List<ExamResult> exams = new List<ExamResult>();
             /*if (RedisHelper.Instance != null)
             {
@@ -122,7 +123,14 @@ namespace TEAMModelOS.Controllers.Analysis
             };
             //声明进行标准用来设置进线标准,权重等参数
             dict.TryGetValue("Standard", out object Standard);
-            List<Student> students = await _azureCosmos.FindByDict<Student>(stuMap);
+            //List<Student> students = await _azureCosmos.FindByDict<Student>(stuMap);
+            List<Student> students = null;
+            if (RedisHelper.Exists(CacheCosmosPrefix + "students"))
+            {
+                students = RedisHelper.HGet<List<Student>>(CacheCosmosPrefix + "students", ShaHashHelper.GetSHA1(schoolCode.ToString()));
+                //builder.Data(info);
+                //students.Add(student);
+            }
             //Console.WriteLine(DateTimeOffset.Now.Second);
             List<Dictionary<string, object>> examList = new List<Dictionary<string, object>>();
             HashSet<string> classList = new HashSet<string>();
@@ -337,10 +345,10 @@ namespace TEAMModelOS.Controllers.Analysis
 
                 List<List<string>> sp = new List<List<string>>();
                 //Dictionary<string, int> rankScore = new Dictionary<string, int>();
-                List<int> rankScore = new List<int>();
+                List<double> rankScore = new List<double>();
                 foreach (string key in dicts.Keys)
                 {
-                    int score = 0;
+                    double score = 0;
                     List<string> values = new List<string>();
                     keys.ForEach(x =>
                     {
@@ -351,7 +359,7 @@ namespace TEAMModelOS.Controllers.Analysis
                         int index = keys.IndexOf(val[1]);
                         values[index] = val[2];
                         values[keys.IndexOf("name")] = val[0];
-                        score += int.Parse(val[2]);
+                        score += double.Parse(val[2]);
                         values[keys.IndexOf("score")] = score + "";
                     }
                     rankScore.Add(score);
@@ -361,13 +369,13 @@ namespace TEAMModelOS.Controllers.Analysis
                 //处理人数为整
                 string ip = iPersons.ToString("0");
                 //初始化进线分数
-                int ipoint = 0;
+                double ipoint = 0;
                 //计算成绩年级排名
-                rankScore.Sort(delegate (int s1, int s2) { return s2.CompareTo(s1); });
+                rankScore.Sort(delegate (double s1, double s2) { return s2.CompareTo(s1); });
                 ipoint = rankScore[int.Parse(ip)];
                 foreach (List<string> rank in sp)
                 {
-                    int index = rankScore.IndexOf(int.Parse(rank[3]));
+                    int index = rankScore.IndexOf(double.Parse(rank[3]));
                     rank[2] = (index + 1) + "";
                 }
                 //排除成绩为零的选手
@@ -1074,7 +1082,7 @@ namespace TEAMModelOS.Controllers.Analysis
             //string Type = "";
             if (dict.TryGetValue("type", out object Type))
             {
-                paper.ForEach(p =>
+                /*paper.ForEach(p =>
                 {
                     p.item.ForEach(i =>
                     {
@@ -1084,7 +1092,19 @@ namespace TEAMModelOS.Controllers.Analysis
 
 
                     });
-                });
+                });*/
+                knowledge.Add("知识");
+                knowledge.Add("理解");
+                knowledge.Add("应用");
+                knowledge.Add("分析");
+                knowledge.Add("综合");
+                knowledge.Add("评鉴");
+                area.Add("知识");
+                area.Add("理解");
+                area.Add("应用");
+                area.Add("分析");
+                area.Add("综合");
+                area.Add("评鉴");
             }
             else
             {
@@ -1283,11 +1303,18 @@ namespace TEAMModelOS.Controllers.Analysis
                     }
                     valuew[1] = OnePoint.ToString();
                     string itemNos = "";
-                    foreach (string index in itemNo)
+                    if (itemNo.Count > 0)
                     {
-                        itemNos += index + ",";
+                        foreach (string index in itemNo)
+                        {
+                            itemNos += index + ",";
+                        }
+                        valuew[2] = itemNos[0..^1];
                     }
-                    valuew[2] = itemNos[0..^1];
+                    else {
+                        valuew[2] = itemNos;
+                    }
+                    
                 });
                 int rhwC = 0;
                 int rhlC = 0;
@@ -1386,18 +1413,35 @@ namespace TEAMModelOS.Controllers.Analysis
                                 n++;
                             }
                         });
-                        double stuPser = anwPoint / po;
-                        values[3] = po.ToString();
-                        values[4] = anwPoint.ToString();
-                        values[5] = stuPser.ToString("0.00");
+                        if (po == 0)
+                        {
+                            values[3] = "0";
+                            values[4] = "0";
+                            values[5] = "0";
+                        }
+                        else {
+                            double stuPser = anwPoint / po;
+                            values[3] = po.ToString();
+                            values[4] = anwPoint.ToString();
+                            values[5] = stuPser.ToString("0.00");
+                        }
+
                         //stuItem.Add(values);
                     });
                     stuPersent.Add(values);
                     m++;
                 }
                 AchievementService.ReName(stuPersent, ids, classes, students);
-                double knowPser = anwGPoint / poG;
-                knowPer.Add(knowPser.ToString("0.00"));
+                double knowPser = 0;
+                if (poG == 0)
+                {
+                    knowPer.Add("0");
+                }
+                else {
+                    knowPser = anwGPoint / poG;
+                    knowPer.Add(knowPser.ToString("0.00"));
+                }
+               
                 //错题关系表
                 valuew[3] = knowPser.ToString("0.00");
                 valuew[4] = wrongCount.ToString();
@@ -1455,8 +1499,16 @@ namespace TEAMModelOS.Controllers.Analysis
 
                         }
                     }
-                    double classPser = anwCPoint / cpo;
-                    knowledgeClass.Add(classPser.ToString("0.00"));
+                    if (cpo == 0)
+                    {
+                        //double classPser = anwCPoint / cpo;
+                        knowledgeClass.Add("0");
+                    }
+                    else {
+                        double classPser = anwCPoint / cpo;
+                        knowledgeClass.Add(classPser.ToString("0.00"));
+                    }
+                   
                 }
                 classMap.Add(knowledgeName[k], knowledgeClass);
                 per.Add(persent.ToString("0.00"));
@@ -1559,7 +1611,40 @@ namespace TEAMModelOS.Controllers.Analysis
             try
             {
                 List<ExamInfo> info = await _azureCosmos.FindByDict<ExamInfo>(dict);
+                List<ExamResult> exams = new List<ExamResult>();
+                for (int i = 0; i < info.Count; i++) {
+                    for (int j = 0; j < info[i].conditions.subject.Count; j++)
+                    {
+                        if (RedisHelper.Exists(CacheCosmosPrefix + "examResult" + info[i].conditions.subject[j]))
+                        {
+                            ExamResult result = RedisHelper.HGet<ExamResult>(CacheCosmosPrefix + "examResult" + info[i].conditions.subject[j], ShaHashHelper.GetSHA1(info[i].examCode.ToString()));
+                            //builder.Data(info);
+                            exams.Add(result);
+                        }
+                    }
+                    //初始化总分
+                    double sumPoint = 0;
+                    for (int k = 0; k < exams.Count; k++) {
+                        for (int n = exams[k].ids.Count - 1; n >= 0;n--)
+                        {
+                            if (exams[k].ids[n].Equals("0"))
+                            {
+                                exams[k].ids.Remove(exams[k].ids[n]);
+                            }
+                        }
+                        //获取总分数
+                        exams[k].result.ForEach(r =>
+                        {
+                            sumPoint += r.Sum();
+                        });                        
+                        info[i].realCount = exams[k].ids.Count;
+                    }
+                    info[i].piont = sumPoint / info[i].realCount;
+                    //目前单次考试权重关系和权重次数
+                    info[i].index = info[i].piont * 1 / 1;
 
+                }
+                
                 if (RedisHelper.Instance != null)
                 {
                     if (!RedisHelper.Exists(CacheCosmosPrefix + method))
@@ -1855,8 +1940,8 @@ namespace TEAMModelOS.Controllers.Analysis
 
                             // 学生总分
                             double coreSum = 0;
-                            //int stuCount = newInfo[i].stuCount;
-                            int stuCount = 0;
+                            int stuCount = newInfo[i].stuCount;
+                            //int stuCount = 0;
                             //初始化进行人数
                             double iPersons = 0;
 
@@ -1931,7 +2016,7 @@ namespace TEAMModelOS.Controllers.Analysis
                                         //每个班级实际参考人数
                                         counts = value[1] - value[0] + 1;
                                         //stuSum += counts;
-                                        stuCount += counts;
+                                        //stuCount += counts;
                                         points = Convert.ToDouble(classPoint) / counts / sum;
                                         //计算每个班级平均得分
                                         AveragePoints = Convert.ToDouble(classPoint) / counts;
@@ -1948,7 +2033,7 @@ namespace TEAMModelOS.Controllers.Analysis
                             //获取进线人数
                             iPersons = stuCount / classList.Count * 0.4;
                             //权重配分 学生总平均分 * 权重配分
-                            double core = coreSum / (stuCount / classList.Count) * weight;
+                            double core = coreSum / stuCount * weight;
                             CoreAverage.Add(core);
                             AllPoint.Add(SubjectClassAverage);
                             AllPointAverage.Add(SubjectAverage);

+ 31 - 36
TEAMModelOS/Controllers/Analysis/ChangeController.cs

@@ -50,7 +50,7 @@ namespace TEAMModelOS.Controllers.Analysis
         {
             // 获取系统路径
             string contentRootPath = _hostingEnvironment.ContentRootPath;
-            identity = "IES/2000149590";
+            identity = "IES/19910";
             //string query = "$.info";
             //int countClasses = 0; 
             //string queryClass = "$member.1.item_answer[*]";
@@ -58,7 +58,7 @@ namespace TEAMModelOS.Controllers.Analysis
             //string queryInfo = "$.info";
             string queryPoint = "$.testpaper.items[*]";
             string queryInfo = "$.testpaper.info";
-            string querySchoolInfo = "$.exercises[0].info";
+            string querySchoolInfo = "$.exercises[*].info";
             string data = FileTool.getJson(contentRootPath, identity);
             data = FileTool.UnicodeToString(data);
             JsonElement parsedJson = JsonExtensions.ToObject<JsonElement>(data);
@@ -177,24 +177,19 @@ namespace TEAMModelOS.Controllers.Analysis
 
             School sc = new School();
             ExamInfo examInfo = new ExamInfo();
-            SchoolInfo.ForEach(s =>
-            {
-                s.TryGetProperty("stucount", out JsonElement stucount);
-                s.TryGetProperty("ex_no", out JsonElement exam_no);
-                s.TryGetProperty("ex_time", out JsonElement ex_time);
-                s.TryGetProperty("ex_endtime", out JsonElement ex_endtime);
-                s.TryGetProperty("school_name", out JsonElement school_name);
-                s.TryGetProperty("school_code", out JsonElement school_code);
-                s.TryGetProperty("ex_name", out JsonElement ex_name);
-                s.TryGetProperty("ex_type", out JsonElement ex_type);
-                s.TryGetProperty("grade_name", out JsonElement grade_name);
-                s.TryGetProperty("semester", out JsonElement semester);
-                s.TryGetProperty("period_name", out JsonElement period_name);
-                s.TryGetProperty("period_code", out JsonElement period_code);
-                s.TryGetProperty("class_code", out JsonElement class_code);
-                s.TryGetProperty("grade_code", out JsonElement grade_code);
-                //s.TryGetProperty("semester", out JsonElement semester);
-                string count = stucount.ToString();
+                SchoolInfo[0].TryGetProperty("ex_no", out JsonElement exam_no);
+                SchoolInfo[0].TryGetProperty("ex_time", out JsonElement ex_time);
+                SchoolInfo[0].TryGetProperty("ex_endtime", out JsonElement ex_endtime);
+                SchoolInfo[0].TryGetProperty("school_name", out JsonElement school_name);
+                SchoolInfo[0].TryGetProperty("school_code", out JsonElement school_code);
+                SchoolInfo[0].TryGetProperty("ex_name", out JsonElement ex_name);
+                SchoolInfo[0].TryGetProperty("ex_type", out JsonElement ex_type);
+                SchoolInfo[0].TryGetProperty("grade_name", out JsonElement grade_name);
+                SchoolInfo[0].TryGetProperty("semester", out JsonElement semester);
+                SchoolInfo[0].TryGetProperty("period_name", out JsonElement period_name);
+                SchoolInfo[0].TryGetProperty("period_code", out JsonElement period_code);
+                SchoolInfo[0].TryGetProperty("class_code", out JsonElement class_code);
+                SchoolInfo[0].TryGetProperty("grade_code", out JsonElement grade_code);
                 string st = ex_time.ToString();
                 string ed = ex_endtime.ToString();
                 DateTime.TryParse(st, out DateTime tt);
@@ -204,12 +199,8 @@ namespace TEAMModelOS.Controllers.Analysis
 
                 sc.schoolCode = school_code.ToString();
                 sc.name = school_name.ToString();
-                sc.period.Add(new Period { periodName = period_name.ToString(), periodCode = period_code.ToString(),
-                    grades = new List<Grade> {
-                    new Grade { gradeName = grade_name.ToString() ,gradeCode = grade_code.ToString()} }
-                });
-                /*sc.period = new List<Period> { new Period {periodName = period_name.ToString() , periodCode = period_code.ToString(),grades= new List<Grade> {
-                    new Grade { gradeName = grade_name.ToString() ,gradeCode = grade_code.ToString()} } } };*/
+                sc.period = new List<Period> { new Period {periodName = period_name.ToString() , periodCode = period_code.ToString(),grades= new List<Grade> {
+                    new Grade { gradeName = grade_name.ToString() ,gradeCode = grade_code.ToString()} } } };
 
                 //考试基本信息
                 examInfo.id = _snowflakeId.NextId() + "";
@@ -219,22 +210,26 @@ namespace TEAMModelOS.Controllers.Analysis
                 examInfo.examCode = exam_no.ToString();
                 examInfo.startTime = time;
                 examInfo.endTime = edtime;
-                examInfo.stuCount = int.Parse(count);
                 examInfo.conditions = new Condition
                 {
                     period = period_code.ToString(),
                     grade = grade_code.ToString(),
                     semester = semester.ToString(),
                     subject = new List<string> { paper.subjectCode }
-                };            
+                };
+            SchoolInfo.ForEach(s =>
+            {
+                s.TryGetProperty("stucount", out JsonElement stucount);
+                string count = stucount.ToString();
+                examInfo.stuCount += int.Parse(count);
             });
             papers.ForEach(x =>
             {
                 x.TryGetProperty("info", out JsonElement info);
                 //var c = papers[i].member;
                 info.TryGetProperty("stucount", out JsonElement stucount);
-                info.TryGetProperty("class_name", out JsonElement class_name);
-                info.TryGetProperty("class_code", out JsonElement class_code);
+                info.TryGetProperty("course_name", out JsonElement class_name);
+                info.TryGetProperty("course_no", out JsonElement class_code);
                 info.TryGetProperty("school_name", out JsonElement school_name);
                 string stu = stucount.ToString();
                 int k = int.Parse(stu);
@@ -242,19 +237,19 @@ namespace TEAMModelOS.Controllers.Analysis
                 string schoolName =school_name.ToString();
                 Classroom classInfo = new Classroom
                 {
-                    id = _snowflakeId.NextId() + "",
-                    classroomName = key,
+                    //id = _snowflakeId.NextId() + "",
+                    name = key,
                     //classroomType = schoolName,
-                    studentCount = k,
-                    classroomCode = class_code.ToString()
+                    //studentCount = k,
+                    id = class_code.ToString()
                 };
                 classrooms.Add(classInfo);
                 Classroom classInfoOfStudent = new Classroom
                 {
-                    classroomName = key,
+                    name = key,
                     //schoolCode = schoolName,
                     //studentCount = k,
-                    classroomCode = "qcs"
+                    id = class_code.ToString()
                 };
                 Dictionary<string, int[]> map = new Dictionary<string, int[]>();
                 int[] Range = new int[2];

+ 7 - 7
TEAMModelOS/Controllers/Exam/PaperController.cs

@@ -64,7 +64,7 @@ namespace TEAMModelOS.Controllers
             var client = _azureCosmos.GetCosmosClient();
             List<object> papers = new List<object>();
             var query = $"select c.id,c.subjectCode,c.code,c.periodCode,c.name,c.itemCount,c.level,c.pointItem,c.pointScore,c.score,c.gradeCode from c where c.id = {id}";
-            await foreach (var item in client.GetContainer("TEAMModelOSTemp", "School").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Paper-{school_code}") }))
+            await foreach (var item in client.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Paper-{school_code}") }))
             {
                 using var json = await JsonDocument.ParseAsync(item.ContentStream);
                 if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
@@ -101,15 +101,15 @@ namespace TEAMModelOS.Controllers
         public async Task<IActionResult> Find(JsonElement requert)
         {
             //ResponseBuilder builder = ResponseBuilder.custom();
-            if (!requert.TryGetProperty("id_token", out JsonElement id_token)) return BadRequest();
-            if (!requert.TryGetProperty("school_code", out JsonElement school_code)) return BadRequest();
-            var jwt = new JwtSecurityToken(id_token.GetString());
+            //if (!requert.TryGetProperty("id_token", out JsonElement id_token)) return BadRequest();
+            if (!requert.TryGetProperty("code", out JsonElement code)) return BadRequest();
+            /*var jwt = new JwtSecurityToken(id_token.GetString());
             if (!jwt.Payload.Iss.Equals("account.teammodel", StringComparison.Ordinal)) return BadRequest();
-            var id = jwt.Payload.Sub;
+            var id = jwt.Payload.Sub;*/
             var client = _azureCosmos.GetCosmosClient();
             List<object> papers = new List<object>();
-            var query = $"select * from c where c.id = {id}";
-            await foreach (var item in client.GetContainer("TEAMModelOSTemp", "School").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Paper-{school_code}") }))
+            var query = $"select c.id,c.subjectCode,c.code,c.periodCode,c.name,c.itemCount,c.level,c.pointItem,c.pointScore,c.score,c.gradeCode from c";
+            await foreach (var item in client.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Paper-{code}") }))
             {
                 using var json = await JsonDocument.ParseAsync(item.ContentStream);
                 if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)

+ 40 - 26
TEAMModelOS/Controllers/School/ClassRoomController.cs

@@ -34,44 +34,58 @@ namespace TEAMModelOS.Controllers
         [ProducesDefaultResponseType]
         //[AuthToken(Roles = "Teacher")]
         [HttpPost("upsert")]
-        public async ValueTask<IActionResult> Upsert(Classroom request)
+        public async ValueTask<IActionResult> Upsert(JsonElement requert)
         {
-            ResponseBuilder builder = ResponseBuilder.custom();
+            //ResponseBuilder builder = ResponseBuilder.custom();
             List<Student> students = null;
+            Classroom classroom = new Classroom();
+            if (!requert.TryGetProperty("classroom", out JsonElement room)) return BadRequest();
+            if (!requert.TryGetProperty("option", out JsonElement option)) return BadRequest();
+            classroom = room.ToObject<Classroom>();
+            var client = _azureCosmos.GetCosmosClient();
+            classroom.ttl = -1;
+            classroom.pk = typeof(Classroom).Name;
 
-            if (request.id != null)
-            {
-                await _azureCosmos.SaveOrUpdate(request);
-                students = await _azureCosmos.FindByDict<Student>(new Dictionary<string, object>() { { "classroomCode", request.classroomCode }, { "schoolCode", request.code } });
-            }
-            else
+
+            //if (requert.code == null) return BadRequest();
+            //{
+            if (option.ToString().Equals("insert"))
             {
-                List<int> sc = await _azureCosmos.FindCountByDict<Classroom>(new Dictionary<string, object> { { "classroomCode", request.classroomCode } });
-                if (sc.IsNotEmpty() && sc[0]>0) {
-                    return Ok("班级代码已经存在!");
-                    //return builder.Error(ResponseCode.DATA_EXIST, "班级代码已经存在!").build();
-                    
+                var response = await client.GetContainer("TEAMModelOS", "School").ReadItemStreamAsync(classroom.id, new PartitionKey($"Classroom-{classroom.code}"));
+                //var response = await client.GetContainer("TEAMModelOS", "School").ReadItemStreamAsync(requert.id, new PartitionKey($"Base"));
+                if (response.Status == 200)
+                {
+                    //classroom = await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "School").UpsertItemAsync(requert, new PartitionKey($"Classroom-{classroom.code}"));
+                    return Ok(new { error = ResponseCode.DATA_EXIST, V = "班级编码已经存在!" });
+                }
+                else
+                {
+                    string code = classroom.code;
+                    //students = await _azureCosmos.FindByDict<Student>(new Dictionary<string, object>() { { "schoolCode", classroom.code } });
+                    classroom.code = typeof(Classroom).Name + "-" + classroom.code;
+                    classroom = await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "School").CreateItemAsync(classroom, new PartitionKey($"Classroom-{code}"));
+
                 }
-                request.id = request.classroomCode;
-                request.code = typeof(Classroom).Name + "-hbcn";
-                await _azureCosmos.SaveOrUpdate<Classroom>(request);
-                
             }
-            //强制关联原生班级的id
-            List<ClassStudent> classroomStudents = await _azureCosmos.FindByDict<ClassStudent>(new Dictionary<string, object> { { "id", request.classroomCode } });
+            else {
+                classroom = await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "School").UpsertItemAsync(classroom, new PartitionKey($"{classroom.code}"));
+            }
+                                             
+            /*//强制关联原生班级的id
+            List<ClassStudent> classroomStudents = await _azureCosmos.FindByDict<ClassStudent>(new Dictionary<string, object> { { "id", classroom.id } });
             if (classroomStudents.IsNotEmpty())
             {
                 if (students.IsNotEmpty()) {
                     List<ClassStudent> newClassStudents = new List<ClassStudent>();
                     students.ForEach(x=> {
                         if (!classroomStudents.Select(m=>m.code).Contains(x.studentId)) {
-                            newClassStudents.Add(new ClassStudent { code = x.studentId, id= request.classroomCode });
+                            newClassStudents.Add(new ClassStudent { code = x.studentId, id= classroom.id });
                         }
                     });
                     await _azureCosmos.SaveOrUpdateAll<ClassStudent>(newClassStudents);
                 }
-            }
-            return Ok();
+            }*/
+            return Ok(new { classroom });
         }
 
         [ProducesDefaultResponseType]
@@ -83,7 +97,7 @@ namespace TEAMModelOS.Controllers
             if (!requert.TryGetProperty("school_code", out JsonElement school_code)) return BadRequest();
             var client = _azureCosmos.GetCosmosClient();
             List<object> classrooms = new List<object>();
-            var query = $"select c.classroomCode,c.point,c.classroomName,c.headMaster,c.periodCode,c.gradeCode,c.hiteach,c.studentCount,c.classroomType,c.type,c.code,c.openType from c ";
+            var query = $"select c.id,c.point,c.name,c.teacher,c.period,c.grade,c.hiteach,c.classroomType,c.type,c.code,c.openType from c ";
             await foreach (var item in client.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Classroom-{school_code}") }))
             {
                 using var json = await JsonDocument.ParseAsync(item.ContentStream);
@@ -106,16 +120,16 @@ namespace TEAMModelOS.Controllers
         [HttpPost("delete")]
         public async Task<IActionResult> Delete(JsonElement request)
         {
-            ResponseBuilder builder = ResponseBuilder.custom();
+            //ResponseBuilder builder = ResponseBuilder.custom();
 
             if (request.TryGetProperty("id", out JsonElement id))
             {
                 List<Classroom> sc = await _azureCosmos.FindByDict<Classroom>(request);
                 if (sc.IsNotEmpty())
                 {
-                    await _azureCosmos.DeleteAll<ClassStudent>(new Dictionary<string, object> { { "id", sc.Select(x=>x.classroomCode).ToArray()} });
+                    await _azureCosmos.DeleteAll<ClassStudent>(new Dictionary<string, object> { { "id", sc.Select(x=>x.code).ToArray()} });
                     List<IdPk> idPks = await _azureCosmos.DeleteAll<Classroom>(sc);
-                    builder.Data(idPks);
+                    //builder.Data(idPks);
                 }
             }
             else {

+ 14 - 76
TEAMModelOS/Controllers/School/CourseController.cs

@@ -47,90 +47,28 @@ namespace TEAMModelOS.Controllers
         [ProducesDefaultResponseType]
         //[AuthToken(Roles = "Teacher")]
         [HttpPost("upsert")]
-        public async Task<IActionResult> upsert(JsonElement requert)
+        public async Task<IActionResult> upsert(Course requert)
         {
             try {
-
-                //if (!requert.TryGetProperty("id_token", out JsonElement id_token)) return BadRequest();
-                if (!requert.TryGetProperty("school_code", out JsonElement school_code)) return BadRequest();
-                //var jwt = new JwtSecurityToken(id_token.GetString());
-                //if (!jwt.Payload.Iss.Equals("account.teammodel", StringComparison.OrdinalIgnoreCase)) return BadRequest();
-                //var id = jwt.Payload.Sub;
-                var id = "TBLCOURSE212";
-
-                var client = _azureCosmos.GetCosmosClient();
-                var response = await client.GetContainer("TEAMModelOS", "School").ReadItemStreamAsync(id, new PartitionKey($"Course-{school_code}"));
-
-                if (response.Status == 200)
-                {
-                    //using var json = await JsonDocument.ParseAsync(response.ContentStream);
-                    return Ok(new { V = "课程编码已经存在!" });
-                }
-                else
+                //ResponseBuilder builder = ResponseBuilder.custom();
+                if (!string.IsNullOrEmpty(requert.id))
                 {
-                    //如果沒有,Course信息存储
-                    requert.TryGetProperty("name", out JsonElement name);
-                    requert.TryGetProperty("period", out JsonElement period);
-                    requert.TryGetProperty("subject", out JsonElement subject);
-                    requert.TryGetProperty("teachers", out JsonElement teachers);
-                    //jwt.Payload.TryGetValue("picture", out object picture);
-                    using var stream = new MemoryStream();
-                    using var writer = new Utf8JsonWriter(stream); //new JsonWriterOptions() { Indented = true }
-                    writer.WriteStartObject();
-                    writer.WriteString("code", $"Course-{school_code}");
-                    writer.WriteString("id", id);
-                    writer.WriteString("name", name.ToString());
-                    writer.WriteStartObject("period");
-                    writer.WriteString("id", "1");
-                    writer.WriteString("name", "小学");
-                    writer.WriteEndObject();
-                    //writer.WriteString("period", period.ToString());
-                    //writer.WriteString("subject", subject.ToJsonString());
-                    //writer.wri
-                    //writer.WriteString("picture", picture?.ToString());
-                    writer.WriteStartArray("teachers");
-                    //writer.WriteStringValue(teachers.ToJsonString());
-                  /*  writer.WriteStartObject();
-                    writer.WriteString("id", "1");
-                    writer.WriteString("name", "小学");                  
-                    writer.WriteEndObject();
-                    writer.WriteStartObject();
-                    writer.WriteString("id", "1");
-                    writer.WriteString("name", "小学");
-                    writer.WriteEndObject();
-                    writer.WriteStartObject();
-                    writer.WriteString("id", "1");
-                    writer.WriteString("name", "小学");
-                    writer.WriteEndObject();*/
-                    writer.WriteEndArray();
-                    writer.WriteEndObject();
-                    writer.Flush();
-                    //Debug
-                    //string teacher = Encoding.UTF8.GetString(stream.ToArray());
-                    response = await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOSTemp", "School").CreateItemStreamAsync(stream, new PartitionKey($"Course-{school_code}"));
-                    if (response.Status == 200)
+                    List<int> count = await _azureCosmos.FindCountByDict<Course>(new Dictionary<string, object> { { "courseCode", requert.courseCode }, { "code", requert.code } });
+                    if (count.IsNotEmpty() && count[0] > 0)
                     {
-                        return Ok(new { V = "保存成功!" });
+                       // return builder.Error(ResponseCode.DATA_EXIST, "课程编码已经存在!").build();
                     }
-                    else {
-                        return Ok(new { V = "保存失败!" });
-                    }
-                        
+                    requert.id = requert.code.Replace("#", "") + "-" + requert.courseCode;
                 }
-            } catch (Exception ex) {
+                Course response = await _azureCosmos.SaveOrUpdate<Course>(requert);
+                return Ok(new { requert });
+                
+            }
+            catch (Exception ex) {
                 await _dingDing.SendBotMsg($"CoreAPI2,{_option.Location},course/upsert()\n{ex.Message}", GroupNames.醍摩豆服務運維群組);
                 return BadRequest();
             }
-           /* ResponseBuilder builder = ResponseBuilder.custom();
-            if (string.IsNullOrEmpty(request.id)) {
-                List<int> count =await _azureCosmos.FindCountByDict<Course>(new Dictionary<string, object> { { "courseCode", request.courseCode },{ "code",request.code} });
-                if (count.IsNotEmpty() && count[0] > 0) {
-                    return builder.Error(ResponseCode.DATA_EXIST, "课程编码已经存在!").build();
-                }
-                request.id = request.code.Replace("#", "") +"-"+ request.courseCode;
-            }
-            Course  response = await _azureCosmos.SaveOrUpdate<Course>(request);
-            return builder.Data(response).build();*/
+           
         }
         /// <summary>
         /// 查询课程
@@ -452,7 +390,7 @@ namespace TEAMModelOS.Controllers
                 }
             }
             if (data.Count > 0) { 
-                var classRoom=  await _azureCosmos.FindByDict<Classroom>(new Dictionary<string, object> { { "classroomCode",data.ToArray() } } );
+                var classRoom=  await _azureCosmos.FindByDict<Classroom>(new Dictionary<string, object> { { "id",data.ToArray() } } );
                 if (classRoom.IsNotEmpty()) {
                     classRoom.ForEach(x => {
                         room.Add(x);

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 1382 - 0
TEAMModelOS/Controllers/School/StudentController.cs


+ 0 - 323
TEAMModelOS/Controllers/Student/StudentController.cs

@@ -1,323 +0,0 @@
-using Azure.Cosmos;
-using Microsoft.AspNetCore.Mvc;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Threading.Tasks;
-using TEAMModelOS.SDK;
-using TEAMModelOS.SDK.Helper.Common.CollectionHelper;
-using TEAMModelOS.SDK.Helper.Security.TmdCrypt;
-using TEAMModelOS.SDK.DI;
-using TEAMModelOS.SDK.Helper.Common.ValidateHelper;
-using TEAMModelOS.Models;
-using System.Text.Json;
-using TEAMModelOS.Models.StudentInfo;
-using Microsoft.AspNetCore.Http;
-using TEAMModelOS.SDK.Extension;
-using Microsoft.AspNetCore.Cryptography.KeyDerivation;
-using System.Text;
-using Microsoft.Extensions.Options;
-
-namespace TEAMModelOS.Controllers
-{
-    [ProducesResponseType(StatusCodes.Status200OK)]
-    [ProducesResponseType(StatusCodes.Status400BadRequest)]
-    //[Authorize(Roles = "IES5")]
-    [Route("student/init")]
-    [ApiController]
-    // [Authorize]
-    public class StudentController : ControllerBase
-    {
-        private readonly AzureCosmosFactory _azureCosmos;
-        private readonly Option _option;
-
-        public StudentController(AzureCosmosFactory azureCosmos, IOptionsSnapshot<Option> option)
-        {
-            _azureCosmos = azureCosmos;
-            _option = option?.Value;
-        }
-
-        /// <summary>
-        /// 保存或更新学生,并维护学生关系表
-        /// </summary>
-        /// <param name="request"></param>
-        /// <returns></returns>
-        [ProducesDefaultResponseType]
-        //[AuthToken(Roles = "teacher")]
-        [HttpPost("upsert")]
-        public async Task<BaseResponse> Upsert(Student request)
-        {
-            ResponseBuilder builder = ResponseBuilder.custom();
-            //设置密码 isSet 是否加密 如果加密则不会再次加密
-            if (!request.password.isSet)
-            {
-                request.password.value = TmdCrypt.Encrypt(request.password.value);
-                request.password.isSet = true;
-            }
-            request.id = request.studentId.Replace("#", "-");
-            ///假如更新了班级则先获取更新之前的班级
-            var olStudent= await _azureCosmos.FindByIdPk<Student>(request.id,request.code);
-            if (olStudent!=null &&  !string.IsNullOrEmpty(olStudent.classroomCode) && ! olStudent.classroomCode.Equals(request.classroomCode) ) {
-                //移除之前的原生班级
-                IdPk idPk=await _azureCosmos.DeleteAsync<ClassStudent>( olStudent.classroomCode ,olStudent.studentId);
-               
-            }
-            ///新建最新的班级关系表
-            ClassStudent classroomStudent = new ClassStudent { id = request.classroomCode, code = request.studentId };
-            await _azureCosmos.SaveOrUpdate(classroomStudent);
-            Student data = await _azureCosmos.SaveOrUpdate<Student>(request);
-            return builder.Data(data).build();
-        }
-
-        /// <summary>
-        /// 查找学生
-        /// </summary>
-        /// <param name="request"></param>
-        /// <returns></returns>
-        [ProducesDefaultResponseType]
-        //[AuthToken(Roles = "teacher")]
-        [HttpPost("find")]
-        public async Task<IActionResult> Find(JsonElement requert)
-        {
-
-            var client = _azureCosmos.GetCosmosClient();
-            if (!requert.TryGetProperty("school_code", out JsonElement school_code)) return BadRequest();
-            List<object> students = new List<object>();
-            await foreach (var item in client.GetContainer("TEAMModelOS", "Student").GetItemQueryStreamIterator(queryText: $"select c.id, c.name,c.mail,c.mobile,c.year,c.schoolId from c ", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Student-{school_code}") }))
-            {
-                using var json = await JsonDocument.ParseAsync(item.ContentStream);
-
-                if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
-                {
-                    foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
-                    {
-                        students.Add(obj.ToObject<object>());
-                    }
-                }
-            }
-            return Ok(new { students });
-            /* ResponseBuilder builder = ResponseBuilder.custom();
-            if (request.TryGetProperty("code", out _))
-            {
-                List<Student> data = await _azureCosmos.FindByDict<Student>(request);
-                return builder.Data(data).build();
-            }
-            else
-            {
-                return builder.Error(ResponseCode.PARAMS_ERROR, "code  is null !").build();
-                
-            }*/
-        }
-        [ProducesDefaultResponseType]
-        //[AuthToken(Roles = "teacher")]
-        [HttpPost("upsert-all")]
-        public async Task<IActionResult> UpsertAll(List<Student> request)
-        {
-            ResponseBuilder builder = ResponseBuilder.custom();
-
-            if (ValidateHelper.IsValid(request) && request.IsNotEmpty()) {
-
-                ///假如更新了班级则先获取更新之前的班级
-                string[] ids = request.Select(x=>x.studentId).ToArray();
-                List<Student> oldStudent = await _azureCosmos.FindByDict<Student>(new Dictionary<string, object>() { { "studentId", ids } });
-                List<IdPk> idPks = new List<IdPk>();
-                ///处理未变动的班级关系
-                List<IdPk> unpk = new List<IdPk>();
-                oldStudent.ForEach(x=> {
-                    request.ForEach(m => {
-                        if (x.studentId.Equals(m.studentId)) {
-                            if (!x.classroomCode.Equals(m.classroomCode))
-                            {
-                                idPks.Add(new IdPk { id = x.classroomCode, pk = x.studentId });
-                            }
-                            else {
-                                unpk.Add(new IdPk { id = x.classroomCode, pk = x.studentId });
-                            }
-                        }
-                    });
-                });
-                if (idPks.IsNotEmpty()) {
-                    await _azureCosmos.DeleteAll<ClassStudent>(idPks);
-                }
-                long createDate = DateTimeOffset.UtcNow.Ticks;
-                request.ForEach(
-                    x => {
-                        x.createDate = createDate;
-                        x.id = x.studentId.Replace("#", "-");
-                        //设置密码 isSet 是否加密 如果加密则不会再次加密
-                        if (!x.password.isSet)
-                        {
-                            x.password.value = TmdCrypt.Encrypt(x.password.value);
-                            x.password.isSet = true;
-                        }
-                    });
-                List<Student> students = await _azureCosmos.SaveOrUpdateAll(request);
-                ///更新学生关系表
-                List<ClassStudent> classroomStudents = new List<ClassStudent>();
-                foreach (var student  in students)
-                {
-                    // 处理未变更原生班级的学生
-                    bool has = false;
-                    foreach (IdPk idPk in unpk) {
-                        if (idPk.id.Equals(student.classroomCode) && idPk.pk.Equals(student.studentId)) {
-                            has = true;
-                        }
-                    }
-                    if (has)
-                    {
-                        continue;
-                    }
-                    else {
-                        classroomStudents.Add(new ClassStudent { id = student.classroomCode, code = student.studentId });
-                    }
-                }
-                await  _azureCosmos.SaveOrUpdateAll(classroomStudents);
-                builder.Data(students);
-            }
-            return Ok();
-        }
-
-
-
-        /// <summary>
-        /// 删除单个学生
-        /// </summary>
-        /// <param name="request"></param>
-        /// <returns></returns>
-        [ProducesDefaultResponseType]
-        //[AuthToken(Roles = "teacher")]
-        [HttpPost("delete")]
-        public async Task<IActionResult> Delete(JsonElement requert)
-        {
-            if (!requert.TryGetProperty("id", out JsonElement id)) return BadRequest();
-            if (!requert.TryGetProperty("school_code", out JsonElement school_code)) return BadRequest();
-            var client = _azureCosmos.GetCosmosClient();
-            var response = await client.GetContainer("TEAMModelOS", "Student").DeleteItemStreamAsync(id.ToJsonString(), new PartitionKey($"Base-{school_code}"));
-            if (response.Status == 200)
-            {
-                await _azureCosmos.DeleteAll<ClassStudent>(new Dictionary<string, object> { { "code", id.ToJsonString() } });
-            }
-            else {
-                return BadRequest();
-            }               
-            return Ok();
-            /*ResponseBuilder builder = ResponseBuilder.custom();
-            IdPk data = await _azureCosmos.DeleteAsync<Student>(request.id, request.code);
-            ///更新学生关系表
-            await _azureCosmos.DeleteAll<ClassStudent>(new Dictionary<string, object> { { "code", request.studentId } });
-            return builder.Data(data).build();*/
-        }
-        /// <summary>
-        /// 批量删除并维护关联关系
-        /// </summary>
-        /// <param name="request"></param>
-        /// <returns></returns>
-        [ProducesDefaultResponseType]
-        //[AuthToken(Roles = "teacher")]
-        [HttpPost("bulkDelete")]
-        public async Task<IActionResult> BulkDelete(JsonElement request)
-        {
-            ResponseBuilder builder = ResponseBuilder.custom();
-            //Dictionary<string, object> dict = new Dictionary<string, object>();
-            var emobj = request.EnumerateObject();
-            int keys = 0;
-            while (emobj.MoveNext())
-            {
-                keys++;
-                //dict[emobj.Current.Name] = emobj.Current.Value;
-            }
-            if (keys > 0&& request.TryGetProperty("code",out JsonElement code)) {
-                List<Student> students = await _azureCosmos.FindByDict<Student>(request);
-                await _azureCosmos.DeleteAll<Student>(students);
-                ///更新学生关系表
-                await _azureCosmos.DeleteAll<ClassStudent>(new Dictionary<string, object> { {"code",students.Select(x=>x.studentId).ToArray() } });
-                builder.Data(students);
-            }
-            return Ok();
-        }
-
-        /// <summary>
-        /// 學生登入
-        /// </summary>
-        /// <param name = "request" ></ param >
-        [HttpPost("Login")]
-
-        public async Task<IActionResult> Login(JsonElement request)
-        {
-            var client = _azureCosmos.GetCosmosClient();
-            //參數取得
-            if (!request.TryGetProperty("school_code", out JsonElement school_code)) return BadRequest();
-            if (!request.TryGetProperty("id", out JsonElement id)) return BadRequest();
-            if (!request.TryGetProperty("pw", out JsonElement pw)) return BadRequest();
-
-            var response = await client.GetContainer("TEAMModelOS", "Student").ReadItemStreamAsync(id.GetString(), new PartitionKey($"Base-{school_code.ToString().ToLower()}"));
-
-            
-            int error = 0;
-            string message = "帳號或密碼錯誤";
-            string auth_token = "";
-
-            if (response.Status == 200)
-            {
-                using var json = await JsonDocument.ParseAsync(response.ContentStream);
-
-                // 取得資料庫salt
-                json.RootElement.TryGetProperty("salt", out JsonElement salt);
-                // 取得資料庫pw
-                json.RootElement.TryGetProperty("pw", out JsonElement dbpw);
-                // 取得資料庫name
-                json.RootElement.TryGetProperty("name", out JsonElement name);
-
-                var HashedPW = HashedPassword(pw.ToString(), salt.ToString());
-
-                if (dbpw.ToString().Equals(HashedPW.ToString()))
-                {
-                    //換取AuthToken,提供給前端
-                    auth_token = JwtAuthExtension.CreateAuthToken(_option.HostName, id.GetString(), name.GetString(), "", _option.JwtSecretKey, roles: new[] { "student" });
-                }
-                else
-                {
-                    error = 1;
-                }
-            }
-            else
-            {
-                error = 1;
-            }
-
-            if (error > 0)
-            {
-                return Ok(
-                    new
-                    {
-                        error,
-                        message
-                    }
-                );
-            }
-            else
-            {
-                return Ok(
-                    new
-                    {
-                        auth_token
-                    }
-                );
-            }
-        }
-
-        public static string HashedPassword(string password, string salt)
-        {
-            byte[] hashBytes = KeyDerivation.Pbkdf2(
-                password: password,
-                salt: Encoding.UTF8.GetBytes(salt), // SHA1鹽(8-20字節), SHA256(32字節)
-                prf: KeyDerivationPrf.HMACSHA1,
-                iterationCount: 10000, // hash次數,越多次代表破解難度變高,但效能差點
-                numBytesRequested: 256 / 8 // 指定得出結果長度
-            );
-
-            String hashText = BitConverter.ToString(hashBytes).Replace("-", string.Empty);
-            return hashText;
-        }
-    }
-}

+ 4 - 4
TEAMModelOS/Controllers/Syllabus/ItemInfoController.cs

@@ -77,9 +77,9 @@ namespace TEAMModelOS.Controllers
         {
 
             var client = _azureCosmos.GetCosmosClient();
-            if (!requert.TryGetProperty("school_code", out JsonElement school_code)) return BadRequest();
+            if (!requert.TryGetProperty("code", out JsonElement code)) return BadRequest();
             List<object> summary = new List<object>();
-            await foreach (var item in client.GetContainer("TEAMModelOS", "Common").GetItemQueryStreamIterator(queryText: $"select c.id, c.question,c.usageCount,c.level,c.field,c.points,c.type,c.option,c.createTime from c ", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"ItemInfo-{school_code}") }))
+            await foreach (var item in client.GetContainer("TEAMModelOS", "Common").GetItemQueryStreamIterator(queryText: $"select c.id, c.question,c.usageCount,c.level,c.field,c.points,c.type,c.option,c.createTime from c ", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"ItemInfo-{code}") }))
             {
                 using var json = await JsonDocument.ParseAsync(item.ContentStream);
 
@@ -166,9 +166,9 @@ namespace TEAMModelOS.Controllers
         public async Task<IActionResult> Find(JsonElement requert)
         {
             var client = _azureCosmos.GetCosmosClient();
-            if (!requert.TryGetProperty("school_code", out JsonElement school_code)) return BadRequest();
+            if (!requert.TryGetProperty("code", out JsonElement code)) return BadRequest();
             List<object> items = new List<object>();
-            await foreach (var item in client.GetContainer("TEAMModelOS", "Common").GetItemQueryStreamIterator(queryText: $"select c.id, c.question,c.usageCount,c.level,c.field,c.points,c.type,c.option,c.createTime from c ", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"ItemInfo-{school_code}") }))
+            await foreach (var item in client.GetContainer("TEAMModelOS", "Common").GetItemQueryStreamIterator(queryText: $"select c.id, c.question,c.usageCount,c.level,c.field,c.points,c.type,c.option,c.createTime from c ", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"ItemInfo-{code}") }))
             {
                 using var json = await JsonDocument.ParseAsync(item.ContentStream);
 

+ 2 - 1
TEAMModelOS/Controllers/Teacher/InitController.cs

@@ -144,7 +144,7 @@ namespace TEAMModelOS.Controllers
                 }
 
                 //換取AuthToken,提供給前端
-                var auth_token = JwtAuthExtension.CreateAuthToken(_option.HostName, id, name?.ToString(), picture?.ToString(), _option.JwtSecretKey, roles: new[] { "teacher" });
+                var auth_token = JwtAuthExtension.CreateAuthToken(_option.HostName, id, name?.ToString(), picture?.ToString(), _option.JwtSecretKey, roles: new[] { "teacher" , "student"});
 
                 //取得Teacher Blob 容器位置及SAS 
                 var container = _azureStorage.GetBlobContainerClient(id);
@@ -195,6 +195,7 @@ namespace TEAMModelOS.Controllers
             if (roles.Count == 0)
             {
                 roles.Add("teacher");
+                roles.Add("student");
             }
             var auth_token = JwtAuthExtension.CreateAuthToken(_option.HostName, id, name?.ToString(), picture?.ToString(), _option.JwtSecretKey, roles: roles.ToArray(), permissions: permissions.ToArray());
 

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 94140 - 0
TEAMModelOS/JsonFile/IES/19890.json


Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 362380 - 0
TEAMModelOS/JsonFile/IES/19910.json


+ 20 - 0
TEAMModelOS/Models/Base/TeacherBase.cs

@@ -14,4 +14,24 @@ namespace TEAMModelOS.Models
         public string picture { get; set; }          
         public int size { get; set; }  
     }
+    public class User
+    {
+        public string id { get; set; }
+        public string mail { get; set; }
+        public string mobile { get; set; }
+        public string country { get; set; }
+        public string name { get; set; }
+        public string picture { get; set; }
+        public string pk { get; set; }
+    }
+   
+    public class Students : User
+    {
+        public string code { get; set; }
+        public string schoolId { get; set; }
+        public string pw { get; set; }
+        public string salt { get; set; }
+        public string year { get; set; }
+
+    }
 }

+ 47 - 11
TEAMModelOS/Models/SchoolInfo/Classroom.cs

@@ -1,9 +1,13 @@
+using Azure.Cosmos;
 using ProtoBuf;
 using System;
 using System.Collections.Generic;
 using System.ComponentModel.DataAnnotations;
 using System.Text;
+using System.Text.Json;
 using System.Text.Json.Serialization;
+using TEAMModelOS.Models.StudentInfo;
+using TEAMModelOS.Models.TeacherInfo;
 using TEAMModelOS.SDK.Context.Attributes.Azure;
 using TEAMModelOS.SDK.DI;
 
@@ -18,28 +22,34 @@ namespace TEAMModelOS.Models.SchoolInfo
         public Classroom()
         {
             point = new Point();
+            grade = new Grade();
+            period = new PeriodSimple();
+            students = new StudentSimple();
+            teacher = new Teachers();
         }
 
         [ProtoMember(1)]
         [JsonPropertyName("id")]
         public string id { get; set; }
-        [ProtoMember(3)]
-        [Required(ErrorMessage = "{0} 必须填写")]
-        public string classroomCode { get; set; }
+        /*        [ProtoMember(3)]
+                [Required(ErrorMessage = "{0} 必须填写")]
+                public string classroomCode { get; set; }*/
+        //教室坐标
         [ProtoMember(4)]
         public Point point { get; set; }
         [ProtoMember(5)]
-        public string classroomName { get; set; }
+        public string name { get; set; }
         [ProtoMember(6)]
-        public string headMaster { get; set; }
+        public Teachers teacher { get; set; }
         [ProtoMember(7)]
-        public string periodCode { get; set; }
+        public PeriodSimple period { get; set; }
         [ProtoMember(8)]
-        public string gradeCode { get; set; }
+        public Grade grade { get; set; }
         [ProtoMember(9)]
         public string hiteach { get; set; }
-        [ProtoMember(10)]
-        public int studentCount { get; set; }
+        /*[ProtoMember(10)]
+        public int studentCount { get; set; }*/
+        public StudentSimple students { get; set; }
         /// <summary>
         /// TBL IRS 类型区分
         /// </summary>
@@ -50,9 +60,9 @@ namespace TEAMModelOS.Models.SchoolInfo
         /// <summary>
         /// 学校教室1还是个人教室0
         /// </summary>
-        [ProtoMember(13)]
+        /*[ProtoMember(13)]
         [Required(ErrorMessage = "{0} 必须填写,请设置个人教室还是学校教室")]
-        public int type { get; set; } = 1;
+        public int type { get; set; } = 1;*/
         [PartitionKey]
         [Required(ErrorMessage = "{0} 必须填写")]
         public string code { get; set; }
@@ -60,6 +70,7 @@ namespace TEAMModelOS.Models.SchoolInfo
         /// 教室属性,普通 /专设的教室
         /// </summary>
         public string openType { get; set; }
+        public string scope { get; set; }
     }
 }
 
@@ -70,4 +81,29 @@ public class Point
     public float x { get; set; }
     [ProtoMember(2)]
     public float y { get; set; }
+}
+[ProtoContract]
+public class StudentSimple
+{
+    [ProtoMember(1)]
+    public string id { get; set; }
+    [ProtoMember(2)]
+    public string  name { get; set; }
+    [ProtoMember(2)]
+    public string no { get; set; }
+}
+[ProtoContract]
+public class Teachers
+{
+    [ProtoMember(1)]
+    public string id { get; set; }
+    [ProtoMember(2)]
+    public string name { get; set; }
+}
+public class PeriodSimple
+{
+    [ProtoMember(1)]
+    public string periodCode { get; set; }
+    [ProtoMember(2)]
+    public string periodName { get; set; }
 }

+ 6 - 0
TEAMModelOS/Models/SchoolInfo/ExamInfo.cs

@@ -28,6 +28,12 @@ namespace TEAMModelOS.Models.SchoolInfo
 
         public string name { get; set; }
         public int stuCount { get; set; }
+        //实际考试人数
+        public int realCount { get; set; }
+        //平均分
+        public double piont { get; set; }
+        //指标
+        public double index { get; set; }
         public long createTime { get; set; }
         public string examCode { get; set; }
         

+ 4 - 4
TEAMModelOS/Services/Analysis/AchievementService.cs

@@ -160,7 +160,7 @@ namespace TEAMModelOS.Services.Analysis
                         
                         //foreach (List<string> pl in classPRL) {
                         //单科计算班级排名
-                        stuPR.Sort(delegate (string s1, string s2) { return int.Parse(s2).CompareTo(int.Parse(s1)); });
+                        stuPR.Sort(delegate (string s1, string s2) { return double.Parse(s2).CompareTo(double.Parse(s1)); });
                         
                         foreach (List<string> pl in classPRL) {
                             
@@ -196,7 +196,7 @@ namespace TEAMModelOS.Services.Analysis
                         className.Add(cla);
                     }
                     //单科计算年级排名
-                    stuPRG.Sort(delegate (string s1, string s2) { return int.Parse(s2).CompareTo(int.Parse(s1)); });
+                    stuPRG.Sort(delegate (string s1, string s2) { return double.Parse(s2).CompareTo(double.Parse(s1)); });
                     foreach (List<List<string>> p2 in classPR) {
                         foreach (List<string> p3 in p2) {
                             int index = stuPRG.IndexOf(p3[2]);
@@ -277,7 +277,7 @@ namespace TEAMModelOS.Services.Analysis
                     GradePR.Add(classStuInfo);
                     sortClassPoint.Sort(delegate (double s1, double s2) { return s2.CompareTo(s1); });
                     foreach (List<string> stuIn in classStuInfo) {
-                        int index = sortClassPoint.IndexOf(int.Parse(stuIn[2]));
+                        int index = sortClassPoint.IndexOf(double.Parse(stuIn[2]));
                         stuIn[3] = (index + 1).ToString();
                         int CPR = 100 - (100 * (index + 1) - 50) / sortClassPoint.Count;
                         stuIn[4] = CPR.ToString();
@@ -298,7 +298,7 @@ namespace TEAMModelOS.Services.Analysis
                 {
                     foreach (List<string> info in gradeInfo)
                     {
-                        int index = sortGradePoint.IndexOf(int.Parse(info[2]));
+                        int index = sortGradePoint.IndexOf(double.Parse(info[2]));
                         info[5] = (index + 1).ToString();
                         int GPR = 100 - (100 * int.Parse(info[5]) - 50) / sortGradePoint.Count;
                         info[6] = GPR.ToString();