Explorar o código

Merge branch 'beta'

SanHQin hai 2 horas
pai
achega
d8a428161c
Modificáronse 27 ficheiros con 550 adicións e 117 borrados
  1. 1 1
      dist/index.html
  2. 0 0
      dist/static/css/app.121803fa6bfc7172d54eb656be623934.css
  3. 0 0
      dist/static/css/app.121803fa6bfc7172d54eb656be623934.css.map
  4. 0 0
      dist/static/css/app.7b010da437d06bf09257042e0d38ac8d.css
  5. 0 0
      dist/static/css/workPage.11ffa5e44fd9a6a39e0d0727f6ba697f.css
  6. 0 0
      dist/static/css/workPage.11ffa5e44fd9a6a39e0d0727f6ba697f.css.map
  7. 0 0
      dist/static/css/workPage.9c36eefc62b778744140601830dbd191.css
  8. 0 0
      dist/static/css/workPage.9c36eefc62b778744140601830dbd191.css.map
  9. 0 0
      dist/static/js/app.6f9e55d0e9c7c231a7db.js
  10. 0 0
      dist/static/js/app.6f9e55d0e9c7c231a7db.js.map
  11. 0 0
      dist/static/js/manifest.23ea04dc469b57e2b4f8.js.map
  12. 0 0
      dist/static/js/workPage-manifest.2ece51fa34be51c8610a.js.map
  13. 0 0
      dist/static/js/workPage.22f9f11b50d3bb25b7ae.js
  14. 0 0
      dist/static/js/workPage.22f9f11b50d3bb25b7ae.js.map
  15. 0 0
      dist/static/js/workPage.55f18d3148666946c188.js
  16. 0 0
      dist/static/js/workPage.55f18d3148666946c188.js.map
  17. 1 1
      dist/workPage.html
  18. 20 0
      src/App.vue
  19. 131 0
      src/components/common/ConfirmDialog.vue
  20. 1 1
      src/components/pages/classroomObservation/components/chatArea.vue
  21. 182 69
      src/components/pages/pptEasy/addCourse3.vue
  22. 2 2
      src/components/pages/pptEasy/dialog/BilibiliSearchDialog2.vue
  23. 157 0
      src/components/pages/pptEasy/dialog/selectTag3.vue
  24. 45 39
      src/components/pages/workPage/components/setChoiceQuestion.vue
  25. 2 0
      src/lang/cn.json
  26. 3 1
      src/lang/en.json
  27. 5 3
      src/lang/hk.json

+ 1 - 1
dist/index.html

@@ -37,7 +37,7 @@
       width: 100%;
       background: #e6eaf0;
       font-family: '黑体';
