lsc 1 yıl önce
ebeveyn
işleme
4a88d8f9c0

BIN
src/assets/icon/englishVoice/icon_check_addUser.png


BIN
src/assets/icon/englishVoice/icon_check_none.png


BIN
src/assets/icon/englishVoice/icon_check_qa.png


BIN
src/assets/icon/englishVoice/icon_check_sentence.png


BIN
src/assets/icon/englishVoice/icon_check_theme.png


BIN
src/assets/icon/englishVoice/icon_check_user.png


BIN
src/assets/icon/englishVoice/icon_check_word.png


BIN
src/assets/icon/thirdToolList/englishVoice.png


+ 202 - 0
src/components/pages/EnglishVoice/component/check.vue

@@ -0,0 +1,202 @@
+<template>
+    <div class="check_box">
+        <div class="check_div" v-for="(item, index) in checkData" :key="index">
+            <div class="check_div_title">
+                <div class="check_div_open" :class="{ active: item.open}" @click="openC(index)"></div>
+                <div class="check_div_name">{{ item.name }}</div>
+            </div>
+            <div class="check_div_children" v-show="item.open">
+                <div class="check_div_child" v-for="(item2) in item.children" :key="item2.type" @click="addCheck(item2)">
+                    <div class="check_icon">
+                        <img :src="item2.icon" alt="">
+                    </div>
+                    <div class="check_div_child_name">{{ item2.name }}</div>
+                </div>
+            </div>
+        </div>
+    </div>
+</template>
+
+<script>
+// import u_arrow from '../../../../assets/icon/new/u_arrow.png'
+import icon_check_addUser from '../../../../assets/icon/englishVoice/icon_check_addUser.png'
+import icon_check_qa from '../../../../assets/icon/englishVoice/icon_check_qa.png'
+import icon_check_sentence from '../../../../assets/icon/englishVoice/icon_check_sentence.png'
+import icon_check_theme from '../../../../assets/icon/englishVoice/icon_check_theme.png'
+import icon_check_user from '../../../../assets/icon/englishVoice/icon_check_user.png'
+import icon_check_word from '../../../../assets/icon/englishVoice/icon_check_word.png'
+import minxin from '../minxins/minxin'
+export default {
+    mixins: [minxin],
+    props: {
+        checkJson: {
+            type: Array,
+        },
+    },
+    data() {
+        return {
+            checkData:[
+                {
+                    name:'朗读',
+                    open: true,
+                    children:[
+                        {
+                            icon:icon_check_word,
+                            name:'单词/词组',
+                            type:'word'
+                        },
+                        {
+                            icon:icon_check_sentence,
+                            name:'句子/短文',
+                            type:'sentence'
+                        }
+                    ]
+                },
+                {
+                    name:'回答',
+                    open: true,
+                    children:[
+                        {
+                            icon:icon_check_qa,
+                            name:'题目',
+                            type:'QA'
+                        }
+                    ]
+                },
+                // {
+                //     name:'对话',
+                //     open: false,
+                //     children:[
+                //         {
+                //             icon:icon_check_addUser,
+                //             name:'创建角色',
+                //             type:'createRole'
+                //         }
+                //     ]
+                // },
+                // {
+                //     name:'主题陈述',
+                //     open: false,
+                //     children:[
+                //         {
+                //             icon:icon_check_theme,
+                //             name:'新建主题',
+                //             type:'theme'
+                //         }
+                //     ]
+                // }
+            ],
+            checkArray:[]
+        }
+    },
+    methods: {
+        openC(index) {
+            this.checkData[index].open = !this.checkData[index].open
+            this.$forceUpdate()
+        },
+        addCheck(item){
+            if(item.type == 'word'){
+                this.checkArray.push({
+                    type:'word',
+                    title:'',
+                    img:'',
+                    content:'单词/词组'  
+                })
+            }else if(item.type == 'sentence'){
+                this.checkArray.push({
+                    type:'sentence',
+                    title:'',
+                    img:'',
+                    content:'句子/短文'  
+                })
+            }else if(item.type == 'QA'){
+                this.checkArray.push({
+                    type:'QA',
+                    title:'',
+                    img:'',
+                    content:'题目'  
+                })
+            }
+            this.$forceUpdate()
+            this.$emit('setJson', this.checkArray)
+        }
+    },
+    watch: {
+        checkJson: {
+        handler: function (newVal, oldVal) {
+            this.checkArray = this.depthCopy(newVal);
+        },
+        deep: true,
+        },
+    },
+    mounted(){
+        this.checkArray = this.depthCopy(this.checkJson);
+    }
+}
+</script>
+
+<style scoped>
+    .check_box{
+        width: 100%;
+    }
+
+    .check_div{
+        width: 100%;
+    }
+    .check_div + .check_div{
+        margin-top: 16px;
+    }
+    .check_div_title{
+        width: 100%;
+        display: flex;
+        align-items: center;
+        margin-bottom: 8px;
+    }
+    .check_div_open{
+        width: 11px;
+        height: 11px;
+        background-image: url('../../../../assets/icon/new/u_arrow.png');
+        background-size: 100% 100%;
+        margin-right: 7px;
+        cursor: pointer;
+        transition: all 0.3s;
+        transform: rotate(-90deg);
+    }
+    .check_div_open.active{
+        transform: rotate(0deg);
+    }
+    .check_div_name{
+        font-size: 14px;
+        color: #000;
+        font-weight: bold;
+    }
+    .check_div_children{}
+    .check_div_child{
+        cursor: pointer;
+        display: flex;
+        width: 100%;
+        padding: 8px 8px;
+        box-sizing: border-box;
+        background: rgb(240, 242, 245);
+        border-radius: 4px;
+        align-items: center;
+    }
+    .check_div_child+ .check_div_child{
+        margin-top: 8px;
+    }
+    .check_icon{
+        display: flex;
+        width: 16px;
+        height: 16px;
+        align-items: center;
+        justify-content: center;
+        margin-right: 5px;
+    }
+
+    .check_icon > img{
+        width: 100%;
+        height: 100%;
+        object-fit: contain;
+    }
+    .check_div_child_name{}
+</style>

