Selaa lähdekoodia

Merge branch 'develop' of http://106.12.23.251:10080/TEAMMODEL/TEAMModelOS into develop

黄贺彬 6 vuotta sitten
vanhempi
commit
a3d717c928

+ 5 - 0
TEAMModelOS/ClientApp/router/routes.js

@@ -59,6 +59,11 @@ export const routes = [
         name:'testPaper',
         name:'testPaper',
         component: resolve => require(['@/view/evaluation/index/TestPaper.vue'], resolve), //路由懒加载
         component: resolve => require(['@/view/evaluation/index/TestPaper.vue'], resolve), //路由懒加载
       },
       },
+      {
+        path: '/createTest',
+        name: 'createTest',
+        component: resolve => require(['@/view/evaluation/index/createTest.vue'], resolve), //路由懒加载
+      },
 
 
     ]
     ]
   }
   }

+ 5 - 6
TEAMModelOS/ClientApp/store/api/index.js

@@ -58,13 +58,12 @@ export default {
     return post('api/role/GetLoginClaim', data);
     return post('api/role/GetLoginClaim', data);
   },
   },
 
 
+  //评测API
 
 
-
-
-
-
-
-
+  //新建习题保存到题库
+  SaveItemBank: function (data) {
+    return post('api/evaluation/ItemBank', data);
+  },
 
 
 
 
 
 

+ 15 - 2
TEAMModelOS/ClientApp/view/evaluation/index/CreateExercises.css

@@ -8,6 +8,20 @@
         height:180px !important;
         height:180px !important;
     }
     }
 
 
+    .ev-container .ev-title {
+        font-size: 20px;
+        font-weight: bold;
+        margin-left: 5px;
+        vertical-align: middle;
+    }
+
+    .ev-container .ev-title .ivu-icon {
+        margin-right: 6px;
+        margin-bottom: 6px;
+        font-size: 30px;
+        color: rgb(16, 171, 231);
+    }
+
     .display-flex {
     .display-flex {
         display: flex;
         display: flex;
         flex-direction: row;
         flex-direction: row;
@@ -23,7 +37,7 @@
 }
 }
 
 
 .my-radio-style .ivu-radio-group-button .ivu-radio-wrapper {
 .my-radio-style .ivu-radio-group-button .ivu-radio-wrapper {
-    margin-right: 30px;
+    margin-right: 20px;
     border-radius: 5px;
     border-radius: 5px;
     background: #fff;
     background: #fff;
     border: 1px solid #dcdee2;
     border: 1px solid #dcdee2;
@@ -45,7 +59,6 @@
 
 
 .my-radio-style .ivu-radio-group {
 .my-radio-style .ivu-radio-group {
     margin-top: 30px;
     margin-top: 30px;
-    margin-left: 20px;
 }
 }
 
 
 exersices-attr-diff {
 exersices-attr-diff {

+ 26 - 14
TEAMModelOS/ClientApp/view/evaluation/index/CreateExercises.vue

@@ -1,16 +1,16 @@
 <template>
 <template>
   <div class="ev-container">
   <div class="ev-container">
-    <h1>{{isEdit?'编辑习题':'新建习题'}}</h1>
+    <span class="ev-title"><Icon type="ios-paper"/>{{isEdit?'编辑习题':'新建习题'}}</span>
     <Divider />
     <Divider />
     <div class="exersices-attr display-flex">
     <div class="exersices-attr display-flex">
       <div class="exersices-attr-type my-radio-style">
       <div class="exersices-attr-type my-radio-style">
         <IconText :text="'选择题型'" :color="'green'" :icon="'md-apps'"></IconText>
         <IconText :text="'选择题型'" :color="'green'" :icon="'md-apps'"></IconText>
         <RadioGroup v-model="exersicesType" type="button" @on-change="typeChange">
         <RadioGroup v-model="exersicesType" type="button" @on-change="typeChange">
-          <Radio label="single">单选</Radio>
-          <Radio label="multiple">多选</Radio>
-          <Radio label="judge">判断</Radio>
-          <Radio label="complete">填空</Radio>
-          <Radio label="subjective">问答</Radio>
+          <Radio label="single" :disabled="isEdit">单选</Radio>
+          <Radio label="multiple" :disabled="isEdit">多选</Radio>
+          <Radio label="judge" :disabled="isEdit">判断</Radio>
+          <Radio label="complete" :disabled="isEdit">填空</Radio>
+          <Radio label="subjective" :disabled="isEdit">问答</Radio>
         </RadioGroup>
         </RadioGroup>
       </div>
       </div>
       <div class="exersices-attr-diff my-radio-style">
       <div class="exersices-attr-diff my-radio-style">
@@ -42,12 +42,13 @@
     </div>
     </div>
     <div class="save-wrap display-flex">
     <div class="save-wrap display-flex">
       <Button type="success" @click="getContent(exersicesType)">保存</Button>
       <Button type="success" @click="getContent(exersicesType)">保存</Button>
-      <Button type="success" @click="resetEditor" style="margin-left:10px">重置</Button>
+      <Button type="success" @click="reloadCreate" style="margin-left:10px" v-show="isEdit">新增习题</Button>
+      <Button type="success" @click="resetEditor" style="margin-left:10px">题库</Button>
     </div>
     </div>
   </div>
   </div>
 </template>
 </template>
 <script>
 <script>
-import "videojs-contrib-hls.js/src/videojs.hlsjs"
+  import "videojs-contrib-hls.js/src/videojs.hlsjs"
   import IconText from '@/components/evaluation/IconText.vue'
   import IconText from '@/components/evaluation/IconText.vue'
   import BaseSingle from '@/view/evaluation/types/BaseSingle.vue'
   import BaseSingle from '@/view/evaluation/types/BaseSingle.vue'
   import BaseMultiple from '@/view/evaluation/types/BaseMultiple.vue'
   import BaseMultiple from '@/view/evaluation/types/BaseMultiple.vue'
@@ -102,6 +103,7 @@ import "videojs-contrib-hls.js/src/videojs.hlsjs"
       let editItem = this.$route.params.item; //编辑题目
       let editItem = this.$route.params.item; //编辑题目
       if (editItem) {
       if (editItem) {
         this.editInfo = editItem;
         this.editInfo = editItem;
+        console.log(editItem);
       }
       }
     },
     },
     methods: {
     methods: {
@@ -168,8 +170,10 @@ import "videojs-contrib-hls.js/src/videojs.hlsjs"
 
 
       //题目类型转换
       //题目类型转换
       typeChange(val) {
       typeChange(val) {
-        this.exersicesType = val;
-        if (!isEdit) {
+        if (this.isEdit) {
+          this.$Message.warning("暂不支持更换题型!");
+        } else {
+          this.exersicesType = val;
           this.analysisEditor.txt.clear();
           this.analysisEditor.txt.clear();
         }
         }
       },
       },
@@ -206,8 +210,13 @@ import "videojs-contrib-hls.js/src/videojs.hlsjs"
 
 
       //重置编辑器
       //重置编辑器
       resetEditor() {
       resetEditor() {
-        this.analysisEditor.txt.clear();
-        this.analysisContent = "";
+        this.$router.push({
+            name: 'exercisesList'
+          })
+      },
+
+      reloadCreate() {
+        location.reload()
       },
       },
 
 
       insertAfter(newElement, targetElement) { // newElement是要追加的元素 targetElement 是指定元素的位置
       insertAfter(newElement, targetElement) { // newElement是要追加的元素 targetElement 是指定元素的位置
@@ -249,9 +258,12 @@ import "videojs-contrib-hls.js/src/videojs.hlsjs"
         this.optionsContent = editItem.options;
         this.optionsContent = editItem.options;
         this.analysisContent = editItem.explain;
         this.analysisContent = editItem.explain;
         this.analysisEditor.txt.html(editItem.explain);
         this.analysisEditor.txt.html(editItem.explain);
-
+        //重新渲染题目难度
+        let diffDom = document.getElementsByClassName('exersices-attr-diff')[0].getElementsByClassName('ivu-radio-wrapper')[editItem.difficulty];
+        let colorArr = ['#32CF74', '#E8BE15', '#F19300', '#EB5E00', '#D30000'];
+        diffDom.style.background = colorArr[editItem.difficulty];
+        diffDom.style.color = "#fff";
       }
       }
-      console.log(this.analysisEditor);
 
 
     }
     }
   }
   }

