Browse Source

新版字词卡片

natasha 1 năm trước cách đây
mục cha
commit
edd2c43a12

+ 2 - 2
src/views/wordcard/AudioPlay.vue

@@ -1,6 +1,6 @@
 <template>
-  <div class="audio-wrapper">
-    <span :class="[url ? 'audio-play' : 'audio-play not-url']" @click="playAudio">
+  <div class="audio-wrapper" @click="playAudio">
+    <span :class="[url ? 'audio-play' : 'audio-play not-url']">
       <img
         :src="
           audio.paused

+ 9 - 3
src/views/wordcard/UploadDrag.vue

@@ -98,10 +98,10 @@ export default {
 </script>
 <style lang="scss" scoped>
 .upload-wrapper {
-  min-height: 224px;
-  background-color: #f5f5f5;
+  height: 536px;
+  background-color: #f2f3f5;
   .plus-icon {
-    margin: 50px auto 20px auto;
+    margin: 200px auto 20px auto;
     color: #4e5969;
   }
   .cn-tips {
@@ -116,17 +116,23 @@ export default {
     line-height: 20px;
     color: #86909c;
   }
+
+  .el-image {
+    background: #f2f3f5;
+  }
 }
 </style>
 <style lang="scss">
 .upload-wrapper-drag {
   .el-upload {
     width: 100%;
+    height: 536px;
   }
   .el-upload-dragger {
     border: none;
     background-color: transparent;
     width: 100%;
+    height: 100%;
   }
 }
 </style>

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 79 - 907
src/views/wordcard/cread.vue


+ 4 - 4
src/views/wordcard/table.vue

@@ -15,7 +15,7 @@
           <div>
             <div class="number"></div>
             <div class="dv dv1" style="font-weight: 500">名称</div>
-            <div class="dv dvs" style="font-weight: 500">卡片类型</div>
+            <!-- <div class="dv dvs" style="font-weight: 500">卡片类型</div> -->
             <div class="dv" style="font-weight: 500">创建内容</div>
             <div class="dv dv2" style="font-weight: 500">创建日期</div>
           </div>
@@ -24,9 +24,9 @@
             <div class="dv dv1" @click="editName(item)">
               {{ item.name }}
             </div>
-            <div class="dv dvs">
+            <!-- <div class="dv dvs">
               {{ item.type == 'WORD' ? '字词卡' : '书写卡' }}
-            </div>
+            </div> -->
             <div class="dv">{{ item.text }}</div>
             <div class="dv dv2">{{ item.create_time }}</div>
             <span
@@ -300,7 +300,7 @@ export default {
         }
         .dv {
           margin-left: 24px;
-          width: 400px;
+          width: 550px;
           overflow: hidden;
           white-space: nowrap;
           text-overflow: ellipsis;

+ 629 - 0
src/views/wordcard/writeTableNew.vue

@@ -0,0 +1,629 @@
+<template>
+  <div :class="['writeTable']" v-if="data">
+    <div class="writeTop">
+      <template v-if="editCardflag">
+        <div class="left">
+          <UploadDrag
+            :fileList="data.left.fileList"
+            @changeFillId="changeFillId"
+            v-if="data.left.fileList.length === 0"
+            :disabled="is_preview"
+          ></UploadDrag>
+          <div class="item-image" v-else>
+            <el-image
+              style="width: 536px; height: 536px"
+              :src="data.left.fileList[0].fileUrl"
+              :preview-src-list="[data.left.fileList[0].fileUrl]"
+              fit="contain"
+            />
+            <span v-if="!is_preview" class="item-image-del" @click="handleDeleteImg"
+              ><i class="el-icon-delete"></i
+            ></span>
+          </div>
+          <el-input class="item-con" v-model="data.left.con" placeholder="输入" @blur="handleBlurCon"></el-input>
+          <a class="del-btn" @click="handleDelItem"><i class="el-icon-delete"></i></a>
+        </div>
+        <div class="right">
+          <label>释义</label>
+          <el-input type="textarea" :rows="6" v-model="data.right.definition" placeholder="请输入"></el-input>
+          <label>搭配</label>
+          <el-input type="textarea" :rows="6" v-model="data.right.collocation" placeholder="请输入"></el-input>
+          <label>例句</label>
+          <el-input type="textarea" :rows="6" v-model="data.right.exampleSent" placeholder="请输入"></el-input>
+        </div>
+      </template>
+      <template v-else>
+        <div class="left" :class="[data.left.fileList.length === 0 ? 'left-big' : '']">
+          <div class="item-image" v-if="data.left.fileList.length > 0">
+            <el-image
+              style="width: 536px; height: 536px"
+              :src="data.left.fileList[0].fileUrl"
+              :preview-src-list="[data.left.fileList[0].fileUrl]"
+              fit="contain"
+            />
+          </div>
+          <h2 :class="['con-preview', data.left.fileList.length === 0 ? 'con-preview-big' : '']">
+            {{ data.left.con }}
+          </h2>
+        </div>
+        <div class="right right-preview">
+          <div class="hz-box">
+            <div class="hz-item" v-for="(itemh, indexh) in data.right.hz_info" :key="indexh">
+              <p>{{ data.right.pinyin[indexh] ? data.right.pinyin[indexh] : '' }}</p>
+              <Strockplay
+                className="adult-strockplay"
+                :Book_text="itemh.con"
+                :playStorkes="true"
+                :strokePlayColor="'#D65353'"
+                :strokeColor="'#000000'"
+                :palyWidth="'18px'"
+                :BoxbgType="'0'"
+                :curItem="itemh.hzDetail.hz_json"
+                :targetDiv="'writeTops-item-' + pageNumber + '-' + indexh + '-' + itemh.con"
+                :class="[indexh !== 0 ? 'writeTop-item-noLeft' : '']"
+                class="writeTop-item"
+              />
+            </div>
+          </div>
+          <AudioPlay :file-id="data.right.audio_file" v-if="data.right.audio_file" />
+          <div class="definition-box">
+            <div v-if="data.right.definition">
+              <label>释义:</label>
+              <p>{{ data.right.definition }}</p>
+            </div>
+            <div v-if="data.right.collocation">
+              <label>搭配:</label>
+              <p>{{ data.right.collocation }}</p>
+            </div>
+            <div v-if="data.right.exampleSent">
+              <label>例句:</label>
+              <p>{{ data.right.exampleSent }}</p>
+            </div>
+          </div>
+        </div>
+      </template>
+    </div>
+  </div>
+</template>
+
+<script>
+//这里可以导入其它文件(比如:组件,工具js,第三方插件js,json文件,图片文件等等)
+import StrockplayredlineTable from '../../components/corpus/StrockplayredlineTable.vue';
+import Strockplay from '../../components/corpus/Strockplay.vue';
+import Strockred from '../../components/corpus/Strockred.vue';
+import FreewriteLettle from '../../components/corpus/FreewriteLettle.vue';
+import UploadDrag from './UploadDrag.vue';
+import AudioPlay from './AudioPlay.vue';
+const HanziWriter = require('hanzi-writer');
+import { getLogin, getHZChineseInfo } from '@/api/api';
+
+export default {
+  //import引入的组件需要注入到对象中才能使用
+  components: {
+    StrockplayredlineTable,
+    Strockplay,
+    Strockred,
+    FreewriteLettle,
+    UploadDrag,
+    AudioPlay,
+  },
+  props: ['dataConfig', 'data', 'pageNumber', 'totalNumber', 'editCardflag', 'none', 'is_preview', 'infoObj'],
+  data() {
+    //这里存放数据
+    return {
+      ifFreeShow: false,
+      activeIndex: null,
+      activeColIndex: null,
+      fileList: [],
+      info: {
+        definition: '',
+        collocation: '',
+        exampleSent: '',
+      },
+      writer: null,
+      audio_file: '',
+      loading: false,
+    };
+  },
+  //计算属性 类似于data概念
+  computed: {},
+  //监控data中数据变化
+  watch: {
+    pageNumber: {
+      handler: function (val, oldVal) {
+        if (val != oldVal) {
+          this.initHanziwrite();
+        }
+      },
+      deep: true,
+    },
+  },
+  //方法集合
+  methods: {
+    changePraShow() {
+      this.ifFreeShow = false;
+    },
+    closeifFreeShow(data, rowIndex, colIndex) {
+      this.ifFreeShow = false;
+      this.$forceUpdate();
+    },
+    freeWrite(item, row, col) {
+      this.ifFreeShow = true;
+      this.activeIndex = row;
+      this.activeColIndex = col;
+      //   this.currentHz = this.curQue.option[indexs].rightOption[rightindex].con;
+      if (item) {
+        this.currenHzData = item;
+      } else {
+        this.currenHzData = {};
+      }
+    },
+    ExerciseChangeCurQue(answer, rowIndex, colIndex) {
+      if (answer) {
+        this.data.list[rowIndex][colIndex].strokes_image_url = answer.strokes_image_url;
+        this.data.list[rowIndex][colIndex].history = answer.history;
+        this.$forceUpdate();
+      }
+    },
+    changeFillId(file, fileList) {
+      let obj = {
+        name: file.name,
+        fileId: file.file_id,
+        fileUrl: file.file_url_open,
+      };
+      this.data.left.fileList.push(obj);
+    },
+    handleDeleteImg() {
+      this.data.left.fileList = [];
+    },
+    initHanziwrite() {
+      if (this.data.left.con.trim()) {
+        this.loading = true;
+        let MethodName = 'tool-TextToVoiceFile';
+        let datas = {
+          text: this.data.left.con.trim(),
+        };
+        getLogin(MethodName, datas)
+          .then((res) => {
+            this.loading = false;
+            if (res.status === 1) {
+              this.data.right.audio_file = res.file_id;
+            }
+          })
+          .catch(() => {
+            this.loading = false;
+          });
+      }
+    },
+    handleDelItem() {
+      this.$emit('handleDelItem', this.pageNumber - 1);
+    },
+    // 获取数据
+    handleBlurCon() {
+      this.loading = true;
+      let con = this.data.left.con.trim();
+      let MethodName = 'hz_resource_manager-GetMultHZStrokesContent';
+      let data = {
+        hz_str: con,
+      };
+      getLogin(MethodName, data)
+        .then((res) => {
+          this.loading = false;
+          for (let key in res) {
+            if (key != 'status' && key != ',' && res[key]) {
+              res[key] = JSON.parse(res[key]);
+            }
+          }
+          let hzDetailList = res;
+          let hz_list = [];
+          con.split('').forEach((items) => {
+            let res = JSON.parse(JSON.stringify(hzDetailList[items]));
+            let obj = {
+              con: items,
+              hzDetail: {
+                hz_json: res,
+              },
+            };
+            hz_list.push(obj);
+          });
+          this.data.right.hz_info = hz_list;
+          this.data.right.pinyin = cnchar.spell(con, 'array', 'low', 'tone');
+          let MethodName = 'tool-TextToVoiceFile';
+          let datas = {
+            text: con,
+          };
+          getLogin(MethodName, datas).then((res) => {
+            if (res.status === 1) {
+              this.data.right.audio_file = res.file_id;
+            }
+          });
+          console.log(this.data);
+        })
+        .catch(() => {
+          this.loading = false;
+        });
+    },
+  },
+  //生命周期 - 创建完成(可以访问当前this实例)
+  created() {
+    this.initHanziwrite();
+  },
+  //生命周期 - 挂载完成(可以访问DOM元素)
+  mounted() {
+    // let _this = this;
+    // _this.$nextTick(() => {
+    //   if (_this.data.hz_info && _this.data.hz_info.length === 1) {
+    //     _this.initHanziwrite();
+    //   }
+    // });
+  },
+  //生命周期-创建之前
+  beforeCreated() {},
+  //生命周期-挂载之前
+  beforeMount() {},
+  //生命周期-更新之前
+  beforUpdate() {},
+  //生命周期-更新之后
+  updated() {},
+  //生命周期-销毁之前
+  beforeDestory() {},
+  //生命周期-销毁完成
+  destoryed() {},
+  //如果页面有keep-alive缓存功能,这个函数会触发
+  activated() {},
+};
+</script>
+<style lang="scss" scoped>
+.writeTable {
+  width: 1208px;
+  margin: 0 auto 8px auto;
+  // height: 842px;
+
+  box-sizing: border-box;
+  .writeTop {
+    height: 800px;
+    display: flex;
+    column-gap: 8px;
+    .left,
+    .right {
+      width: 600px;
+      height: 100%;
+      padding: 32px;
+      border-radius: 24px;
+      background: #fff;
+      box-sizing: border-box;
+      position: relative;
+    }
+    .left-big {
+      display: flex;
+      align-items: center;
+      justify-content: center;
+    }
+    .del-btn {
+      cursor: pointer;
+      border-radius: 8px;
+      background: #f56767;
+      padding: 8px;
+      position: absolute;
+      right: 24px;
+      bottom: 24px;
+      color: #fff;
+    }
+    .right {
+      display: flex;
+      align-items: center;
+      flex-flow: wrap;
+      padding: 120px 86px;
+      row-gap: 8px;
+      label {
+        width: 100%;
+        color: #4e5969;
+        font-size: 14px;
+        font-weight: 400;
+        line-height: 22px;
+        height: 22px;
+      }
+      :deep .el-textarea {
+        height: 140px;
+      }
+    }
+    .right-preview {
+      padding: 72px;
+      display: block;
+      .hz-box {
+        justify-content: center;
+        width: 100%;
+        .hz-item {
+          text-align: center;
+          :deep .strockplayInner {
+            width: 98px;
+            height: 98px;
+          }
+          p {
+            color: #de4444;
+            font-feature-settings: 'cv01' on;
+            font-family: League;
+            font-size: 20px;
+            line-height: 120%;
+            margin-bottom: 8px;
+          }
+        }
+      }
+      :deep .audio-wrapper {
+        margin: 24px auto;
+        border-radius: 40px;
+        background: #f3f3f3;
+        padding: 16px;
+        width: 56px;
+        height: 56px;
+        box-sizing: border-box;
+        cursor: pointer;
+        .voice-play {
+          width: 24px;
+          height: 24pxs;
+        }
+      }
+      .definition-box {
+        white-space: pre;
+        > div {
+          display: flex;
+          margin-bottom: 16px;
+          label,
+          p {
+            width: 40px;
+            color: #000;
+            font-size: 24px;
+            font-weight: 400;
+            line-height: 150%;
+          }
+          label {
+            width: 68px;
+          }
+        }
+      }
+    }
+    .item-image {
+      position: relative;
+      background: #f2f3f5;
+      border-radius: 8px;
+      overflow: hidden;
+      .item-image-del {
+        position: absolute;
+        top: 8px;
+        right: 8px;
+        width: 16px;
+        height: 16px;
+        display: block;
+        cursor: pointer;
+        background-color: #ffffff;
+        color: #ee3232;
+        padding: 8px;
+        border-radius: 50%;
+        box-shadow: 0px 4px 4px 0px rgba(0, 0, 0, 0.25);
+      }
+    }
+    .item-con {
+      margin-top: 74px;
+      :deep .el-input__inner {
+        color: rgba(0, 0, 0, 1);
+        text-align: center;
+        font-size: 80px;
+        font-weight: 400;
+        line-height: 100%;
+        height: 80px;
+        font-family: 'FZJCGFKTK';
+        border: none;
+      }
+    }
+    .con-preview {
+      margin-top: 74px;
+      color: #000;
+      text-align: center;
+      font-family: 'FZJCGFKTK';
+      font-size: 80px;
+      font-weight: 400;
+      line-height: 100%;
+      &-big {
+        font-size: 144px;
+      }
+    }
+    .writeTop-row {
+      display: flex;
+      justify-content: center;
+    }
+  }
+  .writeTop-nopadding {
+    padding-top: 0;
+    height: 842px;
+  }
+  .item-info {
+    display: flex;
+    width: 100%;
+    padding: 0 46px 8px 46px;
+    column-gap: 16px;
+    box-sizing: border-box;
+    &-left {
+      .writeTop-item {
+        width: 98px;
+        height: 98px;
+        :deep .strock-play-box {
+          width: 18px !important;
+          height: 18px !important;
+        }
+        :deep .playStorkes-btn {
+          width: 18px !important;
+          height: 18px !important;
+        }
+        &-small {
+          width: 62px;
+          height: 62px;
+          :deep .strock-play-box {
+            width: 11px !important;
+            height: 11px !important;
+          }
+          :deep .playStorkes-btn {
+            width: 11px !important;
+            height: 11px !important;
+          }
+        }
+      }
+      &-long {
+        width: 100%;
+      }
+    }
+    &-right {
+      flex: 1;
+    }
+    :deep .el-textarea__inner {
+      resize: none;
+      background-color: #f3f3f3;
+      border: none;
+      outline: none;
+    }
+    .voice-box {
+      width: 100%;
+      height: 32px;
+      display: flex;
+      align-items: center;
+      justify-content: center;
+      column-gap: 4px;
+      img {
+        width: 24px;
+        height: 24px;
+      }
+      span {
+        font-family: League;
+        font-size: 16px;
+        font-weight: 400;
+        color: #de4444;
+      }
+    }
+    .item-info-row {
+      display: flex;
+      column-gap: 11px;
+      margin-bottom: 6px;
+      :deep .el-input__inner {
+        background-color: #f3f3f3;
+        border: none;
+        outline: none;
+        height: 32px;
+      }
+    }
+    .item-info-half,
+    .item-info-all {
+      width: 50%;
+      display: flex;
+      font-size: 14px;
+      line-height: 22px;
+      height: 22px;
+    }
+    .item-info-all {
+      width: 100%;
+    }
+  }
+  .hz-box {
+    display: flex;
+    width: max-content;
+  }
+  .writeTop-item {
+    border: 1px solid #de4444;
+  }
+  .writeTop-item-noLeft {
+    border-left: none;
+  }
+  .writeBottom {
+    display: flex;
+    width: 100%;
+    justify-content: space-between;
+    padding: 0 38px;
+    box-sizing: border-box;
+    position: relative;
+    span {
+      font-weight: 500;
+      font-size: 10px;
+      line-height: 14px;
+      color: #000000;
+      opacity: 0.2;
+    }
+    b {
+      font-weight: 400;
+      font-size: 14px;
+      line-height: 14px;
+      color: #000000;
+      width: 60px;
+      text-align: center;
+      position: absolute;
+      left: 50%;
+      margin-left: -30px;
+      top: 0px;
+    }
+    a {
+      font-weight: 500;
+      font-size: 12px;
+      line-height: 14px;
+      color: #000000;
+      opacity: 0.2;
+    }
+  }
+  .tian-div {
+    width: 100%;
+    height: 100%;
+    position: relative;
+    .tian {
+      width: 100%;
+      height: 100%;
+    }
+    img {
+      width: 100%;
+      height: 100%;
+      position: absolute;
+      left: 0;
+      top: 0;
+    }
+  }
+  .practiceBox {
+    position: fixed;
+    left: 0;
+    top: 0;
+    z-index: 100100;
+    width: 100%;
+    height: 100vh;
+    background: rgba(0, 0, 0, 0.19);
+    box-sizing: border-box;
+    overflow: hidden;
+    overflow-y: auto;
+    &.practiceBoxStrock {
+      display: flex;
+      justify-content: center;
+      align-items: center;
+      padding-top: 0px;
+    }
+  }
+  .punctuation-box {
+    position: relative;
+    width: 100%;
+    height: 100%;
+    .character-target-div {
+      position: absolute;
+      width: 100%;
+      height: 100%;
+      top: 0;
+      left: 0;
+      .svg-icon {
+        width: 100%;
+        height: 100%;
+      }
+    }
+    h3 {
+      position: absolute;
+      width: 100%;
+      height: 100%;
+      top: 0;
+      left: 0;
+      font-family: FZJCGFKTK;
+      text-align: center;
+      font-weight: normal;
+    }
+  }
+}
+</style>

Một số tệp đã không được hiển thị bởi vì quá nhiều tập tin thay đổi trong này khác