lsc 3 тижнів тому
батько
коміт
51220d486a
35 змінених файлів з 1329 додано та 167 видалено
  1. 1 1
      dist/index.html
  2. 0 0
      dist/static/css/app.f871644debbe960182cc72562af7bf83.css
  3. 0 0
      dist/static/css/app.f871644debbe960182cc72562af7bf83.css.map
  4. 0 0
      dist/static/js/app.16d46bf2bad512d49a97.js
  5. 0 0
      dist/static/js/app.16d46bf2bad512d49a97.js.map
  6. 0 0
      dist/static/js/manifest.161e82026ac2ae03ab6f.js.map
  7. 3 3
      package-lock.json
  8. 10 1
      src/assets/css/button.css
  9. BIN
      src/assets/icon/test/type_clockIn_icon.png
  10. 62 20
      src/components/pages/aiAddCourse/addCourse.vue
  11. 61 20
      src/components/pages/aiEasy/addCourse.vue
  12. 2 0
      src/components/pages/classroomObservation/components/analysisTemplateDialog.vue
  13. 1 1
      src/components/pages/classroomObservation/components/messageArea.vue
  14. 2 2
      src/components/pages/components/appDialog.vue
  15. 3 4
      src/components/pages/components/exportDataDialog.vue
  16. 1 1
      src/components/pages/course.vue
  17. 63 20
      src/components/pages/easy/addCourse.vue
  18. 61 20
      src/components/pages/newCourse/addCourse.vue
  19. 3 2
      src/components/pages/sassPlatform/index.vue
  20. 42 10
      src/components/pages/sassPlatform/view/tableView.vue
  21. 124 38
      src/components/pages/test/add/addTest.vue
  22. 2 1
      src/components/pages/test/add/components/addCheckPopover.vue
  23. 15 2
      src/components/pages/test/add/components/checkOrder.vue
  24. 10 10
      src/components/pages/test/add/components/evaBox/eva.vue
  25. 204 0
      src/components/pages/test/add/components/punchQRcode/index.vue
  26. 7 1
      src/components/pages/test/add/edit/check/index.vue
  27. 261 0
      src/components/pages/test/add/edit/check/punchQRcode.vue
  28. 16 0
      src/components/pages/test/add/edit/edit/index.vue
  29. 5 1
      src/components/pages/test/add/minxins/minxin.js
  30. 44 1
      src/components/pages/test/check/index.vue
  31. 32 4
      src/components/pages/test/check/index2.vue
  32. 16 3
      src/components/pages/test/smarter.vue
  33. 266 0
      src/components/pages/testStudent/view/component/punchQRcode.vue.vue
  34. 11 1
      src/components/pages/testStudent/view/component/topic.vue
  35. 1 0
      src/router/index.js

+ 1 - 1
dist/index.html

@@ -32,7 +32,7 @@
       width: 100%;
       background: #e6eaf0;
       font-family: '黑体';