+ 0 - 0
TEAMModelOS/ClientApp/view/evaluation/index/CreateTest.css


+ 87 - 0
TEAMModelOS/ClientApp/view/evaluation/index/CreateTest.vue

@@ -0,0 +1,87 @@
+<template>
+  <div class="ev-container">
+    <h1>新建测试</h1>
+    <Divider />
+    <div class="exersices-attr display-flex">
+      <div class="exersices-attr-type my-radio-style">
+        <IconText :text="'测试情景'" :color="'green'" :icon="'md-apps'"></IconText>
+        <RadioGroup v-model="exersicesType" type="button" @on-change="typeChange">
+          <Radio label="single" :disabled="isEdit">模拟</Radio>
+          <Radio label="multiple" :disabled="isEdit">段考</Radio>
+          <Radio label="judge" :disabled="isEdit">周考</Radio>
+          <Radio label="complete" :disabled="isEdit">小考</Radio>
+          <Radio label="subjective" :disabled="isEdit">自定</Radio>
+        </RadioGroup>
+      </div>
+      <div class="exersices-attr-diff my-radio-style">
+        <IconText :text="'测试类型'" :color="'red'" :icon="'md-pulse'"></IconText>
+        <RadioGroup v-model="exersicesDiff" type="button">
+          <Radio label="0" @click.native="diffChange($event,'0')">正式成绩</Radio>
+          <Radio label="1" @click.native="diffChange($event,'1')">练习成绩</Radio>
+          <Radio label="2" @click.native="diffChange($event,'2')">统计(问卷)</Radio>
+        </RadioGroup>
+      </div>
+    </div>
+    <div class="exersices-attr display-flex">
+      <div class="exersices-attr-type my-radio-style">
+        <IconText :text="'测试对象'" :color="'green'" :icon="'md-apps'"></IconText>
+        <RadioGroup v-model="exersicesType" type="button" @on-change="typeChange">
+          <Radio label="single" :disabled="isEdit">同年级</Radio>
+          <Radio label="multiple" :disabled="isEdit">跨年级</Radio>
+          <Radio label="judge" :disabled="isEdit">跨学校</Radio>
+        </RadioGroup>
+      </div>
+      <div class="exersices-attr-diff my-radio-style" style="margin-top:30px;">
+        <IconText :text="'创建方式'" :color="'red'" :icon="'md-pulse'"></IconText>
+        <RadioGroup v-model="exersicesDiff" type="button">
+          <Radio label="0" @click.native="diffChange($event,'0')">题库挑选</Radio>
+          <Radio label="1" @click.native="diffChange($event,'1')">自动组题</Radio>
+          <Radio label="2" @click.native="diffChange($event,'2')">批量导入</Radio>
+        </RadioGroup>
+      </div>
+    </div>
+    <div class="save-wrap display-flex" style="display:none;">
+      <Button type="success" @click="getContent(exersicesType)">保存</Button>
+      <Button type="success" @click="resetEditor" style="margin-left:10px">重置</Button>
+    </div>
+  </div>
+</template>
+<script>
+  //默认创建测试模板
+  import IconText from '@/components/evaluation/IconText.vue'
+  const defaultExercise = {
+          question: "",
+          options: [],
+          difficulty:"",
+          answer: [],
+          explain: "",
+          type:""
+        }
+  export default {
+    components: {
+      IconText
+    },
+    data() {
+      return {
+        testModel: {
+          passwd: '',
+          passwdCheck: '',
+          age: ''
+        },
+      }
+    },
+    created() {
+
+    },
+    methods: {
+      
+
+    },
+    mounted() {
+      
+    }
+  }
+</script>
+<style scoped>
+  @import"../index/CreateTest.css";
+</style>

