zengyicheng 1 년 전
부모
커밋
420d23826e
58개의 변경된 파일860개의 추가작업 그리고 336개의 파일을 삭제
  1. 0 0
      dist/index.html
  2. 1 1
      dist/report.html
  3. 0 0
      dist/static/css/app.dbec558a.css
  4. 0 1
      dist/static/css/chunk-00843c33.9128a423.css
  5. 0 0
      dist/static/css/chunk-087daf50.375177ba.css
  6. 0 0
      dist/static/css/chunk-09d82406.2f1ddd04.css
  7. 0 0
      dist/static/css/chunk-0f529362.9c7aa8ca.css
  8. 1 0
      dist/static/css/chunk-26c5c56a.fac16175.css
  9. 0 0
      dist/static/css/chunk-2722162e.59889eeb.css
  10. 1 0
      dist/static/css/chunk-31562ebd.ee5584b6.css
  11. 0 0
      dist/static/css/chunk-319f4540.1640ae07.css
  12. 0 1
      dist/static/css/chunk-3f221275.a423aeaf.css
  13. 0 1
      dist/static/css/chunk-4548fd47.7f5e6538.css
  14. 1 0
      dist/static/css/chunk-546d5e71.ae7b861b.css
  15. 1 0
      dist/static/css/chunk-5ee34b5a.c94776c5.css
  16. 0 0
      dist/static/css/chunk-63fa367b.58f2f5b4.css
  17. 1 0
      dist/static/css/chunk-66fcd5c2.fea22e6c.css
  18. 1 0
      dist/static/css/chunk-6e4b5c87.be5405e5.css
  19. 0 0
      dist/static/css/chunk-vantUI.2428ec55.css
  20. 0 0
      dist/static/css/chunk-vantUI.fbabdac4.css
  21. 0 0
      dist/static/js/app.bebb137b.js
  22. 0 0
      dist/static/js/app.dedc3c09.js
  23. 0 0
      dist/static/js/chunk-00843c33.2b7ad5c5.js
  24. 0 0
      dist/static/js/chunk-01979dd3.30fb23f3.js
  25. 0 0
      dist/static/js/chunk-087daf50.7f338e84.js
  26. 0 0
      dist/static/js/chunk-09d82406.6c1c7696.js
  27. 0 0
      dist/static/js/chunk-0f529362.2af23191.js
  28. 0 0
      dist/static/js/chunk-26c5c56a.a6199f54.js
  29. 0 0
      dist/static/js/chunk-2722162e.d846df08.js
  30. 1 0
      dist/static/js/chunk-2d21dfab.2d9e7aaf.js
  31. 0 1
      dist/static/js/chunk-2d21dfab.422cb8cf.js
  32. 1 0
      dist/static/js/chunk-31562ebd.e49a5227.js
  33. 0 0
      dist/static/js/chunk-319f4540.a01f24d9.js
  34. 0 1
      dist/static/js/chunk-3f221275.85febc54.js
  35. 0 0
      dist/static/js/chunk-41b428d1.37feb4a2.js
  36. 0 1
      dist/static/js/chunk-4548fd47.fde750ba.js
  37. 0 0
      dist/static/js/chunk-4b27d991.2824dad7.js
  38. 1 0
      dist/static/js/chunk-546d5e71.ed7c38c8.js
  39. 0 0
      dist/static/js/chunk-5bd16f48.e0aa2b01.js
  40. 1 0
      dist/static/js/chunk-5ee34b5a.daa1bca5.js
  41. 0 0
      dist/static/js/chunk-63fa367b.1ca48a52.js
  42. 1 0
      dist/static/js/chunk-66fcd5c2.eb7ebcf9.js
  43. 1 0
      dist/static/js/chunk-6e4b5c87.125e8e97.js
  44. 0 0
      dist/static/js/chunk-bea7971e.ae8f1966.js
  45. 0 0
      dist/static/js/chunk-c8697d60.00324023.js
  46. 0 0
      dist/static/js/chunk-libs.929f1c0b.js
  47. 0 0
      dist/static/js/chunk-vantUI.11493b56.js
  48. 0 0
      dist/static/js/chunk-vantUI.959a580b.js
  49. 20 0
      src/api/testDetail.js
  50. 10 0
      src/api/testStudent.js
  51. BIN
      src/assets/images/testStudent/all.png
  52. BIN
      src/assets/images/testStudent/edit.png
  53. 95 70
      src/router/router.config.js
  54. 146 145
      src/store/modules/user.js
  55. 291 92
      src/views/test/components/courseItem.vue
  56. 50 22
      src/views/test/index.vue
  57. 119 0
      src/views/testDetail/check.vue
  58. 116 0
      src/views/testDetail/preview.vue

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
dist/index.html


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 1 - 1
dist/report.html


+ 0 - 0
dist/static/css/app.745921f5.css → dist/static/css/app.dbec558a.css


+ 0 - 1
dist/static/css/chunk-00843c33.9128a423.css

