@@ -25,4 +25,4 @@
height: 100%;
width: 100%;
background: #e6eaf0;
- }</style><link href=./static/css/app.7f170b8bdacc93362c1983e09f2aa021.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=./static/js/manifest.85f48b0184f614b2b8d9.js></script><script type=text/javascript src=./static/js/vendor.e8eb4c1cc481dbb543fc.js></script><script type=text/javascript src=./static/js/app.b23b230fd8df39928a41.js></script></body></html><script>document.domain = document.domain.split(".").slice(-2).join(".");</script>
+ }</style><link href=./static/css/app.ffa842f1e85cc2655aefa1654bb013f7.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.e8eb4c1cc481dbb543fc.js></script><script type=text/javascript src=./static/js/app.3f451a4734fd3ff98b50.js></script></body></html><script>document.domain = document.domain.split(".").slice(-2).join(".");</script>
@@ -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
@@ -1,2 +0,0 @@
-!function(e){var n=window.webpackJsonp;window.webpackJsonp=function(r,c,a){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 c)Object.prototype.hasOwnProperty.call(c,i)&&(e[i]=c[i]);for(n&&n(r,c,a);l.length;)l.shift()();if(a)for(s=0;s<a.length;s++)f=o(o.s=a[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 c=document.getElementsByTagName("head")[0],a=document.createElement("script");a.type="text/javascript",a.charset="utf-8",a.async=!0,a.timeout=12e4,o.nc&&a.setAttribute("nonce",o.nc),a.src=o.p+"static/js/"+e+"."+{0:"86cbf9c691e3dc53b304",1:"994623639438b244a74c"}[e]+".js";var i=setTimeout(u,12e4);function u(){a.onerror=a.onload=null,clearTimeout(i);var n=t[e];0!==n&&(n&&n[1](new Error("Loading chunk "+e+" failed.")),t[e]=void 0)}return a.onerror=a.onload=u,c.appendChild(a),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.85f48b0184f614b2b8d9.js.map
@@ -7,6 +7,7 @@
$route.path == '/note' ||
$route.path == '/works',
appNoHeight: $route.path == '/liveRoom',
+ GMBg:this.$route.query.org=='eb2af5e9-ac3d-46b6-9fe3-3c1c364f0217' && ( $route.path != '/courseGM' && $route.path != '/course/addCourseGM'&& $route.path != '/dataGM')
}"
>
<!-- <div class="app_head" :class="{stuWidth:$route.path == '/student'}"> -->
@@ -71,13 +72,17 @@ export default {
navTabs: [
"/class",
"/course",
+ "/courseGM",
"/data",
+ "/dataGM",
"/notice",
"/student",
"/works",
+ "/worksGM",
"/worksDetail",
"/course/courseDetail",
"/library",
+ "/libraryGM",
"/classRoom",
"/liveRoom",
"/addPPt",
@@ -86,9 +91,9 @@ export default {
"/wordList",
"/Ttype",
"/banner",
- "eventCenter",
- "addRace",
- "anliDetail",
+ // "/eventCenter",
+ // "/addRace",
+ // "/anliDetail",
// "/course/addCourse",
// "/ask",
// "/ask/askList",
@@ -361,4 +366,25 @@ html::-webkit-scrollbar-thumb {
-webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.3);
background-color: rgba(0, 0, 0, 0.1);
}
+
+.btnClassGM {
+ background: #8681b7 !important;
+ border-color: #8681b7 !important;
+}
+.btnClassGM:focus, .btnClassGM:hover{
+.GMBg{
+ background: rgb(184, 181, 202) !important;
+.cancelbtnGM:focus,
+.cancelbtnGM:hover {
+ color: rgb(92, 84, 159) !important;
+ border-color: #5c549f !important;
+ background-color: #dbd7ff !important;
</style>
@@ -0,0 +1,682 @@
+<template>
+ <div class="cd_body" style="overflow: auto">
+ <div
+ class="pb_content_body"
+ style="
+ background: #fff;
+ padding: 0px 25px;
+ box-sizing: border-box;
+ width: 95%;
+ margin: 10px auto 0;
+ "
+ >
+ <div class="pb_head">
+ <img
+ src="../../assets/case.png"
+ style="margin-right: 10px; width: 45px;"
+ alt=""
+ />
+ <span>项目数据看板</span>
+ </div>
+ <div class="student_head">
+ <div class="head_left">
+ <span>筛选:</span>
+ <el-select v-model="choose" @change="getData">
+ <el-option label="默认排序" value=""> </el-option>
+ <el-option label="学校名称" value="school"> </el-option>
+ <el-option label="任务数量" value="task"> </el-option>
+ <el-option label="评价" value="eval"> </el-option>
+ <el-option label="工具" value="tool"> </el-option>
+ <el-option label="字数" value="font"> </el-option>
+ </el-select>
+ <el-input
+ v-model="search"
+ class="student_input"
+ placeholder="请输入教师名称或学校名称"
+ @input="getData"
+ ></el-input>
+ <div class="cd_table">
+ <el-table
+ ref="table"
+ :data="tableData"
+ border
+ :fit="true"
+ v-loading="isLoading"
+ style="width: 100%"
+ :header-cell-style="{ background: '#f1f1f1', fontSize: '17px' }"
+ :row-class-name="tableRowClassName"
+ class="table"
+ <el-table-column label="课程" min-width="15" align="center">
+ <template slot-scope="scope">
+ <div style="max-height: 180px; overflow: auto">
+ v-for="(item, index) in scope.row.course"
+ :key="index"
+ class="cd_course"
+ @click="jump(item.courseId)"
+ <el-tooltip :content="item.title">
+ <span>{{ item.title }}</span>
+ </el-tooltip>
+ </template>
+ </el-table-column>
+ <el-table-column
+ label="学校"
+ prop="school"
+ min-width="15"
+ align="center"
+ label="负责人"
+ prop="username"
+ label="更新时间"
+ prop="time"
+ <el-table-column label="总计" min-width="15" align="center">
+ <div class="cd_d_span">
+ <div>
+ <span>{{ scope.row.jdz.taskC }}</span
+ ><span>任务</span>
+ <span>{{ scope.row.jdz.toolC }}</span
+ ><span>工具</span>
+ <span>{{ scope.row.jdz.evalC }}</span
+ ><span>评价</span>
+ <span>{{ scope.row.jdz.fontC }}</span
+ ><span>字</span>
+ <el-table-column label="阶段1" min-width="15" align="center">
+ <div v-if="scope.row.jd1">
+ <span>{{ scope.row.jd1.taskC }}</span
+ <span>{{ scope.row.jd1.toolC }}</span
+ <span>{{ scope.row.jd1.evalC }}</span
+ <span>{{ scope.row.jd1.fontC }}</span
+ <div v-else>—</div>
+ <el-table-column label="阶段2" min-width="15" align="center">
+ <div v-if="scope.row.jd2">
+ <span>{{ scope.row.jd2.taskC }}</span
+ <span>{{ scope.row.jd2.toolC }}</span
+ <span>{{ scope.row.jd2.evalC }}</span
+ <span>{{ scope.row.jd2.fontC }}</span
+ <el-table-column label="阶段3" min-width="15" align="center">
+ <div v-if="scope.row.jd3">
+ <span>{{ scope.row.jd3.taskC }}</span
+ <span>{{ scope.row.jd3.toolC }}</span
+ <span>{{ scope.row.jd3.evalC }}</span
+ <span>{{ scope.row.jd3.fontC }}</span
+ <el-table-column label="阶段4" min-width="15" align="center">
+ <div v-if="scope.row.jd4">
+ <span>{{ scope.row.jd4.taskC }}</span
+ <span>{{ scope.row.jd4.toolC }}</span
+ <span>{{ scope.row.jd4.evalC }}</span
+ <span>{{ scope.row.jd4.fontC }}</span
+ <el-table-column label="阶段5" min-width="15" align="center">
+ <div v-if="scope.row.jd5">
+ <span>{{ scope.row.jd5.taskC }}</span
+ <span>{{ scope.row.jd5.toolC }}</span
+ <span>{{ scope.row.jd5.evalC }}</span
+ <span>{{ scope.row.jd5.fontC }}</span
+ <el-table-column label="阶段6" min-width="15" align="center">
+ <div v-if="scope.row.jd6">
+ <span>{{ scope.row.jd6.taskC }}</span
+ <span>{{ scope.row.jd6.toolC }}</span
+ <span>{{ scope.row.jd6.evalC }}</span
+ <span>{{ scope.row.jd6.fontC }}</span
+ <el-table-column label="操作" min-width="15">
+ <!-- <div
+ @click="getAll(scope.row)"
+ 查看全部
+ </div> -->
+ <el-button
+ type="primary"
+ size="small"
+ style="background: rgb(147, 125, 223); border: none"
+ >查看详情</el-button
+ </el-table>
+ <el-dialog
+ title="查看"
+ :visible.sync="dialogVisible"
+ :append-to-body="true"
+ width="620px"
+ :before-close="handleClose"
+ class="dialog_diy"
+ <div v-if="dataArray.length">
+ <div class="cd_d_jd2">
+ <div class="cd_d_box">
+ <span>教师:</span><span>{{ data.username }}</span>
+ <span>学校:</span><span>{{ data.school }}</span>
+ <div class="cd_d_jd">
+ v-for="(item, index) in dataArray"
+ class="cd_d_jd_box"
+ <div class="cd_d_jd_name">{{ "阶段" + (index + 1) }}</div>
+ <div class="cd_d_jd_content cd_d_span">
+ <span>{{ data[item].taskC }}</span
+ <span>{{ data[item].toolC }}</span
+ <span>{{ data[item].evalC }}</span
+ <span>{{ data[item].fontC }}</span
+ <div class="cd_d_jd_box">
+ <div class="cd_d_jd_name">总计</div>
+ <div class="cd_d_jd_content cd_d_span" style="background: #d4d4d4">
+ <span>{{ data["jdz"].taskC }}</span
+ <span>{{ data["jdz"].toolC }}</span
+ <span>{{ data["jdz"].evalC }}</span
+ <span>{{ data["jdz"].fontC }}</span
+ <span slot="footer" class="dialog-footer">
+ <el-button @click="dialogVisible = false" class="cancelbtnGM"
+ >关闭</el-button
+ </span>
+ </el-dialog>
+</template>
+<script>
+export default {
+ data() {
+ return {
+ tableData: [],
+ isLoading: false,
+ org: this.$route.query.org,
+ timer: null,
+ dialogVisible: false,
+ data: {},
+ dataArray: [],
+ choose: "",
+ search: "",
+ };
+ },
+ methods: {
+ jump(cid) {
+ window.parent.postMessage({ cid: cid, screenType: "3gm" }, "*");
+ handleClose(done) {
+ done();
+ tableRowClassName({ row, rowIndex }) {
+ if ((rowIndex + 1) % 2 === 0) {
+ return "even_row";
+ } else {
+ return "";
+ }
+ getData() {
+ let params = {
+ org: this.org,
+ // this.org
+ this.ajax
+ .get(this.$store.state.api + "selectCase", params)
+ .then((res) => {
+ this.isLoading = false;
+ let _res = res.data[0];
+ let _res2 = res.data[1];
+ for (var i = 0; i < _res.length; i++) {
+ let taskC = 0;
+ let toolC = 0;
+ let evalC = 0;
+ let fontC = 0;
+ let course = [];
+ for (var j = 0; j < _res2.length; j++) {
+ if (_res[i].userid == _res2[j].userid) {
+ course.push({
+ title: _res2[j].title,
+ courseId: _res2[j].courseId,
+ });
+ var _chapter = JSON.parse(_res2[j].chapters);
+ for (var k = 0; k < _chapter.length; k++) {
+ let taskC2 = 0;
+ let toolC2 = 0;
+ let evalC2 = 0;
+ let fontC2 = 0;
+ fontC2 += _chapter[k].dyName.length;
+ taskC2 = _chapter[k].chapterInfo[0].taskJson.length;
+ let _tasks = _chapter[k].chapterInfo[0].taskJson;
+ for (var task = 0; task < _tasks.length; task++) {
+ if (_tasks[task].eList) {
+ evalC2 += _tasks[task].eList.length;
+ if (_tasks[task].toolChoose[0].tool.length > 0) {
+ toolC2 += _tasks[task].toolChoose.length;
+ fontC2 += _tasks[task].task.length;
+ fontC2 += _tasks[task].taskDetail
+ .replace(/<[^<>]+>/g, "")
+ .replace(/ /gi, "").length;
+ let _tools = _tasks[task].toolChoose;
+ for (var tool = 0; tool < _tools.length; tool++) {
+ fontC2 += _tools[tool].toolDetail.length;
+ if (_res[i]["jd" + (k + 1)]) {
+ _res[i]["jd" + (k + 1)].taskC += taskC2;
+ _res[i]["jd" + (k + 1)].toolC += toolC2;
+ _res[i]["jd" + (k + 1)].evalC += evalC2;
+ _res[i]["jd" + (k + 1)].fontC += fontC2;
+ _res[i]["jd" + (k + 1)] = {};
+ _res[i]["jd" + (k + 1)].taskC = taskC2;
+ _res[i]["jd" + (k + 1)].toolC = toolC2;
+ _res[i]["jd" + (k + 1)].evalC = evalC2;
+ _res[i]["jd" + (k + 1)].fontC = fontC2;
+ taskC += taskC2;
+ toolC += toolC2;
+ evalC += evalC2;
+ fontC += fontC2;
+ _res[i]["jdz"] = {};
+ _res[i]["jdz"].taskC = taskC;
+ _res[i]["jdz"].toolC = toolC;
+ _res[i]["jdz"].evalC = evalC;
+ _res[i]["jdz"].fontC = fontC;
+ _res[i].course = course;
+ if (this.search) {
+ _res = _res.filter((a) => {
+ return (
+ a.school.indexOf(this.search) != -1 ||
+ a.username.indexOf(this.search) != -1
+ );
+ if (this.choose == "school") {
+ let array = _res.sort(function (a, b) {
+ return a.school.localeCompare(b.school);
+ this.tableData = array;
+ } else if (this.choose == "task") {
+ // return a.jdz.taskC - b.jdz.taskC;
+ return b.jdz.taskC - a.jdz.taskC;
+ } else if (this.choose == "font") {
+ // return a.jdz.fontC - b.jdz.fontC;
+ return b.jdz.fontC - a.jdz.fontC;
+ } else if (this.choose == "eval") {
+ return b.jdz.evalC - a.jdz.evalC;
+ } else if (this.choose == "tool") {
+ return b.jdz.toolC - a.jdz.toolC;
+ this.tableData = _res;
+ })
+ .catch((err) => {
+ console.error(err);
+ getAll(res) {
+ this.data = res;
+ let a = Object.keys(res);
+ a = a.filter((el) => {
+ return el.indexOf("jd") != -1 && el != "jdz";
+ this.dataArray = a;
+ this.dialogVisible = true;
+ beforeDestroy() {
+ clearInterval(this.timer);
+ this.timer = null;
+ mounted() {
+ this.isLoading = true;
+ this.getData();
+ this.timer = setInterval(() => {
+ }, 5000);
+};
+</script>
+<style scoped>
+.student_input {
+ width: 190px;
+ font-size: 13px;
+ padding: 0 10px;
+.cd_body {
+ height: 100%;
+ width: 100%;
+.pb_head {
+ margin: 0 !important;
+ width: 100% !important;
+ display: flex;
+ align-items: center;
+.student_head {
+ margin-top: 10px;
+ padding-bottom: 10px;
+ justify-content: space-between;
+.head_left {
+.cd_title span {
+ font-size: 25px;
+ font-weight: 700;
+.cd_table {
+ margin: 0 auto;
+ padding: 0 0 10px;
+.el-table >>> .even_row {
+ background-color: #f1f1f1 !important;
+.dialog_diy >>> .el-dialog {
+ background: #fafafa;
+.dialog_diy >>> .el-dialog__header {
+ background: #454545 !important;
+ padding: 15px 20px;
+.dialog_diy >>> .el-dialog__body,
+.dialog_diy >>> .el-dialog__footer {
+ background: rgb(184, 181, 202);
+.dialog_diy >>> .el-dialog__body {
+ padding: 30px 10px;
+.dialog_diy >>> .el-dialog__title {
+ color: #fff;
+.dialog_diy >>> .el-dialog__headerbtn {
+ top: 19px;
+.dialog_diy >>> .el-dialog__headerbtn .el-dialog__close {
+.dialog_diy >>> .el-dialog__headerbtn .el-dialog__close:hover {
+.cd_d_box {
+ font-size: 16px;
+.cd_d_box + .cd_d_box {
+.cd_d_jd {
+ flex-wrap: wrap;
+ padding: 10px 15px 25px;
+.cd_d_jd2 {
+ padding: 10px 15px;
+.cd_d_jd_box {
+ width: 100px;
+ flex-direction: column;
+ /* background: #eee; */
+ border-radius: 5px;
+ margin: 10px 14px 0 0;
+.cd_d_jd_content {
+ background: #eee;
+ padding: 5px 0;
+.cd_d_jd_content div + div {
+ margin-top: 5px;
+.cd_d_jd_content div span + span {
+ margin-left: 5px;
+.cd_d_jd_name {
+ margin-bottom: 5px;
+ color: #222;
+.cd_d_span div:nth-child(1) span:nth-child(1) {
+ color: rgb(147, 125, 223);
+.cd_d_span div:nth-child(2) span:nth-child(1) {
+ color: #fe3987;
+.cd_d_span div:nth-child(3) span:nth-child(1) {
+ color: #10bb6e;
+.cd_d_span div:nth-child(4) span:nth-child(1) {
+.cd_d_span div span:nth-child(1) {
+ margin-right: 5px;
+.cd_course {
+ cursor: pointer;
+.cd_course span {
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+.table >>> .cell {
+ padding: 0px 3px !important;
+/* .table >>> .el-table .cell, .table >>> .el-table--border td:first-child .cell, .table >>> .el-table--border th:first-child .cell{
+ padding: 0 3px;
+} */
+</style>
@@ -100,8 +100,18 @@
</div>
<div class="rightBox" v-if="this.steps == 1">
+ class="updateMask"
+ :style="{ height: rightBoxHeight + 'px' }"
+ v-if="cid && userid != courseUserid"
+ ></div>
<div class="whiteBg">
- <div class="right_title">项目基本信息</div>
+ class="right_title"
+ :class="{ updateTips: cid && userid != courseUserid }"
+ 项目基本信息
<div class="basic_box">
<div class="big_box">
<div class="left_first">
@@ -3294,6 +3304,9 @@ export default {
};
},
computed: {
+ rightBoxHeight: function () {
+ return $(".rightBox")[0] ? $(".rightBox")[0].scrollHeight : 100;
offsetLetfPx: function () {
//addnum可以直接在模板语法里面用,相当于data内的值
return (
@@ -4068,6 +4081,7 @@ export default {
_this.unitJson[unitIndex].chapterInfo[0].taskJson[
itemTaskIndex
].proVisible = false;
+ _this.$forceUpdate();
}, 1000);
_this.inputShow = true;
if (err) {
@@ -7605,6 +7619,7 @@ ol {
border-radius: 10px;
overflow: auto;
height: calc(100% - 130px);
+ position: relative;
.e_add_top {
@@ -8107,7 +8122,7 @@ ol {
left: 0;
- z-index: 20000;
+ z-index: 90;
display: flex;
align-items: center;
justify-content: center;
@@ -8152,4 +8167,19 @@ ol {
width: 40px;
margin-right: 20px;
+.updateTips::after {
+ content: "协同编辑课程暂不支持修改基本信息,只支持修改阶段内容。";
+ font-size: 14px;
+ margin-left: 20px;
+ font-weight: 400;
+ color: #ff3a3a;
+.updateMask {
+ z-index: 3;
+ top: 0;
+ position: absolute;
@@ -17,7 +17,7 @@
<el-breadcrumb-item
:to="{
path:
- '/course?userid=' +
+ '/courseGM?userid=' +
userid +
'&oid=' +
oid +
@@ -104,8 +104,19 @@
+ <!-- $(".rightBox").scrollHeight -->
@@ -117,7 +128,7 @@
<div style="display: flex; margin-right: 20px">
<img
- src="../../assets/icon/projectName.png"
+ src="../../assets/icon/projectNameGM.png"
alt
style="margin-right: 8px"
/>
@@ -132,7 +143,7 @@
<div class="both">
<div class="choose">
<div
- class="all_choose"
+ class="all_choose all_choose2"
v-for="(item, index) in CourseType[0]"
:key="index"
@@ -264,7 +275,7 @@
active-color="#5c549f"
v-model="isTeacherSee"
active-text="是否公开此项目"
- style="padding-bottom: 30px;"
+ style="padding-bottom: 30px"
class="s_switch"
></el-switch>
@@ -372,10 +383,10 @@
<span>当前使用目标管理</span>
<span>{{ eTitle }}</span>
- src="../../assets/line.png"
+ src="../../assets/lineGM.png"
class="cru_line"
style="
- width: 125px;
+ width: 110px;
height: 20px;
bottom: -10px;
left: 155px;
@@ -550,7 +561,7 @@
第{{ index + 1 }}阶段
:style="{
left: offsetLetfPx + 'px',
@@ -1973,7 +1984,7 @@
width: 125px;
@@ -2065,10 +2076,7 @@
- <div
- class="rightBox"
- v-if="this.steps == 4"
- >
+ <div class="rightBox" v-if="this.steps == 4">
<div class="basic_box_success">
<div class="right_img">
<img src="../../assets/icon/right.png" alt />
@@ -2143,11 +2151,19 @@
<editor-bar v-model="tdetail" @change="change"></editor-bar>
</el-form>
<span slot="footer" class="dialog-footer">
- <el-button @click="dialogVisible1 = false">取 消</el-button>
- <el-button type="primary" @click="addWord" v-if="!updateBoolean2"
+ <el-button @click="dialogVisible1 = false" class="cancel_button"
+ >取 消</el-button
+ @click="addWord"
+ v-if="!updateBoolean2"
+ class="confirm_button"
>添加</el-button
- <el-button type="primary" @click="upWord" v-else>修 改</el-button>
+ <el-button type="primary" @click="upWord" class="confirm_button" v-else
+ >修 改</el-button
</span>
</el-dialog>
<el-dialog
@@ -2170,8 +2186,10 @@
<editor-bar v-model="cTemplate" @change="change"></editor-bar>
- <el-button @click="clearChoose">取 消</el-button>
- <el-button type="primary" @click="wordNext()">确定</el-button>
+ <el-button @click="clearChoose" class="cancel_button">取 消</el-button>
+ <el-button type="primary" @click="wordNext()" class="confirm_button"
+ >确定</el-button
@@ -2195,8 +2213,13 @@
<editor-bar v-model="AttText.text" @change="change"></editor-bar>
- <el-button @click="clearAttText">取 消</el-button>
- <el-button type="primary" @click="isAddOrUpdateAttText">确定</el-button>
+ <el-button @click="clearAttText" class="cancel_button">取 消</el-button>
+ @click="isAddOrUpdateAttText"
@@ -2220,8 +2243,13 @@
</el-form-item>
- <el-button @click="clearLine">取 消</el-button>
- <el-button type="primary" @click="isAddOrUpdateLine">确定</el-button>
+ <el-button @click="clearLine" class="cancel_button">取 消</el-button>
+ @click="isAddOrUpdateLine"
@@ -2248,7 +2276,10 @@
- <el-checkbox-group v-model="checkboxList" class="people_name">
+ <el-checkbox-group
+ v-model="checkboxList"
+ class="people_name all_choose2"
<el-checkbox
v-for="item in studentJuri"
:key="item.userid"
@@ -2258,8 +2289,12 @@
</el-checkbox-group>
- <el-button @click="dialogVisible3 = false">取 消</el-button>
- <el-button type="primary" @click="isAddPP">确定</el-button>
+ <el-button @click="dialogVisible3 = false" class="cancel_button"
+ <el-button type="primary" @click="isAddPP" class="confirm_button"
@@ -2275,7 +2310,10 @@
<div class="people_top">
<div class="people_nav">选择班级</div>
- <el-checkbox-group v-model="checkboxList2" class="people_name">
+ v-model="checkboxList2"
<div v-for="(item, index) in grade" :key="item.id">
<el-checkbox :label="item.id">
{{ item.name ? item.name : "暂无班级可选" }}
@@ -2287,8 +2325,12 @@
- <el-button @click="dialogVisibleClass = false">取 消</el-button>
- <el-button type="primary" @click="isAddClass">确定</el-button>
+ <el-button @click="dialogVisibleClass = false" class="cancel_button"
+ <el-button type="primary" @click="isAddClass" class="confirm_button"
@@ -2318,7 +2360,7 @@
<el-checkbox-group
v-model="checkboxList3"
- class="people_name"
v-if="teacherJuri.length"
@@ -2332,8 +2374,12 @@
<div style="text-align: center; margin-top: 10px" v-else>暂无数据</div>
- <el-button @click="dialogVisibleMember = false">取 消</el-button>
- <el-button type="primary" @click="isAddPPTeacher">确定</el-button>
+ <el-button @click="dialogVisibleMember = false" class="cancel_button"
+ <el-button type="primary" @click="isAddPPTeacher" class="confirm_button"
@@ -2379,7 +2425,11 @@
</el-input>
<div class="a_add_head_div">
- <el-button type="primary" size="small" @click="addAskList()"
+ @click="addAskList()"
<el-button
@@ -2387,6 +2437,7 @@
size="small"
@click="deleteAskList(index1)"
v-if="askJson.askCount != 1"
>删除</el-button
@@ -2407,6 +2458,7 @@
type="primary"
@click="addcheckList(askJson.askJson[index1])"
@@ -2415,6 +2467,7 @@
style="margin: 10px 0 0 0"
@click="deletecheckList(askJson.askJson[index1])"
v-if="askJson.askJson[index1].askItem != 1"
>删除
</el-button>
@@ -2423,8 +2476,12 @@
- <el-button @click="dialogVisible5 = false">取 消</el-button>
- <el-button type="primary" @click="addAsk">确 定</el-button>
+ <el-button @click="dialogVisible5 = false" class="cancel_button"
+ <el-button type="primary" @click="addAsk" class="confirm_button"
+ >确 定</el-button
@@ -2482,7 +2539,11 @@
- <el-button type="primary" size="small" @click="addTestList()"
+ @click="addTestList()"
@@ -2490,6 +2551,7 @@
@click="deleteTestList(index1)"
v-if="testJson.testCount != 1"
@@ -2514,10 +2576,11 @@
</el-radio>
</el-radio-group>
+ class="all_choose2"
v-model="testJson.testJson[index1].answer"
v-if="testJson.testJson[index1].type == '2'"
- <el-checkbox
+ <el-checkbox
v-for="(item2, checkIndex) in testJson.testJson[index1]
.testItem"
:key="checkIndex"
@@ -2536,6 +2599,7 @@
@click="addTcheckList(testJson.testJson[index1])"
@@ -2543,6 +2607,7 @@
@click="deleteTcheckList(testJson.testJson[index1])"
v-if="testJson.testJson[index1].testItem != 1"
@@ -2551,8 +2616,12 @@
- <el-button @click="dialogVisibleChoice = false">取 消</el-button>
- <el-button type="primary" @click="addTest">确 定</el-button>
+ <el-button @click="dialogVisibleChoice = false" class="cancel_button"
+ <el-button type="primary" @click="addTest" class="confirm_button"
@@ -2779,8 +2848,15 @@
- <el-button @click="dialogVisible4 = false">取 消</el-button>
- <el-button type="primary" @click="addChaptersDataTools">确定</el-button>
+ <el-button @click="dialogVisible4 = false" class="cancel_button"
+ @click="addChaptersDataTools"
@@ -2809,8 +2885,12 @@
- <el-button @click="dialogVisible8 = false">取 消</el-button>
- <el-button type="primary" @click="addAnswer">确 定</el-button>
+ <el-button @click="dialogVisible8 = false" class="cancel_button"
+ <el-button type="primary" @click="addAnswer" class="confirm_button"
@@ -2839,8 +2919,12 @@
- <el-button @click="dialogVisibleMp3 = false">取 消</el-button>
- <el-button type="primary" @click="addMp3Answer">确 定</el-button>
+ <el-button @click="dialogVisibleMp3 = false" class="cancel_button"
+ <el-button type="primary" @click="addMp3Answer" class="confirm_button"
@@ -2884,7 +2968,9 @@
- <el-button @click="choosePicVisible = false">取 消</el-button>
+ <el-button @click="choosePicVisible = false" class="cancel_button"
<el-button type="primary" @click="choosePicVisible = false"
>确 定</el-button
@@ -2934,8 +3020,10 @@
- <el-button @click="sysPicVisible = false">取 消</el-button>
- <el-button type="primary">确 定</el-button>
+ <el-button @click="sysPicVisible = false" class="cancel_button"
+ <el-button type="primary" class="confirm_button">确 定</el-button>
@@ -2993,6 +3081,7 @@
@click="addSelectList(selectJson)"
添加</el-button
@@ -3002,6 +3091,7 @@
@click="deleteSelectList(selectJson)"
v-if="selectJson.select && selectJson.select.length > 0"
@@ -3046,6 +3136,7 @@
@click="nextSelectSteps()"
v-if="selectSteps == 1"
>下一步</el-button
<el-button @click="selectSteps--" v-if="selectSteps == 2"
@@ -3055,6 +3146,7 @@
@click="addSelectAnswer"
v-if="selectSteps == 2"
@@ -3115,8 +3207,12 @@
- <el-button @click="dialogVisibleRate = false">取 消</el-button>
- <el-button type="primary" @click="addRateAnswer">确 定</el-button>
+ <el-button @click="dialogVisibleRate = false" class="cancel_button"
+ <el-button type="primary" @click="addRateAnswer" class="confirm_button"
@@ -3295,6 +3391,9 @@ export default {
@@ -4069,6 +4168,7 @@ export default {
@@ -4197,8 +4297,8 @@ export default {
homeworkList: [],
});
setTimeout(() => {
- this.checkEva(this.checkId);
- }, 0);
+ this.checkEva(this.checkId);
+ }, 0);
add(e, i) {
var el = e.currentTarget;
@@ -6280,7 +6380,7 @@ export default {
bottom: 0px;
transition: all 0.5s;
left: 0px;
margin-left: -25px;
@@ -6293,7 +6393,7 @@ export default {
.cru_selected {
- color: #0b7fc2 !important;
+ color: #5c549f !important;
.chapter_contentbox {
@@ -6851,7 +6951,7 @@ ol {
.stepBg {
width: calc(100% - 50px);
- justify-content:center;
+ justify-content: center;
flex-wrap: nowrap;
background: #fff;
@@ -7112,8 +7212,8 @@ ol {
margin-left: 10px;
.a_add_checkType .active {
- border-bottom: 2px solid #409eff;
- color: #409eff;
+ border-bottom: 2px solid #5c549f;
+ color: #5c549f;
.a_add_head .a_add_head_input {
width: 300px;
@@ -7227,14 +7327,35 @@ ol {
-/* .all_choose > .el-checkbox-group >>> .el-checkbox__input.is-checked .el-checkbox__inner, .all_choose > .el-checkbox-group >>> .el-checkbox__input.is-indeterminate .el-checkbox__inner1{
+.all_choose2
+ > .el-checkbox-group
+ >>> .el-checkbox__input.is-checked
+ .el-checkbox__inner,
+ >>> .el-checkbox__input.is-indeterminate
+ .el-checkbox__inner1 {
background: #5c549f;
border-color: #5c549f;
-.all_choose > .el-checkbox-group >>> .el-checkbox__input.is-checked+.el-checkbox__label{
+ + .el-checkbox__label {
color: #5c549f;
-} */
+.all_choose2 > .el-checkbox-group >>> .el-checkbox__inner:hover {
+ border-color: #5c549f;
+ >>> .el-checkbox__input.is-focus
+ .el-checkbox__inner {
.all_choose > .el-checkbox-group > .el-checkbox >>> .el-checkbox__label {
min-width: 80px;
@@ -7617,6 +7738,7 @@ ol {
height: calc(100% - 255px);
margin: 0 auto;
@@ -7820,7 +7942,7 @@ ol {
.type_content .active {
- border-bottom: 2px solid #5c549f;
.e_add_list_pbox_content {
@@ -8119,7 +8241,7 @@ ol {
@@ -8165,7 +8287,39 @@ ol {
-.s_switch >>> .el-switch__label.is-active{
+.s_switch >>> .el-switch__label.is-active {
+.cancel_button >>> .el-button:focus,
+.cancel_button >>> .el-button:hover {
+ color: rgb(92, 84, 159);
+ background-color: #dbd7ff;
+.confirm_button {
+ background: #5c549f;
+.stepsNav >>> .el-breadcrumb__inner a:hover,
+.stepsNav >>> .el-breadcrumb__inner.is-link:hover {
@@ -0,0 +1,374 @@
+ class="pb_content"
+ style="background: unset; overflow: auto; height: 100%"
+ <div class="pb_head top">
+ <span>班级管理</span>
+ <div class="student_button">
+ class="bgColor btnClassGM"
+ @click="dialogVisible = true"
+ >添加班级</el-button
+ <div class="student_search">
+ <span>
+ placeholder="请输入班级名称"
+ v-model="sClassName"
+ clearable
+ </el-input>
+ <el-button class="btnClassGM" type="primary" @click="searchClass">查询</el-button>
+ <div class="pb_content_body" style="margin:0 auto">
+ <div class="student_table">
+ :height="tableHeight"
+ style="width: 100%; height: 60%"
+ :header-cell-style="{ background: '#f1f1f1' }"
+ prop="name"
+ label="班级名称"
+ min-width="40%"
+ prop="pnum"
+ label="人数"
+ <el-table-column label="操作" min-width="20%">
+ class="btnClassGM"
+ @click="deleteClass(scope.row.id)"
+ >删除</el-button
+ <div class="student_page">
+ <el-pagination
+ background
+ layout="prev, pager, next"
+ :page-size="10"
+ :total="total"
+ v-if="page"
+ @current-change="handleCurrentChange"
+ </el-pagination>
+ title="添加学生"
+ width="25%"
+ <el-form>
+ <el-form-item label="班级名称" :label-width="formLabelWidth">
+ v-model="className"
+ auto-complete="off"
+ placeholder="请输入班级..."
+ </el-form-item>
+ </el-form>
+ <el-button class="cancelbtnGM" @click="dialogVisible = false">取 消</el-button>
+ <el-button class="btnClassGM" type="primary" @click="insertClass">确 定</el-button>
+ tableHeight: "500px",
+ formLabelWidth: "100px",
+ sClassName: "",
+ className: "",
+ page: 1,
+ total: 0,
+ userid: this.$route.query.userid,
+ oid: this.$route.query.oid,
+ created() {
+ this.page = 1;
+ this.getClass();
+ this.$nextTick(function () {
+ this.tableHeight =
+ window.innerHeight - this.$refs.table.$el.offsetTop - 200;
+ if (this.tableHeight <= 530) {
+ this.tableHeight = 530;
+ // 监听窗口大小变化
+ let self = this;
+ window.onresize = function () {
+ self.tableHeight =
+ window.innerHeight - self.$refs.table.$el.offsetTop - 200;
+ if (self.tableHeight <= 530) {
+ self.tableHeight = 530;
+ handleCurrentChange(val) {
+ this.page = val;
+ time() {
+ if (!this.now) {
+ this.now = new Date().getTime();
+ return true;
+ let time = new Date().getTime();
+ if (time - this.now > 3000) {
+ this.now = time;
+ return false;
+ searchClass() {
+ //新增班级
+ insertClass() {
+ name: this.className,
+ oid: this.oid,
+ uid: this.userid,
+ .get(this.$store.state.api + "insertClass", params)
+ this.$message({
+ message: "新增成功",
+ type: "success",
+ this.dialogVisible = false;
+ this.sClassName = "";
+ this.className = "";
+ message: "新增失败",
+ type: "error",
+ //获取班级列表
+ getClass() {
+ // username: this.$store.state.userInfo.userid,
+ cu: "",
+ cn: this.sClassName,
+ page: this.page,
+ .get(this.$store.state.api + "selectClass", params)
+ this.total = res.data[0].length > 0 ? res.data[0][0].num : 0;
+ this.tableData = res.data[0];
+ //删除班级
+ deleteClass(id) {
+ id: id,
+ if (this.time()) {
+ this.$confirm("确定删除此课程吗?", "提示", {
+ confirmButtonText: "确定",
+ cancelButtonText: "取消",
+ type: "warning",
+ .then(() => {
+ .get(this.$store.state.api + "deleteClass", params)
+ message: "删除成功",
+ if (this.page != 1 && this.tableData.length == 1) {
+ this.page - 1;
+ this.$message.error("删除失败");
+ .catch(() => {});
+.student_table >>> .el-table--border td {
+ border-right: 0px !important;
+.student_head >>> .el-button--primary {
+ /* background-color: #2268bc; */
+.xls_button {
+ text-decoration: underline;
+ color: rgb(34, 104, 188);
+.student_page {
+ padding-bottom: 15px;
+.student_search {
+ width: 300px;
+.student_search span {
+ margin: 0 10px 0 0;
+.student_button {
+ height: 40px;
+.student_button .el-button--primary {
+ /* margin-right: 10px; */
+.upload-demo {
+ align-items: end;
+ /* position: relative; */
+.student_table {
+ /* margin: 20px 0; */
+ background-color: #f1f1f1;
+.top {
+.bgColor {
+ /* background: #2167bc; */
+.student_table >>> .el-table,
+.student_table >>> .el-table__body-wrapper {
+ height: auto !important;
+.student_page
+ >>> .el-pagination.is-background
+ .el-pager
+ li:not(.disabled).active {
+ background-color: #5c549f;
+ color: #fff !important;
+ li:not(.disabled):hover {
@@ -0,0 +1,271 @@
+ <div v-loading="isloading">
+ <div class="ci_info" v-if="Object.keys(courseInfo).length">
+ <div class="ci_info_box">
+ <span>项目名称:</span><span>{{ courseInfo.title }}</span>
+ <span>创建人:</span><span>{{ courseInfo.name }}</span>
+ <span>协同人员:</span><span>{{ teacher ? teacher : "无协同人员" }}</span>
+ <div class="ci_info_box2">
+ 阶段<span>{{ tool.stage }}</span>个
+ 任务<span>{{ tool.task }}</span>个
+ 工具<span>{{ tool.tool }}</span>个
+ <div style="width: 90%; height: calc(100% - 130px); margin: 10px auto 0">
+ <!-- <img src="../../assets/dataimage/1.png" style="width:90%" /> -->
+ <div id="charts_canvas" class="echart" style="width: 100%; height: 100%"></div>
+ props: ["courseid"],
+ isloading:false,
+ chartJson: {},
+ courseInfo: {},
+ teacher: "",
+ chartObj: null,
+ tool: {
+ stage: 0,
+ task: 0,
+ tool: 0,
+ option: {
+ legend: {
+ top: "bottom",
+ toolbox: {
+ show: true,
+ grid: {},
+ series: [
+ {
+ bottom: "20%",
+ name: "学习活动时间分配图",
+ type: "pie",
+ // radius: [10, "80%"],
+ center: ["50%", "50%"],
+ // roseType: "area",
+ // itemStyle: {
+ // borderRadius: 8,
+ // },
+ label: {
+ position: "inside",
+ formatter: "{b}\n{d}%",
+ data: [
+ { value: 0, name: "思维网格" },
+ { value: 0, name: "思维导图" },
+ { value: 0, name: "电子白板" },
+ { value: 0, name: "选择题" },
+ // { value: 0, name: "自主学习" },
+ { value: 0, name: "其他" },
+ ],
+ randomNum(minNum, maxNum) {
+ switch (arguments.length) {
+ case 1:
+ return parseInt(Math.random() * minNum + 1, 10);
+ break;
+ case 2:
+ return parseInt(Math.random() * (maxNum - minNum + 1) + minNum, 10);
+ default:
+ return 0;
+ getInfo() {
+ this.isloading = true
+ cid: this.courseid,
+ console.log(this.courseid);
+ if (!this.courseid) {
+ return;
+ .get(this.$store.state.api + "getCourseInfo", params)
+ this.isloading = false
+ this.courseInfo = res.data[0][0];
+ let teachers = res.data[1];
+ let teacher = [];
+ for (var i = 0; i < teachers.length; i++) {
+ teacher.push(teachers[i].name);
+ this.teacher = teacher.join("、");
+ let chapters = JSON.parse(res.data[0][0].chapters);
+ var task = 0;
+ var tool = 0;
+ var wang = 0;//7
+ var si = 0;//3
+ var dian = 0;//1
+ var xuan = 0;//4
+ var other = 0;
+ for (var i = 0; i < chapters.length; i++) {
+ task += chapters[i].chapterInfo[0].taskJson.length;
+ for (
+ var j = 0;
+ j < chapters[i].chapterInfo[0].taskJson.length;
+ j++
+ ) {
+ if (chapters[i].chapterInfo[0].taskJson[j].toolChoose.length) {
+ for (var k = 0; k < chapters[i].chapterInfo[0].taskJson[j].toolChoose.length; k++) {
+ if (chapters[i].chapterInfo[0].taskJson[j].toolChoose[k].tool.indexOf(7) != -1) {
+ wang++
+ } else if (chapters[i].chapterInfo[0].taskJson[j].toolChoose[k].tool.indexOf(3) != -1) {
+ si++
+ } else if (chapters[i].chapterInfo[0].taskJson[j].toolChoose[k].tool.indexOf(1) != -1) {
+ dian++
+ } else if (chapters[i].chapterInfo[0].taskJson[j].toolChoose[k].tool.indexOf(4) != -1) {
+ xuan++
+ other++
+ tool += chapters[i].chapterInfo[0].taskJson[j].toolChoose.length;
+ this.chartJson = {
+ wang,
+ si,
+ dian,
+ xuan,
+ other
+ this.tool.stage = chapters.length;
+ this.tool.task = task;
+ this.tool.tool = tool;
+ this.$nextTick(() => {
+ this.setChart();
+ setChart() {
+ // 雷达图显示的标签
+ let newPromise = new Promise((resolve) => {
+ resolve();
+ //然后异步执行echarts的初始化函数
+ newPromise.then(() => {
+ const chartObj = this.$echarts.init(
+ //劳动课程
+ this.$el.querySelector("#charts_canvas")
+ // document.getElementById("#charts_canvas")
+ let _array = [];
+ // for (var i = 0; i < 5; i++) {
+ // this.option.series[0].data[i].value = this.randomNum(30, 80);
+ // // _array.push(this.randomNum(0, 80));
+ // }
+ this.option.series[0].data[0].value = this.chartJson.wang
+ this.option.series[0].data[1].value = this.chartJson.si
+ this.option.series[0].data[2].value = this.chartJson.dian
+ this.option.series[0].data[3].value = this.chartJson.xuan
+ this.option.series[0].data[4].value = this.chartJson.other
+ // this.option.series[0].data[0].value = _array;
+ // 初始化雷达图
+ this.chartObj = chartObj;
+ this.chartObj.setOption(this.option);
+ let _this = this;
+ window.addEventListener("resize", () => {
+ if (_this.chartObj) {
+ _this.chartObj.resize();
+ watch: {
+ courseid(newValue, oldValue) {
+ this.getInfo();
+.ci_info {
+.ci_info_box {
+ width: 90%;
+.ci_info_box span {
+.ci_info_box span+span {
+.ci_info_box+.ci_info_box {
+.ci_info_box2 {
+.ci_info_box2 div {
+.ci_info_box2 span {
+ color: rgb(234, 146, 59);
+ width: 30px;
+ text-align: center;
@@ -0,0 +1,317 @@
+ <div style="width: 95%; height: calc(100% - 40px); margin: 20px auto;" ref="innder">
+ id="charts_canvas"
+ class="echart"
+ style="width: 100%; height: 100%"
+ ></div> -->
+ <div id="charts_canvas3" class="echart" ref="table">
+ <!-- <div style="font-size: 13px; font-weight: 600">
+ 项目综合评估:各个阶段评价平均分
+ <el-table class="table" :data="tdata" :height="tableHeight" :fit="true" style="width: 100%" :header-cell-style="{
+ background: '#fff',
+ fontSize: '12px',
+ fontWeight: 'unset',
+ padding: '0',
+ border: 'unset',
+ }" :row-class-name="tableRowClassName" header-row-class-name="header_row_class">
+ <el-table-column label="排名" min-width="29px" align="center">
+ <div style="font-weight: 600">{{ scope.$index + 1 }}</div>
+ <el-table-column prop="name" label="名称" min-width="39px" align="center">
+ <div style="color: rgb(96, 96, 96); font-weight: 600">
+ {{ scope.row.name }}
+ <el-table-column prop="rate" label="完成度" min-width="39px" align="center"><template slot-scope="scope">
+ <div style="color: #5c549f; font-weight: 600">
+ {{ scope.row.rate }}
+ </template></el-table-column>
+ <el-table-column prop="rate1" label="活跃度" min-width="39px" align="center"><template slot-scope="scope">
+ {{ scope.row.rate1 }}
+ <el-table-column prop="rate2" label="参与度" min-width="39px" align="center"><template slot-scope="scope">
+ {{ scope.row.rate2 }}
+ <el-table-column prop="rate3" label="综合表现" min-width="49px" align="center"><template slot-scope="scope">
+ <div style="color: rgb(233, 140, 148);font-weight: 600">{{ scope.row.rate3 }}</div>
+ <!-- <el-table-column prop="ratez" label="综合" min-width="29px" align="center"><template slot-scope="scope">
+ <div style="color: rgb(233, 140, 148);font-weight: 600">{{ scope.row.ratez }}</div>
+ </template></el-table-column> -->
+ props: ["userid", "courseid"],
+ workJson: [],
+ tdata: [],
+ tableHeight: 0,
+ bottom: "10%",
+ radius: [10, "80%"],
+ roseType: "area",
+ itemStyle: {
+ borderRadius: 8,
+ { value: 0, name: "问卷调查" },
+ { value: 0, name: "自主学习" },
+ return "even_row row_class";
+ return "row_class";
+ console.log(this.userid);
+ if (!this.userid) {
+ .get(this.$store.state.api + "getUserInfo", params)
+ let chapters = JSON.parse(res.data[2][0].chapters);
+ let workJson = []
+ let _pWork = res.data[3];
+ let _allWork = res.data[4];
+ let _allComment = res.data[5];
+ workJson[i] = { tool: 0, ptool: 0, work: 0, ishuo: 0, isCan: 0 }
+ // 1、电子白板,3、思维导图,6协同文档,7思维网格 16、作业提交,40.项目-学生互评 41.项目-下拉选择题 42.项目-录音功能
+ let _toolsAarry = [1, 3, 6, 7, 16, 15, 4, 40, 41, 42];
+ var k = 0;
+ k < chapters[i].chapterInfo[0].taskJson[j].toolChoose.length;
+ k++
+ if (
+ _toolsAarry.indexOf(
+ chapters[i].chapterInfo[0].taskJson[j].toolChoose[k].tool[0]
+ ) != -1
+ tool++;
+ workJson[i].tool++
+ for (var k = 0; k < _pWork.length; k++) {
+ if (_pWork[k].stage == i) {
+ workJson[i].ptool++
+ for (var k = 0; k < _allComment.length; k++) {
+ if (_allComment[k].stage == i) {
+ workJson[i].ishuo++
+ this.userinfo = res.data[0][0];
+ this.ccount = tool;
+ this.islearn = tool - parseInt(res.data[1][0].vcount);
+ this.iscount = res.data[1][0].vcount;
+ this.vcount = 0;
+ for (var i = 0; i < workJson.length; i++) {
+ if (workJson[i].ptool > workJson[i].tool) {
+ workJson[i].work = 5
+ } else if( workJson[i].tool === 0){
+ }else{
+ workJson[i].work = Math.round(workJson[i].ptool / workJson[i].tool * 100 / 20)
+ if (workJson[i].ptool) {
+ workJson[i].isCan = 1
+ this.workJson = workJson
+ console.log(workJson);
+ // const chartObj = this.$echarts.init(
+ // //劳动课程
+ // this.$el.querySelector("#charts_canvas")
+ // // document.getElementById("#charts_canvas")
+ // );
+ // let _array = [];
+ // for (var i = 0; i < 6; i++) {
+ // // this.option.series[0].data[0].value = _array;
+ // // 初始化雷达图
+ // this.chartObj = chartObj;
+ // this.chartObj.setOption(this.option);
+ this.tdata = [];
+ for (var i = 0; i < this.workJson.length; i++) {
+ var _rate = this.workJson[i].work < 3 ? 3 : this.workJson[i].work;
+ var _rate1 = this.workJson[i].ishuo ? 5 : 3;
+ var _rate2 = this.workJson[i].isCan ? 5 : 3;
+ var _rate3 = (_rate + _rate1 + _rate2) / 3;
+ var _ratez = (_rate + _rate1 + _rate2 + _rate3) / 4;
+ this.tdata.push({
+ name: "阶段" + (i + 1),
+ rate: _rate.toFixed(1),
+ rate1: _rate1.toFixed(1),
+ rate2: _rate2.toFixed(1),
+ rate3: _rate3.toFixed(1),
+ ratez: _ratez.toFixed(1),
+ this.tdata.sort(this.sortId);
+ this.setTableHeight();
+ // let _this = this;
+ // window.addEventListener("resize", () => {
+ // if (_this.chartObj) {
+ // _this.chartObj.resize();
+ // });
+ sortId(a, b) {
+ return b.ratez - a.ratez;
+ setTableHeight() {
+ console.log(this.$refs.innder.offsetHeight);
+ this.tableHeight = this.$refs.innder.offsetHeight
+ // window.innerHeight - this.$refs.table.offsetHeight - 600;
+ userid(newValue, oldValue) {
+.el-table>>>.even_row {
+ background-color: rgb(238, 243, 250) !important;
+.el-table>>>.row_class td {
+ padding: 8px 0;
+ border: unset;
+.el-table>>>.row_class {
+ background: rgb(249, 249, 249);
+.el-table>>>.row_class .cell {
+ padding: 0;
+ font-size: 12px;
+.el-table>>>.header_row_class .cell {
+.el-table::before {
+ height: 0;
@@ -0,0 +1,769 @@
+ <div style="background: #fff; padding: 10px 0; height: 100%">
+ <div class="sd_person_button">
+ <span @click="setType(1)" :class="{ active: type == 1 }">项目目标设置</span>
+ <span @click="setType(2)" :class="{ active: type == 2 }">班级项目评价得分占比</span>
+ <!-- <span @click="setType(3)" :class="{ active: type == 3 }">其他项目</span> -->
+ <div style="display: flex; width: 100%; height: calc(100% - 50px)">
+ <div id="person_canvas1" class="echart" v-show="type == 1"
+ style="width: 100%; height: 100%;display: flex;align-items: center;justify-content: center;">
+ <span v-if="!eJson">暂无数据</span>
+ <div id="person_canvas2" class="echart" v-show="type == 2"
+ <!-- <div class="box2" v-show="work.length ? true : false">
+ <div v-for="(item,index) in work" :key="index" class="target_box">
+ <div class="target_task">
+ <span>第{{item.stage+1}}阶段</span>
+ <span>任务{{item.task+1}}</span>
+ <div class="target_content_box">
+ <div v-for="(target,k) in item.work" :key="index+'-'+k"
+ :style="{width:(target.count / item.count * 100)+'%',backgroundColor:color[k]}">
+ <el-tooltip :content="target.name+' '+target.count">
+ <span class="targetA">{{target.count}}</span>
+ <span v-show="!work.length ? true : false">暂无数据</span> -->
+ <span v-show="!randarJson.length ? true : false">暂无数据</span>
+ randarJson: [],
+ isloading: false,
+ chartObj2: null,
+ chartObj3: null,
+ color: [],
+ workW: [],
+ work: [],
+ eJson: "",
+ type: 1,
+ option2: {
+ //color:colors,
+ tooltip: {
+ trigger: "item",
+ left: "50",
+ top: "center",
+ series: {
+ type: "sunburst",
+ data: [],
+ radius: [20, "80%"],
+ borderRadius: 7,
+ borderWidth: 2,
+ fontSize: 10
+ option3: {
+ // title: {
+ // text: "项目活跃度:不同任务的学习时间占比",
+ // textStyle: {
+ // fontSize: 13,
+ trigger: "axis",
+ axisPointer: {
+ // Use axis to trigger tooltip
+ type: "shadow", // 'shadow' as default; can also be 'line' or 'shadow'
+ grid: {
+ left: "15%",
+ right: "15%",
+ bottom: "15%",
+ top: "15%",
+ xAxis: {
+ type: "value",
+ yAxis: {
+ type: "category",
+ data: ["阶段1", "阶段2", "阶段3", "阶段4", "阶段5"],
+ show: false
+ name: "任务1",
+ type: "bar",
+ stack: "total",
+ emphasis: {
+ focus: "series",
+ data: [0, 0, 0, 0, 0],
+ name: "任务2",
+ name: "任务3",
+ name: "任务4",
+ name: "任务5",
+ radarOption: {
+ splitNumber: 5,
+ triggerOn: "mousemove",
+ //雷达图的tooltip不会超出div,也可以设置position属性,position定位的tooltip 不会随着鼠标移动而位置变化,不友好
+ confine: true,
+ enterable: true, //鼠标是否可以移动到tooltip区域内
+ backgroundColor: "rgba(255,255,255,0.7)",
+ textStyle: {
+ // 文字样式
+ align: "left",
+ left: "right",
+ radar: {
+ radius: ["0%", "70%"],
+ shape: "circle",
+ axisName: {
+ color: "#58a5e6",
+ formatter: function (value, indicator) {
+ // value = value.replace(/\S{2}/g, function (match) {
+ // return match + "\n";
+ return value;
+ indicator: [
+ // 雷达图的指示器,用来指定雷达图中的多个变量(维度)
+ // 雷达图背景的颜色,在这儿随便设置了一个颜色,完全不透明度为0,就实现了透明背景
+ splitArea: {
+ areaStyle: {
+ color: "rgba(255,0,0,0)", // 图表背景的颜色
+ splitLine: {
+ lineStyle: {
+ width: 1,
+ color: "rgba(131,141,158,.1)", // 设置网格的颜色
+ name: "目标得分占比", // tooltip中的标题
+ type: "radar", // 表示是雷达图
+ symbol: "circle", // 拐点的样式,还可以取值'rect','angle'等
+ symbolSize: 8, // 拐点的大小
+ normal: {
+ opacity: 0.2,
+ // 设置各个指标原始值
+ value: [],
+ // 设置区域边框和区域的颜色
+ color: "#5c549f",
+ if (this.type == 1 && this.eJson) {
+ const chartObj2 = this.$echarts.init(
+ this.$el.querySelector("#person_canvas1")
+ // this.option2.series.data = [
+ // {
+ // name: "信息意识",
+ // value: 15,
+ // children: [
+ // name: "信息应用意识",
+ // value: this.randomNum(1, 5),
+ // name: "信息安全意识",
+ // name: "信息感知意识",
+ // ],
+ // name: "信息社会责任",
+ // name: "信息伦理道德",
+ // name: "信息法律法规",
+ // value: this.randomNum(1, 10),
+ // name: "信息知识与技能",
+ // name: "信息应用技能",
+ // value: 5,
+ // name: "信息科学知识",
+ // value: 10,
+ // name: "信息思维与行为",
+ // name: "信息思维",
+ // name: "信息行为",
+ // ];
+ var res = this.eJson;
+ var _array = [];
+ let i = 0;
+ for (var item in res) {
+ let num = Object.keys(res);
+ let count = 10 / num.length;
+ let _item = res[item];
+ _array.push({ name: _item.name, value: count, children: [] });
+ let j = 0;
+ for (var item2 in _item.child) {
+ let num2 = Object.keys(res);
+ let count2 = count / num2.length;
+ let _item2 = _item.child[item2];
+ _array[i].children.push({
+ name: _item2.name,
+ value: count2,
+ children: [],
+ for (var item3 in _item2.child) {
+ let num3 = Object.keys(res);
+ let count3 = count2 / num3.length;
+ let _item3 = _item2.child[item3];
+ _array[i].children[j].children.push({
+ name: _item3.name,
+ value: count3,
+ j++;
+ i++;
+ console.log(item);
+ this.option2.series.data = _array
+ this.chartObj2 = chartObj2;
+ this.chartObj2.setOption(this.option2);
+ } else if (this.type == 2) {
+ // const chartObj3 = this.$echarts.init(
+ // this.$el.querySelector("#person_canvas2")
+ // let _array21 = [];
+ // let _array22 = [];
+ // let _array23 = [];
+ // let _array24 = [];
+ // let _array25 = [];
+ // // this.option.series[0].data[i].value = this.randomNum(30, 80);
+ // _array21.push(this.randomNum(2, 20));
+ // _array22.push(this.randomNum(2, 20));
+ // _array23.push(this.randomNum(2, 20));
+ // _array24.push(this.randomNum(2, 20));
+ // _array25.push(this.randomNum(2, 20));
+ // this.option3.series[0].data = _array21;
+ // this.option3.series[1].data = _array22;
+ // this.option3.series[2].data = _array23;
+ // this.option3.series[3].data = _array24;
+ // this.option3.series[4].data = _array25;
+ if (this.randarJson.length) {
+ const chartObj3 = this.$echarts.init(
+ this.$el.querySelector("#person_canvas2")
+ let radarOption = JSON.parse(JSON.stringify(this.radarOption))
+ for (var i = 0; i < this.randarJson.length; i++) {
+ radarOption.radar.indicator.push({
+ name: this.randarJson[i].target,
+ max: 5,
+ radarOption.series[0].data[0].value.push((this.randarJson[i].value / this.randarJson[i].count).toFixed(1));
+ this.chartObj3 = chartObj3;
+ this.chartObj3.setOption(radarOption);
+ // var _work = []
+ // this.color = []
+ // for (var i = 0; i < this.workW.length; i++) {
+ // _work[i] = { stage: this.workW[i].stage, task: this.workW[i].task, work: [], count: 0 }
+ // for (var j = 0; j < this.workW[i].work.length; j++) {
+ // for (var k = 0; k < this.workW[i].work[j].target.length; k++) {
+ // this.color.push(this.color16())
+ // _work[i].work.push(this.workW[i].work[j].target[k])
+ // _work[i].count += this.workW[i].work[j].target[k].count
+ // this.work = _work;
+ // console.log(_work);
+ // this.$forceUpdate();
+ // if (_this.chartObj2) {
+ // _this.chartObj2.resize();
+ // _this.chartObj3.resize();
+ if (_this.chartObj2) {
+ _this.chartObj2.resize();
+ if (_this.chartObj3) {
+ _this.chartObj3.resize();
+ let _isWorks = res.data[6];
+ var randarJson = []
+ var randarAarray = []
+ this.eJson = res.data[2][0].content ? JSON.parse(res.data[2][0].content) : "";
+ } else if (workJson[i].tool === 0) {
+ let _workW = []
+ for (var i = 0; i < _isWorks.length; i++) {
+ if (chapters[_isWorks[i].stage].chapterInfo[0].taskJson[_isWorks[i].task].eList && chapters[_isWorks[i].stage].chapterInfo[0].taskJson[_isWorks[i].task].eList.length) {
+ _workW.push({ stage: _isWorks[i].stage, task: _isWorks[i].task, rate: JSON.parse(_isWorks[i].rate), elist: chapters[_isWorks[i].stage].chapterInfo[0].taskJson[_isWorks[i].task].eList })
+ // else {
+ // let elist = [
+ // "value": "意识能力",
+ // "score": 5,
+ // "target": [
+ // "name": "意识能力1",
+ // "per": 0.5
+ // "name": "意识能力2",
+ // ]
+ // "value": "科学探究能力",
+ // "name": "科学探究能力1",
+ // "name": "科学探究能力2",
+ // "value": "实践创新能力",
+ // "name": "实践创新能力1",
+ // "name": "实践创新能力2",
+ // "value": "学习反思能力",
+ // "name": "学习反思能力1",
+ // "name": "学习反思能力2",
+ // "value": "工程思维能力",
+ // "name": "工程思维能力1",
+ // "name": "工程思维能力2",
+ // _workW.push({ stage: _isWorks[i].stage, task: _isWorks[i].task, rate: JSON.parse(_isWorks[i].rate), elist: elist })
+ for (var i = 0; i < _workW.length; i++) {
+ _workW[i].work = []
+ for (var j = 0; j < _workW[i].elist.length; j++) {
+ if (_workW[i].elist[j].target) {
+ if (randarAarray.indexOf(_workW[i].elist[j].target) == -1) {
+ randarAarray.push(_workW[i].elist[j].target)
+ // for (var k = 0; k < _workW[i].elist[j].target.length; k++) {
+ // _workW[i].elist[j].target[k].count = _workW[i].rate[_workW[i].elist[j].value] * _workW[i].elist[j].target[k].per
+ _workW[i].work.push({ name: _workW[i].elist[j].value, target: _workW[i].elist[j].target })
+ _workW[i].work[_workW[i].work.length - 1][_workW[i].elist[j].value] = _workW[i].rate[_workW[i].elist[j].value]
+ _workW[i].work[_workW[i].work.length - 1].value = _workW[i].rate[_workW[i].elist[j].value]
+ for (var k = 0; k < randarAarray.length; k++) {
+ randarJson.push({ target: randarAarray[k], count: 0, value: 0 })
+ for (var j = 0; j < _workW[i].work.length; j++) {
+ if (_workW[i].work[j].target == randarAarray[k]) {
+ randarJson[k].count++
+ randarJson[k].value += _workW[i].work[j].value
+ console.log('chapter=-----', chapters);
+ console.log('_workW=-----', _workW);
+ console.log('randarAarray=-----', randarAarray);
+ console.log('randarJson=-----', randarJson);
+ this.workW = _workW
+ this.randarJson = randarJson
+ setType(type) {
+ this.type = type;
+ if (this.chartObj2) {
+ this.chartObj2.dispose();
+ if (this.chartObj3) {
+ this.chartObj3.dispose();
+ color16() {//十六进制颜色随机
+ var r = Math.floor(Math.random() * 256);
+ var g = Math.floor(Math.random() * 256);
+ var b = Math.floor(Math.random() * 256);
+ var color = '#' + r.toString(16) + g.toString(16) + b.toString(16);
+ return color;
+.sd_person_button {
+ margin-bottom: 10px;
+.sd_person_button span {
+ padding: 0 0 6px;
+.sd_person_button .active {
+.target_box {
+ width: 80%;
+.target_box+.target_box {
+.target_task {
+ color: rgb(91, 91, 91);
+.target_content_box {
+ width: calc(100% - 100px);
+.target_content_box div {
+ height: 50px;
+.box2 {
+ margin-top: 40px;
+ height: 80%;
+ overflow: auto;
+.targetA {
@@ -0,0 +1,518 @@
+ <div class="r_box">
+ <div class="r_cbox">
+ <span>学生姓名</span>
+ <el-select
+ multiple
+ collapse-tags
+ class="r_select"
+ v-model="uname"
+ placeholder="全部"
+ filterable
+ <el-option
+ v-for="item in userAarray"
+ :key="item.userid"
+ :label="item.username"
+ :value="item.userid"
+ </el-option>
+ <span>选择阶段</span>
+ v-model="chap"
+ @change="changeChap"
+ v-for="(item, index) in dyList"
+ :label="item.name"
+ :value="item.id"
+ ></el-option>
+ <span>任务内容</span>
+ v-model="task"
+ <el-option-group
+ v-for="(group, index) in dyAarray"
+ :label="group.name"
+ v-for="(item, index2) in group.taskList"
+ :key="index + '-' + index2"
+ :value="group.id + '-' + item.id"
+ </el-option-group>
+ <div class="btn_box">
+ <el-button class="btn btnClassGM" type="primary" @click="confirm">确定</el-button>
+import htmlDocx from "html-docx-js/dist/html-docx";
+import saveAs from "file-saver";
+ props: ["cid"],
+ uname: [],
+ chap: [],
+ task: [],
+ dyAarray: [],
+ dyList: [],
+ userAarray: [],
+ imgList: [],
+ askList: [],
+ questList: [],
+ wordList: [],
+ course: {},
+ getCourseDetail() {
+ cid: this.cid,
+ .get(this.$store.state.api + "getCourseWorksReport", params)
+ this.course = res.data[0][0];
+ var dyJSON = JSON.parse(res.data[0][0].chapters);
+ let dyList = [];
+ for (var i = 0; i < dyJSON.length; i++) {
+ dyList.push({ name: dyJSON[i].dyName, id: i, taskList: [] });
+ var a = dyJSON[i].chapterInfo[0].taskJson;
+ for (var j = 0; j < a.length; j++) {
+ dyList[i].taskList.push({ name: a[j].task, id: j });
+ this.dyList = dyList;
+ this.userAarray = res.data[1];
+ console.log(res.data[0][1]);
+ this.imgList = res.data[2];
+ this.askList = res.data[3];
+ this.questList = res.data[4];
+ this.wordList = res.data[5];
+ confirm() {
+ var _uname = [];
+ var _userA = this.userAarray;
+ var _chap = JSON.parse(JSON.stringify(this.chap));
+ var _task = this.task;
+ if (this.uname.length) {
+ for (var i = 0; i < _userA.length; i++) {
+ if (this.uname.join(",").indexOf(_userA[i].userid) != -1) {
+ _uname.push(_userA[i]);
+ if (!_chap.length) {
+ for (var i = 0; i < this.dyList.length; i++) {
+ _chap.push(this.dyList[i].id);
+ let imgList = this.imgList;
+ let askList = this.askList;
+ let questList = this.questList;
+ let wordList = this.wordList;
+ let workArray = [];
+ // json{
+ // img: [],
+ // askList: [],
+ // questList: {},
+ // wordList: [],
+ // chapName: "",
+ // taskName: "",
+ // username:""
+ for (let i = 0; i < _uname.length; i++) {
+ for (let chapI = 0; chapI < _chap.length; chapI++) {
+ if (_task.length) {
+ for (let taskI = 0; taskI < _task.length; taskI++) {
+ let _tI = _task[taskI].split("-");
+ if (_tI[0] == _chap[chapI]) {
+ let _workjson = {
+ img: [],
+ chapName:
+ "第" +
+ (parseInt(_chap[chapI]) + 1) +
+ "阶段 " +
+ this.dyList[_chap[chapI]].name,
+ taskName:
+ "任务" +
+ (parseInt(_tI[1]) + 1) +
+ this.dyList[_chap[chapI]].taskList[_tI[1]].name,
+ username: _uname[i].username,
+ // imgList;askList;questList;wordList;
+ for (let a = 0; a < imgList.length; a++) {
+ imgList[a].stage == _chap[chapI] &&
+ imgList[a].task == _tI[1] &&
+ imgList[a].userid == _uname[i].userid
+ _workjson.img.push({ src: imgList[a].content });
+ for (let b = 0; b < askList.length; b++) {
+ askList[b].stage == _chap[chapI] &&
+ askList[b].task == _tI[1] &&
+ askList[b].userid == _uname[i].userid
+ const element = askList[b];
+ let a1 = JSON.parse(element.content)[0];
+ let b1 = a1.anwer.split(",");
+ let c1 = [];
+ for (var j1 = 0; j1 < b1.length; j1++) {
+ c1.push(parseInt(b1[j1]));
+ a1.askJson.radio = c1;
+ a1.askJson.time = element.time;
+ _workjson.askList.push(a1.askJson);
+ for (let c = 0; c < questList.length; c++) {
+ questList[c].stage == _chap[chapI] &&
+ questList[c].task == _tI[1] &&
+ questList[c].userid == _uname[i].userid
+ const element = questList[c];
+ _workjson.questList.push(JSON.parse(element.content)[0]);
+ for (let d = 0; d < wordList.length; d++) {
+ wordList[d].stage == _chap[chapI] &&
+ wordList[d].task == _tI[1] &&
+ wordList[d].userid == _uname[i].userid
+ const element = wordList[d];
+ _workjson.wordList.push(element.content);
+ workArray.push(_workjson);
+ let taskI = 0;
+ taskI < this.dyList[_chap[chapI]].taskList.length;
+ taskI++
+ let _tI = [
+ _chap[chapI],
+ this.dyList[_chap[chapI]].taskList[taskI].id,
+ ];
+ var _course = `<h1>${this.course.title}</h1>`;
+ let html = "";
+ for (let i = 0; i < workArray.length; i++) {
+ let _html = this.setHtml(workArray[i]);
+ html += _html;
+ this.generate(_course + html);
+ console.log(workArray);
+ setHtml(workJson) {
+ var _title =
+ // style='display:flex;align-items:center'
+ "<div >" +
+ "<h2>" +
+ workJson.chapName +
+ "-" +
+ workJson.username;
+ ("</h2>");
+ ("</div>");
+ var _subtitle = "<h3>" + workJson.taskName + "</h3>";
+ var _img = "";
+ if (workJson.img.length > 0) {
+ for (var i = 0; i < workJson.img.length; i++) {
+ // _img+=`<div style="margin-top:10px"><div>图片${
+ // i + 1
+ // }:<a href='${ workJson.img[i].src}'>${ workJson.img[i].src}</a></div>`
+ _img += `<div style="margin-top:10px"><div>图片${
+ i + 1
+ }</div><img style="max-width:500px" src="${
+ workJson.img[i].src
+ }"/></div>`;
+ var _ask = "";
+ if (workJson.askList.length > 0) {
+ var _ask = "<h3>问卷调查</h3>";
+ for (var i = 0; i < workJson.askList.length; i++) {
+ var _div = document.createElement("div");
+ _div.innerHTML = `<h4>问卷标题:${workJson.askList[i].askTitle}</h4>`;
+ for (var j = 0; j < workJson.askList[i].askJson.length; j++) {
+ var _div2 = document.createElement("div");
+ _div2.innerHTML = `<h5>第${j + 1}题:${
+ workJson.askList[i].askJson[j].askstitle
+ } 选择:${workJson.askList[i].radio[j] + 1}</h5> `;
+ var _div3 = document.createElement("div");
+ var z = 0;
+ z < workJson.askList[i].askJson[j].checkList.length;
+ z++
+ _div3.innerHTML += `<span style="margin-right:5px">${z + 1}.${
+ workJson.askList[i].askJson[j].checkList[z]
+ }</span>`;
+ _div2.innerHTML += `<div>${_div3.innerHTML}</div>`;
+ _div.innerHTML += `<div>${_div2.innerHTML}</div>`;
+ _ask += `<div>${_div.innerHTML}</div>`;
+ var _answer = "";
+ if (workJson.questList.length > 0) {
+ var _answer = "<h3>问答</h3>";
+ for (var i = 0; i < workJson.questList.length; i++) {
+ _div.innerHTML = `<h4>问答:${workJson.questList[i].answerTitle}</h4>`;
+ _div.innerHTML += `<div>${workJson.questList[i].answer}</div>`;
+ _answer += `<div>${_div.innerHTML}</div>`;
+ var _link = "";
+ if (workJson.wordList.length > 0) {
+ for (var i = 0; i < workJson.wordList.length; i++) {
+ _link += `<div style="margin-top:10px"><a href='${workJson.wordList[i]}'>${workJson.wordList[i]}</a></div>`;
+ !workJson.img.length &&
+ !workJson.askList.length &&
+ !workJson.questList.length &&
+ !workJson.wordList.length
+ return _title + _subtitle + _img + _ask + _answer + _link;
+ async generate(a) {
+ // 将html文件中需要用到的数据挂载到store上
+ this.$store.commit("update", ["report", a]);
+ console.log(this.$store.state.report);
+ const content = `<!DOCTYPE html>
+ <html lang="en">
+ <head>
+ <meta charset="UTF-8">
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <title>报告</title>
+ </head>
+ <body>
+ ${this.$store.state.report}
+ </body>
+ </html>`;
+ // debugger
+ //生成报告
+ const link = document.createElement("a");
+ // link.download = "报告.html"; // 文件名
+ let dname = this.course.title+'-'
+ _uname.push(_userA[i].username);
+ dname+=_uname.join('、')+'.html'
+ dname+='全部学生.html'
+ link.download = dname; // 文件名
+ link.style.display = "none";
+ // 创建文件流
+ // 创建bolb实例时,内容一定要放在[]中
+ const blob = new Blob([content], {
+ type: "text/plain;charset='utf-8'",
+ link.href = window.URL.createObjectURL(blob);
+ document.body.appendChild(link);
+ link.click();
+ document.body.removeChild(link);
+ // saveAs(
+ // htmlDocx.asBlob(content, {
+ // orientation: "landscape", //跨域设置
+ // }),
+ // //文件名
+ // "报告.doc"
+ changeChap() {
+ let _dyList = this.dyList;
+ this.dyAarray = [];
+ this.task = [];
+ for (var i = 0; i < _dyList.length; i++) {
+ if (this.chap.indexOf(_dyList[i].id) != -1) {
+ this.dyAarray.push(_dyList[i]);
+ cid(newValue, oldValue) {
+ this.getCourseDetail();
+.r_box {
+.r_cbox {
+ margin-bottom: 20px;
+.r_cbox span {
+ margin-right: 20px;
+.r_box .r_select {
+ width: 400px;
+.btn_box {
+ margin: 40px 0 0 0;
+.btn_box .btn {
+ width: 60%;
+ /* background: rgb(14, 114, 230); */
+.r_cbox >>> .el-select .el-input.is-focus .el-input__inner {
+.r_cbox.student_search >>> .el-select .el-input__inner:focus {
+.el-select-dropdown__item.selected {
@@ -0,0 +1,191 @@
+ <div style="width: 100%; height: 100%">
+ <div class="sr_head">学生成长报告</div>
+ <div class="sr_body">
+ <div class="sr_box">
+ <div class="sr_first">
+ <div class="first">
+ <div class="sub_title"><span>学生基本信息</span></div>
+ <StudentInfo class="r_box" :userid="userid" :courseid="courseid"></StudentInfo>
+ <div class="second">
+ <div class="sub_title"><span>项目基本信息</span></div>
+ <CourseInfo class="r_box" :courseid="courseid"></CourseInfo>
+ <div class="sr_second">
+ <div class="sub_title"><span>学生综合能力评估</span></div>
+ <StudentAbility class="r_box" :userid="userid" :courseid="courseid"></StudentAbility>
+ <!-- <div class="second">
+ <div class="sub_title"><span>项目详细报告</span></div>
+ <CourseDetailReport class="r_box"></CourseDetailReport>
+ <div class="sr_third">
+ <div class="sub_title"><span>阶段完成情况</span></div>
+ <CourseRadar class="r_box" :userid="userid" :courseid="courseid"></CourseRadar>
+ <div class="sub_title"><span>阶段评价平均分</span></div>
+ <CoursePie class="r_box" :userid="userid" :courseid="courseid"></CoursePie>
+ <div style="height:100%;min-width: 1100px;">
+ <worksDetail3 class="r_box" :cid="courseid" :uid="userid" :ooid="scoid"></worksDetail3>
+import StudentInfo from "./report/studentInfo.vue";
+import CourseInfo from "./report/courseInfoGM.vue";
+import StudentAbility from "./report/studentAbilityGM.vue";
+import CourseRadar from "./report/courseRadar.vue";
+import CoursePie from "./report/coursePieGM.vue";
+import CourseDetailReport from "./report/courseDetailReport.vue";
+import worksDetail3 from "./worksDetail3GM.vue";
+ props: ["checkCourse", "checkStudent","oid"],
+ components: {
+ StudentInfo,
+ CourseInfo,
+ StudentAbility,
+ CourseRadar,
+ CoursePie,
+ CourseDetailReport,
+ worksDetail3
+ userid: "",
+ courseid: "",
+ scoid:"",
+ checkStudent(newValue, oldValue) {
+ this.userid = this.checkStudent;
+ this.courseid = this.checkCourse;
+ this.scoid = this.oid;
+.sr_head {
+ font-size: 30px;
+ font-weight: bolder;
+ margin-bottom: 15px;
+.sr_body {
+ height: calc(100% - 55px);
+.sr_box {
+ min-width: 1100px;
+ min-height: 700px;
+.sr_first {
+ width: calc(100% / 3.75);
+.sr_second {
+ width: calc(100% / 3.75 * 2);
+.sr_third {
+ width: calc(100% / 3.75 * 0.75);
+.sr_first,
+.sr_second,
+.sr_first .first,
+.sr_first .second,
+.sr_second .first,
+.sr_second .second,
+.sr_third .first,
+.sr_third .second {
+ border-radius: 10px;
+ width: 98%;
+.sr_first .first {
+ height: calc(100% / 3 * 1.1);
+.sr_first .second {
+ height: calc(100% / 3 * 1.9);
+.sr_second .first {
+ /* height: calc(100% / 3.5 * 2); */
+ height: calc(100%);
+ /* margin-bottom: 20px; */
+.sr_second .second {
+ /* height: calc(100% / 3.5 * 1.5); */
+.sr_third .first {
+ height: calc(100% / 2.25 * 1.25);
+ height: calc(100% / 2.25);
+.sub_title {
+ width: 200px;
+.sub_title span {
+.sub_title::after {
+ content: "";
+ width: 20px;
+ height: 20px;
+ background-image: url(../../../assets/report/left_coinGM.png);
+ background-size: 100% 100%;
+.sub_title::before {
+ background-image: url(../../../assets/report/right_coinGM.png);
+ height: calc(100% - 40px);
@@ -0,0 +1,1014 @@
+ <div class="cp_title" v-if="false">
+ <span>{{ this.dataJson.title }}</span>
+ <span>{{ "教师姓名:" + this.dataJson.uname }}</span>
+ <div class="data_body" v-if="false">
+ <div class="data_c">
+ <WorkData :workJson="workJson" :chapters="chapters"></WorkData>
+ <ProblelmData
+ :problemJson="problemJson"
+ :chapters="chapters"
+ ></ProblelmData>
+ <ToolsData :toolsJson="toolsJson" :tools="tools"></ToolsData>
+ <ScoreData :scoreJson="scoreJson"></ScoreData>
+ <div class="sd_class" v-if="false">
+ <div class="sd_tTitle">课堂表现</div>
+ <div class="wd_class_body">
+ <div class="wd_module">
+ <div class="sd_module_content">
+ class="sd_module_children"
+ padding: 0 25px;
+ <span>课程人数:共100人,已完成人数{{ randomNum(50, 100) }}人</span>
+ <div class="sd_module_children">
+ <span class="s">课堂时长</span>
+ <span class="s2">
+ <span>{{ randomNum(5, 15) }}</span
+ >次 <span>{{ randomNum(1, 60) }}</span
+ >分 <span>{{ randomNum(1, 59) }}</span
+ >秒
+ <span>已经击败99%教师</span>
+ <span class="s">课堂节数</span>
+ <span>{{ randomNum(5, 20) }}</span
+ >节
+ <div style="width: 45%; position: relative">
+ id="gauge_canvas"
+ bottom: 25px;
+ font-size: 20px;
+ padding: 0 100px;
+ <span>教师为中心</span>
+ <span>学生为中心</span>
+ <span class="s">课堂互动</span>
+ <span>{{ randomNum(10, 20) }}</span
+ >次
+ <span class="s">课堂生成</span>
+ <span>{{ randomNum(7, 15) }}</span
+ <span class="s">自主活动</span>
+ >分 <span>{{ randomNum(10, 59) }}</span
+ <div class="wd_bottom">
+ <div class="bdiv">
+ id="line_canvas"
+ id="bar_canvas"
+ <!-- <img src="../../../assets/data/tu1.png" alt style="width:100%" /> -->
+ <div class="sd_class">
+ <div class="sd_tTitle" v-if="false">班级学生能力分析</div>
+ <div style="background: #fff; padding: 10px 0">
+ <div class="sd_person_button" v-if="false">
+ <span @click="setType(1)" :class="{ active: type == 1 }">语文</span>
+ <span @click="setType(2)" :class="{ active: type == 2 }">数学</span>
+ <span @click="setType(3)" :class="{ active: type == 3 }">英语</span>
+ <span @click="setType(4)" :class="{ active: type == 4 }"
+ >信息科技</span
+ <span @click="setType(5)" :class="{ active: type == 5 }">艺术</span>
+ <span @click="setType(6)" :class="{ active: type == 6 }"
+ >跨学科素养</span
+ <div style="display: flex; flex-wrap: wrap">
+ <div style="width: 50%; height: 500px" v-if="false">
+ id="sunburst_canvas"
+ id="scatter_canvas"
+ <div style="width: 100%">
+ <WorksDetail2 :cid="cid" :uid="uid" :ooid="ooid"></WorksDetail2>
+ <!-- <el-table
+ :height="500"
+ <el-table-column prop="name" label="姓名" min-width="20%" align="center"></el-table-column>
+ <el-table-column prop="number" label="学号" min-width="20%" align="center"></el-table-column>
+ <el-table-column prop="class" label="班级" min-width="20%" align="center"></el-table-column>
+ <el-table-column prop="score" label="分数" min-width="20%" align="center"></el-table-column>
+ <template>
+ <el-button type="primary" size="small">查看</el-button>
+ </el-table>-->
+ <!-- <img src="../../../assets/data/tu3.png" alt style="width:50%" />
+ <img src="../../../assets/data/tu2.png" alt style="width:50%" />-->
+ <!-- <img src="../../../assets/data/tu4.png" alt style="width:100%" /> -->
+import WorkData from "./data/workData";
+import ProblelmData from "./data/problelmData";
+import ToolsData from "./data/toolsData";
+import ScoreData from "./data/scoreData";
+import WorksDetail2 from "./worksDetail2GM";
+ props: ["dataJson", "cid", "uid", "ooid"],
+ WorkData,
+ ProblelmData,
+ ToolsData,
+ ScoreData,
+ WorksDetail2,
+ tableData: [
+ name: "卓曾向",
+ number: "202205311",
+ class: "三年级七班",
+ score: "100",
+ name: "王志成",
+ number: "202205411",
+ class: "四年级一班",
+ score: "99",
+ name: "李沛郡",
+ number: "202205361",
+ class: "三年级六班",
+ score: "89",
+ name: "李世昌",
+ number: "202205321",
+ class: "三年级二班",
+ score: "88",
+ name: "李佳薇",
+ number: "202205471",
+ class: "四年级七班",
+ score: "69",
+ name: "叶玉卿",
+ number: "202205671",
+ class: "六年级七班",
+ score: "78",
+ name: "冯翊泽",
+ number: "202205571",
+ class: "五年级七班",
+ score: "68",
+ { name: "乐舞", number: "202205372", class: "三年级七班", score: "77" },
+ name: "关晓辉",
+ number: "202205475",
+ name: "谭晶陈",
+ number: "202205271",
+ class: "二年级七班",
+ score: "79",
+ Course: this.dataJson,
+ courseId: "",
+ tools: [],
+ chapters: [],
+ workJson: [], //多少人提交作业数据
+ scoreJson: [], //量规评分数据
+ problemJson: [], //问答数据
+ toolsJson: [], //工具数据
+ type: 6,
+ chartObj4: null,
+ chartObj5: null,
+ gaugeOption: {
+ type: "gauge",
+ radius: "100%",
+ axisLine: {
+ width: 10,
+ color: [
+ [
+ 100,
+ type: "linear",
+ x: 0,
+ y: 0,
+ x2: 0,
+ y2: 1,
+ colorStops: [
+ offset: 1,
+ color: "rgb(240,50,243)", // 0% 处的颜色
+ offset: 0,
+ color: "rgb(37,61,249)", // 100% 处的颜色
+ global: false, // 缺省为 false
+ pointer: {
+ width: 8,
+ length: "65%",
+ color: "auto",
+ axisLabel: {
+ distance: 20,
+ fontSize: 20,
+ detail: {
+ valueAnimation: true,
+ formatter: "{value}",
+ value: 60,
+ name: "課堂類型",
+ title: {
+ offsetCenter: [0, "80%"],
+ fontSize: 30,
+ lineOption: {
+ text: "課堂時間",
+ data: ["課堂時長", "麻吉星時長"],
+ left: "3%",
+ right: "4%",
+ bottom: "3%",
+ containLabel: true,
+ // feature: {
+ // saveAsImage: {},
+ data: ["05-25", "05-26", "05-27", "05-28", "05-29", "05-30", "05-31"],
+ formatter: "{value}M",
+ name: "課堂時長",
+ type: "line",
+ data: [10, 20, 30, 11, 15, 16, 18],
+ name: "麻吉星時長",
+ data: [22, 16, 18, 15, 19, 28, 17],
+ barOption: {
+ text: "任教班級",
+ legend: {},
+ data: ["中山五年5班", "中山五年5班"],
+ name: "圖片",
+ data: [220, 150],
+ name: "視頻",
+ data: [120, 132],
+ name: "互動",
+ data: [110, 132],
+ name: "投票",
+ name: "挑戰",
+ data: [221, 110],
+ name: "評估",
+ data: [120, 133],
+ name: "棄權",
+ data: [105, 132],
+ sunburstOption: {
+ radius: [20, "90%"],
+ color: "#fff",
+ scatterOption: {
+ data: ["问题意识", "科学探究", "实践创新", "工程思维", "学习反思"],
+ show: false,
+ name: "能力指标",
+ name: "分值",
+ minInterval: 1,
+ left: 100,
+ bottom: 50,
+ right: 100,
+ top: 70,
+ color: "rgb(222,126,62)",
+ top: "0%",
+ name: "学生百分数(单位:%)",
+ type: "scatter",
+ symbolSize: function (val) {
+ return val[2] * 1.5;
+ color: "rgb(222,126,62,.5)",
+ data: [[1, 2, 50]],
+ fontSize: 16,
+ formatter: function (a, b, c) {
+ return a.data[2];
+ animationDelay: function (idx) {
+ return idx * 5;
+ cid: this.courseId,
+ .get(this.$store.state.api + "getWorkData", params)
+ let _data = res.data[1]; //所有作业数据
+ let _data2 = res.data[2]; //问答提交数据
+ let _data3 = res.data[3]; //工具使用数据
+ let workJson = [];
+ let scoreJson = [];
+ let problemJson = [];
+ let toolsJson = [];
+ _data.forEach((item, index) => {
+ workJson.push({ stage: item.stage, userid: item.userid });
+ scoreJson.push({ rate: JSON.parse(item.rate) });
+ _data2.forEach((item, index) => {
+ problemJson.push({ stage: item.chapterid });
+ _data3.forEach((item, index) => {
+ toolsJson.push({ tools: item.tools, count: item.count });
+ this.workJson = workJson;
+ this.scoreJson = scoreJson;
+ this.problemJson = problemJson;
+ this.toolsJson = toolsJson;
+ this.$forceUpdate();
+ this.$el.querySelector("#gauge_canvas")
+ this.gaugeOption.series[0].data[0].value = this.randomNum(10, 100);
+ this.$el.querySelector("#line_canvas")
+ var _array1 = [];
+ var _array2 = [];
+ for (let index = 0; index < 7; index++) {
+ _array1.push(this.randomNum(40, 50));
+ _array2.push(this.randomNum(40, 50));
+ this.lineOption.series[0].data = _array1;
+ this.lineOption.series[1].data = _array2;
+ this.$el.querySelector("#bar_canvas")
+ var _arraybar1 = [];
+ var _arraybar2 = [];
+ var _arraybar3 = [];
+ var _arraybar4 = [];
+ var _arraybar5 = [];
+ var _arraybar6 = [];
+ var _arraybar7 = [];
+ _arraybar1.push(this.randomNum(20, 70));
+ _arraybar2.push(this.randomNum(20, 70));
+ _arraybar3.push(this.randomNum(20, 70));
+ _arraybar4.push(this.randomNum(20, 70));
+ _arraybar5.push(this.randomNum(20, 70));
+ _arraybar6.push(this.randomNum(20, 70));
+ _arraybar7.push(this.randomNum(20, 70));
+ this.barOption.series[0].data = _arraybar1;
+ this.barOption.series[1].data = _arraybar2;
+ this.barOption.series[2].data = _arraybar3;
+ this.barOption.series[3].data = _arraybar4;
+ this.barOption.series[4].data = _arraybar5;
+ this.barOption.series[5].data = _arraybar6;
+ this.barOption.series[6].data = _arraybar7;
+ const chartObj4 = this.$echarts.init(
+ this.$el.querySelector("#sunburst_canvas")
+ this.sunburstOption.series.data = [
+ name: "学习反思能力",
+ value: 15,
+ children: [
+ name: "终生学习",
+ value: this.randomNum(1, 5),
+ name: "自我进步",
+ name: "自我反思",
+ name: "工程思维能力",
+ value: this.randomNum(1, 15),
+ name: "实践创新能力",
+ value: this.randomNum(5, 15),
+ name: "科学探究能力",
+ name: "问题意识",
+ const chartObj5 = this.$echarts.init(
+ this.$el.querySelector("#scatter_canvas")
+ var scatterArray = [];
+ for (var i = 0; i < 5; i++) {
+ scatterArray[i] = [];
+ var a = 0;
+ for (var j = 0; j < 5; j++) {
+ var b = this.randomNum(0, 20);
+ a += b;
+ if (j == 4) {
+ scatterArray[i].push(100 - a);
+ scatterArray[i].sort(function () {
+ return Math.random() - 0.5;
+ scatterArray[i].push(b);
+ var _arrayScatter = [];
+ for (var j = 1; j < 6; j++) {
+ var x = i;
+ var y = j;
+ // var z = this.randomNum(0, 100);
+ var z = scatterArray[i][j - 1];
+ _arrayScatter.push([x, y, z]);
+ this.scatterOption.series[0].data = _arrayScatter;
+ this.chartObj4 = chartObj4;
+ this.chartObj5 = chartObj5;
+ this.chartObj.setOption(this.gaugeOption);
+ this.chartObj2.setOption(this.lineOption);
+ this.chartObj3.setOption(this.barOption);
+ this.chartObj4.setOption(this.sunburstOption);
+ this.chartObj5.setOption(this.scatterOption);
+ this.tableData = this.tableData.sort(function () {
+ // 使用监听的方式,监听数据的变化
+ dataJson(val) {
+ this.Course = val;
+ this.courseId = val.courseId;
+ var _chapters = JSON.parse(val.chapters);
+ this.chapters = [];
+ this.tools = [];
+ _chapters.forEach((element) => {
+ this.chapters.push({
+ name: element.dyName,
+ id: element.chapterInfo[0].chapterid,
+ if (element.chapterInfo[0].toolChoose) {
+ this.tools.push(...element.chapterInfo[0].toolChoose);
+ this.tools.push(...[1, 1, 1, 1, 2, 2, 2, 2]);
+ this.tools = Array.from(new Set(this.tools)).sort();
+ this.courseId = this.dataJson.courseId;
+ var _chapters = JSON.parse(this.dataJson.chapters);
+.cp_title {
+ font-size: 24px;
+.data_body {
+.data_body .data_c {
+ width: 50%;
+.sd_class {
+.sd_tTitle {
+ background: rgb(199, 217, 212);
+ padding: 10px 10px;
+ border: 1px solid rgb(165, 182, 177);
+ font-size: 18px;
+ font-weight: 500;
+ margin: 20px 0;
+ font-weight: 600;
+ border-bottom: 2px solid rgb(30, 146, 255);
+ color: rgb(30, 146, 255);
+.sd_module_content {
+ width: calc(50% / 2);
+.sd_module_content:nth-child(1) .sd_module_children:nth-child(1) {
+ background: rgb(68, 228, 116);
+.sd_module_content:nth-child(1) .sd_module_children:nth-child(2) {
+ background: rgb(244, 132, 101);
+.sd_module_content:nth-child(1) .sd_module_children:nth-child(3) {
+ background: rgb(99, 205, 156);
+.sd_module_content:nth-child(3) .sd_module_children:nth-child(1) {
+ background: rgb(253, 183, 184);
+.sd_module_content:nth-child(3) .sd_module_children:nth-child(2) {
+ background: rgb(60, 174, 254);
+.sd_module_content:nth-child(3) .sd_module_children:nth-child(3) {
+ background: rgb(61, 223, 234);
+.sd_module_children {
+ height: 130px;
+.sd_module_children + .sd_module_children {
+ margin-top: 20px;
+.sd_module_children .s {
+ top: 10px;
+ left: 10px;
+.sd_module_children .s2 span {
+ font-size: 45px;
+ margin-right: 3px;
+.wd_class_body {
+ background: rgb(242, 242, 242);
+ padding: 20px 0;
+.wd_module {
+.wd_bottom {
+ height: 500px;
+ margin: 20px 0 0 0;
+ margin: 20px auto 0;
+.wd_bottom .bdiv {
+ width: 48%;
@@ -0,0 +1,2780 @@
+ <div class="pb_content" style="background: unset">
+ <div class="pb_content_body" style="
+ padding: 25px 0 0;
+ ">
+ <!-- <div class="student_search">
+ <div>班级筛选</div>
+ <el-select v-model="sClass" placeholder="请选择班级" @change="searchWork">
+ <el-option label="所有班级" value></el-option>
+ v-for="(item, index) in grade"
+ </div>-->
+ <!-- chooseDy
+ chooseTask-->
+ <div>课程筛选</div>
+ <div style="display: flex; width: 90%">
+ <el-select class="r_select" v-model="uname" placeholder="请选择学生" @change="searchWork2">
+ <el-option label="所有学生" value></el-option>
+ <el-option v-for="item in userAarray" :key="item.userid" :label="item.username" :value="item.userid">
+ <el-select v-model="chooseDy" placeholder="请选择阶段" @change="searchWork1">
+ <el-option label="所有阶段" value></el-option>
+ <el-option v-for="(item, index) in dyList" :key="index" :label="item.name" :value="item.id"></el-option>
+ <el-select v-model="chooseTask" placeholder="请选择任务" @change="searchWork2">
+ <el-option label="所有任务" value></el-option>
+ <el-option v-for="(item, index) in dyList[chooseDy]
+ ? dyList[chooseDy].taskList
+ : []" :key="index" :label="item.name" :value="item.id"></el-option>
+ <div class="pb_content_body">
+ <el-table ref="table" :data="tableData" border :height="tableHeight" :fit="true" v-loading="isLoading"
+ style="width: 100%" :header-cell-style="{ background: '#f1f1f1' }" :row-class-name="tableRowClassName" stripe>
+ <el-table-column prop="sName" label="姓名" min-width="15" align="center"></el-table-column>
+ <el-table-column prop="class" label="班级" min-width="20" align="center">
+ <div>{{ scope.row.class ? scope.row.class : "暂无班级" }}</div>
+ <el-table-column prop="course" label="项目" min-width="20" align="center" show-overflow-tooltip>
+ <el-table-column prop="course" label="阶段" min-width="20" align="center" show-overflow-tooltip>
+ {{ dyList.length > 0 ? dyList[scope.row.stage].name : "" }}
+ <el-table-column prop="course" label="任务" min-width="20" align="center" show-overflow-tooltip>
+ {{
+ dyList.length > 0
+ ? dyList[scope.row.stage].taskList[scope.row.task]
+ ? dyList[scope.row.stage].taskList[scope.row.task].name
+ : ""
+ }}
+ <el-table-column prop="time" label="时间" width="100px" align="center"></el-table-column>
+ <el-table-column label="操作" width="200px">
+ <el-button type="primary" size="small" class="btnClassGM" @click="
+ lookWork(
+ scope.row.id,
+ scope.row.userid,
+ scope.row.stage,
+ scope.row.task
+ )
+ ">查看作业</el-button>
+ <!-- <el-button
+ @click="lookData(scope.row.userid)"
+ >生成报告</el-button
+ >-->
+ <el-button class="btnClassGM" type="primary" size="small" @click="
+ lookWork2(
+ ">导出报告</el-button>
+ class="de_button"
+ @click="deleteWork(scope.row.id)"
+ >删除</el-button>-->
+ <el-dialog title="查看作业" :visible.sync="dialogVisible3" :append-to-body="true" :before-close="handleClose"
+ width="100%" class="dialog_diy2 max_diy" :class="{ fullStyle: full }">
+ <div slot="title" class="header-title">
+ <div style="color: #fff">查看作业</div>
+ <div style="position: absolute; top: 14px; right: 50px">
+ <img src="../../../assets/full.png" style="height: 14px; cursor: pointer" alt="" @click="fullTools" />
+ <div class="zyBoxC">
+ <div class="courseTitle" v-if="allWorks.course">
+ <div class="txName">
+ <div class="tx"><img :src="tx" alt="" /></div>
+ <div>{{ allWorks.sName }}</div>
+ <div>{{ allWorks.course }}</div>
+ <div class="cBox">
+ <div class="pb_left">
+ <el-tooltip class="cTitle" effect="light" :content="allWorks.course" placement="top">
+ <div class="ml">目录</div>
+ <div class="cru_selectBox">
+ <div v-for="(dy, dyIndex) in dyList2" :key="dyIndex">
+ <div class="blue_box_one" @click="isOpen(dyIndex)">
+ <div>第{{ dy.id + 1 }}阶段</div>
+ <div>{{ dy.name }}</div>
+ <div class="twoChild" :class="{
+ navActive: dy.isOpen,
+ }">
+ <div class="navChild" v-for="(nav, navIndex) in dy.taskList" :key="navIndex">
+ <div class="navTask" @click="openTask(dy.id, nav.id)" :class="{
+ openTaskActive:
+ nav.id == taskCount &&
+ dy.id + '-' + nav.id == navId &&
+ dy.id == stageIndex,
+ <div class="vedioNav" :class="{
+ isClick:
+ }" style="margin: 0">
+ 任务{{ navIndex + 1 }}
+ <el-tooltip class="navTaskname item" effect="light" :content="nav.name" placement="top">
+ <div>{{ nav.name }}</div>
+ <div class="shuBox" v-if="worksDetail.length" :class="{ fullBox: full }">
+ <div class="allBox" v-for="(sin, sIndex) in sInfo" :key="sIndex">
+ <div class="zyBox" v-if="sin.course" :class="{ fullZyBox: full }">
+ <div class="top">
+ <div class="jdName">
+ (sin.stage + 1) +
+ dyList[sin.stage].name
+ <div class="taskName" style="width: 100%; justify-content: space-between">
+ <div class="taskName" :id="sin.stage + '-' + sin.task" :scrollindex="sIndex">
+ <div class="task">任务{{ sin.task + 1 }}</div>
+ {{ dyList[sin.stage].taskList[sin.task].name }}
+ <div v-if="worksDetail[sIndex].wpptInfo.length > 0">
+ <el-button class="btnClassGM" type="primary" size="small" @click="openFile(worksDetail[sIndex].wpptInfo[0])">
+ 查看文档</el-button>
+ <div class="contentBox">
+ <div class="left_top" :style="{width:worksDetail[sIndex].eList.length?'45%':'95%'}"
+ v-if="worksDetail[sIndex].img.length > 0">
+ <div class="bigImg" v-if="
+ worksDetail[sIndex].img &&
+ worksDetail[sIndex].img.length
+ <img @click="
+ previewImg(
+ worksDetail[sIndex].img[
+ worksDetail[sIndex].imgIndex
+ ].src
+ " :src="
+ " alt />
+ <div class="thumbnail" v-if="
+ <div v-for="(item, index) in worksDetail[sIndex].img" :key="index" :class="
+ worksDetail[sIndex].imgIndex == index
+ ? 'isClick2'
+ : ''
+ <img :src="item.src" alt @click="worksDetail[sIndex].imgIndex = index" />
+ <div class="work_nopicture" v-else>暂无上传截图</div>
+ v-else-if="worksDetail[sIndex].answerInfo.length > 0">
+ <div class="answerbox">
+ <div style="min-width: 80px">问答标题</div>
+ {{ worksDetail[sIndex].answerInfo[0].answerTitle }}
+ <div class="answerbox1">
+ <div>学生回答</div>
+ {{ worksDetail[sIndex].answerInfo[0].answer }}
+ v-else-if="worksDetail[sIndex].askInfo.length > 0">
+ <div class="a_add_title" style="
+ flex-direction: row;
+ <div style="margin-right: 20px; font-size: 20px">
+ 标题:
+ <div style="font-size: 20px">
+ {{ worksDetail[sIndex].askInfo[0].askTitle }}
+ <div class="a_addBox">
+ <div style="font-size: 16px; color: #c7c7c7">
+ 内容
+ <div class="a_add_box" v-for="(item1, index1) in worksDetail[sIndex]
+ .askInfo[0].askCount" :key="index1">
+ <div class="a_add_head">
+ <div style="display: flex">
+ {{ index1 + 1 + "、" }}
+ 题目:{{
+ worksDetail[sIndex].askInfo[0].askJson[
+ index1
+ ].askstitle
+ <div class="a_add_body">
+ <div class="a_add_input">
+ <el-radio-group v-model="
+ worksDetail[sIndex].askInfo[0].radio[
+ ]
+ <el-radio v-for="(item2, checkIndex) in worksDetail[
+ sIndex
+ ].askInfo[0].askJson[index1].checkList" :key="checkIndex" :label="checkIndex"
+ disabled class="redioStyle"><span v-html="item2"></span></el-radio>
+ </el-radio-group>
+ v-else-if="worksDetail[sIndex].wpptInfo.length > 0">
+ <div style="height: 238px" @click="openFile(worksDetail[sIndex].wpptInfo[0])">
+ <div @click="openFile(worksDetail[sIndex].wpptInfo[0])" style="
+ height: 300px;
+ z-index: 999;
+ "></div>
+ <pdf v-if="showPDF" :pdfUrl="worksDetail[sIndex].wpptInfo[0]"
+ style="width: 100%; height: 520px; overflow: auto"></pdf>
+ <iframe v-else :src="worksDetail[sIndex].wpptInfo[0]" frameborder="0" width="100%"
+ height="100%"></iframe>
+ <div class="right_top" v-show="worksDetail[sIndex].eList.length">
+ <div class="ech">
+ <img src="../../../assets/icon/pj/ech.png" alt="" />
+ <div class="data_body">
+ <div class="echart charts_canvas" style="
+ margin: 0 0 0 1rem;
+ <div class="right_score" :class="{ rightScoreFullBox: full }">
+ <div class="sd_score" style="
+ box-shadow: none;
+ <div class="worksTime">
+ 作业提交时间:<span style="width: auto">{{ worksDetail[sIndex].time }}
+ <div class="ech" style="margin-left: 23px">
+ <img src="../../../assets/icon/pj/score.png" alt="" />
+ <div style="height: 80%;overflow: auto;">
+ <div class="score_box" v-for="(item, index) in worksDetail[sIndex].eList" :key="index">
+ <el-tooltip class="item" effect="dark" :content="item.value" placement="top-start">
+ <span>{{ item.value }}</span>
+ <el-rate class="rate_size" style="min-width: 120px"
+ v-model="worksDetail[sIndex].rateList[item.value]" @change="getStar(sIndex)"></el-rate>
+ <div class="buttonCss">
+ <el-button type="primary" size="small" @click="updatePj" class="btnClassGM">保存评分</el-button>
+ <el-pagination background layout="prev, pager, next" :page-size="10" :total="total" v-if="page"
+ @current-change="handleCurrentChange"></el-pagination>
+ <el-dialog :visible.sync="pictureDialog" size="tiny">
+ <img width="100%" :src="dialogImageUrl" alt />
+ <el-dialog title="项目评分" :visible.sync="dataVisible" :append-to-body="true" width="1100px"
+ :before-close="handleClose" class="dialog_diy">
+ <div class="a_addBox2">
+ <StudentData :studentInfo="studentInfo"></StudentData>
+ <el-button @click="dataVisible = false" class="cancel_button">关 闭</el-button>
+ <el-dialog title="查看选择题" :visible.sync="dialogVisible4" :append-to-body="true" width="800px"
+ <div style="font-size: 20px">{{ askJson.askTitle }}</div>
+ <div style="font-size: 16px; color: #c7c7c7">内容</div>
+ <div class="a_add_box" v-for="(item, index) in askJson.askJson" :key="index">
+ {{ index + 1 + "、" }}
+ <div>题目:{{ item.askstitle }}</div>
+ <el-radio-group v-model="askJson.radio[index]">
+ <el-radio v-for="(item3, checkIndex1) in item.checkList" :key="checkIndex1" :label="checkIndex1"
+ class="redioStyle" disabled>{{ item3 }}</el-radio>
+ <el-button type="primary" @click="dialogVisible4 = false" class="cancel_button">关 闭</el-button>
+ <el-dialog title="文件预览" :visible.sync="dialogVisible6" width="100%" :before-close="handleClose" class="full_diy"
+ :append-to-body="true">
+ <div style="color: #fff">文件预览</div>
+ <pdf v-if="showPDF" :pdfUrl="pptImgUrl" style="width: 100%; height: 520px; overflow: auto"></pdf>
+ <iframe v-else :src="pptImgUrl" frameborder="0" width="100%" height="600"></iframe>
+import StudentData from "./studentData";
+ StudentData,
+ props: ["cid", "uid", "ooid"],
+ id: this.cid,
+ userid: this.uid,
+ oid: this.ooid,
+ dialogImageUrl: "",
+ pictureDialog: false,
+ dialogVisible1: false,
+ dialogVisible2: false,
+ dialogVisible3: false,
+ dialogVisible4: false,
+ dataVisible: false,
+ full: true,
+ isStar: 0,
+ studentInfo: {},
+ courseByUser: "诗词中的植物",
+ userName: "林点",
+ answerName: "宿赞公房",
+ studentAnswer: "雨荒深院菊,霜倒半池莲.唐杜甫《宿赞公房》",
+ commentCount: 0,
+ publicIndex: 0,
+ allWorks: [],
+ playerOptions: {
+ playbackRates: [0.7, 1.0, 1.5, 2.0], //播放速度
+ autoplay: false, //如果true,浏览器准备好时开始回放。
+ muted: false, // 默认情况下将会消除任何音频。
+ loop: false, // 导致视频一结束就重新开始。
+ preload: "auto", // 建议浏览器在<video>加载元素后是否应该开始下载视频数据。auto浏览器选择最佳行为,立即开始加载视频(如果浏览器支持)
+ language: "zh-CN",
+ aspectRatio: "16:9", // 将播放器置于流畅模式,并在计算播放器的动态大小时使用该值。值应该代表一个比例 - 用冒号分隔的两个数字(例如"16:9"或"4:3")
+ fluid: true, // 当true时,Video.js player将拥有流体大小。换句话说,它将按比例缩放以适应其容器。
+ sources: [
+ type: "video/mp4", //这里的种类支持很多种:基本视频格式、直播、流媒体等,具体可以参看git网址项目 || "video/ogg"|| "video/webm"
+ src: "", //url地址require("../../../assets/media/aaa.mp4")
+ // poster: require("../../../assets/tu31.png"), //你的封面地址
+ // poster: dataRes.imgUrl, //你的封面地址
+ notSupportedMessage: "此视频暂无法播放,请稍后再试", //允许覆盖Video.js无法播放媒体源时显示的默认信息。
+ controlBar: {
+ timeDivider: true, //当前时间和持续时间的分隔符
+ durationDisplay: true, //显示持续时间
+ remainingTimeDisplay: false, //是否显示剩余时间功能
+ fullscreenToggle: true, //全屏按钮
+ playerO: {},
+ commentName: "谭子松",
+ commentTime: "2021/2/5",
+ commentAnswer:
+ "作为家长我很高兴看到孩子的进步,希望这个进步只是一个开始,在新学期能够继续延续,这样才能不负老师的期望",
+ uploadBoolean: false,
+ studentMessage: [],
+ subject: "",
+ sClass: "",
+ stageIndex: "",
+ taskCount: "",
+ navId: "",
+ chooseDy: "",
+ uname: "",
+ chooseTask: "",
+ subjectJuri: [],
+ projectJuri: [],
+ pptImgUrl: "",
+ grade: [],
+ mr: require("../../../assets/icon/wheel.png"),
+ tx: require("../../../assets/avatar.png"),
+ projectchoose: "",
+ scopeId: "",
+ thumbnail: [],
+ rateList: {
+ ca: 0,
+ sia: 0,
+ eta: 0,
+ pia: 0,
+ lra: 0,
+ content: "",
+ rateParams: [],
+ worksDetail: [],
+ suserId: "",
+ sInfo: {},
+ chapInfo: [],
+ showPDF: false,
+ dialogVisible6: false,
+ vedio: [],
+ file: [],
+ tType: 0,
+ chartObj: [],
+ ooption: [],
+ name: "量规评分",
+ radius: "70%",
+ { value: 0, name: "意识能力" },
+ { value: 0, name: "科学探究能力" },
+ { value: 0, name: "实践创新能力" },
+ { value: 0, name: "学习反思能力" },
+ { value: 0, name: "工程思维能力" },
+ shadowBlur: 10,
+ shadowOffsetX: 0,
+ shadowColor: "rgba(0, 0, 0, 0.5)",
+ formatter: "{d}%",
+ inside: true,
+ position: "inner",
+ labelLine: { show: false },
+ // 雷达图的数据
+ name: "能力图", // tooltip中的标题
+ askJson: {},
+ dyList2: [],
+ previewImg(url) {
+ this.$hevueImgPreview(url);
+ lookData(uid) {
+ uid: uid,
+ cid: this.id,
+ .get(this.$store.state.api + "selectWorksDetail", params)
+ this.studentInfo = res.data[0][0];
+ this.dataVisible = true;
+ this.getWorks();
+ lookWork(id, uid, stage, task) {
+ // this.scopeId = id;
+ stage: stage,
+ task: task,
+ .get(this.$store.state.api + "selectWorksDetail3", params)
+ this.sInfo = res.data[0];
+ var chapters = [],
+ eList = [],
+ _ooption = [],
+ _rate = [],
+ _rateList = [];
+ var worksDetail = res.data[1];
+ // this.scopeId = res.data[2][0].id;
+ // var scopeId = res.data[2][0].id;
+ var askInfo = res.data[3];
+ var answerInfo = res.data[4];
+ var pptInfo = res.data[5];
+ var workJson = [];
+ for (var k = 0; k < res.data[0].length; k++) {
+ this.allWorks = res.data[0][k];
+ this.chapInfo.push(JSON.parse(res.data[0][k].chapters));
+ chapters.push(JSON.parse(res.data[0][k].chapters));
+ if (!chapters[0][res.data[0][k].stage].chapterInfo[0].taskJson[
+ res.data[0][k].task
+ ]) {
+ continue
+ workJson.push({
+ imgIndex: 0,
+ eList: [],
+ rateList: {},
+ askInfo: [],
+ answerInfo: [],
+ wpptInfo: [],
+ scopeId: res.data[0][k].id,
+ stagetask: "",
+ time: "",
+ eList =
+ chapters[0][res.data[0][k].stage].chapterInfo[0].taskJson[
+ ].eList;
+ workJson[k].time = res.data[0][k].time;
+ workJson[k].stagetask =
+ res.data[0][k].stage + "-" + res.data[0][k].task;
+ if (eList && eList.length) {
+ _ooption = [];
+ workJson[k].eList = eList;
+ for (var i = 0; i < eList.length; i++) {
+ _ooption.push({ value: 0, name: eList[i].value });
+ workJson[k].rateList[eList[i].value] = 0;
+ workJson[k].rateList.content = "";
+ this.ooption[k] = _ooption;
+ // _ooption = [];
+ // workJson[k].eList = [
+ // { value: "意识能力", detail: "", score: 5 },
+ // { value: "科学探究能力", detail: "", score: 5 },
+ // { value: "实践创新能力", detail: "", score: 5 },
+ // { value: "学习反思能力", detail: "", score: 5 },
+ // { value: "工程思维能力", detail: "", score: 5 },
+ // for (var i = 0; i < workJson[k].eList.length; i++) {
+ // _ooption.push({ value: 0, name: workJson[k].eList[i].value });
+ // workJson[k].rateList[workJson[k].eList[i].value] = 0;
+ // workJson[k].rateList.content = "";
+ // this.ooption[k] = [
+ // { value: 0, name: "意识能力" },
+ // { value: 0, name: "科学探究能力" },
+ // { value: 0, name: "实践创新能力" },
+ // { value: 0, name: "学习反思能力" },
+ // { value: 0, name: "工程思维能力" },
+ if (res.data[0][k].rate && eList && eList.length) {
+ _rate[k] = JSON.parse(res.data[0][k].rate);
+ _rateList[k] = Object.keys(JSON.parse(res.data[0][k].rate));
+ for (var i = 0; i < _rateList[k].length; i++) {
+ var _c = Object.keys(workJson[k].rateList);
+ if (_c.indexOf(_rateList[k][i]) != -1) {
+ workJson[k].rateList[_rateList[k][i]] =
+ _rate[k][_rateList[k][i]];
+ for (var i = 0; i < this.ooption[k].length; i++) {
+ if (_rateList[k].indexOf(this.ooption[k][i].name) != -1) {
+ this.ooption[k][i].value = _rate[k][this.ooption[k][i].name];
+ _rate[k] = [];
+ _rateList[k] = [];
+ for (var i = 0; i < worksDetail.length; i++) {
+ res.data[0][k].stage == worksDetail[i].stage &&
+ res.data[0][k].task == worksDetail[i].task
+ workJson[k].img.push({ src: worksDetail[i].content, id: i });
+ for (var i = 0; i < askInfo.length; i++) {
+ res.data[0][k].stage == askInfo[i].stage &&
+ res.data[0][k].task == askInfo[i].task
+ const element = askInfo[i];
+ let a = JSON.parse(element.content)[0];
+ let b = a.anwer.split(",");
+ let c = [];
+ for (var j = 0; j < b.length; j++) {
+ c.push(parseInt(b[j]));
+ a.askJson.radio = c;
+ a.askJson.time = element.time;
+ workJson[k].askInfo.push(a.askJson);
+ for (var i = 0; i < pptInfo.length; i++) {
+ res.data[0][k].stage == pptInfo[i].stage &&
+ res.data[0][k].task == pptInfo[i].task
+ var a = ["PPT", "PPTX", "XLSX", "XLS", "DOC", "DOCX"];
+ a.indexOf(
+ pptInfo[i].content
+ .split(".")
+ pptInfo[i].content.split(".").length - 1
+ ].toLocaleUpperCase()
+ var a =
+ "https://view.officeapps.live.com/op/view.aspx?src=" +
+ pptInfo[i].content;
+ workJson[k].wpptInfo.push(a);
+ this.showPDF = false;
+ } else if (
+ ].toLocaleUpperCase() == "PDF"
+ workJson[k].wpptInfo.push(pptInfo[i].content);
+ this.showPDF = true;
+ for (var i = 0; i < answerInfo.length; i++) {
+ res.data[0][k].stage == answerInfo[i].stage &&
+ res.data[0][k].task == answerInfo[i].task
+ const element = answerInfo[i];
+ workJson[k].answerInfo.push(JSON.parse(element.content)[0]);
+ this.worksDetail = workJson;
+ this.courseDetail = res.data[0][0];
+ this.$forceUpdate;
+ this.dialogVisible3 = true;
+ setTimeout(() => {
+ for (var p = 0; p < res.data[0].length; p++) {
+ if (!this.ooption[p]) {
+ this.chartObj[p] = null;
+ var _ooption = JSON.parse(JSON.stringify(this.ooption[p]));
+ var _option = JSON.parse(JSON.stringify(this.radarOption));
+ _option.radar.indicator = [];
+ _option.series[0].data[0].value = [];
+ for (var i = 0; i < _ooption.length; i++) {
+ _option.radar.indicator.push({
+ name: _ooption[i].name,
+ _option.series[0].data[0].value.push(_ooption[i].value);
+ console.log(_option);
+ this.setChart(_option, p);
+ let _dyList = JSON.parse(JSON.stringify(this.dyList));
+ let _dyList2 = [];
+ let _dyList3 = [];
+ for (var c = 0; c < _dyList.length; c++) {
+ _dyList[c].taskList = [];
+ _dyList2.push(_dyList[c]);
+ _dyList = JSON.parse(JSON.stringify(this.dyList));
+ for (var c = 0; c < workJson.length; c++) {
+ let _stage = workJson[c].stagetask.split("-")[0];
+ let _task = workJson[c].stagetask.split("-")[1];
+ _dyList2[_stage].taskList.push(_dyList[_stage].taskList[_task]);
+ _dyList2[_stage].taskList;
+ for (var c = 0; c < _dyList2.length; c++) {
+ if (_dyList2[c].taskList.length) {
+ _dyList2[c].isOpen = c === 0 ? true : false;
+ _dyList3.push(_dyList2[c]);
+ this.dyList2 = _dyList3;
+ this.stageIndex = this.dyList2[0].id;
+ this.taskCount = this.dyList2[0].taskList[0].id;
+ this.navId =
+ this.dyList2[0].id + "-" + this.dyList2[0].taskList[0].id;
+ // this.sInfo = res.data[0][0];
+ // this.chapInfo = JSON.parse(res.data[0][0].chapters);
+ // var chapters = JSON.parse(res.data[0][0].chapters);
+ // var worksDetail = res.data[1];
+ // // var askArray = res.data[2];
+ // this.scopeId = res.data[2].length ? res.data[2][0].id : this.sInfo.id;
+ // var askInfo = res.data[3];
+ // var answerInfo = res.data[4];
+ // var workJson = {
+ // imgIndex: 0,
+ // eList: [],
+ // rateList: {},
+ // askInfo: [],
+ // answerInfo: [],
+ // };
+ // var eList =
+ // chapters[this.sInfo.stage].chapterInfo[0].taskJson[this.sInfo.task]
+ // .eList;
+ // var _ooption = [];
+ // if (eList) {
+ // workJson.eList = eList;
+ // for (var i = 0; i < eList.length; i++) {
+ // _ooption.push({ value: 0, name: eList[i].value });
+ // workJson.rateList[eList[i].value] = 0;
+ // workJson.rateList.content = "";
+ // this.ooption = _ooption;
+ // } else {
+ // workJson.eList = [
+ // for (var i = 0; i < workJson.eList.length; i++) {
+ // _ooption.push({ value: 0, name: workJson.eList[i].value });
+ // workJson.rateList[workJson.eList[i].value] = 0;
+ // this.ooption = [
+ // if (this.sInfo.rate) {
+ // var _rate = JSON.parse(this.sInfo.rate);
+ // var _rateList = Object.keys(JSON.parse(this.sInfo.rate));
+ // for (var i = 0; i < _rateList.length; i++) {
+ // var _c = Object.keys(workJson.rateList);
+ // if (_c.indexOf(_rateList[i]) != -1) {
+ // workJson.rateList[_rateList[i]] = _rate[_rateList[i]];
+ // for (var i = 0; i < this.ooption.length; i++) {
+ // if (_rateList.indexOf(this.ooption[i].name) != -1) {
+ // this.ooption[i].value = _rate[this.ooption[i].name];
+ // for (var i = 0; i < worksDetail.length; i++) {
+ // workJson.img.push({ src: worksDetail[i].content, id: i });
+ // for (var i = 0; i < askInfo.length; i++) {
+ // const element = askInfo[i];
+ // let a = JSON.parse(element.content)[0];
+ // let b = a.anwer.split(",");
+ // let c = [];
+ // for (var j = 0; j < b.length; j++) {
+ // c.push(parseInt(b[j]));
+ // a.askJson.radio = c;
+ // a.askJson.time = element.time;
+ // workJson.askInfo.push(a.askJson);
+ // for (var i = 0; i < answerInfo.length; i++) {
+ // const element = answerInfo[i];
+ // workJson.answerInfo.push(JSON.parse(element.content)[0]);
+ // this.worksDetail = workJson;
+ // this.courseDetail = res.data[0][0];
+ // this.$forceUpdate;
+ // this.dialogVisible3 = true;
+ // setTimeout(() => {
+ // var _ooption = JSON.parse(JSON.stringify(this.ooption));
+ // var _option = this.radarOption;
+ // _option.radar.indicator = [];
+ // _option.series[0].data[0].value = [];
+ // for (var i = 0; i < _ooption.length; i++) {
+ // _option.radar.indicator.push({ name: _ooption[i].name, max: 5 });
+ // _option.series[0].data[0].value.push(_ooption[i].value);
+ // console.log(_option);
+ // this.setChart(_option);
+ // }, 0);
+ checkAsk(askJson) {
+ this.askJson = askJson;
+ this.dialogVisible4 = true;
+ setChart(option, k) {
+ console.log(_this.option);
+ const chartObj = _this.$echarts.init(
+ // _this.$el.querySelector("#charts_canvas")
+ document.getElementsByClassName("charts_canvas")[k]
+ _this.chartObj[k] = chartObj;
+ _this.chartObj[k].setOption(option);
+ giveScore() {
+ this.rateList = this.chapInfo[this.publicIndex].rate;
+ this.dialogVisible2 = true;
+ openFile(f) {
+ this.pptImgUrl = f;
+ this.dialogVisible6 = true;
+ .get(this.$store.state.api + "selectClassBySchool", params)
+ this.grade = res.data[0];
+ //获取分组分类
+ getGroup() {
+ let params = {};
+ .get(this.$store.state.api + "getGroup", params)
+ this.subjectJuri = res.data[0];
+ this.projectJuri = res.data[0];
+ searchWork1() {
+ this.chooseTask = "";
+ searchWork2() {
+ fullTools() {
+ this.full = !this.full;
+ //获取作业
+ getWorks() {
+ var mr = this.mr;
+ uname: this.uname,
+ stage: this.chooseDy,
+ task: this.chooseTask,
+ .get(this.$store.state.api + "getCourseWorks3", params)
+ // getCourseDetail() {
+ // const loading = this.$loading.service({
+ // background: "rgba(255, 255, 255, 0.7)",
+ // target: document.querySelector(".student_table"),
+ // console.log(this.id);
+ // let params = {
+ // courseId: this.id,
+ // this.ajax
+ // .get(this.$store.state.api + "selectCourseDetail", params)
+ // .then((res) => {
+ // loading.close();
+ // // this.chapInfo = JSON.parse(res.data[0][0].chapters);
+ // var dyJSON = JSON.parse(res.data[0][0].chapters);
+ // let dyList = [];
+ // for (var i = 0; i < dyJSON.length; i++) {
+ // dyList.push({ name: dyJSON[i].dyName, id: i, taskList: [] });
+ // var a = dyJSON[i].chapterInfo[0].taskJson;
+ // for (var j = 0; j < a.length; j++) {
+ // dyList[i].taskList.push({ name: a[j].task, id: j });
+ // console.log(dyList);
+ // this.dyList = dyList;
+ // // var dyJSON = JSON.parse()
+ // })
+ // .catch((err) => {
+ // console.error(err);
+ handlePictureCardPreview(url) {
+ this.dialogImageUrl = url;
+ this.pictureDialog = true;
+ updatePj() {
+ for (var i = 0; i < this.worksDetail.length; i++) {
+ if (!this.worksDetail[i].eList.length) {
+ this.updateWorks(
+ this.worksDetail[i].scopeId,
+ this.worksDetail[i].rateList,
+ i
+ getStar(i) {
+ const k = i;
+ var _ooption = JSON.parse(JSON.stringify(this.ooption[k]));
+ var _rate = this.worksDetail[i].rateList;
+ var _rateList = Object.keys(this.worksDetail[i].rateList);
+ if (_rateList.indexOf(_ooption[i].name) != -1) {
+ _ooption[i].value = _rate[_ooption[i].name];
+ // var _option = JSON.parse(JSON.stringify(this.radarOption));
+ var _option = this.radarOption;
+ _option.radar.indicator.push({ name: _ooption[i].name, max: 5 });
+ if (this.chartObj && this.chartObj[k]) {
+ // _option.series[0].data = _ooption;
+ this.chartObj[k].setOption(_option);
+ this.setChart(_ooption);
+ updateWorks(scopeId, rateList, i) {
+ rate: rateList,
+ tuid: this.userid,
+ id: scopeId,
+ .get(this.$store.state.api + "updateWorks", params)
+ // var _option = JSON.parse(JSON.stringify(this.option));
+ var _rate = rateList;
+ var _rateList = Object.keys(rateList);
+ if (this.chartObj) {
+ // this.uploadBoolean = false;
+ // this.dialogVisible2 = false;
+ let _k = 0
+ if (this.worksDetail[i].eList.length) {
+ _k = i
+ if (k == _k) {
+ message: "评价成功",
+ this.$message.error("评价失败");
+ switchVideo(media, index) {
+ this.playerO = {};
+ this.playerOptions.poster = "";
+ this.playerOptions.sources[0].src = media;
+ this.playerO = this.playerOptions;
+ onPlayerPlay() { },
+ // this.$store.commit("update", ["userInfo", userInfo]);
+ lookWork2(id, uid, stage, task) {
+ .get(this.$store.state.api + "selectWorksDetail2", params)
+ this.sInfo = res.data[0][0];
+ this.chapInfo = JSON.parse(res.data[0][0].chapters);
+ var chapters = JSON.parse(res.data[0][0].chapters);
+ // var askArray = res.data[2];
+ this.scopeId = res.data[2].length ? res.data[2][0].id : this.sInfo.id;
+ var linkInfo = res.data[5];
+ var workJson = {
+ var eList =
+ chapters[this.sInfo.stage].chapterInfo[0].taskJson[this.sInfo.task]
+ .eList;
+ // ooption: [
+ var _ooption = [];
+ if (eList) {
+ workJson.eList = eList;
+ workJson.rateList[eList[i].value] = 0;
+ workJson.rateList.content = "";
+ this.ooption = _ooption;
+ workJson.eList = [
+ { value: "意识能力", detail: "", score: 5 },
+ { value: "科学探究能力", detail: "", score: 5 },
+ { value: "实践创新能力", detail: "", score: 5 },
+ { value: "学习反思能力", detail: "", score: 5 },
+ { value: "工程思维能力", detail: "", score: 5 },
+ for (var i = 0; i < workJson.eList.length; i++) {
+ _ooption.push({ value: 0, name: workJson.eList[i].value });
+ workJson.rateList[workJson.eList[i].value] = 0;
+ this.ooption = [
+ if (this.sInfo.rate) {
+ var _rate = JSON.parse(this.sInfo.rate);
+ var _rateList = Object.keys(JSON.parse(this.sInfo.rate));
+ for (var i = 0; i < _rateList.length; i++) {
+ var _c = Object.keys(workJson.rateList);
+ if (_c.indexOf(_rateList[i]) != -1) {
+ workJson.rateList[_rateList[i]] = _rate[_rateList[i]];
+ for (var i = 0; i < this.ooption.length; i++) {
+ if (_rateList.indexOf(this.ooption[i].name) != -1) {
+ this.ooption[i].value = _rate[this.ooption[i].name];
+ workJson.img.push({ src: worksDetail[i].content, id: i });
+ workJson.askInfo.push(a.askJson);
+ workJson.answerInfo.push(JSON.parse(element.content)[0]);
+ var _course = `<h1>${this.sInfo.course}</h1>`;
+ (this.sInfo.stage + 1) +
+ this.dyList[this.sInfo.stage].name +
+ "</h2>";
+ var _subtitle =
+ "<h3>" +
+ (this.sInfo.task + 1) +
+ " " +
+ this.dyList[this.sInfo.stage].taskList[this.sInfo.task].name +
+ this.sInfo.sName +
+ "</h3>";
+ // _img += `<div style="margin-top:10px"><div>图片${
+ // }:<a href='${workJson.img[i].src}'>${
+ // workJson.img[i].src
+ // }</a></div>`;
+ _img += `<div style="margin-top:10px"><div>图片${i + 1
+ }</div><img style="max-width:500px" src="${workJson.img[i].src
+ if (workJson.askInfo.length > 0) {
+ var _ask = "<h3>选择题</h3>";
+ for (var i = 0; i < workJson.askInfo.length; i++) {
+ _div.innerHTML = `<h4>标题:${workJson.askInfo[i].askTitle}</h4>`;
+ for (var j = 0; j < workJson.askInfo[i].askJson.length; j++) {
+ _div2.innerHTML = `<h5>第${j + 1}题:${workJson.askInfo[i].askJson[j].askstitle
+ } 选择:${workJson.askInfo[i].radio[j] + 1}</h5> `;
+ z < workJson.askInfo[i].askJson[j].checkList.length;
+ _div3.innerHTML += `<span style="margin-right:5px">${z + 1}.${workJson.askInfo[i].askJson[j].checkList[z]
+ if (workJson.answerInfo.length > 0) {
+ for (var i = 0; i < workJson.answerInfo.length; i++) {
+ _div.innerHTML = `<h4>问答:${workJson.answerInfo[i].answerTitle}</h4>`;
+ _div.innerHTML += `<div>${workJson.answerInfo[i].answer}</div>`;
+ if (linkInfo.length > 0) {
+ for (var i = 0; i < linkInfo.length; i++) {
+ _link += `<div style="margin-top:10px"><a href='${linkInfo[i].content}'>${linkInfo[i].content}</a></div>`;
+ var _html =
+ _course + _title + _subtitle + _img + _ask + _answer + _link;
+ this.generate(_html);
+ isOpen(s) {
+ // this.stageIndex = s;
+ this.dyList2[s].isOpen = !this.dyList2[s].isOpen;
+ openTask(s, i) {
+ var a = s + "-" + i;
+ var b = document.getElementById(a);
+ var d = b.getAttribute("scrollindex");
+ var c = document.getElementsByClassName("shuBox")[0];
+ c.scrollTop = parseInt(d) * 375;
+ this.stageIndex = s;
+ this.taskCount = i;
+ this.navId = a;
+ // 生成报告
+ let dname = this.sInfo.course + "-" + this.sInfo.sName + ".html";
+ this.getGroup();
+.pb_head>span:nth-child(2) {
+ margin-left: 80px;
+ color: #ab582f;
+.student_search>div:nth-child(1) {
+ line-height: 35px;
+.student_search>>>.el-input__inner {
+ height: 35px;
+ margin-left: 10px;
+.student_table>>>.el-table--border td {
+.add_work>>>.el-dialog__header {
+ padding: 20px 20px 10px;
+ background: #32455b;
+.add_work>>>.el-dialog__title {
+ font-size: 14px !important;
+.add_work>>>.el-dialog__headerbtn {
+ font-size: 20px !important;
+ top: 5px !important;
+ right: 8px !important;
+.add_work>>>.el-form-item__label {
+ margin-left: 65px;
+.add_work>>>.el-form-item {
+.add_work>>>.el-form-item__content {
+.add_work>>>.el-dialog__footer {
+ text-align: center !important;
+.add_work>>>.el-dialog {
+ min-width: 650px !important;
+ width: 1080px;
+.add_work>>>.el-dialog__body {
+ height: 660px;
+.header-title {
+.logoImg {
+.logoImg>img {
+.title_add_student {
+.first {
+ margin-top: 25px;
+ border-bottom: 1px solid #c5c5c5;
+.one_top {
+.one_top>div:nth-child(1) {
+ color: #2490bf;
+.one_top>button {
+ background: #24a0a4;
+ height: 30px;
+ color: #e0e0e0;
+ padding: 0 !important;
+.work_Img {
+ width: 150px;
+ margin: 10px 0;
+.assess_Img {
+ padding: 15px 0;
+.work_Img>img,
+.assess_Img>img {
+.work_input {
+ border: 1px solid;
+ width: 135px;
+ line-height: 20px;
+ padding: 5px;
+.poetry {
+ margin: 10px 0 15px 0;
+.assess {
+ background: #169bd5 !important;
+.assess_top {
+ border-bottom: 2px solid #eee;
+.assess_top>div:nth-child(1) {
+.student_Answer {
+ margin: 5px 10px;
+ /* padding-bottom: 25px; */
+.workName {
+ font-weight: bold;
+.toux {
+ width: 35px;
+ /* margin: auto 0; */
+.toux>img {
+.nav {
+.studentName {
+.studentAnswer {
+ margin: 5px 0 0 10px;
+ height: 42px;
+.comment {
+ /* margin: 20px 0 0 10px;
+ height: 75%;
+ max-height: 330px; */
+ /* height: 290px; */
+ height: 525px;
+ padding: 10px;
+.comment_body {
+ height: calc(100% - 25px);
+.comment>.comment_title {
+.comment>.comment_title>span {
+.other_Answer {
+.nameAndTime {
+.otherName {
+.time {
+ margin-left: 25px;
+ margin-top: 3px;
+.otherAnswer {
+ word-wrap: break-word;
+ word-break: break-all;
+.doingAssess {
+ background: #169bd5;
+ border-radius: 3px;
+ margin-top: 30px;
+.score_top {
+.userTou {
+ width: 50px;
+.userTou>img {
+.score_user_name {
+ line-height: 53px;
+ margin-left: 15px;
+.course_top {
+.course_top>div:nth-child(1) {
+ line-height: 25px;
+.course_top>div:nth-child(2) {
+ border: 1px solid #ccc;
+ width: 250px;
+ height: 25px;
+ margin-left: 30px;
+.sd_score {
+ font-size: 15px;
+ padding-top: 40px;
+ box-shadow: 2px 2px 5px #909090;
+.sd_score .score_box {
+ /* margin-left: 30px; */
+.sd_score .score_box:last-child {
+ margin-bottom: 0;
+.rate_size>>>.el-rate__icon {
+.rate_size>>>.el-icon-star-off {
+ font-size: 22px;
+.sd_score span {
+ width: 130px;
+ text-align: justify;
+ text-align-last: justify;
+ display: block;
+.moreSay {
+ margin: 0px 0 5px 20px;
+.more_say_input {
+.more_say_input>>>.el-input__inner {
+ height: 75px;
+ padding: 0 0 0 10px;
+.assess_right {
+ background: #82b0ee;
+ line-height: 30px;
+.display {
+ display: none;
+.firstTop {
+ align-items: flex-start;
+ height: 90px;
+ padding: 10px 25px;
+.talkScore>>>.el-dialog__body {
+ background: #efefef;
+.lastTop {
+ height: 120px;
+.left,
+.right {
+ /* background: #fff; */
+ /* padding: 10px; */
+.left {
+ margin-right: 10px;
+ width: 30%;
+ min-height: 425px;
+/* .left .left_top {
+.left .left_bottom {
+ height: 160px;
+ width: 20%;
+ background: none;
+.courseTitle {
+ color: #7c7c7c;
+.course_t {
+ font-size: 19px;
+ align-items: flex-end;
+.course_t span:nth-child(2) {
+.courseTitle span:nth-child(2) {
+ /* font-size: 14px;
+ cursor: pointer; */
+.bigImg {
+ /* height: 300px; */
+ height: 150px;
+.bigImg>img,
+.thumbnail>div>img {
+ object-fit: contain;
+.thumbnail {
+ justify-content: flex-start;
+ margin: 5px 0 8px;
+ overflow-x: auto;
+ overflow-y: hidden;
+.isClick2 {
+ border: 3px solid #8f7fe2;
+.thumbnail>div {
+ width: 80px;
+ height: 80px;
+ flex-shrink: 0;
+.zyBoxC {
+ background: #ededed;
+ padding: 20px 0px;
+ height: calc(100% - 50px);
+.zyBox {
+ min-width: 600px;
+ width: 600px;
+ flex-wrap: nowrap;
+.zyBoxC+.zyBoxC {
+.rbButtom {
+ bottom: 0;
+ right: 0;
+ background: #06a7ff;
+ right: 10px;
+.bigImg>>>.vjs-tech,
+.bigImg>>>.video-js {
+ height: 300px !important;
+ height: 200px;
+.data_body .title {
+.dialog_diy>>>.el-dialog__header {
+ padding: 9px 20px 10px;
+ background: #32455b !important;
+.dialog_diy>>>.el-dialog__title {
+.dialog_diy>>>.el-dialog__headerbtn {
+ top: 14px;
+.dialog_diy>>>.el-dialog__headerbtn .el-dialog__close {
+.dialog_diy>>>.el-dialog__headerbtn .el-dialog__close:hover {
+.dialog_diy>>>.el-dialog__body,
+.dialog_diy>>>.el-dialog__footer {
+.max_diy>>>.el-dialog {
+ /* max-width: 1200px; */
+ max-width: 1300px;
+ /* height:800px */
+.max_diy>>>.el-dialog__body {
+ height: 800px;
+.dialog_diy2>>>.el-dialog__header {
+.dialog_diy2>>>.el-dialog__title {
+.dialog_diy2>>>.el-dialog__headerbtn {
+ top: 12px;
+.dialog_diy2>>>.el-dialog__headerbtn .el-dialog__close {
+.dialog_diy2>>>.el-dialog__headerbtn .el-dialog__close:hover {
+.dialog_diy2>>>.el-dialog__body,
+.dialog_diy2>>>.el-dialog__footer {
+.a_addBox2 {
+ padding: 15px;
+.a_addBox {
+ /* max-height: 400px; */
+ max-height: 160px;
+.a_add_box {
+.a_add_head {
+.a_add_head .a_add_head_input {
+.a_add_head .a_add_head_div {
+.a_add_body {
+.a_add_input {
+ /* flex-direction: column; */
+ /* width: 100%; */
+.a_add_input>>>el-radio-group {
+.a_add_input>>>.el-radio-group {
+.redioStyle>>>.el-radio__label {
+.task_title {
+.ask_Answer {
+ /* margin-top: 10px; */
+.ask_Answer_title {
+.ask_Answer_content {
+.answer_body {
+ padding: 10px 0;
+ border-bottom: 1px solid #f5f5f5;
+.answer_title {
+.answer_content {
+.ask_body {
+ /* padding: 0 10px; */
+.ask_body div {
+ /* cursor: pointer; */
+.ask_body div .btn {
+ background-color: #409eff;
+ padding: 6px 12px;
+ width: 60px;
+.ask_body div span:nth-child(1) {
+ max-width: 250px;
+.ask_body div+div {
+.work_nopicture {
+ /* height: 350px; */
+ height: 352px;
+.student_table>>>.el-table,
+.student_table>>>.el-table__body-wrapper {
+.tx {
+.ech {
+.tx>img,
+.ech>img {
+.txName {
+.txName>div:nth-child(2) {
+ padding: 15px 0 15px 20px;
+.jdName>div:nth-child(1) {
+.taskName {
+.task {
+ background: #8f7fe2;
+ height: 22px;
+ line-height: 22px;
+.contentBox {
+ height: 253px;
+.left_top {
+ width: 45%;
+ padding-left: 20px;
+.right_top {
+ width: 53%;
+.cBox {
+ height: calc(100% - 60px);
+.right_score {
+ min-width: 370px;
+ height: 351px;
+.pb_left {
+ background: rgb(255, 255, 255);
+ /* padding-right: 10px; */
+ /* height: 500px; */
+.cTitle {
+ background: #634fa4;
+ width: 85%;
+ margin: 10px auto;
+ line-height: 50px;
+.ml {
+ color: #5b7dba;
+ border-left: 3px solid #5b7dba;
+ padding-left: 5px;
+.cru_selectBox {
+ height: calc(100% - 90px);
+ overflow-x: hidden;
+.cru_selectBox::-webkit-scrollbar {
+ /*滚动条整体样式*/
+ width: 6px;
+ /*高宽分别对应横竖滚动条的尺寸*/
+ height: 6px;
+/*定义滚动条轨道 内阴影+圆角*/
+.cru_selectBox::-webkit-scrollbar-track {
+ background-color: #b8bdc9;
+/*定义滑块 内阴影+圆角*/
+.cru_selectBox::-webkit-scrollbar-thumb {
+ -webkit-box-shadow: inset 0 0 6px rgb(96, 125, 184);
+ background-color: #2c5ab3;
+.blue_box_one {
+ background-image: linear-gradient(90deg, #7960d5, #65b9fc);
+ border-radius: 7px;
+ height: 45px;
+.blue_box_one>div:nth-child(1) {
+ margin: 0 5px 0 10px;
+ min-width: 70px;
+ border-radius: 4px;
+.blue_box_one>div:nth-child(2) {
+ width: 70%;
+ text-align: left;
+ max-width: calc(100% - 85px);
+.blue_box_one>div:nth-child(2):hover {
+.twoChild {
+ background: #f2f2f2;
+ transition: all 0.5s;
+ background: #e7f3ff;
+.twoChild>div:nth-child(1) {
+.navChild {
+.navActive {
+ height: auto;
+.navTask {
+ align-content: flex-start;
+.vedioNav {
+ margin: 10px 0 0 15px;
+ /* border-bottom: 1px solid #d7d7d7; */
+ padding-bottom: 5px;
+ background: #b7aadf;
+ width: 55px;
+ min-width: 55px;
+ line-height: 26px;
+.navTaskname {
+.allBox {
+.shuBox {
+.answerbox {
+ /* align-items: center; */
+.answerbox>div:nth-child(2) {
+.answerbox1 {
+.answerbox1>div:nth-child(2) {
+ width: 265px;
+ max-height: 147px;
+.jdName {
+.full_diy>>>.el-dialog {
+.full_diy>>>.el-dialog__body {
+ height: calc(100% - 100px);
+.openTaskActive {
+ color: #8f7fe2;
+.isClick {
+.buttonCss {
+ justify-content: flex-end;
+.fullStyle>>>.el-dialog__body {
+ height: 100% !important;
+.fullStyle>>>.el-dialog,
+.fullStyle {
+ max-width: 100% !important;
+.worksTime {
+ align-items: baseline;
+.fullBox {
+ /* overflow: unset !important;
+ height: auto !important; */
+.fullZyBox {
+ width: 60% !important;
+.rightScoreFullBox {
+ width: 40%;
+.cancel_button:focus,
+.cancel_button:hover {
@@ -0,0 +1,2609 @@
+ <div class="pb_content" style="background: unset; height: 100%">
+ <!-- <div class="txName">
+ <div>{{ allWorks.course }}</div> -->
+ <div>查看作业</div>
+ "第" + (sin.stage + 1) + "阶段 " + dyList[sin.stage].name
+ <el-button class="btnClassGM" type="primary" size="small" @click="openFile(worksDetail[sIndex].wpptInfo[0])">查看文档
+ </el-button>
+ <div class="left_top" :style="{width:worksDetail[sIndex].eList.length?'45%':'95%'}" v-if="worksDetail[sIndex].img.length > 0">
+ worksDetail[sIndex].img && worksDetail[sIndex].img.length
+ worksDetail[sIndex].img[worksDetail[sIndex].imgIndex]
+ .src
+ worksDetail[sIndex].imgIndex == index ? 'isClick2' : ''
+ <div class="left_top" :style="{width:worksDetail[sIndex].eList.length?'45%':'95%'}" v-else-if="worksDetail[sIndex].answerInfo.length > 0">
+ <div class="left_top" :style="{width:worksDetail[sIndex].eList.length?'45%':'95%'}" v-else-if="worksDetail[sIndex].askInfo.length > 0">
+ <div class="a_add_box" v-for="(item1, index1) in worksDetail[sIndex].askInfo[0]
+ .askCount" :key="index1">
+ worksDetail[sIndex].askInfo[0].askJson[index1]
+ .askstitle
+ worksDetail[sIndex].askInfo[0].radio[index1]
+ ].askInfo[0].askJson[index1].checkList" :key="checkIndex" :label="checkIndex" disabled
+ class="redioStyle"><span v-html="item2"></span></el-radio>
+ <div class="left_top" :style="{width:worksDetail[sIndex].eList.length?'45%':'95%'}" v-else-if="worksDetail[sIndex].wpptInfo.length > 0">
+ <div class="echart charts_canvas" style="width: 100%; height: 100%; margin: 0 0 0 1rem"></div>
+ v-model="worksDetail[sIndex].rateList[item.value]" disabled></el-rate>
+ <!-- <div class="student_page">
+ ></el-pagination>
+ full: false,
+ // mounted() {
+ // this.$nextTick(function () {
+ // this.tableHeight =
+ // window.innerHeight - this.$refs.table.$el.offsetTop - 200;
+ // if (this.tableHeight <= 530) {
+ // this.tableHeight = 530;
+ // // 监听窗口大小变化
+ // let self = this;
+ // window.onresize = function () {
+ // self.tableHeight =
+ // window.innerHeight - self.$refs.table.$el.offsetTop - 200;
+ // if (self.tableHeight <= 530) {
+ // self.tableHeight = 530;
+ lookWork() {
+ uid: this.uid,
+ // this.allWorks = res.data[0][k];
+ // this.chapInfo.push(JSON.parse(res.data[0][k].chapters));
+ // chapters.push(JSON.parse(res.data[0][k].chapters));
+ if (eList && eList.length > 0) {
+ if (res.data[0][k].rate && eList && eList.length > 0) {
+ this.lookWork();
+ if (k == this.worksDetail.length - 1) {
+ uid(newValue, oldValue) {
+ // this.lookWork();
+ /* background: #ededed; */
+ height: 400px;
+ overflow: unset !important;
@@ -314,49 +314,25 @@ export default {
goToCourse(courseId) {
if (courseId) {
- if (this.org == "eb2af5e9-ac3d-46b6-9fe3-3c1c364f0217") {
- this.$router.push(
- "/course/addCourse2?cid=" +
- courseId +
- "&userid=" +
- this.userid +
- "&oid=" +
- this.oid +
- "&org=" +
- this.org
- );
- } else {
- "/course/addCourse?cid=" +
- }
+ this.$router.push(
+ "/course/addCourse?cid=" +
+ courseId +
+ "&userid=" +
+ this.userid +
+ "&oid=" +
+ this.oid +
+ "&org=" +
+ this.org
} else {
- "/course/addCourse2?userid=" +
- "/course/addCourse?userid=" +
+ "/course/addCourse?userid=" +
// this.$router.push(path);
@@ -0,0 +1,1116 @@
+ <div class="pb_content" style="height: auto">
+ <span>项目管理</span>
+ <span
+ class="subClick"
+ @click="
+ goTo('/worksGM?userid=' + userid + '&oid=' + oid + '&org=' + org)
+ >评价管理</span
+ <el-button type="primary" class="bgColor" @click="openCourse"
+ >协同编辑</el-button
+ <el-button type="primary" class="bgColor" @click="goToCourse()"
+ >添加项目</el-button
+ <div class="pb_content_body" style="height: 100%">
+ <div class="choose">
+ <span>项目筛选</span>
+ <el-select v-model="groupA" @change="search">
+ <el-option value="0" label="我的项目"></el-option>
+ <el-option value="1" label="他人项目"></el-option>
+ class="all_choose"
+ v-for="(item, index) in CourseType[0]"
+ <span>{{ item.name }}</span>
+ v-model="courseTypeId[item.id]"
+ placeholder="请选择"
+ @change="getTypeName"
+ <el-option label="全部" value="1">全部</el-option>
+ v-for="item1 in CourseTypeJson[item.id]"
+ :key="item1.id"
+ :label="item1.name"
+ :value="item1.id"
+ <div @click="clear" class="clear">重置</div>
+ <div class="student_right">
+ v-model="courseName"
+ placeholder="请输入项目名称"
+ <el-button class="course_button" @click="searchCourse"
+ >查询</el-button
+ <div class="course_box">
+ <div class="out_box" v-for="(item, index) in course" :key="index">
+ <div class="myCourse" v-if="item.isCourseType == 1 && groupA == 0">
+ 我的项目
+ class="myCourse"
+ v-else-if="item.isCourseType == 1 && groupA == 1"
+ 他人项目
+ <div class="xtCourse" v-else>协同项目</div>
+ <div class="tup">
+ :src="
+ item.cover != null && item.cover != ''
+ ? JSON.parse(item.cover).length > 0
+ ? JSON.parse(item.cover)[0].url
+ : mr
+ alt
+ <!-- <div class="bottom_box">
+ <div>{{ item.title }}</div>
+ <div class="kc_t" v-if="groupA == '1'">
+ 创建老师:{{ item.uname }}
+ <div class="kc_time">{{ item.time }}</div>
+ <div class="bottom_box">
+ <div class="kc_t" v-if="item.isCourseType == 2 || groupA == 1">
+ 负责老师:{{ item.uname }}
+ <div class="kc_time">
+ <span style="color: #4b4b4b">创建日期:</span>{{ item.time }}
+ <span style="color: #4b4b4b">修改日期:</span>{{ item.utime }}
+ <div class="three_bottom">
+ <div @click="jump(item.courseId)">评课</div>
+ <div v-if="groupA == '0'" @click="goToCourse(item.courseId)">
+ 修改
+ v-if="groupA == '0'"
+ goTo(
+ '/works?cid=' +
+ item.courseId +
+ '&userid=' +
+ userid +
+ '&oid=' +
+ oid +
+ '&org=' +
+ org
+ 报告
+ <div v-if="groupA == '0'" @click="deleteCourse(item.courseId)">
+ 删除
+ <div class="course_empty" v-if="course.length == 0">暂无数据</div>
+ v-if="page && course.length"
+ style="padding-bottom: 20px"
+ <el-dialog :visible.sync="dialogVisible1" size="tiny">
+ title="查看提问"
+ width="750px"
+ <CourseProblem :problemCourse="problemCourse"></CourseProblem>
+ <el-button @click="dialogVisible = false">关 闭</el-button>
+ title="查看协同项目"
+ :visible.sync="dialogVisibleCourse"
+ width="850px"
+ <div class="ct_box">
+ class="out_box"
+ v-for="(item, index) in courseTeam"
+ style="margin-left: 15px"
+ <div class="kc_t">创建老师:{{ item.uname }}</div>
+ <div @click="jump(item.courseId)">查看内容</div>
+ '/course/addCourse?cid=' +
+ 编辑
+ <div class="course_empty" v-if="courseTeam.length == 0">暂无数据</div>
+ <el-button @click="dialogVisibleCourse = false">关 闭</el-button>
+import "../../common/aws-sdk-2.235.1.min";
+import EditorBar from "../../components/tools/wangEnduit";
+import CourseProblem from "./components/courseProblem";
+ components: { EditorBar, CourseProblem },
+ itemCount: 1,
+ courseTitle: "",
+ courseText: "",
+ courseTime: "",
+ fileList: [],
+ fileList1: [],
+ homeworkList: [{ name: "" }],
+ dialogVisibleCourse: false,
+ group: "",
+ Juri: "",
+ groupList: [],
+ JuriList: [],
+ now: "",
+ courseDetail: {},
+ addCourse: {},
+ groupA: "0",
+ classX: "",
+ course: [],
+ courseName: "",
+ mr: require("../../assets/icon/kc1.png"),
+ CourseType: [],
+ CourseTypeJson: {},
+ courseTypeId: {},
+ courseTypeSon: [],
+ isChoose: 0,
+ problemCourse: null, //查看提问的项目
+ courseTeam: [],
+ change(val) {
+ console.log(val);
+ addHomeworkBox() {
+ this.homeworkList.push({ name: "" });
+ this.itemCount++;
+ reduceHomeworkBox() {
+ var a = this.homeworkList;
+ a.splice(a.length - 1);
+ this.itemCount--;
+ goTo(path) {
+ this.$router.push(path);
+ goToCourse(courseId) {
+ if (courseId) {
+ "/course/addCourseGM?cid=" +
+ "/course/addCourseGM?userid=" +
+ // this.$router.push(path);
+ // window.open(
+ // "//pbl.cocorobo.cn/pbl-student-table/dist/#/courseDetail?courseId=" +
+ // cid +
+ // "&userid=" +
+ // this.userid
+ window.parent.postMessage({ cid: cid, screenType: "2gm" }, "*");
+ handle_remove(file, fileList) {
+ var _tmp = this.fileList;
+ for (var i = 0, len = _tmp.length; i < len; i++) {
+ if (_tmp[i].uid == file.uid) {
+ _tmp.splice(i, 1);
+ this.fileList = _tmp;
+ handle_remove1(file, fileList) {
+ var _tmp = this.fileList1;
+ this.fileList1 = _tmp;
+ // console.log(`当前页: ${val}`);
+ this.getCourse();
+ init() {},
+ handleRemove(file, fileList) {
+ console.log(file, fileList);
+ handlePictureCardPreview(file) {
+ this.dialogImageUrl = file.url;
+ this.dialogVisible1 = true;
+ onExceed() {
+ this.$message.error("项目海报仅支持上传一张,请删除后再进行上传");
+ //uuid生成
+ guid() {
+ return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(
+ /[xy]/g,
+ function (c) {
+ var r = (Math.random() * 16) | 0,
+ v = c == "x" ? r : (r & 0x3) | 0x8;
+ return v.toString(16);
+ searchCourse() {
+ clear() {
+ for (var i = 0; i < this.CourseType[0].length; i++) {
+ this.courseTypeId[this.CourseType[0][i].id] = "";
+ getCourse() {
+ if (!this.loading) {
+ this.loading = this.openLoading(
+ document.querySelector(".student_table")
+ var typeE = [];
+ var typea, typeb, typec, typed;
+ if (this.isChoose == 1) {
+ if (this.courseTypeId[this.CourseType[0][i].id] == "1") {
+ typeE.push(this.CourseType[0][i].id);
+ } else if (this.courseTypeId[this.CourseType[0][i].id] != "") {
+ if (this.CourseType[0][i].name == "年级") {
+ typea = this.courseTypeId[this.CourseType[0][i].id];
+ } else if (this.CourseType[0][i].name == "专栏") {
+ typeb = this.courseTypeId[this.CourseType[0][i].id];
+ } else if (this.CourseType[0][i].name == "栏目") {
+ } else if (this.CourseType[0][i].name == "学院") {
+ } else if (this.CourseType[0][i].name == "新技能") {
+ typec = this.courseTypeId[this.CourseType[0][i].id];
+ } else if (this.CourseType[0][i].name == "学科") {
+ typed = this.courseTypeId[this.CourseType[0][i].id];
+ this.courseTypeSon.push(
+ this.courseTypeId[this.CourseType[0][i].id]
+ type: this.groupA,
+ typea: typea != undefined ? typea : "",
+ typeb: typeb != undefined ? typeb : "",
+ typec: typec != undefined ? typec : "",
+ typed: typed != undefined ? typed : "",
+ typeE: typeE.join(","),
+ cn: this.courseName,
+ .get(this.$store.state.api + "selectCourseNew2", params)
+ this.loading.close();
+ this.loading = "";
+ this.course = res.data[0];
+ getTypeName() {
+ this.isChoose = 1;
+ // searchCourse() {
+ // this.isLoading = true;
+ // cu: "",
+ // cn: this.courseName,
+ // page: this.page,
+ // .get(this.$store.state.api + "searchCourse", params)
+ // this.isLoading = false;
+ // this.total = res.data[0].length > 0 ? res.data[0][0].num : 0;
+ // this.course = res.data[0];
+ deleteCourse(cid) {
+ const loading = this.openLoading(
+ this.$confirm("确定删除此项目吗?", "提示", {
+ cid: cid,
+ .get(this.$store.state.api + "deleteCourse", params)
+ loading.close();
+ this.$message.success("删除成功");
+ .catch(() => {
+ selectType() {
+ .get(this.$store.state.api + "selectType")
+ this.CourseType = res.data;
+ for (var i = 0; i < res.data[0].length; i++) {
+ if (!this.cid) {
+ this.courseTypeId[res.data[0][i].id] = "";
+ if (this.oid == "69893dca-1d47-11ed-8c78-005056b86db5") {
+ if (res.data[0][i].name == "栏目") {
+ this.CourseType[0][i].name = "主题";
+ for (var j = 0; j < res.data[1].length; j++) {
+ if (res.data[0][i].id == res.data[1][j].pid) {
+ if (!this.CourseTypeJson[res.data[0][i].id]) {
+ this.CourseTypeJson[res.data[0][i].id] = [];
+ this.CourseTypeJson[res.data[0][i].id].push(res.data[1][j]);
+ this.selectTypeByOid();
+ this.selectTypeByOrg();
+ selectTypeByOid() {
+ .get(this.$store.state.api + "selectTypeByOid", params)
+ selectTypeByOrg() {
+ oid: this.org,
+ .get(this.$store.state.api + "selectTypeByOrg", params)
+ openCourse() {
+ this.dialogVisibleCourse = true;
+ this.getTeamCourse();
+ getTeamCourse() {
+ .get(this.$store.state.api + "selectCourseTeam", params)
+ this.courseTeam = res.data[0];
+ search() {
+ checkProblem(res) {
+ this.problemCourse = res;
+ this.selectType();
+ background: #3d67bc !important;
+ background-color: #2268bc;
+ background: #8681b7;
+ border-color: #8681b7;
+ width: calc(100% / 3);
+ min-width: 65px;
+.student_empty {
+ color: #999;
+.course_button {
+ padding: 10px 20px;
+.course_button_box {
+.course_rate {
+.course_view {
+ margin: 5px 0 0 0;
+.course_view i {
+ background-image: url("../../assets/liulan.png");
+ width: 25px;
+ /* margin-top: 1px; */
+ vertical-align: text-top;
+ background-repeat: no-repeat;
+.image {
+.course_box {
+.course_create_box {
+.course_name {
+.course_name span {
+.homework_box {
+.course_homework {
+ margin: 0 10px 10px 0;
+.course_type {
+.course_type1 span {
+.course_type2 {
+.course_type2 span {
+.course_empty {
+ color: rgb(110, 110, 110);
+.el_cards >>> .el-card__body {
+.courseBtnBox {
+ height: calc(100% - 170px);
+.wordUpload {
+.wordUpload > .buttonUp {
+.out_box {
+ margin-right: 25px;
+ height: fit-content;
+ border-radius: 0px 0px 5px 5px;
+.bottom_box {
+ padding: 10px 0 10px 10px;
+ height: 121px;
+ justify-content: space-evenly;
+.bottom_box > div:nth-child(1) {
+ width: 230px;
+.tup {
+ height: 141.06px;
+.tup > img {
+.kc_time {
+ margin-top: 8px;
+.kc_t {
+.three_bottom {
+ justify-content: space-around;
+ background: #f5f4f4;
+.three_bottom > div {
+.three_bottom > div:hover {
+ color: #79a2ff;
+.student_input >>> .el-input__inner {
+ width: 75px;
+ line-height: 40px;
+.all_choose {
+ margin: 15px 0 10px;
+ height: 20%;
+.all_choose > span {
+.choose {
+ align-content: space-between;
+ min-width: 868px;
+.choose > div:nth-child(2) {
+ margin-left: 1%;
+ width: 32.33333%;
+.choose > div:nth-child(4) {
+ margin-right: 1%;
+.choose > div:nth-child(5) {
+ margin: 5px 0 0 1%;
+.choose > div:nth-child(4) > span {
+ width: 74px !important;
+ min-width: 74px;
+.choose > div:nth-child(4) >>> .el-select {
+ width: 217.5px;
+ min-width: 215.06px;
+.clear {
+ width: 70px;
+.ct_box {
+.myCourse {
+ background: #3c3c3c;
+ border-radius: 30px;
+ top: 5px;
+ left: 5px;
+.xtCourse {
+ background: #41a5f0;
+.subClick {
+ /* color: #ab582f; */
+.student_search >>> .el-select .el-input.is-focus .el-input__inner {
+.student_search >>> .el-select .el-input__inner:focus {
+.student_input.is-active >>> .el-input__inner,
+.student_input >>> .el-input__inner:focus {
+.all_choose >>> .el-select .el-input.is-focus .el-input__inner {
+.all_choose >>> .el-select .el-input__inner:focus {
@@ -0,0 +1,529 @@
+ min-height: 640px;
+ min-width: unset;
+ margin: 0;
+ <div class="pb_content_body" style="position: relative; width: 100%">
+ <div style="width: 100%; margin: 0px auto">
+ <div class="formTop">
+ <div class="tx">
+ :src="ruleForm.headportrait ? ruleForm.headportrait : tx"
+ <!-- <div class="right">
+ <div class="name">{{ ruleForm.name }}</div>
+ <div class="rightBottom">
+ <div class="emailImg">
+ <img src="../../assets/email.png" alt />
+ <div class="email">{{ ruleForm.mail }}</div>
+ <div class="data_nav">
+ <span @click="type = 1" :class="{ active: type == 1 }">我的资料</span>
+ <span @click="type = 2" :class="{ active: type == 2 }">修改密码</span>
+ <el-form
+ v-if="type == 1"
+ :model="ruleForm"
+ :rules="rules"
+ ref="ruleForm"
+ label-width="100px"
+ class="demo-ruleForm"
+ <!-- <el-form-item label="姓名" prop="teacherName">
+ v-model="ruleForm.name"
+ style="width: 250px"
+ placeholder="请输入名字"
+ </el-form-item>-->
+ <el-form-item label="性别">
+ <el-radio-group v-model="ruleForm.sex">
+ <el-radio label="男"></el-radio>
+ <el-radio label="女"></el-radio>
+ <el-form-item label="昵称" prop="name">
+ style="width: 300px"
+ placeholder="请输入昵称"
+ <!-- <el-form-item label="邮箱" prop="mail">
+ v-if="ruleForm.mail == ''"
+ v-model="ruleForm.mail"
+ placeholder="请输入邮箱"
+ v-else
+ disabled
+ </el-form-item> -->
+ <!-- <el-form-item label="手机号码" prop="phone">
+ v-model="ruleForm.phone"
+ placeholder="请输入手机号码"
+ <el-form-item label="组织" prop="org">
+ v-model="ruleForm.org"
+ placeholder="暂无组织"
+ v-for="item in orgJuri"
+ :key="item.id"
+ <el-form-item label="学校" prop="sBySchool">
+ v-model="ruleForm.sBySchool"
+ placeholder="请选择学校"
+ <!-- <el-option
+ v-for="item in schoolJuri"
+ </el-option> -->
+ <el-option :value="ruleForm.sBySchool"> </el-option>
+ <el-form-item label="身份" prop="type">
+ v-model="ruleForm.type"
+ placeholder="请选择身份"
+ <el-option :value="ruleForm.type"> </el-option>
+ <!-- <el-option >学生 </el-option> -->
+ <el-form-item label="个人简介" prop="intro">
+ v-model="ruleForm.intro"
+ type="textarea"
+ :rows="5"
+ resize="none"
+ placeholder="想说点什么..."
+ <el-form-item>
+ @click="submitForm('ruleForm')"
+ >修改</el-button
+ <div class="password" v-if="type == 2">
+ <div class="input_box">
+ <span>原密码</span>
+ class="input"
+ v-model="opassword"
+ placeholder="请输入原密码"
+ <span>修改密码</span>
+ v-model="password"
+ placeholder="请输入修改密码"
+ <span></span>
+ <div class="input">
+ @click="updatePassword"
+ var validatePass = (rule, value, callback) => {
+ if (value == "") {
+ var reg =
+ /^[A-Za-z\d]+([-_.][A-Za-z\d]+)*@([A-Za-z\d]+[-.])+[A-Za-z\d]{2,4}$/;
+ if (!reg.test(value)) {
+ callback(new Error("请输入正确的邮箱"));
+ callback();
+ var validatePass1 = (rule, value, callback) => {
+ var reg = /^1\d{10}$/;
+ callback(new Error("请输入正确的手机号码"));
+ ruleForm: {
+ name: "",
+ type: "",
+ sex: "男",
+ intro: "",
+ // mail: "",
+ phone: "",
+ sBySchool: "",
+ org: "",
+ headportrait: "",
+ opassword: "",
+ password: "",
+ tx: require("../../assets/avatar.png"),
+ userinfo: "",
+ schoolJuri: [],
+ orgJuri: [],
+ rules: {
+ pass: [{ validator: validatePass, trigger: "blur" }],
+ name: [{ required: true, message: "请输入你的名字", trigger: "blur" }],
+ mail: [
+ required: true,
+ message: "请输入你的邮箱",
+ trigger: "blur",
+ phone: [
+ // { required: true, message: "请输入你的手机号码", trigger: "blur" },
+ validator: validatePass1,
+ getSchool() {
+ .get(this.$store.state.api + "selectOrg", params)
+ this.schoolJuri = res.data[0];
+ getOrg() {
+ .get(this.$store.state.api + "selectorg2", "")
+ this.orgJuri = res.data[0];
+ submitForm(formName) {
+ this.$refs[formName];
+ let params = [
+ userid: this.userid,
+ username: this.ruleForm.name,
+ type: this.ruleForm.type == "老师" ? 1 : 2,
+ oid: this.ruleForm.sBySchool,
+ phone: this.ruleForm.phone,
+ intro: this.ruleForm.intro,
+ sex: this.ruleForm.sex == "男" ? "0" : "1",
+ .post(this.$store.state.api + "updatePblMessage2", params)
+ message: "修改成功",
+ window.parent.postMessage({ close: "1" }, "*");
+ this.getUser();
+ this.$message.error("修改失败");
+ getUser() {
+ let params = { uid: this.userid };
+ .get(this.$store.state.api + "getUser", params)
+ // this.$cookies.set("userInfo", this.userinfo, -1);
+ this.$cookies.set("teacherInfo", res.data[0][0], -1);
+ this.$store.commit("update", ["userInfo", this.userinfo]);
+ console.log(res.data[0][0]);
+ getDetail() {
+ if (res.data[0][0]) {
+ res.data[0][0].sex = res.data[0][0].sex ? "女" : "男";
+ this.ruleForm = res.data[0][0];
+ this.ruleForm.org = res.data[0][0].org
+ ? res.data[0][0].org.split(",")[0]
+ : "";
+ this.ruleForm.type = res.data[0][0].type == 1 ? "老师" : "学生";
+ updatePassword() {
+ if (this.password.length < 6) {
+ this.$message.error("密码长度不少于6位");
+ opassword: this.opassword,
+ password: this.password,
+ .post(this.$store.state.api + "updatePassword", params)
+ if (res.data[0] && res.data[0].success == 1) {
+ this.$message.success("修改成功");
+ this.opassword = "";
+ this.password = "";
+ this.$message.error("修改失败,原密码不正确");
+ this.getSchool();
+ this.getOrg();
+ this.getDetail();
+.formTop {
+.formTop >>> .el-form {
+ /* margin-right: 15px; */
+ min-width: 50px;
+ min-height: 50px;
+.emailImg {
+.tx > img,
+.emailImg > img {
+.name {
+ color: #3c88dd;
+.email {
+ color: #acacac;
+.rightBottom {
+.demo-ruleForm {
+/* .demo-ruleForm >>> .el-form-item__label:before {
+ content: "*";
+ color: #f56c6c;
+ margin-right: 4px;
+.demo-ruleForm >>> .el-form-item__label:nth-child(3) {
+.demo-ruleForm >>> .el-form-item__content {
+.data_nav {
+.data_nav span {
+ padding: 8px 5px;
+ color: #444444;
+.data_nav span + span {
+.data_nav .active {
+.password {
+ height: 511px;
+ padding: 50px 0 0 0;
+ /* display: flex;
+ flex-direction: column; */
+.input_box {
+.input_box span {
+ text-align: right;
+ padding: 0 12px 0 0;
+.input_box .input {
+.input_box + .input_box {
+.demo-ruleForm >>> .el-input.is-focus .el-input__inner {
+.demo-ruleForm >>> .el-input__inner:focus {
+.demo-ruleForm >>> .el-input.is-focus .el-textarea__inner {
+.demo-ruleForm >>> .el-textarea__inner:focus {
+.password >>> .el-input.is-focus .el-input__inner {
+.password >>> .el-input__inner:focus {
+.password >>> .el-input.is-focus .el-textarea__inner {
+.password >>> .el-textarea__inner:focus {
+.demo-ruleForm >>> .el-radio__input.is-checked .el-radio__inner {
+.demo-ruleForm >>> .el-radio__input.is-checked + .el-radio__label {
@@ -1,5 +1,5 @@
<template>
- <div class="pb_content">
+ <div class="pb_content" style="overflow: auto;">
<div class="pb_head top">
<span>素材库</span>
<div v-if="choose == 0" @click="addImg($event)">
@@ -123,7 +123,7 @@
layout="prev, pager, next"
:page-size="10"
:total="total"
- v-if="page"
+ v-if="page && chapInfo.length"
@current-change="handleCurrentChange"
</el-pagination>
@@ -361,10 +361,11 @@ export default {
this.isLoading = true;
let params = {
t: parseInt(this.choose),
page: this.page,
this.ajax
- .get(this.$store.state.api + "selectMtl", params)
+ .get(this.$store.state.api + "selectMtl2", params)
.then((res) => {
this.isLoading = false;
this.total = res.data[0].length > 0 ? res.data[0][0].num : 0;
@@ -510,5 +511,6 @@ export default {
flex-direction: row;
flex-wrap: wrap;
+ min-height: 250px;
@@ -0,0 +1,528 @@
+ <span>素材库</span>
+ <div v-if="choose == 0" @click="addImg($event)">
+ <input
+ type="file"
+ accept="image/*"
+ capture="camera"
+ style="display: none"
+ @change="beforeUpload1($event, 1)"
+ <div class="uploadThing btnClassGM">上传图片</div>
+ <div v-if="choose == 1" @click="addImg($event)">
+ accept="video/mp4,video/quicktime,video/x-msvideo"
+ @change="beforeUpload2($event, 2)"
+ <div class="uploadThing btnClassGM">上传视频</div>
+ <div v-if="choose == 2" @click="addImg($event)">
+ accept="application/pdf,.ppt,.pptx,application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document"
+ @change="beforeUpload2($event, 3)"
+ <div class="uploadThing btnClassGM">上传附件</div>
+ <div class="pb_content_body" style="height: 70%">
+ <div class="three">
+ <div :class="choose == 0 ? 'choose' : ''" @click="sMtl(0)">图片</div>
+ <div :class="choose == 1 ? 'choose' : ''" @click="sMtl(1)">视频</div>
+ <div :class="choose == 2 ? 'choose' : ''" @click="sMtl(2)">附件</div>
+ <div v-if="this.choose == 0" class="boxCss">
+ <div class="out_box" v-for="(item, index) in chapInfo" :key="index">
+ item.chapdataInfo ? JSON.parse(item.chapdataInfo).url : mtp
+ handlePictureCardPreview(JSON.parse(item.chapdataInfo).url)
+ <div class="deleteWord" @click="deleteM(item.id)">
+ <img src="../../assets/icon/delete.png" alt="" />
+ item.chapdataInfo
+ ? JSON.parse(item.chapdataInfo).name
+ : "图片暂无名称"
+ <div v-if="this.choose == 1" class="boxCss">
+ :src="msp"
+ handlePictureCardPreview1(JSON.parse(item.chapdataInfo).url)
+ <div v-if="this.choose == 2" class="boxCss">
+ :src="mfj"
+ @click="downFile(JSON.parse(item.chapdataInfo).url)"
+ <img width="100%" :src="dialogImageUrl" alt="" />
+ <el-dialog :visible.sync="vedioDialog" size="tiny">
+ <video-player
+ class="video-player vjs-custom-skin"
+ ref="videoPlayer"
+ :playsinline="true"
+ :options="playerO"
+ @play="onPlayerPlay($event)"
+ ></video-player>
+ choose: 0,
+ cImgInfo: [],
+ noneBtnImg: false,
+ mtp: require("../../assets/tup1.png"),
+ msp: require("../../assets/sp1.png"),
+ mfj: require("../../assets/uploadImg.png"),
+ vedioDialog: false,
+ src: "", //url地址require("../../assets/media/aaa.mp4")
+ // poster: require("../../assets/tu31.png"), //你的封面地址
+ this.selectMtl();
+ addImg(e) {
+ var el = e.currentTarget;
+ el.getElementsByTagName("input")[0].click();
+ imgChange(file, fileList, type) {
+ var _tmp = this.chapInfo;
+ this.noneBtnImg = _tmp.length >= 1;
+ downFile(url) {
+ window.open(url);
+ beforeUpload1(event, type) {
+ 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 _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) {
+ if (err) {
+ var a = _this.$refs.upload1.uploadFiles;
+ a.splice(a.length - 1, a.length);
+ _this.$message.error("上传失败");
+ _this.cImgInfo.push({
+ name: file.name,
+ url: data.Location,
+ _this.addMtl();
+ _this.cImgInfo = [];
+ _this.selectMtl();
+ _this.imgChange(null, null, type);
+ console.log(data.Location);
+ handlePictureCardPreview1(url) {
+ this.playerOptions.sources[0].src = url;
+ // this.dialogImageUrl = url;
+ this.vedioDialog = true;
+ beforeUpload2(event, type) {
+ if (type == 2) {
+ } else if (type == 3) {
+ addMtl() {
+ cInfo: this.cImgInfo[0],
+ t: this.choose,
+ cBy: this.userid,
+ .get(this.$store.state.api + "addMtl", params)
+ this.$message.success("上传素材成功");
+ sMtl(type) {
+ this.choose = type;
+ selectMtl() {
+ t: parseInt(this.choose),
+ this.chapInfo = res.data[0];
+ deleteM(id) {
+ .get(this.$store.state.api + "deleteM", params)
+ onPlayerPlay() {},
+/* .student_button {
+ } */
+.three {
+.three > div {
+ border-bottom: 5px solid #5c549f;
+ height: 191px;
+.tup:hover .deleteWord {
+.deleteWord {
+ right: -25px;
+ top: -10px;
+.tup > img,
+.deleteWord > img {
+ margin: 0 25px 15px 0;
+ padding: 10px 0 5px 0;
+.uploadThing {
+ background: #2268bc;
+ width: 90px;
+.boxCss {
+ padding: 15px 5px;
@@ -77,21 +77,21 @@
<img src="../../../../assets/icon/race/infoBook.png" alt="" />
<span>报送材料清单及要求</span>
- <div class="center_detail"></div>
+ <div class="center_detail">暂无信息</div>
<div class="center_box" ref="box4">
<div class="center_title">
<span>组织作品推荐参考指标</span>
<div class="center_box" ref="box5">
<span>联系我们</span>
@@ -0,0 +1,1165 @@
+ <div class="pb_content" style="background: unset;height: 100%;overflow: auto;">
+ /* border-radius: 5px; */
+ <span>我的学生列表</span>
+ <el-input v-model="sPhoneUser" class="student_input" placeholder="请输入手机号或用户名"></el-input>
+ <el-button class="student_button" @click="searchStudent">查询</el-button>
+ <div class="head_right">
+ <el-button @click="addStudent">添加学生</el-button>
+ <el-upload
+ class="upload-demo newCss"
+ :http-request="handleChange"
+ :on-remove="handleRemove"
+ action="#"
+ :file-list="fileListUpload"
+ accept=".xlsx"
+ <el-button class="btnClassGM" size="primary" type="primary">批量添加</el-button>
+ <div slot="tip" class="el-upload__tip" style="margin-left:10px;">只能上传xlsx文件,且不超过500kb</div>
+ </el-upload>
+ <!-- <el-button @click="exportExcel">导出学生</el-button> -->
+ <div @click="getExcel">xls 上传样例</div>
+ <el-table-column label="姓名" min-width="10" align="center">
+ <div class="userImg">
+ scope.row.headportrait != null
+ ? scope.row.headportrait
+ : tx
+ >{{ scope.row.name }}</div>
+ <el-table-column label="账号" min-width="15" align="center">
+ <div>{{scope.row.un ? scope.row.un : "" }}</div>
+ <el-table-column label="电话" min-width="15" align="center">
+ <div>{{scope.row.phonenumber ? scope.row.phonenumber : "" }}</div>
+ <el-table-column prop="studentid" label="学号" min-width="10" align="center"></el-table-column>
+ <!-- <el-table-column
+ min-width="30"
+ </el-table-column>-->
+ prop="classname"
+ label="班级"
+ <el-table-column label="操作" min-width="20">
+ @click="deleteStudent(scope.row.userid, scope.row.state)"
+ <div class="delete" @click="deleteStudent(scope.row.userid, scope.row.state)">
+ <img src="../../assets/remove.png" alt />
+ width="700px"
+ class="add_student"
+ <div class="logoImg">
+ <img src="../../assets/logo.png" alt />
+ <div class="title_add_student">添加学生</div>
+ <el-form class="inputClass">
+ <el-form-item label="学生名称" :label-width="formLabelWidth">
+ <el-input placeholder="请输入学生昵称" clearable v-model="sName" class="add_input"></el-input>
+ <el-form-item label="学生学号" :label-width="formLabelWidth">
+ <el-input placeholder="请输入学生学号" clearable v-model="sId" class="add_input"></el-input>
+ <el-form-item label="学生手机号" :label-width="formLabelWidth">
+ <el-input placeholder="请输入学生手机号" clearable v-model="sPhone" class="add_input"></el-input>
+ <el-form-item label="学生邮箱" :label-width="formLabelWidth">
+ <el-input placeholder="请输入学生邮箱" clearable v-model="sMail" class="add_input"></el-input>
+ <el-form-item label="所属学校" :label-width="formLabelWidth">
+ <el-input disabled style="width: 300px" v-model="schoolName"></el-input>
+ <el-form-item label="班级" :label-width="formLabelWidth">
+ <el-select v-model="sByClass" placeholder="请选择班级">
+ v-for="(item, index) in classJuri"
+ <div style="text-align: center; color: #adb3b7">注:添加学生的账号密码为123456</div>
+ <span slot="footer" class="dialog-footer flex">
+ <el-button class="right" @click="insertStudent">确认</el-button>
+import $ from "jquery";
+import pinyin from "../../../node_modules/js-pinyin/index";
+ sName: "",
+ sPhone: "",
+ sId: "",
+ schoolName: "",
+ // sBySchool: [],
+ // sBySchoolName:"",
+ sByClass: "",
+ sMail: "",
+ classJuri: [],
+ fileListUpload: [],
+ sPhoneUser: "",
+ cid: this.$route.query.cid,
+ searchStudent() {
+ this.getStudent();
+ addStudent() {
+ (this.sName = ""), (this.sPhone = ""), (this.sByClass = "");
+ // this.getSchool();
+ getExcel(res) {
+ require.ensure([], () => {
+ const { export_json_to_excel } = require("../../common/Export2Excel");
+ const tHeader = ["学号", "学生姓名", "学生邮箱", "学生手机号", "班级"];
+ const data = [];
+ export_json_to_excel(tHeader, data, "上传学生样例");
+ //新增学生
+ insertStudent() {
+ if (this.sName === "") {
+ this.$message.error("学生昵称不能为空");
+ } else if (this.sByClass === "") {
+ this.$message.error("请为学生选择班级");
+ } else if (this.sId != "" && !/^[1][3,4,5,7,8][0-9]{9}$/.test(this.sPhone)) {
+ this.$message.error("手机号格式不正确");
+ !/^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+/.test(this.sMail)
+ this.$message.error("邮箱格式不正确");
+ // else if (this.sId === "") {
+ // this.$message.error("学生学号不能为空");
+ // return;
+ // } else if (this.sPhone === "") {
+ // this.$message.error("学生手机号不能为空");
+ // let params = { un: this.sPhone };
+ // .get(this.$store.state.api + "findPhone", params)
+ // if (res.data[0].length > 0) {
+ // this.$message.error("此学生手机号码已被注册");
+ let params = { un: this.sMail };
+ .get(this.$store.state.api + "findMail", params)
+ if (res.data[0].length > 0) {
+ this.$message.error("此学生邮箱已被注册");
+ // let params = { un: this.sId };
+ // .get(this.$store.state.api + "findSid", params)
+ // this.$message.error("此学生学号已被注册");
+ this.add_Student();
+ add_Student() {
+ username: this.sMail,
+ userpassword: 123456,
+ alias: this.sName,
+ ph: this.sPhone,
+ sid: this.sId,
+ cid: this.sByClass,
+ .post(this.$store.state.api + "batchRegistration", params)
+ // console.log(res.data.uid, res.data.ph, res.data.oid, res.data.cid);
+ userid: res.data.uid,
+ username: this.sName,
+ type: 2,
+ oid: res.data.oid,
+ phone: res.data.ph,
+ cid: res.data.cid,
+ sex: "0",
+ // .post(this.$store.state.api + "updateUser", params)
+ .post(this.$store.state.api + "updateUserByEdu", params)
+ console.log(res);
+ this.sPhone = "";
+ this.sName = "";
+ // this.sBySchool = [];
+ this.sByClass = [];
+ this.sMail = "";
+ this.classJuri = res.data[0];
+ // getSchool() {
+ // .get(this.$store.state.api + "selectOrg", params)
+ // this.schoolJuri = res.data[0];
+ getStudent() {
+ cn: this.sPhoneUser,
+ .get(this.$store.state.api + "selectStudent2", params)
+ handleChange(file) {
+ this.fileTemp = file.file;
+ if (this.fileTemp) {
+ this.fileTemp.type ==
+ "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" ||
+ this.fileTemp.type == "application/vnd.ms-excel"
+ this.importCount = 1;
+ this.importfxx(this.fileTemp);
+ message: "附件格式错误,请删除后重新上传!",
+ message: "请上传附件!",
+ this.fileTemp = null;
+ exportExcel() {
+ try {
+ .get(this.$store.state.api + "selectUserBySchool", params)
+ var res = res.data[0];
+ //如果value的json字段的key值和想要的headers值不一致时,可做如下更改
+ //将和下面的Object.fromEntries结合,将json字段的key值改变为要求的excel的header值
+ var array = [];
+ for (var i = 0; i < res.length; i++) {
+ var _json = {};
+ _json["用户名"] = res[i].username;
+ _json["姓名"] = res[i].alias ? res[i].alias : "";
+ _json["班级"] = res[i].classid ? res[i].classid : "";
+ array.push(_json);
+ var XLSX = require("xlsx");
+ const workbook = XLSX.utils.book_new(); //创建一个新的工作簿对象
+ let ws = XLSX.utils.json_to_sheet(array); //将json对象数组转化成工作表
+ ws["!cols"] = [
+ //设置每一列的宽度
+ { wch: 50 },
+ XLSX.utils.book_append_sheet(workbook, ws, "sheet1"); //把sheet添加到workbook里,第三个参数是sheet名
+ XLSX.writeFile(workbook, "学生信息.xlsx");
+ // const wopts = { bookType: "xlsx", bookSST: false, type: "array" };//写入的样式bookType:输出的文件类型,type:输出的数据类型,bookSST: 是否生成Shared String Table,官方解释是,如果开启生成速度会下降,但在低版本IOS设备上有更好的兼容性
+ // const wbout = XLSX.write(workbook, wopts);// 浏览器端和node共有的API,实际上node可以直接使用xlsx.writeFile来写入文件,但是浏览器没有该API
+ // FileSaver.saveAs(new Blob([wbout], { type: "application/octet-stream" }), `${title} demo.xlsx`);//保存文件
+ message: "导出成功",
+ } catch (e) {
+ console.log(e, e.stack);
+ importfxx(obj) {
+ const loading = this.$loading.service({
+ background: "rgba(255, 255, 255, 0.7)",
+ target: document.body,
+ var _$ = $;
+ this.importCount++;
+ // 通过DOM取文件数据
+ this.file = obj;
+ var rABS = false; //是否将文件读取为二进制字符串
+ var f = this.file;
+ var reader = new FileReader();
+ //if (!FileReader.prototype.readAsBinaryString) {
+ FileReader.prototype.readAsBinaryString = function (f) {
+ var binary = "";
+ var pt = this;
+ var wb; //读取完成的数据
+ var outdata;
+ reader.onload = function (e) {
+ var bytes = new Uint8Array(reader.result);
+ var length = bytes.byteLength;
+ for (var i = 0; i < length; i++) {
+ binary += String.fromCharCode(bytes[i]);
+ if (rABS) {
+ wb = XLSX.read(btoa(fixdata(binary)), {
+ //手动转化
+ type: "base64",
+ wb = XLSX.read(binary, {
+ type: "binary",
+ outdata = XLSX.utils.sheet_to_json(wb.Sheets[wb.SheetNames[0]]); //outdata就是你想要的东西
+ this.da = [...outdata];
+ let arr = [];
+ this.da.map((v) => {
+ let obj = {};
+ let a = "";
+ var num = "";
+ for (var cj = 0; cj < 3; cj++) {
+ num += Math.floor(Math.random() * 10);
+ a =
+ pinyin.getFullChars(v["学生姓名"]).toLowerCase() +
+ num +
+ "@cocorobo.cc";
+ obj.sId = v["学号"];
+ obj.name = v["学生姓名"];
+ obj.mail = v["学生邮箱"] ? v["学生邮箱"] : a;
+ obj.phone = v["学生手机号"];
+ obj.class = v["班级"];
+ arr.push(obj);
+ console.log(arr);
+ let _b = 1;
+ for (var i = 0; i < arr.length; i++) {
+ let item = arr[i];
+ if (item.class === "") {
+ _b = 1;
+ _this.$message.error("学生班级不能为空,请重新上传");
+ } else if (item.name === "") {
+ _this.$message.error("学生姓名不能为空,请重新上传");
+ } else if (item.sId === "") {
+ _this.$message.error("学生学号不能为空,请重新上传");
+ // else if (item.phone === "") {
+ // _b = 1;
+ // _this.$message.error("学生手机号不能为空,请重新上传");
+ // break;
+ // } else if (!/^[1][3,4,5,7,8][0-9]{9}$/.test(item.phone)) {
+ // _this.$message.error("有学生手机号格式不正确,请重新上传");
+ else if (item.mail === "") {
+ _this.$message.error("学生邮箱不能为空,请重新上传");
+ !/^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+/.test(
+ item.mail
+ _this.$message.error("有学生邮箱格式不正确,请重新上传");
+ // else if (item.school === "") {
+ // _this.$message.error("学生学校不能为空,请重新上传");
+ // else if (item.sex === "") {
+ // _this.$message.error("学生性别不能为空,请重新上传");
+ // if (item.class != "") {
+ // let _a;
+ // className: item.class,
+ // _$.ajax({
+ // url: _this.$store.state.api + "selectC", //url路径
+ // type: "GET", //GET
+ // async: false, //或false,是否异步
+ // data: params,
+ // timeout: 5000, //超时时间
+ // dataType: "json", //返回的数据格式:
+ // beforeSend: function (xhr) {},
+ // success: function (res, textStatus, jqXHR) {
+ // if (res[0].length == 0) {
+ // _a = 1;
+ // _this.$message.error(
+ // "有学生班级不存在,请去添加后并重新上传"
+ // item.classid = res[0][0].id;
+ // error: function (xhr, textStatus) {
+ // console.log(textStatus);
+ // complete: function () {},
+ // if (_a == 1) {
+ // if (item.school != "") {
+ // schoolName: item.school,
+ // url: _this.$store.state.api + "selectS", //url路径
+ // "有学生学校不存在,请去添加后并重新上传"
+ // item.schoolid = res[0][0].id;
+ // for (var k = 0; k < arr.length; k++) {
+ // if (item.phone != "") {
+ // let params = { un: item.phone };
+ // url: _this.$store.state.api + "findPhone", //url路径
+ // if (res[0].length > 0) {
+ // _this.$message.error("有学生手机号码已被注册");
+ // if (item.mail != "") {
+ // let params = { un: item.mail };
+ // url: _this.$store.state.api + "findMail", //url路径
+ // _this.$message.error("有学生邮箱已被注册");
+ // if (item.sId != "") {
+ // let params = { un: item.sId };
+ // url: _this.$store.state.api + "findSid", //url路径
+ // _this.$message.error("有学生学号重复");
+ // _b = 2;
+ // if (_b == 2) {
+ // for (var i = 0; i < arr.length; i++) {
+ // let _i = i;
+ // let item = arr[i];
+ // let params = [
+ // alias: item.name,
+ // username: item.mail,
+ // userpassword: 123456,
+ // oid: _this.oid,
+ // ph: item.phone,
+ // cid: item.class,
+ // _this.ajax
+ // .post(_this.$store.state.api + "batchRegistration", params)
+ // userid: res.data.uid,
+ // username: item.name,
+ // sId: item.sId,
+ // type: 2,
+ // oid: res.data.oid,
+ // phone: res.data.ph ? res.data.ph : "",
+ // cid: res.data.cid ? res.data.cid : "",
+ // intro: "",
+ // sex: "0",
+ // .post(_this.$store.state.api + "updateUserByEdu", params)
+ // console.log(res);
+ // // _this.$message({
+ // // message: "新增成功",
+ // // type: "success",
+ // // });
+ // _this.getStudent();
+ // // if (_i == arr.length - 1) {
+ // // loading.close();
+ // // message: "上传成功",
+ // // _this.getStudent();
+ // // }
+ // _this.$message.error("上传失败");
+ let z = 2;
+ let newArr = JSON.stringify(arr);
+ arr: newArr,
+ oid: _this.oid,
+ _this.ajax
+ .post(_this.$store.state.api + "batchRegistrationMore", params)
+ if (res.data.type == 1) {
+ _this.$message.error("有学生手机号码已被注册");
+ z = 1;
+ if (res.data.type == 2) {
+ _this.$message.error("有学生邮箱已被注册");
+ if (res.data.type == 3) {
+ _this.$message.error("有学生学号重复");
+ if (z == 2) {
+ _this.$message({
+ _this.getStudent();
+ _this.fileListUpload = [];
+ reader.readAsArrayBuffer(f);
+ reader.readAsBinaryString(f);
+ getSchoolName() {
+ .get(this.$store.state.api + "selectSchoolName2", params)
+ this.schoolName = res.data[0][0].name;
+ deleteStudent(id, state) {
+ state = 0;
+ let params = [{ uid: id, state: state }];
+ this.$confirm("确定" + "删除" + "此学生吗?", "提示", {
+ .post(this.$store.state.api + "deleteStudent", params)
+ message: "操作成功",
+ this.$message.error("操作失败");
+ this.getSchoolName();
+.pb_head > span:nth-child(2) {
+ color: #828282;
+.head_right {
+.head_right > button:nth-child(1) {
+.head_right > button:nth-child(2) {
+.head_right > div {
+ color: #2a6dbe;
+.student_table >>> .el-table,.student_table >>> .el-table__body-wrapper{
+.de_button {
+ background: #5190fd;
+.add_student >>> .el-dialog__header {
+ background: #454545;
+.add_student >>> .el-dialog__title {
+.add_student >>> .el-dialog__headerbtn {
+.add_student >>> .el-form-item__label {
+.add_student >>> .el-form-item {
+.add_student >>> .el-form-item__content {
+.add_input {
+ width: 365px;
+.add_student >>> .el-dialog__footer {
+.logoImg > img {
+ line-height: 0px !important;
+.upload-demo >>> .el-button {
+ line-height: 0 !important;
+.userImg {
+ width: 40px;
+.delete {
+.delete > img {
+.newCss {
+.inputClass.is-active >>> .el-input__inner,
+.inputClass >>> .el-input__inner:focus {
+.inputClass >>> .el-select .el-input.is-focus .el-input__inner {
+.inputClass >>> .el-select .el-input__inner:focus {
@@ -0,0 +1,642 @@
+ background: unset;
+ padding: 20px;
+ left: 50%;
+ transform: translateX(-50%);
+ <span>评价管理</span>
+ <!-- <span>备注:教师可以根据课程、班级条件筛选学生并查看该学生信息</span> -->
+ goTo('/courseGM?userid=' + userid + '&oid=' + oid + '&org=' + org)
+ >项目管理</span
+ <div>项目筛选</div>
+ <el-option value="0" label="我的课程"></el-option>
+ <el-option value="1" label="他人课程"></el-option>
+ v-model="cn"
+ placeholder="筛选项目名称"
+ @input="search"
+ <div class="pb_content_body" style="margin:0px auto">
+ :data="tableData1"
+ prop="title"
+ label="项目"
+ ></el-table-column>
+ prop="uname"
+ label="创建人"
+ label="时间"
+ min-width="20"
+ <el-table-column label="操作" min-width="30">
+ '/worksDetail?cid=' +
+ scope.row.courseId +
+ oid
+ >查看学生</el-button>-->
+ <!-- <el-button type="primary" size="small" @click="getWorkData(scope.row)">生成报告</el-button> -->
+ class="btnClass"
+ @click="getWorkData(scope.row)"
+ >查看课程</el-button
+ @click="getStudnet(scope.row)"
+ >查看报告</el-button
+ <!-- <el-dialog
+ title="查看报告"
+ <WorkDate :dataJson="dataJson"></WorkDate>
+ </el-dialog>-->
+ <WorkDate
+ :dataJson="dataJson"
+ :uid="userid"
+ :cid="dataJson.courseId"
+ :ooid="oid"
+ v-if="dialogVisible"
+ class="workdates"
+ ></WorkDate>
+ <div class="cancelbox" v-if="dialogVisible">
+ <el-button @click="dialogVisibleBao = true" type="primary" size="small" class="btnClass"
+ >自定义导出</el-button
+ <el-button @click="cancel" type="primary" size="small" class="btnClass">返回</el-button>
+ dataJson.courseId +
+ >查看作业</el-button
+ title="自定义导出报告"
+ :visible.sync="dialogVisibleBao"
+ width="550px"
+ class="dialog_diy r_diy"
+ <Report :cid="dataJson.courseId"></Report>
+ <span slot="footer" class="dialog-footer"> </span>
+ title="选择学生"
+ :visible.sync="signDialog"
+ width="500px"
+ class="dialog_diy check_diy"
+ <div class="student_search" style="margin-bottom: 10px">
+ <div>筛选</div>
+ placeholder="请选择学生"
+ @change="searchWork2"
+ v-loading="isLoading2"
+ :data="res2"
+ :height="400"
+ :header-cell-style="{ background: 'rgb(238,238,238)' }"
+ prop="sName"
+ label="姓名"
+ @click="getReport(scope.row)"
+ <div style="margin-top: 10px" class="student_page">
+ :total="total2"
+ @current-change="handleCurrentChange2"
+ <el-button @click="signDialog = false" class="cancel_button"
+ <div class="report_box" v-if="reportVisible">
+ <studentReport
+ :checkCourse="checkCourse"
+ :checkStudent="checkStudent"
+ :oid="oid"
+ ></studentReport>
+ <div class="cancelbox" v-if="reportVisible">
+ <el-button @click="cancelR" type="primary" size="small" class="btnClass">返回</el-button>
+import WorkDate from "./components/workDataGM";
+import Report from "./components/reportGM";
+import studentReport from "./components/studentReportGM";
+ WorkDate,
+ Report,
+ studentReport,
+ tableData1: [],
+ cn: "",
+ dialogVisibleBao: false,
+ dataJson: {},
+ signDialog: false,
+ isLoading2: false,
+ page2: 1,
+ total2: 0,
+ res2: [],
+ checkCourse: "",
+ reportVisible: false,
+ checkStudent: "",
+ this.getProject();
+ handleCurrentChange2(val) {
+ this.page2 = val;
+ this.getStudnet();
+ cn: this.sClass,
+ getProject() {
+ cn: this.cn,
+ .get(this.$store.state.api + "getProject", params)
+ this.tableData1 = res.data[0];
+ getWorkData(res) {
+ this.dataJson = res;
+ cancel() {
+ this.dataJson = "";
+ cancelR() {
+ this.checkStudent = "";
+ this.reportVisible = false;
+ this.signDialog = true;
+ (this.page2 = 1), this.getStudnet();
+ getStudnet(row) {
+ this.isLoading2 = true;
+ this.checkCourse = row ? row.courseId : this.checkCourse;
+ cid: this.checkCourse,
+ stage: "",
+ task: "",
+ page: this.page2,
+ this.isLoading2 = false;
+ this.total2 = res.data[0].length > 0 ? res.data[0][0].num : 0;
+ this.res2 = res.data[0];
+ getReport(row) {
+ this.checkStudent = row.userid;
+ this.reportVisible = true;
+ this.signDialog = false;
+ // this.getClass();
+ // this.getGroup();
+.student_search > div:nth-child(1) {
+ min-width: 60px;
+.student_search >>> .el-input__inner {
+.check_diy >>> .el-dialog__body {
+ padding-bottom: 0;
+.r_diy >>> .el-dialog__footer {
+ height: 570px;
+.workdates {
+ z-index: 1;
+.cancelbox {
+ z-index: 2;
+ padding: 0 90px 0px 0px;
+.report_box {
+ background: rgb(231, 242, 252);
+.student_search.is-active >>> .el-input__inner,
+.student_search >>> .el-input__inner:focus {
+.btnClass {
@@ -3,18 +3,24 @@ import Router from 'vue-router'
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'
import classA from '@/components/pages/class'
+import classGM from '@/components/pages/classGM'
import course from '@/components/pages/course'
+import courseGM from '@/components/pages/courseGM'
import courseDetail from '@/components/pages/courseDetail'
import data from '@/components/pages/data'
+import dataGM from '@/components/pages/dataGM'
import notice from '@/components/pages/notice'
import student from '@/components/pages/student'
+import studentGM from '@/components/pages/studentGM'
import works from '@/components/pages/works'
+import worksGM from '@/components/pages/worksGM'
import worksDetail from '@/components/pages/worksDetail'
import login from '@/components/login'
import ask from '@/components/pages/ask'
import addCourse from '@/components/pages/addCourse'
-import addCourse2 from '@/components/pages/addCourse2'
+import addCourseGM from '@/components/pages/addCourseGM'
import library from '@/components/pages/library'
+import libraryGM from '@/components/pages/libraryGM'
import note from '@/components/pages/note'
import Grid from '@/components/pages/Grid'
import demo from '@/components/pages/demo'
@@ -32,6 +38,7 @@ import audioDemo from '@/components/pages/audioDemo'
import Ttype from '@/components/pages/Ttype'
import banner from '@/components/pages/banner'
import CaseDesign from '@/components/pages/CaseDesign'
+import CaseDesignGM from '@/components/pages/CaseDesignGM'
import eventCenter from '@/components/pages/race/eventCenter'
import addRace from '@/components/pages/race/addRace'
import anliDetail from '@/components/pages/race/eventCenter/anliDetail'
@@ -46,6 +53,13 @@ export default new Router({
meta: {
requireAuth: ''
+ },{
+ path: '/classGM',
+ name: 'classGM',
+ component: classGM,
+ meta: {
+ requireAuth: ''
// {
// path: '/',
@@ -58,6 +72,13 @@ export default new Router({
requireAuth: '' // 是否需要判断是否登录,这里是需要判断
+ path: '/courseGM',
+ component: courseGM,
+ requireAuth: '' // 是否需要判断是否登录,这里是需要判断
{
path: '/course/courseDetail',
component: courseDetail,
@@ -73,8 +94,8 @@ export default new Router({
- path: '/course/addCourse2',
- component: addCourse2,
+ path: '/course/addCourseGM',
+ component: addCourseGM,
@@ -86,7 +107,15 @@ export default new Router({
- }, {
+ path: '/dataGM',
+ name: 'dataGM',
+ component: dataGM,
+ }, {
path: '/notice',
name: 'notice',
component: notice,
@@ -102,6 +131,14 @@ export default new Router({
+ path: '/studentGM',
+ name: 'studentGM',
+ component: studentGM,
path: '/ask',
name: 'ask',
@@ -125,6 +162,14 @@ export default new Router({
+ path: '/worksGM',
+ name: 'worksGM',
+ component: worksGM,
path: '/worksDetail',
name: 'worksDetail',
@@ -141,6 +186,14 @@ export default new Router({
+ path: '/libraryGM',
+ name: 'libraryGM',
+ component: libraryGM,
path: '/login',
name: 'login',
@@ -277,6 +330,13 @@ export default new Router({
requireAuth: '' // 不需要鉴权
+ path: '/CaseDesignGM',
+ name: 'CaseDesignGM',
+ component: CaseDesignGM,
+ requireAuth: '' // 不需要鉴权
}, {
path: '/eventCenter',
name: 'eventCenter',