huangminghao 1 year ago
parent
commit
69e7b6e866
100 changed files with 2590 additions and 358 deletions
  1. 4 0
      dist/index.html
  2. 0 0
      dist/static/css/app.58a6b41197bea4871a9880be0e71c882.css
  3. 0 0
      dist/static/css/app.58a6b41197bea4871a9880be0e71c882.css.map
  4. BIN
      dist/static/img/add_check_icon_active.de065e2.png
  5. BIN
      dist/static/img/add_edit_icon.7184d1d.png
  6. BIN
      dist/static/img/all_icon.0948957.png
  7. BIN
      dist/static/img/all_icon_active.cbb6ba1.png
  8. BIN
      dist/static/img/all_icon_b.df6028a.png
  9. BIN
      dist/static/img/gr_icon_active.4880043.png
  10. BIN
      dist/static/img/gr_icon_b.8703adc.png
  11. BIN
      dist/static/img/js_icon_b.1d1d718.png
  12. BIN
      dist/static/img/jy_icon_active.e1a377f.png
  13. BIN
      dist/static/img/md_icon.78a1668.png
  14. BIN
      dist/static/img/md_icon_b.838dfa9.png
  15. BIN
      dist/static/img/teacher.1b451c4.jpg
  16. BIN
      dist/static/img/yy_icon_active.f456dc5.png
  17. BIN
      dist/static/img/yy_icon_b.926d090.png
  18. 0 0
      dist/static/js/0.7da288988865a9378b49.js
  19. 0 0
      dist/static/js/0.7da288988865a9378b49.js.map
  20. 0 0
      dist/static/js/app.fe4284aa32465342a4e0.js
  21. 0 0
      dist/static/js/app.fe4284aa32465342a4e0.js.map
  22. 2 0
      dist/static/js/manifest.3512a67a6213c2df4180.js
  23. 0 0
      dist/static/js/manifest.3512a67a6213c2df4180.js.map
  24. 76 0
      src/assets/css/button.css
  25. BIN
      src/assets/icon/test/add_check_icon.png
  26. BIN
      src/assets/icon/test/add_check_icon_active.png
  27. BIN
      src/assets/icon/test/add_edit_icon.png
  28. BIN
      src/assets/icon/test/add_edit_icon_active.png
  29. BIN
      src/assets/icon/test/all_icon.png
  30. BIN
      src/assets/icon/test/all_icon_active.png
  31. BIN
      src/assets/icon/test/all_icon_b.png
  32. BIN
      src/assets/icon/test/camera_icon.png
  33. BIN
      src/assets/icon/test/check_icon.png
  34. BIN
      src/assets/icon/test/check_test_icon.png
  35. BIN
      src/assets/icon/test/delete_test_icon.png
  36. BIN
      src/assets/icon/test/drag_icon.png
  37. BIN
      src/assets/icon/test/drag_icon_active.png
  38. BIN
      src/assets/icon/test/edit-icon.png
  39. BIN
      src/assets/icon/test/edit_icon.png
  40. BIN
      src/assets/icon/test/edit_test_icon.png
  41. BIN
      src/assets/icon/test/gr_icon.png
  42. BIN
      src/assets/icon/test/gr_icon_active.png
  43. BIN
      src/assets/icon/test/gr_icon_b.png
  44. BIN
      src/assets/icon/test/js_icon_b.png
  45. BIN
      src/assets/icon/test/jy_icon.png
  46. BIN
      src/assets/icon/test/jy_icon_active.png
  47. BIN
      src/assets/icon/test/md_icon.png
  48. BIN
      src/assets/icon/test/md_icon_active.png
  49. BIN
      src/assets/icon/test/md_icon_b.png
  50. BIN
      src/assets/icon/test/paste_icon.png
  51. BIN
      src/assets/icon/test/teacher.jpg
  52. BIN
      src/assets/icon/test/type_check_icon.png
  53. BIN
      src/assets/icon/test/type_file_icon.png
  54. BIN
      src/assets/icon/test/type_group_icon.png
  55. BIN
      src/assets/icon/test/type_page_icon.png
  56. BIN
      src/assets/icon/test/type_text_icon.png
  57. BIN
      src/assets/icon/test/yy_icon.png
  58. BIN
      src/assets/icon/test/yy_icon_active.png
  59. BIN
      src/assets/icon/test/yy_icon_b.png
  60. BIN
      src/assets/icon/test/zong_1.png
  61. BIN
      src/assets/icon/test/zong_2.png
  62. BIN
      src/assets/icon/test/zong_3.png
  63. 7 3
      src/components/pages/addCourse.vue
  64. 40 1
      src/components/pages/components/classStudentComponents/worksDetail3.vue
  65. 71 11
      src/components/pages/components/englishRight.vue
  66. 40 1
      src/components/pages/components/studentWorksDetail.vue
  67. 58 16
      src/components/pages/components/worksDetail2.vue
  68. 40 1
      src/components/pages/components/worksDetail2GM.vue
  69. 40 1
      src/components/pages/components/worksDetail3.vue
  70. 40 1
      src/components/pages/components/worksDetail3GM.vue
  71. 1 0
      src/components/pages/dataBoardNew/course/index.vue
  72. 1 0
      src/components/pages/dataBoardNew/project/index.vue
  73. 1 0
      src/components/pages/dataBoardNew/school/index.vue
  74. 1 0
      src/components/pages/dataBoardNew/student/index.vue
  75. 1 0
      src/components/pages/dataBoardNew/teacher/index.vue
  76. 40 1
      src/components/pages/myReport/components/MyLookComponent/worksDetail3.vue
  77. 163 77
      src/components/pages/student/addCourse.vue
  78. 29 15
      src/components/pages/test/add/addTest.vue
  79. 5 2
      src/components/pages/test/add/components/GapFilling/gap.vue
  80. 10 9
      src/components/pages/test/add/components/GapFilling/index.vue
  81. 78 34
      src/components/pages/test/add/components/checkOrder.vue
  82. 4 1
      src/components/pages/test/add/components/choice/choice.vue
  83. 13 6
      src/components/pages/test/add/components/choice/index.vue
  84. 4 1
      src/components/pages/test/add/components/file/file.vue
  85. 8 8
      src/components/pages/test/add/components/file/index.vue
  86. 1 1
      src/components/pages/test/add/edit/check/file.vue
  87. 1 1
      src/components/pages/test/add/edit/check/gap.vue
  88. 5 1
      src/components/pages/test/add/edit/check/index.vue
  89. 76 49
      src/components/pages/test/add/edit/edit/index.vue
  90. 92 11
      src/components/pages/test/add/edit/index.vue
  91. 363 0
      src/components/pages/test/add/setInfo/aiCreate2.vue
  92. 120 23
      src/components/pages/test/add/setInfo/index.vue
  93. 43 14
      src/components/pages/test/add/setInfo/manualCreated.vue
  94. 9 3
      src/components/pages/test/check/check.vue
  95. 2 0
      src/components/pages/test/check/index.vue
  96. 80 0
      src/components/pages/test/file/wPdf2.vue
  97. 338 66
      src/components/pages/test/index.vue
  98. 59 0
      src/components/pages/testPerson/index.vue
  99. 224 0
      src/components/pages/testPerson/info/index.vue
  100. 400 0
      src/components/pages/testPerson/info/infoDialog/index.vue

+ 4 - 0
dist/index.html

@@ -25,7 +25,11 @@
       height: 100%;
       width: 100%;
       background: #e6eaf0;
+<<<<<<< HEAD
     }</style><link href=./static/css/app.8db61530cac78e086e080ad56f8b3372.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=./static/js/manifest.4ae2783fdfe7ab52e4d5.js></script><script type=text/javascript src=./static/js/vendor.b01159b52abeac4e6216.js></script><script type=text/javascript src=./static/js/app.a8d9b67ee56036db82da.js></script></body></html><script>function stopSafari() {
+=======
+    }</style><link href=./static/css/app.58a6b41197bea4871a9880be0e71c882.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=./static/js/manifest.3512a67a6213c2df4180.js></script><script type=text/javascript src=./static/js/vendor.b01159b52abeac4e6216.js></script><script type=text/javascript src=./static/js/app.fe4284aa32465342a4e0.js></script></body></html><script>function stopSafari() {
+>>>>>>> 02df65c2f33f546c3b41100979e63a9a1d4d6f96
     //阻止safari浏览器双击放大功能
     let lastTouchEnd = 0  //更新手指弹起的时间
     document.documentElement.addEventListener("touchstart", function (event) {

File diff suppressed because it is too large
+ 0 - 0
dist/static/css/app.58a6b41197bea4871a9880be0e71c882.css


File diff suppressed because it is too large
+ 0 - 0
dist/static/css/app.58a6b41197bea4871a9880be0e71c882.css.map


BIN
dist/static/img/add_check_icon_active.de065e2.png


BIN
dist/static/img/add_edit_icon.7184d1d.png


BIN
dist/static/img/all_icon.0948957.png


BIN
dist/static/img/all_icon_active.cbb6ba1.png


BIN
dist/static/img/all_icon_b.df6028a.png


BIN
dist/static/img/gr_icon_active.4880043.png


BIN
dist/static/img/gr_icon_b.8703adc.png


BIN
dist/static/img/js_icon_b.1d1d718.png


BIN
dist/static/img/jy_icon_active.e1a377f.png


BIN
dist/static/img/md_icon.78a1668.png


BIN
dist/static/img/md_icon_b.838dfa9.png


BIN
dist/static/img/teacher.1b451c4.jpg


BIN
dist/static/img/yy_icon_active.f456dc5.png


BIN
dist/static/img/yy_icon_b.926d090.png


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/0.7da288988865a9378b49.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/0.7da288988865a9378b49.js.map


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/app.fe4284aa32465342a4e0.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/app.fe4284aa32465342a4e0.js.map


+ 2 - 0
dist/static/js/manifest.3512a67a6213c2df4180.js

@@ -0,0 +1,2 @@
+!function(e){var n=window.webpackJsonp;window.webpackJsonp=function(r,a,c){for(var i,u,f,s=0,l=[];s<r.length;s++)u=r[s],t[u]&&l.push(t[u][0]),t[u]=0;for(i in a)Object.prototype.hasOwnProperty.call(a,i)&&(e[i]=a[i]);for(n&&n(r,a,c);l.length;)l.shift()();if(c)for(s=0;s<c.length;s++)f=o(o.s=c[s]);return f};var r={},t={4:0};function o(n){if(r[n])return r[n].exports;var t=r[n]={i:n,l:!1,exports:{}};return e[n].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.e=function(e){var n=t[e];if(0===n)return new Promise(function(e){e()});if(n)return n[2];var r=new Promise(function(r,o){n=t[e]=[r,o]});n[2]=r;var a=document.getElementsByTagName("head")[0],c=document.createElement("script");c.type="text/javascript",c.charset="utf-8",c.async=!0,c.timeout=12e4,o.nc&&c.setAttribute("nonce",o.nc),c.src=o.p+"static/js/"+e+"."+{0:"7da288988865a9378b49",1:"994623639438b244a74c"}[e]+".js";var i=setTimeout(u,12e4);function u(){c.onerror=c.onload=null,clearTimeout(i);var n=t[e];0!==n&&(n&&n[1](new Error("Loading chunk "+e+" failed.")),t[e]=void 0)}return c.onerror=c.onload=u,a.appendChild(c),r},o.m=e,o.c=r,o.d=function(e,n,r){o.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},o.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(n,"a",n),n},o.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},o.p="./",o.oe=function(e){throw console.error(e),e}}([]);
+//# sourceMappingURL=manifest.3512a67a6213c2df4180.js.map

File diff suppressed because it is too large
+ 0 - 0
dist/static/js/manifest.3512a67a6213c2df4180.js.map


+ 76 - 0
src/assets/css/button.css

@@ -243,3 +243,79 @@
   margin-right: 7px;
   background-image: url(../icon/new/upload.png);
 }
+
+
+.pub_test_btn {
+  color: #101010;
+  background-color: rgb(240, 242, 245);
+  padding: 8px 10px;
+  font-size: 14px;
+  min-width: 90px;
+  font-weight: 500;
+  border-radius: 4px;
+  box-sizing: border-box;
+  border: none;
+  cursor: pointer;
+  transition: all 0.2s ease-in-out;
+  display: flex;
+  align-items: center;
+  justify-content: left;
+  line-height: 1;
+}
+
+.pub_test_btn:has(+.pub_test_btn) {
+  margin-right: 10px;
+}
+
+.pub_test_btn_text::before,
+.pub_test_btn_choose::before,
+.pub_test_btn_page::before,
+.pub_test_btn_group::before,
+.pub_test_btn_file::before {
+  content: "";
+  width: 14px;
+  height: 14px;
+  min-width: 14px;
+  min-height: 14px;
+  background-size: 100% 100%;
+  display: block;
+  margin-right: 7px;
+}
+
+
+.pub_test_btn_text::before {
+  background-image: url(../icon/test/type_text_icon.png);
+}
+.pub_test_btn_choose::before {
+  background-image: url(../icon/test/type_check_icon.png);
+}
+.pub_test_btn_file::before {
+  background-image: url(../icon/test/type_file_icon.png);
+}
+.pub_test_btn_page::before {
+  background-image: url(../icon/test/type_page_icon.png);
+}
+.pub_test_btn_group::before {
+  background-image: url(../icon/test/type_group_icon.png);
+}
+
+.test_icon{
+  display: inline-block;
+  width: 18px;
+  height: 18px;
+  background-size: 100% 100%;
+  cursor: pointer;
+  position: relative;
+  top: 3px;
+  margin-right: 5px;
+}
+
+.test_icon_check{
+  background-image: url('../icon/test/type_check_icon.png');
+}
+.test_icon_gap{
+  background-image: url('../icon/test/type_text_icon.png');
+}
+.test_icon_file{
+  background-image: url('../icon/test/type_file_icon.png');
+}

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


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


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


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


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


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


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


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


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


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


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


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


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


BIN
src/assets/icon/test/edit-icon.png


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


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


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


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


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


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


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


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


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


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


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


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


BIN
src/assets/icon/test/teacher.jpg


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


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


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


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


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


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


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


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


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


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


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


+ 7 - 3
src/components/pages/addCourse.vue

@@ -3802,7 +3802,7 @@
     </el-dialog>
     <el-dialog title="创建作文题目" :visible.sync="englishDialogVisible" :append-to-body="true" width="800px"
       :before-close="(done) => { closePan(69) }" class="dialog_diy fullStyle fullStyle1">
-      <englishRight :englishList="englishList" :oid="oid" ref="engJson"></englishRight>
+      <englishRight :englishList="englishList" :oid="oid" ref="engJson" @setJson="addEnglish"></englishRight>
       <span slot="footer" class="dialog-footer">
         <el-button @click="englishDialogVisible = false">取 消</el-button>
         <el-button type="primary" @click="addEnglish">确 定</el-button>
@@ -4597,7 +4597,7 @@ export default {
           }
         });
     },