@@ -1 +0,0 @@
-h3[data-v-9a4c3dc4]{margin:1.06667rem 0 0}ul[data-v-9a4c3dc4]{list-style-type:none;padding:0}li[data-v-9a4c3dc4]{display:inline-block;margin:0 .26667rem}a[data-v-9a4c3dc4]{color:#42b983}.app-container[data-v-2bb8c1e2]{height:100vh}.app-container .layout-content[data-v-2bb8c1e2]{height:calc(100% - 1.33333rem)}.app-container .layout-footer[data-v-2bb8c1e2]{display:block;height:1.33333rem}

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
dist/static/css/chunk-087daf50.375177ba.css


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
dist/static/css/chunk-09d82406.2f1ddd04.css


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
dist/static/css/chunk-0f529362.9c7aa8ca.css


+ 1 - 0
dist/static/css/chunk-26c5c56a.fac16175.css

@@ -0,0 +1 @@
+h3[data-v-543593c5]{margin:1.06667rem 0 0}ul[data-v-543593c5]{list-style-type:none;padding:0}li[data-v-543593c5]{display:inline-block;margin:0 .26667rem}a[data-v-543593c5]{color:#42b983}.app-container[data-v-60ba57a3]{height:100vh}.app-container .layout-content[data-v-60ba57a3]{height:calc(100% - 1.33333rem)}.app-container .layout-footer[data-v-60ba57a3]{display:block;height:1.33333rem}

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
dist/static/css/chunk-2722162e.59889eeb.css


+ 1 - 0
dist/static/css/chunk-31562ebd.ee5584b6.css

@@ -0,0 +1 @@
+.navTitle[data-v-9080d3ce]{font-size:.42667rem;color:#fff}.home-container[data-v-9080d3ce]{height:100vh;overflow:hidden}.home-container .step_box[data-v-9080d3ce]{margin-top:1.5rem;width:100%;height:calc(100vh - 2.83333rem);overflow:auto;position:relative}.home-container .edit_top[data-v-9080d3ce]{width:100%;margin:0 auto}.home-container .edit_top[data-v-9080d3ce] .el-button{width:100%;height:1.33333rem;text-align:center;font-size:.42667rem}

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
dist/static/css/chunk-319f4540.1640ae07.css


+ 0 - 1
dist/static/css/chunk-3f221275.a423aeaf.css

@@ -1 +0,0 @@
-.loginBox[data-v-66aac3e8]{position:relative;width:100vw;height:100vh;overflow:hidden}.loginBox>iframe[data-v-66aac3e8]{width:100%;height:100%;border:0}

+ 0 - 1
dist/static/css/chunk-4548fd47.7f5e6538.css

@@ -1 +0,0 @@
-.loginBox[data-v-4dc8186e]{position:relative;width:100vw;height:100vh;overflow:hidden}.loginBox>iframe[data-v-4dc8186e]{width:100%;height:100%;border:0}

+ 1 - 0
dist/static/css/chunk-546d5e71.ae7b861b.css

@@ -0,0 +1 @@
+.navTitle[data-v-9c358f26]{font-size:.42667rem;color:#fff}.home-container[data-v-9c358f26]{height:100vh;overflow:hidden}.home-container .step_box[data-v-9c358f26]{margin-top:1.5rem;width:100%;height:calc(100vh - 2.83333rem);overflow:auto;position:relative}.home-container .edit_top[data-v-9c358f26]{width:100%;margin:0 auto}.home-container .edit_top[data-v-9c358f26] .el-button{width:100%;height:1.33333rem;text-align:center;font-size:.42667rem}

+ 1 - 0
dist/static/css/chunk-5ee34b5a.c94776c5.css

@@ -0,0 +1 @@
+.loginBox[data-v-02bea5b8]{position:relative;width:100vw;height:100vh;overflow:hidden}.loginBox>iframe[data-v-02bea5b8]{width:100%;height:100%;border:0}

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
dist/static/css/chunk-63fa367b.58f2f5b4.css


+ 1 - 0
dist/static/css/chunk-66fcd5c2.fea22e6c.css

@@ -0,0 +1 @@
+.navTitle[data-v-fd607e66]{font-size:.42667rem;color:#fff}.home-container[data-v-fd607e66]{height:100vh;overflow:hidden}.home-container .step_box[data-v-fd607e66]{margin-top:1.5rem;width:100%;height:calc(100vh - 2.83333rem);overflow:auto;position:relative}.home-container .edit_top[data-v-fd607e66]{width:100%;margin:0 auto}.home-container .edit_top[data-v-fd607e66] .el-button{width:100%;height:1.33333rem;text-align:center;font-size:.42667rem}

+ 1 - 0
dist/static/css/chunk-6e4b5c87.be5405e5.css

@@ -0,0 +1 @@
+.loginBox[data-v-9e4fb358]{position:relative;width:100vw;height:100vh;overflow:hidden}.loginBox>iframe[data-v-9e4fb358]{width:100%;height:100%;border:0}

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
dist/static/css/chunk-vantUI.2428ec55.css


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
dist/static/css/chunk-vantUI.fbabdac4.css


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
dist/static/js/app.bebb137b.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
dist/static/js/app.dedc3c09.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
dist/static/js/chunk-00843c33.2b7ad5c5.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
dist/static/js/chunk-01979dd3.30fb23f3.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
dist/static/js/chunk-087daf50.7f338e84.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
dist/static/js/chunk-09d82406.6c1c7696.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
dist/static/js/chunk-0f529362.2af23191.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
dist/static/js/chunk-26c5c56a.a6199f54.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
dist/static/js/chunk-2722162e.d846df08.js


+ 1 - 0
dist/static/js/chunk-2d21dfab.2d9e7aaf.js

@@ -0,0 +1 @@
+(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-2d21dfab"],{d438:function(n,e,t){"use strict";t.r(e);var u=function(){var n=this,e=n._self._c;return e("div",[n._v(" 学生评价 ")])},a=[],c={},s=c,d=t("2877"),i=Object(d["a"])(s,u,a,!1,null,"e60ea116",null);e["default"]=i.exports}}]);

+ 0 - 1
dist/static/js/chunk-2d21dfab.422cb8cf.js

@@ -1 +0,0 @@
-(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-2d21dfab"],{d438:function(n,e,t){"use strict";t.r(e);var a=function(){var n=this,e=n.$createElement,t=n._self._c||e;return t("div",[n._v(" 学生评价 ")])},c=[],u={},r=u,s=t("2877"),d=Object(s["a"])(r,a,c,!1,null,"305a6a88",null);e["default"]=d.exports}}]);

+ 1 - 0
dist/static/js/chunk-31562ebd.e49a5227.js

@@ -0,0 +1 @@
+(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-31562ebd"],{"18ec":function(t,e,i){},5548:function(t,e,i){"use strict";i("18ec")},"730a":function(t,e,i){"use strict";i.r(e);var s=function(){var t=this,e=t._self._c;return e("div",{staticClass:"home-container"},[e("head-bar",{on:{back:t.back},scopedSlots:t._u([{key:"title",fn:function(){return[e("div",{staticClass:"navTitle"},[t._v("查看问卷")])]},proxy:!0}])}),e("div",{staticClass:"step_box"},[e("topicVue",{attrs:{cJson:t.cJson,title:t.title,brief:t.brief,checktype:2,see:t.see}})],1),e("div",{staticClass:"edit_top"},[e("div",{staticClass:"op_btn"},[e("el-button",{attrs:{type:"primary",size:"small"},on:{click:t.publish}},[t._v("提交")])],1)])],1)},c=[],n=i("5530"),o=(i("14d9"),i("e9c4"),i("98e5")),r=i("71ed"),a=i("2f62"),u=i("bf3a"),d={components:{headBar:r["a"],topicVue:u["a"]},data:function(){return{courseid:this.$route.query.courseid,tid:this.$route.query.tid,title:"",brief:"",cJson:[],see:!1}},computed:Object(n["a"])({},Object(a["c"])(["userinfo"])),methods:{back:function(){this.$router.push({path:"/test"})},getData:function(){var t=this,e={cid:this.courseid,tid:this.tid};Object(o["d"])(e).then((function(e){e[1].length&&(t.cJson=JSON.parse(e[1][0].courseJson)),t.title=e[0][0].title,t.brief=e[0][0].brief,t.see=1==e[0][0].open,t.$forceUpdate()})).catch((function(t){console.error(t)}))},publish:function(){var t=this,e=this.$refs["topicVue"].checkArray,i=[{uid:this.userinfo.userid,cid:this.courseid,cjson:JSON.stringify(e),type:2}];Object(o["a"])(i).then((function(e){t.$message.success("提交成功"),t.back()})).catch((function(t){console.error(t)}))}},mounted:function(){this.getData()}},f=d,h=(i("5548"),i("2877")),l=Object(h["a"])(f,s,c,!1,null,"9080d3ce",null);e["default"]=l.exports}}]);

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
dist/static/js/chunk-319f4540.a01f24d9.js


+ 0 - 1
dist/static/js/chunk-3f221275.85febc54.js

@@ -1 +0,0 @@
-(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-3f221275"],{"2fe9":function(e,t,r){"use strict";var i=r("35d8"),o=r.n(i);o.a},"35d8":function(e,t,r){},"89ef":function(e,t,r){"use strict";r.r(t);var i=function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("div",{staticClass:"loginBox"},[r("iframe",{attrs:{allow:"camera *; microphone *;display-capture;midi;encrypted-media;",src:e.iframe,frameborder:"0"}})])},o=[],c=(r("99af"),r("5530")),n=r("2f62"),a={data:function(){return{redirect:void 0,timer:null,iframe:"https://cloud.cocorobo.cn/aigpt/"}},computed:Object(c["a"])({},Object(n["c"])(["userinfo"])),watch:{$route:{handler:function(e){this.redirect=e.query&&e.query.redirect},immediate:!0}},methods:{},beforeDestroy:function(){clearInterval(this.timer),this.timer=null},mounted:function(){this.iframe="https://cloud.cocorobo.cn/aigpt/?userid=".concat(this.userinfo.userid,"&oid=").concat(this.userinfo.organizeid,"&org=").concat(this.userinfo.org,"&role=").concat(this.userinfo.role)}},s=a,u=(r("2fe9"),r("2877")),d=Object(u["a"])(s,i,o,!1,null,"66aac3e8",null);t["default"]=d.exports}}]);

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
dist/static/js/chunk-41b428d1.37feb4a2.js


+ 0 - 1
dist/static/js/chunk-4548fd47.fde750ba.js

@@ -1 +0,0 @@
-(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-4548fd47"],{"6605e":function(e,t,r){},"9ed6":function(e,t,r){"use strict";r.r(t);var n=function(){var e=this,t=e.$createElement;e._self._c;return e._m(0)},i=[function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("div",{staticClass:"loginBox"},[r("iframe",{attrs:{src:"//edu.cocorobo.cn/course/login?type=2",frameborder:"0"}})])}],c=(r("96cf"),r("1da1")),o=r("5530"),u=r("2f62"),a={data:function(){return{redirect:void 0,timer:null}},watch:{$route:{handler:function(e){this.redirect=e.query&&e.query.redirect},immediate:!0}},methods:Object(o["a"])(Object(o["a"])({},Object(u["b"])({login:"user/login"})),{},{handleLogin:function(){this.$router.push({path:this.redirect||"/"})},getLogin:function(){var e=this;return Object(c["a"])(regeneratorRuntime.mark((function t(){var r;return regeneratorRuntime.wrap((function(t){while(1)switch(t.prev=t.next){case 0:return t.next=2,e.login();case 2:r=t.sent,r&&e.$router.push({path:e.redirect||"/"});case 4:case"end":return t.stop()}}),t)})))()}}),beforeDestroy:function(){clearInterval(this.timer),this.timer=null},mounted:function(){var e=this;this.getLogin(),this.timer=setInterval((function(){e.getLogin()}),2e3)}},s=a,l=(r("b792"),r("2877")),d=Object(l["a"])(s,n,i,!1,null,"4dc8186e",null);t["default"]=d.exports},b792:function(e,t,r){"use strict";var n=r("6605e"),i=r.n(n);i.a}}]);

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
dist/static/js/chunk-4b27d991.2824dad7.js


+ 1 - 0
dist/static/js/chunk-546d5e71.ed7c38c8.js

@@ -0,0 +1 @@
+(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-546d5e71"],{"3a2e":function(t,e,i){"use strict";i.r(e);var s=function(){var t=this,e=t._self._c;return e("div",{staticClass:"home-container"},[e("head-bar",{on:{back:t.back},scopedSlots:t._u([{key:"title",fn:function(){return[e("div",{staticClass:"navTitle"},[t._v("修改问卷")])]},proxy:!0}])}),e("div",{staticClass:"step_box"},[e("topicVue",{ref:"topicVue",attrs:{cJson:t.cJson,title:t.title,brief:t.brief}})],1),e("div",{staticClass:"edit_top"},[e("div",{staticClass:"op_btn"},[e("el-button",{attrs:{type:"primary",size:"small"},on:{click:t.publish}},[t._v("提交")])],1)])],1)},c=[],n=i("5530"),o=(i("14d9"),i("e9c4"),i("98e5")),r=i("71ed"),a=i("2f62"),u=i("bf3a"),f={components:{headBar:r["a"],topicVue:u["a"]},data:function(){return{courseid:this.$route.query.courseid,tid:this.$route.query.tid,title:"",brief:"",cJson:[]}},computed:Object(n["a"])({},Object(a["c"])(["userinfo"])),methods:{back:function(){this.$router.push({path:"/test"})},getData:function(){var t=this,e={cid:this.courseid,tid:this.tid};Object(o["d"])(e).then((function(e){e[1].length&&(t.cJson=JSON.parse(e[1][0].courseJson)),t.title=e[0][0].title,t.brief=e[0][0].brief,t.$forceUpdate()})).catch((function(t){console.error(t)}))},publish:function(){var t=this,e=this.$refs["topicVue"].checkArray,i=[{uid:this.userinfo.userid,cid:this.courseid,cjson:JSON.stringify(e),type:2}];Object(o["a"])(i).then((function(e){t.$message.success("提交成功"),t.back()})).catch((function(t){console.error(t)}))}},mounted:function(){this.getData()}},d=f,h=(i("fbc8"),i("2877")),l=Object(h["a"])(d,s,c,!1,null,"9c358f26",null);e["default"]=l.exports},"491f":function(t,e,i){},fbc8:function(t,e,i){"use strict";i("491f")}}]);

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
dist/static/js/chunk-5bd16f48.e0aa2b01.js


+ 1 - 0
dist/static/js/chunk-5ee34b5a.daa1bca5.js

@@ -0,0 +1 @@
+(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-5ee34b5a"],{"08dc":function(e,t,n){},"9ed6":function(e,t,n){"use strict";n.r(t);var r=function(){var e=this;e._self._c;return e._m(0)},i=[function(){var e=this,t=e._self._c;return t("div",{staticClass:"loginBox"},[t("iframe",{attrs:{src:"//edu.cocorobo.cn/course/login?type=2",frameborder:"0"}})])}],c=n("c7eb"),o=n("1da1"),u=n("5530"),a=(n("14d9"),n("2f62")),s={data:function(){return{redirect:void 0,timer:null}},watch:{$route:{handler:function(e){this.redirect=e.query&&e.query.redirect},immediate:!0}},methods:Object(u["a"])(Object(u["a"])({},Object(a["b"])({login:"user/login"})),{},{handleLogin:function(){this.$router.push({path:this.redirect||"/"})},getLogin:function(){var e=this;return Object(o["a"])(Object(c["a"])().mark((function t(){var n;return Object(c["a"])().wrap((function(t){while(1)switch(t.prev=t.next){case 0:return t.next=2,e.login();case 2:n=t.sent,n&&e.$router.push({path:e.redirect||"/"});case 4:case"end":return t.stop()}}),t)})))()}}),beforeDestroy:function(){clearInterval(this.timer),this.timer=null},mounted:function(){var e=this;this.getLogin(),this.timer=setInterval((function(){e.getLogin()}),2e3)}},d=s,h=(n("d02e"),n("2877")),l=Object(h["a"])(d,r,i,!1,null,"02bea5b8",null);t["default"]=l.exports},d02e:function(e,t,n){"use strict";n("08dc")}}]);

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
dist/static/js/chunk-63fa367b.1ca48a52.js


+ 1 - 0
dist/static/js/chunk-66fcd5c2.eb7ebcf9.js

@@ -0,0 +1 @@
+(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-66fcd5c2"],{"5f09":function(t,e,i){"use strict";i("83ae")},"83ae":function(t,e,i){},eaa4:function(t,e,i){"use strict";i.r(e);var c=function(){var t=this,e=t._self._c;return e("div",{staticClass:"home-container"},[e("head-bar",{on:{back:t.back},scopedSlots:t._u([{key:"title",fn:function(){return[e("div",{staticClass:"navTitle"},[t._v("填写问卷")])]},proxy:!0}])}),e("div",{staticClass:"step_box"},[e("topicVue",{ref:"topicVue",attrs:{cJson:t.cJson,title:t.title,brief:t.brief}})],1),e("div",{staticClass:"edit_top"},[e("div",{staticClass:"op_btn"},[e("el-button",{attrs:{type:"primary",size:"small"},on:{click:t.publish}},[t._v("提交")])],1)])],1)},s=[],n=i("5530"),o=(i("14d9"),i("e9c4"),i("98e5")),a=i("71ed"),r=i("2f62"),u=i("bf3a"),f={components:{headBar:a["a"],topicVue:u["a"]},data:function(){return{courseid:this.$route.query.courseid,title:"",brief:"",cJson:[]}},computed:Object(n["a"])({},Object(r["c"])(["userinfo"])),methods:{back:function(){this.$router.push({path:"/test"})},getData:function(){var t=this,e={cid:this.courseid};Object(o["c"])(e).then((function(e){t.cJson=JSON.parse(e[0][0].chapters),t.title=e[0][0].title,t.brief=e[0][0].brief})).catch((function(t){console.error(t)}))},publish:function(){var t=this,e=this.$refs["topicVue"].checkArray,i=[{uid:this.userinfo.userid,cid:this.courseid,cjson:JSON.stringify(e),type:2}];Object(o["a"])(i).then((function(e){t.$message.success("提交成功"),t.back()})).catch((function(t){console.error(t)}))}},mounted:function(){this.getData()}},d=f,l=(i("5f09"),i("2877")),h=Object(l["a"])(d,c,s,!1,null,"fd607e66",null);e["default"]=h.exports}}]);

+ 1 - 0
dist/static/js/chunk-6e4b5c87.125e8e97.js

@@ -0,0 +1 @@
+(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-6e4b5c87"],{3123:function(e,t,i){"use strict";i("87aa")},"87aa":function(e,t,i){},"89ef":function(e,t,i){"use strict";i.r(t);var r=function(){var e=this,t=e._self._c;return t("div",{staticClass:"loginBox"},[t("iframe",{attrs:{allow:"camera *; microphone *;display-capture;midi;encrypted-media;",src:e.iframe,frameborder:"0"}})])},o=[],c=i("5530"),n=(i("99af"),i("2f62")),a={data:function(){return{redirect:void 0,timer:null,iframe:"https://cloud.cocorobo.cn/aigpt/"}},computed:Object(c["a"])({},Object(n["c"])(["userinfo"])),watch:{$route:{handler:function(e){this.redirect=e.query&&e.query.redirect},immediate:!0}},methods:{},beforeDestroy:function(){clearInterval(this.timer),this.timer=null},mounted:function(){this.iframe="https://cloud.cocorobo.cn/aigpt/?userid=".concat(this.userinfo.userid,"&oid=").concat(this.userinfo.organizeid,"&org=").concat(this.userinfo.org,"&role=").concat(this.userinfo.role)}},s=a,u=(i("3123"),i("2877")),d=Object(u["a"])(s,r,o,!1,null,"9e4fb358",null);t["default"]=d.exports}}]);

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
dist/static/js/chunk-bea7971e.ae8f1966.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
dist/static/js/chunk-c8697d60.00324023.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
dist/static/js/chunk-libs.929f1c0b.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
dist/static/js/chunk-vantUI.11493b56.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
dist/static/js/chunk-vantUI.959a580b.js


+ 20 - 0
src/api/testDetail.js

@@ -18,4 +18,24 @@ export function addTestWorks(data) {
         data,
         hideloading: false
     })
+}
+
+// 删除评测问卷作业
+export function deleteTestCourseWorks(data) {
+    return request({
+        url: '/deleteTestCourseWorks',
+        method: 'post',
+        data,
+        hideloading: false
+    })
+}
+
+//查询问卷作业
+export function selectTestCourseWorks(params) {
+    return request({
+        url: '/selectTestCourseWorks',
+        method: 'get',
+        params,
+        hideloading: false
+    })
 }

+ 10 - 0
src/api/testStudent.js

@@ -17,4 +17,14 @@ export function selectTesttCourseCenter(params) {
         params,
         hideloading: false
     })
+}
+
+//查询问卷列表及作业
+export function selectTesttCourseCenter1(params) {
+    return request({
+        url: '/selectTesttCourseCenter1',
+        method: 'get',
+        params,
+        hideloading: false
+    })
 }

BIN
src/assets/images/testStudent/all.png


BIN
src/assets/images/testStudent/edit.png


+ 95 - 70
src/router/router.config.js

@@ -2,74 +2,99 @@
  * 基础路由
  * @type { *[] }
  */
-export const constantRouterMap = [
-  {
-    path: '/',
-    redirect: '/home'
-  },
-  {
-    path: '/login',
-    component: () => import('@/views/login/index'),
-    meta: {
-      title: '登录',
-      keepAlive: false
+export const constantRouterMap = [{
+        path: '/',
+        redirect: '/home'
+    },
+    {
+        path: '/login',
+        component: () =>
+            import ('@/views/login/index'),
+        meta: {
+            title: '登录',
+            keepAlive: false
+        }
+    },
+    {
+        path: '/course',
+        component: () =>
+            import ('@/views/course/index'),
+        meta: {
+            title: '课程',
+            keepAlive: false
+        }
+    },
+    {
+        path: '/',
+        component: () =>
+            import ('@/views/layouts'),
+        meta: { title: '课程中心', keepAlive: false },
+        children: [{
+                path: 'home',
+                name: 'home',
+                component: () =>
+                    import ('@/views/home/index'),
+                meta: { title: '课程中心', keepAlive: false }
+            },
+            {
+                path: 'test',
+                name: 'Test',
+                component: () =>
+                    import ('@/views/test/index'),
+                meta: { title: '评测中心', keepAlive: false }
+            },
+            {
+                path: 'eva',
+                name: 'eva',
+                component: () =>
+                    import ('@/views/eva/index'),
+                meta: { title: '学生评价', keepAlive: false }
+            }
+        ]
+    },
+    {
+        path: '/courseDetail',
+        component: () =>
+            import ('@/views/courseDetail/index'),
+        meta: {
+            title: '课程详情',
+            keepAlive: false
+        }
+    },
+    {
+        path: '/testDetail',
+        component: () =>
+            import ('@/views/testDetail/index'),
+        meta: {
+            title: '填写问卷',
+            keepAlive: false
+        }
+    },
+    {
+        path: '/preview',
+        component: () =>
+            import ('@/views/testDetail/preview'),
+        meta: {
+            title: '修改问卷',
+            keepAlive: false
+        }
+    },
+    {
+        path: '/check',
+        component: () =>
+            import ('@/views/testDetail/check'),
+        meta: {
+            title: '查看问卷',
+            keepAlive: false
+        }
+    },
+    {
+        path: '/cocoai',
+        component: () =>
+            import ('@/views/aigpt/index'),
+        meta: {
+            title: 'CocoAI',
+            keepAlive: false
+        }
     }
-  },
-  {
-    path: '/course',
-    component: () => import('@/views/course/index'),
-    meta: {
-      title: '课程',
-      keepAlive: false
-    }
-  },
-  {
-    path: '/',
-    component: () => import('@/views/layouts'),
-    meta: { title: '课程中心', keepAlive: false },
-    children: [
-      {
-        path: 'home',
-        name: 'home',
-        component: () => import('@/views/home/index'),
-        meta: { title: '课程中心', keepAlive: false }
-      },
-      {
-        path: 'test',
-        name: 'Test',
-        component: () => import('@/views/test/index'),
-        meta: { title: '评测中心', keepAlive: false }
-      },
-      {
-        path: 'eva',
-        name: 'eva',
-        component: () => import('@/views/eva/index'),
-        meta: { title: '学生评价', keepAlive: false }
-      }
-    ]
-  },
-  {
-    path: '/courseDetail',
-    component: () => import('@/views/courseDetail/index'),
-    meta: {
-      title: '课程详情',
-      keepAlive: false
-    }
-  },
-  {
-    path: '/testDetail',
-    component: () => import('@/views/testDetail/index'),
-    meta: {
-      title: '填写问卷',
-      keepAlive: false
-    }
-  },
-  {
-    path: '/cocoai',
-    component: () => import('@/views/aigpt/index'),
-    meta: {
-      title: 'CocoAI',
-      keepAlive: false
-    }
-  }
-]
+]

+ 146 - 145
src/store/modules/user.js

@@ -3,164 +3,165 @@ import { eduGet, getUser } from '@/api/user'
 import { getToken, removeToken, setToken } from '@/utils/auth'
 import { resetRouter } from '@/router'
 const getDefaultState = () => {
-  return {
-    token: getToken(),
-    id: '',
-    roles: [],
-    name: '',
-    username: '',
-    avatar: '',
-    is_init: false,
-    userinfo: ''
-  }
+    return {
+        token: getToken(),
+        id: '',
+        roles: [],
+        name: '',
+        username: '',
+        avatar: '',
+        is_init: false,
+        userinfo: ''
+    }
 }
 
 const state = getDefaultState()
 const mutations = {
-  RESET_STATE: state => {
-    Object.assign(state, getDefaultState())
-  },
-  SET_TOKEN: (state, token) => {
-    state.token = token
-  },
-  SET_ROLES: (state, roles) => {
-    state.roles = roles
-  },
-  SET_ID: (state, id) => {
-    state.id = id
-  },
-  SET_NAME: (state, name) => {
-    state.name = name
-  },
-  SET_USERNAME: (state, name) => {
-    state.username = name
-  },
-  SET_IS_INIT: (state, is_init) => {
-    state.is_init = is_init
-  },
-  SET_AVATAR: (state, avatar) => {
-    state.avatar = avatar
-  },
-  SET_USERINFO: (state, userinfo) => {
-    state.userinfo = userinfo
-  }
+    RESET_STATE: state => {
+        Object.assign(state, getDefaultState())
+    },
+    SET_TOKEN: (state, token) => {
+        state.token = token
+    },
+    SET_ROLES: (state, roles) => {
+        state.roles = roles
+    },
+    SET_ID: (state, id) => {
+        state.id = id
+    },
+    SET_NAME: (state, name) => {
+        state.name = name
+    },
+    SET_USERNAME: (state, name) => {
+        state.username = name
+    },
+    SET_IS_INIT: (state, is_init) => {
+        state.is_init = is_init
+    },
+    SET_AVATAR: (state, avatar) => {
+        state.avatar = avatar
+    },
+    SET_USERINFO: (state, userinfo) => {
+        state.userinfo = userinfo
+    }
 }
 
 const actions = {
-  // user login
-  // login({ commit }, userInfo) {
-  //   const { username, password } = userInfo
-  //   return new Promise((resolve, reject) => {
-  //     login({ username: username.trim(), password: password })
-  //       .then(response => {
-  //         const { data } = response
-  //         const token = 'JWT ' + data.token
-  //         commit('SET_TOKEN', token)
-  //         setToken(token)
-  //         resolve()
-  //       })
-  //       .catch(error => {
-  //         reject(error)
-  //       })
-  //   })
-  // },
-  login({ commit, dispatch }) {
-    return new Promise((resolve, reject) => {
-      eduGet()
-        .then(response => {
-          console.log(response)
-          var _user = response[0][0]
-          commit('SET_ID', _user.userid)
-          setToken(_user.userid)
-          // dispatch('getInfo')
-          resolve(_user.userid)
+    // user login
+    // login({ commit }, userInfo) {
+    //   const { username, password } = userInfo
+    //   return new Promise((resolve, reject) => {
+    //     login({ username: username.trim(), password: password })
+    //       .then(response => {
+    //         const { data } = response
+    //         const token = 'JWT ' + data.token
+    //         commit('SET_TOKEN', token)
+    //         setToken(token)
+    //         resolve()
+    //       })
+    //       .catch(error => {
+    //         reject(error)
+    //       })
+    //   })
+    // },
+    login({ commit, dispatch }) {
+        return new Promise((resolve, reject) => {
+            eduGet()
+                .then(response => {
+                    console.log(response)
+                    var _user = response[0][0]
+                    commit('SET_ID', _user.userid)
+                    setToken(_user.userid)
+                        // dispatch('getInfo')
+                    resolve(_user.userid)
+                })
+                .catch(error => {
+                    // var _user = { userid: '5943e08c-b7d4-11ed-8d51-005056b86db5' }
+                    // commit('SET_ID', _user.userid)
+                    // setToken(_user.userid)
+                    // resolve(_user.userid)
+                    reject(error)
+                })
         })
-        .catch(error => {
-          // var _user = { userid: '5943e08c-b7d4-11ed-8d51-005056b86db5' }
-          // setToken(_user.userid)
-          // resolve(_user.userid)
-          reject(error)
+    },
+    getInfo({ commit, state }) {
+        return new Promise((resolve, reject) => {
+            // getToken()
+            getUser({ userid: state.id })
+                .then(response => {
+                    console.log(response)
+                        // const { data } = response
+                    const data = response[0][0]
+                    if (!data) {
+                        reject('验证失败,请重新登录。')
+                    }
+                    // console.log(response)
+                    commit('SET_USERINFO', data)
+                    resolve(data)
+                        // resolve()
+                })
+                .catch(error => {
+                    reject(error)
+                })
         })
-    })
-  },
-  getInfo({ commit, state }) {
-    return new Promise((resolve, reject) => {
-      // getToken()
-      getUser({ userid: state.id })
-        .then(response => {
-          console.log(response)
-          // const { data } = response
-          const data = response[0][0]
-          if (!data) {
-            reject('验证失败,请重新登录。')
-          }
-          // console.log(response)
-          commit('SET_USERINFO', data)
-          resolve(data)
-          // resolve()
-        })
-        .catch(error => {
-          reject(error)
-        })
-    })
-  },
-  // get user info
-  // getInfo({ commit, state }) {
-  //   return new Promise((resolve, reject) => {
-  //     getUser()
-  //       .then(response => {
-  //         const { data } = response
+    },
+    // get user info
+    // getInfo({ commit, state }) {
+    //   return new Promise((resolve, reject) => {
+    //     getUser()
+    //       .then(response => {
+    //         const { data } = response
 
-  //         if (!data) {
-  //           reject('验证失败,请重新登录。')
-  //         }
-  //         console.log(response)
+    //         if (!data) {
+    //           reject('验证失败,请重新登录。')
+    //         }
+    //         console.log(response)
 
-  //         const { id, roles, is_init, cn, avatar, username } = response.data
-  //         // roles must be a non-empty array
-  //         if (!roles || roles.length <= 0) {
-  //           reject('getInfo: 角色必须为非空数组!')
-  //         }
-  //         commit('SET_NAME', cn)
-  //         commit('SET_USERNAME', username)
-  //         commit('SET_ROLES', roles)
-  //         commit('SET_ID', id)
-  //         commit('SET_AVATAR', avatar)
-  //         commit('SET_IS_INIT', is_init)
-  //         resolve(data)
-  //       })
-  //       .catch(error => {
-  //         reject(error)
-  //       })
-  //   })
-  // },
+    //         const { id, roles, is_init, cn, avatar, username } = response.data
+    //         // roles must be a non-empty array
+    //         if (!roles || roles.length <= 0) {
+    //           reject('getInfo: 角色必须为非空数组!')
+    //         }
+    //         commit('SET_NAME', cn)
+    //         commit('SET_USERNAME', username)
+    //         commit('SET_ROLES', roles)
+    //         commit('SET_ID', id)
+    //         commit('SET_AVATAR', avatar)
+    //         commit('SET_IS_INIT', is_init)
+    //         resolve(data)
+    //       })
+    //       .catch(error => {
+    //         reject(error)
+    //       })
+    //   })
+    // },
 
-  // user logout
-  logout({ commit, state }) {
-    return new Promise((resolve, reject) => {
-      commit('SET_TOKEN', '')
-      commit('SET_ROLES', [])
-      removeToken()
-      resetRouter()
-      commit('RESET_STATE')
-      resolve()
-    })
-  },
+    // user logout
+    logout({ commit, state }) {
+        return new Promise((resolve, reject) => {
+            commit('SET_TOKEN', '')
+            commit('SET_ROLES', [])
+            removeToken()
+            resetRouter()
+            commit('RESET_STATE')
+            resolve()
+        })
+    },
 
-  // remove token
-  resetToken({ commit }) {
-    return new Promise(resolve => {
-      commit('SET_TOKEN', '')
-      commit('SET_ROLES', [])
-      removeToken()
-      resolve()
-    })
-  }
+    // remove token
+    resetToken({ commit }) {
+        return new Promise(resolve => {
+            commit('SET_TOKEN', '')
+            commit('SET_ROLES', [])
+            removeToken()
+            resolve()
+        })
+    }
 }
 
 export default {
-  namespaced: true,
-  state,
-  mutations,
-  actions
-}
+    namespaced: true,
+    state,
+    mutations,
+    actions
+}

+ 291 - 92
src/views/test/components/courseItem.vue

@@ -1,43 +1,67 @@
 <template>
-  <div @click="goTo(c.courseId)">
-    <div class="cDetail">
+  <div class="cDetail">
+    <div class="cTop">
+      <div
+        class="test_type"
+        :class="{
+          is: (c.type == 1 && c.testCount > 1) || (c.type != 1 && c.testCount > 0),
+          no: c.testCount == 0,
+          isR: c.type == 3,
+          isS: c.type == 1 && c.testCount == 1
+        }"
+      >
+        <span>{{
+          c.testCount > 0 ? (c.type == 3 ? '已批改' : c.type == 1 && c.testCount == 1 ? '已保存' : '已完成') : '未完成'
+        }}</span>
+      </div>
+      <div class="ctitle">{{ c.title }}</div>
+    </div>
+    <div class="cMiddle">
       <div class="cLeft">
-        <div class="ctitle">{{ c.title }}</div>
-        <div class="cBottom">
-          <div class="test_btn">
-            <div class="test_o_btn"></div>
-            <div
-              class="test_type"
-              :class="{
-                is: (c.type == 1 && c.testCount > 1) || (c.type != 1 && c.testCount > 0),
-                no: c.testCount == 0,
-                isR: c.type == 3,
-                isS: c.type == 1 && c.testCount == 1
-              }"
-            >
-              <span>{{
-                c.testCount > 0
-                  ? c.type == 3
-                    ? '已批改'
-                    : c.type == 1 && c.testCount == 1
-                    ? '已保存'
-                    : '已完成'
-                  : '未完成'
-              }}</span>
-            </div>
-          </div>
-          <div class="cTime">创建时间:{{ c.time.split(' ')[0] }}</div>
-        </div>
+        <div><span style="color: #aaadb1">题目数量:</span>{{ getNum(c.chapters) }}</div>
+        <div><span style="color: #aaadb1">创建时间:</span>{{ c.time.split(' ')[0] }}</div>
       </div>
       <div class="cRight">
-        <div class="ctmNumber">{{ getNum(c.chapters) }}</div>
-        <div class="ctmNum">题目数量</div>
+        <div class="ctmNumber">{{ getScore(c.array) }}分</div>
+        <div class="ctmNum">综合评分</div>
+      </div>
+    </div>
+    <div class="bottom">
+      <div class="cBLeft">
+        <div>
+          已提交<span style="color: #3f86fc; padding: 0 5px">{{ c.array.length }}</span
+          >份
+        </div>
+        <div :class="c.isOpen ? 'all' : 'isAll'" @click="isClick">
+          <img src="../../../assets/images/testStudent/all.png" alt="" />
+        </div>
+      </div>
+      <div class="cBRight">
+        <div class="editIcon" @click="goTo(c.courseId)">
+          <img src="../../../assets/images/testStudent/edit.png" alt="" />
+        </div>
+        <div>编辑</div>
+      </div>
+    </div>
+    <div :class="c.isOpen ? 'cWorksBox' : 'iscWorksBox'" v-if="c.array.length > 0">
+      <div v-for="(item, index) in c.array" :key="index" class="cWorksItem" @click="checkTest(item.courseid, item.id)">
+        <div class="cWItemLeft">
+          <div>{{ item.name }}</div>
+          <div>{{ item.createTime }}</div>
+        </div>
+        <div class="cWItemRight">
+          <div @click.stop="doTest(item.courseid, item.id)" v-if="c.userid == userinfo.userid">修改</div>
+          <div @click.stop="deleteTest(item.id)" v-if="c.userid == userinfo.userid">删除</div>
+        </div>
       </div>
     </div>
   </div>
 </template>
 
 <script>
+import { deleteTestCourseWorks } from '@/api/testDetail'
+import { mapGetters } from 'vuex'
+// import { showConfirmDialog } from 'vant'
 export default {
   props: {
     c: {
@@ -45,6 +69,7 @@ export default {
     }
   },
   computed: {
+    ...mapGetters(['userinfo']),
     getNum() {
       return function (array) {
         let _array = JSON.parse(array)
@@ -68,12 +93,85 @@ export default {
         })
         return num
       }
+    },
+    getScore() {
+      return function (array) {
+        // let _array = JSON.parse(array)
+        let _score = 0
+        let scoreArray = []
+        for (var i = 0; i < array.length; i++) {
+          let _array = JSON.parse(array[i].courseJson)
+          let score = 0
+          for (var j = 0; j < _array.length; j++) {
+            let el = _array[j]
+            if ((el.ttype == 3 || el.ttype == 2) && el.array.length > 0) {
+              for (var k = 0; k < el.array.length; k++) {
+                let item = el.array[k]
+                if (item.ttype == 2 && item.array.length > 0) {
+                  for (var z = 0; z < item.array.length; z++) {
+                    let item2 = item.array[z]
+                    if (item2.ttype == 1 && item2.json && item2.json.score2) {
+                      score += parseInt(item2.json.score2)
+                    }
+                  }
+                } else if (item.ttype == 1 && item.json && item.json.score2) {
+                  score += parseInt(item.json.score2)
+                }
+              }
+            } else if (el.ttype == 1 && el.json && el.json.score2) {
+              score += parseInt(el.json.score2)
+            }
+          }
+          scoreArray.push(score)
+        }
+        scoreArray.forEach(el => {
+          _score += el
+        })
+        console.log(scoreArray)
+        return _score ? _score / scoreArray.length : 0
+      }
     }
   },
   methods: {
     goTo(cid) {
       // eslint-disable-next-line prettier/prettier
       this.$router.push({ path: '/testDetail', query: { courseid: cid } })
+    },
+    doTest(cid, tid) {
+      this.$router.push({ path: '/preview', query: { courseid: cid, tid: tid } })
+    },
+    checkTest(cid, tid) {
+      this.$router.push({ path: '/check', query: { courseid: cid, tid: tid } })
+    },
+    isClick() {
+      this.c.isOpen = !this.c.isOpen
+    },
+    deleteTest(tid) {
+      this.$dialog
+        .confirm({
+          title: '删除提示',
+          message: '确定删除此提交的评测么?',
+          confirmButtonText: '确认', //改变确认按钮上显示的文字
+          cancelButtonText: '取消' //改变取消按钮上显示的文字
+        })
+        .then(() => {
+          const params = [
+            {
+              tid: tid
+            }
+          ]
+          deleteTestCourseWorks(params)
+            .then(res => {
+              this.$message.success('删除成功')
+              this.$emit('getCourse');
+            })
+            .catch(err => {
+              console.error(err)
+            })
+        })
+        .catch(() => {
+          console.log('点击了取消按钮噢')
+        })
     }
   }
 }
@@ -81,91 +179,192 @@ export default {
 
 <style lang="scss" scoped>
 .cDetail {
-  display: flex;
-  flex-direction: row;
-  flex-wrap: nowrap;
-  align-items: center;
-  width: 100%;
-  height: 100%;
-  .cLeft {
+  .cTop {
     display: flex;
-    flex-direction: column;
+    flex-direction: row;
     flex-wrap: nowrap;
-    justify-content: center;
-    align-items: flex-start;
-    width: 75%;
-    height: 100%;
-    border-right: 1px solid #e6e6e6;
+    align-items: baseline;
+    width: 100%;
+    .test_type {
+      font-size: 12px;
+      border-radius: 5px;
+      border: 1.5px solid;
+      padding: 3px 8px;
+      width: 45px;
+      text-align: center;
+      margin-right: 10px;
+    }
+    .is {
+      color: rgb(57, 204, 127);
+      background-color: rgba(57, 204, 127, 0.1);
+    }
+    .no {
+      color: rgb(240, 66, 66);
+      background-color: rgba(240, 66, 66, 0.1);
+    }
+    .isR {
+      color: rgb(0, 98, 255);
+      background-color: rgba(0, 98, 255, 0.1);
+    }
+    .isS {
+      color: rgb(255, 173, 31);
+      background-color: rgba(255, 173, 31, 0.1);
+    }
     .ctitle {
       font-size: 16px;
       font-weight: bold;
       padding: 10px 0 20px 0;
-      max-width: 200px;
+      max-width: calc(100% - 90px);
       white-space: nowrap;
       overflow: hidden;
       text-overflow: ellipsis;
       word-break: break-word;
     }
-    .cBottom {
+  }
+  .cMiddle {
+    display: flex;
+    flex-direction: row;
+    flex-wrap: nowrap;
+    align-items: center;
+    width: calc(100% - 20px);
+    background: #f3f7fd;
+    border-radius: 5px;
+    padding: 15px 10px;
+    justify-content: space-between;
+    .cLeft {
+      display: flex;
+      flex-direction: column;
+      flex-wrap: nowrap;
+      align-items: flex-start;
+      font-size: 14px;
+      > div:first-child {
+        padding: 0 0 10px 0;
+      }
+    }
+    .cRight {
       display: flex;
-      flex-direction: row;
+      flex-direction: column;
       flex-wrap: nowrap;
+      justify-content: center;
       align-items: center;
-      .test_btn {
-        display: flex;
-        align-items: center;
-        justify-content: space-between;
-        .test_o_btn {
-          display: flex;
-          align-items: center;
-        }
-        .test_type {
-          font-size: 12px;
-          border-radius: 5px;
-          border: 1.5px solid;
-          padding: 3px 8px;
-        }
-        .is {
-          color: rgb(57, 204, 127);
-          background-color: rgba(57, 204, 127, 0.1);
-        }
-        .no {
-          color: rgb(240, 66, 66);
-          background-color: rgba(240, 66, 66, 0.1);
-        }
-        .isR {
-          color: rgb(0, 98, 255);
-          background-color: rgba(0, 98, 255, 0.1);
-        }
-        .isS {
-          color: rgb(255, 173, 31);
-          background-color: rgba(255, 173, 31, 0.1);
-        }
+      border-left: 1px solid #dedfdf;
+      padding-left: 15px;
+      box-sizing: border-box;
+      .ctmNumber {
+        font-size: 16px;
+        color: #3681fc;
+        font-weight: bold;
+        padding: 0 0 5px 0;
       }
-      .cTime {
-        color: #999;
+      .ctmNum {
         font-size: 14px;
-        margin-left: 10px;
+        color: #999;
       }
     }
   }
-  .cRight {
-    width: 25%;
-    height: 100%;
+  .bottom {
     display: flex;
-    flex-direction: column;
+    flex-direction: row;
     flex-wrap: nowrap;
-    justify-content: center;
     align-items: center;
-    .ctmNumber {
-      font-size: 16px;
-      color: #3681fc;
-      font-weight: bold;
-      padding: 0 0 10px 0;
-    }
-    .ctmNum {
+    justify-content: space-between;
+    padding: 5px 0;
+    .cBLeft {
+      display: flex;
+      flex-direction: row;
+      flex-wrap: nowrap;
+      align-items: center;
+      padding: 10px 0;
       font-size: 14px;
-      color: #999;
+      .isAll {
+        transform: rotate(180deg);
+      }
+      .all,
+      .isAll {
+        width: 15px;
+        height: 15px;
+        margin-left: 5px;
+        cursor: pointer;
+        transition: all 0.5s;
+        > img {
+          width: 100%;
+          height: 100%;
+        }
+      }
+    }
+    .cBRight {
+      display: flex;
+      flex-direction: row;
+      flex-wrap: nowrap;
+      align-items: center;
+      background: #3681fc;
+      color: #fff;
+      width: 70px;
+      height: 30px;
+      text-align: center;
+      line-height: 30px;
+      border-radius: 15px;
+      justify-content: center;
+      cursor: pointer;
+      padding: 1px;
+      .editIcon {
+        width: 20px;
+        height: 20px;
+        margin-right: 5px;
+        > img {
+          width: 100%;
+          height: 100%;
+        }
+      }
+    }
+  }
+  .iscWorksBox {
+    display: none !important;
+    border: none !important;
+  }
+  .cWorksBox,
+  .iscWorksBox {
+    padding: 10px 0;
+    box-sizing: border-box;
+    display: flex;
+    flex-direction: column;
+    flex-wrap: nowrap;
+    align-items: flex-start;
+    width: 100%;
+    border-top: 0.02667rem solid #e3e3e3;
+    .cWorksItem {
+      display: flex;
+      flex-direction: row;
+      flex-wrap: nowrap;
+      justify-content: space-between;
+      align-items: flex-start;
+      padding: 0 0 20px 0;
+      font-size: 15px;
+      width: 100%;
+      .cWItemLeft {
+        display: flex;
+        flex-direction: column;
+        flex-wrap: nowrap;
+        align-items: flex-start;
+        > div:first-child {
+          font-weight: bold;
+          padding: 0 0 10px 0;
+        }
+        > div:last-child {
+          color: #c0c0c0;
+          font-size: 13px;
+        }
+      }
+      .cWItemRight {
+        display: flex;
+        flex-direction: row;
+        flex-wrap: nowrap;
+        align-items: center;
+        > div:last-child {
+          color: #c0c0c0;
+          padding-left: 15px;
+        }
+      }
     }
   }
 }

+ 50 - 22
src/views/test/index.vue

@@ -4,14 +4,14 @@
       <template #title>
         <div style="width: 90%">
           <div class="rightSearch">
-            <div class="searchImg" @click="search(groupA,typeCheck)">
+            <div class="searchImg" @click="search(groupA, typeCheck)">
               <img src="../../assets/images/home/search.png" alt="" />
             </div>
             <el-input
               v-model="courseName"
               auto-complete="off"
               placeholder="请输入项目名称..."
-              @input="search(groupA,typeCheck)"
+              @input="search(groupA, typeCheck)"
             ></el-input>
           </div>
         </div>
@@ -22,7 +22,7 @@
       <van-pull-refresh v-model="isLoading" @refresh="onRefresh" class="rheight">
         <van-list v-model="loading" :finished="finished" finished-text="没有更多了" @load="onLoad" class="vheight">
           <van-empty description="暂无问卷" v-if="!zoneClass.length" />
-          <course-item v-for="(c, cIndex) in zoneClass" :key="cIndex" class="courseItem" :c="c"></course-item>
+          <course-item v-for="(c, cIndex) in zoneClass" :key="cIndex" class="courseItem" :c="c" @getCourse="onRefresh"></course-item>
         </van-list>
       </van-pull-refresh>
     </div>
@@ -31,6 +31,7 @@
 
 <script>
 import { selectTesttCourseCenter } from '@/api/testStudent'
+import { selectTesttCourseCenter1 } from '@/api/testStudent'
 import headBar from '@/components/headBar.vue'
 import { mapGetters } from 'vuex'
 import typeFilter from './components/typeFilter.vue'
@@ -40,7 +41,7 @@ export default {
   components: {
     headBar,
     typeFilter,
-    courseItem,
+    courseItem
   },
   data() {
     return {
@@ -58,11 +59,11 @@ export default {
     ...mapGetters(['userinfo'])
   },
   methods: {
-    search(g,t) {
-      this.page = 1;
-      this.groupA = g;
-      this.typeCheck = t;
-      this.getCourse(true);
+    search(g, t) {
+      this.page = 1
+      this.groupA = g
+      this.typeCheck = t
+      this.getCourse(true)
     },
     onRefresh() {
       this.page = 1
@@ -73,32 +74,60 @@ export default {
       this.page++
       this.getCourse()
     },
-    async getCourse(isRefresh){
-      var typeE = [];
+    async getCourse(isRefresh) {
+      var typeE = []
       const params = {
         type: this.groupA,
         uid: this.userinfo.userid,
         oid: this.userinfo.organizeid,
         org: this.userinfo.org,
-        typea: "",
-        typeb: "",
-        typec: "",
-        typed: "",
+        typea: '',
+        typeb: '',
+        typec: '',
+        typed: '',
         typef: this.typeCheck,
-        typeE: typeE.join(","),
-        cu: "",
+        typeE: typeE.join(','),
+        cu: '',
         cn: this.courseName,
         page: this.page,
-        pageSize: 10,
+        pageSize: 10
       }
-      const res = await selectTesttCourseCenter(params)
+      const res = await selectTesttCourseCenter1(params)
       if (isRefresh) {
         this.isLoading = false
         // 下拉刷新
+        res[0].forEach(el => {
+          el.array = [];
+          el.isOpen = "";
+          el.isOpen = false;
+          let count = 0;
+          res[1].forEach((el2) => {
+            if (el.courseId == el2.courseid) {
+              el2.name = ''
+              count++;
+              el2.name = el.title + "测评试卷" + count
+              el.array.push(el2)
+            }
+          })
+        })
         this.zoneClass = res[0]
       } else {
         this.loading = false
         // 上拉加载
+        res[0].forEach(el => {
+          el.array = [];
+          el.isOpen = "";
+          el.isOpen = false;
+          let count = 0;
+          res[1].forEach((el2) => {
+            if (el.courseId == el2.courseid) {
+              el2.name = ''
+              count++;
+              el2.name = el.title + "测评试卷" + count
+              el.array.push(el2)
+            }
+          })
+        })
         this.zoneClass = [...this.zoneClass, ...res[0]]
       }
       this.$emit('update:list', this.zoneClass)
@@ -108,11 +137,10 @@ export default {
       } else {
         this.finished = false
       }
-    },
-    
+    }
   },
   mounted() {
-    this.getCourse();
+    this.getCourse()
   }
 }
 </script>

+ 119 - 0
src/views/testDetail/check.vue

@@ -0,0 +1,119 @@
+<template>
+  <div class="home-container">
+    <head-bar @back="back">
+      <template #title>
+        <div class="navTitle">查看问卷</div>
+      </template>
+    </head-bar>
+    <div class="step_box">
+      <topicVue :cJson="cJson" :title="title" :brief="brief" :checktype="2" :see="see"></topicVue>
+      <!-- <topicVue :cJson="cJson" :title="title" :brief="brief" ref="topicVue"></topicVue> -->
+    </div>
+    <div class="edit_top">
+      <div class="op_btn">
+        <el-button type="primary" size="small" @click="publish">提交</el-button>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import { selectTestCourseWorks } from '@/api/testDetail'
+import { addTestWorks } from '@/api/testDetail'
+import headBar from '@/components/headBar.vue'
+import { mapGetters } from 'vuex'
+import topicVue from './components/topic.vue'
+export default {
+  components: {
+    headBar,
+    topicVue
+  },
+  data() {
+    return {
+      courseid: this.$route.query.courseid,
+      tid: this.$route.query.tid,
+      title: '',
+      brief: '',
+      cJson: [],
+      see: false,
+    }
+  },
+  computed: {
+    ...mapGetters(['userinfo'])
+  },
+  methods: {
+    back() {
+      this.$router.push({ path: '/test' })
+    },
+    getData() {
+      const params = {
+        cid: this.courseid,
+        tid: this.tid
+      }
+      selectTestCourseWorks(params)
+        .then(res => {
+          if (res[1].length) {
+            this.cJson = JSON.parse(res[1][0].courseJson)
+          }
+          this.title = res[0][0].title
+          this.brief = res[0][0].brief
+          this.see = res[0][0].open == 1 ? true : false;
+          this.$forceUpdate()
+        })
+        .catch(err => {
+          console.error(err)
+        })
+    },
+    publish() {
+      let cjson = this.$refs['topicVue'].checkArray
+      const params = [
+        {
+          uid: this.userinfo.userid,
+          cid: this.courseid,
+          cjson: JSON.stringify(cjson),
+          type: 2
+        }
+      ]
+      addTestWorks(params)
+        .then(res => {
+          this.$message.success('提交成功')
+          this.back()
+        })
+        .catch(err => {
+          console.error(err)
+        })
+    }
+  },
+  mounted() {
+    this.getData()
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.navTitle {
+  font-size: 16px;
+  color: #fff;
+}
+.home-container {
+  height: 100vh;
+  overflow: hidden;
+  .step_box {
+    margin-top: 1.5rem;
+    width: 100%;
+    height: calc(100vh - 1.5rem - 50px);
+    overflow: auto;
+    position: relative;
+  }
+  .edit_top {
+    width: 100%;
+    margin: 0 auto;
+    /deep/.el-button {
+      width: 100%;
+      height: 50px;
+      text-align: center;
+      font-size: 16px;
+    }
+  }
+}
+</style>

+ 116 - 0
src/views/testDetail/preview.vue

@@ -0,0 +1,116 @@
+<template>
+  <div class="home-container">
+    <head-bar @back="back">
+      <template #title>
+        <div class="navTitle">修改问卷</div>
+      </template>
+    </head-bar>
+    <div class="step_box">
+      <topicVue :cJson="cJson" :title="title" :brief="brief" ref="topicVue"></topicVue>
+    </div>
+    <div class="edit_top">
+      <div class="op_btn">
+        <el-button type="primary" size="small" @click="publish">提交</el-button>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import { selectTestCourseWorks } from '@/api/testDetail'
+import { addTestWorks } from '@/api/testDetail'
+import headBar from '@/components/headBar.vue'
+import { mapGetters } from 'vuex'
+import topicVue from './components/topic.vue'
+export default {
+  components: {
+    headBar,
+    topicVue
+  },
+  data() {
+    return {
+      courseid: this.$route.query.courseid,
+      tid: this.$route.query.tid,
+      title: '',
+      brief: '',
+      cJson: []
+    }
+  },
+  computed: {
+    ...mapGetters(['userinfo'])
+  },
+  methods: {
+    back() {
+      this.$router.push({ path: '/test' })
+    },
+    getData() {
+      const params = {
+        cid: this.courseid,
+        tid: this.tid
+      }
+      selectTestCourseWorks(params)
+        .then(res => {
+          if (res[1].length) {
+            this.cJson = JSON.parse(res[1][0].courseJson)
+          }
+          this.title = res[0][0].title
+          this.brief = res[0][0].brief
+          this.$forceUpdate()
+        })
+        .catch(err => {
+          console.error(err)
+        })
+    },
+    publish() {
+      let cjson = this.$refs['topicVue'].checkArray
+      const params = [
+        {
+          uid: this.userinfo.userid,
+          cid: this.courseid,
+          cjson: JSON.stringify(cjson),
+          type: 2
+        }
+      ]
+      addTestWorks(params)
+        .then(res => {
+          this.$message.success('提交成功')
+          this.back()
+        })
+        .catch(err => {
+          console.error(err)
+        })
+    }
+  },
+  mounted() {
+    this.getData()
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.navTitle {
+  font-size: 16px;
+  color: #fff;
+}
+.home-container {
+  height: 100vh;
+  overflow: hidden;
+  .step_box {
+    margin-top: 1.5rem;
+    width: 100%;
+    height: calc(100vh - 1.5rem - 50px);
+    overflow: auto;
+    position: relative;
+  }
+  .edit_top {
+    width: 100%;
+    margin: 0 auto;
+    /deep/.el-button {
+      width: 100%;
+      height: 50px;
+      text-align: center;
+      font-size: 16px;
+    }
+  }
+}
+</style>

이 변경점에서 너무 많은 파일들이 변경되어 몇몇 파일들은 표시되지 않았습니다.