Browse Source

Merge branch 'develop' of http://52.130.252.100:10000/TEAMMODEL/TEAMModelOS into develop

Li 2 years ago
parent
commit
4646f0d459
25 changed files with 2760 additions and 2316 deletions
  1. 4 3
      TEAMModelOS/ClientApp/public/lang/zh-CN.js
  2. 1 1
      TEAMModelOS/ClientApp/src/access/login.js
  3. 1 1
      TEAMModelOS/ClientApp/src/components/coursemgt/StudentList.vue
  4. 6 0
      TEAMModelOS/ClientApp/src/components/student-web/ClassRecord/RecordView.vue
  5. 7 2
      TEAMModelOS/ClientApp/src/components/student-web/HomeView/HomeView.less
  6. 1565 1557
      TEAMModelOS/ClientApp/src/router/routes.js
  7. 1 1
      TEAMModelOS/ClientApp/src/store/module/user.js
  8. 585 584
      TEAMModelOS/ClientApp/src/view/areaMgmt/AreaLayout.vue
  9. 0 145
      TEAMModelOS/ClientApp/src/view/areaSetting/AreaSetting.vue
  10. 296 0
      TEAMModelOS/ClientApp/src/view/art/AreaArtSetting.vue
  11. 272 0
      TEAMModelOS/ClientApp/src/view/art/BaseDimensionForm.vue
  12. 1 1
      TEAMModelOS/ClientApp/src/view/art/SchoolArt.vue
  13. 2 2
      TEAMModelOS/ClientApp/src/view/classmgt/ClassStudent.vue
  14. 1 1
      TEAMModelOS/ClientApp/src/view/dashboard/Art.vue
  15. 1 1
      TEAMModelOS/ClientApp/src/view/dashboard/Research.vue
  16. 1 1
      TEAMModelOS/ClientApp/src/view/dashboard/Student.vue
  17. 1 1
      TEAMModelOS/ClientApp/src/view/dashboard/StudentAll.vue
  18. 2 2
      TEAMModelOS/ClientApp/src/view/learnactivity/tabs/AnswerTable.vue
  19. 2 2
      TEAMModelOS/ClientApp/src/view/research-center/ResearchCenter.vue
  20. 2 2
      TEAMModelOS/ClientApp/src/view/research-center/ResearchCenterMock.vue
  21. 1 1
      TEAMModelOS/ClientApp/src/view/research-center/ResearchMgt.vue
  22. 1 1
      TEAMModelOS/ClientApp/src/view/schoolmgmt/RoomMgt/HiTeachLink.vue
  23. 3 3
      TEAMModelOS/ClientApp/src/view/student-account/stuMgt/StuMgt.vue
  24. 2 2
      TEAMModelOS/ClientApp/src/view/student-web/AppiView.less
  25. 2 2
      TEAMModelOS/ClientApp/src/view/uploadEvaluation/Index.vue

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

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

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

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

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

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

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

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

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

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

File diff suppressed because it is too large
+ 1565 - 1557
TEAMModelOS/ClientApp/src/router/routes.js


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

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

File diff suppressed because it is too large
+ 585 - 584
TEAMModelOS/ClientApp/src/view/areaMgmt/AreaLayout.vue


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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