+ 78 - 3
TEAMModelOS/ClientApp/view/evaluation/index/ExercisesList.css

@@ -39,8 +39,8 @@
         width: 100%;
         width: 100%;
         height: auto;
         height: auto;
         padding: 20px;
         padding: 20px;
-        margin-top: 20px;
-        font-size: 18px;
+        margin-top: 10px;
+        font-size: 16px;
         font-weight: 600;
         font-weight: 600;
         background: #fff;
         background: #fff;
         /*box-shadow: 0px 5px 5px 2px rgb(187, 182, 182);*/
         /*box-shadow: 0px 5px 5px 2px rgb(187, 182, 182);*/
@@ -60,7 +60,7 @@
         }
         }
 
 
         .content-wrap .exercise-item:hover {
         .content-wrap .exercise-item:hover {
-            box-shadow: 0px 0px 20px 5px rgb(228, 224, 224);
+            box-shadow: 0px 0px 20px 2px rgb(228, 224, 224);
         }
         }
 
 
         .content-wrap .exercise-item:hover .item-tools-bind {
         .content-wrap .exercise-item:hover .item-tools-bind {
@@ -251,3 +251,78 @@
     margin:20px 0;
     margin:20px 0;
 }
 }
 
 
+/*绑定知识点部分树形结构样式*/
+
+.singleClass {
+    cursor:pointer;
+    font-size:14px;
+    margin:10px;
+}
+
+.transferModal {
+    overflow:hidden;
+}
+
+    .transferModal .point-list {
+        max-height:400px;
+        overflow:auto;
+    }
+
+    .transferModal .point-list .ivu-input-wrapper {
+        width: 90%;
+        margin-bottom:10px;
+    }
+
+    .transferModal .selected-point-list {
+        padding:10px;
+        width:100%;
+        border-top:1px solid rgba(128, 128, 128,.3);
+        margin-top:15px;
+    }
+
+    .transferModal .bind-title {
+        margin: 10px 0;
+        font-weight: bold;
+        font-size: 14px;
+    }
+
+    .transferModal .checked-point {
+        margin:5px 15px;
+        background:rgb(16, 171, 231);
+        padding:5px 10px;
+        color:#fff;
+        border-radius:5px;
+        display:inline-block;
+    }
+
+    .transferModal .ivu-checkbox-checked .ivu-checkbox-inner {
+        background:rgb(16, 171, 231);
+        border-color:rgb(16, 171, 231);
+    }
+
+    .transferModal .ivu-icon {
+        color:rgb(16, 171, 231);
+    }
+
+    .transferModal .btn-clear {
+        float:right;
+        font-weight:500;
+        font-size:12px;
+        color:rgb(16, 171, 231);
+        cursor:pointer;
+        letter-spacing:1px;
+    }
+
+    .transferModal .point-checked {
+        background:rgb(16, 171, 231);
+        margin-left:10px;
+        padding:10px;
+    }
+
+    .transferModal .point-unchecked {
+        background: #ccc;
+        margin-left: 10px;
+        padding: 10px;
+    }
+
+

+ 183 - 24
TEAMModelOS/ClientApp/view/evaluation/index/ExercisesList.vue

@@ -1,37 +1,37 @@
 <template>
 <template>
   <div class="ev-list-container">
   <div class="ev-list-container">
     <div class="ev-header">
     <div class="ev-header">
-      <Icon type="md-bookmarks" size="30" color="rgb(16, 171, 231)"/>
+      <Icon type="md-bookmarks" size="30" color="rgb(16, 171, 231)" />
       <span class="ev-title">我的题库</span>
       <span class="ev-title">我的题库</span>
-      <span class="ev-length">共 {{allList.length}} 道题</span>
+      <span class="ev-length">共 {{list.length}} 道题</span>
     </div>
     </div>
     <!-- 筛选部分 -->
     <!-- 筛选部分 -->
     <div class="filter-wrap">
     <div class="filter-wrap">
       <div class="filter-item">
       <div class="filter-item">
         <span class="filter-title">题型:</span>
         <span class="filter-title">题型:</span>
-        <RadioGroup v-model="filterType" type="button">
-          <Radio label="0">全部</Radio>
-          <Radio label="1">单选</Radio>
-          <Radio label="2">多选</Radio>
-          <Radio label="3">判断</Radio>
-          <Radio label="4">填空</Radio>
-          <Radio label="5">问答</Radio>
+        <RadioGroup v-model="filterType" type="button" @on-change="filterTypeChange">
+          <Radio label="all">全部</Radio>
+          <Radio label="single">单选</Radio>
+          <Radio label="multiple">多选</Radio>
+          <Radio label="judge">判断</Radio>
+          <Radio label="complete">填空</Radio>
+          <Radio label="subjective">问答</Radio>
         </RadioGroup>
         </RadioGroup>
       </div>
       </div>
       <div class="filter-item">
       <div class="filter-item">
         <span class="filter-title">难度:</span>
         <span class="filter-title">难度:</span>