+ 82 - 0
src/components/pages/EnglishVoice/component/order.vue

@@ -0,0 +1,82 @@
+<template>
+  <div class="o_box">
+    <div class="o_none_box" v-if="!checkArray.length">
+      <img src="../../../../assets/icon/englishVoice/icon_check_none.png" alt="">
+      <span>暂无内容,请添加题目</span>
+    </div>
+    <div class="o_check_box" v-else>
+      <div class="o_child" v-for="(item, index) in checkArray" :key="index">
+        <div class="o_child_title">
+          <span class="drag"></span>
+          <span class="title">{{item.content}}</span>
+          <div class="edit_btn">
+            <span class="edit"></span>
+            <span class="delete"></span>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import minxin from '../minxins/minxin'
+export default {
+  mixins: [minxin],
+  props: {
+    checkJson: {
+      type: Array,
+    },
+    editType:{
+      type: Number,
+      default: 1
+    }
+  },
+  data() {
+    return {
+      checkArray: []
+    }
+  },
+  watch: {
+    checkJson: {
+      handler: function (newVal, oldVal) {
+        this.checkArray = this.depthCopy(newVal);
+      },
+      deep: true,
+    },
+  },
+  mounted(){
+    this.checkArray = this.depthCopy(this.checkJson);
+  }
+}
+</script>
+
+<style scoped>
+.o_box {
+  width: 100%;
+  height: auto;
+}
+
+.o_none_box{
+  width: 100%;
+  height: 500px;
+  background: #fff;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  flex-direction: column;
+}
+
+.o_none_box > img{
+  width: 120px;
+  height: 120px;
+  object-fit: contain;
+}
+
+.o_none_box > span{
+  font-size: 12px;
+  color: #00000066;
+  margin-top: 15px;
+}
+
+</style>

+ 241 - 0
src/components/pages/EnglishVoice/index.vue

