Explorar el Código

增加填空题和朗读题编辑

dusenyao hace 1 año
padre
commit
a79eb04f79

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

@@ -45,6 +45,8 @@ import SelectQuestionType from './common/SelectQuestionType.vue';
 import SelectQuestion from './exercises/SelectQuestion.vue';
 import JudgeQuestion from './exercises/JudgeQuestion.vue';
 import MatchingQuestion from './exercises/MatchingQuestion.vue';
+import FillQuestion from './exercises/FillQuestion.vue';
+import ReadAloudQuestion from './exercises/ReadAloudQuestion.vue';
 
 export default {
   name: 'CreateMain',
@@ -53,6 +55,8 @@ export default {
     JudgeQuestion,
     SelectQuestionType,
     MatchingQuestion,
+    FillQuestion,
+    ReadAloudQuestion,
   },
   provide() {
     return {
@@ -79,6 +83,8 @@ export default {
         select: SelectQuestion,
         judge: JudgeQuestion,
         matching: MatchingQuestion,
+        fill: FillQuestion,
+        read_aloud: ReadAloudQuestion,
       },
     };
   },

+ 142 - 0
src/views/exercise_questions/create/components/exercises/FillQuestion.vue

@@ -0,0 +1,142 @@
+<template>
+  <QuestionBase>
+    <template #content>
+      <div class="stem">
+        <el-input
+          v-if="data.property.stem_type === stemTypeList[0].value"
+          v-model="data.stem"
+          rows="3"
+          resize="none"
+          type="textarea"
+          placeholder="输入题干"
+        />
+
+        <RichText v-if="data.property.stem_type === stemTypeList[1].value" v-model="data.stem" placeholder="输入题干" />
+
+        <UploadAudio
+          v-show="data.property.is_enable_listening"
+          :file-id="data.file_id_list?.[0]"
+          @upload="upload"
+          @deleteFile="deleteFile"
+        />
+
+        <el-input
+          v-show="data.property.is_enable_description"
+          v-model="data.description"
+          rows="3"
+          resize="none"
+          type="textarea"
+          placeholder="输入描述"
+        />
+      </div>
+
+      <div class="content">
+        <el-input v-model="data.model_essay" type="textarea" placeholder="请输入" rows="5" />
+        <el-button @click="identifyText">识别</el-button>
+      </div>
+    </template>
+
+    <template #property>
+      <el-form :model="data.property">
+        <el-form-item label="题干">
+          <el-radio
+            v-for="{ value, label } in stemTypeList"
+            :key="value"
+            v-model="data.property.stem_type"
+            :label="value"
+          >
+            {{ label }}
+          </el-radio>
+        </el-form-item>
+        <el-form-item label="题号">
+          <el-input v-model="data.property.question_number" />
+        </el-form-item>
+        <el-form-item label-width="45px">
+          <el-radio
+            v-for="{ value, label } in questionNumberTypeList"
+            :key="value"
+            v-model="data.other.question_number_type"
+            :label="value"
+          >
+            {{ label }}
+          </el-radio>
+        </el-form-item>
+        <el-form-item label="描述">
+          <el-radio
+            v-for="{ value, label } in switchOption"
+            :key="value"
+            v-model="data.property.is_enable_description"
+            :label="value"
+          >
+            {{ label }}
+          </el-radio>
+        </el-form-item>
+        <el-form-item label="听力">
+          <el-radio
+            v-for="{ value, label } in switchOption"
+            :key="value"
+            v-model="data.property.is_enable_listening"
+            :label="value"
+          >
+            {{ label }}
+          </el-radio>
+        </el-form-item>
+        <el-form-item label="分值">
+          <el-radio
+            v-for="{ value, label } in scoreTypeList"
+            :key="value"
+            v-model="data.property.score_type"
+            :label="value"
+          >
+            {{ label }}
+          </el-radio>
+        </el-form-item>
+        <el-form-item label-width="45px">
+          <el-input v-model="data.property.score" type="number" />
+        </el-form-item>
+        <el-form-item label="语音作答">
+          <el-radio
+            v-for="{ value, label } in switchOption"
+            :key="value"
+            v-model="data.property.is_enable_voice_answer"
+            :label="value"
+          >
+            {{ label }}
+          </el-radio>
+        </el-form-item>
+      </el-form>
+    </template>
+  </QuestionBase>
+</template>
+
+<script>
+import UploadAudio from '../common/UploadAudio.vue';
+import QuestionMixin from '../common/QuestionMixin.js';
+
+import { fillData } from '@/views/exercise_questions/data/fill';
+
+export default {
+  name: 'FillQuestion',
+  components: {
+    UploadAudio,
+  },
+  mixins: [QuestionMixin],
+  data() {
+    return {
+      data: JSON.parse(JSON.stringify(fillData)),
+    };
+  },
+  methods: {
+    // 识别文本
+    identifyText() {},
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.content {
+  .el-textarea + .el-button {
+    margin-top: 8px;
+  }
+}
+</style>

+ 37 - 0
src/views/exercise_questions/create/components/exercises/ReadAloudQuestion.vue

@@ -0,0 +1,37 @@
+<template>
+  <QuestionBase>
+    <template #content>
+      <el-input
+        v-if="data.property.stem_type === stemTypeList[0].value"
+        v-model="data.stem"
+        rows="3"
+        resize="none"
+        type="textarea"
+        placeholder="输入题干"
+      />
+
+      <RichText v-if="data.property.stem_type === stemTypeList[1].value" v-model="data.stem" placeholder="输入题干" />
+    </template>
+
+    <template #property></template>
+  </QuestionBase>
+</template>
+
+<script>
+import QuestionMixin from '../common/QuestionMixin.js';
+
+import { readAloudData } from '@/views/exercise_questions/data/readAloud';
+
+export default {
+  name: 'ReadAloudQuestion',
+  mixins: [QuestionMixin],
+  data() {
+    return {
+      data: JSON.parse(JSON.stringify(readAloudData)),
+    };
+  },
+  methods: {},
+};
+</script>
+
+<style lang="scss" scoped></style>

+ 26 - 0
src/views/exercise_questions/data/fill.js

@@ -0,0 +1,26 @@
+import { stemTypeList, questionNumberTypeList, scoreTypeList } from './common';
+
+// 填空题数据模板
+export const fillData = {
+  type: 'fill', // 题型
+  stem: '', // 题干
+  file_id_list: [], // 文件 id 列表
+  description: '', // 描述
+  model_essay: '', // 范文
+  fill_blank: [], // 填空
+  answer: { score: 0, score_type: scoreTypeList[0].value }, // 答案
+  // 题型属性
+  property: {
+    stem_type: stemTypeList[0].value, // 题干类型
+    question_number: 1, // 题号
+    is_enable_listening: true, // 是否听力
+    is_enable_description: false, // 描述
+    is_enable_voice_answer: false, // 语音作答
+    score: 1, // 分值
+    score_type: scoreTypeList[0].value, // 分值类型
+  },
+  // 其他属性
+  other: {
+    question_number_type: questionNumberTypeList[0].value, // 题号类型
+  },
+};

+ 19 - 0
src/views/exercise_questions/data/readAloud.js

@@ -0,0 +1,19 @@
+import { stemTypeList, questionNumberTypeList, scoreTypeList } from './common';
+
+export const readAloudData = {
+  type: 'fill', // 题型
+  stem: '', // 题干
+  answer: { score: 0, score_type: scoreTypeList[0].value, reference_answer: '' }, // 答案
+  // 题型属性
+  property: {
+    stem_type: stemTypeList[0].value, // 题干类型
+    question_number: 1, // 题号
+    is_enable_reference_answer: true, // 参考答案
+    score: 1, // 分值
+    score_type: scoreTypeList[0].value, // 分值类型
+  },
+  // 其他属性
+  other: {
+    question_number_type: questionNumberTypeList[0].value, // 题号类型
+  },
+};

+ 8 - 27
src/views/home/personal_question/components/ExerciseLink.vue

@@ -1,29 +1,16 @@
 <!-- 练习题链接 -->
 <template>
-  <el-dialog
-    :visible="visible"
-    title="练习题链接"
-    :width="shareData.type === 1 ? '400px' : '600px'"
-    :close-on-click-modal="false"
-    @close="dialogClose"
-  >
-    <div v-if="shareData.type === 2" class="exercise-link" :title="shareData.share_url">
-      <div>{{ $store.state.user.user_real_name }}邀请您完成练习题!</div>
-      <div>链接:{{ shareData.share_url }}</div>
-      <br />
-      <div>复制此链接到浏览器打开</div>
-    </div>
-
-    <div v-if="shareData.type === 1" class="qr-code">
+  <el-dialog :visible="visible" title="练习题链接" width="400px" :close-on-click-modal="false" @close="dialogClose">
+    <div class="exercise-link" :title="shareData.share_url">
       <span>{{ $store.state.user.user_real_name }}邀请您完成练习题!</span>
       <span>请扫描二维码</span>
       <img :src="QRCodeImg" alt="二维码" />
+      <span>链接:{{ shareData.share_url }}</span>
     </div>
 
     <div slot="footer" class="footer">
-      <el-button @click="dialogClose">取消</el-button>
-      <el-button v-show="shareData.type === 1" type="primary" @click="downloadQRCode">下载二维码</el-button>
-      <el-button v-show="shareData.type === 2" type="primary" @click="writeClipboard">复制</el-button>
+      <el-button @click="writeClipboard">复制链接</el-button>
+      <el-button type="primary" @click="downloadQRCode">下载二维码</el-button>
     </div>
   </el-dialog>
 </template>
@@ -46,9 +33,6 @@ export default {
       }),
     },
   },