-        <RadioGroup v-model="filterDiff" type="button">
-          <Radio label="0">全部</Radio>
-          <Radio label="1">容易</Radio>
-          <Radio label="2">较易</Radio>
-          <Radio label="3">一般</Radio>
-          <Radio label="4">较难</Radio>
-          <Radio label="5">困难</Radio>
+        <RadioGroup v-model="filterDiff" type="button" @on-change="filterDiffChange">
+          <Radio label="all">全部</Radio>
+          <Radio label="0">容易</Radio>
+          <Radio label="1">较易</Radio>
+          <Radio label="2">一般</Radio>
+          <Radio label="3">较难</Radio>
+          <Radio label="4">困难</Radio>
         </RadioGroup>
         </RadioGroup>
       </div>
       </div>
       <div class="filter-item">
       <div class="filter-item">
         <span class="filter-title">排序:</span>
         <span class="filter-title">排序:</span>
-        <RadioGroup v-model="filterSort" type="button">
+        <RadioGroup v-model="filterSort" type="button" @on-change="filterSortChange">
           <Radio label="0">新增时间<Icon type="md-arrow-round-down" /></Radio>
           <Radio label="0">新增时间<Icon type="md-arrow-round-down" /></Radio>
           <Radio label="1">使用次数<Icon type="md-arrow-round-down" /></Radio>
           <Radio label="1">使用次数<Icon type="md-arrow-round-down" /></Radio>
         </RadioGroup>
         </RadioGroup>
@@ -70,7 +70,7 @@
           <Button type="primary" @click="handleEdit(item)">编辑题目</Button>
           <Button type="primary" @click="handleEdit(item)">编辑题目</Button>
           <Button type="info">选题</Button>
           <Button type="info">选题</Button>
           <span class="item-tools-bind">
           <span class="item-tools-bind">
-            <span class="item-tools-tool"><Icon type="ios-link" />绑定知识点</span>
+            <span class="item-tools-tool" @click="handleBindPoint"><Icon type="ios-link" />绑定知识点</span>
             <span class="item-tools-tool"><Icon type="ios-link" />绑定科目</span>
             <span class="item-tools-tool"><Icon type="ios-link" />绑定科目</span>
             <span class="item-tools-tool"><Icon type="ios-link" />绑定课纲</span>
             <span class="item-tools-tool"><Icon type="ios-link" />绑定课纲</span>
           </span>
           </span>
@@ -81,9 +81,29 @@
           show-sizer
           show-sizer
           @on-page-size-change="pageSizeChange"
           @on-page-size-change="pageSizeChange"
           @on-change="pageChange"
           @on-change="pageChange"
-          :page-size-opts="[5,10,15,20]"
-          />
+          :page-size-opts="[5,10,15,20]" />
     <Button type="success" @click="backToAdd" style="margin:10px;">返回</Button>
     <Button type="success" @click="backToAdd" style="margin:10px;">返回</Button>
+
+    <!-- 绑定知识点弹窗 Transfer -->
+    <Modal v-model="bindPointModal"
+           title="绑定知识点"
+           width="500"
+           class-name="transferModal"
+           @on-ok="handleTransferBlock"
+           @on-cancel="">
+      <div class="point-list">
+        <p class="bind-title">选择知识点</p>
+        <Input search placeholder="搜索知识点..." />
+        <Tree :data="knowPointList" ref="pointTree" :render="renderContent" @on-check-change="pointTreeCheck" check-strictly></Tree>
+      </div>
+
+      <div class="selected-point-list">
+        <p class="bind-title">已选知识点<span style="font-weight:500"> (最多绑定5个知识点)</span><span class="btn-clear" @click="handleClearChecked">清空</span></p>
+        <span class="checked-point" v-for="item in checkedPointList">{{item.name}}</span>
+      </div>
+    </Modal>
+
+
   </div>
   </div>
 </template>
 </template>
 <script>
 <script>
@@ -97,6 +117,7 @@ import { setTimeout } from 'core-js';
     data() {
     data() {
       return {
       return {
         list: [],
         list: [],
+        bindPointModal: false,
         exersicesType: {
         exersicesType: {
           single: "单选",
           single: "单选",
           multiple: "多选",
           multiple: "多选",
@@ -106,14 +127,15 @@ import { setTimeout } from 'core-js';
         },
         },
         exersicesDiff: ["容易", "较易", "一般", "较难", "困难"],
         exersicesDiff: ["容易", "较易", "一般", "较难", "困难"],
         diffColors: ['#32CF74', '#E8BE15', '#F19300', '#EB5E00', '#D30000'],
         diffColors: ['#32CF74', '#E8BE15', '#F19300', '#EB5E00', '#D30000'],
-        filterType:"0",
-        filterDiff:"0",
+        filterType:"all",
+        filterDiff:"all",
         filterSort: "0",
         filterSort: "0",
         pageSize: 5,
         pageSize: 5,
         pageNum: 1,
         pageNum: 1,
         totalNum: 100,
         totalNum: 100,
-        allList: questions.list
-        
+        allList: questions.list,
+        knowPointList: [],
+        checkedPointList: []
       }
       }
     },
     },
     created() {
     created() {
@@ -126,6 +148,30 @@ import { setTimeout } from 'core-js';
 
 
     },
     },
     methods: {
     methods: {
+
+      //筛选题型
+      filterTypeChange(val) {
+        if (val == "all") {
+          this.list = questions.list;
+        } else {
+          this.list = questions.list.filter(item => item.type == val);
+        }
+      },
+
+      //筛选难度
+      filterDiffChange(val) {
+         if (val == "all") {
+          this.list = questions.list;
+         } else {
+           this.list = questions.list.filter(item => item.difficulty == val);
+        }
+      },
+
+      //排序条件更换
+      filterSortChange(val) {
+        console.log(val);
+      },
+
       //展开与收起答案
       //展开与收起答案
       showAnswer(e, type) {
       showAnswer(e, type) {
         let el = e.currentTarget;
         let el = e.currentTarget;
@@ -171,6 +217,119 @@ import { setTimeout } from 'core-js';
               item: item,
               item: item,
             }
             }
           })
           })