-    addEnglish(){
+    addEnglish(jsonType){
       this.englishList.engTitle = this.$refs['engJson'].engList.engTitle;
       this.englishList.englishText = this.$refs['engJson'].engList.englishText;
       this.englishList.textJson = this.$refs['engJson'].engList.textJson;
@@ -4609,7 +4609,11 @@ export default {
         this.taskCount
       ].toolChoose[this.toolIndex].englishList = this.englishList;
       this.englishList = {};
-      this.englishDialogVisible = false;
+      if(jsonType && jsonType == 1){
+        this.englishDialogVisible = true;
+      }else{
+        this.englishDialogVisible = false;
+      }
       if (
         this.unitJson[this.unitIndex].chapterInfo[0].taskJson[this.taskCount]
           .toolChoose[this.toolIndex].tool != 69

+ 40 - 1
src/components/pages/components/classStudentComponents/worksDetail3.vue

@@ -111,7 +111,7 @@
                       <el-button
                         type="primary"
                         size="small"
-                        @click="openFile(worksDetail[sIndex].wpptInfo[0])"
+                        @click="openFile2(worksDetail[sIndex].wpptInfo[0])"
                         >查看文档
                       </el-button>
                     </div>
@@ -2248,6 +2248,45 @@ export default {
       this.pptImgUrl = f;
       this.dialogVisible6 = true;
     },
+    openFile2(f) {
+      this.pptImgUrl = f.wpptInfo;
+      var fileA = [
+        "DOC",
+        "DOCX",
+        "DOCM",
+        "DOTM",
+        "DOTX",
+        "PPTX",
+        "PPSX",
+        "PPT",
+        "PPS",
+        "PPTM",
+        "POTM",
+        "PPAM",
+        "POTX",
+        "PPSM",
+        "XLSX",
+        "XLS",
+      ];
+      if (
+        fileA.indexOf(
+          this.pptImgUrl
+            .split(".")
+            [this.pptImgUrl.split(".").length - 1].toLocaleUpperCase()
+        ) != -1
+      ) {
+        this.showPDF = false; //word 文件
+      } else if (
+        "pdf".indexOf(
+          this.pptImgUrl
+            .split(".")
+            [this.pptImgUrl.split(".").length - 1].toLocaleLowerCase()
+        ) != -1
+      ) {
+        this.showPDF = true; //pdf
+      }
+      this.dialogVisible6 = true;
+    },
     //获取班级列表
     getClass() {
       let params = {

+ 71 - 11
src/components/pages/components/englishRight.vue

@@ -39,7 +39,25 @@
               :key="eIndex"
               :label="e.title"
               :value="e.id"
+              class="optionCss"
             >
+              <span
+                style="
+                  max-width: 160px;
+                  white-space: nowrap;
+                  overflow: hidden;
+                  text-overflow: ellipsis;
+                  word-break: break-word;
+                "
+                >{{ e.title }}</span
+              >
+              <span style="position: absolute; right: 20px; top: 3px"
+                ><img
+                  style="width: 17px; height: 17px; cursor: pointer"
+                  @click.stop="deleteTemplate(e.id)"
+                  src="../../../assets/icon/deleteN.png"
+                  alt=""
+              /></span>
             </el-option>
           </el-select>
           <el-tooltip
@@ -48,10 +66,7 @@
             placement="top"
             v-if="engList.textJson.startJson.length > 0"
           >
-            <div
-              class="addeEva"
-              @click="setEvaTitle"
-            >
+            <div class="addeEva" @click="setEvaTitle">
               <img src="../../../assets/icon/addEva.png" alt="" />
             </div>
           </el-tooltip>
@@ -80,9 +95,11 @@
               <el-input v-model="item.detile"></el-input>
             </div>
           </div>
-
-          <div class="addeEvaItem" @click="addStartItem">
-            <img src="../../../assets/icon/addEva.png" alt="" />
+          <div class="bottomCss">
+            <el-button type="primary" @click="setJson">保 存</el-button>
+            <div class="addeEvaItem" @click="addStartItem">
+              <img src="../../../assets/icon/addEva.png" alt="" />
+            </div>
           </div>
         </div>
       </div>
@@ -125,12 +142,16 @@ export default {
       engEvaId: "",
       englishTitle: "",
       engEvadialogVisible: false,
+      jsonType: 1,
     };
   },
   methods: {
     handleClose(done) {
       done();
     },
+    setJson() {
+      this.$emit("setJson", this.jsonType);
+    },
     selectEnglishEva() {
       this.englistEva = [];
       let params = {
@@ -205,9 +226,10 @@ export default {
             this.engList.textJson = tJson;
           } else {
             this.engList.textJson.score = tJson.score;
-            for (var i = 0; i < tJson.startJson.length; i++) {
-              this.engList.textJson.startJson.push(tJson.startJson[i]);
-            }
+            // for (var i = 0; i < tJson.startJson.length; i++) {
+            // this.engList.textJson.startJson.push(tJson.startJson[i]);
+            this.engList.textJson = tJson;
+            // }
           }
           this.engEvaId = "";
         })
@@ -215,6 +237,28 @@ export default {
           console.error(err);
         });
     },
+    deleteTemplate(id) {
+      this.$confirm("是否确定删除该模板?", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning",
+      })
+        .then(() => {
+          let params = {
+            id: id,
+          };
+          this.ajax
+            .get(this.$store.state.api + "deleteEnglishEvaById", params)
+            .then((res) => {
+              this.$message.success("删除成功");
+              this.selectEnglishEva();
+            })
+            .catch((err) => {
+              console.error(err);
+            });
+        })
+        .catch(() => {});
+    },
   },
   watch: {
     englishList: {
@@ -315,7 +359,7 @@ export default {
   width: 50px;
   height: 30px;
   border: 1px dashed #dbdbdb;
-  margin-top: 5px;
+  margin: 0 0 0 10px;
   border-radius: 10px;
   float: right;
   cursor: pointer;
@@ -357,4 +401,20 @@ export default {
   height: 30px;
   cursor: pointer;
 }
+
+.optionCss {
+  display: flex;
+  flex-direction: row;
+  flex-wrap: nowrap;
+  align-items: baseline;
+  justify-content: space-between;
+  position: relative;
+}
+.bottomCss {
+  display: flex;
+  flex-direction: row;
+  flex-wrap: nowrap;
+  justify-content: flex-end;
+  align-items: center;
+}
 </style>

+ 40 - 1
src/components/pages/components/studentWorksDetail.vue

@@ -340,7 +340,7 @@
                             <el-button
                               type="primary"
                               size="small"
-                              @click="openFile(worksDetail[sIndex].wpptInfo[0])"
+                              @click="openFile2(worksDetail[sIndex].wpptInfo[0])"
                             >
                               查看文档</el-button
                             >
@@ -3203,6 +3203,45 @@ export default {
       this.pptImgUrl = f;
       this.dialogVisible6 = true;
     },
+    openFile2(f) {
+      this.pptImgUrl = f.wpptInfo;
+      var fileA = [
+        "DOC",
+        "DOCX",
+        "DOCM",
+        "DOTM",
+        "DOTX",
+        "PPTX",
+        "PPSX",
+        "PPT",
+        "PPS",
+        "PPTM",
+        "POTM",
+        "PPAM",
+        "POTX",
+        "PPSM",
+        "XLSX",
+        "XLS",
+      ];
+      if (
+        fileA.indexOf(
+          this.pptImgUrl
+            .split(".")
+            [this.pptImgUrl.split(".").length - 1].toLocaleUpperCase()
+        ) != -1
+      ) {
+        this.showPDF = false; //word 文件
+      } else if (
+        "pdf".indexOf(
+          this.pptImgUrl
+            .split(".")
+            [this.pptImgUrl.split(".").length - 1].toLocaleLowerCase()
+        ) != -1
+      ) {
+        this.showPDF = true; //pdf
+      }
+      this.dialogVisible6 = true;
+    },
     searchWork1() {
       this.page = 1;
       this.chooseTask = "";

+ 58 - 16
src/components/pages/components/worksDetail2.vue

@@ -338,7 +338,9 @@
                             <el-button
                               type="primary"
                               size="small"
-                              @click="openFile(worksDetail[sIndex].wpptInfo[0])"
+                              @click="
+                                openFile2(worksDetail[sIndex].wpptInfo[0])
+                              "
                             >
                               查看文档</el-button
                             >
@@ -1396,14 +1398,11 @@
                           </div>
                         </div>
                         <div class="allRightBox">
-                          <span>全部题的正确率:</span
-                          >
+                          <span>全部题的正确率:</span>
                           <span>{{ checkJson[sIndex].allRight + "%" }}</span>
                         </div>
                       </div>
-                      <div v-if="
-                            worksDetail[sIndex].eList.length
-                          ">
+                      <div v-if="worksDetail[sIndex].eList.length">
                         <div class="ech" style="margin-left: 23px">
                           <img src="../../../assets/icon/pj/score.png" alt="" />
                         </div>
@@ -1799,7 +1798,7 @@ export default {
   watch: {
     typeCheck(newValue, oldValue) {
       this.loading = true;
-      this.isLoading = true
+      this.isLoading = true;
       this.tableData = [];
       if (newValue) {
         this.getWorks1();
@@ -1917,7 +1916,7 @@ export default {
           var wordInfo = res.data[12]; //文档作业
           var workEvaList = res.data[13];
           var workJson = {};
-          let checkJson = {}
+          let checkJson = {};
 
           for (var k = 0; k < res.data[0].length; k++) {
             this.allWorks = res.data[0][k];
@@ -1977,7 +1976,7 @@ export default {
               };
               checkJson[stagetask] = {
                 stagetask: stagetask,
-              }
+              };
             }
             workJson[stagetask].time = res.data[0][k].time;
             // for (var i = 0; i < askInfo.length; i++) {
@@ -2132,14 +2131,18 @@ export default {
                       isCount += 0;
                     }
                     for (var q = 0; q < t.radio[p].length; q++) {
-                      checkJson[stagetask][p].checkPerson[parseInt(t.radio[p][q])]
+                      checkJson[stagetask][p].checkPerson[
+                        parseInt(t.radio[p][q])
+                      ]
                         ? checkJson[stagetask][p].checkPerson[
                             parseInt(t.radio[p][q])
                           ].push(res.data[0][k].sName)
                         : (checkJson[stagetask][p].checkPerson[
                             parseInt(t.radio[p][q])
                           ] = [res.data[0][k].sName]);
-                          checkJson[stagetask][p].checkCount[parseInt(t.radio[p][q])]
+                      checkJson[stagetask][p].checkCount[
+                        parseInt(t.radio[p][q])
+                      ]
                         ? checkJson[stagetask][p].checkCount[
                             parseInt(t.radio[p][q])
                           ]++
@@ -2163,7 +2166,7 @@ export default {
                         : (checkJson[stagetask][p].checkPerson[
                             parseInt(t.radio[p])
                           ] = [res.data[0][k].sName]);
-                          checkJson[stagetask][p].checkCount[parseInt(t.radio[p])]
+                      checkJson[stagetask][p].checkCount[parseInt(t.radio[p])]
                         ? checkJson[stagetask][p].checkCount[
                             parseInt(t.radio[p])
                           ]++
@@ -2393,10 +2396,10 @@ export default {
           //   );
           // });
           let result = [];
-          let checkJsonArray = []
+          let checkJsonArray = [];
           for (var wi = 0; wi < Object.keys(workJson).length; wi++) {
             result.push(workJson[Object.keys(workJson)[wi]]);
-            checkJsonArray.push(checkJson[Object.keys(checkJson)[wi]])
+            checkJsonArray.push(checkJson[Object.keys(checkJson)[wi]]);
           }
           var resultNewArray = result.sort(function (x, y) {
             // 以stagetask字段为排序依据
@@ -2426,7 +2429,7 @@ export default {
           });
           result = resultNewArray;
           checkJsonArray = checkJsonNewArray;
-          this.checkJson = checkJsonArray
+          this.checkJson = checkJsonArray;
           for (var l = 0; l < b.length; l++) {
             if (workEvaList.length > 0) {
               for (var p = 0; p < workEvaList.length; p++) {
@@ -2652,6 +2655,45 @@ export default {
       }
       this.dialogVisible6 = true;
     },
+    openFile2(f) {
+      this.pptImgUrl = f.wpptInfo;
+      var fileA = [
+        "DOC",
+        "DOCX",
+        "DOCM",
+        "DOTM",
+        "DOTX",
+        "PPTX",
+        "PPSX",
+        "PPT",
+        "PPS",
+        "PPTM",
+        "POTM",
+        "PPAM",
+        "POTX",
+        "PPSM",
+        "XLSX",
+        "XLS",
+      ];
+      if (
+        fileA.indexOf(
+          this.pptImgUrl
+            .split(".")
+            [this.pptImgUrl.split(".").length - 1].toLocaleUpperCase()
+        ) != -1
+      ) {
+        this.showPDF = false; //word 文件
+      } else if (
+        "pdf".indexOf(
+          this.pptImgUrl
+            .split(".")
+            [this.pptImgUrl.split(".").length - 1].toLocaleLowerCase()
+        ) != -1
+      ) {
+        this.showPDF = true; //pdf
+      }
+      this.dialogVisible6 = true;
+    },
     //获取班级列表
     getClass() {
       let params = {
@@ -3570,7 +3612,7 @@ export default {
   },
   created() {
     this.page = 1;
-    this.isLoading = true
+    this.isLoading = true;
     this.getCourseDetail();
     this.getClass();
     this.getGroup();

+ 40 - 1
src/components/pages/components/worksDetail2GM.vue

@@ -185,7 +185,7 @@
                             </div>
                           </div>
                           <div v-if="worksDetail[sIndex].wpptInfo.length > 0">
-                            <el-button class="btnClassGM" type="primary" size="small" @click="openFile(worksDetail[sIndex].wpptInfo[0])">
+                            <el-button class="btnClassGM" type="primary" size="small" @click="openFile2(worksDetail[sIndex].wpptInfo[0])">
                               查看文档</el-button>
                           </div>
                         </div>
@@ -1082,6 +1082,45 @@ export default {
       this.pptImgUrl = f;
       this.dialogVisible6 = true;
     },
+    openFile2(f) {
+      this.pptImgUrl = f.wpptInfo;
+      var fileA = [
+        "DOC",
+        "DOCX",
+        "DOCM",
+        "DOTM",
+        "DOTX",
+        "PPTX",
+        "PPSX",
+        "PPT",
+        "PPS",
+        "PPTM",
+        "POTM",
+        "PPAM",
+        "POTX",
+        "PPSM",
+        "XLSX",
+        "XLS",
+      ];
+      if (
+        fileA.indexOf(
+          this.pptImgUrl
+            .split(".")
+            [this.pptImgUrl.split(".").length - 1].toLocaleUpperCase()
+        ) != -1
+      ) {
+        this.showPDF = false; //word 文件
+      } else if (
+        "pdf".indexOf(
+          this.pptImgUrl
+            .split(".")
+            [this.pptImgUrl.split(".").length - 1].toLocaleLowerCase()
+        ) != -1
+      ) {
+        this.showPDF = true; //pdf
+      }
+      this.dialogVisible6 = true;
+    },
     //获取班级列表
     getClass() {
       this.isLoading = true;

+ 40 - 1
src/components/pages/components/worksDetail3.vue

@@ -111,7 +111,7 @@
                       <el-button
                         type="primary"
                         size="small"
-                        @click="openFile(worksDetail[sIndex].wpptInfo[0])"
+                        @click="openFile2(worksDetail[sIndex].wpptInfo[0])"
                         >查看文档
                       </el-button>
                     </div>
@@ -2250,6 +2250,45 @@ export default {
       this.pptImgUrl = f;
       this.dialogVisible6 = true;
     },
+    openFile2(f) {
+      this.pptImgUrl = f.wpptInfo;
+      var fileA = [
+        "DOC",
+        "DOCX",
+        "DOCM",
+        "DOTM",
+        "DOTX",
+        "PPTX",
+        "PPSX",
+        "PPT",
+        "PPS",
+        "PPTM",
+        "POTM",
+        "PPAM",
+        "POTX",
+        "PPSM",
+        "XLSX",
+        "XLS",
+      ];
+      if (
+        fileA.indexOf(
+          this.pptImgUrl
+            .split(".")
+            [this.pptImgUrl.split(".").length - 1].toLocaleUpperCase()
+        ) != -1
+      ) {
+        this.showPDF = false; //word 文件
+      } else if (
+        "pdf".indexOf(
+          this.pptImgUrl
+            .split(".")
+            [this.pptImgUrl.split(".").length - 1].toLocaleLowerCase()
+        ) != -1
+      ) {
+        this.showPDF = true; //pdf
+      }
+      this.dialogVisible6 = true;
+    },
     //获取班级列表
     getClass() {
       let params = {

+ 40 - 1
src/components/pages/components/worksDetail3GM.vue

@@ -66,7 +66,7 @@
                       </div>
                     </div>
                     <div v-if="worksDetail[sIndex].wpptInfo.length > 0">
-                      <el-button class="btnClassGM" type="primary" size="small" @click="openFile(worksDetail[sIndex].wpptInfo[0])">查看文档
+                      <el-button class="btnClassGM" type="primary" size="small" @click="openFile2(worksDetail[sIndex].wpptInfo[0])">查看文档
                       </el-button>
                     </div>
                   </div>
@@ -932,6 +932,45 @@ export default {
       this.pptImgUrl = f;
       this.dialogVisible6 = true;
     },
+    openFile2(f) {
+      this.pptImgUrl = f.wpptInfo;
+      var fileA = [
+        "DOC",
+        "DOCX",
+        "DOCM",
+        "DOTM",
+        "DOTX",
+        "PPTX",
+        "PPSX",
+        "PPT",
+        "PPS",
+        "PPTM",
+        "POTM",
+        "PPAM",
+        "POTX",
+        "PPSM",
+        "XLSX",
+        "XLS",
+      ];
+      if (
+        fileA.indexOf(
+          this.pptImgUrl
+            .split(".")
+            [this.pptImgUrl.split(".").length - 1].toLocaleUpperCase()
+        ) != -1
+      ) {
+        this.showPDF = false; //word 文件
+      } else if (
+        "pdf".indexOf(
+          this.pptImgUrl
+            .split(".")
+            [this.pptImgUrl.split(".").length - 1].toLocaleLowerCase()
+        ) != -1
+      ) {
+        this.showPDF = true; //pdf
+      }
+      this.dialogVisible6 = true;
+    },
     //获取班级列表
     getClass() {
       this.isLoading = true;

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

@@ -1427,6 +1427,7 @@ export default {
         })
         .catch((err) => {
           this.isLoading = false;
+          this.$message.error('因加载数据量过大,服务器统计异常,请联系管理员。');
           console.error(err);
         });
     },

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

@@ -750,6 +750,7 @@ export default {
         })
         .catch((err) => {
           this.isLoading = false;
+          this.$message.error('因加载数据量过大,服务器统计异常,请联系管理员。');
           console.error(err);
         });
     },

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

@@ -935,6 +935,7 @@ export default {
         })
         .catch((err) => {
           this.isLoading = false;
+          this.$message.error('因加载数据量过大,服务器统计异常,请联系管理员。');
           console.error(err);
         });
     },

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

@@ -1051,6 +1051,7 @@ export default {
         })
         .catch((err) => {
           this.rankLoading = false;
+          this.$message.error('因加载数据量过大,服务器统计异常,请联系管理员。');
           console.error(err);
         });
     },

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

@@ -970,6 +970,7 @@ export default {
         })
         .catch((err) => {
           this.isLoading = false;
+          this.$message.error('因加载数据量过大,服务器统计异常,请联系管理员。');
           console.error(err);
         });
     },

+ 40 - 1
src/components/pages/myReport/components/MyLookComponent/worksDetail3.vue

@@ -111,7 +111,7 @@
                       <el-button
                         type="primary"
                         size="small"
-                        @click="openFile(worksDetail[sIndex].wpptInfo[0])"
+                        @click="openFile2(worksDetail[sIndex].wpptInfo[0])"
                         >查看文档
                       </el-button>
                     </div>
@@ -2249,6 +2249,45 @@ export default {
       this.pptImgUrl = f;
       this.dialogVisible6 = true;
     },
+    openFile2(f) {
+      this.pptImgUrl = f.wpptInfo;
+      var fileA = [
+        "DOC",
+        "DOCX",
+        "DOCM",
+        "DOTM",
+        "DOTX",
+        "PPTX",
+        "PPSX",
+        "PPT",
+        "PPS",
+        "PPTM",
+        "POTM",
+        "PPAM",
+        "POTX",
+        "PPSM",
+        "XLSX",
+        "XLS",
+      ];
+      if (
+        fileA.indexOf(
+          this.pptImgUrl
+            .split(".")
+            [this.pptImgUrl.split(".").length - 1].toLocaleUpperCase()
+        ) != -1
+      ) {
+        this.showPDF = false; //word 文件
+      } else if (
+        "pdf".indexOf(
+          this.pptImgUrl
+            .split(".")
+            [this.pptImgUrl.split(".").length - 1].toLocaleLowerCase()
+        ) != -1
+      ) {
+        this.showPDF = true; //pdf
+      }
+      this.dialogVisible6 = true;
+    },
     //获取班级列表
     getClass() {
       let params = {

+ 163 - 77
src/components/pages/student/addCourse.vue

@@ -877,7 +877,7 @@
                           padding: 0 0 15px 0;
                           border-bottom: 1px solid #efefef;
                           margin-bottom: 15px;
-                        " v-for="(itemTool, toolIndex) in itemTask.toolArray" :key="toolIndex">
+                        " v-for="(itemTool, toolIndex) in itemTask.toolArray" :key="toolIndex" v-loading="downLoading == 'down'+toolIndex">
                         <div style="
                             display: flex;
                             flex-direction: row;
@@ -1135,7 +1135,7 @@
                                       <div class="vedioTimeBox" v-for="(
                                         chapter, cIndex
                                       ) in itemTool.toolData" :key="cIndex + '1'"
-                                        @click="setChapterIndex(itemTool, cIndex)">
+                                        @click="setChapterIndex(itemTool, cIndex, toolIndex)">
                                         <div class="vedioName" :class="{
                                           isClickNav:
                                             itemTool.sourceIndex == cIndex,
@@ -1169,7 +1169,7 @@
                                     .type == 9
                                   " type="primary" @click="
                                 downloadFile(
-                                  itemTool.toolData[itemTool.sourceIndex].src
+                                  itemTool.toolData[itemTool.sourceIndex].src,toolIndex
                                 )
                                 ">文件下载</el-button>
                                 <el-button v-if="itemTool.toolData[itemTool.sourceIndex]
@@ -1225,7 +1225,7 @@
                               openAsk(photo.content, itemTaskIndex, toolIndex)
                               " />
                             <img v-if="photo.type == 13" src="../../../assets/icon/zip.png" alt=""
-                              @click="downloadFile(photo.content)" />
+                              @click="downloadFile(photo.content, toolIndex)" />
                             <img v-if="photo.type == 5" src="../../../assets/icon/isVideo.png" alt=""
                               @click="openVideo(photo.content)" />
                             <img class="deleteImg" src="../../../assets/deleteworks.png" v-if="photo.userid == userid &&
@@ -2868,7 +2868,8 @@ export default {
       total: 0,
       page: 0,
       sourceData: {},
-      updateWorkJson: {}
+      updateWorkJson: {},
+      downLoading: ''
     };
   },
   computed: {
@@ -3966,12 +3967,13 @@ export default {
       this.$forceUpdate();
       this.dialogVisibleSource2 = false;
     },
-    downloadFile2(f) {
-      const loading = this.$loading.service({
-        background: "rgba(255, 255, 255, 0.7)",
-        target: document.body,
-        text: "文件加载中...",
-      });
+    downloadFile2(f,toolIndex) {
+      var credentials = {
+        accessKeyId: "AKIATLPEDU37QV5CHLMH",
+        secretAccessKey: "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",
+      }; //秘钥形式的登录上传
+      window.AWS.config.update(credentials);
+      window.AWS.config.region = "cn-northwest-1"; //设置区域
       let url2 = f.url;
       let _url2 = "";
       if (
@@ -3983,35 +3985,76 @@ export default {
       } else {
         _url2 = url2;
       }
-      let params = {
-        url: _url2,
-        name: f.name,
+      let _this = this;
+
+      _this.downLoading = 'down'+toolIndex
+      var s3 = new window.AWS.S3({ params: { Bucket: "ccrb" } });
+      let name = decodeURIComponent(decodeURIComponent(_url2).split("https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/")[1])
+      var params = {
+        Bucket: "ccrb",
+        Key: name
       };
-      this.ajax
-        .get(this.$store.state.api + "download", params)
-        .then((res) => {
-          loading.close();
-          let content = res.data.data.data;
-          let ab = new ArrayBuffer(content.length);
-          let view = new Uint8Array(ab);
-          for (var i = 0; i < content.length; ++i) {
-            view[i] = content[i];
-          }
-          let elink = document.createElement("a");
-          elink.download = f.name;
-          elink.style.display = "none";
-          let blob = new Blob([ab], {
-            type: res.data.response.headers["content-type"] + ";charset=UTF-8",
-          });
-          elink.href = URL.createObjectURL(blob);
-          document.body.appendChild(elink);
-          elink.click();
-          document.body.removeChild(elink);
-        })
-        .catch((err) => {
-          loading.close();
-          console.error(err);
-        });
+      s3.getObject(params, function (err, data) {
+        _this.downLoading = ''
+        if (err) console.log(err, err.stack); // an error occurred
+        else {
+          let url = window.URL.createObjectURL(new Blob([data.Body]));
+          let a = document.createElement("a");
+          a.name = f.name;
+          a.href = url;
+          a.download = f.name;
+          a.click();
+          console.log(data); 
+        }          // sxuccessful response
+
+      });
+      
+      return;
+      // const loading = this.$loading.service({
+      //   background: "rgba(255, 255, 255, 0.7)",
+      //   target: document.body,
+      //   text: "文件加载中...",
+      // });
+      // let url2 = f.url;
+      // let _url2 = "";
+      // if (
+      //   url2.indexOf("https://view.officeapps.live.com/op/view.aspx?src=") != -1
+      // ) {
+      //   _url2 = url2.split(
+      //     "https://view.officeapps.live.com/op/view.aspx?src="
+      //   )[1];
+      // } else {
+      //   _url2 = url2;
+      // }
+      // let params = {
+      //   url: _url2,
+      //   name: f.name,
+      // };
+      // this.ajax
+      //   .get(this.$store.state.api + "download", params)
+      //   .then((res) => {
+      //     loading.close();
+      //     let content = res.data.data.data;
+      //     let ab = new ArrayBuffer(content.length);
+      //     let view = new Uint8Array(ab);
+      //     for (var i = 0; i < content.length; ++i) {
+      //       view[i] = content[i];
+      //     }
+      //     let elink = document.createElement("a");
+      //     elink.download = f.name;
+      //     elink.style.display = "none";
+      //     let blob = new Blob([ab], {
+      //       type: res.data.response.headers["content-type"] + ";charset=UTF-8",
+      //     });
+      //     elink.href = URL.createObjectURL(blob);
+      //     document.body.appendChild(elink);
+      //     elink.click();
+      //     document.body.removeChild(elink);
+      //   })
+      //   .catch((err) => {
+      //     loading.close();
+      //     console.error(err);
+      //   });
     },
     pasteLine(i) {
       navigator.clipboard
@@ -5181,9 +5224,9 @@ export default {
       this.taskCount = itemTaskIndex;
       this.dialogVisibleSource = true;
     },
-    setChapterIndex(itemTool, index) {
+    setChapterIndex(itemTool, index, toolIndex) {
       if (itemTool.toolData[index].type == 12) {
-        this.downloadFile2(itemTool.toolData[index])
+        this.downloadFile2(itemTool.toolData[index], toolIndex)
         return;
       }
       itemTool.sourceIndex = index;
@@ -5270,6 +5313,7 @@ export default {
       this.sourcesData = [];
       this.dialogVisibleSource = false;
       this.dialogVisibleTool = false;
+      this.$forceUpdate();
       this.setVHeight();
     },
     openToolFun(tool, taskCount, i) {
@@ -8243,49 +8287,91 @@ export default {
       this.fulltype = type;
       this.fullUrl = url;
     },
-    downloadFile(url) {
-      let _this = this;
-      let _url = "";
+    downloadFile(url, toolIndex) {
+      var credentials = {
+        accessKeyId: "AKIATLPEDU37QV5CHLMH",
+        secretAccessKey: "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",
+      }; //秘钥形式的登录上传
+      window.AWS.config.update(credentials);
+      window.AWS.config.region = "cn-northwest-1"; //设置区域
+      let url2 = url;
+      let _url2 = "";
       if (
-        url.indexOf("https://view.officeapps.live.com/op/view.aspx?src=") != -1
+        url2.indexOf("https://view.officeapps.live.com/op/view.aspx?src=") != -1
       ) {
-        _url = url.split(
+        _url2 = url2.split(
           "https://view.officeapps.live.com/op/view.aspx?src="
         )[1];
       } else {
-        _url = url;
+        _url2 = url2;
       }
-      const x = new XMLHttpRequest();
-      x.open("GET", _url, true);
-      x.responseType = "blob";
-      const loading = _this.$loading.service({
-        background: "rgba(255, 255, 255, 0.7)",
-        target: document.body,
-        text: '文件加载中...'
-      });
-      // _this.$message.success("文件下载中...");
-      x.onload = function (e) {
-        loading.close();
-        // const url = window.URL.createObjectURL(x.response);
-        // const a = document.createElement("a");
-        // a.href = url;
-        // a.target = "_blank";
-        // a.download = url;
-        // a.click();
-        // a.remove();
-        let content = x.response;
-        let elink = document.createElement("a");
-        elink.download = decodeURI(
-          _url.split("https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/")[1]
-        );
-        elink.style.display = "none";
-        let blob = new Blob([content]);
-        elink.href = URL.createObjectURL(blob);
-        document.body.appendChild(elink);
-        elink.click();
-        document.body.removeChild(elink);
+      let _this = this;
+
+      _this.downLoading = 'down'+toolIndex
+      var s3 = new window.AWS.S3({ params: { Bucket: "ccrb" } });
+      let name = decodeURIComponent(decodeURIComponent(_url2).split("https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/")[1])
+      var params = {
+        Bucket: "ccrb",
+        Key: name
       };
-      x.send();
+      s3.getObject(params, function (err, data) {
+        _this.downLoading = ''
+        if (err) console.log(err, err.stack); // an error occurred
+        else {
+          let url = window.URL.createObjectURL(new Blob([data.Body]));
+          let a = document.createElement("a");
+          a.name = name;
+          a.href = url;
+          a.download = name;
+          a.click();
+          console.log(data); 
+        }          // sxuccessful response
+
+      });
+      
+      return;
+      // let _this = this;
+      // let _url = "";
+      // if (
+      //   url.indexOf("https://view.officeapps.live.com/op/view.aspx?src=") != -1
+      // ) {
+      //   _url = url.split(
+      //     "https://view.officeapps.live.com/op/view.aspx?src="
+      //   )[1];
+      // } else {
+      //   _url = url;
+      // }
+      // const x = new XMLHttpRequest();
+      // x.open("GET", _url, true);
+      // x.responseType = "blob";
+      // const loading = _this.$loading.service({
+      //   background: "rgba(255, 255, 255, 0.7)",
+      //   target: document.body,
+      //   text: '文件加载中...'
+      // });
+      // // _this.$message.success("文件下载中...");
+      // x.onload = function (e) {
+      //   loading.close();
+      //   // const url = window.URL.createObjectURL(x.response);
+      //   // const a = document.createElement("a");
+      //   // a.href = url;
+      //   // a.target = "_blank";
+      //   // a.download = url;
+      //   // a.click();
+      //   // a.remove();
+      //   let content = x.response;
+      //   let elink = document.createElement("a");
+      //   elink.download = decodeURI(
+      //     _url.split("https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/")[1]
+      //   );
+      //   elink.style.display = "none";
+      //   let blob = new Blob([content]);
+      //   elink.href = URL.createObjectURL(blob);
+      //   document.body.appendChild(elink);
+      //   elink.click();
+      //   document.body.removeChild(elink);
+      // };
+      // x.send();
     },
     editSourceUpadte(taskCount, index) {
       this.taskCount = taskCount;

+ 29 - 15
src/components/pages/test/add/addTest.vue

@@ -25,7 +25,7 @@
                 </div>
                 <div class="step_box" :style="{ width: steps == 2 && '100%' }">
                     <setInfo v-if="steps == 1 && !loading" :oid="oid" :org="org" :steps.sync="steps" :title.sync="title"
-                        :testType.sync="testType" :see.sync="see" :cJson.sync="cJson"></setInfo>
+                        :testType.sync="testType" :see.sync="see" :cJson.sync="cJson" :typeid.sync="typeid" :brief.sync="brief" :juri.sync="juri"></setInfo>
                     <editInfo v-if="steps == 2 && !loading" :oid="oid" :org="org" :steps.sync="steps" :title.sync="title"
                         :cJson.sync="cJson" @save="save" @publish="publish"></editInfo>
                 </div>
@@ -55,6 +55,9 @@ export default {
             cJson: [],
             loading:false,
             look:"",
+            typeid:"",
+            brief:"",
+            juri:'0',
         }
     },
     watch: {
@@ -121,20 +124,21 @@ export default {
                 {
                     uid: this.userid,
                     title: this.title.replace(/%/g, "%25"),
-                    brief: "",
+                    brief: this.brief.replace(/%/g, "%25"),
                     cover: "",
                     evaId: "",
-                    astudent: "",
+                    astudent: this.juri,
                     see: this.see == true ? 1 : 0,
                     chapters: JSON.stringify(this.cJson).replaceAll(/%/g, "%25"),
                     template: "",
                     courseType: JSON.stringify(this.testType),
                     ateacher: "",
                     inviteCode: "",
+                    typeid: this.typeid ? this.typeid : '',
                 },
             ];
             this.ajax
-                .post(this.$store.state.api + "addTestCourse", params)
+                .post(this.$store.state.api + "addTestCourse2", params)
                 .then((res) => {
                     this.cid = res.data.courseId;
                     if(look == 5){
@@ -150,7 +154,9 @@ export default {
                             this.role
                         );
                     }
-                    this.getData();
+                    setTimeout(() => {
+                        this.getData(2);
+                    }, 1000);
                 })
                 .catch((err) => {
                     this.$message.error("网络不佳");
@@ -162,10 +168,10 @@ export default {
                 {
                     cid: this.cid,
                     title: this.title.replace(/%/g, "%25"),
-                    brief: "",
+                    brief: this.brief.replace(/%/g, "%25"),
                     cover: "",
                     evaId: "",
-                    astudent: "",
+                    astudent: this.juri,
                     see: this.see == true ? 1 : 0,
                     chapters: JSON.stringify(this.cJson).replaceAll(/%/g, "%25"),
                     uid: this.userid,
@@ -173,10 +179,11 @@ export default {
                     ateacher: "",
                     inviteCode: "",
                     look: look == 3 ? 2 : look == 4 ? this.look : look == 5 ? this.look : look,
+                    typeid: this.typeid ? this.typeid : '',
                 },
             ];
             this.ajax
-                .post(this.$store.state.api + "updateTestCourse", params)
+                .post(this.$store.state.api + "updateTestCourse2", params)
                 .then((res) => {
                     if(look == 3){
                         this.$message.success("发布成功")
@@ -207,18 +214,22 @@ export default {
                             this.role
                         );
                     }
-                    this.getData();
+                    setTimeout(() => {
+                        this.getData(2);
+                    }, 1000);
                 })
                 .catch((err) => {
                     this.$message.error("网络不佳");
                     console.error(err);
                 });
         },
-        getData() {
+        getData(type) {
             if (this.cid == "" || this.cid == undefined) {
                 console.log("这是新增课程");
             } else {
-                this.loading = true
+                if(type != 2){
+                    this.loading = true
+                }
                 let params = {
                     cid: this.cid,
                 };
@@ -226,20 +237,23 @@ export default {
                     .get(this.$store.state.api + "getTestCourseDetail", params)
                     .then((res) => {
                         this.cJson = JSON.parse(res.data[0][0].chapters);
-                        this.$forceUpdate();
                         this.title = res.data[0][0].title;
+                        this.juri = res.data[0][0].juri ? res.data[0][0].juri : '0';
 
                         this.see = res.data[0][0].open == 1 ? true : false;
 
-              
+                        this.typeid = res.data[0][0].typeid;
+                        this.brief = res.data[0][0].brief;
                         this.testType = [];
                         for (var i = 0; i < res.data[1].length; i++) {
                             this.testType.push(res.data[1][i].typeid);
                         }
                         console.log(this.testType);
                         this.look = res.data[0][0].look
-                        this.loading = false
-
+                        this.$forceUpdate()
+                        if(type != 2){
+                            this.loading = false
+                        }
                     })
                     .catch((err) => {
                         console.error(err);

+ 5 - 2
src/components/pages/test/add/components/GapFilling/gap.vue

@@ -10,7 +10,7 @@
             </div>
             <div class="choices">
                 <textarea readonly rows="2" class="binfo_input binfo_textarea" cols
-                    placeholder=""></textarea>
+                    placeholder="填写者回答区"></textarea>
             </div>
         </div>
     </div>
@@ -36,8 +36,11 @@ export default {
 
 <style scoped>
 .c_box {
-    width: 100%;
+    width: calc(100% - 20px);
     position: relative;
+    margin: 0 auto;
+    padding-left: 26px;
+    box-sizing: border-box;
 }
 .mask{
     position: absolute;

+ 10 - 9
src/components/pages/test/add/components/GapFilling/index.vue

@@ -74,6 +74,7 @@ export default {
         checkJson: {
             handler(newVal) {
                 this.$emit("setJson", newVal)
+                console.log('gapW', this.cJson);
             },
             deep: true
         }
@@ -110,17 +111,17 @@ export default {
         } else {
             this.checkJson = this.depthCopy(this.cJson);
         }
-
+        console.log('gap', this.cJson);
     },
 }
 </script>
 
 <style scoped>
 .choice_box {
-    margin-top: 20px;
+    margin-top: 10px;
     width: 100%;
-    background: #f6f6f6;
-    padding: 10px;
+    background: #f5f6f7;
+    padding: 10px 10px 10px 36px;
     box-sizing: border-box;
     position: relative;
 }
@@ -178,11 +179,11 @@ export default {
     font-family: 'Microsoft YaHei';
     min-height: 48px;
     /* border: 1px solid #3682fc00; */
-    border: 1.5px solid #CAD1DC;
+    border: 1px solid #CAD1DC;
 }
 
 .binfo_textarea {
-    border: 1.5px solid #CAD1DC;
+    border: 1px solid #CAD1DC;
     font-size: 16px;
     resize: none;
     /* background: #f6f6f6; */
@@ -190,10 +191,10 @@ export default {
 }
 
 .binfo_input:focus-visible {
-    border: 1.5px solid #3681FC !important;
+    border: 1px solid #3681FC !important;
 }
 
-.jiao::before{
+/* .jiao::before{
     content: '';
     position: absolute;
     width: 0px;
@@ -204,5 +205,5 @@ export default {
     border-right: 12px solid transparent;
     border-bottom: 10px solid #f6f6f6;
     border-top: 10px solid transparent;
-}
+} */
 </style>

+ 78 - 34
src/components/pages/test/add/components/checkOrder.vue

@@ -2,9 +2,10 @@
     <div class="co_box">
         <div v-for="(item1, index1) in this.checkJson" :key="index1" class="mc_ti_1" :draggable="isdrag == `${index1}`"
             :class="{ active: checkC === `x${index1}` }" @click.stop="checkTitle(`${index1}`, 1, item1)">
-            <div class="title">
+            <div class="title" :style="{ fontSize: etype == 'order' && '16px' }">
                 <div class="drag" @mousedown="setDrag(`${index1}`)" @mouseup="isdrag = ''"></div>
-                <span>{{ selectType(item1, index1) }}</span>
+                <span class="content" v-html="selectType(item1, index1)"></span>
+                <!-- {{ selectType(item1, index1) }} -->
                 <div class="btnBox">
                     <!-- <div class="edit" @click.stop="editCheck(`${index1}`,item1)" v-if="item1.ttype == 1 && canEdit.indexOf(item1.type) !== -1 && etype == 'edit'"></div> -->
                     <div class="delete" @click.stop="deleteCheck(`${index1}`)"></div>
@@ -16,9 +17,9 @@
                 <div v-for="(item2, index2) in item1.array" :key="`${index1}-${index2}`" class="mc_ti_2"
                     :draggable="isdrag == `${index1}-${index2}`" :class="{ active: checkC === `x${index1}-${index2}` }"
                     @click.stop="checkTitle(`${index1}-${index2}`, 2, item2)">
-                    <div class="title">
+                    <div class="title" :style="{ fontSize: etype == 'order' && '16px' }">
                         <div class="drag" @mousedown="setDrag(`${index1}-${index2}`)" @mouseup="isdrag = ''"></div>
-                        <span>{{ selectType(item2, index2) }}</span>
+                        <span class="content" v-html="selectType(item2, index2)"></span>
                         <div class="btnBox">
                             <!-- <div class="edit" @click.stop="editCheck(`${index1}-${index2}`,item2)" v-if="item2.ttype == 1 && canEdit.indexOf(item2.type) !== -1 && etype == 'edit'"></div> -->
                             <div class="delete" @click.stop="deleteCheck(`${index1}-${index2}`)"></div>
@@ -31,10 +32,10 @@
                             :draggable="isdrag == `${index1}-${index2}-${index3}`"
                             :class="{ active: checkC === `x${index1}-${index2}-${index3}` }"
                             @click.stop="checkTitle(`${index1}-${index2}-${index3}`, 3, item3)">
-                            <div class="title">
+                            <div class="title" :style="{ fontSize: etype == 'order' && '16px' }">
                                 <div class="drag" @mousedown="setDrag(`${index1}-${index2}-${index3}`)"
                                     @mouseup="isdrag = ''"></div>
-                                <span>{{ selectType(item3, index3) }}</span>
+                                <span class="content" v-html="selectType(item3, index3)"></span>
                                 <div class="btnBox">
                                     <!-- <div class="edit" @click.stop="editCheck(`${index1}-${index2}-${index3}`,item3)" v-if="item3.ttype == 1 && canEdit.indexOf(item3.type) !== -1 && etype == 'edit'"></div> -->
                                     <div class="delete" @click.stop="deleteCheck(`${index1}-${index2}-${index3}`)"></div>
@@ -133,6 +134,9 @@ export default {
         etype: {
             type: String,
             default: ""
+        },
+        cJson:{
+            type:Object,
         }
     },
     data() {
@@ -141,14 +145,22 @@ export default {
             isdrag: "",
             canEdit: [1, 3, 5],
             ctype: "",
-            cJson: {}
+            // cJson: {}
         }
     },
     computed: {
         selectType() {
             return function (item, index) {
                 if (item.ttype == 1) {
-                    return index + 1 + "、" + this.options2[item.type] + (item.json && this.etype != 'edit' ? `:${item.json.title}` : "");
+                    let className = "test_icon"
+                    if(item.type == 1){
+                        className += " test_icon_check"
+                    }else if(item.type == 3){
+                        className += " test_icon_gap"
+                    }else if(item.type == 5){
+                        className += " test_icon_file"
+                    }
+                    return index + 1 + "、" + (item.json && this.etype != 'edit' ? `<span class='${className}'></span>` : `<span class='${className}'></span>`+this.options2[item.type]) + (item.json && this.etype != 'edit' ? `${item.json.title}` : "");
                 } else if (item.ttype == 2) {
                     return `第${index + 1}组 (共${item.array.length}题)`;
                 } else if (item.ttype == 3) {
@@ -181,25 +193,32 @@ export default {
             this.$emit("changeJson", this.manualJson);
         },
         checkTitle(index, type, item) {
+            let _index = index.split("-");
+            let cJson = {}
+            if (type == 1 && item.ttype == 1) {
+                cJson = this.manualJson[_index[0]].json ? JSON.parse(JSON.stringify(this.manualJson[_index[0]].json)) : '';
+            } else if (type == 2 && item.ttype == 1) {
+                cJson = this.manualJson[_index[0]].array[_index[1]].json ? JSON.parse(JSON.stringify(this.manualJson[_index[0]].array[_index[1]].json)) : '';
+            } else if (type == 3 && item.ttype == 1) {
+                cJson = this.manualJson[_index[0]].array[_index[1]].array[_index[2]].json ? JSON.parse(JSON.stringify(this.manualJson[_index[0]].array[_index[1]].array[_index[2]].json)) : '';
+            }
+            // this.cJson = {type: type, index: _index, item: item}
+            // this.cJson = item.json;
+            this.$forceUpdate();
+            this.ctype = type
             if (this.checkC === "x" + index) {
                 this.$emit("update:checkC", "")
             } else {
                 this.$emit("update:checkC", 'x' + index)
             }
-            let _index = index.split("-");
-
-            this.ctype = type
-            if (this.ctype == 1 && item.ttype == 1) {
-                this.cJson = this.manualJson[_index[0]].json
-            } else if (this.ctype == 2 && item.ttype == 1) {
-                this.cJson = this.manualJson[_index[0]].array[_index[1]].json
-            } else if (this.ctype == 3 && item.ttype == 1) {
-                this.cJson = this.manualJson[_index[0]].array[_index[1]].array[_index[2]].json
-            }
+            this.$forceUpdate();
+            // console.log(this.cJson);
+            this.$emit("update:cJson", cJson)
         },
         setJson(json) {
             let _index = this.checkC.replace("x", "").split("-");
-            this.cJson = json
+            // this.cJson = json
+            this.$emit("update:cJson", json)
             if (this.ctype == 1) {
                 this.manualJson[_index[0]].json = json
             } else if (this.ctype == 2) {
@@ -267,10 +286,11 @@ export default {
 .mc_ti_1 {
     width: 100%;
     min-height: 40px;
-    border: 1px solid #bcbcbc;
-    padding: 10px;
+    /* border: 1px solid #bcbcbc00; */
+    padding: 10px 0 0;
     box-sizing: border-box;
     margin-bottom: 10px;
+    overflow: hidden;
 }
 
 
@@ -280,10 +300,12 @@ export default {
 }
 
 .mc_ti_1>.title {
-    font-size: 20px;
+    font-size: 16px;
     cursor: pointer;
     display: flex;
     align-items: center;
+    width: calc(100% - 20px);
+    margin: 0 auto 10px;
 }
 
 .mc_ti_1_xia,
@@ -296,8 +318,9 @@ export default {
 .mc_ti_2 {
     width: 100%;
     box-sizing: border-box;
-    padding: 10px;
-    border: 1px solid #bcbcbc;
+    padding: 10px 0 0;
+    /* border: 1px solid #bcbcbc00; */
+    overflow: hidden;
 }
 
 .mc_ti_2+.mc_ti_2 {
@@ -306,18 +329,20 @@ export default {
 
 .mc_ti_2>.title {
     cursor: pointer;
-    font-size: 18px;
+    font-size: 16px;
     display: flex;
     align-items: center;
     word-break: break-all;
+    width: calc(100% - 20px);
+    margin: 0 auto 10px;
 }
 
-
 .mc_ti_3 {
-    padding: 10px;
+    padding: 10px 0 0;
     width: 100%;
     box-sizing: border-box;
-    border: 1px solid #bcbcbc;
+    /* border: 1px solid #bcbcbc00; */
+    overflow: hidden;
 }
 
 .mc_ti_3+.mc_ti_3 {
@@ -328,16 +353,19 @@ export default {
     cursor: pointer;
     display: flex;
     align-items: center;
+    width: calc(100% - 20px);
+    margin: 0 auto 10px;
 }
 
 .mc_ti_1>.title>.drag,
 .mc_ti_2>.title>.drag,
 .mc_ti_3>.title>.drag {
     display: block;
-    background-image: url('../../../../../assets/icon/new/icon_course_drag.png');
+    background-image: url('../../../../../assets/icon/test/drag_icon.png');
     background-size: 100% 100%;
-    min-width: 20px;
-    min-height: 20px;
+    min-width: 16px;
+    min-height: 16px;
+    margin-right: 10px;
     cursor: pointer;
 }
 
@@ -392,11 +420,27 @@ export default {
 .mc_ti_1.active,
 .mc_ti_2.active,
 .mc_ti_3.active {
-    border: 1px solid #0062ff;
+    /* border: 1px solid #0062ff; */
+    background: rgb(239, 240, 241);
+}
+
+.mc_ti_1.active>.title>.drag,
+.mc_ti_2.active>.title>.drag,
+.mc_ti_3.active>.title>.drag {
+    background-image: url('../../../../../assets/icon/test/drag_icon_active.png');
+}
+
+.mc_ti_1>.title>.content,
+.mc_ti_2>.title>.content,
+.mc_ti_3>.title>.content {
+    word-break: break-all;
 }
 
 .edit_box {
     width: 100%;
     box-sizing: border-box;
-    padding: 10px;
-}</style>
+    padding: 10px 0 0;
+}
+
+
+</style>

+ 4 - 1
src/components/pages/test/add/components/choice/choice.vue

@@ -34,8 +34,11 @@ export default {
 
 <style scoped>
 .c_box {
-    width: 100%;
+    width: calc(100% - 20px);
     position: relative;
+    margin: 0 auto;
+    padding-left: 26px;
+    box-sizing: border-box;
 }
 .mask{
     position: absolute;

+ 13 - 6
src/components/pages/test/add/components/choice/index.vue

@@ -68,6 +68,13 @@ export default {
         checkJson: {
             handler(newVal) {
                 this.$emit("setJson", newVal)
+                console.log('checkW',this.cJson);
+            },
+            deep: true
+        },
+        cJson: {
+            handler(newVal) {
+                console.log(newVal);
             },
             deep: true
         }
@@ -119,17 +126,17 @@ export default {
         } else {
             this.checkJson = this.depthCopy(this.cJson);
         }
-
+        console.log('check',this.cJson);
     },
 }
 </script>
 
 <style scoped>
 .choice_box {
-    margin-top: 20px;
+    margin-top: 10px;
     width: 100%;
-    background: #f6f6f6;
-    padding: 10px;
+    background: #f5f6f7;
+    padding: 10px 10px 10px 36px;
     box-sizing: border-box;
     position: relative;
 }
@@ -224,7 +231,7 @@ export default {
     margin-top: 10px;
 }
 
-.jiao::before{
+/* .jiao::before{
     content: '';
     position: absolute;
     width: 0px;
@@ -235,5 +242,5 @@ export default {
     border-right: 12px solid transparent;
     border-bottom: 10px solid #f6f6f6;
     border-top: 10px solid transparent;
-}
+} */
 </style>

+ 4 - 1
src/components/pages/test/add/components/file/file.vue

@@ -42,8 +42,11 @@ export default {
 
 <style scoped>
 .c_box {
-    width: 100%;
+    width: calc(100% - 20px);
     position: relative;
+    margin: 0 auto;
+    padding-left: 26px;
+    box-sizing: border-box;
 }
 .mask{
     position: absolute;

+ 8 - 8
src/components/pages/test/add/components/file/index.vue

@@ -117,10 +117,10 @@ export default {
 
 <style scoped>
 .choice_box {
-    margin-top: 20px;
+    margin-top: 10px;
     width: 100%;
-    background: #f6f6f6;
-    padding: 10px;
+    background: #f5f6f7;
+    padding: 10px 10px 10px 36px;
     box-sizing: border-box;
     position: relative;
 }
@@ -178,11 +178,11 @@ export default {
     font-family: 'Microsoft YaHei';
     min-height: 48px;
     /* border: 1px solid #3682fc00; */
-    border: 1.5px solid #CAD1DC;
+    border: 1px solid #CAD1DC;
 }
 
 .binfo_textarea {
-    border: 1.5px solid #CAD1DC;
+    border: 1px solid #CAD1DC;
     font-size: 16px;
     resize: none;
     /* background: #f6f6f6; */
@@ -190,10 +190,10 @@ export default {
 }
 
 .binfo_input:focus-visible {
-    border: 1.5px solid #3681FC !important;
+    border: 1px solid #3681FC !important;
 }
 
-.jiao::before{
+/* .jiao::before{
     content: '';
     position: absolute;
     width: 0px;
@@ -204,5 +204,5 @@ export default {
     border-right: 12px solid transparent;
     border-bottom: 10px solid #f6f6f6;
     border-top: 10px solid transparent;
-}
+} */
 </style>

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

@@ -75,8 +75,8 @@ import videoIcon from '../../../../../../assets/icon/fileIcon/isVideo.png'
 import wordIcon from '../../../../../../assets/icon/fileIcon/isWord.png'
 import fileIcon from '../../../../../../assets/icon/fileIcon/word2.png'
 
-import wpdf from "../../../file/wpdf.vue";
 import wVideo from "../../../file/wVideo.vue";
+import wpdf from "../../../file/wPdf2.vue";
 import wOffice from "../../../file/wOffice.vue";
 export default {
     components: {

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

@@ -9,7 +9,7 @@
                 <!-- </div><div v-html="checkJson.title"></div> -->
             </div>
             <div class="choices">
-                <textarea  :readonly="checktype == 2" rows="2" v-autoHeight="68" class="binfo_input binfo_textarea" cols v-model="checkJson.answer2"
+                <textarea :readonly="checktype == 2" rows="2" v-autoHeight="68" class="binfo_input binfo_textarea" cols v-model="checkJson.answer2"
                     placeholder=""></textarea>
             </div>
         </div>

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

@@ -209,10 +209,14 @@ export default {
   margin: 0 auto;
 }
 
-.check_box {}
+.check_box {
+
+}
 
 .check_box+.check_box {
   margin-top: 10px;
+  padding-top: 10px;
+  border-top: 1px solid #eee;
 }
 
 .check_box>.title {

+ 76 - 49
src/components/pages/test/add/edit/edit/index.vue

@@ -1,14 +1,19 @@
 <template>
     <div class="edit_box">
         <div class="e_add">
-            <div class="title">题目添加</div>
+            <div class="title" style="margin-bottom: 20px;">题目添加</div>
             <div class="e_add_box">
-                <div class="title">添加题型</div>
+                <div class="title">基础题型</div>
                 <div class="e_add_ci">
-                    <div class="title">基础题型</div>
+                    <!-- <div class="title">基础题型</div> -->
                     <div class="box">
-                        <div class="btn" v-for="item in options" :key="item.label" @click="addCheck(item.value)"><el-button type="primary"
-                                size="mini">{{ item.label }}</el-button></div>
+                        <div class="btn" v-for="item in options" :key="item.label" @click="addCheck(item.value)">
+                            <!-- <el-button type="primary"
+                                size="mini">{{ item.label }}</el-button> -->
+                            <button class="pub_test_btn"
+                                :class="{ pub_test_btn_text: item.value == 3, pub_test_btn_choose: item.value == 1, pub_test_btn_file: item.value == 5 }">{{
+                                    item.label }}</button>
+                        </div>
                     </div>
                 </div>
             </div>
@@ -16,22 +21,29 @@
                 <div class="title">添加组件</div>
                 <div class="e_add_ci">
                     <div class="box">
-                        <div class="btn" v-for="item in buttonOptions" :key="item.name" @click="addQtype(item.type)"><el-button type="primary"
-                                size="mini">{{ item.name }}</el-button></div>
+                        <div class="btn" v-for="item in buttonOptions" :key="item.name" @click="addQtype(item.type)">
+                            <!-- <el-button type="primary"
+                                size="mini">{{ item.name }}</el-button> -->
+                            <button class="pub_test_btn"
+                                :class="{ pub_test_btn_group: item.type == 1, pub_test_btn_page: item.type == 2 }">{{ item.name
+                                }}</button>
+                        </div>
                     </div>
                 </div>
             </div>
         </div>
         <div class="e_content">
-            <div class="title">{{title}}</div>
+            <div class="title">{{ title }}</div>
             <div class="e_order_box">
-                <checkOrder :checkC.sync="checkC" :checkJson="manualJson" @changeJson="changeJson" etype="edit"></checkOrder>
+                <checkOrder :checkC.sync="checkC" :checkJson="manualJson" @changeJson="changeJson" etype="edit" :cJson.sync="cJson">
+                </checkOrder>
             </div>
         </div>
         <div class="e_order">
             <div class="title">题目排序 <span style="font-size: 14px;color: #373737;">总分:{{ score }}分</span></div>
             <div class="e_order_box" style="margin-top: 20px;">
-                <checkOrder :checkC.sync="checkC" :checkJson="manualJson" @changeJson="changeJson"></checkOrder>
+                <checkOrder :checkC.sync="checkC" :checkJson="manualJson" @changeJson="changeJson" etype="order" :cJson.sync="cJson">
+                </checkOrder>
             </div>
         </div>
     </div>
@@ -49,19 +61,20 @@ export default {
         checkJson: {
             type: Array,
         },
-        title:{
-            type:String
+        title: {
+            type: String
         }
     },
     data() {
         return {
             manualJson: [],
             checkC: "",
+            cJson:{}
         }
     },
     watch: {
-        checkJson:{
-            handler(newVal){
+        checkJson: {
+            handler(newVal) {
                 this.manualJson = this.depthCopy(newVal);
             },
             deep: true
@@ -73,21 +86,21 @@ export default {
             this.manualJson.forEach(el => {
                 if ((el.ttype == 3 || el.ttype == 2) && el.array.length > 0) {
                     el.array.forEach(item => {
-                      if(item.ttype == 2 && item.array.length > 0){
-                          item.array.forEach(item2 => {
-                            if(item2.ttype == 1 && item2.json){
-                                score += item2.json.score ? parseFloat(item2.json.score) : 0
-                            } 
-                          })
-                      } else if(item.ttype == 1 && item.json){
-                        score += item.json.score ? parseFloat(item.json.score) : 0
-                      } 
+                        if (item.ttype == 2 && item.array.length > 0) {
+                            item.array.forEach(item2 => {
+                                if (item2.ttype == 1 && item2.json) {
+                                    score += item2.json.score ? parseFloat(item2.json.score) : 0
+                                }
+                            })
+                        } else if (item.ttype == 1 && item.json) {
+                            score += item.json.score ? parseFloat(item.json.score) : 0
+                        }
                     })
-                } else if(el.ttype == 1 && el.json){ 
+                } else if (el.ttype == 1 && el.json) {
                     score += el.json.score ? parseFloat(el.json.score) : 0
                 }
             })
-            return  score > 0 ? score : '未设置分数'
+            return score > 0 ? score : '未设置分数'
         }
     },
     methods: {
@@ -116,33 +129,33 @@ export default {
                 if (_json.array) {
                     if (type == 3 && _check.length == 2) {
                         if (this.manualJson[_check[0]].array[_check[1]].array) {
-                                this.manualJson[_check[0]].array[_check[1]].array.push(json)
+                            this.manualJson[_check[0]].array[_check[1]].array.push(json)
                         } else {
-                                this.manualJson[_check[0]].array.splice(parseInt(_check[1]) + 1, 0, json)
+                            this.manualJson[_check[0]].array.splice(parseInt(_check[1]) + 1, 0, json)
                         }
 
                     } else if (type == 3 && _check.length == 3) {
-                            this.manualJson[_check[0]].array[_check[1]].array.splice(parseInt(_check[2]) + 1, 0, json)
+                        this.manualJson[_check[0]].array[_check[1]].array.splice(parseInt(_check[2]) + 1, 0, json)
                     } else if (type == 2 && _check.length == 2) {
-                            this.manualJson[_check[0]].array.splice(parseInt(_check[1]) + 1, 0, json)
+                        this.manualJson[_check[0]].array.splice(parseInt(_check[1]) + 1, 0, json)
                     } else if (type == 2 && _check.length == 1) {
-                            this.manualJson[_check[0]].array.push(json)
+                        this.manualJson[_check[0]].array.push(json)
                     } else if (type == 3 && _check.length == 1) {
-                        if(this.manualJson[_check[0]].array[0] && this.manualJson[_check[0]].array[0].array){
-                                this.manualJson[_check[0]].array[0].array.push(json)
-                        }else{
-                                this.manualJson[_check[0]].array.push(json)
+                        if (this.manualJson[_check[0]].array[0] && this.manualJson[_check[0]].array[0].array) {
+                            this.manualJson[_check[0]].array[0].array.push(json)
+                        } else {
+                            this.manualJson[_check[0]].array.push(json)
                         }
                     }
                 } else {
-                        this.manualJson.splice(parseInt(_check[0]) + 1, 0, json);
+                    this.manualJson.splice(parseInt(_check[0]) + 1, 0, json);
                 }
             } else {
                 if (type == 1) {
-                        this.manualJson.push({
-                            ttype: 1,
-                            type: topicType
-                        });
+                    this.manualJson.push({
+                        ttype: 1,
+                        type: topicType
+                    });
                 } else if (type == 3 || type == 2) {
                     this.$message.error("请选中分页或者分组添加题目");
                     return;
@@ -257,7 +270,7 @@ export default {
     overflow: hidden;
     display: flex;
     justify-content: space-between;
-    padding: 10px 0 0;
+    padding: 0 0 0;
     box-sizing: border-box;
 }
 
@@ -268,18 +281,19 @@ export default {
     overflow: auto;
     padding: 20px 10px;
     box-sizing: border-box;
+    border-right: 1px solid #E5E5E5;
 }
 
 .e_content {
     height: 100%;
-    width: calc(100% - 620px);
+    width: calc(100% - 600px);
     background: #fff;
     overflow: auto;
-    padding: 20px 10px;
+    padding: 20px 0;
     box-sizing: border-box;
 }
 
-.e_content > .title{
+.e_content>.title {
     font-size: 24px;
     font-weight: bold;
     text-align: center;
@@ -305,17 +319,30 @@ export default {
 
 .e_add_box {
     width: 100%;
-    border: 1px solid #dcdcdc;
-    margin-top: 20px;
+    /* border: 1px solid #dcdcdc; */
+    margin-top: 10px;
     border-radius: 3px;
-    background: #f4f4f4;
+    /* background: #f4f4f4; */
     box-sizing: border-box;
-    padding: 10px 20px;
+    padding: 0 20px 0;
 }
 
 .e_add_box>.title {
-    text-align: center;
-    font-weight: bold;
+    margin-bottom: 10px;
+    font-size: 15px;
+    font-weight: 700;
+    display: flex;
+    align-items: center;
+}
+
+.e_add_box>.title::before{
+    content: '';
+    width: 10px;
+    height: 10px;
+    border-radius: 50%;
+    background: rgb(54, 129, 252);
+    margin-right: 10px;
+    display: block;
 }
 
 .e_add_box>.e_add_ci {

+ 92 - 11
src/components/pages/test/add/edit/index.vue

@@ -1,9 +1,12 @@
 <template>
   <div class="rightBox">
+    <div class="title">
+      <div class="c_info_title">创建评测内容</div>
+    </div>
     <div class="edit_top">
       <div class="edit_btn">
-        <span :class="{ active: type == 1 }" @click="type = 1">编辑</span>
-        <span :class="{ active: type == 2 }" @click="type = 2">预览</span>
+        <span class="edit" :class="{ active: type == 1 }" @click="type = 1">编辑</span>
+        <span class="check" :class="{ active: type == 2 }" @click="type = 2">预览</span>
         <!-- <span :class="{ active: type == 3 }" @click="type = 3">回答</span>
         <span :class="{ active: type == 4 }" @click="type = 4">统计</span> -->
       </div>
@@ -15,7 +18,7 @@
       </div>
     </div>
     <div class="e_box">
-      <editBox v-if="type == 1" :checkJson="checkJson"  @changeJson="changeJson" :title="title"></editBox>
+      <editBox v-if="type == 1" :checkJson="checkJson" @changeJson="changeJson" :title="title"></editBox>
       <checkBox v-if="type == 2" :cJson="checkJson" :title="title"></checkBox>
     </div>
   </div>
@@ -55,7 +58,7 @@ export default {
   },
   watch: {
     cJson: {
-      handler: function (newVal, oldVal) { 
+      handler: function (newVal, oldVal) {
         this.checkJson = this.depthCopy(newVal);
       },
       deep: true,
@@ -85,9 +88,31 @@ export default {
 </script>
 
 <style scoped>
+.c_info_title {
+  padding: 15px 0 15px 0;
+  font-size: 16px;
+  font-weight: bold;
+  margin: 0 0 0 0;
+  box-sizing: border-box;
+  display: flex;
+  align-items: center;
+  line-height: 20px;
+}
+
+.c_info_title::before {
+  content: '';
+  display: block;
+  width: 3px;
+  height: 20px;
+  background: #0061FF;
+  border-radius: 3px;
+  margin: 0 5px 0 0;
+}
+
 .rightBox {
   width: calc(100%);
-  background: #F0F2F5;
+  /* background: #F0F2F5; */
+  background: #fff;
   overflow: auto;
   height: calc(100%);
   margin: 0 auto;
@@ -95,6 +120,13 @@ export default {
   box-sizing: border-box;
 }
 
+.rightBox>.title {
+  background: #fff;
+  width: 100%;
+  padding: 0 20px 0;
+  box-sizing: border-box;
+}
+
 .edit_top {
   height: 50px;
   background: #fff;
@@ -106,33 +138,82 @@ export default {
 
 .edit_top>.edit_btn {
   display: flex;
-  height: 100%;
+  height: 40px;
   align-items: center;
+  border: 1px solid #E5E5E5;
+  box-sizing: border-box;
+  padding: 4px;
+  border-radius: 4px;
 }
 
 .edit_top>.edit_btn>span {
   cursor: pointer;
   padding-bottom: 5px;
   display: block;
+  width: 90px;
+  padding: 0 15px;
+  height: 100%;
+  font-size: 14px;
+  box-sizing: border-box;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  border-radius: 4px;
 }
 
 .edit_top>.edit_btn>.active {
   color: #3e88f4;
-  border-bottom: 2px solid #2f80f3;
+  /* border-bottom: 2px solid #2f80f3; */
+  background: rgb(224, 234, 251);
 }
 
 .edit_top>.edit_btn>span+span {
-  margin-left: 35px;
+  margin-left: 10px;
+}
+
+
+.edit_top>.edit_btn>span::before {
+  content: '';
+  display: block;
+  background-size: 100% 100%;
+  margin-right: 8px;
 }
 
+.edit_top>.edit_btn>.check::before {
+  width: 15px;
+  height: 15px;
+  background-image: url(../../../../../assets/icon/test/add_check_icon.png);
+}
+
+.edit_top>.edit_btn>.edit::before {
+  width: 15px;
+  height: 16px;
+  background-image: url(../../../../../assets/icon/test/add_edit_icon.png);
+}
+
+.edit_top>.edit_btn>.active.check::before {
+  background-image: url(../../../../../assets/icon/test/add_check_icon_active.png);
+}
+
+.edit_top>.edit_btn>.active.edit::before {
+  background-image: url(../../../../../assets/icon/test/add_edit_icon_active.png);
+}
+
+
 .edit_top>.op_btn {
   position: absolute;
   right: 30px;
 }
 
 .e_box {
-  height: calc(100% - 50px);
-  width: 100%;
+  height: calc(100% - 135px);
+  width: calc(100% - 40px);
   overflow: hidden;
-  background: rgb(196, 226, 241);
+  /* background: rgb(196, 226, 241); */
+  background: #fff;
+  border: 1px solid #E5E5E5;
+  -webkit-box-sizing: border-box;
+  box-sizing: border-box;
+  margin: 15px auto 0;
+  border-radius: 5px;
 }</style>

+ 363 - 0
src/components/pages/test/add/setInfo/aiCreate2.vue

@@ -0,0 +1,363 @@
+<template>
+  <div v-loading="loading" style="width: 100%;">
+    <div>
+      <div class="ex_box">
+        <span>例子:</span>
+        <el-button type="primary" size="mini" @click="checkExample('1')">选择题</el-button>
+        <el-button type="primary" size="mini" @click="checkExample('2')">问答题</el-button>
+      </div>
+      <div class="ac_box">
+        <!-- <el-input v-autoHeight="75" v-model="text" placeholder="请在这里输入要发送的消息" size="normal" type="textarea" resize="none"
+          :rows="3"></el-input> -->
+          <textarea v-autoHeight="75" rows="3" class="binfo_input binfo_textarea" cols v-model="text" placeholder="请在这里输入要发送的消息"></textarea>
+          <el-button type="primary" size="mini" @click="generate" style="margin-left:10px">生成</el-button>
+      </div>
+      <div class="ac_content" v-if="aiCreate.length">
+        <div class="title">生成内容:</div>
+        <div class="box" v-if="aiType == 1">
+          <div v-for="(item, index) in aiCreate" :key="index" class="choice">
+            <div class="title">{{ `${index + 1}:${item.title}` }}</div>
+            <div class="options">
+              <span v-for="(option, oIndex) in item.options" :key="`${index}-${oIndex}`">{{ option }}</span>
+            </div>
+            <div class="answer">{{ `答案:${item.answer}` }}</div>
+          </div>
+        </div>
+        <div class="box" v-if="aiType == 3">
+          <div v-for="(item, index) in aiCreate" :key="index" class="choice">
+            <div class="title">{{ `${index + 1}:${item.title}` }}</div>
+            <div class="answer">{{ `答案:${item.answer}` }}</div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <el-button type="primary" @click="exportT" size="mini">导入</el-button>
+  </div>
+</template>
+
+<script>
+
+export default {
+  props: {
+    aiJson: {
+      type: Array,
+    },
+  },
+  directives: {
+    autoHeight: {
+      update(el, binding) {
+        const { value } = binding
+        if (value && typeof value === 'number') {
+          el.style.height = `${value}px`
+        } else {
+          el.style.height = 'auto'
+        }
+      },
+      componentUpdated(el) {
+        el.style.height = `${el.scrollHeight + 5}px`
+      },
+    },
+  },
+  data() {
+    return {
+      example: {
+        '1': {
+          'title': '请你以富文本的形式给我出三个关于小学数学单位换算的选择题,每个选择题选项不少于4个,需要答案,但不需要解释,符号请使用中文的'
+        },
+        '2': {
+          'title': '请你以富文本的形式给我出三个关于三年级语文知识问答的问答题,需要答案,但不需要解释'
+        }
+      },
+      text: "",
+      aiCreate: [],
+      aiType: "",
+      loading: false
+    }
+  },
+  methods: {
+    checkExample(type) {
+      this.text += this.example[type].title
+    },
+    guid() {
+      var _num,
+        i,
+        _guid = "";
+      for (i = 0; i < 32; i++) {
+        _guid += Math.floor(Math.random() * 16).toString(16); //随机0  - 16 的数字 转变为16进制的字符串
+        _num = Math.floor((i - 7) / 4); //计算 (i-7)除4
+        if (_num > -1 && _num < 4 && i == 7 + 4 * _num) {
+          //会使guid中间加 "-"   形式为xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
+          _guid += "-";
+        }
+      }
+      return _guid;
+    },
+    generate() {
+      if (this.text == "") {
+        this.$message.error("请输入要发送的消息")
+        return
+      }
+      // else if (this.text.indexOf("添加文档") !== -1) {
+      //   this.aiType = 4
+      // }
+      if (this.text.indexOf("选择题") !== -1) {
+        this.aiType = 1
+      } else if (this.text.indexOf("问答题") !== -1) {
+        this.aiType = 3
+      } else {
+        this.$message.error("生成的文字中要包含选择题或者问答题才能生成题目哦,请重新编辑下吧")
+        return
+      }
+
+      if(this.text.indexOf("选择题") !== -1 && this.text.indexOf("问答题") !== -1){
+        this.$message.error("目前暂不支持问答题和选择题一起创建")
+        return
+      }
+      this.loading = true
+      let param = {
+        model: "gpt-3.5-turbo",
+        temperature: 0,
+        max_tokens: 2048,
+        top_p: 1,
+        frequency_penalty: 0,
+        presence_penalty: 0,
+        messages: [
+          {
+            role: "user",
+            content: this.text,
+          },
+        ],
+        uid: this.guid(),
+        stream: false,
+      };
+      this.ajax.post("https://gpt.cocorobo.cn/chat", param).then(
+        (res) => {
+          if (
+            res.data.FunctionResponse &&
+            res.data.FunctionResponse.result &&
+            res.data.FunctionResponse.result == "无效请求,请重新发起对话"
+          ) {
+            this.$message.error("你的内容太长,无法使用Ai创建!");
+            this.loading = false
+            return;
+          }
+          let aiReturn = res.data.FunctionResponse.choices[0].message.content;
+          aiReturn = aiReturn.split("\n")
+          aiReturn = aiReturn.filter(e => e != "")
+          this.loading = false
+          this.generate2(aiReturn)
+        },
+        (err) => {
+          console.log(err);
+          this.loading = false
+        }
+      );
+    },
+    generate2(aiReturn) {
+      this.loading = true
+      let content = ''
+      if (this.aiType == 1) {
+        content = `${JSON.stringify(aiReturn)},要求返回格式是Array [{"title":"",options:[],answer:[]}]`
+      } else if (this.aiType == 3) {
+        content = `${JSON.stringify(aiReturn)},要求返回格式是Array [{title: "",answer: ""}]`
+      }
+      let param = {
+        model: "gpt-3.5-turbo",
+        temperature: 0,
+        max_tokens: 2048,
+        top_p: 1,
+        frequency_penalty: 0,
+        presence_penalty: 0,
+        messages: [
+          {
+            role: "user",
+            content: content
+          },
+        ],
+        uid: this.guid(),
+        stream: false,
+      };
+      this.ajax.post("https://gpt.cocorobo.cn/chat", param).then(
+        (res) => {
+          if (
+            res.data.FunctionResponse &&
+            res.data.FunctionResponse.result &&
+            res.data.FunctionResponse.result == "无效请求,请重新发起对话"
+          ) {
+            this.$message.error("你的内容太长,无法使用Ai创建!");
+            this.loading = false
+            return;
+          }
+          let aiCreate = res.data.FunctionResponse.choices[0].message.content;
+          try {
+            aiCreate = JSON.parse(aiCreate)
+          } catch (error) {
+            this.generate2(aiReturn)
+          }
+          console.log(aiCreate)
+          this.aiCreate = aiCreate;
+          this.loading = false
+        },
+        (err) => {
+          console.log(err);
+          this.loading = false
+        }
+      );
+    },
+    exportT() {
+      if (!this.aiCreate.length) {
+        this.$message.error("请先创建Ai内容!");
+        return;
+      }
+      if (this.aiType !== 1 && this.aiType !== 3) {
+        this.$message.error("目前只支持选择题/问答题的创建!输入内容必须包含选择题/问答题!");
+        return;
+      }
+      var json = JSON.parse(JSON.stringify(this.aiJson))
+      let array = []
+      let englishIndex = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
+      if (this.aiType === 1) {
+        for (var i = 0; i < this.aiCreate.length; i++) {
+          let answer = []
+          let type = 1
+          if (this.aiCreate[i].answer) {
+            if (this.aiCreate[i].answer.length > 1) {
+              type = 2
+              for (var j = 0; j < this.aiCreate[i].answer.length; j++) {
+                answer.push(englishIndex.indexOf(this.aiCreate[i].answer[j].toLocaleUpperCase()))
+              }
+            } else {
+              answer = [englishIndex.indexOf(this.aiCreate[i].answer[0].toLocaleUpperCase())]
+            }
+          }
+
+          let options = []
+          for (var j = 0; j < this.aiCreate[i].options.length; j++) {
+            options.push({
+              img: "",
+              option: this.aiCreate[i].options[j]
+            })
+          }
+          array.push(
+            {
+              json: {
+                answer: answer,
+                array: options,
+                title: this.aiCreate[i].title,
+                type: type
+              },
+              ttype: 1,
+              type: 1
+            }
+          )
+        }
+      } else if (this.aiType === 3) {
+        for (var i = 0; i < this.aiCreate.length; i++) {
+          array.push(
+            {
+              json: {
+                answer: this.aiCreate[i].answer,
+                title: this.aiCreate[i].title,
+                type: 1
+              },
+              ttype: 1,
+              type: 3
+            }
+          )
+        }
+      }
+      if (!json.length || json[0].ttype == 1) {
+        json = [...json, ...array]
+      } else if ((json[0].ttype == 2 || json[0].ttype == 3) && !json[0].array.length) {
+        json[0].array = array
+      } else if (json[0].ttype == 2 && json[0].array.length) {
+        json[0].array = [...json[0].array, ...array]
+      } else if (json[0].ttype == 3 && json[0].array.length) {
+        if (json[0].array[0].ttype == 2) {
+          json[0].array[0].array = [...json[0].array[0].array, ...array]
+        } else {
+          json[0].array = [...json[0].array, ...array]
+        }
+      }
+      this.$emit("changeJson", json)
+      this.aiCreate = []
+    }
+  },
+}
+</script>
+
+<style scoped>
+.ac_box {
+  display: flex;
+  width: 100%;
+  align-items: flex-end;
+  margin-bottom: 10px;
+}
+
+.ex_box {
+  margin-bottom: 10px;
+  color: #909090;
+  font-size: 14px;
+}
+
+.ac_content {
+  margin-bottom: 10px;
+  font-size: 14px;
+}
+
+.ac_content>.title {
+  margin-bottom: 10px;
+}
+
+.ac_content>.box {}
+
+.ac_content>.box>.choice+.choice {
+  margin-top: 10px;
+}
+
+.ac_content>.box>.choice>div+div {
+  margin-top: 10px;
+}
+
+.ac_content>.box>.choice>.options {
+  display: flex;
+  flex-wrap: wrap;
+}
+
+.ac_content>.box>.choice>.options>span {
+  margin-right: 10px;
+  margin-bottom: 5px;
+}
+
+.binfo_input {
+    width: 100%;
+    margin: 0;
+    padding: 12px 14px;
+    display: block;
+    min-width: 0;
+    outline: none;
+    box-sizing: border-box;
+    background: none;
+    border: none;
+    border-radius: 4px;
+    background: #fff;
+    font-size: 14px;
+    resize: none;
+    font-family: 'Microsoft YaHei';
+    min-height: 48px;
+    /* border: 1px solid #3682fc00; */
+    border: 1px solid #CAD1DC;
+}
+
+.binfo_textarea {
+    border: 1px solid #CAD1DC;
+    font-size: 14px;
+    resize: none;
+    /* background: #f6f6f6; */
+    font-family: 'Microsoft YaHei';
+}
+
+.binfo_input:focus-visible {
+    border: 1px solid #3681FC !important;
+}
+</style>

+ 120 - 23
src/components/pages/test/add/setInfo/index.vue

@@ -11,16 +11,33 @@
                                     <div class="course_input_box">
                                         <div class="bb_courseIcon"><img src="../../../../../assets/icon/new/course.png" />
                                         </div>
-                                        <input @input="titleChange" type="text" placeholder="请输入课程名称" class="binfo_input" v-model="courseName"
+                                        <input @input="titleChange" type="text" placeholder="请输入课程名称" class="binfo_input"
+                                            v-model="courseName"
                                             style="border: 1.5px solid rgb(202, 209, 220);margin: 0px 10px 0px 0px;border-radius: 5px;font-weight: 600;padding: 12px 14px 12px 71px;" />
-                                        <el-switch v-model="isTeacherSee" active-text="允许学生回答后查看正确答案"
+                                        <el-switch v-model="isTeacherSee" active-text="允许回答后查看正确答案"
                                             style="justify-content: center;" @change="seeChange"></el-switch>
                                     </div>
                                 </div>
                             </div>
+                            <div class="typeBox">
+                                <span>权限:</span>
+                                <el-select v-model="sJuri" placeholder="权限" @change="juriChange">
+                                    <el-option label="所有人" value="0"></el-option>
+                                    <el-option label="老师" value="1"></el-option>
+                                    <el-option label="学生" value="2"></el-option>
+                                </el-select>
+                            </div>
+                            <div class="typeBox" v-if="typeArray.length">
+                                <span>类型:</span>
+                                <el-select v-model="typeCheck" placeholder="选择类型" clearable @change="typeChange2">
+                                    <el-option v-for="(item, index) in typeArray" :key="index" :label="item.name"
+                                        :value="item.id"></el-option>
+                                </el-select>
+                            </div>
                             <div class="both">
                                 <div class="choose">
-                                    <div class="all_choose" v-for="(item, index) in CourseType[0]" :key="index" @change="typeChange">
+                                    <div class="all_choose" v-for="(item, index) in CourseType[0]" :key="index"
+                                        @change="typeChange">
                                         <span v-if="CourseTypeJson[item.id].length > 0">{{ item.name }}:</span>
                                         <el-checkbox-group v-model="courseTypeId" v-if="CourseTypeJson[item.id].length > 0">
                                             <el-checkbox v-for="item1 in CourseTypeJson[item.id]" :key="item1.id"
@@ -30,6 +47,14 @@
                                     </div>
                                 </div>
                             </div>
+                            <div class="whiteBg" style="border-radius: 0; margin-top: 0px">
+                                <div class="c_info_title" style="padding: 0 0 15px;margin: 0 auto 0 0;">测评描述</div>
+                                <div style="width: 100%;box-sizing: border-box;">
+                                <div style="width: calc((100%))">
+                                    <textarea v-autoHeight="68" rows="2" class="binfo_input binfo_textarea" cols v-model="courseText" placeholder="测评描述" @change="briefChange"></textarea>
+                                </div>
+                                </div>
+                            </div>
                         </div>
                     </div>
                 </div>
@@ -44,10 +69,10 @@
                         <span :class="{ active: type == 2 }" @click="type = 2">手动创建</span>
                         <!-- <span :class="{ active: type == 3 }" @click="type = 3">题库导入</span> -->
                         <div class="skip_btn">
-                            <el-button type="primary" size="mini" @click="openAiCreate">智能创建</el-button>
+                            <!-- <el-button type="primary" size="mini" @click="openAiCreate">智能创建</el-button> -->
                             <el-button type="primary" size="mini" @click="nextSteps">跳过</el-button>
                         </div>
-                        
+
                     </div>
                     <div class="c_info_tab_box">
                         <manualCreate v-if="type == 2" :manualJson.sync="manualJson" @nextSteps="nextSteps"></manualCreate>
@@ -68,20 +93,29 @@ export default {
         aiCreate
     },
     props: {
-        title:{
+        title: {
             type: String
         },
-        testType:{
+        testType: {
             type: Array
         },
-        see:{
+        see: {
             type: Boolean
         },
-        steps:{
+        steps: {
             type: Number
         },
-        cJson:{
-            type:Array
+        cJson: {
+            type: Array
+        },
+        typeid:{
+            type: String
+        },
+        brief:{
+            type: String
+        },
+        juri:{
+            type: String
         }
     },
     data() {
@@ -92,10 +126,29 @@ export default {
             courseName: "",
             isTeacherSee: false,
             type: 2,
-            manualJson:[],
-            aiDialogVisible:false
+            manualJson: [],
+            aiDialogVisible: false,
+            typeArray: [],
+            typeCheck: '',
+            sJuri: '',
+            courseText: ''
         }
     },
+    directives: {
+        autoHeight: {
+            update(el, binding) {
+                const { value } = binding
+                if (value && typeof value === 'number') {
+                el.style.height = `${value}px`
+                } else {
+                el.style.height = 'auto'
+                }
+            },
+            componentUpdated(el) {
+                el.style.height = `${el.scrollHeight + 5}px`
+            },
+        },
+    },
     methods: {
         selectAllType() {
             let params = {
@@ -169,37 +222,63 @@ export default {
                     console.error(err);
                 });
         },
-        titleChange(){
+        titleChange() {
             this.$emit("update:title", this.courseName)
         },
-        typeChange(){
+        typeChange() {
             this.$emit("update:testType", this.courseTypeId)
         },
-        seeChange(){
+        seeChange() {
             this.$emit("update:see", this.isTeacherSee)
         },
-        depthCopy(s){
+        typeChange2(){
+            this.$emit("update:typeid", this.typeCheck)
+        },
+        juriChange(){
+            this.$emit("update:juri", this.sJuri)
+        },
+        briefChange(){
+            this.$emit("update:brief", this.courseText)
+        },
+        depthCopy(s) {
             return JSON.parse(JSON.stringify(s))
         },
-        openAiCreate(){
+        openAiCreate() {
             this.aiDialogVisible = true
         },
-        nextSteps(){
-            if(this.type == 2){
+        nextSteps() {
+            if (this.type == 2) {
                 this.$emit("update:cJson", this.manualJson)
             }
-            this.$emit('update:steps',this.steps+1)
+            this.$emit('update:steps', this.steps + 1)
             console.log(this.cJson);
             console.log(this.manualJson);
-        }
+        },
+        selectType() {
+            let params = {
+                oid: this.oid,
+            };
+            this.ajax
+                .get(this.$store.state.api + "selectTestType", params)
+                .then((res) => {
+                    this.typeArray = res.data[0];
+                })
+                .catch((err) => {
+                    console.error(err);
+                });
+        },
     },
     mounted() {
         this.courseTypeId = this.depthCopy(this.testType)
         this.courseName = this.depthCopy(this.title)
         this.isTeacherSee = this.depthCopy(this.see)
         this.manualJson = this.depthCopy(this.cJson)
+        this.typeCheck = this.depthCopy(this.typeid)
+        this.courseText = this.depthCopy(this.brief)
+        this.sJuri = this.depthCopy(this.juri)
         this.$forceUpdate()
         this.selectAllType();
+        this.selectType();
     }
 }
 </script>
@@ -422,8 +501,26 @@ export default {
     overflow: hidden;
 }
 
-.skip_btn{
+.skip_btn {
     position: absolute;
     right: 20px;
 }
+
+.typeBox{
+    margin-top: 20px;
+}
+
+.typeBox > span{
+    font-weight: bold;
+    font-size: 14px;
+}
+
+.binfo_textarea {
+  border: 1.5px solid #CAD1DC;
+  font-size: 16px;
+  resize: none;
+  /* background: #f6f6f6; */
+  font-family: 'Microsoft YaHei';
+}
+
 </style>

+ 43 - 14
src/components/pages/test/add/setInfo/manualCreated.vue

@@ -14,17 +14,26 @@
                 </div>
             </div>
             <div class="mc_addBox_add">
-                <div class="title">请添加题目类型与数量</div>
+                <div class="title">请添加试卷组件</div>
                 <div class="btnBox">
-                    <el-button type="primary" size="mini" v-for="item in buttonOptions" :key="item.type" class="e-button"
-                        @click="addQtype(item.type)">{{ item.name }}</el-button>
+                    <!-- <el-button type="primary" size="mini" v-for="item in buttonOptions" :key="item.type" class="e-button"
+                        @click="addQtype(item.type)">{{ item.name }}</el-button> -->
+                    <button v-for="item in buttonOptions" :key="item.type" class="pub_test_btn"
+                        :class="{ pub_test_btn_group: item.type == 1, pub_test_btn_page: item.type == 2 }"
+                        @click="addQtype(item.type)">{{ item.name }}</button>
+                </div>
+            </div>
+            <div class="mc_addBox_add">
+                <div class="title">智能创建</div>
+                <div class="btnBox">
+                    <aiCreate2 :aiJson="manualJson" @changeJson="changeJson"></aiCreate2>
                 </div>
             </div>
         </div>
         <div class="mc_checkBox">
             <checkOrder :checkC.sync="checkC" :checkJson="checkJson" @changeJson="changeJson"></checkOrder>
             <div class="e_btn">
-                <el-button type="primary" size="small" @click="nextSteps()" style="width: 100px;">下一步</el-button>
+                <el-button type="primary" size="mini" @click="nextSteps()">下一步</el-button>
             </div>
         </div>
     </div>
@@ -32,12 +41,14 @@
 
 <script>
 import checkOrder from '../components/checkOrder.vue';
+import aiCreate2 from './aiCreate2.vue';
 import minxinVue from '../minxins/minxin';
 
 export default {
-    mixins:[minxinVue],
+    mixins: [minxinVue],
     components: {
         checkOrder,
+        aiCreate2
     },
     props: {
         manualJson: {
@@ -59,8 +70,8 @@ export default {
         };
     },
     watch: {
-        manualJson :{
-            handler: function (newVal, oldVal) { 
+        manualJson: {
+            handler: function (newVal, oldVal) {
                 this.checkJson = this.depthCopy(newVal);
             },
             deep: true,
@@ -128,11 +139,11 @@ export default {
                             this.checkJson[_check[0]].array.push(json)
                         }
                     } else if (type == 3 && _check.length == 1) {
-                        if(this.checkJson[_check[0]].array[0] && this.checkJson[_check[0]].array[0].array){
+                        if (this.checkJson[_check[0]].array[0] && this.checkJson[_check[0]].array[0].array) {
                             for (var i = 0; i < this.number; i++) {
                                 this.checkJson[_check[0]].array[0].array.push(json)
                             }
-                        }else{
+                        } else {
                             for (var i = 0; i < this.number; i++) {
                                 this.checkJson[_check[0]].array.push(json)
                             }
@@ -255,8 +266,8 @@ export default {
         depthCopy(s) {
             return JSON.parse(JSON.stringify(s));
         },
-        
-        nextSteps(){
+
+        nextSteps() {
             this.$emit("nextSteps")
         }
     },
@@ -280,7 +291,8 @@ export default {
     border-radius: 8px;
     padding: 20px 20px;
     box-sizing: border-box;
-    height: 350px;
+    min-height: 350px;
+    height: fit-content;
 }
 
 .mc_addBox_add {}
@@ -291,6 +303,20 @@ export default {
 
 .mc_addBox_add .title {
     margin-bottom: 10px;
+    font-size: 15px;
+    font-weight: 700;
+    display: flex;
+    align-items: center;
+}
+
+.mc_addBox_add .title::before {
+    content: '';
+    width: 10px;
+    height: 10px;
+    border-radius: 50%;
+    background: rgb(54, 129, 252);
+    margin-right: 10px;
+    display: block;
 }
 
 .mc_addBox_add .select {
@@ -298,7 +324,10 @@ export default {
     align-items: center;
 }
 
-.mc_addBox_add .btnBox {}
+.mc_addBox_add .btnBox {
+    display: flex;
+    flex-wrap: wrap;
+}
 
 .mc_addBox_add .select .e-select {}
 
@@ -326,7 +355,7 @@ export default {
 }
 
 
-.e_btn{
+.e_btn {
     width: 100%;
     margin-top: auto;
     display: flex;

+ 9 - 3
src/components/pages/test/check/check.vue

@@ -49,7 +49,7 @@
               <el-button type="primary" size="small" @click="publish">确定批改</el-button>
             </div>
           </div>
-          <topicVue :cJson="cJson" :title="title" :checktype="2" :see="see" :isTeacher="1" :name="name" ref="topicVue"></topicVue>
+          <topicVue :cJson="cJson" :title="title" :brief="brief" :checktype="2" :see="see" :isTeacher="1" :name="name" ref="topicVue"></topicVue>
         </div>
       </div>
     </div>
@@ -66,12 +66,14 @@ export default {
     return {
       userid: this.$route.query.userid,
       userid2: this.$route.query.userid2,
+      tid: this.$route.query.tid,
       oid: this.$route.query.oid,
       org: this.$route.query.org,
       role: this.$route.query.role,
       cid: this.$route.query.cid,
       steps: 1,
       title: "",
+      brief: "",
       id:"",
       testType: [],
       see: true,
@@ -104,14 +106,15 @@ export default {
       this.loading = true;
       let params = {
         cid: this.cid,
-        uid: this.userid2,
+        tid: this.tid,
       };
       this.ajax
-        .get(this.$store.state.api + "getTestWorks", params)
+        .get(this.$store.state.api + "getTestWorks2", params)
         .then((res) => {
           // this.cJson = JSON.parse(res.data[0][0].chapters);
           this.$forceUpdate();
           this.title = res.data[0][0].title;
+          this.brief = res.data[0][0].brief;
 
           this.testType = [];
           for (var i = 0; i < res.data[1].length; i++) {
@@ -215,5 +218,8 @@ export default {
   padding: 0 30px;
   border-top: 2px solid #eee;
   border-bottom: 2px solid #eee;
+  width: 95%;
+  margin: 0 auto;
+  box-sizing: border-box;
 }
 </style>

+ 2 - 0
src/components/pages/test/check/index.vue

@@ -168,6 +168,8 @@ export default {
           this.userid +
           "&userid2=" +
           row.userid +
+          "&tid=" +
+          row.id +
           "&oid=" +
           this.oid +
           "&org=" +

+ 80 - 0
src/components/pages/test/file/wPdf2.vue

@@ -0,0 +1,80 @@
+<template>
+    <el-dialog title="PDF查看" :visible.sync="dialogVisiblePdf" :append-to-body="true" width="95%" :before-close="handleClose"
+        class="dialog_diy">
+        <div style="height: 100%;">
+            <iframe ref="viframe" style="width: 100%; height: 99%; border: none"
+                :src="'https://cloud.cocorobo.cn/pdf.js/web/viewer.html?file=' + encodeURIComponent(url)"></iframe>
+        </div>
+        <span slot="footer" class="dialog-footer">
+            <el-button @click="dialogVisiblePdf = false;">关 闭</el-button>
+        </span>
+    </el-dialog>
+</template>
+  
+<script>
+export default {
+    props: {
+        dialogVisiblePdf: {
+            type: Boolean,
+            default: false
+        },
+        url: {
+            type: String,
+        }
+    },
+    data() {
+        return {
+        }
+    },
+    methods: {
+        handleClose(done) {
+            this.close()
+            done();
+        },
+        close() {
+            this.$emit('update:dialogVisiblePdf', false)
+        }
+    },
+}
+</script>
+  
+<style scoped>
+.dialog_diy>>>.el-dialog {
+    height: 100%;
+    margin: 0 auto !important;
+}
+
+.dialog_diy>>>.el-dialog__header {
+    background: #454545 !important;
+    padding: 15px 20px;
+}
+
+.dialog_diy>>>.el-dialog__body {
+    height: calc(100% - 124px);
+    box-sizing: border-box;
+    padding: 0px;
+}
+
+
+.dialog_diy>>>.el-dialog__title {
+    color: #fff;
+}
+
+.dialog_diy>>>.el-dialog__headerbtn {
+    top: 19px;
+}
+
+.dialog_diy>>>.el-dialog__headerbtn .el-dialog__close {
+    color: #fff;
+}
+
+.dialog_diy>>>.el-dialog__headerbtn .el-dialog__close:hover {
+    color: #fff;
+}
+
+
+.dialog_diy>>>.el-dialog__body,
+.dialog_diy>>>.el-dialog__footer {
+    background: #fafafa;
+}
+</style>

+ 338 - 66
src/components/pages/test/index.vue

@@ -1,14 +1,15 @@
 <template>
-    <div class="pb_content" style="height: auto">
-        <div class="pb_head top">
-            <div>
-                <span>评测管理</span>
-            </div>
-            <div class="student_button">
-                <el-button type="primary" class="bgColor" @click="goToCourse()">新建评测</el-button>
+    <div class="pb_content" style="height: auto; width: 94%; margin: 10px auto;background: unset;">
+        <div style="width:100%;padding:0 21px;background:#fff;border-radius: 5px;box-sizing: border-box;">
+            <div class="pb_head top">
+                <div>
+                    <span>评测管理</span>
+                </div>
+                <div class="student_button">
+                    <el-button type="primary" class="bgColor" @click="goToCourse()">新建评测</el-button>
+                </div>
+
             </div>
-        </div>
-        <div class="pb_content_body" style="height: 100%">
             <div class="student_head">
                 <div class="choose">
                     <div class="all_choose" v-for="(item, index) in CourseType[0]" :key="index">
@@ -21,18 +22,19 @@
                             </el-option>
                         </el-select>
                     </div>
-                    <div class="student_search">
-                        <span>所有者</span>
+                    <div class="student_search" v-if="typeArray.length">
+                        <span>类型</span>
+                        <el-select v-model="typeCheck" placeholder="请选择" clearable @change="search">
+                            <el-option v-for="(item, index) in typeArray" :key="index" :label="item.name"
+                                :value="item.id"></el-option>
+                        </el-select>
+                    </div>
+                    <!-- <div class="student_search">
+                        <span></span>
                         <el-select v-model="groupA" @change="search">
                             <el-option value="0" label="我的"></el-option>
-                            <!-- <el-option value="4" label="全部"></el-option> -->
-                            <!-- <el-option value="2" label="他人"
-                                v-if="oid != '1c3b9def-8fbe-11ed-b13d-005056b86db5'"></el-option> -->
                         </el-select>
-                        <!-- <el-select v-model="groupA" @change="search" v-else>
-                <el-option value="4" label="全部"></el-option>
-              </el-select> -->
-                    </div>
+                    </div> -->
                     <div @click="clear" class="clear" v-if="CourseType.length">重置</div>
                 </div>
 
@@ -43,9 +45,12 @@
                     </div>
                 </div>
             </div>
+        </div>
+
+        <div class="pb_content_body" style="height: 100%;width: 100%;">
             <div class="student_table" v-loading="isLoading">
                 <div class="course_box">
-                    <div class="out_box" v-for="(item, index) in course" :key="index">
+                    <!-- <div class="out_box" v-for="(item, index) in course" :key="index">
                         <div class="myCourse" v-if="item.userid == userid">
                             我的项目
                         </div>
@@ -79,12 +84,52 @@
                                     item.course_teacher.indexOf(userid) !== -1) || role == '1')">编辑</div>
                             <div @click="checkToTest(item.courseId)">查看</div>
                             <div @click="deleteCourse(item.courseId)">删除</div>
-                            <!-- <div @click="get(item.courseId)">预览</div> -->
-                            <!-- 项目进展 -->
-                            <!-- <div @click="copyCourse(item.courseId)">复制</div> -->
-                            <!-- <div v-if="(item.userid == userid || role == '1')" @click="deleteCourse(item.courseId)">
-                                删除
-                            </div> -->
+                        </div>
+                    </div> -->
+                    <div class="test_box" v-for="(item, index) in course" :key="index">
+                        <div class="test_top">
+                            <div class="test_top_img" v-if="!item.typeN"></div>
+                            <el-tooltip :content="item.typeN" placement="top" effect="dark" v-else>
+                                <div class="test_top_img"
+                                    :class="{ gr: item.typeid == 'afc3f97f-2429-408d-8dcd-5e63a44d355a', md: item.typeid == '478bcccd-e3a1-472b-aa29-3ed7bc479469', jy: item.typeid == '178a377a-b4f1-4a75-b3c3-2787a7c98784', yy: item.typeid == 'dda9728e-5f11-469e-89ee-aca518daf223' }">
+                                </div>
+                            </el-tooltip>
+                            <div class="test_top_title">
+                                <span>{{ item.title }}</span>
+                                <span>创建人:{{ item.uname }}</span>
+                            </div>
+                        </div>
+                        <div class="test_time">
+                            <span><span>创建日期</span></span><span>{{ item.time }}</span>
+                        </div>
+                        <div class="test_time">
+                            <span><span>修改日期</span></span><span>{{ item.utime }}</span>
+                        </div>
+                        <div class="test_time">
+                            <span><span>分类</span></span>
+                            <span v-if="!item.typename">未设置分类</span>
+                            <el-tooltip :content="item.typename" placement="top" effect="dark" v-else>
+                                <!-- content to trigger tooltip here -->
+                                <span>{{ item.typename }}</span>
+                            </el-tooltip>
+                        </div>
+                        <div class="test_btn">
+                            <div class="test_o_btn">
+                                <el-tooltip content="编辑" placement="top" effect="dark">
+                                    <span class="edit" @click="goToCourse2(item.courseId)" v-if="((item.userid == userid) ||
+                                        (item.course_teacher &&
+                                            item.course_teacher.indexOf(userid) !== -1) || role == '1')"></span>
+                                </el-tooltip>
+                                <el-tooltip class="check" content="查看" placement="top" effect="dark">
+                                    <span @click="checkToTest(item.courseId)"></span>
+                                </el-tooltip>
+                                <el-tooltip class="delete" content="删除" placement="top" effect="dark">
+                                    <span @click="deleteCourse(item.courseId)"></span>
+                                </el-tooltip>
+                            </div>
+                            <div class="test_type" :class="{ no: item.look == '1', is: item.look == '2' }">
+                                <span>{{ item.look == '1' ? '未发布' : '已发布' }}</span>
+                            </div>
                         </div>
                     </div>
                     <div class="course_empty" v-if="course.length == 0">暂无数据</div>
@@ -116,10 +161,10 @@
                 <div class="out_box" v-for="(item, index) in courseTeam" :key="index" style="margin-left: 15px">
                     <div class="tup">
                         <img :src="item.cover != null && item.cover != ''
-                                ? JSON.parse(item.cover).length > 0
-                                    ? JSON.parse(item.cover)[0].url
-                                    : mr
+                            ? JSON.parse(item.cover).length > 0
+                                ? JSON.parse(item.cover)[0].url
                                 : mr
+                            : mr
                             " alt />
                     </div>
                     <div class="bottom_box">
@@ -194,7 +239,7 @@ export default {
             now: "",
             courseDetail: {},
             addCourse: {},
-            groupA: "3",
+            groupA: "0",
             classX: "",
             course: [],
             courseName: "",
@@ -206,6 +251,8 @@ export default {
             isChoose: 0,
             problemCourse: null, //查看提问的项目
             courseTeam: [],
+            typeArray: [],
+            typeCheck: "",
         };
     },
     methods: {
@@ -281,7 +328,7 @@ export default {
                 this.role
             );
         },
-        checkToTest(cid){
+        checkToTest(cid) {
             this.$router.push(
                 "/checkToTest?cid=" +
                 cid +
@@ -397,6 +444,8 @@ export default {
                     this.courseTypeId[this.CourseType[0][i].id] = "";
                 }
             }
+            this.typeCheck = ''
+            this.page = 1
             this.getCourse();
         },
         getCourse() {
@@ -422,7 +471,7 @@ export default {
                         } else if (this.CourseType[0][i].name == "项目类型") {
                             typed = this.courseTypeId[this.CourseType[0][i].id];
                         } else if (this.CourseType[0][i].name == "主题") {
-                            typef = this.courseTypeId[this.CourseType[0][i].id];
+                            // typef = this.courseTypeId[this.CourseType[0][i].id];
                         }
                         this.courseTypeSon.push(
                             this.courseTypeId[this.CourseType[0][i].id]
@@ -440,7 +489,7 @@ export default {
                 typeb: typeb != undefined ? typeb : "",
                 typec: typec != undefined ? typec : "",
                 typed: typed != undefined ? typed : "",
-                typef: typef != undefined ? typef : "",
+                typef: this.typeCheck,
                 typeE: typeE.join(","),
                 cu: "",
                 cn: this.courseName,
@@ -503,12 +552,12 @@ export default {
                             this.getCourse();
                         })
                         .catch((err) => {
+                            loading.close();
+                            this.isLoading = false;
                             console.error(err);
                         });
                 })
                 .catch(() => {
-                    loading.close();
-                    this.isLoading = false;
                     return;
                 });
             // }
@@ -573,6 +622,19 @@ export default {
                     console.error(err);
                 });
         },
+        selectTestType() {
+            let params = {
+                oid: this.oid,
+            };
+            this.ajax
+                .get(this.$store.state.api + "selectTestType", params)
+                .then((res) => {
+                    this.typeArray = res.data[0];
+                })
+                .catch((err) => {
+                    console.error(err);
+                });
+        },
         selectType() {
             this.ajax
                 .get(this.$store.state.api + "selectStudentType")
@@ -704,11 +766,44 @@ export default {
         this.page = 1;
         this.selectAllType();
         this.getCourse();
+        this.selectTestType();
     },
 };
 </script>
   
 <style scoped>
+@media screen and (max-width: 1380px) {
+    .test_box {
+        width: calc(100% / 4 - (15px * 3) / 4) !important;
+    }
+
+    .test_box:nth-child(5n) {
+        margin-right: 15px !important;
+    }
+
+    .test_box:nth-child(4n) {
+        margin-right: 0 !important;
+    }
+}
+
+@media screen and (max-width: 1080px) {
+    .test_box {
+        width: calc(100% / 3 - (15px * 2) / 3) !important;
+    }
+
+    .test_box:nth-child(5n) {
+        margin-right: 15px !important;
+    }
+
+    .test_box:nth-child(4n) {
+        margin-right: 15px !important;
+    }
+
+    .test_box:nth-child(3n) {
+        margin-right: 0 !important;
+    }
+}
+
 .dialog_diy>>>.el-dialog__header {
     background: #3d67bc !important;
     padding: 15px 20px;
@@ -747,11 +842,17 @@ export default {
     align-items: baseline;
     flex-direction: row;
     flex-wrap: wrap;
+    padding: 0 0 15px;
 }
 
 .top {
     display: flex;
     justify-content: space-between;
+    width: 100% !important;
+    box-sizing: border-box;
+    margin: 0px auto;
+    padding: 10px 0;
+    height: 54px;
 }
 
 .bgColor {
@@ -767,7 +868,8 @@ export default {
 
 .student_search span {
     margin: 0 10px 0 0;
-    min-width: 65px;
+    min-width: 50px;
+    text-align-last: justify;
 }
 
 .student_button {
@@ -786,7 +888,7 @@ export default {
 }
 
 .student_table {
-    padding: 20px 0;
+    padding: 0 0;
     height: 100%;
     /* overflow: auto; */
     min-height: 360px;
@@ -850,7 +952,7 @@ export default {
 }
 
 .student_page {
-    width: 95%;
+    width: 100%;
     margin: 0 auto;
 }
 
@@ -963,7 +1065,8 @@ export default {
     display: flex;
     align-items: center;
 }
-.bottom_box>div:nth-child(1) span:nth-child(1){
+
+.bottom_box>div:nth-child(1) span:nth-child(1) {
     font-weight: bold;
     font-size: 18px;
     overflow: hidden;
@@ -971,7 +1074,8 @@ export default {
     white-space: nowrap;
     max-width: 100%;
 }
-.bottom_box>div:nth-child(1) span:nth-child(2){
+
+.bottom_box>div:nth-child(1) span:nth-child(2) {
     font-size: 14px;
     min-width: fit-content;
     margin-left: 5px;
@@ -1027,6 +1131,7 @@ export default {
 
 .head_left {
     display: flex;
+    margin-top: 15px;
 }
 
 .student_input>>>.el-input__inner {
@@ -1047,16 +1152,17 @@ export default {
 }
 
 .all_choose {
-    margin: 15px 0 10px;
-    height: 20%;
+    /* margin: 15px 0 10px; */
+    /* height: 20%; */
     display: flex;
     flex-direction: row;
     align-items: center;
-    max-width: calc(100% / 3 - 50px);
+    max-width: 180px;
+    width: 180px;
 }
 
 .all_choose>span {
-    min-width: 75px;
+    min-width: 50px;
     display: block;
     margin-right: 10px;
     text-align-last: justify;
@@ -1069,33 +1175,19 @@ export default {
     align-content: space-between;
     height: 100%;
     justify-content: flex-start;
-    width: 60%;
-    min-width: 868px;
+    /* width: 60%; */
+    /* min-width: 868px; */
     align-items: center;
 }
 
-.choose>div:nth-child(2) {
-    margin-left: 1%;
-    width: 32.33333%;
-}
-
-.choose>div:nth-child(3) {
-    margin-left: 1%;
-    width: 32.33333%;
-}
-
-.choose>div:nth-child(5) {
-    margin: 5px 0 0 1%;
-}
-
-.choose>div:nth-child(4)>span {
-    /* width: 74px !important;
-    min-width: 74px; */
+.choose>div {
+    margin-left: 10px;
+    width: 180px;
+    margin-top: 15px;
 }
 
-.choose>div:nth-child(4)>>>.el-select {
-    /* width: 217.5px;
-    min-width: 215.06px; */
+.choose>.clear {
+    width: 70px
 }
 
 .clear {
@@ -1188,5 +1280,185 @@ export default {
 
 .more div>span:hover {
     color: #79a2ff;
-}</style>
+}
+
+.test_box {
+    width: calc(100% / 5 - (15px * 4) / 5);
+    /* width: 250px; */
+    background: #fff;
+    border-radius: 5px;
+    padding: 20px;
+    margin: 5px 15px 10px 0;
+    box-sizing: border-box;
+}
+
+.test_box:nth-child(5n) {
+    margin-right: 0;
+}
+
+.test_top {
+    width: 100%;
+    display: flex;
+    align-items: center;
+}
+
+.test_top>.test_top_img {
+    height: 40px;
+    width: 40px;
+    background: rgb(108 150 217);
+    margin-right: 10px;
+    border-radius: 5px;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+}
+
+.test_top>.gr {
+    background: rgb(142, 189, 176);
+}
+
+.test_top>.md {
+    background: rgb(139, 174, 227);
+}
+
+.test_top>.js {
+    background: rgb(64, 149, 174);
+}
+
+.test_top>.yy {
+    background: rgb(98, 102, 188);
+}
+
+.test_top>.test_top_img:after {
+    content: '';
+    display: block;
+    width: 23px;
+    height: 23px;
+    background-size: 100% 100%;
+    background-image: url('../../../assets/icon/test/all_icon_b.png');
+}
+
+.test_top>.gr:after {
+    background-image: url('../../../assets/icon/test/gr_icon_b.png');
+}
+
+.test_top>.md:after {
+    background-image: url('../../../assets/icon/test/md_icon_b.png');
+}
+
+.test_top>.js:after {
+    background-image: url('../../../assets/icon/test/js_icon_b.png');
+}
+
+.test_top>.yy:after {
+    background-image: url('../../../assets/icon/test/yy_icon_b.png');
+}
+
+.test_top>.test_top_title {
+    display: flex;
+    flex-direction: column;
+    justify-content: space-between;
+    height: 40px;
+    width: calc(100% - 40px - 10px)
+}
+
+.test_top>.test_top_title>span {
+    width: 100;
+    display: block;
+    word-break: break-all;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+}
+
+.test_top>.test_top_title>span:nth-child(1) {
+    font-size: 15px;
+}
+
+.test_top>.test_top_title>span:nth-child(2) {
+    font-size: 14px;
+    color: rgb(58, 131, 252);
+}
+
+.test_box>.test_time {
+    margin-top: 10px;
+    font-size: 14px;
+    color: #a7a7a7;
+    display: flex;
+}
+
+.test_box>.test_time>span:nth-child(1) {
+    width: 70px;
+    display: flex;
+}
+
+
+.test_box>.test_time>span:nth-child(1) > span{
+  width: 100%;
+  text-align-last: justify;
+}
+
+.test_box>.test_time>span:nth-child(1)::after{
+    content: ':';
+}
+.test_box>.test_time>span:nth-child(2) {
+    width: calc(100% - 70px);
+    overflow: hidden;
+    display: block;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+    word-break: break-all;
+}
+
+.test_box>.test_btn {
+    margin-top: 10px;
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+}
+
+.test_box>.test_btn>.test_o_btn {
+    display: flex;
+    align-items: center;
+}
+
+.test_box>.test_btn>.test_o_btn>span {
+    display: block;
+    width: 14px;
+    height: 14px;
+    background-size: 100% 100%;
+    cursor: pointer;
+}
+
+.test_box>.test_btn>.test_o_btn>.edit {
+    background-image: url('../../../assets/icon/test/edit_test_icon.png');
+    margin-right: 20px;
+}
+
+.test_box>.test_btn>.test_o_btn>.check {
+    background-image: url('../../../assets/icon/test/check_test_icon.png');
+    margin-right: 20px;
+}
+
+.test_box>.test_btn>.test_o_btn>.delete {
+    background-image: url('../../../assets/icon/test/delete_test_icon.png');
+}
+
+.test_box>.test_btn>.test_type {
+    font-size: 12px;
+    border-radius: 5px;
+    border: 1.5px solid;
+    padding: 3px 8px;
+}
+
+.test_box>.test_btn>.is {
+    color: rgb(57, 204, 127);
+    background-color: rgba(57, 204, 127, .1);
+}
+
+.test_box>.test_btn>.no {
+    color: rgb(235, 154, 96);
+    background-color: rgba(235, 154, 96, .1);
+}
+</style>
   

+ 59 - 0
src/components/pages/testPerson/index.vue

@@ -0,0 +1,59 @@
+<template>
+  <div class="tp_body">
+    <div class="tp_left">
+        <infoA :userid="userid" :oid="oid"></infoA>
+        <panelA :userid="userid" :oid="oid" :org="org"></panelA>
+    </div>
+    <div class="tp_right">
+        <testA :userid="userid" :oid="oid"></testA>
+    </div>
+  </div>
+</template>
+
+<script>
+import infoA from './info/index.vue'
+import panelA from './panel/index.vue'
+import testA from './test/index.vue'
+
+export default {
+    components: {
+        infoA,
+        panelA,
+        testA
+    },
+    data() {
+        return {
+            userid: this.$route.query.userid,
+            oid: this.$route.query.oid,
+            org: this.$route.query.org,
+            role: this.$route.query.role,
+        }
+    },
+    methods: {
+
+    },
+}
+</script>
+
+<style scoped>
+    .tp_body{
+        width: 100%;
+        height: 100%;
+        min-height: 745px;
+        display: flex;
+        justify-content: center;
+        align-items: center;
+        padding:20px;
+        box-sizing: border-box;
+    }
+
+    .tp_left{
+        width: 230px;
+        height: 100%;
+    }
+    .tp_right{
+        width: calc(100% - 230px - 10px);
+        margin: 0 0 0 10px;
+        height: 100%;
+    }
+</style>

+ 224 - 0
src/components/pages/testPerson/info/index.vue

@@ -0,0 +1,224 @@
+<template>
+  <div class="i_body">
+    <div class="i_top">
+      <div class="img">
+        <img :src="info.headportrait ? info.headportrait : avator" alt="">
+      </div>
+      <div class="name">
+        <span>{{info.username}}</span>
+      </div>
+      <div class="detail">
+        <el-tooltip :content="info.intro ? info.intro : '暂无简介'" placement="top" effect="dark">
+          <span>{{info.intro ? info.intro : '暂无简介'}}</span>
+        </el-tooltip>
+      </div>
+    </div>
+    <div class="i_bottom">
+        <div class="i_bottom_span">
+          <span>教研室</span>
+          <el-tooltip :content="info.classname ? info.classname : '暂无'" placement="top" effect="dark">
+            <span>{{info.classname ? info.classname : '暂无'}}</span>
+          </el-tooltip>
+        </div>
+        <div class="i_bottom_span">
+          <span>学科</span>
+          <el-tooltip :content="info.subject ? info.subject : '暂无'" placement="top" effect="dark">
+            <span>{{info.subject ? info.subject : '暂无'}}</span>
+          </el-tooltip>
+        </div>
+        <div class="i_bottom_span">
+          <span>职务</span>
+          <el-tooltip :content="info.job ? info.job : '暂无'" placement="top" effect="dark">
+            <span>{{info.job ? info.job : '暂无'}}</span>
+          </el-tooltip>
+        </div>
+        <div class="i_bottom_btn" @click="openInfo()">
+          <span class="edit"></span>
+          <span>编辑个人信息</span>
+        </div>
+    </div>
+    <infoDialog :dialogVisibleInfo.sync="dialogVisibleInfo" :userid="userid" :oid="oid"></infoDialog>
+  </div>
+</template>
+
+<script>
+import avator from '../../../../assets/icon/test/teacher.jpg'
+import infoDialog from './infoDialog/index.vue'
+export default {
+  components: {
+    infoDialog,
+  },
+  props: {
+    userid: {
+      type: String
+    },
+    oid: {
+      type: String
+    },
+  },
+  data() {
+    return {
+      avator: avator,
+      info: {},
+      dialogVisibleInfo:false,
+    }
+  },
+  watch: {
+    dialogVisibleInfo(newValue, oldValue) {
+      this.getData()
+    }
+  },
+  methods: {
+    getData() {
+      let params = {
+        uid: this.userid,
+      };
+      this.ajax
+        .get(this.$store.state.api + "selectTestUser", params)
+        .then((res) => {
+          this.info = res.data[0][0]
+          // 用于存储归类后的数据的对象
+  
+        })
+        .catch((err) => {
+          console.error(err);
+        });
+    },
+    openInfo(){
+      this.dialogVisibleInfo = true
+    }
+  },
+  mounted () {
+    this.getData();
+  },
+}
+</script>
+
+<style scoped>
+    .i_body{
+        width: 100%;
+        height: calc(55% - 10px);
+        min-height: 420px;
+        background: #fff;
+        border-radius: 5px;
+        margin-bottom: 10px;
+        overflow: hidden;
+    }
+    .i_top{
+      height: 55%;
+      width: calc(100% - 20px);
+      margin: 0 auto;
+      display: flex;
+      flex-direction: column;
+      padding: 10px 0px 0px;
+      justify-content: center;
+      align-items: center;
+      box-sizing: border-box;
+      border-bottom: 1px solid #efefef;
+    }
+
+    .i_top > .img{
+      width: 80px;
+      height: 80px;
+      overflow: hidden;
+      border-radius: 50%;
+    }
+    .i_top > .img > img{
+      width: 100%;
+      height: 100%;
+      object-fit: cover;
+    }
+    .i_top > .name{
+      width: 100%;
+      margin: 10px;
+      text-align: center;
+    }
+    .i_top > .name > span{
+      display: block;
+      max-width: 100%;
+      font-size: 22px;
+      font-weight: 700;
+      overflow: hidden;
+      text-overflow: ellipsis;
+      white-space: nowrap;
+    }
+    .i_top > .detail{
+      width: 100%;
+      text-align: center;
+    }
+
+    .i_top > .detail > span{
+      /* display: block; */
+      max-width: 90%;
+      font-size: 12px;
+      margin: 0 auto;
+      display: -webkit-box;
+      -webkit-line-clamp: 2;
+      -webkit-box-orient: vertical;
+      color: #a1a1a1;
+      line-height: 20px;
+      overflow: hidden;
+      word-break: break-all;
+    }
+
+    .i_bottom{
+      height: 45%;
+      width: calc(100% - 20px);
+      margin: 0 auto;
+      display: flex;
+      flex-direction: column;
+      align-items: center;
+      justify-content: center;
+    }
+
+    .i_bottom > .i_bottom_span{
+      width: 90%;
+      margin: 0 auto;
+      display: flex;
+      align-items: center;
+      font-size: 15px;
+    }
+
+    .i_bottom > .i_bottom_span + .i_bottom_span{
+      margin-top: 10px;
+    }
+
+    .i_bottom > .i_bottom_span > span:nth-child(1){
+      width: 50px;
+      min-width: 50px;
+      text-align: right;
+      color: #a1a1a1;
+    }
+    .i_bottom > .i_bottom_span > span:nth-child(2){
+      width: calc(100% - 30px);
+      overflow: hidden;
+      margin-left: 20px;
+      white-space: nowrap;
+      text-overflow: ellipsis;
+    }
+
+    .i_bottom > .i_bottom_btn{
+      cursor: pointer;
+      border-radius: 5px;
+      border: 1px solid #dbdbdb;
+      box-sizing: border-box;
+      width: 90%;
+      background: rgb(252, 252, 252);
+      margin: 30px auto 0;
+      height: 35px;
+      font-weight: 600;
+      font-size: 12px;
+      display: flex;
+      align-items: center;
+      justify-content: center;
+    }
+
+    .i_bottom > .i_bottom_btn > .edit{ 
+      display: block;
+      width: 15px;
+      height: 15px;
+      background-size:100% 100%;
+      background-image: url('../../../../assets/icon/test/edit-icon.png');
+      margin-right: 10px;
+    }
+</style>

+ 400 - 0
src/components/pages/testPerson/info/infoDialog/index.vue

@@ -0,0 +1,400 @@
+<template>
+    <el-dialog title="编辑个人信息" :visible.sync="dialogVisibleInfo" :append-to-body="true" width="500px"
+        :before-close="handleClose" class="dialog_diy">
+        <div style="width:100%;height: 100%;">
+            <div class="info_box">
+                <div class="img" v-loading="imgLoading">
+                    <img :src="info.headportrait ? info.headportrait : avator" alt="">
+                    <div class="mask" @click.stop="addImg($event)">
+                        <img src="../../../../../assets/icon/test/camera_icon.png" alt="">
+                        <input type="file" accept="image/*" capture="camera" style="display: none"
+                            @change="beforeUpload($event)" />
+                    </div>
+                </div>
+                <div class="info_span">
+                    <span>姓名:</span>
+                    <div>
+                        <el-input v-model="info.username" placeholder="请输入姓名"></el-input>
+                    </div>
+                </div>
+                <div class="info_span">
+                    <span>教研室:</span>
+                    <div>
+                        <el-select multiple collapse-tags v-model="info.teacherOffice" placeholder="请选择教研室"
+                            @change="Ochange" style="width: 100%;">
+                            <el-option v-for="(item, index) in classJuri" :key="index" :label="item.name"
+                                :value="item.id"></el-option>
+                        </el-select>
+                    </div>
+                </div>
+                <div class="info_span">
+                    <span>学科:</span>
+                    <div>
+                        <el-input v-model="info.subject" placeholder="请输入学科"></el-input>
+                    </div>
+                </div>
+                <div class="info_span">
+                    <span>职务:</span>
+                    <div>
+                        <el-input v-model="info.job" placeholder="请输入职务"></el-input>
+                    </div>
+                </div>
+                <div class="info_span">
+                    <span>简介:</span>
+                    <div>
+                        <!-- <el-input v-model="info.intro" placeholder="想说点什么..."></el-input> -->
+                        <textarea v-autoHeight="68" rows="2" class="binfo_input binfo_textarea" cols v-model="info.intro"
+                            placeholder="想说点什么..."></textarea>
+                    </div>
+                </div>
+            </div>
+        </div>
+        <span slot="footer" class="dialog-footer">
+            <el-button type="primary" @click="confirm()">确 认</el-button>
+            <el-button @click="close()">关 闭</el-button>
+        </span>
+    </el-dialog>
+</template>
+  
+<script>
+import avator from '../../../../../assets/icon/test/teacher.jpg'
+export default {
+    props: {
+        dialogVisibleInfo: {
+            type: Boolean,
+            default: false
+        },
+        userid: {
+            type: String
+        },
+        oid: {
+            type: String
+        }
+    },
+    watch: {
+        dialogVisibleInfo(newVal) {
+            if (newVal) {
+                this.getClass2();
+                this.getData();
+            }
+        }
+    },
+    directives: {
+        autoHeight: {
+            update(el, binding) {
+                const { value } = binding
+                if (value && typeof value === 'number') {
+                    el.style.height = `${value}px`
+                } else {
+                    el.style.height = 'auto'
+                }
+            },
+            componentUpdated(el) {
+                el.style.height = `${el.scrollHeight + 5}px`
+            },
+        },
+    },
+    data() {
+        return {
+            avator: avator,
+            info: {},
+            imgLoading: false,
+            classJuri: [],
+        };
+    },
+    methods: {
+        handleClose(done) {
+            this.close();
+            done();
+        },
+        close() {
+            this.$emit("update:dialogVisibleInfo", false);
+        },
+        confirm() {
+            if (!this.info.username) {
+                this.$message.error("姓名不能为空!");
+                return
+            }
+            let params = [{
+                userid: this.userid,
+                username: this.info.username,
+                cclassid: this.info.teacherOffice.join(","),
+                job: this.info.job,
+                subject: this.info.subject,
+                intro: this.info.intro,
+                h: this.info.headportrait ? this.info.headportrait : '',
+            }]
+            this.ajax
+                .post(this.$store.state.api + "updateUserInfoText", params)
+                .then((res) => {
+                    this.$message.success('修改成功')
+                    this.$emit("update:dialogVisibleInfo", false);
+                })
+                .catch((err) => {
+                    this.$message.error("网络不佳");
+                    console.error(err);
+                });
+        },
+        getData() {
+            let params = {
+                uid: this.userid,
+            };
+            this.ajax
+                .get(this.$store.state.api + "selectTestUser", params)
+                .then((res) => {
+                    this.info = res.data[0][0]
+                    this.info.teacherOffice = []
+                    this.info.teacherOffice = this.info.cclassid.split(',')
+                })
+                .catch((err) => {
+                    console.error(err);
+                });
+        },
+        addImg(e) {
+            var el = e.currentTarget;
+            el.getElementsByTagName("input")[0].click();
+            e.target.value = "";
+        },
+        beforeUpload(event, type) {
+            // const loading = this.openLoading();
+            var file = event.target.files[0];
+            var credentials = {
+                accessKeyId: "AKIATLPEDU37QV5CHLMH",
+                secretAccessKey: "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",
+            }; //秘钥形式的登录上传
+            window.AWS.config.update(credentials);
+            window.AWS.config.region = "cn-northwest-1"; //设置区域
+
+            var bucket = new window.AWS.S3({ params: { Bucket: "ccrb" } }); //选择桶
+            var imgA = [
+                "png",
+                "jpg",
+                "jpeg",
+                "bmp",
+                "gif",
+                "webp",
+                "psd",
+                "svg",
+                "tiff",
+            ];
+            if (imgA.indexOf(file.name.split(".")[file.name.split(".").length - 1]) == -1) {
+                this.$message.error("图片格式错误")
+                return;
+            }
+            this.imgLoading = true
+            var _this = this;
+
+            if (file) {
+                var params = {
+                    Key:
+                        file.name.split(".")[0] +
+                        new Date().getTime() +
+                        "." +
+                        file.name.split(".")[file.name.split(".").length - 1],
+                    ContentType: file.type,
+                    Body: file,
+                    "Access-Control-Allow-Credentials": "*",
+                    ACL: "public-read",
+                }; //key可以设置为桶的相抵路径,Body为文件, ACL最好要设置
+                var options = {
+                    partSize: 2048 * 1024 * 1024,
+                    queueSize: 2,
+                    leavePartsOnError: true,
+                };
+                bucket
+                    .upload(params, options)
+                    .on("httpUploadProgress", function (evt) {
+                        //这里可以写进度条
+                        // console.log("Uploaded : " + parseInt((evt.loaded * 80) / evt.total) + '%');
+                    })
+                    .send(function (err, data) {
+                        _this.imgLoading = false
+                        // loading.close();
+                        if (err) {
+                            _this.$message.error("上传失败");
+                        } else {
+
+                            _this.info.headportrait = data.Location
+                            _this.$forceUpdate();
+
+                            console.log(_this.checkJson);
+                            console.log(data.Location);
+                        }
+                    });
+            }
+        },
+        //获取教研室列表
+        getClass2() {
+            let params = {
+                oid: this.oid,
+            };
+            this.ajax
+                .get(this.$store.state.api + "selectTeacherOfficeBySchool", params)
+                .then((res) => {
+                    this.classJuri = res.data[0];
+                })
+                .catch((err) => {
+                    this.isLoading = false;
+                    console.error(err);
+                });
+        },
+        Ochange() {
+            this.$forceUpdate()
+        }
+    }
+};
+</script>
+  
+<style scoped>
+.dialog_diy>>>.el-dialog {
+    /* height: 100%; */
+    margin: 10vh auto !important;
+}
+
+.dialog_diy>>>.el-dialog__header {
+    background: #454545 !important;
+    padding: 15px 20px;
+}
+
+.dialog_diy>>>.el-dialog__body {
+    height: calc(100% - 124px);
+    box-sizing: border-box;
+    padding: 0px;
+}
+
+.dialog_diy>>>.el-dialog__title {
+    color: #fff;
+}
+
+.dialog_diy>>>.el-dialog__headerbtn {
+    top: 19px;
+}
+
+.dialog_diy>>>.el-dialog__headerbtn .el-dialog__close {
+    color: #fff;
+}
+
+.dialog_diy>>>.el-dialog__headerbtn .el-dialog__close:hover {
+    color: #fff;
+}
+
+.dialog_diy>>>.el-dialog__body,
+.dialog_diy>>>.el-dialog__footer {
+    background: #fafafa;
+}
+
+
+.info_box {
+    width: 100%;
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+    padding: 30px 0;
+}
+
+.info_box>.img {
+    width: 80px;
+    height: 80px;
+    overflow: hidden;
+    border-radius: 50%;
+    position: relative;
+}
+
+.info_box>.img:hover>.mask {
+    display: flex;
+}
+
+.info_box>.img>.mask {
+    cursor: pointer;
+    position: absolute;
+    top: 0;
+    left: 0;
+    width: 100%;
+    height: 100%;
+    background: rgba(0, 0, 0, 0.5);
+    /* display: flex; */
+    align-items: center;
+    justify-content: center;
+    display: none;
+}
+
+.info_box>.img>.mask>img {
+    width: 20px;
+}
+
+.info_box>.img>img {
+    width: 100%;
+    height: 100%;
+    object-fit: cover;
+}
+
+.binfo_input {
+    width: 100%;
+    margin: 0;
+    padding: 12px 14px;
+    display: block;
+    min-width: 0;
+    outline: none;
+    box-sizing: border-box;
+    background: none;
+    border: none;
+    border-radius: 4px;
+    background: #fff;
+    font-size: 16px;
+    resize: none;
+    font-family: 'Microsoft YaHei';
+    min-height: 48px;
+    /* border: 1px solid #3682fc00; */
+    border: 1px solid #C0C4CC;
+}
+
+.binfo_textarea {
+    border: 1px solid #C0C4CC;
+    font-size: 16px;
+    resize: none;
+    /* background: #f6f6f6; */
+    font-family: 'Microsoft YaHei';
+    font-size: 14px;
+    color: #606266;
+}
+
+.binfo_input:focus-visible {
+    border: 1px solid #3681FC !important;
+}
+
+.binfo_textarea::-webkit-input-placeholder {
+    /* WebKit browsers */
+    color: rgb(192, 196, 204);
+}
+
+.binfo_textarea:-moz-placeholder {
+    /* Mozilla Firefox 4 to 18 */
+    color: rgb(192, 196, 204);
+}
+
+.binfo_textarea::-moz-placeholder {
+    /* Mozilla Firefox 19+ */
+    color: rgb(192, 196, 204);
+}
+
+.binfo_textarea:-ms-input-placeholder {
+    /* Internet Explorer 10+ */
+    color: rgb(192, 196, 204);
+}
+
+.info_span {
+    display: flex;
+    margin-top: 10px;
+}
+
+.info_span>span:nth-child(1) {
+    margin-top: 10px;
+    width: 100px;
+    text-align: right;
+}
+
+.info_span>div {
+    width: 250px;
+}
+</style>
+  

Some files were not shown because too many files changed in this diff