-    }</style><link href=./static/css/app.986a74a0659944f4b8c2afc1fc8a0285.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=./static/js/manifest.161e82026ac2ae03ab6f.js></script><script type=text/javascript src=./static/js/vendor.c046dd5e92c8da101466.js></script><script type=text/javascript src=./static/js/app.763b4fb38089eb15deed.js></script></body></html><script>function stopSafari() {
+    }</style><link href=./static/css/app.f871644debbe960182cc72562af7bf83.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=./static/js/manifest.161e82026ac2ae03ab6f.js></script><script type=text/javascript src=./static/js/vendor.c046dd5e92c8da101466.js></script><script type=text/javascript src=./static/js/app.16d46bf2bad512d49a97.js></script></body></html><script>function stopSafari() {
     //阻止safari浏览器双击放大功能
     let lastTouchEnd = 0  //更新手指弹起的时间
     document.documentElement.addEventListener("touchstart", function (event) {

Різницю між файлами не показано, бо вона завелика
+ 0 - 0
dist/static/css/app.f871644debbe960182cc72562af7bf83.css


Різницю між файлами не показано, бо вона завелика
+ 0 - 0
dist/static/css/app.f871644debbe960182cc72562af7bf83.css.map


Різницю між файлами не показано, бо вона завелика
+ 0 - 0
dist/static/js/app.16d46bf2bad512d49a97.js


Різницю між файлами не показано, бо вона завелика
+ 0 - 0
dist/static/js/app.16d46bf2bad512d49a97.js.map


Різницю між файлами не показано, бо вона завелика
+ 0 - 0
dist/static/js/manifest.161e82026ac2ae03ab6f.js.map


+ 3 - 3
package-lock.json

@@ -267,7 +267,7 @@
     },
     "node_modules/@microsoft/fetch-event-source": {
       "version": "2.0.1",
-      "resolved": "https://registry.npmmirror.com/@microsoft/fetch-event-source/-/fetch-event-source-2.0.1.tgz",
+      "resolved": "https://registry.npmjs.org/@microsoft/fetch-event-source/-/fetch-event-source-2.0.1.tgz",
       "integrity": "sha512-W6CLUJ2eBMw3Rec70qrsEW0jOm/3twwJv21mrmj2yORiaVmVYGS4sSS5yUwvQc1ZlDLYGPnClVWmUUMagKNsfA=="
     },
     "node_modules/@mixmark-io/domino": {
@@ -19581,7 +19581,7 @@
     },
     "@microsoft/fetch-event-source": {
       "version": "2.0.1",
-      "resolved": "https://registry.npmmirror.com/@microsoft/fetch-event-source/-/fetch-event-source-2.0.1.tgz",
+      "resolved": "https://registry.npmjs.org/@microsoft/fetch-event-source/-/fetch-event-source-2.0.1.tgz",
       "integrity": "sha512-W6CLUJ2eBMw3Rec70qrsEW0jOm/3twwJv21mrmj2yORiaVmVYGS4sSS5yUwvQc1ZlDLYGPnClVWmUUMagKNsfA=="
     },
     "@mixmark-io/domino": {
@@ -22263,7 +22263,7 @@
         },
         "@microsoft/fetch-event-source": {
           "version": "2.0.1",
-          "resolved": "https://registry.npmmirror.com/@microsoft/fetch-event-source/-/fetch-event-source-2.0.1.tgz",
+          "resolved": "https://registry.npmjs.org/@microsoft/fetch-event-source/-/fetch-event-source-2.0.1.tgz",
           "integrity": "sha512-W6CLUJ2eBMw3Rec70qrsEW0jOm/3twwJv21mrmj2yORiaVmVYGS4sSS5yUwvQc1ZlDLYGPnClVWmUUMagKNsfA=="
         },
         "@mixmark-io/domino": {

+ 10 - 1
src/assets/css/button.css

@@ -366,7 +366,8 @@
 .pub_test_btn_time::before,
 .pub_test_btn_file::before,
 .pub_test_btn_sweep::before,
-.pub_test_btn_number::before {
+.pub_test_btn_number::before,
+.pub_test_btn_clockIn::before {
   content: "";
   width: 18px;
   height: 18px;
@@ -414,6 +415,10 @@
 	background-image: url(../icon/test/type_number_icon.png);
 }
 
+.pub_test_btn_clockIn::before{
+	background-image: url(../icon/test/type_clockIn_icon.png);
+}
+
 .test_icon{
   display: inline-block;
   width: 18px;
@@ -455,6 +460,10 @@
   background-image: url('../icon/test/type_number_icon.png');
 }
 
+.test_icon_clockIn{
+  background-image: url('../icon/test/type_clockIn_icon.png');
+}
+
 .dataBoard_check_box {
   display: flex;
   align-items: center;

BIN
src/assets/icon/test/type_clockIn_icon.png


+ 62 - 20
src/components/pages/aiAddCourse/addCourse.vue

@@ -152,7 +152,7 @@
                         </el-radio-group>
                       </div>
                       <div class="both">
-                        <div class="choose">
+                        <div class="choose" v-if="oid != '91796dfb-8791-11ef-9b30-005056b86db5'">
                           <div class="all_choose" v-for="(item, index) in CourseType[0]" :key="index">
                             <span v-if="
                               CourseTypeJson[item.id].length > 0 &&
@@ -4260,25 +4260,7 @@
                                           </div>
                                         </div>
                                       </div> -->
-                                  <div class="tool" :class="{
-                                    isToolChoose:
-                                      itemTool.tool.indexOf(72) != -1,
-                                  }" @click="
-                                    addTools(72, itemTaskIndex, toolIndex)
-                                    ">
-                                    <div class="whiteBIcon" @click.stop="
-                                      openTools(itemTaskIndex, 72, toolIndex)
-                                      ">
-                                      <img src="../../../assets/icon/firstToolList/appStore.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(72) != -1">
-                                      <img src="../../../assets/icon/new/isToolC.png" alt="" />
-                                    </div>
-                                  </div>
+                                  
                                 </div>
                                 <div class="toolSort" v-if="itemTool.toolType == 1">
                                   <div class="tool" :class="{
@@ -4958,6 +4940,48 @@
                                       <img src="../../../assets/icon/new/isToolC.png" alt="" />
                                     </div>
                                   </div>
+                                  <div class="tool" :class="{
+                                    isToolChoose:
+                                      itemTool.tool.indexOf(72) != -1,
+                                  }" @click="
+                                    addTools(72, itemTaskIndex, toolIndex)
+                                    ">
+                                    <div class="whiteBIcon" @click.stop="
+                                      openTools(itemTaskIndex, 72, toolIndex)
+                                      ">
+                                      <img 
+                                      style="object-fit: cover;height: 60px;"
+
+                                            :src="unitJson[unitIndex].chapterInfo[0].taskJson[itemTaskIndex].toolChoose[toolIndex].appJson ?
+                                            unitJson[unitIndex].chapterInfo[0].taskJson[itemTaskIndex].toolChoose[toolIndex].appJson.json.icon :
+                                            require('../../../assets/icon/firstToolList/appStore.png')"
+                                          alt />
+                                       
+                                        <div style="margin: 5px 0" >
+                                            <div 
+                                              v-if="unitJson[unitIndex].chapterInfo[0].taskJson[itemTaskIndex].toolChoose[toolIndex].appJson"
+                                              >
+                                              <el-tooltip class="item" effect="dark" 
+                                                :content="unitJson[unitIndex].chapterInfo[0].taskJson[itemTaskIndex].toolChoose[toolIndex].appJson.name" 
+                                                placement="top">
+                                                  <div class="Ovh">
+                                                    {{unitJson[unitIndex].chapterInfo[0].taskJson[itemTaskIndex].toolChoose[toolIndex].appJson.name}}
+                                                  </div>
+                                              </el-tooltip>
+                                            </div>
+                                          
+                                            <span v-else>
+                                              应用中心
+                                            </span>
+                                        </div>
+                                    </div>
+                                    <div class="noCTool">
+                                      <img src="../../../assets/icon/new/isToolC.png" alt="" />
+                                    </div>
+                                    <div class="isCTool" v-if="itemTool.tool.indexOf(72) != -1">
+                                      <img src="../../../assets/icon/new/isToolC.png" alt="" />
+                                    </div>
+                                  </div>
                                 </div>
                                 <div class="toolSort" v-if="itemTool.toolType == 7">
                                   <div class="tool" :class="{
@@ -14548,6 +14572,10 @@ ${_this.unitJson[0].chapterInfo[0].taskJson[index].taskDetail3.replaceAll('#',''
         this.$forceUpdate();
         this.$refs.appDialog.openG(appJson,this.unitIndex,itemTaskIndex,toolIndex);
       }
+      if(this.unitJson[this.unitIndex].chapterInfo[0].taskJson[itemTaskIndex].toolChoose[toolIndex].tool[0] != 72 
+          && !!this.unitJson[this.unitIndex].chapterInfo[0].taskJson[itemTaskIndex].toolChoose[toolIndex].appJson){
+            this.unitJson[this.unitIndex].chapterInfo[0].taskJson[itemTaskIndex].toolChoose[toolIndex].appJson = null
+      }
     },
     setEnglishVoiceJson(val) {
       this.unitJson[this.unitIndex].chapterInfo[0].taskJson[
@@ -14827,6 +14855,11 @@ ${_this.unitJson[0].chapterInfo[0].taskJson[index].taskDetail3.replaceAll('#',''
           itemTaskIndex
         ].toolChoose[toolIndex].tool.push(i);
       }
+
+      if(this.unitJson[this.unitIndex].chapterInfo[0].taskJson[itemTaskIndex].toolChoose[toolIndex].tool[0] != 72 
+          && !!this.unitJson[this.unitIndex].chapterInfo[0].taskJson[itemTaskIndex].toolChoose[toolIndex].appJson){
+            this.unitJson[this.unitIndex].chapterInfo[0].taskJson[itemTaskIndex].toolChoose[toolIndex].appJson = null
+      }
       this.$forceUpdate();
     },
     addAskList(index) {
@@ -31001,4 +31034,13 @@ ol {
   align-items: center;
   cursor: pointer;
 }
+.Ovh{
+  width: 4em;
+  -webkit-line-clamp: 2;
+  text-align: center;
+  display: -webkit-box;
+  -webkit-box-orient: vertical;
+  overflow: hidden;
+  text-overflow: ellipsis;           
+}
 </style>

+ 61 - 20
src/components/pages/aiEasy/addCourse.vue

@@ -148,7 +148,7 @@
                         </el-radio-group>
                       </div>
                       <div class="both">
-                        <div class="choose">
+                        <div class="choose" v-if="oid != '91796dfb-8791-11ef-9b30-005056b86db5'">
                           <div class="all_choose" v-for="(item, index) in CourseType[0]" :key="index">
                             <span v-if="
                               CourseTypeJson[item.id].length > 0 &&
@@ -3818,25 +3818,7 @@
                                     </div>
                                   </div>
                                 </div> -->
-                                <div class="tool" :class="{
-                                      isToolChoose:
-                                        itemTool.tool.indexOf(72) != -1,
-                                    }" @click="
-                                      addTools(72, itemTaskIndex, toolIndex)
-                                      ">
-                                      <div class="whiteBIcon" @click.stop="
-                                        openTools(itemTaskIndex, 72, toolIndex)
-                                        ">
-                                        <img src="../../../assets/icon/firstToolList/appStore.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(72) != -1">
-                                        <img src="../../../assets/icon/new/isToolC.png" alt="" />
-                                      </div>
-                                  </div>
+    
                                 </div>
                                 <div class="toolSort" v-if="itemTool.toolType == 1">
                                   <div class="tool" :class="{
@@ -4516,6 +4498,48 @@
                                       <img src="../../../assets/icon/new/isToolC.png" alt="" />
                                     </div>
                                   </div>
+                                  <div class="tool" :class="{
+                                      isToolChoose:
+                                        itemTool.tool.indexOf(72) != -1,
+                                    }" @click="
+                                      addTools(72, itemTaskIndex, toolIndex)
+                                      ">
+                                      <div class="whiteBIcon" @click.stop="
+                                        openTools(itemTaskIndex, 72, toolIndex)
+                                        ">
+                                        <img 
+                                        style="object-fit: cover;height: 60px;"
+
+                                            :src="unitJson[unitIndex].chapterInfo[0].taskJson[itemTaskIndex].toolChoose[toolIndex].appJson ?
+                                            unitJson[unitIndex].chapterInfo[0].taskJson[itemTaskIndex].toolChoose[toolIndex].appJson.json.icon :
+                                            require('../../../assets/icon/firstToolList/appStore.png')"
+                                          alt />
+                                       
+                                        <div style="margin: 5px 0" >
+                                            <div 
+                                              v-if="unitJson[unitIndex].chapterInfo[0].taskJson[itemTaskIndex].toolChoose[toolIndex].appJson"
+                                              >
+                                              <el-tooltip class="item" effect="dark" 
+                                                :content="unitJson[unitIndex].chapterInfo[0].taskJson[itemTaskIndex].toolChoose[toolIndex].appJson.name" 
+                                                placement="top">
+                                                  <div class="Ovh">
+                                                    {{unitJson[unitIndex].chapterInfo[0].taskJson[itemTaskIndex].toolChoose[toolIndex].appJson.name}}
+                                                  </div>
+                                              </el-tooltip>
+                                            </div>
+                                          
+                                            <span v-else>
+                                              应用中心
+                                            </span>
+                                        </div>
+                                      </div>
+                                      <div class="noCTool">
+                                        <img src="../../../assets/icon/new/isToolC.png" alt="" />
+                                      </div>
+                                      <div class="isCTool" v-if="itemTool.tool.indexOf(72) != -1">
+                                        <img src="../../../assets/icon/new/isToolC.png" alt="" />
+                                      </div>
+                                  </div>
                                 </div>
                                 <div class="toolSort" v-if="itemTool.toolType == 7">
                                   <div class="tool" :class="{
@@ -13755,6 +13779,10 @@ ${_this.unitJson[0].chapterInfo[0].taskJson[index].taskDetail3.replaceAll('#',''
         this.$forceUpdate();
         this.$refs.appDialog.openG(appJson,this.unitIndex,itemTaskIndex,toolIndex);
       }
+      if(this.unitJson[this.unitIndex].chapterInfo[0].taskJson[itemTaskIndex].toolChoose[toolIndex].tool[0] != 72 
+          && !!this.unitJson[this.unitIndex].chapterInfo[0].taskJson[itemTaskIndex].toolChoose[toolIndex].appJson){
+            this.unitJson[this.unitIndex].chapterInfo[0].taskJson[itemTaskIndex].toolChoose[toolIndex].appJson = null
+      }
     },
     setEnglishVoiceJson(val) {
       this.unitJson[this.unitIndex].chapterInfo[0].taskJson[
@@ -14034,6 +14062,10 @@ ${_this.unitJson[0].chapterInfo[0].taskJson[index].taskDetail3.replaceAll('#',''
           itemTaskIndex
         ].toolChoose[toolIndex].tool.push(i);
       }
+      if(this.unitJson[this.unitIndex].chapterInfo[0].taskJson[itemTaskIndex].toolChoose[toolIndex].tool[0] != 72 
+          && !!this.unitJson[this.unitIndex].chapterInfo[0].taskJson[itemTaskIndex].toolChoose[toolIndex].appJson){
+            this.unitJson[this.unitIndex].chapterInfo[0].taskJson[itemTaskIndex].toolChoose[toolIndex].appJson = null
+      }
       this.$forceUpdate();
     },
     addAskList(index) {
@@ -30265,4 +30297,13 @@ ol {
   /* right: 45px; */
   bottom: 20px;
 }
+.Ovh{
+  width: 4em;
+  -webkit-line-clamp: 2;
+  text-align: center;
+  display: -webkit-box;
+  -webkit-box-orient: vertical;
+  overflow: hidden;
+  text-overflow: ellipsis;           
+}
 </style>

+ 2 - 0
src/components/pages/classroomObservation/components/analysisTemplateDialog.vue

@@ -619,6 +619,8 @@ export default {
           let _data = res.data[0][0];
           if (_data) {
             _data.tips = JSON.parse(_data.tips);
+            _data.tips.sort((a,b)=>a.tIndex - b.tIndex);
+            _data.tips.sort((a,b)=>a.Type - b.Type);
             this.analysisDetail = _data;
 						let tagList = this.analysisDetail.tips.find(i=>i.isOtherData);
 						if(tagList){

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

@@ -276,7 +276,7 @@ export default {
     },
 		checkUseTemplate(){
 			return new Promise(resolve => {
-				if(this.bmData && this.bmData.jsonData.editorBarData){
+				if(this.bmData && this.bmData.jsonData && this.bmData.jsonData.editorBarData){
 					if(this.bmData.jsonData.editorBarData && (this.bmData.jsonData.editorBarData.content || this.bmData.jsonData.editorBarData.url)){
 						this.$confirm("是否保留本课堂的转录文稿数据至新课堂?","提示").then(_ => {
 							window.localStorage.setItem("saveEditorBarData",JSON.stringify({editorBarData:this.bmData.jsonData.editorBarData,fileId:this.fileId}));

+ 2 - 2
src/components/pages/components/appDialog.vue

@@ -948,7 +948,7 @@ export default {
 
 .ac_c_item {
   width: calc(100% / 4 - (15px * 4) / 4);
-  height: 260px;
+  height: 250px;
   background-color: #fff;
   border-radius: 10px;
   /* box-shadow: 0 0 10px 0 rgba(0, 0, 0, 0.1); */
@@ -1073,7 +1073,7 @@ export default {
 }
 
 .ac_c_i_t_r_top {
-  height: 40px;
+  height: 30px;
   display: flex;
   align-items: flex-end;
   justify-content: space-between;

+ 3 - 4
src/components/pages/components/exportDataDialog.vue

@@ -2617,10 +2617,10 @@ export default {
             if (
               data.choices &&
               data.choices.length &&
-              data.choices[0].messagea
+              data.choices[0].message
             ) {
               let content = data.choices[0].message.content;
-              this.AiAnlysisCon2.allFx = content.replaceAll("<br>", "");
+              this.AiAnalysisCon2.allFx = content.replaceAll("<br>", "");
             }
 
             this.loading = false;
@@ -3187,11 +3187,10 @@ export default {
         .then(response => {
           let data = response.data.FunctionResponse;
           console.log("data", data);
-          let md = new MarkdownIt();
+          // let md = new MarkdownIt(); 
 
           if (data.choices && data.choices.length && data.choices[0].message) {
             let content = data.choices[0].message.content;
-
             this.AiAnalysisCon2.allFx = content.replaceAll("<br>", "");
 
             this.AiAnalysisCon2Copy.allFx = this.AiAnalysisCon2.allFx;

+ 1 - 1
src/components/pages/course.vue

@@ -75,7 +75,7 @@
           </el-radio-group>
         </div>
         <div class="choose">
-          <div class="all_choose" v-for="(item, index) in CourseType[0]" :key="index"
+          <div v-if="oid != '91796dfb-8791-11ef-9b30-005056b86db5'" class="all_choose" v-for="(item, index) in CourseType[0]" :key="index"
             :style="{ margin: !CourseTypeJson[item.id].length && 0 }">
             <span v-if="CourseTypeJson[item.id].length &&
               (oid == '69893dca-1d47-11ed-8c78-005056b86db5'

+ 63 - 20
src/components/pages/easy/addCourse.vue

@@ -63,7 +63,7 @@
                         </el-radio-group>
                       </div>
                       <div class="both">
-                        <div class="choose">
+                        <div class="choose" v-if="oid != '91796dfb-8791-11ef-9b30-005056b86db5'">
                           <div class="all_choose" v-for="(item, index) in CourseType[0]" :key="index">
                             <span v-if="CourseTypeJson[item.id].length > 0 &&
                               (oid == '69893dca-1d47-11ed-8c78-005056b86db5'
@@ -737,25 +737,7 @@
                                     </div>
                                   </div>
                                 </div> -->
-                                 <div class="tool" :class="{
-                                      isToolChoose:
-                                        itemTool.tool.indexOf(72) != -1,
-                                    }" @click="
-                                      addTools(72, itemTaskIndex, toolIndex)
-                                      ">
-                                      <div class="whiteBIcon" @click.stop="
-                                        openTools(itemTaskIndex, 72, toolIndex)
-                                        ">
-                                        <img src="../../../assets/icon/firstToolList/appStore.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(72) != -1">
-                                        <img src="../../../assets/icon/new/isToolC.png" alt="" />
-                                      </div>
-                                  </div>
+                                
                               </div>
                               <div class="toolSort" v-if="itemTool.toolType == 1">
                                 <div class="tool" :class="{ isToolChoose: itemTool.tool.indexOf(7) != -1 }"
@@ -1347,6 +1329,47 @@
                                   <div class="isCTool" v-if="itemTool.tool.indexOf(71) != -1"><img
                                       src="../../../assets/icon/new/isToolC.png" alt="" /></div>
                                 </div>
+                                <div class="tool" :class="{
+                                      isToolChoose:
+                                        itemTool.tool.indexOf(72) != -1,
+                                    }" @click="
+                                      addTools(72, itemTaskIndex, toolIndex)
+                                      ">
+                                      <div class="whiteBIcon" @click.stop="
+                                        openTools(itemTaskIndex, 72, toolIndex)
+                                        ">
+                                          <img 
+                                            style="object-fit: cover;height: 80px;"
+                                            :src="unitJson[unitIndex].chapterInfo[0].taskJson[itemTaskIndex].toolChoose[toolIndex].appJson ?
+                                            unitJson[unitIndex].chapterInfo[0].taskJson[itemTaskIndex].toolChoose[toolIndex].appJson.json.icon :
+                                            require('../../../assets/icon/firstToolList/appStore.png')"
+                                          alt />
+                                       
+                                        <div style="margin: 5px 0" >
+                                            <div 
+                                              v-if="unitJson[unitIndex].chapterInfo[0].taskJson[itemTaskIndex].toolChoose[toolIndex].appJson"
+                                              >
+                                              <el-tooltip class="item" effect="dark" 
+                                                :content="unitJson[unitIndex].chapterInfo[0].taskJson[itemTaskIndex].toolChoose[toolIndex].appJson.name" 
+                                                placement="top">
+                                                  <div class="Ovh">
+                                                    {{unitJson[unitIndex].chapterInfo[0].taskJson[itemTaskIndex].toolChoose[toolIndex].appJson.name}}
+                                                  </div>
+                                              </el-tooltip>
+                                            </div>
+                                          
+                                            <span v-else>
+                                              应用中心
+                                            </span>
+                                        </div>
+                                      </div>
+                                      <div class="noCTool">
+                                        <img src="../../../assets/icon/new/isToolC.png" alt="" />
+                                      </div>
+                                      <div class="isCTool" v-if="itemTool.tool.indexOf(72) != -1">
+                                        <img src="../../../assets/icon/new/isToolC.png" alt="" />
+                                      </div>
+                                  </div>
                               </div>
                               <div class="toolSort" v-if="itemTool.toolType == 5">
                                 <div class="tool" :class="{ isToolChoose: itemTool.tool.indexOf(28) != -1 }"
@@ -7828,6 +7851,12 @@ export default {
         this.$forceUpdate();
         this.$refs.appDialog.openG(appJson,this.unitIndex,itemTaskIndex,toolIndex);
       }
+
+      if(this.unitJson[this.unitIndex].chapterInfo[0].taskJson[itemTaskIndex].toolChoose[toolIndex].tool[0] != 72 
+          && !!this.unitJson[this.unitIndex].chapterInfo[0].taskJson[itemTaskIndex].toolChoose[toolIndex].appJson){
+            this.unitJson[this.unitIndex].chapterInfo[0].taskJson[itemTaskIndex].toolChoose[toolIndex].appJson = null
+      }
+
     },
     setEnglishVoiceJson(val){
       this.unitJson[this.unitIndex].chapterInfo[0].taskJson[this.taskCount].toolChoose[this.toolIndex].englishVoiceJson = JSON.parse(JSON.stringify(val))
@@ -8103,6 +8132,11 @@ export default {
           itemTaskIndex
         ].toolChoose[toolIndex].tool.push(i);
       }
+
+      if(this.unitJson[this.unitIndex].chapterInfo[0].taskJson[itemTaskIndex].toolChoose[toolIndex].tool[0] != 72 
+          && !!this.unitJson[this.unitIndex].chapterInfo[0].taskJson[itemTaskIndex].toolChoose[toolIndex].appJson){
+            this.unitJson[this.unitIndex].chapterInfo[0].taskJson[itemTaskIndex].toolChoose[toolIndex].appJson = null
+      }
       this.$forceUpdate();
     },
     addAskList(index) {
@@ -14024,4 +14058,13 @@ ol {
 .text_panel >>> .text{
   height: 400px;
 }
+.Ovh{
+  width: 4em;
+  -webkit-line-clamp: 2;
+  text-align: center;
+  display: -webkit-box;
+  -webkit-box-orient: vertical;
+  overflow: hidden;
+  text-overflow: ellipsis;           
+}
 </style>

+ 61 - 20
src/components/pages/newCourse/addCourse.vue

@@ -210,7 +210,7 @@
                         </el-radio-group>
                       </div>
                       <div class="both">
-                        <div class="choose">
+                        <div class="choose" v-if="oid != '91796dfb-8791-11ef-9b30-005056b86db5'">
                           <div
                             class="all_choose"
                             v-for="(item, index) in CourseType[0]"
@@ -2342,25 +2342,7 @@
                                           </div>
                                         </div>
                                       </div> -->
-                                  <div class="tool" :class="{
-                                    isToolChoose:
-                                      itemTool.tool.indexOf(72) != -1,
-                                  }" @click="
-                                    addTools(72, itemTaskIndex, toolIndex)
-                                    ">
-                                    <div class="whiteBIcon" @click.stop="
-                                      openTools(itemTaskIndex, 72, toolIndex)
-                                      ">
-                                      <img src="../../../assets/icon/firstToolList/appStore.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(72) != -1">
-                                      <img src="../../../assets/icon/new/isToolC.png" alt="" />
-                                    </div>
-                                  </div>
+                                 
                                 </div>
                                 <div
                                   class="toolSort"
@@ -3451,6 +3433,47 @@
                                       />
                                     </div>
                                   </div>
+                                  <div class="tool" :class="{
+                                    isToolChoose:
+                                      itemTool.tool.indexOf(72) != -1,
+                                  }" @click="
+                                    addTools(72, itemTaskIndex, toolIndex)
+                                    ">
+                                    <div class="whiteBIcon" @click.stop="
+                                      openTools(itemTaskIndex, 72, toolIndex)
+                                      ">
+                                          <img 
+                                          style="object-fit: cover;height: 80px;"
+                                            :src="unitJson[unitIndex].chapterInfo[0].taskJson[itemTaskIndex].toolChoose[toolIndex].appJson ?
+                                            unitJson[unitIndex].chapterInfo[0].taskJson[itemTaskIndex].toolChoose[toolIndex].appJson.json.icon :
+                                            require('../../../assets/icon/firstToolList/appStore.png')"
+                                          alt />
+                                       
+                                        <div style="margin: 5px 0" >
+                                            <div 
+                                              v-if="unitJson[unitIndex].chapterInfo[0].taskJson[itemTaskIndex].toolChoose[toolIndex].appJson"
+                                              >
+                                              <el-tooltip class="item" effect="dark" 
+                                                :content="unitJson[unitIndex].chapterInfo[0].taskJson[itemTaskIndex].toolChoose[toolIndex].appJson.name" 
+                                                placement="top">
+                                                  <div class="Ovh">
+                                                    {{unitJson[unitIndex].chapterInfo[0].taskJson[itemTaskIndex].toolChoose[toolIndex].appJson.name}}
+                                                  </div>
+                                              </el-tooltip>
+                                            </div>
+                                          
+                                            <span v-else>
+                                              应用中心
+                                            </span>
+                                        </div>
+                                    </div>
+                                    <div class="noCTool">
+                                      <img src="../../../assets/icon/new/isToolC.png" alt="" />
+                                    </div>
+                                    <div class="isCTool" v-if="itemTool.tool.indexOf(72) != -1">
+                                      <img src="../../../assets/icon/new/isToolC.png" alt="" />
+                                    </div>
+                                  </div>
                                 </div>
                                 <div
                                   class="toolSort"
@@ -11505,6 +11528,10 @@ export default {
         this.$forceUpdate();
         this.$refs.appDialog.openG(appJson,this.unitIndex,itemTaskIndex,toolIndex);
       }
+      if(this.unitJson[this.unitIndex].chapterInfo[0].taskJson[itemTaskIndex].toolChoose[toolIndex].tool[0] != 72 
+          && !!this.unitJson[this.unitIndex].chapterInfo[0].taskJson[itemTaskIndex].toolChoose[toolIndex].appJson){
+            this.unitJson[this.unitIndex].chapterInfo[0].taskJson[itemTaskIndex].toolChoose[toolIndex].appJson = null
+      }
     },
     setEnglishVoiceJson(val) {
       this.unitJson[this.unitIndex].chapterInfo[0].taskJson[
@@ -11784,6 +11811,11 @@ export default {
           itemTaskIndex
         ].toolChoose[toolIndex].tool.push(i);
       }
+
+      if(this.unitJson[this.unitIndex].chapterInfo[0].taskJson[itemTaskIndex].toolChoose[toolIndex].tool[0] != 72 
+          && !!this.unitJson[this.unitIndex].chapterInfo[0].taskJson[itemTaskIndex].toolChoose[toolIndex].appJson){
+            this.unitJson[this.unitIndex].chapterInfo[0].taskJson[itemTaskIndex].toolChoose[toolIndex].appJson = null
+      }
       this.$forceUpdate();
     },
     addAskList(index) {
@@ -18620,4 +18652,13 @@ ol {
 .text_panel >>> .text{
   height: 400px;
 }
+.Ovh{
+  width: 4em;
+  -webkit-line-clamp: 2;
+  text-align: center;
+  display: -webkit-box;
+  -webkit-box-orient: vertical;
+  overflow: hidden;
+  text-overflow: ellipsis;           
+}
 </style>

+ 3 - 2
src/components/pages/sassPlatform/index.vue

@@ -6,7 +6,7 @@
       </div> -->
       <div class="sp_h_tagArea">
         <span :class="{tagActive:tagIndex==0}" @click="tagIndex = 0">应用中心</span>
-        <span :class="{tagActive:tagIndex==1}" @click="goTestSmarter()">智能分析</span>
+        <span :class="{tagActive:tagIndex==1}" @click="goTestSmarter()">智能助手</span>
       </div>
     </div>
     <div class="sp_bottom">
@@ -119,7 +119,8 @@ export default {
           this.org +
           "&role=" +
           this.role+
-          "&cid=undefined"
+          "&cid=undefined"+
+          "&back=sass"
       );
     },
   },

+ 42 - 10
src/components/pages/sassPlatform/view/tableView.vue

@@ -34,6 +34,7 @@
         v-if="tagIndex == 0 && !tableLoading"
         :data="showTableData"
         border
+        height="100%"
         style="width: 100%"
       >
         <el-table-column
@@ -65,7 +66,7 @@
           </div>
         </template>
       </el-table-column>
-        <el-table-column prop="look" width="150" label="表单状态">
+        <el-table-column prop="look" width="150" label="表单状态" :filters="statusFilterList" :filter-method="statusFilterFn">
           <template slot-scope="scope">
             <span>{{ getLook(scope.row) }}</span>
           </template>
@@ -165,6 +166,7 @@
         v-if="tagIndex == 1 && !tableLoading"
         :data="showTableData"
         border
+        height="100%"
         style="width: 100%"
       >
         <el-table-column
@@ -202,11 +204,13 @@
           prop="worksCount"
           width="200"
           label="已提交数量"
+          sortable
         ></el-table-column>
         <el-table-column
           prop="testCount"
           width="200"
           label="已完成表单"
+          sortable
         ></el-table-column>
 
         <el-table-column fixed="right" label="操作" min-width="100">
@@ -214,7 +218,7 @@
             <div class="tableBtnArea"> <el-tooltip
               class="item"
               effect="light"
-              content="删除"
+              content="查看"
               placement="top"
             >
               <img
@@ -269,6 +273,22 @@ export default {
         text:"所有人",
         value:4
       }],
+      statusFilterList:[{
+        text:"未发布",
+        value:"未发布"
+      },{
+        text:"逾期",
+        value:"逾期"
+      },{
+        text:"进行中",
+        value:"进行中"
+      },{
+        text:"未进行",
+        value:"未进行"
+      },{
+        text:"已完成",
+        value:"已完成"
+      }],
     };
   },
   computed: {
@@ -393,6 +413,7 @@ export default {
       }
     },
     getFormData() {
+      const cardType = this.tagIndex;
       let params = {
         uid: this.userId,
         type: this.displayRange,
@@ -408,6 +429,7 @@ export default {
       this.ajax
         .get(this.$store.state.api + "selectTesttCourse_sass", params)
         .then(res => {
+          if(cardType!=this.tagIndex)return;
           let _data = res.data[0];
           if (_data.length > 0) {
             this.tableData = _data;
@@ -422,6 +444,7 @@ export default {
         });
     },
     getPersonData() {
+      const cardType = this.tagIndex;
       let params = {
         oid: this.oid,
         org: this.org,
@@ -432,6 +455,7 @@ export default {
       this.ajax
         .get(this.$store.state.api + "selectTesttCourse2_sass", params)
         .then(res => {
+          if(cardType!=this.tagIndex)return;
           let _data = res.data[0];
           let _teaType = res.data[1];
           let _teaType2 = res.data[2];
@@ -471,6 +495,9 @@ export default {
     typeFilterFn(value,row){
       return row.typeid && value.indexOf(row.typeid)!=-1;
     },
+    statusFilterFn(value,row){
+      return this.getLook(row) == value;
+    },
     creatorFilterFn(value){
       this.displayRange = value;
       this.getData();
@@ -480,14 +507,15 @@ export default {
         "/checkToTest2?uid=" +
           uid +
           "&userid=" +
-          this.userid +
+          this.userId +
           "&oid=" +
           this.oid +
           "&org=" +
           this.org +
           "&type=2" +
           "&role=" +
-          this.role
+          this.role +
+          "&back=sass"
       );
     },
     editForm(item) {
@@ -506,14 +534,15 @@ export default {
               "/addTest?cid=" +
                 item.courseId +
                 "&userid=" +
-                this.userid +
+                this.userId +
                 "&oid=" +
                 this.oid +
                 "&org=" +
                 this.org +
                 "&type=2" +
                 "&role=" +
-                this.role
+                this.role +
+                "&back=sass"
             );
           })
           .catch(() => {
@@ -524,14 +553,15 @@ export default {
           "/addTest?cid=" +
             item.courseId +
             "&userid=" +
-            this.userid +
+            this.userId +
             "&oid=" +
             this.oid +
             "&org=" +
             this.org +
             "&type=2" +
             "&role=" +
-            this.role
+            this.role +
+            "&back=sass"
         );
       }
     },
@@ -547,7 +577,8 @@ export default {
           this.org +
           "&type=2" +
           "&role=" +
-          this.role
+          this.role +
+          "&back=sass"
       );
     },
     copyForm(courseId) {
@@ -612,7 +643,8 @@ export default {
           "&role=" +
           this.role +
           "&typeId1=" +
-          this.typeId
+          this.typeId +
+          "&back=sass"
       );
     }
   },

+ 124 - 38
src/components/pages/test/add/addTest.vue

@@ -5,7 +5,7 @@
                 <div class="courseTop">
                     <div class="stepsNav">
                         <el-breadcrumb separator-class="el-icon-arrow-right">
-                            <el-breadcrumb-item :to="{
+                            <el-breadcrumb-item v-if="!back" :to="{
                                 path:
                                     '/test?userid=' +
                                     userid +
@@ -16,6 +16,17 @@
                                     '&role=' +
                                     role,
                             }">表单管理</el-breadcrumb-item>
+                            <el-breadcrumb-item v-else-if="back=='sass'" :to="{
+                                path:
+                                    '/sassPlatform?userid=' +
+                                    userid +
+                                    '&oid=' +
+                                    oid +
+                                    '&org=' +
+                                    org +
+                                    '&role=' +
+                                    role,
+                            }">sass平台</el-breadcrumb-item>
                             <el-breadcrumb-item>
                                 <span style="color: rgb(15, 126, 255)">新建表单</span>
                             </el-breadcrumb-item>
@@ -59,6 +70,7 @@ export default {
             org: this.$route.query.org,
             role: this.$route.query.role,
             cid: this.$route.query.cid,
+            back: this.$route.query.back,
             steps: 2,
             title: "",
             testType: [],
@@ -92,7 +104,7 @@ export default {
             //     this.$message.error("请选择权限")
             //     this.steps = 1
             //     return
-            // } 
+            // }
             if (this.cid) {
                 this.updateWork(this.look)
             } else {
@@ -103,41 +115,16 @@ export default {
     methods: {
         retrunCourse() {
             this
-                .$confirm("是否保存已编辑内容?", "提示", {
-                    confirmButtonText: "保存",
-                    cancelButtonText: "不保存",
+                .$confirm("退出当前页面将不保存已编辑内容,是否确定返回", "提示", {
+                    confirmButtonText: "确定",
+                    cancelButtonText: "取消",
                     distinguishCancelAndClose: true,
                     type: "warning",
                 })
                 .then(() => {
-                    if (this.cid == "" || this.cid == undefined) {
-                        if (this.title == "") {
-                            this.$message.error("请补充填写课程名称");
-                            return;
-                        } else {
-                            this.addWork(5);
-                        }
-                        // else if(!this.juriList.length){
-                        //     this.$message.error("请选择权限")
-                        //     return
-                        // }
-                    } else {
-                        if (this.title == "") {
-                            this.$message.error("请补充填写课程名称");
-                            return;
-                        } else {
-                            this.updateWork(5);
-                        }
-                        // else if(!this.juriList.length){
-                        //     this.$message.error("请选择权限")
-                        //     return
-                        // }
-                    }
-                })
-                .catch((v) => {
-                    console.log(v)
-                    if (v == "cancel") {
-                        this.goTo(
+                  console.log(this.back)
+                        if(!this.back){
+                          this.goTo(
                             "/test?userid=" +
                             this.userid +
                             "&oid=" +
@@ -147,7 +134,67 @@ export default {
                             "&role=" +
                             this.role
                         );
-                    }
+                        }else if(this.back == 'sass'){
+                          this.goTo(
+                            "/sassPlatform?userid=" +
+                            this.userid +
+                            "&oid=" +
+                            this.oid +
+                            "&org=" +
+                            this.org +
+                            "&role=" +
+                            this.role
+                        );
+                        }
+                    // if (this.cid == "" || this.cid == undefined) {
+                    //     if (this.title == "") {
+                    //         this.$message.error("请补充填写课程名称");
+                    //         return;
+                    //     } else {
+                    //         this.addWork(5);
+                    //     }
+                    //     // else if(!this.juriList.length){
+                    //     //     this.$message.error("请选择权限")
+                    //     //     return
+                    //     // }
+                    // } else {
+                    //     if (this.title == "") {
+                    //         this.$message.error("请补充填写课程名称");
+                    //         return;
+                    //     } else {
+                    //         this.updateWork(5);
+                    //     }
+                    //     // else if(!this.juriList.length){
+                    //     //     this.$message.error("请选择权限")
+                    //     //     return
+                    //     // }
+                    // }
+                })
+                .catch((v) => {
+                    console.log(v)
+                    // if (v == "cancel" && !this.back) {
+                    //     this.goTo(
+                    //         "/test?userid=" +
+                    //         this.userid +
+                    //         "&oid=" +
+                    //         this.oid +
+                    //         "&org=" +
+                    //         this.org +
+                    //         "&role=" +
+                    //         this.role
+                    //     );
+                    // }else if(this.back == 'sass'){
+                    //   this.goTo(
+                    //         "/sassPlatform?userid=" +
+                    //         this.userid +
+                    //         "&oid=" +
+                    //         this.oid +
+                    //         "&org=" +
+                    //         this.org +
+                    //         "&role=" +
+                    //         this.role
+                    //     );
+                    // }
                 });
         },
         goTo(path) {
@@ -186,7 +233,8 @@ export default {
                     this.cid = res.data.courseId;
                     if (look == 5) {
                         this.$message.success("保存成功")
-                        this.goTo(
+                        if(!this.back){
+                          this.goTo(
                             "/test?userid=" +
                             this.userid +
                             "&oid=" +
@@ -196,6 +244,18 @@ export default {
                             "&role=" +
                             this.role
                         );
+                        }else if(back == 'sass'){
+                          this.goTo(
+                            "/sassPlatform?userid=" +
+                            this.userid +
+                            "&oid=" +
+                            this.oid +
+                            "&org=" +
+                            this.org +
+                            "&role=" +
+                            this.role
+                        );
+                        }
                     }
                     // setTimeout(() => {
                     //     this.getData(2);
@@ -248,7 +308,8 @@ export default {
                 .then((res) => {
                     if (look == 3) {
                         this.$message.success("发布成功")
-                        this.goTo(
+                        if(!this.back){
+                          this.goTo(
                             "/test?userid=" +
                             this.userid +
                             "&oid=" +
@@ -258,13 +319,26 @@ export default {
                             "&role=" +
                             this.role
                         );
+                        }else if(this.back == 'sass'){
+                          this.goTo(
+                            "/sassPlatform?userid=" +
+                            this.userid +
+                            "&oid=" +
+                            this.oid +
+                            "&org=" +
+                            this.org +
+                            "&role=" +
+                            this.role
+                        );
+                        }
                     } else if (look == 4) {
                         this.$message.success("保存成功")
                     } else if (look == 1 || look == 2) {
                         // this.$message.success("保存成功")
                     } else if (look == 5) {
                         this.$message.success("保存成功")
-                        this.goTo(
+                        if(!this.back){
+                          this.goTo(
                             "/test?userid=" +
                             this.userid +
                             "&oid=" +
@@ -274,6 +348,18 @@ export default {
                             "&role=" +
                             this.role
                         );
+                        }else if(this.back == 'sass'){
+                          this.goTo(
+                            "/sassPlatform?userid=" +
+                            this.userid +
+                            "&oid=" +
+                            this.oid +
+                            "&org=" +
+                            this.org +
+                            "&role=" +
+                            this.role
+                        );
+                        }
                     }
                     setTimeout(() => {
                         this.getData(2);
@@ -469,4 +555,4 @@ export default {
     padding: 0 20px;
     color: unset;
 }
-</style>
+</style>

+ 2 - 1
src/components/pages/test/add/components/addCheckPopover.vue

@@ -27,7 +27,8 @@
                   pub_test_btn_time: item.value == 8,
                   pub_test_btn_choose2: item.value == 9,
 									pub_test_btn_sweep: item.value == 12,
-                  pub_test_btn_number:item.value == 13
+                  pub_test_btn_number:item.value == 13,
+                  pub_test_btn_clockIn:item.value == 14
                 }"
               >
                 {{ item.label }}

+ 15 - 2
src/components/pages/test/add/components/checkOrder.vue

@@ -126,6 +126,9 @@
                                 <div v-if="item3.type == 13">
 																	<number :cJson="item3.json" :cJson2="cJson" @setJson="setJson" :index="`x${index1}-${index2}-${index3}`" :isOpen="item3.type == 13 && checkC === `x${index1}-${index2}-${index3}`"/>
 																</div>
+                                <div v-if="item3.type == 14">
+																	<punchQRcode :cJson="item3.json" :cJson2="cJson" @setJson="setJson" :index="`x${index1}-${index2}-${index3}`" :isOpen="item3.type == 14 && checkC === `x${index1}-${index2}-${index3}`"/>
+																</div>
                             </div>
 														<div class="addCheckBox" v-if="checkC === `x${index1}-${index2}-${index3}` && etype==='edit'" @click.stop="">
 															<addCheckPopover @addCheck="addCheck" @addQtype="addQtype"/>
@@ -175,6 +178,9 @@
                         <div v-else-if="item2.type == 13">
 													<number :cJson="item2.json" :cJson2="cJson" @setJson="setJson" :index="`x${index1}-${index2}`" :isOpen="item2.type == 13 && checkC === `x${index1}-${index2}`"/>
 												</div>
+                        <div v-else-if="item2.type == 14">
+													<punchQRcode :cJson="item2.json" :cJson2="cJson" @setJson="setJson" :index="`x${index1}-${index2}`" :isOpen="item2.type == 14 && checkC === `x${index1}-${index2}`"/>
+												</div>
                     </div>
 										<div class="addCheckBox" v-if="checkC === `x${index1}-${index2}` && etype==='edit'" @click.stop="">
 											<addCheckPopover @addCheck="addCheck" @addQtype="addQtype"/>
@@ -224,6 +230,9 @@
                 <div v-else-if="item1.type == 13">
 									<number :cJson="item1.json" :cJson2="cJson" @setJson="setJson" :index="`x${index1}`" :isOpen="item1.type == 13 && checkC === `x${index1}`"/>
 								</div>
+                <div v-else-if="item1.type == 14">
+									<punchQRcode :cJson="item1.json" :cJson2="cJson" @setJson="setJson" :index="`x${index1}`" :isOpen="item1.type == 14 && checkC === `x${index1}`"/>
+								</div>
             </div>
 						<div class="addCheckBox" v-if="checkC === `x${index1}` && etype==='edit'" @click.stop="">
 							<addCheckPopover @addCheck="addCheck" @addQtype="addQtype"/>
@@ -269,6 +278,7 @@ import courseX2 from './course2/course.vue'
 import addCheckPopover from './addCheckPopover.vue'
 import sweep from './sweep/index'
 import number from './number/index.vue'
+import punchQRcode from './punchQRcode/index.vue'
 export default {
     mixins: [minxinVue],
     components: {
@@ -288,7 +298,8 @@ export default {
         courseX2,
 				addCheckPopover,
 				sweep,
-        number
+        number,
+        punchQRcode
     },
     props: {
         checkJson: {
@@ -309,7 +320,7 @@ export default {
         return {
             manualJson: [],
             isdrag: "",
-            canEdit: [1, 3, 5, 6, 7, 8, 11,12,13],
+            canEdit: [1, 3, 5, 6, 7, 8, 11,12,13,14],
             ctype: "",
             dragType: "",
             oldIndex: "",
@@ -348,6 +359,8 @@ export default {
 												className += " test_icon_sweep"
 										}else if(item.type==13){
                         className += ' test_icon_number'
+                    }else if(item.type==14){
+                        className += ' test_icon_clockIn'
                     }
 										let itemType = item.type;
 										if(itemType===1){

+ 10 - 10
src/components/pages/test/add/components/evaBox/eva.vue

@@ -165,16 +165,16 @@ export default {
     }
   },
   mounted() {
-    // if (!this.cJson || Object.keys(this.cJson).length == 0) {
-    //   this.checkJson = {
-    //     title: "标题",
-    //     detail: "",
-    //     small: 0,
-    //     big: 10
-    //   };
-    // } else {
-    //   this.checkJson = this.depthCopy(this.cJson2);
-    // }
+    if (!this.cJson || Object.keys(this.cJson).length == 0) {
+      this.checkJson = {
+        title: "标题",
+        detail: "",
+        small: 0,
+        big: 10
+      };
+    } else {
+      this.checkJson = this.depthCopy(this.cJson);
+    }
   }
 };
 </script>

+ 204 - 0
src/components/pages/test/add/components/punchQRcode/index.vue

@@ -0,0 +1,204 @@
+<template>
+  <div class="c_box">
+    <div class="mask" v-if="!isOpen"></div>
+    <!-- <div v-if="!cJson">暂未设置题目</div> -->
+    <div class="punchQRcode">
+      <div class="title" style="display: flex;">
+        <span v-if="!updateList.title" @click.stop="updateTitle()">{{
+          cJson.title ? cJson.title : "输入问题"
+        }}</span>
+        <input
+          v-if="updateList.title"
+          ref="titleRef"
+          class="editInput"
+          v-model="checkJson.title"
+          @blur="save"
+          @keyup.enter="save"
+          placeholder="输入问题"
+        />
+      </div>
+      <div
+        class="detail"
+        v-if="!updateList.detail"
+        @click.stop="updateDetail()"
+      >
+        {{ cJson.detail ? cJson.detail : "暂无描述" }}
+      </div>
+      <input
+        v-if="updateList.detail"
+        ref="detailRef"
+        class="editInput"
+        v-model="checkJson.detail"
+        @blur="save"
+        style="margin-top: 10px;color: rgb(136, 139, 146);"
+        @keyup.enter="save"
+        placeholder="请填写描述说明"
+      />
+
+     <div class="endTime">
+      <span>过期时间(分):</span>
+      <input
+        class="binfo_input"
+        type="value"
+        placeholder="请设置过期时间"
+        v-model="checkJson.minutes"
+        @change="minutesChange"
+      />
+     </div>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  props: {
+    cJson: {
+      type: Object
+    },
+    cJson2: {
+      type: Object
+    },
+    isOpen: {
+      type: Boolean,
+      default: false
+    },
+    index: {
+      type: String,
+      default: ""
+    }
+  },
+  data() {
+    return {
+      option: {
+        1: { name: "附件" }
+        // 2: { name: '多选题' }
+      },
+      checkJson: {},
+      updateList: {
+        title: false,
+        detail: false
+      }
+    };
+  },
+  watch: {
+    checkJson: {
+      handler(newVal) {
+        this.$emit("setJson", newVal, this.index);
+      },
+      deep: true
+    },
+    isOpen(newValue) {
+      if (newValue) {
+        if (!this.cJson2 || Object.keys(this.cJson2).length == 0) {
+          this.checkJson = {
+            title: "标题",
+            type: 1,
+            answer: ""
+          };
+        } else {
+          this.checkJson = this.depthCopy(this.cJson2);
+        }
+      }
+    }
+  },
+  methods: {
+    depthCopy(s) {
+      console.log("4",s)
+      return JSON.parse(JSON.stringify(s));
+    },
+    save() {
+      for (let key in this.updateList) {
+        this.updateList[key] = false;
+      }
+    },
+    updateTitle() {
+      this.updateList.title = true;
+      this.$nextTick(() => {
+        this.$refs["titleRef"].focus();
+      });
+    },
+    updateDetail() {
+      this.updateList.detail = true;
+      this.$nextTick(() => {
+        this.$refs["detailRef"].focus();
+      });
+    },
+    minutesChange() {
+      if (/[^\d]/.test(this.checkJson.minutes) || this.checkJson.minutes < 0) {
+        this.$message.error("请输入大于0的整数数字");
+        this.checkJson.minutes = 0;
+      } else if (this.checkJson.minutes === "") {
+        this.checkJson.minutes = 0;
+      }
+    },
+
+  },
+  mounted() {
+    if (!this.cJson || Object.keys(this.cJson).length == 0) {
+      this.checkJson = {
+        title: "",
+        detail: "",
+        answer: "", //内容
+        answer2: "", //内容
+        minutes: 5, //设置的分钟
+      };
+    } else {
+      console.log("2", this.cJson);
+      this.checkJson = this.depthCopy(this.cJson);
+      console.log("3",this.checkJson)
+      this.$forceUpdate();
+    }
+  }
+};
+</script>
+
+<style scoped>
+@import "../../global_styles.css";
+
+.punchQRcode > .detail {
+  width: 100%;
+  word-break: break-all;
+  color: rgb(136, 139, 146);
+  margin: 10px 0 0;
+}
+
+.binfo_input {
+  width: 180px;
+  height: 40px;
+  border-radius: 5px;
+  background: #fff;
+  font-size: 16px;
+  font-family: "Microsoft YaHei";
+  /* border: 1px solid #3682fc00; */
+  border: 1.5px solid #e0e0e0;
+  text-indent: 1em;
+  outline-color: rgb(64, 158, 255);
+  outline-offset: 1px;
+
+}
+
+.binfo_input > div {
+  border: 1.5px dashed #dfdfdf;
+  height: 120px;
+  width: 100%;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  background: rgb(249, 250, 251);
+  color: rgb(124, 124, 124);
+  border-radius: 5px;
+}
+
+.endTime{
+  display: flex;
+  justify-content: flex-end;
+  align-items: center;
+  margin-top: 10px;
+
+}
+
+.endTime>span{
+  display: flex;
+  align-items: center;
+}
+</style>

+ 7 - 1
src/components/pages/test/add/edit/check/index.vue

@@ -16,6 +16,7 @@
             <courseV2 :tindex="index" :cJson.sync="item.json" v-if="item.type == 11"></courseV2>
 						<sweep :tindex="index" :cJson.sync="item.json" v-if="item.type == 12"/>
             <number :tindex="index" :cJson.sync="item.json" v-if="item.type == 13"/>
+            <punchQRcode :tindex="index" :cJson.sync="item.json" v-if="item.type == 14"/>
             <!-- <span v-else>暂未设置题目</span> -->
           </div>
           <div v-for="(item2, index2) in item.array" :key="`${index}-${index2}`" class="check_box_xia">
@@ -30,6 +31,7 @@
               <courseV2 :tindex="index2" :cJson.sync="item2.json" v-if="item2.type == 11"></courseV2>
 							<sweep :tindex="index2" :cJson.sync="item2.json" v-if="item2.type == 12"></sweep>
               <number :tindex="index2" :cJson.sync="item2.json" v-if="item2.type == 13"></number>
+              <punchQRcode :tindex="index2" :cJson.sync="item2.json" v-if="item2.type == 14"></punchQRcode>
               <!-- <span v-else>暂未设置题目</span> -->
             </div>
           </div>
@@ -48,6 +50,7 @@
             <courseV2 :tindex="index" :cJson.sync="item.json" v-if="item.type == 11"></courseV2>
 						<sweep :tindex="index" :cJson.sync="item.json" v-if="item.type == 12"></sweep>
             <number :tindex="index" :cJson.sync="item.json" v-if="item.type == 13"></number>
+            <punchQRcode :tindex="index" :cJson.sync="item.json" v-if="item.type == 14"></punchQRcode>
             <!-- <span v-else>暂未设置题目</span> -->
           </div>
           <div v-for="(item2, index2) in item.array" :key="`${index}-${index2}`" class="check_box_xia">
@@ -62,6 +65,7 @@
               <courseV2 :tindex="index2" :cJson.sync="item2.json" v-if="item2.type == 11"></courseV2>
 							<sweep :tindex="index2" :cJson.sync="item2.json" v-if="item2.type == 12"></sweep>
               <number :tindex="index2" :cJson.sync="item2.json" v-if="item2.type == 13"></number>
+              <punchQRcode :tindex="index2" :cJson.sync="item2.json" v-if="item2.type == 14"></punchQRcode>
               <!-- <span v-else>暂未设置题目</span> -->
             </div>
           </div>
@@ -88,6 +92,7 @@ import timeV from './time.vue';
 import courseV2 from './course2.vue';
 import sweep from './sweep.vue'
 import number from './number.vue';
+import punchQRcode from './punchQRcode.vue';
 export default {
   props: {
     cJson: {
@@ -106,7 +111,8 @@ export default {
     timeV,
     courseV2,
 		sweep,
-    number
+    number,
+    punchQRcode
   },
   data() {
     return {

+ 261 - 0
src/components/pages/test/add/edit/check/punchQRcode.vue

@@ -0,0 +1,261 @@
+<template>
+  <div class="c_box">
+    <div class="choice_box">
+      <div class="title" style="display: flex;align-items: center;">
+        <span class="g_t_index" style="min-width: fit-content;">{{
+          tindex + 1
+        }}</span>
+        <span>{{ checkJson.title }}</span>
+      </div>
+      <div
+        class="detail"
+        v-if="checkJson.detail"
+        v-html="checkJson.detail"
+        style="color: #00000066;margin-top: 5px;"
+      ></div>
+			<div
+        class="detail"
+         v-if="checkJson.answer2 && typeof checkJson.answer2=='string'"
+        v-html="checkJson.answer2"
+        style="color: #000000;margin-top: 5px;"
+      ></div>
+			<el-button style="margin-top: 10px;" type="primary" size="mini" @click="sweepBtn">扫一扫</el-button>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  props: {
+    tindex: {
+      type: Number
+    },
+    cJson: {
+      type: Object
+    },
+    checktype: {
+      type: Number,
+      default: 1
+    },
+    see: {
+      type: Boolean,
+      default: false
+    }
+  },
+  data() {
+    return {
+      option: {
+        1: { name: "附件" }
+      },
+      userid: this.$route.query.userid,
+      checkJson: undefined,
+      courseDetail: [],
+    };
+  },
+  computed: {},
+  watch: {
+    checkJson: {
+      handler(newValue) {
+        this.$emit("update:cJson", newValue);
+      },
+      deep: true
+    }
+  },
+  methods: {
+    depthCopy(s) {
+      return JSON.parse(JSON.stringify(s));
+    },
+		sweepBtn(){
+			this.$message.error("请到手机端内扫码")
+		}
+  },
+  mounted() {
+    this.checkJson = this.cJson ? this.depthCopy(this.cJson) : undefined;
+  }
+};
+</script>
+
+<style scoped>
+.c_box {
+  width: 100%;
+  position: relative;
+  padding-left: 45px;
+  overflow: visible;
+}
+
+/* .mask {
+    position: absolute;
+    height: 100%;
+    width: 100%;
+    z-index: 2;
+} */
+
+.choice_box {
+  white-space: pre-line;
+}
+
+.choice_box > .title {
+  font-weight: bold;
+  width: 100%;
+  word-break: break-all;
+}
+
+.choice_box > .choices {
+  margin-top: 10px;
+}
+
+.choices > .page {
+  margin-top: 10px;
+  display: flex;
+  align-items: center;
+}
+
+.p_page {
+  margin: 0 10px;
+}
+
+.course {
+  display: flex;
+  align-items: center;
+  cursor: pointer;
+}
+
+.course + .course {
+  margin-top: 10px;
+}
+
+.course > .banner {
+  width: 200px;
+  height: 120px;
+  border-radius: 5px;
+  overflow: hidden;
+  border: 1px solid #3896fc;
+  box-sizing: border-box;
+  padding: 5px;
+  margin-right: 15px;
+}
+.course > .banner > img {
+  width: 100%;
+  height: 100%;
+  object-fit: cover;
+}
+.course > .content {
+}
+.course > .content > .c_c {
+}
+.course > .content > .c_c + .c_c {
+  margin-top: 5px;
+}
+.course > .content > .c_c span:nth-child(1) {
+}
+.course > .content > .c_c span:nth-child(2) {
+}
+
+.g_t_index {
+  color: #3681fc;
+  font-size: 28px;
+  font-weight: bold;
+  position: relative;
+  margin-right: 30px;
+  margin-left: -40px;
+}
+
+.g_t_index + span {
+  font-weight: bold;
+  font-size: 18px;
+}
+
+.g_t_index::after {
+  content: "";
+  width: 18px;
+  height: 2px;
+  position: absolute;
+  right: -18px;
+  top: 50%;
+  transform: translateY(-50%);
+  background: #3681fc;
+}
+
+.g_t_index::before {
+  content: "";
+  width: 6px;
+  height: 6px;
+  border-right: 2px solid #3681fc;
+  border-top: 2px solid #3681fc;
+  position: absolute;
+  right: -15px;
+  top: 50%;
+  transform: rotate(45deg) translateY(-5px);
+}
+
+.c_list {
+  width: calc(100% - 10px);
+  min-height: 200px;
+  height: auto;
+  border: 1px solid #e7e7e7;
+  border-radius: 5px;
+  box-sizing: border-box;
+  padding: 10px;
+  display: flex;
+  flex-wrap: wrap;
+  /* overflow: auto; */
+}
+
+.c_l_add1 {
+  width: 100%;
+  height: 200px;
+  background-color: #F9FAFB;
+	border: 1.5px dashed #dfdfdf;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  color: #00000066;
+  border-radius: 5px;
+  font-size: 18px;
+  cursor: pointer;
+}
+
+.c_l_add2{
+	width: 230px;
+  height: 200px;
+	background-color: #F9FAFB;
+	border: 1.5px dashed #dfdfdf;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  color: #00000066;
+  border-radius: 5px;
+  font-size: 18px;
+  cursor: pointer;
+}
+
+.c_l_item {
+  width: 230px;
+  height: 200px;
+  margin-right: 10px;
+  box-sizing: border-box;
+  border: solid 1px #3896FC;
+  border-radius: 5px;
+	cursor: pointer;
+	box-sizing: border-box;
+	padding: 5px;
+}
+
+.c_l_item > img {
+  width: 100%;
+  height: 110px;
+  object-fit: cover;
+	margin-bottom: 5px;
+}
+
+.c_l_item > div {
+  width: 210px;
+  display: block;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+  font-size: 14px; /* 设置字体大小 */
+  color: #333; /* 设置字体颜色 */
+	box-sizing: border-box;
+}
+</style>

+ 16 - 0
src/components/pages/test/add/edit/edit/index.vue

@@ -491,6 +491,14 @@ export default {
             detail: "",
             type:'1'
           };
+        }else if(topicType == 14){
+          json.json = {
+            title: "",
+              detail: "",
+              answer:"",//内容
+              answer2:"",//内容
+              minutes:"5",//设置的分钟
+          };
         }
         if (_json.array) {
           if (type == 3 && _check.length == 2) {
@@ -621,6 +629,14 @@ export default {
               answer:'',
               type:"1",//1:整数、2:保留一位小数、3:保留两位小数 4:百分数
             };
+          }else if (topicType == 14) {
+            json1.json = {
+              title: "",
+              detail: "",
+              answer:"",//内容
+              answer2:"",//内容
+              minutes:"5",//设置的分钟
+            };
           }
           this.manualJson.push(json1);
           this.$forceUpdate();

+ 5 - 1
src/components/pages/test/add/minxins/minxin.js

@@ -55,6 +55,9 @@ const minxin = {
 				},{
           value:13,
           label:"数字"
+        },{
+          value:14,
+          label:"打卡"
         }
       ]))),
       optionsPin:JSON.parse(converter(JSON.stringify([
@@ -80,7 +83,8 @@ const minxin = {
         10: "多选",
         11: "课程",
 				12:"扫一扫",
-        13:"数字"
+        13:"数字",
+        14:"打卡"
       }))),
       buttonOptions: JSON.parse(converter(JSON.stringify([
         { name: "分组", type: 1 },

+ 44 - 1
src/components/pages/test/check/index.vue

@@ -6,6 +6,7 @@
           <div class="stepsNav">
             <el-breadcrumb separator-class="el-icon-arrow-right">
               <el-breadcrumb-item
+              v-if="!back"
                 :to="{
                   path:
                     '/test?userid=' +
@@ -19,6 +20,17 @@
                 }"
                 >表单管理</el-breadcrumb-item
               >
+              <el-breadcrumb-item v-else-if="back=='sass'" :to="{
+                  path:
+                      '/sassPlatform?userid=' +
+                      userid +
+                      '&oid=' +
+                      oid +
+                      '&org=' +
+                      org +
+                      '&role=' +
+                      role,
+              }">sass平台</el-breadcrumb-item>
               <el-breadcrumb-item>
                 <span style="color: rgb(15, 126, 255)">查看表单</span>
               </el-breadcrumb-item>
@@ -267,6 +279,9 @@
                       test_course_file: item.type == 6 || item.type == 11,
                       test_eva_file: item.type == 7,
                       test_icon_time: item.type == 8,
+                      test_icon_sweep:item.type == 12,
+                      test_icon_number:item.type == 13,
+                      test_icon_clockIn:item.type == 14
                     }"
                   ></span>
                 </el-tooltip>
@@ -1345,6 +1360,12 @@
                   >
                     {{ scope.row.array[index].json.answer2 }}<span>{{  scope.row.array[index].json.type=='4'?'%':'' }}</span>
                   </div>
+                  <div
+                    v-if="scope.row.array[index].type == 14"
+                    style="display: flex; flex-wrap: wrap"
+                  >
+                    {{ scope.row.array[index].json.answer2 }}
+                  </div>
                 </template>
               </el-table-column>
               <el-table-column
@@ -1880,6 +1901,7 @@ export default {
       cid: this.$route.query.cid,
       isN: this.$route.query.isN,
       peopleId: this.$route.query.peopleId,
+      back:this.$route.query.back,
       screenWidth: window.innerWidth,
       isDesktop: false,
       aiChatV: false,
@@ -2166,7 +2188,8 @@ export default {
       // });
     },
     retrunCourse() {
-      this.goTo(
+      if(!this.back){
+        this.goTo(
         "/test?userid=" +
           this.userid +
           "&oid=" +
@@ -2176,6 +2199,19 @@ export default {
           "&role=" +
           this.role
       );
+      }else if(this.back=="sass"){
+        this.goTo(
+        "/sassPlatform?userid=" +
+          this.userid +
+          "&oid=" +
+          this.oid +
+          "&org=" +
+          this.org +
+          "&role=" +
+          this.role
+      );
+      }
+
     },
     goTo(path) {
       this.$router.push(path);
@@ -2365,6 +2401,7 @@ export default {
             let cJson = this.setJSON(
               JSON.parse(JSON.stringify(JSON.parse(this.works[i].courseJson)))
             );
+            console.log(cJson,'===',chapters)
             if (JSON.stringify(cJson) == JSON.stringify(chapters)) {
               let _json = this.JSONSetting(
                 JSON.parse(JSON.stringify(JSON.parse(this.works[i].courseJson)))
@@ -2452,6 +2489,7 @@ export default {
             }
             for (var j = 0; j < array.length; j++) {
               let el2 = array[j];
+              console.log("==>",el2)
               if (topic.type == 1) {
                 let _answer = el2.array[i].json.answer2;
                 for (var k = 0; k < _answer.length; k++) {
@@ -2535,6 +2573,8 @@ export default {
                   }
                   topic.count++;
                 }
+              }else if(topic.type==14){
+                console.log("===",el2)
               }
             }
             console.log("topictopictopictopic", topic);
@@ -2671,6 +2711,7 @@ export default {
               delete item2.json.answer2;
               delete item2.json.score2;
               delete item2.json.file;
+              delete item2.json.codeScanningTime
             }
             if (item2.array) {
               item2.array = item2.array.filter((item3) => {
@@ -2678,6 +2719,7 @@ export default {
                   delete item3.json.answer2;
                   delete item3.json.score2;
                   delete item3.json.file;
+                  delete item3.json.codeScanningTime
                 }
                 return item3;
               });
@@ -2688,6 +2730,7 @@ export default {
           delete item.json.answer2;
           delete item.json.score2;
           delete item.json.file;
+          delete item.json.codeScanningTime
         }
         return item;
         console.log(item.array);

+ 32 - 4
src/components/pages/test/check/index2.vue

@@ -5,7 +5,7 @@
         <div class="courseTop">
           <div class="stepsNav">
             <el-breadcrumb separator-class="el-icon-arrow-right">
-              <el-breadcrumb-item
+              <el-breadcrumb-item v-if="!back"
                 :to="{
                   path:
                     '/test?userid=' +
@@ -19,6 +19,20 @@
                 }"
                 >表单管理</el-breadcrumb-item
               >
+              <el-breadcrumb-item v-if="back=='sass'"
+                :to="{
+                  path:
+                    '/sassPlatform?userid=' +
+                    userid +
+                    '&oid=' +
+                    oid +
+                    '&org=' +
+                    org +
+                    '&role=' +
+                    role,
+                }"
+                >sass平台</el-breadcrumb-item
+              >
               <el-breadcrumb-item>
                 <span style="color: rgb(15, 126, 255)">查看表单</span>
               </el-breadcrumb-item>
@@ -118,6 +132,7 @@ export default {
       role: this.$route.query.role,
       cid: this.$route.query.cid,
       uid: this.$route.query.uid,
+      back: this.$route.query.back,
       title: "",
       testType: [],
       see: false,
@@ -135,7 +150,8 @@ export default {
   watch: {},
   methods: {
     retrunCourse() {
-      this.goTo(
+      if(!this.back){
+        this.goTo(
         "/test?userid=" +
           this.userid +
           "&oid=" +
@@ -145,6 +161,18 @@ export default {
           "&role=" +
           this.role
       );
+      }else if(this.back=="sass"){
+        this.goTo(
+        "/sassPlatform?userid=" +
+          this.userid +
+          "&oid=" +
+          this.oid +
+          "&org=" +
+          this.org +
+          "&role=" +
+          this.role
+      );
+      }
     },
     goTo(path) {
       this.$router.push(path);
@@ -211,7 +239,7 @@ export default {
             .then((res) => {
               _this.$message.success("删除成功");
               _this.getData();
-              
+
             })
             .catch((err) => {
               console.error(err);
@@ -306,4 +334,4 @@ export default {
 .student_page {
   margin-top: 10px;
 }
-</style>
+</style>

+ 16 - 3
src/components/pages/test/smarter.vue

@@ -3,7 +3,7 @@
         <div style="width:100%;padding:0;box-sizing: border-box;">
             <div class="pb_head top">
                 <div class="pb_head_t_left">
-                    <span class="subClick" @click="
+                    <span class="subClick" v-if="!back" @click="
                         goTo(
                             '/test?userid=' +
                             userid +
@@ -16,7 +16,7 @@
                         )
                         ">表单管理</span>
                     <!-- v-show="oid == '4c686762-1d0a-11ed-8c78-005056b86db5'" -->
-                    <span class="subClick" @click="
+                    <span class="subClick" v-if="!back" @click="
                         goTo(
                             '/trainCourse?userid=' +
                             userid +
@@ -28,7 +28,7 @@
                             role
                         )
                         ">培训管理</span>
-                    <span class="subClick" v-if="examineData.length" @click="
+                    <span class="subClick" v-if="examineData.length && !back" @click="
                         goTo(
                             '/testDataBoard?userid=' +
                             userid +
@@ -40,6 +40,18 @@
                             role
                         )
                         ">数据看板</span>
+                     <span class="subClick" v-if="back=='sass'" @click="
+                        goTo(
+                            '/sassPlatform?userid=' +
+                            userid +
+                            '&oid=' +
+                            oid +
+                            '&org=' +
+                            org +
+                            '&role=' +
+                            role
+                        )
+                        ">sass平台</span>
                     <span class="sub_head">智能助手</span>
                 </div>
                 <!-- <div class="pb_head_t_right">
@@ -268,6 +280,7 @@ export default {
             org: this.$route.query.org,
             role: this.$route.query.role,
             cid: this.$route.query.cid,
+            back: this.$route.query.back,
             menuList: [],
             aiContentArea: [],
             menuIndex: 0,

+ 266 - 0
src/components/pages/testStudent/view/component/punchQRcode.vue.vue

@@ -0,0 +1,266 @@
+<template>
+  <div class="c_box">
+    <div class="choice_box">
+      <div class="title" style="display: flex;align-items: center;">
+        <span class="g_t_index" style="min-width: fit-content;">{{
+          tindex + 1
+        }}</span>
+        <span>{{ checkJson.title }}</span>
+      </div>
+      <div
+        class="detail"
+        v-if="checkJson.detail"
+        v-html="checkJson.detail"
+        style="color: #00000066;margin-top: 5px;"
+      ></div>
+
+			<div
+        class="detail"
+        v-if="checkJson.answer2 && typeof checkJson.answer2=='string'"
+        v-html="checkJson.answer2"
+        style="color: #000000;margin-top: 5px;"
+      ></div>
+			<el-button @click="sweepBtn" type="primary" size="mini" style="margin-top: 10px;">扫一扫</el-button>
+    </div>
+
+  </div>
+</template>
+
+<script>
+
+export default {
+  props: {
+    tindex: {
+      type: Number
+    },
+    cJson: {
+      type: Object
+    },
+    checktype: {
+      type: Number,
+      default: 1
+    },
+    see: {
+      type: Boolean,
+      default: false
+    }
+  },
+  data() {
+    return {
+      option: {
+        1: { name: "附件" }
+      },
+      userid: this.$route.query.userid,
+      checkJson: {
+				title:"",
+				detail:""
+			},
+    };
+  },
+  watch: {
+    checkJson: {
+      handler(newValue) {
+        this.$emit("update:cJson", newValue);
+      },
+      deep: true
+    }
+  },
+  methods: {
+
+    depthCopy(s) {
+      return JSON.parse(JSON.stringify(s));
+    },
+
+		sweepBtn(){
+			this.$message.error("请到手机端内扫码")
+		}
+  },
+  mounted() {
+    this.checkJson = this.cJson ? this.depthCopy(this.cJson) : undefined;
+  }
+};
+</script>
+
+<style scoped>
+.c_box {
+  width: 100%;
+  position: relative;
+	padding-left: 45px;
+}
+
+/* .mask {
+    position: absolute;
+    height: 100%;
+    width: 100%;
+    z-index: 2;
+} */
+
+.choice_box {
+  white-space: pre-line;
+}
+
+.choice_box > .title {
+  font-weight: bold;
+  width: 100%;
+  word-break: break-all;
+}
+
+.choice_box > .choices {
+  margin-top: 10px;
+}
+
+.choices > .page {
+  margin-top: 10px;
+  display: flex;
+  align-items: center;
+}
+
+.p_page {
+  margin: 0 10px;
+}
+
+.course {
+  display: flex;
+  align-items: center;
+  cursor: pointer;
+}
+
+.course + .course {
+  margin-top: 10px;
+}
+
+.course > .banner {
+  width: 200px;
+  height: 120px;
+  border-radius: 5px;
+  overflow: hidden;
+  border: 1px solid #3896fc;
+  box-sizing: border-box;
+  padding: 5px;
+  margin-right: 15px;
+}
+.course > .banner > img {
+  width: 100%;
+  height: 100%;
+  object-fit: cover;
+}
+.course > .content {
+}
+.course > .content > .c_c {
+}
+.course > .content > .c_c + .c_c {
+  margin-top: 5px;
+}
+.course > .content > .c_c span:nth-child(1) {
+}
+.course > .content > .c_c span:nth-child(2) {
+}
+
+.g_t_index {
+  color: #3681fc;
+  font-size: 28px;
+  font-weight: bold;
+  position: relative;
+  margin-right: 30px;
+  margin-left: -40px;
+}
+
+.g_t_index + span {
+  font-weight: bold;
+  font-size: 18px;
+}
+
+.g_t_index::after {
+  content: "";
+  width: 18px;
+  height: 2px;
+  position: absolute;
+  right: -18px;
+  top: 50%;
+  transform: translateY(-50%);
+  background: #3681fc;
+}
+
+.g_t_index::before {
+  content: "";
+  width: 6px;
+  height: 6px;
+  border-right: 2px solid #3681fc;
+  border-top: 2px solid #3681fc;
+  position: absolute;
+  right: -15px;
+  top: 50%;
+  transform: rotate(45deg) translateY(-5px);
+}
+
+.c_list {
+  width: calc(100% - 10px);
+  min-height: 200px;
+  height: auto;
+  border: 1px solid #e7e7e7;
+  border-radius: 5px;
+  box-sizing: border-box;
+  padding: 10px;
+  display: flex;
+  flex-wrap: wrap;
+  /* overflow: auto; */
+}
+
+.c_l_add1 {
+  width: 100%;
+  height: 200px;
+  background-color: #F9FAFB;
+	border: 1.5px dashed #dfdfdf;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  color: #00000066;
+  border-radius: 5px;
+  font-size: 18px;
+  cursor: pointer;
+}
+
+.c_l_add2{
+	width: 230px;
+  height: 200px;
+	background-color: #F9FAFB;
+	border: 1.5px dashed #dfdfdf;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  color: #00000066;
+  border-radius: 5px;
+  font-size: 18px;
+  cursor: pointer;
+}
+
+.c_l_item {
+  width: 230px;
+  height: 200px;
+  margin-right: 10px;
+  box-sizing: border-box;
+  border: solid 1px #3896FC;
+  border-radius: 5px;
+	cursor: pointer;
+	box-sizing: border-box;
+	padding: 5px;
+}
+
+.c_l_item > img {
+  width: 100%;
+  height: 110px;
+  object-fit: cover;
+	margin-bottom: 5px;
+}
+
+.c_l_item > div {
+  width: 210px;
+  display: block;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+  font-size: 14px; /* 设置字体大小 */
+  color: #333; /* 设置字体颜色 */
+	box-sizing: border-box;
+}
+</style>

+ 11 - 1
src/components/pages/testStudent/view/component/topic.vue

@@ -31,6 +31,8 @@
 							:see="see" :isTeacher="isTeacher"></sweep>
               <number :tindex="index" :cJson.sync="item.json" :checktype="checktype" v-else-if="item.type == 13"
 							:see="see" :isTeacher="isTeacher"></number>
+              <punchQRcodeVue :tindex="index" :cJson.sync="item.json" :checktype="checktype" v-else-if="item.type == 14"
+							:see="see" :isTeacher="isTeacher"></punchQRcodeVue>
             <!-- <span v-else>暂未设置题目</span> -->
           </div>
           <div v-for="(item2, index2) in item.array" :key="`${index}-${index2}`" class="check_box_xia">
@@ -53,6 +55,8 @@
 								:see="see" :isTeacher="isTeacher"></sweep>
                 <number :tindex="index2" :cJson.sync="item2.json" :checktype="checktype" v-else-if="item2.type == 13"
 								:see="see" :isTeacher="isTeacher"></number>
+                <punchQRcodeVue :tindex="index2" :cJson.sync="item2.json" :checktype="checktype" v-else-if="item2.type == 14"
+								:see="see" :isTeacher="isTeacher"></punchQRcodeVue>
               <!-- <span v-else>暂未设置题目</span> -->
             </div>
           </div>
@@ -81,6 +85,8 @@
                :see="see" :isTeacher="isTeacher"></sweep>
                <number :tindex="index" :cJson.sync="item.json" :checktype="checktype" v-else-if="item.type == 13"
                :see="see" :isTeacher="isTeacher"></number>
+               <punchQRcodeVue :tindex="index" :cJson.sync="item.json" :checktype="checktype" v-else-if="item.type == 14"
+               :see="see" :isTeacher="isTeacher"></punchQRcodeVue>
             <!-- <span v-else>暂未设置题目</span> -->
           </div>
           <div v-for="(item2, index2) in item.array" :key="`${index}-${index2}`" class="check_box_xia">
@@ -105,6 +111,8 @@
                :see="see" :isTeacher="isTeacher"></sweep>
                <number :tindex="index2" :cJson.sync="item2.json" :checktype="checktype" v-else-if="item2.type == 13"
                :see="see" :isTeacher="isTeacher"></number>
+               <punchQRcodeVue :tindex="index2" :cJson.sync="item2.json" :checktype="checktype" v-else-if="item2.type == 14"
+               :see="see" :isTeacher="isTeacher"></punchQRcodeVue>
               <!-- <span v-else>暂未设置题目</span> -->
             </div>
           </div>
@@ -133,6 +141,7 @@ import timeV from './time.vue';
 import courseV2 from './course2.vue';
 import sweep from './sweep'
 import number from "./number.vue";
+import punchQRcodeVue from "./punchQRcode.vue.vue";
 export default {
   props: {
     cJson: {
@@ -178,7 +187,8 @@ export default {
     timeV,
     courseV2,
 		sweep,
-    number
+    number,
+    punchQRcodeVue
   },
   data() {
     return {

+ 1 - 0
src/router/index.js

@@ -1247,6 +1247,7 @@ export default new Router({
           name:"sassPlatform",
           component:sassPlatform,
           meta:{
+            keepAlive: true,
             requireAuth:""//不需要鉴权
           }
         }

Деякі файли не було показано, через те що забагато файлів було змінено