+      },
+
+      //绑定知识点操作
+      handleBindPoint() {
+        this.bindPointModal = true;
+        this.getStandardList();
+      },
+
+      //获取标准知识块数据
+      getStandardList() {
+        let data = {
+          periods: ["Period_21"],
+          pointParams: {
+              SubjectCode: "Subject_Chinese",
+              PartitionKey: "zh-CN",
+            }
+        }
+        this.$api.FindKnowledgeBlockAndPointByDict(data).then(res => {
+          let list = res.result.data;
+          this.knowPointList = list;
+        })
+      },
+
+      //确认编辑知识块
+      handleTransferBlock() {
+        
+      },
+
+      //知识点绑定选中事件
+      pointTreeCheck(val, data) {
+        //let list = this.checkedPointList;
+        //if (data.children.length == 0 && list.length < 5 && val.indexOf(data) > -1) {
+        //  list.push(data);
+        //} else if (list.length === 5) {
+        //  this.$Message.warning("最多绑定5个知识点!");
+        //} else if (val.indexOf(data) === -1 && list.indexOf(data) > -1) {
+        //  list.splice(list.indexOf(data), 1);
+        //}
+
+
+        let points = val.filter(item => item.children.length == 0);
+        if (points.length > 5) {
+          this.checkedPointList = points.slice(0, 5);
+          this.$Message.warning("最多绑定5个知识点!");
+        } else {
+          this.checkedPointList = points;
+        }
+        console.log(val, data);
+      },
+
+      //知识点树形结构渲染
+       renderContent(h, { root, node, data }) {
+        return h(
+          "span",
+          {
+            domProps: {
+              className: "singleClass"
+            },
+            on: {
+              click: () => {
+                this.titleClick(root, node, data, event);
+              }
+            }
+          },[
+            h("span", [
+              h("Icon", {
+                props: {
+                  type:
+                    data.children && data.children.length > 0
+                      ? "md-albums"
+                      : "ios-paper-outline"
+                },
+                style: {
+                  marginRight: "5px",
+                }
+              }),
+              h("span", data.name),
+              h('span',{
+                domProps: {
+                  className: this.checkedPointList.indexOf(data) > -1 ? "point-checked" : "point-unchecked"
+                },
+                style: {
+                  display: data.children && data.children.length > 0
+                      ? "none"
+                    : "inline-block"
+                },
+                on: {
+                  click: () => {
+                    if (this.checkedPointList.indexOf(data) == -1) {
+                      if (this.checkedPointList.length < 5) {
+                        this.checkedPointList.push(data);
+                      } else {
+                        this.$Message.warning("最多绑定5个知识点!");
+                      }
+                    } else {
+                      this.checkedPointList.splice(this.checkedPointList.indexOf(data), 1);
+                    }
+                  }
+                }
+            })
+            ])
+          ]
+        );
+      },
+       // 标题点击收缩展开
+      titleClick(root, node, data, event) {
+        data.expand = !data.expand;
+      },
+
+      handleClearChecked() {
+        console.log(this.$refs.pointTree.getCheckedNodes());
+        //this.$refs.pointTree.getSelectedNodes() = [];
+        this.checkedPointList = [];
       }
       }
 
 
     },
     },

+ 15 - 75
TEAMModelOS/ClientApp/view/evaluation/index/list.json

