natasha 1 rok pred
rodič
commit
a74c41681c

+ 6 - 3
src/views/exercise_questions/create/components/common/QuestionBase.vue

@@ -8,6 +8,9 @@
         <slot name="property"></slot>
       </div>
     </div>
+    <slot name="question-footer">
+      <slot name="footer"></slot>
+    </slot>
   </div>
 </template>
 
@@ -30,14 +33,14 @@ export default {
 <style lang="scss" scoped>
 .question {
   width: 100%;
-  background-color: #fff;
-  border: $border;
-  border-radius: 0 0 8px 8px;
 
   &-container {
     display: flex;
     width: 100%;
     padding: 24px;
+    background-color: #fff;
+    border: $border;
+    border-radius: 0 0 8px 8px;
 
     .question-content {
       flex: 1;

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

@@ -50,6 +50,7 @@ import ReadAloudQuestion from './exercises/ReadAloudQuestion.vue';
 import ChineseQuestion from './exercises/ChineseQuestion.vue';
 import WriteQuestion from './exercises/WriteQuestion.vue';
 import RepeatQuestion from './exercises/RepeatQuestion.vue';
+import ReadQuestion from './exercises/ReadQuestion.vue';
 
 export default {
   name: 'CreateMain',
@@ -63,6 +64,7 @@ export default {
     ChineseQuestion,
     WriteQuestion,
     RepeatQuestion,
+    ReadQuestion,
   },
   provide() {
     return {
@@ -94,6 +96,7 @@ export default {
         chinese: ChineseQuestion,
         write: WriteQuestion,
         repeat: RepeatQuestion,
+        read: ReadQuestion,
       },
     };
   },

+ 122 - 0
src/views/exercise_questions/create/components/exercises/ReadQuestion.vue

@@ -0,0 +1,122 @@
+<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="输入题干" />
+
+        <el-input
+          v-show="data.property.is_enable_description"
+          v-model="data.description"
+          rows="3"
+          resize="none"
+          type="textarea"
+          placeholder="输入描述"
+        />
+      </div>
+
+      <div class="content">
+        <RichText v-model="data.article" placeholder="输入文章" />
+      </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 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>
+    </template>
+    <template #footer>
+      <div class="footer">
+        <span class="add-option" @click="addOption">
+          <SvgIcon icon-class="add-circle" size="14" /> <span>增加选项</span>
+        </span>
+      </div>
+    </template>
+  </QuestionBase>
+</template>
+
+<script>
+import QuestionMixin from '../common/QuestionMixin.js';
+
+import { changeOptionType } from '@/views/exercise_questions/data/common';
+import { readData } from '@/views/exercise_questions/data/read';
+
+export default {
+  name: 'ReadQuestion',
+  mixins: [QuestionMixin],
+  data() {
+    return {
+      changeOptionType,
+      data: JSON.parse(JSON.stringify(readData)),
+    };
+  },
+  methods: {
+    addOption() {
+      this.data.question_list.push('');
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.footer {
+  padding: 5px 16px;
+  margin: 16px 0;
+  text-align: center;
+  cursor: pointer;
+  background-color: #fff;
+  border-radius: 2px;
+}
+</style>

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

@@ -65,6 +65,7 @@ import MatchingPreview from '@/views/exercise_questions/preview/MatchingPreview.
 import ChinesePreview from '@/views/exercise_questions/preview/ChinesePreview.vue';
 import WritePreview from '../preview/WritePreview.vue';
 import RepeatPreview from '../preview/RepeatPreview.vue';
+import ReadPreview from '../preview/ReadPreview.vue';
 
 export default {
   name: 'CreateExercise',
@@ -76,6 +77,7 @@ export default {
     ChinesePreview,
     WritePreview,
     RepeatPreview,
+    ReadPreview,
   },
   provide() {
     return {
@@ -101,6 +103,7 @@ export default {
         chinese: ChinesePreview,
         write: WritePreview,
         repeat: RepeatPreview,
+        read: ReadPreview,
       },
     };
   },

+ 24 - 0
src/views/exercise_questions/data/read.js

@@ -0,0 +1,24 @@
+import { optionTypeList, stemTypeList, scoreTypeList, questionNumberTypeList } from './common';
+// 数据模板
+export const readData = {
+  type: 'read', // 题型
+  stem: '', // 题干
+  option_number_show_mode: optionTypeList[0].value, // 选项类型
+  description: '', // 描述
+  article: '', // 文章
+  sample_text: '', // 范文
+  answer: { select_list: [], score: 0, score_type: scoreTypeList[0].value }, // 答案
+  question_list: [], // 题目列表
+  // 题型属性
+  property: {
+    stem_type: stemTypeList[0].value, // 题干类型
+    question_number: 1, // 题号
+    is_enable_description: false, // 描述
+    score: 1, // 分值
+    score_type: scoreTypeList[0].value, // 分值类型
+  },
+  // 其他属性
+  other: {
+    question_number_type: questionNumberTypeList[0].value, // 题号类型
+  },
+};

+ 32 - 0
src/views/exercise_questions/preview/ReadPreview.vue

@@ -0,0 +1,32 @@
+<!-- eslint-disable vue/no-v-html -->
+<template>
+  <div class="read-preview">
+    <div class="stem">
+      <span class="question-number">{{ data.property.question_number }}.</span>
+      <span v-html="sanitizeHTML(data.stem)"></span>
+    </div>
+    <div v-if="data.property.is_enable_description" class="description">{{ data.description }}</div>
+  </div>
+</template>
+
+<script>
+import PreviewMixin from './components/PreviewMixin';
+
+export default {
+  name: 'ReadPreview',
+  mixins: [PreviewMixin],
+  data() {
+    return {};
+  },
+  created() {},
+  methods: {},
+};
+</script>
+
+<style lang="scss" scoped>
+@use '@/styles/mixin.scss' as *;
+
+.read-preview {
+  @include preview;
+}
+</style>

+ 1 - 2
src/views/exercise_questions/preview/WritePreview.vue

@@ -18,8 +18,7 @@ export default {
   data() {
     return {};
   },
-  created() {
-  },
+  created() {},
   methods: {},
 };
 </script>