-    }</style><link href=./static/css/app.7b010da437d06bf09257042e0d38ac8d.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=./static/js/manifest.23ea04dc469b57e2b4f8.js></script><script type=text/javascript src=./static/js/vendor.714ff2bfc93f2f096b79.js></script><script type=text/javascript src=./static/js/app.7bb103a8697923c0f0df.js></script></body></html><script>function stopSafari() {
+    }</style><link href=./static/css/app.121803fa6bfc7172d54eb656be623934.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=./static/js/manifest.23ea04dc469b57e2b4f8.js></script><script type=text/javascript src=./static/js/vendor.714ff2bfc93f2f096b79.js></script><script type=text/javascript src=./static/js/app.6f9e55d0e9c7c231a7db.js></script></body></html><script>function stopSafari() {
     //阻止safari浏览器双击放大功能
     let lastTouchEnd = 0  //更新手指弹起的时间
     document.documentElement.addEventListener("touchstart", function (event) {

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 0
dist/static/css/app.121803fa6bfc7172d54eb656be623934.css


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 0
dist/static/css/app.121803fa6bfc7172d54eb656be623934.css.map


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 0
dist/static/css/app.7b010da437d06bf09257042e0d38ac8d.css


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 0
dist/static/css/workPage.11ffa5e44fd9a6a39e0d0727f6ba697f.css


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 0
dist/static/css/workPage.11ffa5e44fd9a6a39e0d0727f6ba697f.css.map


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 0
dist/static/css/workPage.9c36eefc62b778744140601830dbd191.css


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 0
dist/static/css/workPage.9c36eefc62b778744140601830dbd191.css.map


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 0
dist/static/js/app.6f9e55d0e9c7c231a7db.js


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 0
dist/static/js/app.6f9e55d0e9c7c231a7db.js.map


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 0
dist/static/js/manifest.23ea04dc469b57e2b4f8.js.map


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 0
dist/static/js/workPage-manifest.2ece51fa34be51c8610a.js.map


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 0
dist/static/js/workPage.22f9f11b50d3bb25b7ae.js


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 0
dist/static/js/workPage.22f9f11b50d3bb25b7ae.js.map


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 0
dist/static/js/workPage.55f18d3148666946c188.js


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 0
dist/static/js/workPage.55f18d3148666946c188.js.map


+ 1 - 1
dist/workPage.html

@@ -1,4 +1,4 @@
-<!DOCTYPE html><html><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><title>工作页面 - CocoFlow</title><link rel=icon href=../static/logo.ico><link href=./static/css/workPage.11ffa5e44fd9a6a39e0d0727f6ba697f.css rel=stylesheet></head><body><noscript><strong>We're sorry but this app doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id=app></div><script type=text/javascript src=./static/js/workPage-manifest.2ece51fa34be51c8610a.js></script><script type=text/javascript src=./static/js/workPage-vendor.7b2c55096449c94cc8fd.js></script><script type=text/javascript src=./static/js/workPage.22f9f11b50d3bb25b7ae.js></script></body></html><script>function stopSafari() {
+<!DOCTYPE html><html><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><title>工作页面 - CocoFlow</title><link rel=icon href=../static/logo.ico><link href=./static/css/workPage.9c36eefc62b778744140601830dbd191.css rel=stylesheet></head><body><noscript><strong>We're sorry but this app doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id=app></div><script type=text/javascript src=./static/js/workPage-manifest.2ece51fa34be51c8610a.js></script><script type=text/javascript src=./static/js/workPage-vendor.7b2c55096449c94cc8fd.js></script><script type=text/javascript src=./static/js/workPage.55f18d3148666946c188.js></script></body></html><script>function stopSafari() {
     //阻止safari浏览器双击放大功能
     let lastTouchEnd = 0  //更新手指弹起的时间
     document.documentElement.addEventListener("touchstart", function (event) {

+ 20 - 0
src/App.vue

@@ -550,4 +550,24 @@ html::-webkit-scrollbar-thumb {
   color: #FF9400;
   font-weight: bold;
 }
+
+.count-node {
+  position: absolute;
+  top: 2px;
+  display: none;
+  height: 24px;
+  padding: 0 8px;
+  line-height: 22px;
+  margin-left: 6px;
+  background-color: #f4f4f5;
+  border: 1px solid #e9e9eb;
+  border-radius: 4px;
+  color: #909399;
+  font-size: 12px;
+  box-sizing: border-box;
+}
+
+.tagOption.selected{
+  color: #ef9e28 !important;
+}
 </style>

+ 131 - 0
src/components/common/ConfirmDialog.vue

@@ -0,0 +1,131 @@
+<template>
+  <div class="confirm_dialog">
+    <el-dialog
+      :visible.sync="dialogVisible"
+      width="400px"
+      :show-close="false"
+      :before-close="handleClose"
+      class="confirm_dialog_custom"
+    >
+      <div class="confirm_dialog_content">
+        <h3 class="confirm_dialog_title">{{ title }}</h3>
+        <p class="confirm_dialog_message">{{ message }}</p>
+      </div>
+      <div class="confirm_dialog_footer">
+        <el-button @click="handleCancel" class="cancel_btn">{{ cancelText }}</el-button>
+        <el-button type="primary" @click="handleConfirm" class="confirm_btn">{{ confirmText }}</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'ConfirmDialog',
+  props: {
+    visible: {
+      type: Boolean,
+      default: false
+    },
+    title: {
+      type: String,
+      default: ''
+    },
+    message: {
+      type: String,
+      default: ''
+    },
+    confirmText: {
+      type: String,
+      default: '确认'
+    },
+    cancelText: {
+      type: String,
+      default: '取消'
+    }
+  },
+  data() {
+    return {
+      dialogVisible: this.visible
+    }
+  },
+  watch: {
+    visible: {
+      handler(newVal) {
+        this.dialogVisible = newVal;
+      },
+      immediate: true
+    }
+  },
+  methods: {
+    handleClose() {
+      this.dialogVisible = false;
+      this.$emit('update:visible', false);
+      this.$emit('cancel');
+    },
+    handleCancel() {
+      this.dialogVisible = false;
+      this.$emit('update:visible', false);
+      this.$emit('cancel');
+    },
+    handleConfirm() {
+      this.dialogVisible = false;
+      this.$emit('update:visible', false);
+      this.$emit('confirm');
+    }
+  }
+}
+</script>
+
+<style scoped>
+.confirm_dialog_custom >>> .el-dialog {
+  border-radius: 15px;
+  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
+}
+
+.confirm_dialog_custom >>> .el-dialog__header {
+  display: none;
+}
+
+.confirm_dialog_custom >>> .el-dialog__body {
+  padding: 20px;
+}
+
+.confirm_dialog_title {
+  font-size: 18px;
+  font-weight: bold;
+  margin-bottom: 16px;
+  color: #333;
+}
+
+.confirm_dialog_message {
+  font-size: 14px;
+  line-height: 1.5;
+  color: #666;
+  margin-bottom: 24px;
+}
+
+.confirm_dialog_footer {
+  display: flex;
+  justify-content: flex-end;
+  /* gap: 12px; */
+}
+
+.cancel_btn {
+  border-radius: 10px;
+  border: 1px solid #DCDFE6;
+  background-color: #FFFFFF;
+  color: #606266;
+}
+
+.confirm_btn {
+  border-radius: 6px;
+  background-color: #FF9400;
+  border: none;
+  color: #FFFFFF;
+}
+
+.confirm_btn:hover {
+  background-color: #FFA500;
+}
+</style>

+ 1 - 1
src/components/pages/classroomObservation/components/chatArea.vue

@@ -2833,7 +2833,7 @@ ${JSON.stringify(_list)}
         }
       };
       // large chunk size will cause token limit and slower
-      const chunkSize = 50;
+      const chunkSize = 20;
       this.actionTypesMap.jsonData[key] = Array.from({
         length: tableRows.length
       }).fill("");

+ 182 - 69
src/components/pages/pptEasy/addCourse3.vue

@@ -1,5 +1,15 @@
 <template>
   <div class="pb_content" style="background: #F0F2F5;" v-loading.fullscreen.lock="uploadWorkLoading">
+    <confirm-dialog
+      :visible.sync="confirmVisible"
+      :title="confirmTitle"
+      :message="confirmMessage"
+      :confirm-text="confirmConfirmText"
+      :cancel-text="confirmCancelText"
+      @confirm="handleConfirm"
+      @cancel="handleCancel"
+    />
+
     <div class="pb_content_body" style="position: relative; margin: 0">
       <div class="right">
         <div style="width: 100%; height: 100%; overflow: auto" ref="stepBox">
@@ -743,19 +753,31 @@
         <div class="modal-body">
           <div class="form-item">
             <label class="form-label">{{ lang.ssSubjectCategory }}</label>
-            <el-select v-model="selectedSubject" :placeholder="lang.ssSelectSubj" class="custom-select" collapse-tags
+            <!-- <el-select v-model="selectedSubject" :placeholder="lang.ssSelectSubj" class="custom-select" collapse-tags
               multiple style="width: 100%">
               <el-option v-for="option in subjectOptions" :key="option.id" :label="option.name"
                 :value="option.id"></el-option>
-            </el-select>
+            </el-select> -->
+            <selectTag
+              v-model="selectedSubject"
+              :options="subjectOptions"
+              :placeholder=lang.ssSelectSubj
+              style="width: 100%;"
+            />
           </div>
           <div class="form-item">
             <label class="form-label">{{ lang.ssGradeType }}</label>
-            <el-select v-model="selectedGrade" :placeholder="lang.ssSelectGrade" class="custom-select" collapse-tags
+            <!-- <el-select v-model="selectedGrade" :placeholder="lang.ssSelectGrade" class="custom-select" collapse-tags
               multiple style="width: 100%">
               <el-option v-for="option in gradeOptions" :key="option.id" :label="option.name"
                 :value="option.id"></el-option>
-            </el-select>
+            </el-select> -->
+            <selectTag
+              v-model="selectedGrade"
+              :options="gradeOptions"
+              :placeholder=lang.ssSelectGrade
+              style="width: 100%;"
+            />
           </div>
         </div>
         <div class="modal-footer">
@@ -785,35 +807,58 @@
           <div class="form-box">
             <div class="form-box-left">
               <div class="form-row">
-                <div class="form-item required" style="flex: 2;">
+                <div class="form-item required">
                   <label class="form-label">{{ lang.ssSubjectCategory }}</label>
-                  <el-select v-model="selectedSubject" :placeholder="lang.ssSelectSubj" class="custom-select" collapse-tags multiple
-                    style="width: 100%">
-                    <el-option v-for="option in subjectOptions" :key="option.id" :label="option.name"
-                      :value="option.id"></el-option>
-                  </el-select>
+                  <selectTag
+                    v-model="selectedSubject"
+                    :options="subjectOptions"
+                    :placeholder=lang.ssSelectSubj
+                    style="width: 100%;"
+                  />
+                </div>
+                <div class="form-item required">
+                  <label class="form-label">{{ lang.ssClass }}{{ lang.ssLabel }}</label>
+                  <selectTag
+                    v-model="selectedGrade"
+                    :options="gradeOptions"
+                    :placeholder=lang.ssSelectGrade
+                    style="width: 100%;"
+                  />
                 </div>
               </div>
-
               <div class="form-row">
+                <div class="form-item required" style="flex: 2;">
+                  <label class="form-label">{{ lang.ssClass }}</label>
+                  <selectTag
+                    v-model="checkboxList2"
+                    :options="classOptions"
+                    :placeholder=lang.ssSelectClass
+                    style="width: 100%;"
+                  />
+                </div>
+              </div>
+
+              <!-- <div class="form-row">
                 <div class="form-item required">
                   <label class="form-label">{{ lang.ssGradeType }}</label>
-                  <el-select v-model="selectedGrade" :placeholder="lang.ssSelectGrade" class="custom-select" collapse-tags multiple
-                    style="width: 100%">
-                    <el-option v-for="option in gradeOptions" :key="option.id" :label="option.name"
-                      :value="option.id"></el-option>
-                  </el-select>
+                  <selectTag
+                    v-model="selectedGrade"
+                    :options="gradeOptions"
+                    :placeholder=lang.ssSelectGrade
+                    style="width: 100%;"
+                  />
                 </div>
 
                 <div class="form-item required">
                   <label class="form-label">{{ lang.ssClass }}</label>
-                  <el-select v-model="checkboxList2" :placeholder="lang.ssSelectClass" class="custom-select" collapse-tags multiple
-                    style="width: 100%">
-                    <el-option v-for="option in classOptions" :key="option.id" :label="option.name"
-                      :value="option.id"></el-option>
-                  </el-select>
+                  <selectTag
+                    v-model="checkboxList2"
+                    :options="classOptions"
+                    :placeholder=lang.ssSelectClass
+                    style="width: 100%;"
+                  />
                 </div>
-              </div>
+              </div> -->
 
               <div class="form-row">
                 <div class="form-item required">
@@ -921,6 +966,8 @@ import BilibiliSearchDialog from "./dialog/BilibiliSearchDialog2.vue";
 import { v4 as uuidv4 } from "uuid";
 import InteractiveToolDialog from "./dialog/InteractiveToolDialog.vue";
 import VideoUploadDialog from "./dialog/VideoUploadDialog2.vue";
+import ConfirmDialog from "../../common/ConfirmDialog";
+import selectTag from "./dialog/selectTag3.vue";
 
 var OpenCC = require("opencc-js");
 let converter = OpenCC.Converter({
@@ -973,7 +1020,9 @@ export default {
     InteractiveToolDialog,
     VideoUploadDialog,
     BilibiliSearchDialog,
-    appDialog
+    appDialog,
+    ConfirmDialog,
+    selectTag
   },
   data() {
     return {
@@ -989,6 +1038,12 @@ export default {
       dialogVisibleBasicInfo: false,
       dialogVisibleClass: false,
       dialogVisiblePublish: false,
+      confirmVisible: false,
+      confirmTitle: '',
+      confirmMessage: '',
+      confirmConfirmText: '',
+      confirmCancelText: '',
+      confirmCallback: null,
       loading: false,
       courseName: "",
       isTeacherSee: false,
@@ -1305,7 +1360,7 @@ export default {
       // 暂时使用模拟数据
       this.classOptions = this.grade2.map(item => ({
         id: item.id,
-        name: item.name
+        name: item.classname ? item.classname + '-' + item.name : item.name
       }));
     },
     // 确认发布
@@ -1369,7 +1424,7 @@ export default {
     generateFromAI() {
       console.log('自AI生成');
       if(!this.courseName){
-        this.$message.error(this.lang.ssFillCourseName);
+        this.$message.error(this.lang.ssFillCourseName2);
         return;
       }
       if(this.avatar_loading){
@@ -1498,14 +1553,14 @@ export default {
       // this.isTeacherSee = true
       if (this.cid == "" || this.cid == undefined) {
         if (this.courseName == "") {
-          this.$message.error(this.lang.ssFillCourseName);
+          this.$message.error(this.lang.ssFillCourseName2);
           return;
         } else {
           this.addWork();
         }
       } else {
         if (this.courseName == "") {
-          this.$message.error(this.lang.ssFillCourseName);
+          this.$message.error(this.lang.ssFillCourseName2);
           return;
         } else {
           console.log("修改课程");
@@ -1542,14 +1597,14 @@ export default {
     save(type = 1) {
       if (this.cid == "" || this.cid == undefined) {
         if (this.courseName == "") {
-          this.$message.error(this.lang.ssFillCourseName);
+          this.$message.error(this.lang.ssFillCourseName2);
           return;
         } else {
           this.addWork(2, type);
         }
       } else {
         if (this.courseName == "") {
-          this.$message.error(this.lang.ssFillCourseName);
+          this.$message.error(this.lang.ssFillCourseName2);
           return;
         } else {
           this.updateWork(2, type);
@@ -1614,45 +1669,47 @@ export default {
       // }
     },
     lastSteps() {
-      this.$confirm(this.lang.ssSaveEdit, this.lang.ssTip, {
-        confirmButtonText: this.lang.ssSave,
-        cancelButtonText: this.lang.ssNotSave,
-        distinguishCancelAndClose: true,
-        type: "warning"
-      })
-        .then(() => {
-          console.log("保存已编辑内容");
-          if (this.cid == "" || this.cid == undefined) {
-            if (this.courseName == "") {
-              this.$message.error(this.lang.ssFillCourseName);
-              return;
-            } else {
-              this.addWork();
-            }
+      this.confirmTitle = this.lang.ssTip;
+      this.confirmMessage = this.lang.ssSaveEdit;
+      this.confirmConfirmText = this.lang.ssSave;
+      this.confirmCancelText = this.lang.ssNotSave;
+      this.confirmCallback = () => {
+        console.log("保存已编辑内容");
+        if (this.cid == "" || this.cid == undefined) {
+          if (this.courseName == "") {
+            this.$message.error(this.lang.ssFillCourseName2);
+            return;
           } else {
-            if (this.courseName == "") {
-              this.$message.error(this.lang.ssFillCourseName);
-              return;
-            } else {
-              this.updateWork();
-            }
+            this.addWork();
           }
-        })
-        .catch(v => {
-          console.log(v);
-          if (v == "cancel") {
-            this.goTo(
-              "/course?userid=" +
-              this.userid +
-              "&oid=" +
-              this.oid +
-              "&org=" +
-              this.org +
-              "&role=" +
-              this.role
-            );
+        } else {
+          if (this.courseName == "") {
+            this.$message.error(this.lang.ssFillCourseName2);
+            return;
+          } else {
+            this.updateWork();
           }
-        });
+        }
+      };
+      this.confirmVisible = true;
+    },
+    handleConfirm() {
+      if (this.confirmCallback) {
+        this.confirmCallback();
+      }
+    },
+    handleCancel() {
+      console.log("不保存已编辑内容");
+      this.goTo(
+        "/course?userid=" +
+        this.userid +
+        "&oid=" +
+        this.oid +
+        "&org=" +
+        this.org +
+        "&role=" +
+        this.role
+      );
     },
     //获取ppt的数据
     async getPPtJson() {
@@ -1678,6 +1735,30 @@ export default {
         checkLoaded(resolve);
       });
     },
+    //获取ppt的数据
+    async getPPTimgExporting() {
+      const checkLoaded = async (resolve) => {
+        console.log("获取ppt数据")
+        let _pptIframe = this.$refs.pptIframeRef;
+        if (
+          _pptIframe &&
+          _pptIframe.contentWindow &&
+          _pptIframe.contentWindow.window &&
+          typeof _pptIframe.contentWindow.window.exportJSON === "function"
+        ) {
+          let _data = _pptIframe.contentWindow.window.imgExporting();
+          resolve(_data);
+        } else {
+          // 递归等待1000ms后重试
+          setTimeout(() => {
+            checkLoaded(resolve);
+          }, 1000);
+        }
+      };
+      return new Promise((resolve) => {
+        checkLoaded(resolve);
+      });
+    },
     //上传文件
     uploadFile(file) {
       return new Promise((resolve) => {
@@ -1786,6 +1867,12 @@ export default {
         this.uploadWorkLoading = true;
       }
       let _pptData = await this.getPPtJson();
+      let imgExporting = await this.getPPTimgExporting()
+      if (type == 1 && imgExporting) {
+        this.uploadWorkLoading = false;
+        this.$message.info(this.lang.ssPptLoad2)
+        return
+      }
       const _pptData2 = JSON.parse(JSON.stringify(_pptData))
       const pptContent = []
       if (_pptData2.slides) {
@@ -1899,6 +1986,12 @@ export default {
         this.uploadWorkLoading = true;
       }
       let _pptData = await this.getPPtJson();
+      let imgExporting = await this.getPPTimgExporting()
+      if (type == 1 && imgExporting) {
+        this.uploadWorkLoading = false;
+        this.$message.info(this.lang.ssPptLoad2)
+        return
+      }
       const _pptData2 = JSON.parse(JSON.stringify(_pptData))
       const pptContent = []
       if (_pptData2.slides) {
@@ -2673,6 +2766,19 @@ export default {
       this.addContent(cocoroboItem)
       this.setPPtToolList();
     },
+    setUrl() {
+      let url = 'https://beta.pbl.cocorobo.cn'
+      if (this.lang.lang === 'cn') {
+        url = 'https://pbl.cocorobo.cn'
+      }
+      else if (this.lang.lang === 'hk') {
+        url = 'https://pbl.cocorobo.hk'
+      }
+      else if (this.lang.lang === 'en') {
+        url = 'https://pbl.cocorobo.com'
+      }
+      return url
+    },
     addTest() {
       // var aj = this.testJson.testJson;
       // var b = 1;
@@ -2765,7 +2871,8 @@ export default {
 
       this.dialogVisibleChoice = false;
       this.getWorkPageId(_data.id, 45, testJson).then(res => {
-        let url = `https://beta.pbl.cocorobo.cn/pbl-teacher-table/dist/workPage.html#/setWorkPage?id=${res}&type=${_data.tool}`
+        let baseUrl = this.setUrl()
+        let url = `${baseUrl}/pbl-teacher-table/dist/workPage.html#/setWorkPage?id=${res}&type=${_data.tool}`
         this.pptCourseJson.toolsList.find(i => i.id === _data.id).url = url;
         this.setPPtToolList();
         _data.url = url
@@ -3021,7 +3128,8 @@ export default {
 
       this.dialogVisible8 = false;
       this.getWorkPageId(_data.id, 15, { answerQ: this.answerQ }).then(res => {
-        let url = `https://beta.pbl.cocorobo.cn/pbl-teacher-table/dist/workPage.html#/setWorkPage?id=${res}&type=${_data.tool}`;
+        let baseUrl = this.setUrl()
+        let url = `${baseUrl}/pbl-teacher-table/dist/workPage.html#/setWorkPage?id=${res}&type=${_data.tool}`;
         this.pptCourseJson.toolsList.find(i => i.id === _data.id).url = url;
         this.setPPtToolList();
         _data.url = url
@@ -3978,6 +4086,11 @@ export default {
   padding: 0 30px 0 15px;
 }
 
+.search_input >>> .el-input.is-active .el-input__inner, 
+.search_input >>> .el-input__inner:focus{
+  border-color: #f8932f;
+}
+
 .search_img {
   width: 20px;
   height: 20px;
@@ -4850,8 +4963,8 @@ export default {
 }
 
 .btn-cancel:hover {
-  border-color: #c6e2ff;
-  color: #409eff;
+  border-color: #ff9500;
+  color: #ff9500;
 }
 
 .publish-modal-footer .btn-cancel {

+ 2 - 2
src/components/pages/pptEasy/dialog/BilibiliSearchDialog2.vue

@@ -109,7 +109,7 @@
 				</div>
 
 				<!-- 分页控件 -->
-				<div class="pagination-box" v-if="data.length > 0">
+				<div class="pagination-box" v-if="false">
 					<el-button 
 						:disabled="currentPage === 1" 
 						@click="prevPage"
@@ -123,7 +123,7 @@
 					>{{ lang.ssNextPage }}→</el-button>
 				</div>
 			</div>
-			<div class="modal-footer">
+			<div class="modal-footer" v-show="false">
 				<el-button @click="handleClose" style="background-color: #fff;border-color: #DCDFE6;color: #606266;">{{ lang.ssClose }}</el-button>
 			</div>
 		</div>

+ 157 - 0
src/components/pages/pptEasy/dialog/selectTag3.vue

@@ -0,0 +1,157 @@
+<template>
+  <main>
+    <el-select
+      ref="select"
+      v-model="values"
+      multiple
+      style="width:100%"
+      :placeholder=lang.pleaseSelect3
+      @change="handleChange"
+      @remove-tag="removeTag"
+      class="tagS"
+    >
+      <el-option
+        class="tagOption"
+        v-for="item in options"
+        :key="item.id"
+        :disabled="disabled && item.id === Number(judgingCondition)"
+        :label="item.name"
+        :value="item.id"
+      />
+    </el-select>
+  </main>
+</template>
+<script>
+export default {
+  name: 'select-tags',
+  props: {
+    // 选项
+    options: {
+      type: Array,
+      default: () => []
+    },
+    // 选中的值
+    value: {
+      type: Array,
+      default: () => []
+    },
+    // 提示
+    placeholder: {
+      type: String,
+      default: ''
+    },
+    // 是否禁用
+    disabled: {
+      type: Boolean,
+      default: false
+    },
+    // 判断条件
+    judgingCondition: {
+      type: String | Number,
+      default: ''
+    }
+  },
+  data() {
+    return {
+      observer: null,
+      hideDom: null
+    };
+  },
+  computed: {
+    /**
+     * @description 获取当前选中的值
+    */
+    values: {
+      get() {
+        return this.value;
+      },
+      set(val) {
+        this.$emit('input', val);
+      }
+    }
+  },
+  mounted() {
+    this.mutationObserver();
+  },
+  beforeDestroy() {
+    this.observer.disconnect();
+  },
+  methods: {
+    /**
+     * @description 监听tag变化
+     */
+    mutationObserver() {
+      const tagLIstDom = this.$refs.select.$el.querySelector('.el-select__tags');
+      const tagSpanDom = this.$refs.select.$el.querySelector('.el-select__tags > span');
+
+      // 创建隐藏的计数节点
+      this.hideDom = document.createElement('span');
+      this.hideDom.classList.add('count-node');
+      tagSpanDom.append(this.hideDom);
+
+      const config = { childList: true };
+
+      const callback = mutationsList => {
+        mutationsList.forEach(item => {
+          console.log(item);
+          
+          if (item.type === 'childList') {
+            const tagList = item.target.childNodes;
+            let tagWidth = 0;
+            let tagNum = 0;
+            let availableTagWidth = 0;
+
+            for (let i = 0; i < tagList.length; i++) {
+              const e = tagList[i];
+              if (tagWidth > tagLIstDom.offsetWidth) {
+                e.style.display = 'none';
+              } else {
+                e.style.display = 'inline-block';
+              }
+              tagWidth += e.offsetWidth + 5;
+
+              if (tagWidth > tagLIstDom.offsetWidth) {
+                e.style.display = 'none';
+              } else {
+                e.style.display = 'inline-block';
+              }
+
+              if (e.style.display !== 'none') {
+                tagNum++;
+                this.hideDom.style.display = 'none';
+                const margin = tagNum === 1 ? 0 : 7;
+                availableTagWidth += e.offsetWidth + margin;
+              } else {
+                this.hideDom.style.display = 'inline-block';
+                this.hideDom.style.left = `${availableTagWidth}px`;
+                this.hideDom.innerHTML = `+${tagList.length - tagNum}`;
+              }
+            }
+          }
+        });
+      };
+
+      this.observer = new MutationObserver(callback);
+      this.observer.observe(tagSpanDom, config);
+    },
+    /**
+     * @description 选择框改变
+     */
+    handleChange() {
+      this.$emit('change', this.value);
+    },
+    /**
+     *
+     * @param val 当前角色绑定的分校不允许删除
+     */
+    removeTag(val) {
+      this.$emit('remove-tag', val);
+    }
+  }
+};
+</script>
+<style scoped>
+.tagS >>> .el-input__inner:focus {
+  border-color: #ef9e28;
+}
+</style>

+ 45 - 39
src/components/pages/workPage/components/setChoiceQuestion.vue

@@ -99,8 +99,8 @@
             @blur="setTestJson()"></el-input>
           <div class="btn">
 
-            <div @click="addCheck(item.id, checkIndex)" v-if="item.checkList.length > 2">
-              <svg style="width: .7rem; height: .7rem;" viewBox="0 0 1024 1024" width="200" height="200">
+            <div @click="addCheck(item.id, checkIndex)">
+              <svg style="width: 1.1rem; height: 1.1rem;" viewBox="0 0 1024 1024" width="200" height="200">
                 <path
                   d="M47.653 439.326c-24.501 0-44.368 19.881-44.368 44.4v56.548c0 24.492 19.862 44.4 44.368 44.4h928.694c24.501 0 44.368-19.881 44.368-44.4v-56.548c0-24.497-19.862-44.4-44.368-44.4H47.653z"
                   p-id="11474"></path>
@@ -142,7 +142,7 @@
             <span>{{ lang.ssAIGenerate }}</span>
           </div>
         </div>
-        <el-input type="textarea" rows="3" resize="none" v-model="item.explanation"
+        <el-input type="textarea" rows="3" style="font-size: 1.2rem;" resize="none" v-model="item.explanation"
           :placeholder="lang.ssEnterExplanation" @blur="setTestJson()"></el-input>
       </div>
     </div>
@@ -183,8 +183,13 @@ export default {
       handler(newVal, oldVal) {
         if (newVal.type == 45) {
           if (JSON.stringify(newVal.json) != JSON.stringify(this.jsonData)) {
-
-            this.jsonData = JSON.parse(JSON.stringify(newVal.json));
+            let editJson = JSON.parse(JSON.stringify(newVal.json))
+            editJson.testJson.forEach(item => {
+              if(typeof item.answer == 'string' || typeof item.answer == 'number'){
+                item.answer = [item.answer];
+              }
+            })
+            this.jsonData = editJson;
             if(this.jsonData.testJson.length == 0){
               this.addTest();
             }
@@ -434,14 +439,14 @@ export default {
 }
 
 .addTest>svg {
-  width: .7rem;
-  height: .7rem;
+  width: 1.2rem;
+  height: 1.2rem;
   fill: #6E7583;
 }
 
 .addTest>span {
   font-weight: bold;
-  font-size: .9rem;
+  font-size: 1.4rem;
   color: #6b7280;
 }
 
@@ -464,13 +469,13 @@ export default {
 }
 
 .ti_header>span {
-  font-size: 1rem;
+  font-size: 1.4rem;
   font-weight: 600;
   color: #ff9300;
 }
 
 .ti_header>span>span {
-  font-size: .8rem;
+  font-size: 1.2rem;
   color: rgb(117, 117, 117);
   margin-left: .5rem;
 }
@@ -482,8 +487,8 @@ export default {
 }
 
 .ti_h_edit>span {
-  width: 1.5rem;
-  height: 1.5rem;
+  width: 1.9rem;
+  height: 1.9rem;
   display: flex;
   align-items: center;
   justify-content: center;
@@ -493,8 +498,8 @@ export default {
 }
 
 .ti_h_edit>span>svg {
-  width: 1rem;
-  height: 1rem;
+  width: 1.4rem;
+  height: 1.4rem;
   fill: #6B7280;
 }
 
@@ -517,7 +522,7 @@ export default {
   border: none;
   outline: none;
   background: none;
-  font-size: .8rem;
+  font-size: 1.2rem;
   resize: none;
   max-height: 10rem;
   overflow: auto;
@@ -539,8 +544,8 @@ export default {
 }
 
 .uploadImage>svg {
-  width: 1rem;
-  height: 1rem;
+  width: 1.4rem;
+  height: 1.4rem;
 }
 
 .checkList {
@@ -559,7 +564,7 @@ export default {
   align-items: center;
   justify-content: flex-start;
   gap: .5rem;
-  padding: .3rem .5rem;
+  padding: .5rem .7rem;
   transition: .2s;
 }
 
@@ -568,8 +573,8 @@ export default {
 }
 
 .drag {
-  width: 1.1rem;
-  height: 1.1rem;
+  width: 1.5rem;
+  height: 1.5rem;
   display: flex;
   justify-content: center;
   align-items: center;
@@ -600,8 +605,8 @@ export default {
 
 
 .check {
-  width: 1.1rem;
-  height: 1.1rem;
+  width: 1.5rem;
+  height: 1.5rem;
   border: solid 1px #D1D5DB;
   border-radius: .25rem;
   cursor: pointer;
@@ -615,13 +620,14 @@ export default {
 }
 
 .checked>svg {
-  width: .7rem;
-  height: .7rem;
+  width: 1.1rem;
+  height: 1.1rem;
   fill: #fff;
 }
 
 .checkItem>.el-input {
   width: calc(100% - 10rem);
+  font-size: 1.4rem;
 }
 
 .addCheck {
@@ -638,14 +644,14 @@ export default {
 }
 
 .addCheck>svg {
-  width: .5rem;
-  height: .5rem;
+  width: .9rem;
+  height: .9rem;
   fill: #6E7583;
 }
 
 .addCheck>span {
   font-weight: bold;
-  font-size: .8rem;
+  font-size: 1.2rem;
   color: #6b7280;
 }
 
@@ -664,8 +670,8 @@ export default {
 
 
 .btn>div {
-  width: 1rem;
-  height: 1rem;
+  width: 1.4rem;
+  height: 1.4rem;
   display: flex;
   justify-content: center;
   align-items: center;
@@ -675,8 +681,8 @@ export default {
 }
 
 .btn>div>svg {
-  width: .6rem;
-  height: .6rem;
+  width: 1rem;
+  height: 1rem;
   fill: #9DA3AF;
 }
 
@@ -700,7 +706,7 @@ export default {
 
 .e_header>span {
   color: #6b7280;
-  font-size: .8rem;
+  font-size: 1.2rem;
   font-weight: 500;
 }
 
@@ -711,15 +717,15 @@ export default {
   background: #ff9300;
   color: #fff;
   padding: .3rem .8rem;
-  font-size: .8rem;
+  font-size: 1.2rem;
   font-weight: 500;
   border-radius: .5rem;
   cursor: pointer;
 }
 
 .e_header>div>svg {
-  width: .8rem;
-  height: .8rem;
+  width: 1.2rem;
+  height: 1.2rem;
   fill: #fff;
 }
 
@@ -748,11 +754,11 @@ export default {
 }
 
 .imageList>div>svg {
-  width: 1rem;
-  height: 1rem;
+  width: 1.2rem;
+  height: 1.2rem;
   position: absolute;
-  top: -.3rem;
-  right: -.3rem;
+  top: -.4rem;
+  right: -.4rem;
   font-weight: 500;
   border-radius: .5rem;
   cursor: pointer;

+ 2 - 0
src/lang/cn.json

@@ -1042,6 +1042,7 @@
   "ssWaitTaskSave":"请等待任务*回答完毕后再保存",
   "ssWaitTaskCont":"请等待任务*回答完毕后再继续",
   "ssFillCourseName":"请补充填写课程名称",
+  "ssFillCourseName2":"请输入课程名称",
   "ssClickConfirmUpload":"点击确认上传按钮",
   "ssGenOutTaskDesc":"生成大纲任务*描述还未生成完,请前往查看,回答完毕后再次操作。",
   "ssCpoteNotGen":"概念群还未生成完,请前往查看,回答完毕后再次操作。",
@@ -1917,6 +1918,7 @@
   "ssTotalPrefix":"共",
   "ssBasicInfo":"基础信息",
   "ssPptLoad":"ppt正在加载中,请稍等",
+  "ssPptLoad2":"ppt正在上传图片中,请稍等",
   "ssUploadPptFail":"上传失败ppt数据失败",
   "ssCopyToolSucc":"复制工具成功",
   "ssAddH5":"添加H5页面",

+ 3 - 1
src/lang/en.json

@@ -1037,6 +1037,7 @@
   "ssWaitTaskSave":"Please wait for task * to finish answering before saving",
   "ssWaitTaskCont":"Please wait for task * to finish answering before continuing",
   "ssFillCourseName":"Please enter a course name to continue.",
+  "ssFillCourseName2":"Please enter course name",
   "ssClickConfirmUpload":"Click confirm upload button",
   "ssGenOutTaskDesc":"Outline task * description is not yet complete, please check and try again after answering.",
   "ssCpoteNotGen":"Conceptual group is not yet complete, please check and try again after answering.",
@@ -1916,12 +1917,13 @@
   "ssTotalPrefix":"Total ",
   "ssBasicInfo":"Basic Information",
   "ssPptLoad":"PPT is loading, please wait",
+  "ssPptLoad2":"PPT is uploading images, please wait",
   "ssUploadPptFail":"Failed to upload PPT data",
   "ssCopyToolSucc":"Tool copied successfully",
   "ssAddH5":"Add Web Page",
   "ssUploading":"Uploading...",
   "ssCompleted":"Complete",
-  "ssBilibiliVideo":"Bilibili Video",
+  "ssBilibiliVideo":"Youtube Video",
   "ssQAQuestion":"QA Question",
   "ssQAQuestionTool":"QA Question Tool",
   "ssBilibiliVideoSearch":"Search YouTube Videos",

+ 5 - 3
src/lang/hk.json

@@ -1040,6 +1040,7 @@
   "ssWaitTaskSave":"請等待任務*回答完畢後再保存",
   "ssWaitTaskCont":"請等待任務*回答完畢後再繼續",
   "ssFillCourseName":"請補充填寫課程名稱",
+  "ssFillCourseName2":"請輸入課程名稱",
   "ssClickConfirmUpload":"點擊確認上傳按鈕",
   "ssGenOutTaskDesc":"生成大綱任務*描述還未生成完,請前往查看,回答完畢後再次操作。",
   "ssCpoteNotGen":"概念群還未生成完,請前往查看,回答完畢後再次操作。",
@@ -1916,15 +1917,16 @@
   "ssTotalPrefix":"共",
   "ssBasicInfo":"基礎信息",
   "ssPptLoad":"ppt正在加載中,請稍等",
+  "ssPptLoad2":"PPT正在上傳圖片,請稍候",
   "ssUploadPptFail":"上傳失敗ppt數據失敗",
   "ssCopyToolSucc":"複製工具成功",
   "ssAddH5":"添加H5頁面",
   "ssUploading":"上傳中",
   "ssCompleted":"已完成",
-  "ssBilibiliVideo":"Bilibili視頻",
+  "ssBilibiliVideo":"Youtube視頻",
   "ssQAQuestion":"問答題",
   "ssQAQuestionTool":"問答題工具",
-  "ssBilibiliVideoSearch":"Bilibili視頻檢索",
+  "ssBilibiliVideoSearch":"Youtube視頻檢索",
   "ssBiliLoading":"正在檢索中,請稍等...",
   "ssBiliSearchKey":"搜索視頻關鍵字(如需搜索多個可,隔開)",
   "ssBiSort":"綜合排序",
@@ -1942,7 +1944,7 @@
   "ssAddSuccessVideo":"成功添加*個視頻",
   "ssSelectVideoSource":"選擇視頻來源",
   "ssLocalUpload":"從本地文件上傳",
-  "ssBiliSearch":"從Bilibili檢索",
+  "ssBiliSearch":"從YouTube檢索",
   "ssNewGrade":"新年級",
   "ssNewClass":"新班級",
   "ssInterClassMng":"興趣班管理",

Algúns arquivos non se mostraron porque demasiados arquivos cambiaron neste cambio