@@ -1,88 +1,28 @@
 {
 {
   "list": [
   "list": [
     {
     {
-      "answer": [ "D" ],
+      "answer": "错误",
       "difficulty": "1",
       "difficulty": "1",
       "explain": "<p>下列各句中,画线词语的古今意义相同的一项(    )<p><br></p>",
       "explain": "<p>下列各句中,画线词语的古今意义相同的一项(    )<p><br></p>",
-      "options": [
-        {
-          "code": "A",
-          "value": "焉用亡郑以<u>陪</u>邻",
-          "index": 0
-        },
-        {
-          "code": "B",
-          "value": "燕王<u>诚</u>振怖大王之威",
-          "index": 1
-        },
-        {
-          "code": "C",
-          "value": "<u>籍</u>吏民,封府库",
-          "index": 2
-        },
-        {
-          "code": "D",
-          "value": "沛公起<u>如</u>厕",
-          "index": 3
-        },
-        {
-          "code": "E",
-          "value": "沛公起<u>如</u>厕",
-          "index": 4
-        }
-      ],
+      "options": [],
       "question": "<p>解析解析解析解析解析解析解析解析解析解析</p><p><br></p>",
       "question": "<p>解析解析解析解析解析解析解析解析解析解析</p><p><br></p>",
-      "type": "multiple"
+      "type": "judge"
     },
     },
     {
     {
-      "answer": [ "A" ],
+      "answer": [ "<p>请问请问</p>", "<p>趣味去</p>" ],
       "difficulty": "2",
       "difficulty": "2",
-      "explain": "<p>下列各句中,画线词语的古今意义相同的一项(    )<p><br></p>",
-      "options": [
-        {
-          "code": "A",
-          "value": "焉用亡郑以<u>陪</u>邻"
-        },
-        {
-          "code": "B",
-          "value": "燕王<u>诚</u>振怖大王之威"
-        },
-        {
-          "code": "C",
-          "value": "<u>籍</u>吏民,封府库"
-        },
-        {
-          "code": "D",
-          "value": "沛公起<u>如</u>厕"
-        }
-      ],
-      "question": "<p>下列各句中,画线词语的古今意义相同的一项(    )</p><p><br></p>",
-      "type": "single"
+      "explain": "<p>填空题的解析解析<p><br></p>",
+      "options": [],
+      "question": "<p><p>十大大苏打</p>&nbsp;<span class=\"complete-line\" data-index=\"0\" data-answer=\"0\" contenteditable=\"false\">①</span>&nbsp;按时大苏打&nbsp;<span class=\"complete-line\" data-index=\"1\" data-answer=\"1\" contenteditable=\"false\">②</span>&nbsp;</p><p><br></p>",
+      "type": "complete"
     },
     },
     {
     {
-      "answer": [ "A" ],
+      "answer": "<p>主观题答案主观题答案主观答案答案答案<p><br></p>",
       "difficulty": "0",
       "difficulty": "0",
-      "explain": "<p>下列各句中,画线词语的古今意义相同的一项(    )<p><br></p>",
-      "options": [
-        {
-          "code": "A",
-          "value": "焉用亡郑以<u>陪</u>邻"
-        },
-        {
-          "code": "B",
-          "value": "燕王<u>诚</u>振怖大王之威"
-        },
-        {
-          "code": "C",
-          "value": "<u>籍</u>吏民,封府库"
-        },
-        {
-          "code": "D",
-          "value": "沛公起<u>如</u>厕"
-        } 
-      ],
-      "question": "<p>下列各句中,画线词语的古今意义相同的一项是(    )</p><p><br></p>",
-      "type": "single"
+      "explain": "<p>主观题解析主观题解析主观题解析主观题解析<p><br></p>",
+      "options": [],
+      "question": "<p>主观题题干干主观题题干干主观题题干干主观题题干干</p><p><br></p>",
+      "type": "subjective"
     },
     },
     {
     {
       "answer": [ "A" ],
       "answer": [ "A" ],
@@ -110,7 +50,7 @@
       "type": "single"
       "type": "single"
     },
     },
     {
     {
-      "answer": [ "A" ],
+      "answer": [ "C", "B","D" ],
       "difficulty": "0",
       "difficulty": "0",
       "explain": "<p>下列各句中,画线词语的古今意义相同的一项<p><br></p>",
       "explain": "<p>下列各句中,画线词语的古今意义相同的一项<p><br></p>",
       "options": [
       "options": [
@@ -132,7 +72,7 @@
         }
         }
       ],
       ],
       "question": "<p>下列各句中,画线词语的古今意义相同的一项是(    )</p><p><br></p>",
       "question": "<p>下列各句中,画线词语的古今意义相同的一项是(    )</p><p><br></p>",
-      "type": "single"
+      "type": "multiple"
     },
     },
     {
     {
       "answer": [ "A" ],
       "answer": [ "A" ],

+ 59 - 24
TEAMModelOS/ClientApp/view/evaluation/types/BaseCompletion.vue

@@ -12,7 +12,7 @@
       <div v-for="(item,index) in optionsIndexArr" :class="['editor-wrap-'+item,'editor-wrap']" style="margin-top:10px;display:flex">
       <div v-for="(item,index) in optionsIndexArr" :class="['editor-wrap-'+item,'editor-wrap']" style="margin-top:10px;display:flex">
         <span class="fl-center option-order">{{'空0'+(index+1)}}</span>
         <span class="fl-center option-order">{{'空0'+(index+1)}}</span>
         <div :ref="'editor'+index" style="text-align:left" class="option-editor" @click="optionClick(index)"></div>
         <div :ref="'editor'+index" style="text-align:left" class="option-editor" @click="optionClick(index)"></div>
-        <span :class="['fl-center', 'option-setting','option-true']" style="width:120px;background:rgba(100, 175, 252, 1)" @click="settingAnswer(index)">添加多个答案</span>
+        <span :class="['fl-center', 'option-setting']" style="display:none;background:transparent;cursor:auto"></span>
         <span class="fl-center option-delete" @click="deleteOption(index)"><Icon type="ios-close-circle" /></span>
         <span class="fl-center option-delete" @click="deleteOption(index)"><Icon type="ios-close-circle" /></span>
       </div>
       </div>
       <!--<p class="option-add"><span @click="addOption()">+ 添加选项 </span></p>-->
       <!--<p class="option-add"><span @click="addOption()">+ 添加选项 </span></p>-->
@@ -26,6 +26,7 @@
     components: {
     components: {
       IconText
       IconText
     },
     },
+    props: ['editInfo'],
     data() {
     data() {
       return {
       return {
         completionEditor:"",
         completionEditor:"",
@@ -34,6 +35,7 @@
         initFlag: true,
         initFlag: true,
         trueIndex: 0,
         trueIndex: 0,
         stemContent: "",
         stemContent: "",
+        stemEditor:null,
         answerContent: [],
         answerContent: [],
         linesIndexArr: [],
         linesIndexArr: [],
         optionsIndexArr:[],
         optionsIndexArr:[],
@@ -44,6 +46,45 @@
         }
         }
       }
       }
     },
     },
+    created() {
+      //编辑状态下回显
+      if (Object.keys(this.editInfo).length) {
+        let that = this;
+        this.optionsIndexArr = this.editInfo.answer;
+        this.optionsIndexArr.forEach((item, index) => {
+          this.optionsContent.push({ code: index, value: item }); //填空答案回显
+          this.$nextTick(() => {
+              let editor = new E(that.$refs['editor' + index][0]);
+              editor.customConfig = this.defaultConfig;
+                //每个填空选项 数据变化
+              editor.customConfig.onchange = (html) => {
+                let codeArr = this.optionsContent.map(item => item.code);
+                //如果已经编辑过则 修改选项内容
+                if (codeArr.indexOf(index) != -1) {
+                  this.optionsContent[codeArr.indexOf(index)].value = html;
+                } else { //否则创建新选项
+                  let option = {
+                    code: index,
+                    value: html
+                  }
+                  this.optionsContent.push(option);
+                }
+              },
+              editor.customConfig.onblur = function () {
+                let allToolbars = document.getElementsByClassName('option-editor');
+                for (let j = 0; j < allToolbars.length; j++) {
+                  if (allToolbars[j].children.length) {
+                    allToolbars[j].children[0].style.visibility = "hidden"
+                  }
+                }
+              },
+              editor.create();
+              editor.txt.html(item); //填空答案回显内容
+          })
+        })
+
+      }
+    },
     methods: {
     methods: {
       //设置正确答案
       //设置正确答案
       settingAnswer(index) {
       settingAnswer(index) {
@@ -55,12 +96,13 @@
       },
       },
       //删除选项
       //删除选项
       deleteOption(index) {
       deleteOption(index) {
-        if (this.options.length > 2) {
-          this.options.splice(index, 1);
-          this.linesNum -= 1;
-        } else {
-          this.$Message.warning("至少保留两个选项!");
-        }
+        //if (this.options.length > 2) {
+        //  this.options.splice(index, 1);
+        //  this.linesNum -= 1;
+        //} else {
+        //  this.$Message.warning("至少保留两个选项!");
+        //}
+        this.$Message.warning("请在题目编辑框内删除对应横线即可");
       },
       },
       //选项输入框点击事件
       //选项输入框点击事件
       optionClick(index) {
       optionClick(index) {
@@ -85,15 +127,8 @@
         let addHtml = "&nbsp;<span class='complete-line' data-index=" + newIndex + " data-answer=" + newIndex + " contenteditable='false'>&#93" + ( newLineIndex + 12 ) + "</span>&nbsp;"
         let addHtml = "&nbsp;<span class='complete-line' data-index=" + newIndex + " data-answer=" + newIndex + " contenteditable='false'>&#93" + ( newLineIndex + 12 ) + "</span>&nbsp;"
         this.completionEditor.cmd.do('insertHTML', addHtml)
         this.completionEditor.cmd.do('insertHTML', addHtml)
         this.stemContent = this.stemContent + addHtml;
         this.stemContent = this.stemContent + addHtml;
-
-        console.log(this.linesIndexArr);
-
         this.linesIndexArr.push(newIndex); //题干中下划线集合
         this.linesIndexArr.push(newIndex); //题干中下划线集合
         this.optionsIndexArr.push(newIndex); //选项集合
         this.optionsIndexArr.push(newIndex); //选项集合
-
-
-        console.log(this.linesIndexArr);
-
           this.$nextTick(() => {
           this.$nextTick(() => {
             let editor = new E(that.$refs['editor' + newIndex][0]);
             let editor = new E(that.$refs['editor' + newIndex][0]);
             editor.customConfig = this.defaultConfig;
             editor.customConfig = this.defaultConfig;
@@ -147,10 +182,6 @@
           Array.prototype.diff = function(a) {
           Array.prototype.diff = function(a) {
               return this.filter(function(i) {return a.indexOf(i) < 0;});
               return this.filter(function(i) {return a.indexOf(i) < 0;});
           };
           };
-
-          console.log(this.linesIndexArr);
-          console.log(dataSetArr);
-
           let deleteIndexArr = this.linesIndexArr.diff(dataSetArr); //获取要删除的选项下标
           let deleteIndexArr = this.linesIndexArr.diff(dataSetArr); //获取要删除的选项下标
           let optionsArr = Array.prototype.slice.call(document.getElementsByClassName('editor-wrap')); //获取到所有的选项DOM
           let optionsArr = Array.prototype.slice.call(document.getElementsByClassName('editor-wrap')); //获取到所有的选项DOM
 
 
@@ -158,8 +189,8 @@
           this.$nextTick(() => {
           this.$nextTick(() => {
             deleteIndexArr.forEach(item => {
             deleteIndexArr.forEach(item => {
               let deleteDom = document.getElementsByClassName('editor-wrap')[item-1];
               let deleteDom = document.getElementsByClassName('editor-wrap')[item-1];
-              console.log(deleteDom);
               this.optionsIndexArr.splice(this.optionsIndexArr.indexOf(deleteDom), 1);
               this.optionsIndexArr.splice(this.optionsIndexArr.indexOf(deleteDom), 1);
+              this.optionsContent.splice(item, 1);
               optionsArr.splice(item, 1);
               optionsArr.splice(item, 1);
             });
             });
           })
           })
@@ -171,14 +202,18 @@
           item.innerHTML = numCircle;
           item.innerHTML = numCircle;
           item.setAttribute('data-index', index);
           item.setAttribute('data-index', index);
         })
         })
-
-
-
-
-
       },
       },
         completionEditor.create();
         completionEditor.create();
 
 
+        this.stemEditor = completionEditor;
+
+         //判断是否为编辑状态
+        if (Object.keys(this.editInfo).length > 0) {
+          this.stemEditor.txt.html(this.editInfo.question);
+          this.stemContent = this.editInfo.question;
+          
+        }
+
     }
     }
 
 
 
 

+ 10 - 0
TEAMModelOS/ClientApp/view/evaluation/types/BaseJudge.vue

@@ -22,6 +22,7 @@
     components: {
     components: {
       IconText
       IconText
     },
     },
+    props: ['editInfo'],
     data() {
     data() {
       return {
       return {
         trueAnswer: "正确",
         trueAnswer: "正确",
@@ -31,6 +32,7 @@
           uploadFileName: 'files', //上传图片后台获取的文件名
           uploadFileName: 'files', //上传图片后台获取的文件名
         },
         },
         stemContent: "",
         stemContent: "",
+        stemEditor:null
       }
       }
     },
     },
     methods: {
     methods: {
@@ -43,6 +45,14 @@
         this.stemContent = html;
         this.stemContent = html;
       }
       }
       stemEditor.create();
       stemEditor.create();
