dusenyao 1 rok pred
rodič
commit
9c9859c0e2

+ 2 - 2
src/App.vue

@@ -12,7 +12,7 @@ export default {
   created() {
     // 捕获未处理的错误
     window.onerror = (msg, url, lineNo, columnNo, error) => {
-      console.log('onerror', msg, url, lineNo, columnNo, error);
+      console.error('onerror', msg, url, lineNo, columnNo, error);
       return true;
     };
 
@@ -23,7 +23,7 @@ export default {
       // 获取拒绝的 Promise
       const promise = event.promise;
       promise.catch((e) => {
-        console.log('catch', e);
+        console.error('catch', e);
       });
       // 获取拒绝的原因(错误)
       // const reason = event.reason;

+ 5 - 0
src/styles/element.scss

@@ -4,6 +4,11 @@ div.el-table {
   .el-table__cell {
     padding: 8px 0;
   }
+
+  &--small {
+    font-size: 14px;
+    color: $font-color;
+  }
 }
 
 .el-pagination {

+ 7 - 2
src/views/exercise_questions/create/components/create.vue

@@ -62,6 +62,7 @@ export default {
   },
   data() {
     return {
+      timer: '',
       curSaveDate: '',
       exerciseComponents: {
         select: SelectQuestion
@@ -75,10 +76,14 @@ export default {
     }
   },
   mounted() {
-    setInterval(() => {
+    this.timer = setInterval(() => {
       this.saveQuestion();
     }, 30000);
   },
+  beforeDestroy() {
+    this.saveQuestion();
+    clearInterval(this.timer);
+  },
   methods: {
     /**
      * 选择练习
@@ -125,7 +130,7 @@ export default {
       if (data.setting.score_type === scoreTypeList[1].value) {
         data.answer.item_score = data.setting.score;
       }
-      console.log(data.answer);
+
       return {
         question_id: this.indexList[this.curIndex].id,
         type: data.type,

+ 1 - 1
src/views/exercise_questions/create/components/exercises/SelectQuestion.vue

@@ -64,7 +64,7 @@
           </el-radio>
         </el-form-item>
         <el-form-item label="题号">
-          <el-input v-model="data.setting.question_number" disabled />
+          <el-input v-model="data.setting.question_number" />
         </el-form-item>
         <el-form-item label-width="45px">
           <el-radio

+ 6 - 0
src/views/exercise_questions/create/index.vue

@@ -269,3 +269,9 @@ export default {
   }
 }
 </style>
+
+<style>
+.el-cascader-menu__wrap {
+  height: 235px;
+}
+</style>

+ 41 - 2
src/views/exercise_questions/data/common.js

@@ -9,9 +9,48 @@ export const questionTypeOption = [
     value: 'base',
     label: '基础题型',
     children: [
-      { value: 'select', label: '选择题' }
-      // { value: 'judge', label: '判断题' }
+      { label: '选择题', value: 'select' },
+      { label: '判断题', value: 'judge' },
+      { label: '填空题', value: 'fill' },
+      { label: '排序题', value: 'sort' },
+      { label: '连线题', value: 'line' },
+      { label: '问答题', value: 'answer' },
+      { label: '填表题', value: 'table' }
     ]
+  },
+  {
+    value: 'hear',
+    label: '听力题',
+    children: [
+      { label: '听后选择', value: 'hear_select' },
+      { label: '听后判断', value: 'hear_judge' },
+      { label: '听后填空', value: 'hear_fill' },
+      { label: '自定义听力题', value: 'hear_custom' }
+    ]
+  },
+  {
+    value: 'spoken',
+    label: '口语题',
+    children: [
+      { label: '朗读题', value: 'read_aloud' },
+      { label: '听后复述', value: 'repeat' },
+      { label: '回答问题', value: 'spoken_answer' },
+      { label: '看图说话', value: 'spoken_picture' },
+      { label: '对话练习', value: 'spoken_dialogue' },
+      { label: '自定义口语', value: 'spoken_custom' }
+    ]
+  },
+  {
+    value: 'read',
+    label: '阅读题'
+  },
+  {
+    value: 'write',
+    label: '写作题'
+  },
+  {
+    value: 'chinese',
+    label: '汉字题'
   }
 ];
 

+ 6 - 14
src/views/exercise_questions/preview/SelectPreview.vue

@@ -1,14 +1,14 @@
 <template>
   <div class="select-preview">
     <div class="stem">
-      <span>{{ data.setting.question_number }}.</span>
+      <span class="question-number">{{ data.setting.question_number }}.</span>
       <span v-html="data.stem"></span>
     </div>
     <div v-if="data.setting.is_describe" class="describe">{{ data.describe }}</div>
     <AudioPlay v-if="data.setting.is_hear && data.file_id_list.length > 0" :file-id="data.file_id_list[0]" />
     <ul class="option-list">
       <li
-        v-for="({ content, mark }, i) in list"
+        v-for="({ content, mark }, i) in data.options"
         :key="mark"
         :class="['option-item', { active: isAnswer(mark) }]"
         @click="selectAnswer(mark)"
@@ -43,18 +43,6 @@ export default {
       computeOptionMethods
     };
   },
-  computed: {
-    list() {
-      const list = [...this.data.options];
-      for (let i = list.length - 1; i >= 0; i--) {
-        const randomIndex = Math.floor(Math.random() * (i + 1));
-        const itemAtIndex = list[randomIndex];
-        list[randomIndex] = list[i];
-        list[i] = itemAtIndex;
-      }
-      return list;
-    }
-  },
   methods: {
     isAnswer(mark) {
       return this.answer.indexOf(mark) !== -1;
@@ -93,6 +81,10 @@ export default {
     font-weight: bold;
     color: #34343a;
 
+    .question-number {
+      margin-right: 4px;
+    }
+
     :deep p {
       margin: 0;
     }

+ 0 - 0
src/views/home/personal_question/CreateExercise.vue → src/views/home/personal_question/components/CreateExercise.vue


+ 101 - 0
src/views/home/personal_question/components/ShareDialog.vue

@@ -0,0 +1,101 @@
+<template>
+  <el-dialog :visible="dialogVisible" title="分享" width="700px" @close="dialogClose">
+    <div class="share-condition">
+      <div class="condition-top">
+        <span>开始日期</span>
+        <el-date-picker v-model="begin_date" type="date" placeholder="选择日期" style="width: 100%" />
+        <span>有效期</span>
+        <el-input v-model="period_validity" placeholder="请输入有效期" />
+        <span>作答限时</span>
+        <el-input v-model="answer_limit" placeholder="请输入作答限时" />
+      </div>
+
+      <div class="condition-bottom">
+        <span>发送方式</span>
+        <el-radio-group v-model="send_type">
+          <el-radio :label="1">发送至课程</el-radio>
+          <el-radio :label="2">生成链接/二维码</el-radio>
+        </el-radio-group>
+        <span>作答模式</span>
+        <el-radio-group v-model="answer_type">
+          <el-radio :label="1">练习模式</el-radio>
+          <el-radio :label="2">考试模式</el-radio>
+        </el-radio-group>
+      </div>
+    </div>
+
+    <div class="select-course">
+      <div class="title">选择课程</div>
+    </div>
+
+    <div slot="footer" class="footer">
+      <el-button type="primary" @click="dialogClose">发送</el-button>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+export default {
+  name: 'ShareDialog',
+  props: {
+    dialogVisible: {
+      type: Boolean,
+      default: false
+    }
+  },
+  data() {
+    return {
+      begin_date: '',
+      period_validity: 50,
+      answer_limit: 30,
+      send_type: 1,
+      answer_type: 1
+    };
+  },
+  methods: {
+    dialogClose() {
+      this.$emit('update:dialogVisible');
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+.share-condition {
+  .condition-top {
+    display: grid;
+    grid-template: 30px 32px / repeat(auto-fill, 210px);
+    grid-auto-flow: column;
+    column-gap: 16px;
+  }
+
+  .condition-bottom {
+    display: grid;
+    grid-template: 30px 32px / repeat(auto-fill, 240px);
+    grid-auto-flow: column;
+    column-gap: 32px;
+    padding: 0 16px;
+    margin-top: 36px;
+
+    .el-radio-group {
+      display: flex;
+    }
+  }
+}
+
+.select-course {
+  margin-top: 16px;
+}
+
+.footer {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+
+  :deep .el-button {
+    width: 200px;
+    height: 34px;
+    border-radius: 20px;
+  }
+}
+</style>

+ 21 - 15
src/views/home/personal_question/index.vue

@@ -3,29 +3,29 @@
   <div class="personal">
     <HomeCommon ref="common" :data="exercise_list" :total="total_count" @getList="pageQueryExerciseList">
       <template #default>
-        <el-table-column prop="index" label="序号" width="65">
+        <el-table-column prop="index" label="序号" width="70">
           <template slot-scope="{ $index }">{{ $index + 1 }}</template>
         </el-table-column>
-        <el-table-column prop="name" label="练习名称" width="180" />
-        <el-table-column prop="tag" label="标签" width="120">
+        <el-table-column prop="name" label="练习名称" width="280" />
+        <el-table-column prop="tag" label="标签" width="180">
           <template slot-scope="{ row }">
             <span v-for="(item, i) in row.label_list" :key="i" class="tag">{{ item }}</span>
           </template>
         </el-table-column>
-        <el-table-column prop="creator_name" label="创建者" width="120" />
-        <el-table-column prop="create_time" label="创建时间" width="140" />
-        <el-table-column prop="last_modifier_name" label="最近编辑" width="100" />
-        <el-table-column prop="last_modify_time" label="最近编辑时间" width="140" />
-        <el-table-column prop="intro" label="简介" width="200" />
-        <el-table-column label="状态" width="90">
+        <el-table-column prop="creator_name" label="创建者" width="160" />
+        <el-table-column prop="create_time" label="创建时间" width="180" />
+        <el-table-column prop="last_modifier_name" label="最近编辑" width="140" />
+        <el-table-column prop="last_modify_time" label="最近编辑时间" width="180" />
+        <el-table-column prop="intro" label="简介" width="240" />
+        <el-table-column label="状态" width="100">
           <template slot-scope="{ row }">
             <span :class="statusList[row.status].class">{{ statusList[row.status].name }}</span>
           </template>
         </el-table-column>
-        <el-table-column prop="operation" label="操作">
+        <el-table-column prop="operation" label="操作" fixed="right" width="200">
           <template slot-scope="{ row }">
             <span class="link" @click="$router.push({ path: '/exercise', query: { id: row.id } })">编辑</span>
-            <span class="link">分享</span>
+            <span class="link" @click="share(row.id)">分享</span>
             <span class="link">公开</span>
             <span class="link danger" @click="deleteExercise(row.id)">删除</span>
           </template>
@@ -56,6 +56,7 @@
     </HomeCommon>
 
     <CreateExercise :dialog-visible.sync="dialogVisible" />
+    <ShareDialog :dialog-visible.sync="visibleShare" />
   </div>
 </template>
 
@@ -63,13 +64,15 @@
 import { PageQueryExerciseList, DeleteExercise } from '@/api/exercise';
 
 import HomeCommon from '../common.vue';
-import CreateExercise from './CreateExercise.vue';
+import CreateExercise from './components/CreateExercise.vue';
+import ShareDialog from './components/ShareDialog.vue';
 
 export default {
   name: 'PersonalQuestion',
   components: {
     HomeCommon,
-    CreateExercise
+    CreateExercise,
+    ShareDialog
   },
   data() {
     return {
@@ -90,7 +93,8 @@ export default {
       // 表格数据
       exercise_list: [],
       total_count: 0, // 总条数
-      dialogVisible: false
+      dialogVisible: false,
+      visibleShare: false // 分享弹窗
     };
   },
   methods: {
@@ -113,7 +117,9 @@ export default {
           this.$message.error('删除失败');
         });
     },
-
+    share() {
+      this.visibleShare = true;
+    },
     createExercise() {
       this.dialogVisible = true;
     }

+ 18 - 10
src/views/home/public_question/index.vue

@@ -2,22 +2,30 @@
 <template>
   <HomeCommon ref="common" :data="exercise_list" :total="total_count" @getList="pageQueryExerciseList">
     <template #default>
-      <el-table-column label="序号" width="65">
+      <el-table-column label="序号" width="70">
         <template slot-scope="{ $index }">{{ $index + 1 }}</template>
       </el-table-column>
-      <el-table-column prop="name" label="练习名称" width="442" />
-      <el-table-column prop="tag" label="标签" width="180">
+      <el-table-column prop="name" label="练习名称" width="480" />
+      <el-table-column prop="tag" label="标签" width="360">
         <template slot-scope="{ row }">
           <span v-for="(item, i) in row.label_list" :key="i" class="tag">{{ item }}</span>
         </template>
       </el-table-column>
-      <el-table-column prop="intro" label="简介" width="200" />
-      <el-table-column prop="teacher_name" label="发布者" width="120" />
-      <el-table-column prop="create_time" label="创建日期" width="140" />
-      <el-table-column prop="operation" label="操作">
-        <span class="link">查看</span>
-        <span class="link">编辑</span>
-        <span class="link">复制到个人题库</span>
+      <el-table-column prop="intro" label="简介" width="280" />
+      <el-table-column prop="teacher_name" label="发布者" width="180" />
+      <el-table-column prop="create_time" label="创建日期" width="180" />
+      <el-table-column prop="operation" label="操作" fixed="right" width="220">
+        <template slot-scope="{ row }">
+          <span class="link">查看</span>
+          <span
+            v-show="row.teacher_id === $store.state.user.user_code"
+            class="link"
+            @click="$router.push({ path: '/exercise', query: { id: row.id } })"
+          >
+            编辑
+          </span>
+          <span class="link">复制到个人题库</span>
+        </template>
       </el-table-column>
     </template>