@@ -0,0 +1,241 @@
+<template>
+      <el-dialog title="英语口语" :visible.sync="EnglishVoiceDialog" :append-to-body="true" width="100%"
+        :before-close="handleClose" class="dialog_diy">
+        <div class="ev_box">
+            <div class="ev_info_box">
+                <div class="title">设置英语口语信息</div>
+                <div class="ev_info_input_box">
+                    <div class="box"> 
+                        <span class="title bi">标题</span>
+                        <el-input v-model="title" placeholder="请输入标题" class="input"/>
+                    </div>
+                    <div class="box"> 
+                        <span class="title">说明</span>
+                        <el-input v-model="detail" placeholder="请输入对该问题的描述" class="input"/>
+                    </div>
+                </div>
+            </div>
+            <div class="ev_info_box">
+                <div class="title">设置英语口语题目</div>
+                <div class="ev_create_box">
+                    <div class="left">
+                        <div class="title">题目类型选择</div>
+                        <check :checkJson="checkJson" @setJson="setJson"></check>
+                    </div>
+                    <div class="center">
+                        <div class="title">评测题目</div>
+                        <order :checkJson="checkJson" @setJson="setJson" :editType="2"></order>
+                    </div>
+                    <div class="right">
+                        <div class="title">评测大纲</div>
+                        <order :checkJson="checkJson" @setJson="setJson" :editType="1"></order>
+                    </div>
+                </div>
+            </div>
+        </div>
+        <span slot="footer" class="dialog-footer">
+            <el-button type="primary" @click="confirm()">确 认</el-button>
+            <el-button @click="close()">关 闭</el-button>
+        </span>
+    </el-dialog>
+</template>
+
+<script>
+import order from './component/order'
+import check from './component/check'
+export default {
+    components: {
+        check,
+        order
+    },
+    props: {
+        EnglishVoiceDialog: {
+            type: Boolean,
+            default: false
+        },
+        oid: {
+            type: String
+        }
+    },
+    data() {
+        return {
+            checkJson: [],
+            title:'',
+            detail:'',
+        }
+    },
+    methods: {
+        handleClose(done) {
+            this.close();
+            done();
+        },
+        close() {
+            this.$emit("update:EnglishVoiceDialog", false);
+        },
+        confirm() {
+            this.close();
+        },
+        setJson(val){
+            debugger
+            this.checkJson = val;
+            this.$forceUpdate()
+        }
+    },
+}
+</script>
+
+<style scoped>
+.dialog_diy>>>.el-dialog {
+    height: 100%;
+    margin: 0vh auto !important;
+}
+
+.dialog_diy>>>.el-dialog__header {
+    background: #454545 !important;
+    padding: 15px 20px;
+}
+
+.dialog_diy>>>.el-dialog__body {
+    height: calc(100% - 124px);
+    box-sizing: border-box;
+    padding: 0px;
+}
+
+.dialog_diy>>>.el-dialog__title {
+    color: #fff;
+}
+
+.dialog_diy>>>.el-dialog__headerbtn {
+    top: 19px;
+}
+
+.dialog_diy>>>.el-dialog__headerbtn .el-dialog__close {
+    color: #fff;
+}
+
+.dialog_diy>>>.el-dialog__headerbtn .el-dialog__close:hover {
+    color: #fff;
+}
+
+.dialog_diy>>>.el-dialog__body,
+.dialog_diy>>>.el-dialog__footer {
+    background: rgb(rgb(240, 242, 245));
+    overflow: hidden;
+}
+
+.ev_box{
+    width: calc(100% - 20px);
+    height: calc(100% - 20px);
+    overflow: auto;
+    background: #fff;
+    margin: 10px auto;
+    border-radius: 5px;
+}
+
+.ev_info_box{
+    
+}
+.ev_info_box + .ev_info_box{
+    margin-top: 14px;
+}
+.ev_info_box > .title {
+    padding: 15px 0 15px 0;
+    font-size: 16px;
+    font-weight: bold;
+    margin: 0 0 0 20px;
+    box-sizing: border-box;
+    display: flex;
+    align-items: center;
+    line-height: 20px;
+    color: #000;
+}
+
+.ev_info_box > .title::before {
+    content: '';
+    display: block;
+    width: 3px;
+    height: 20px;
+    background: #0061FF;
+    border-radius: 3px;
+    margin: 0 5px 0 0;
+}
+
+.ev_info_input_box{
+    width: 100%;
+    box-sizing: border-box;
+    padding: 0 20px;
+}
+.ev_info_input_box > .box{
+    display: flex;
+    align-items: center;
+}
+.ev_info_input_box > .box + .box{
+    margin-top: 12px;
+}
+.ev_info_input_box > .box > .title{
+    min-width: fit-content;
+    font-size: 14px;
+    margin:0 10px;
+    position: relative;
+}
+.ev_info_input_box > .box > .title.bi::before{
+    content: '*';
+    color: rgb(238, 62, 62);
+    display: block;
+    font-size: 18px;
+    position: absolute;
+    left: -10px;
+}
+.ev_info_input_box > .box > .input{
+    width: 100%;
+    max-width: 750px;
+}
+
+.ev_create_box{
+    width: 100%;
+    width: calc(100% - 40px);
+    border-radius: 5px;
+    border: 1px solid #E7E7E7;
+    margin: 0 auto 10px;
+    display: flex;
+    justify-content: space-between;
+    min-height: 500px;
+}
+.ev_create_box > .left{
+    width: 250px;
+    border-right: 1px solid #e7e7e7;
+    box-sizing: border-box;
+    padding: 0 16px;
+}
+.ev_create_box > .center{
+    width: calc(100% - 500px);
+}
+.ev_create_box > .right{
+    width: 250px;
+    border-left: 1px solid #e7e7e7;
+    box-sizing: border-box;
+    padding: 0 16px;
+}
+
+.ev_create_box > .left > .title{
+    font-size: 16px;
+    font-weight: 700;
+    color: #000;
+    text-align: center;
+    margin: 20px 0;
+}
+.ev_create_box > .center > .title{
+    font-size: 24px;
+    font-weight: 700;
+    color: #000;
+    text-align: center;
+    margin: 16px 0;
+}
+.ev_create_box > .right > .title{
+    font-size: 16px;
+    font-weight: 700;
+    color: #000;
+    text-align: center;
+    margin: 20px 0;
+}
+</style>