+      this.stemEditor = stemEditor;
+
+       //判断是否为编辑状态
+      if (Object.keys(this.editInfo).length > 0) {
+        this.stemEditor.txt.html(this.editInfo.question);
+        this.stemContent = this.editInfo.question;
+        this.trueAnswer = this.editInfo.answer;
+      }
 
 
     }
     }
   }
   }

+ 3 - 2
TEAMModelOS/ClientApp/view/evaluation/types/BaseMultiple.vue

@@ -11,7 +11,7 @@
       <div v-for="(item,index) in options" :class="'editor-wrap-'+item" style="margin-top:10px;display:flex">
       <div v-for="(item,index) in options" :class="'editor-wrap-'+item" style="margin-top:10px;display:flex">
         <span class="fl-center option-order">{{String.fromCharCode(64 + parseInt(index+1))}}</span>
         <span class="fl-center option-order">{{String.fromCharCode(64 + parseInt(index+1))}}</span>
         <div :ref="'multipleEditor'+item" style="text-align:left" class="option-editor" @click="optionClick(item)"></div>
         <div :ref="'multipleEditor'+item" style="text-align:left" class="option-editor" @click="optionClick(item)"></div>
-        <span :class="['fl-center', 'option-setting', trueArr.indexOf(item) > -1 ? 'option-true':'']" @click="settingAnswer(item,index)">{{ trueArr.indexOf(item) > -1 ? '正确答案' :'设为答案' }}</span>
+        <span :class="['fl-center', 'option-setting', trueArr.indexOf(item) > -1 ? 'option-true':'']" @click="settingAnswer(item,index)">{{ trueIndex.indexOf(item) > -1 ? '正确答案' :'设为答案' }}</span>
         <span class="fl-center option-delete" @click="deleteOption(item,index)"><Icon type="ios-close-circle" /></span>
         <span class="fl-center option-delete" @click="deleteOption(item,index)"><Icon type="ios-close-circle" /></span>
       </div>
       </div>
       <p class="option-add"><span @click="addOption()">+ 添加选项 </span><span style="color:rgb(60,196,82);margin-left:15px;font-weight:bold">正确答案 :{{showTrueAnswers}}</span></p>
       <p class="option-add"><span @click="addOption()">+ 添加选项 </span><span style="color:rgb(60,196,82);margin-left:15px;font-weight:bold">正确答案 :{{showTrueAnswers}}</span></p>