-  data() {
-    return {};
-  },
   computed: {
     // 二维码图片地址
     QRCodeImg() {
@@ -94,17 +78,14 @@ export default {
   }
 
   :deep &__body {
-    padding: 40px 24px;
+    padding: 24px 24px 0;
 
     .exercise-link {
-      font-size: 16px;
-      color: #000;
-    }
-
-    .qr-code {
       display: flex;
       flex-direction: column;
       align-items: center;
+      font-size: 16px;
+      color: #000;
 
       img {
         width: 200px;

+ 3 - 4
src/views/home/personal_question/components/ShareDialog.vue

@@ -78,8 +78,7 @@
         <el-button type="primary" @click="send">发送</el-button>
       </template>
       <template v-if="send_type === sendModes[1].type">
-        <el-button @click="generateLink(1)">生成二维码</el-button>
-        <el-button type="primary" @click="generateLink(2)">生成链接</el-button>
+        <el-button type="primary" @click="generateLink">生成链接和二维码</el-button>
       </template>
     </div>
   </el-dialog>
@@ -141,7 +140,7 @@ export default {
       const date = new Date();
       return `${date.getFullYear()}-${date.getMonth() + 1}-${date.getDate()}`;
     },
-    generateLink(type) {
+    generateLink() {
       CreateShareRecord({
         exercise_id: this.exerciseId,
         begin_date: this.begin_date,
@@ -153,7 +152,7 @@ export default {
         max_person_count: this.max_person_count,
         memo: this.memo,
       }).then(({ status, ...data }) => {
-        this.$emit('generateLink', { ...data, type });
+        this.$emit('generateLink', { ...data });
       });
     },
     send() {},