+ 23 - 0
src/components/pages/EnglishVoice/minxins/minxin.js

@@ -0,0 +1,23 @@
+const minxin = {
+  data() {
+    return {
+      options2: {
+        word:"单词/词组",
+        sentence:"句子/短文",
+        QA:"题目",
+        createRole:"创建角色",
+        theme:"新建主题",
+      },
+    };
+  },
+  computed: {},
+  mounted() {},
+  activated() {},
+  methods: {
+    depthCopy(s) {
+      return s ? JSON.parse(JSON.stringify(s)) : '';
+    }
+  }
+};
+
+export default minxin;

+ 27 - 1
src/components/pages/addCourse.vue

@@ -2085,6 +2085,16 @@
                                       </div>
                                     </div> -->
                                   </div>
+                                  <div class="tool" :class="{ isToolChoose: itemTool.tool.indexOf(70) != -1 }"
+                                    @click="addTools(70, itemTaskIndex, toolIndex)">
+                                    <div class="whiteBIcon" @click.stop="openTools(itemTaskIndex, 70, toolIndex)">
+                                      <img src="../../assets/icon/thirdToolList/englishVoice.png" alt />
+                                      <div style="margin: 5px 0">英语口语</div>
+                                    </div>
+                                    <div class="noCTool"><img src="../../assets/icon/new/isToolC.png" alt="" /></div>
+                                    <div class="isCTool" v-if="itemTool.tool.indexOf(70) != -1"><img
+                                        src="../../assets/icon/new/isToolC.png" alt="" /></div>
+                                  </div>
                                   <!-- <div class="tool">
                                   <div class="whiteBIcon" @click="addTools(28, itemTaskIndex, toolIndex)">
                                     <img src="../../assets/icon/secondToolList/translation.png" alt />
@@ -3898,6 +3908,7 @@
       </span>
     </el-dialog>
     <evaBox :oid='oid' :org="org" :dialogVisibleEva.sync="evaBoxDialog" @updateEvaJson="updateEvaJson"></evaBox>
+    <EnglishVoice :oid='oid' :org="org" :EnglishVoiceDialog.sync="EnglishVoiceDialog"></EnglishVoice>
 </div>
 </template>
 
@@ -3917,6 +3928,7 @@ import sourceDialog from "./teacherSource/dialog.vue";
 import interVideo from "./interVideo/index.vue";
 import englishRight from "./components/englishRight.vue";
 import evaBox from './evaBox/index.vue'
+import EnglishVoice from './EnglishVoice/index.vue'
 
 export default {
   components: {
@@ -3929,7 +3941,8 @@ export default {
     sourceDialog,
     interVideo,
     englishRight,
-    evaBox
+    evaBox,
+    EnglishVoice
   },
   data() {
     return {
@@ -4200,6 +4213,7 @@ export default {
         evaIndex: '',
         evatIndex: '',
         evaBoxDialog: false,
+        EnglishVoiceDialog: false,
     };
   },
   directives: {
@@ -7685,6 +7699,9 @@ export default {
           : {  };
         this.$forceUpdate();
         this.englishDialogVisible = true;
+      }else if(i == 70){
+        this.$forceUpdate();
+        this.EnglishVoiceDialog = true;
       }
     },
     chapAddTools(i) {
@@ -7808,6 +7825,15 @@ export default {
           return;
         }
       }
+      if(i == 70){
+        // if (
+        //   !this.unitJson[this.unitIndex].chapterInfo[0].taskJson[itemTaskIndex]
+        //     .toolChoose[toolIndex].englishList
+        // ) {
+          this.openTools(itemTaskIndex, 70, toolIndex);
+          return;
+        // }
+      }
       // if (i == 48) {
       //   if (
       //     !this.unitJson[this.unitIndex].chapterInfo[0].taskJson[itemTaskIndex]

+ 1 - 0
src/components/pages/dataBoardNew/school/teacherInfo/index.vue

@@ -24,6 +24,7 @@ export default {
             option: {
                 tooltip: {
                     position: 'top',
+                    // confine: true,
                     formatter: function (params) {
                         // console.log(params);
                         return params.marker + params.name + ' ' + params.data[2];//params.seriesName + '<br>' + params.