@@ -185,7 +185,8 @@
         this.stemEditor.txt.html(this.editInfo.question);
         this.stemEditor.txt.html(this.editInfo.question);
         this.stemContent = this.editInfo.question;
         this.stemContent = this.editInfo.question;
         this.optionsContent = this.editInfo.options;
         this.optionsContent = this.editInfo.options;
-        this.transferArr = this.editInfo.answer;
+        this.trueIndex = this.editInfo.answer.map(item => item.charCodeAt() - 65);
+        this.trueArr = this.editInfo.answer.map(item => item.charCodeAt() - 65);
         this.options = this.editInfo.options.map((item,index) => index);
         this.options = this.editInfo.options.map((item,index) => index);
       }
       }
 
 

+ 15 - 1
TEAMModelOS/ClientApp/view/evaluation/types/BaseSubjective.vue

@@ -21,16 +21,18 @@
     components: {
     components: {
       IconText
       IconText
     },
     },
+    props: ['editInfo'],
     data() {
     data() {
       return {
       return {
-        trueAnswer: "正确",
         defaultConfig: {
         defaultConfig: {
           uploadImgServer: '/api/file/uploadWangEditor', //图片上传地址
           uploadImgServer: '/api/file/uploadWangEditor', //图片上传地址
           showLinkImg: false, //是否展示网络图片链接上传
           showLinkImg: false, //是否展示网络图片链接上传
           uploadFileName: 'files', //上传图片后台获取的文件名
           uploadFileName: 'files', //上传图片后台获取的文件名
         },
         },
         stemContent: "",
         stemContent: "",
+        stemEditor:null,
         answerContent: "",
         answerContent: "",
+        answerEditor:null
 
 
       }
       }
     },
     },
@@ -52,6 +54,18 @@
       }
       }
       answerEditor.create();
       answerEditor.create();
 
 
+      this.stemEditor = stemEditor;
+      this.answerEditor = answerEditor;
+
+         //判断是否为编辑状态
+      if (Object.keys(this.editInfo).length > 0) {
+          this.stemContent = this.editInfo.question;
+          this.answerContent = this.editInfo.answer;
+          this.stemEditor.txt.html(this.editInfo.question);
+          this.answerEditor.txt.html(this.editInfo.answer);
+          
+        }
+
     }
     }
   }
   }
 </script>
 </script>