Browse Source

目标管理

zengyicheng 2 years ago
parent
commit
59560ba183

+ 2 - 0
src/App.vue

@@ -81,6 +81,8 @@ export default {
         "/liveRoom",
         "/addPPt",
         "/studyLibrary",
+        "/GridList",
+        "/wordList",
         // "/course/addCourse",
         // "/ask",
         // "/ask/askList",

BIN
src/assets/icon/word/gridIcon.png


BIN
src/assets/icon/word/noImg.png


BIN
src/assets/icon/word/noRoom.png


BIN
src/assets/icon/word/notice.png


BIN
src/assets/icon/word/roomImg.png


BIN
src/assets/icon/word/topBg.png


+ 6 - 1
src/components/pages/Grid.vue

@@ -361,7 +361,7 @@ export default {
       dialogImgVisible: false,
       dialogImageUrl: "",
       remarks: "",
-      goNum: "",
+      goNum: this.$route.query.goNum ? this.$route.query.goNum : "",
       numNum: "",
       file: {},
       gIndex: "",
@@ -771,6 +771,11 @@ export default {
         .get(this.$store.state.api + "getUser", params)
         .then((res) => {
           this.userinfo = res.data[0][0];
+          if(this.goNum != ""){
+            this.goRoom(this.goNum);
+          }else{
+            this.checkNum();
+          }
           console.log(res.data[0][0]);
         })
         .catch((err) => {

+ 431 - 0
src/components/pages/GridList.vue

@@ -0,0 +1,431 @@
+<template>
+  <div class="pb_content g_body">
+    <div class="topBg">
+      <div class="wordIcon">
+        <div class="docImg">
+          <img src="../../assets/icon/word/gridIcon.png" alt="" />
+        </div>
+        <div>思维网格</div>
+      </div>
+      <div class="searchRoom">
+        <div class="firstTop">
+          <input
+            type="text"
+            placeholder="输入房间名称/号码...."
+            v-model="roomS"
+          />
+          <div @click="getRoomList">确定</div>
+        </div>
+        <div class="lastTop">
+          <div class="notice">
+            <img src="../../assets/icon/word/notice.png" alt="" />
+          </div>
+          <div>若找不到房间,输入房间号或名称进行搜索哦!</div>
+        </div>
+      </div>
+      <div class="addOrCreateRoom">
+        <div @click="dialogVisible = true">加入房间</div>
+        <div
+          v-if="tType == '1'"
+          @click="
+            goTo(
+              '/Grid?userid=' +
+                userid +
+                '&oid=' +
+                oid +
+                '&cid=' +
+                cid +
+                '&tType=' +
+                tType
+            )
+          "
+        >
+          创建房间
+        </div>
+      </div>
+    </div>
+    <div class="roomBox">
+      <div class="roomDiv" v-for="(r, rIndex) in roomList" :key="rIndex">
+        <div class="roomImg">
+          <img src="../../assets/icon/word/noImg.png" alt="" />
+        </div>
+        <div class="roomName">
+          <div>{{ r.name ? r.name : "暂无房间名称" }}</div>
+          <div>房间号 {{ r.num }}</div>
+        </div>
+        <div class="enterRoom" @click="enterRoom(r.num)">进入房间</div>
+      </div>
+      <div v-if="roomList.length == 0" class="noRoom">
+        <img src="../../assets/icon/word/noRoom.png" alt="" />
+      </div>
+    </div>
+
+    <el-dialog
+      title="加入房间"
+      class="addOrCreateRoom"
+      :visible.sync="dialogVisible"
+      :append-to-body="true"
+      width="500px"
+      :before-close="handleClose"
+    >
+      <div slot="title" class="header-title">
+        <div class="title_add_student">加入房间</div>
+      </div>
+      <div class="addRoom_box">
+        <div class="inputBox">
+          <el-input
+            v-model="goNum"
+            placeholder="请输入要加入的房间号"
+          ></el-input>
+          <div class="room_b">
+            备注:输入房间号点击加入房间或点击创建房间直接创建房间
+          </div>
+          <div class="room_btn">
+            <el-button
+              class="roomBtn"
+              type="primary"
+              @click="
+                goTo(
+                  '/Grid?userid=' +
+                    userid +
+                    '&oid=' +
+                    oid +
+                    '&cid=' +
+                    cid +
+                    '&tType=' +
+                    tType +
+                    '&goNum=' +
+                    goNum
+                )
+              "
+              >加入房间</el-button
+            >
+            <!-- <el-button class="roomBtn" type="primary" @click="goRoom(goNum)"
+              >加入房间</el-button
+            >
+            <el-button class="roomBtn" type="primary" @click="checkNum"
+              >创建房间</el-button
+            > -->
+          </div>
+        </div>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import Clipboard from "clipboard";
+import draggable from "vuedraggable";
+export default {
+  components: {
+    //调用组件
+    draggable,
+  },
+  data() {
+    return {
+      dialogVisible: false,
+      goNum: "",
+      roomList: [],
+      copyText: "",
+      userid: this.$route.query.userid,
+      oid: this.$route.query.oid,
+      cid: this.$route.query.cid,
+      tType: this.$route.query.tType,
+      roomS: "",
+    };
+  },
+  methods: {
+    goTo(path) {
+      this.$router.push(path);
+    },
+    copy() {
+      this.copyText =
+        this.$refs.inviteT.innerHTML +
+        "\n" +
+        this.$refs.invite1.innerHTML +
+        "\n" +
+        this.$refs.invite2.innerHTML +
+        "\n" +
+        this.$refs.invite3.innerText +
+        "\n" +
+        this.$refs.invite4.innerHTML;
+      var clipboard = new Clipboard(".tag-read");
+      clipboard.on("success", (e) => {
+        this.$message.success("复制成功");
+        console.log("复制成功");
+        clipboard.destroy(); // 释放内存
+      });
+      clipboard.on("error", (e) => {
+        console.log("不支持复制,该浏览器不支持自动复制");
+        clipboard.destroy(); // 释放内存
+      });
+    },
+    handleClose(done) {
+      done();
+    },
+    getRoomList() {
+      let params = {
+        uid: this.userid,
+        oid: this.oid,
+        cid: this.cid,
+        cu: "",
+        cn: this.roomS,
+      };
+      this.ajax
+        .get(this.$store.state.api + "selectRoomList", params)
+        .then((res) => {
+          this.roomList = res.data[0];
+        })
+        .catch((err) => {
+          console.error(err);
+        });
+    },
+    enterRoom(num) {
+      this.goNum = num;
+      this.goTo(
+        "/Grid?userid=" +
+          this.userid +
+          "&oid=" +
+          this.oid +
+          "&cid=" +
+          this.cid +
+          "&tType=" +
+          this.tType +
+          "&goNum=" +
+          this.goNum
+      );
+    },
+  },
+
+  created() {
+    this.getRoomList();
+  },
+};
+</script>
+
+<style scoped>
+.g_body {
+  width: 100%;
+  height: 100%;
+  margin: 0 !important;
+  background: #e6eaf0;
+}
+
+.topBg {
+  background: url("../../assets/icon/word/topBg.png");
+  width: 100%;
+  object-fit: cover;
+  height: 220px;
+  display: flex;
+  flex-direction: row;
+  flex-wrap: nowrap;
+  align-items: center;
+  justify-content: space-between;
+  background-size: 100% 100%;
+}
+
+.wordIcon {
+  display: flex;
+  flex-direction: row;
+  flex-wrap: nowrap;
+  align-items: center;
+  margin: 0 0 100px 45px;
+}
+
+.docImg {
+  width: 40px;
+  height: 40px;
+}
+
+.docImg > img,
+.notice > img,
+.roomImg > img,
+.noRoom > img {
+  width: 100%;
+  height: 100%;
+}
+
+.notice {
+  width: 20px;
+  height: 20px;
+}
+
+.wordIcon > div:nth-child(2) {
+  font-size: 20px;
+  color: #fff;
+  margin-left: 10px;
+}
+
+.addOrCreateRoom {
+  margin: 0 45px 100px 0;
+  display: flex;
+  flex-direction: row;
+  flex-wrap: nowrap;
+  align-items: center;
+}
+
+.addOrCreateRoom > div {
+  width: 90px;
+  background: #199cfe;
+  height: 30px;
+  color: #fff;
+  border-radius: 5px;
+  text-align: center;
+  line-height: 30px;
+  font-size: 12px;
+  cursor: pointer;
+}
+
+.addOrCreateRoom > div:nth-child(2) {
+  margin-left: 20px;
+}
+
+.searchRoom {
+  margin-top: 100px;
+}
+
+.firstTop {
+  display: flex;
+  flex-direction: row;
+  flex-wrap: nowrap;
+  align-items: center;
+}
+
+.firstTop > input {
+  width: 350px;
+  height: 40px;
+  outline: none;
+  border: none;
+  border-radius: 5px;
+  text-indent: 10px;
+}
+
+.firstTop > div {
+  width: 65px;
+  background: #5e5e5e;
+  color: #fff;
+  height: 40px;
+  text-align: center;
+  line-height: 40px;
+  border-radius: 5px;
+  margin-left: 15px;
+  cursor: pointer;
+}
+
+.lastTop {
+  display: flex;
+  flex-direction: row;
+  flex-wrap: nowrap;
+  align-items: center;
+  margin-top: 10px;
+  color: #fff;
+}
+
+.roomBox {
+  width: 98%;
+  margin: 20px 0 0 25px;
+  display: flex;
+  flex-direction: row;
+  flex-wrap: wrap;
+  justify-content: flex-start;
+  align-items: center;
+}
+
+.roomDiv {
+  border-radius: 5px;
+  background: #fff;
+  width: 250px;
+  position: relative;
+  height: 260px;
+  margin: 0 30px 30px 0;
+}
+
+.roomNumer {
+  position: absolute;
+  right: 8px;
+  color: #bababa;
+  top: 2px;
+}
+
+.roomImg {
+  width: 250px;
+  margin: 0 auto;
+}
+
+.roomName {
+  display: flex;
+  flex-direction: column;
+  flex-wrap: nowrap;
+  align-items: flex-start;
+  padding: 15px 10px;
+}
+
+.roomName > div:nth-child(1) {
+  font-size: 15px;
+}
+
+.roomName > div:nth-child(2) {
+  color: #bdbdbd;
+  padding-top: 5px;
+  font-size: 12px;
+}
+
+.enterRoom {
+  background: #3e86ff;
+  width: 80%;
+  text-align: center;
+  margin: 0 auto;
+  height: 35px;
+  line-height: 35px;
+  color: #fff;
+  border-radius: 3px;
+  cursor: pointer;
+}
+
+body::-webkit-scrollbar {
+  /*滚动条整体样式*/
+  width: 6px;
+  /*高宽分别对应横竖滚动条的尺寸*/
+  height: 6px;
+}
+.addOrCreateRoom >>> .el-dialog {
+  height: 200px;
+}
+.addOrCreateRoom >>> .el-dialog__header {
+  background: #32455b;
+  color: #fff;
+  height: 40px;
+  line-height: 40px;
+  padding: 0 0 0 20px;
+}
+.addOrCreateRoom >>> .el-dialog__headerbtn {
+  top: 13px !important;
+}
+.addOrCreateRoom >>> .el-dialog__body {
+  background: #f3f3f3;
+  height: 100%;
+}
+.addRoom_box {
+  background: #fff;
+  width: 100%;
+  height: 100%;
+  position: relative;
+}
+.inputBox {
+  padding: 30px 0 0 20px;
+}
+.inputBox >>> .el-input {
+  width: 95% !important;
+}
+.room_b {
+  margin: 10px 0;
+}
+.room_btn {
+  position: absolute;
+  bottom: 35px;
+  left: 39%;
+}
+.noRoom {
+  margin: 10% auto 0;
+}
+</style>

+ 445 - 25
src/components/pages/addCourse.vue

@@ -244,6 +244,127 @@
                 ></el-switch>
               </div> -->
             </div>
+            <div class="whiteBg" style="border-radius: 0; margin-top: 15px">
+              <div class="right_title">评价体系</div>
+              <div style="width: 95%; margin: 15px auto">
+                <div
+                  style="
+                    width: 55%;
+                    display: flex;
+                    flex-direction: row;
+                    flex-wrap: nowrap;
+                    align-content: center;
+                    align-items: center;
+                    justify-content: space-between;
+                  "
+                >
+                  <div
+                    style="
+                      display: flex;
+                      flex-direction: row;
+                      flex-wrap: nowrap;
+                      align-items: center;
+                    "
+                  >
+                    <div style="margin-right: 15px">请选择评价指标</div>
+                    <div>
+                      <el-select
+                        v-model="evalua"
+                        placeholder="请选择体系"
+                        @change="checkEva"
+                      >
+                        <el-option
+                          v-for="(e, eIndex) in evaJuri"
+                          :key="eIndex"
+                          :label="e.title"
+                          :value="e.id"
+                        ></el-option>
+                      </el-select>
+                    </div>
+                  </div>
+                  <div
+                    @click="openT"
+                    class="addPeople"
+                    style="background: #6b92c9; margin: 0 0 0 15px"
+                  >
+                    前往设置目标管理
+                  </div>
+                </div>
+                <div
+                  v-if="evalua != ''"
+                  style="
+                    border: 1px solid #e5e5e5;
+                    width: 55%;
+                    margin-top: 20px;
+                    box-shadow: 3px 1px 15px 3px #e0e0e0;
+                  "
+                >
+                  <div class="e_add_top">
+                    <div class="e_add_title">
+                      <span>当前使用评价体系</span>
+                      <span>{{ eTitle }} </span>
+                      <img
+                        src="../../assets/line.png"
+                        class="cru_line"
+                        style="
+                          width: 125px;
+                          height: 20px;
+                          bottom: -10px;
+                          left: 155px;
+                        "
+                      />
+                      <!-- <el-input
+                        v-model="eTitle"
+                        placeholder="请输入名称"
+                        @change="setMindData"
+                      ></el-input> -->
+                    </div>
+                  </div>
+                  <div class="e_add_content">
+                    <div class="e_add_list_pbox">
+                      <div class="e_add_list_pbox_title">
+                        <span class="type_title">切换模式</span>
+                        <div class="type_content">
+                          <span
+                            :class="{ active: typeMode == 1 }"
+                            @click="typeMode = 1"
+                            >目标树</span
+                          >
+                          <span
+                            :class="{ active: typeMode == 2 }"
+                            @click="typeMode = 2"
+                            >目标罗盘</span
+                          >
+                          <span
+                            :class="{ active: typeMode == 3 }"
+                            @click="typeMode = 3"
+                            >目标看板</span
+                          >
+                        </div>
+                      </div>
+                      <div class="e_add_list_pbox_content">
+                        <Mind
+                          :showBar="false"
+                          :mindData="data"
+                          v-show="typeMode == 1"
+                        ></Mind>
+                        <Sunburst
+                          :Josn="eJson"
+                          :num="eJSONNum"
+                          v-if="typeMode == 2"
+                        ></Sunburst>
+                        <SeeBoard
+                          :Josn="eJson"
+                          :num="eJSONNum"
+                          :ename="eTitle"
+                          v-if="typeMode == 3"
+                        ></SeeBoard>
+                      </div>
+                    </div>
+                  </div>
+                </div>
+              </div>
+            </div>
           </div>
           <div class="rightBox" v-if="this.steps == 2">
             <div
@@ -748,7 +869,7 @@
                               :class="
                                 itemTool.toolType == 0 ? 'isChooseActive' : ''
                               "
-                              @click="itemTool.toolType = 0,$forceUpdate();"
+                              @click="(itemTool.toolType = 0), $forceUpdate()"
                             >
                               展示类
                             </div>
@@ -756,7 +877,7 @@
                               :class="
                                 itemTool.toolType == 1 ? 'isChooseActive' : ''
                               "
-                              @click="itemTool.toolType = 1,$forceUpdate();"
+                              @click="(itemTool.toolType = 1), $forceUpdate()"
                             >
                               思维类
                             </div>
@@ -764,7 +885,7 @@
                               :class="
                                 itemTool.toolType == 2 ? 'isChooseActive' : ''
                               "
-                              @click="itemTool.toolType = 2,$forceUpdate();"
+                              @click="(itemTool.toolType = 2), $forceUpdate()"
                             >
                               评价类
                             </div>
@@ -772,7 +893,7 @@
                               :class="
                                 itemTool.toolType == 3 ? 'isChooseActive' : ''
                               "
-                              @click="itemTool.toolType = 3,$forceUpdate();"
+                              @click="(itemTool.toolType = 3), $forceUpdate()"
                             >
                               创作类
                             </div>
@@ -1942,8 +2063,11 @@
 import "../../common/aws-sdk-2.235.1.min.js";
 import $ from "jquery";
 import EditorBar from "../../components/tools/wangEnduit";
+import Mind from "../tools/jsmind";
+import Sunburst from "../tools/sunburst";
+import SeeBoard from "../tools/seeBoard";
 export default {
-  components: { EditorBar },
+  components: { EditorBar, Mind, Sunburst, SeeBoard },
   data() {
     return {
       checkAll: false,
@@ -1981,6 +2105,7 @@ export default {
       dialogVisible6: false,
       dialogVisible7: false,
       dialogVisible8: false,
+      dialogVisible9: false,
       dialogVisibleClass: false,
       dialogVisibleMember: false,
       publicTool: 0,
@@ -1991,6 +2116,24 @@ export default {
       cid: this.$route.query.cid != undefined ? this.$route.query.cid : "",
       cover: [], //课程封面
       myWord: [],
+      evaJuri: [],
+      evalua: "",
+      eTitle: "",
+      eJson: {},
+      fid: "", //一级
+      sid: "", //二级
+      tid: "", //二级
+      typeMode: 1,
+      eJSONNum: 0,
+      data: {
+        meta: {
+          name: "example",
+          author: "dd@163.com",
+          version: "0.2",
+        },
+        format: "node_array",
+        data: [{ id: "root", isroot: true, topic: "" }],
+      },
       askJson: {
         askCount: 1,
         askTitle: "",
@@ -2145,9 +2288,17 @@ export default {
       } else {
         if (this.cidType == 0) {
           this.steps--;
+          if (this.steps == 1) {
+            setTimeout(() => {
+              this.checkEva();
+            }, 0);
+          }
         } else {
           if (this.steps == 3) {
             this.steps = 1;
+            setTimeout(() => {
+              this.checkEva();
+            }, 0);
           }
         }
       }
@@ -2156,6 +2307,9 @@ export default {
       if (this.cidType == 0) {
         if (s == 1) {
           this.steps = 1;
+          setTimeout(() => {
+            this.checkEva();
+          }, 0);
         }
         if (s == 2) {
           this.steps = 2;
@@ -2168,6 +2322,9 @@ export default {
       } else {
         if (s == 1) {
           this.steps = 1;
+          setTimeout(() => {
+            this.checkEva();
+          }, 0);
         }
         if (s == 3) {
           this.cTemplate = this.templateC.content;
@@ -2199,9 +2356,9 @@ export default {
               this.$message.error("请将信息填写完整");
               return;
             } else {
-              if(this.userid != this.courseUserid){
+              if (this.userid != this.courseUserid) {
                 this.updateWork2();
-              }else{
+              } else {
                 this.updateWork();
               }
               this.steps++;
@@ -2236,9 +2393,9 @@ export default {
               this.$message.error("请将信息填写完整");
               return;
             } else {
-              if(this.userid != this.courseUserid){
+              if (this.userid != this.courseUserid) {
                 this.updateWork2();
-              }else{
+              } else {
                 this.updateWork();
               }
               this.steps++;
@@ -2303,6 +2460,9 @@ export default {
           });
       }
     },
+    openT() {
+      window.parent.postMessage({ tools: "25" }, "*");
+    },
     deleteTask(i) {
       var _this = this;
       if (_this.time()) {
@@ -2817,6 +2977,7 @@ export default {
                     status: "success",
                   },
                 ]),
+          evaId: this.evalua,
           astudent:
             this.checkboxList2.length > 0 ? this.checkboxList2.join(",") : "",
           see: this.isTeacherSee == true ? 0 : 1,
@@ -2847,20 +3008,21 @@ export default {
       window.parent.postMessage({ cid: this.courseId, type: "1" }, "*");
     },
     updateWork2() {
-      let _unitIndex = this.unitIndex
-        for (
-          var j = 0;
-          j < this.unitJson[_unitIndex].chapterInfo[0].taskJson.length;
-          j++
-        ) {
-          if (this.unitJson[_unitIndex].chapterInfo[0].taskJson[j].eList) {
-            this.unitJson[_unitIndex].chapterInfo[0].taskJson[j].eList = this.unitJson[
-              _unitIndex
-            ].chapterInfo[0].taskJson[j].eList.filter((ele) => {
-              return ele.value != "";
-            });
-          }
+      let _unitIndex = this.unitIndex;
+      for (
+        var j = 0;
+        j < this.unitJson[_unitIndex].chapterInfo[0].taskJson.length;
+        j++
+      ) {
+        if (this.unitJson[_unitIndex].chapterInfo[0].taskJson[j].eList) {
+          this.unitJson[_unitIndex].chapterInfo[0].taskJson[j].eList =
+            this.unitJson[_unitIndex].chapterInfo[0].taskJson[j].eList.filter(
+              (ele) => {
+                return ele.value != "";
+              }
+            );
         }
+      }
       let params = [
         {
           cid: this.cid,
@@ -2905,6 +3067,7 @@ export default {
           title: this.courseName,
           brief: this.courseText.replace(/%/g, "%25"),
           cover: this.cover.length > 0 ? JSON.stringify(this.cover) : "",
+          evaId: this.evalua,
           astudent:
             this.checkboxList2.length > 0 ? this.checkboxList2.join(",") : "",
           see: this.isTeacherSee == true ? 0 : 1,
@@ -2917,7 +3080,7 @@ export default {
         },
       ];
       this.ajax
-        .post(this.$store.state.api + "updateWorkNew3", params)
+        .post(this.$store.state.api + "updateWorkNew2", params)
         .then((res) => {
           this.$message({
             message: "修改成功",
@@ -3470,6 +3633,7 @@ export default {
             }
             this.courseName = res.data[0][0].title;
             this.courseText = res.data[0][0].brief;
+            this.evalua = res.data[0][0].evaId;
             this.cover = JSON.parse(res.data[0][0].cover);
             this.noneBtnImg = this.cover.length >= 1;
             // this.checkboxList =
@@ -3499,6 +3663,9 @@ export default {
             this.seleteCourseUpdate();
             // }, 5000);
             this.$forceUpdate();
+            setTimeout(() => {
+              this.checkEva();
+            }, 0);
           })
           .catch((err) => {
             console.error(err);
@@ -3518,13 +3685,13 @@ export default {
           for (let i = 0; i < unitJson.length; i++) {
             if (i == _unitIndex) {
               continue;
-            }else if(i > this.unitJson.length - 1){
+            } else if (i > this.unitJson.length - 1) {
               _unitJson.push(unitJson[i]);
             } else {
               _unitJson[i] = unitJson[i];
             }
           }
-          this.unitJson = _unitJson
+          this.unitJson = _unitJson;
           this.$forceUpdate();
           this.timer = setTimeout(() => {
             this.seleteCourseUpdate();
@@ -3561,6 +3728,68 @@ export default {
           console.error(err);
         });
     },
+    checkEva() {
+      if (this.evalua != "") {
+        for (var i = 0; i < this.evaJuri.length; i++) {
+          if (this.evalua == this.evaJuri[i].id) {
+            this.eTitle = this.evaJuri[i].title;
+            this.eJson = JSON.parse(this.evaJuri[i].content);
+          }
+        }
+        this.$forceUpdate();
+        setTimeout(() => {
+          this.setMindData();
+        }, 0);
+      }
+    },
+    selectEva() {
+      let params = {
+        oid: this.oid,
+      };
+      this.ajax
+        .get(this.$store.state.api + "selectAllEvaluation", params)
+        .then((res) => {
+          this.evaJuri = res.data[0];
+        })
+        .catch((err) => {
+          console.error(err);
+        });
+    },
+    setMindData() {
+      this.data.data = [];
+      this.data.data.push({ id: "root", isroot: true, topic: this.eTitle });
+      let _eJson = Object.keys(this.eJson);
+      let _e = this.eJson;
+      for (let i = 0; i < _eJson.length; i++) {
+        let element = _e[_eJson[i]];
+        this.data.data.push({
+          id: element.id,
+          parentid: "root",
+          topic: element.name,
+        });
+        let _eJsonc = Object.keys(element.child);
+        let _e2 = element.child;
+        for (let j = 0; j < _eJsonc.length; j++) {
+          let _ec = _e2[_eJsonc[j]];
+          this.data.data.push({
+            id: _ec.id,
+            parentid: element.id,
+            topic: _ec.name,
+          });
+          let _eJsonz = Object.keys(_ec.child);
+          let _e3 = _ec.child;
+          for (let z = 0; z < _eJsonz.length; z++) {
+            let _ez = _e3[_eJsonz[z]];
+            this.data.data.push({
+              id: _ez.id,
+              parentid: _ec.id,
+              topic: _ez.name,
+            });
+          }
+        }
+      }
+      this.$forceUpdate();
+    },
     /*添加评价 */
     addEList(index, tIndex) {
       this.unitJson[index].chapterInfo[0].taskJson[tIndex].eList
@@ -3600,6 +3829,7 @@ export default {
     this.getClass();
     this.getTemplate();
     this.selectType();
+    this.selectEva();
     this.loading = false;
     setTimeout(() => {
       this.selectCourseDetail();
@@ -5071,4 +5301,194 @@ ol {
   /* height: 700px; */
   overflow: auto;
 }
+.e_add_top {
+  display: flex;
+  justify-content: space-between;
+  padding: 20px 20px 0 20px;
+  border-radius: 3px;
+  background: #fff;
+}
+.e_add_title2 {
+  display: flex;
+  align-items: center;
+}
+
+.e_add_title2 span {
+  width: 40px;
+}
+
+.e_add_title {
+  display: flex;
+  align-items: center;
+  color: #b8b8b8;
+  font-size: 18px;
+  position: relative;
+  height: 40px;
+}
+.e_add_title span {
+  margin-right: 10px;
+}
+.e_add_title .el_input {
+  width: 300px;
+}
+.e_add_title >>> .el-input__inner {
+  width: 400px;
+}
+
+.e_add_btn {
+}
+.e_add_content {
+  display: flex;
+  width: 750px;
+  height: 550px;
+  margin-top: 10px;
+}
+.e_add_list {
+  background: #fff;
+  height: 500px;
+  width: 210px;
+  position: relative;
+  margin: 15px 5px 0 0;
+  flex-shrink: 0;
+  display: flex;
+  flex-direction: column;
+}
+.e_add_list_title {
+  font-size: 20px;
+  width: 100%;
+  box-sizing: border-box;
+  padding: 15px 40px;
+  text-align: center;
+  border-bottom: 1px solid #eaeaea;
+  position: relative;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  height: 57px;
+  background: #f6f6f6;
+}
+.e_add_list_title span {
+  overflow: hidden;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+}
+.e_add_list_title img {
+  position: absolute;
+  right: 15px;
+  width: 25px;
+  cursor: pointer;
+  top: 50%;
+  transform: translateY(-50%);
+}
+.e_add_list_body {
+  height: calc(100% - 187px);
+  overflow: auto;
+}
+.e_add_list_child {
+  width: 100%;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  position: relative;
+  box-sizing: border-box;
+  padding: 15px 40px;
+  text-align: center;
+}
+.e_add_list_child span {
+  overflow: hidden;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+  cursor: pointer;
+}
+.e_add_list_child img {
+  position: absolute;
+  right: 10px;
+  width: 21px;
+  cursor: pointer;
+  top: 50%;
+  transform: translateY(-50%);
+}
+.e_add_list_child + .e_add_list_child {
+  border-top: 1px solid #eaeaea;
+}
+.e_add_list_child .active {
+  color: #409eff;
+}
+.e_add_list_btn {
+  position: absolute;
+  bottom: 0;
+  height: 50px;
+  background: rgb(120, 120, 254);
+  width: 100%;
+  color: #fff;
+  font-size: 16px;
+  text-align: center;
+  line-height: 50px;
+  cursor: pointer;
+}
+.e_add_list_detail {
+  position: absolute;
+  bottom: 0;
+  height: 130px;
+  background: rgb(120, 120, 254);
+  width: 100%;
+  color: #fff;
+  font-size: 16px;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+.e_add_list_detail textarea {
+  height: 90%;
+  width: 95%;
+  border: none;
+  resize: none;
+  outline: none;
+  padding: 5px;
+  box-sizing: border-box;
+}
+
+.e_add_list_pbox {
+  width: 750px;
+  /* height: 600px; */
+}
+.e_add_list_pbox_title {
+  height: 50px;
+  background: #fff;
+  display: flex;
+  align-items: center;
+  width: 100%;
+  box-sizing: border-box;
+  padding: 0 20px;
+}
+
+.type_title {
+  font-size: 18px;
+  font-weight: 700;
+}
+.type_content {
+  font-size: 16px;
+  margin-left: 30px;
+}
+.type_content span + span {
+  margin-left: 20px;
+}
+.type_content span {
+  cursor: pointer;
+  padding-bottom: 5px;
+  box-sizing: border-box;
+}
+
+.type_content .active {
+  color: #409eff;
+  border-bottom: 2px solid #409eff;
+}
+
+.e_add_list_pbox_content {
+  height: calc(100% - 50px);
+  display: flex;
+  align-items: center;
+  width: 100%;
+  background: #fff;
+}
 </style>

+ 391 - 0
src/components/pages/wordList.vue

@@ -0,0 +1,391 @@
+<template>
+  <div class="pb_content g_body">
+    <div class="topBg">
+      <div class="wordIcon">
+        <div class="docImg">
+          <img src="../../assets/icon/secondToolList/doc.png" alt="" />
+        </div>
+        <div>协同文档</div>
+      </div>
+      <div class="searchRoom">
+        <div class="firstTop">
+          <input
+            type="text"
+            placeholder="输入房间名称/号码...."
+            v-model="roomS"
+          />
+          <div @click="getFileList">确定</div>
+        </div>
+        <div class="lastTop">
+          <div class="notice">
+            <img src="../../assets/icon/word/notice.png" alt="" />
+          </div>
+          <div>若找不到房间,输入房间号或名称进行搜索哦!</div>
+        </div>
+      </div>
+      <div class="addOrCreateRoom">
+        <div @click="dialogVisible = true">加入房间</div>
+        <div v-if="tType == '1'" @click="jumpWord">创建房间</div>
+      </div>
+    </div>
+    <div class="roomBox">
+      <div class="roomDiv" v-for="(f, fIndex) in fileList" :key="fIndex">
+        <div class="roomNumer">{{ f.num }}</div>
+        <div class="roomImg">
+          <img src="../../assets/icon/word/roomImg.png" alt="" />
+        </div>
+        <div class="roomName">
+          <div>{{ f.name ? f.name : "暂无房间名称" }}</div>
+          <div>{{ f.time }}</div>
+        </div>
+        <div class="enterRoom" @click="enterRoom(f.num)">进入房间</div>
+      </div>
+      <div v-if="fileList.length == 0" class="noRoom">
+        <img src="../../assets/icon/word/noRoom.png" alt="" />
+      </div>
+    </div>
+
+    <el-dialog
+      title="加入房间"
+      class="addOrCreateRoom"
+      :visible.sync="dialogVisible"
+      :append-to-body="true"
+      width="500px"
+      :before-close="handleClose"
+    >
+      <div slot="title" class="header-title">
+        <div class="title_add_student">加入房间</div>
+      </div>
+      <div class="addRoom_box">
+        <div class="inputBox">
+          <el-input
+            v-model="goNum"
+            placeholder="请输入要加入的房间号"
+          ></el-input>
+          <div class="room_b">
+            备注:输入房间号点击加入房间或点击创建房间直接创建房间
+          </div>
+          <div class="room_btn">
+            <el-button class="roomBtn" type="primary" @click="enterRoom(f.num)"
+              >加入房间</el-button
+            >
+            <!-- <el-button class="roomBtn" type="primary" @click="goRoom(goNum)"
+              >加入房间</el-button
+            >
+            <el-button class="roomBtn" type="primary" @click="checkNum"
+              >创建房间</el-button
+            > -->
+          </div>
+        </div>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import Clipboard from "clipboard";
+import draggable from "vuedraggable";
+export default {
+  components: {
+    //调用组件
+    draggable,
+  },
+  data() {
+    return {
+      dialogVisible: false,
+      goNum: "",
+      fileList: [],
+      userid: this.$route.query.userid,
+      oid: this.$route.query.oid,
+      cid: this.$route.query.cid,
+      tType: this.$route.query.tType,
+      copyText: "",
+      roomS: "",
+    };
+  },
+  methods: {
+    goTo(path) {
+      this.$router.push(path);
+    },
+    copy() {
+      this.copyText =
+        this.$refs.inviteT.innerHTML +
+        "\n" +
+        this.$refs.invite1.innerHTML +
+        "\n" +
+        this.$refs.invite2.innerHTML +
+        "\n" +
+        this.$refs.invite3.innerText +
+        "\n" +
+        this.$refs.invite4.innerHTML;
+      var clipboard = new Clipboard(".tag-read");
+      clipboard.on("success", (e) => {
+        this.$message.success("复制成功");
+        console.log("复制成功");
+        clipboard.destroy(); // 释放内存
+      });
+      clipboard.on("error", (e) => {
+        console.log("不支持复制,该浏览器不支持自动复制");
+        clipboard.destroy(); // 释放内存
+      });
+    },
+    handleClose(done) {
+      done();
+    },
+    getFileList() {
+      let params = {
+        uid: this.userid,
+        oid: this.oid,
+        cid: this.cid,
+        cu: "",
+        cn: this.roomS,
+      };
+      this.ajax
+        .get(this.$store.state.api + "selectFileList", params)
+        .then((res) => {
+          this.fileList = res.data[0];
+        })
+        .catch((err) => {
+          console.error(err);
+        });
+    },
+    jumpWord() {
+      window.parent.postMessage({ num: "0" }, "*");
+    },
+    enterRoom(num) {
+      window.parent.postMessage({ num: num }, "*");
+    },
+  },
+
+  created() {
+    this.getFileList();
+  },
+};
+</script>
+
+<style scoped>
+.g_body {
+  width: 100%;
+  height: 100%;
+  margin: 0 !important;
+  background: #e6eaf0;
+}
+
+.topBg {
+  background: url("../../assets/icon/word/topBg.png");
+  width: 100%;
+  object-fit: cover;
+  height: 220px;
+  display: flex;
+  flex-direction: row;
+  flex-wrap: nowrap;
+  align-items: center;
+  justify-content: space-between;
+  background-size: 100% 100%;
+}
+
+.wordIcon {
+  display: flex;
+  flex-direction: row;
+  flex-wrap: nowrap;
+  align-items: center;
+  margin: 0 0 100px 45px;
+}
+
+.docImg {
+  width: 40px;
+  height: 40px;
+}
+
+.docImg > img,
+.notice > img,
+.roomImg > img,
+.noRoom > img {
+  width: 100%;
+  height: 100%;
+}
+
+.notice {
+  width: 20px;
+  height: 20px;
+}
+
+.wordIcon > div:nth-child(2) {
+  font-size: 20px;
+  color: #fff;
+  margin-left: 10px;
+}
+
+.addOrCreateRoom {
+  margin: 0 45px 100px 0;
+  display: flex;
+  flex-direction: row;
+  flex-wrap: nowrap;
+  align-items: center;
+}
+
+.addOrCreateRoom > div {
+  width: 90px;
+  background: #199cfe;
+  height: 30px;
+  color: #fff;
+  border-radius: 5px;
+  text-align: center;
+  line-height: 30px;
+  font-size: 12px;
+  cursor: pointer;
+}
+
+.addOrCreateRoom > div:nth-child(2) {
+  margin-left: 20px;
+}
+
+.searchRoom {
+  margin-top: 100px;
+}
+
+.firstTop {
+  display: flex;
+  flex-direction: row;
+  flex-wrap: nowrap;
+  align-items: center;
+}
+
+.firstTop > input {
+  width: 350px;
+  height: 40px;
+  outline: none;
+  border: none;
+  border-radius: 5px;
+  text-indent: 10px;
+}
+
+.firstTop > div {
+  width: 65px;
+  background: #5e5e5e;
+  color: #fff;
+  height: 40px;
+  text-align: center;
+  line-height: 40px;
+  border-radius: 5px;
+  margin-left: 15px;
+  cursor: pointer;
+}
+
+.lastTop {
+  display: flex;
+  flex-direction: row;
+  flex-wrap: nowrap;
+  align-items: center;
+  margin-top: 10px;
+  color: #fff;
+}
+
+.roomBox {
+  width: 98%;
+  margin: 20px 0 0 25px;
+  display: flex;
+  flex-direction: row;
+  flex-wrap: wrap;
+  justify-content: flex-start;
+  align-items: center;
+}
+
+.roomDiv {
+  border-radius: 5px;
+  background: #fff;
+  width: 250px;
+  position: relative;
+  height: 260px;
+  margin: 0 30px 30px 0;
+}
+
+.roomNumer {
+  position: absolute;
+  right: 8px;
+  color: #bababa;
+  top: 2px;
+}
+
+.roomImg {
+  width: 100px;
+  margin: 0 auto;
+  padding: 10px 0;
+}
+
+.roomName {
+  display: flex;
+  flex-direction: column;
+  flex-wrap: nowrap;
+  align-items: center;
+  margin-bottom: 15px;
+}
+
+.roomName > div:nth-child(1) {
+  font-size: 15px;
+}
+
+.roomName > div:nth-child(2) {
+  color: #d1d1d1;
+  padding-top: 5px;
+}
+
+.enterRoom {
+  background: #3e86ff;
+  width: 90%;
+  text-align: center;
+  margin: 0 auto;
+  height: 30px;
+  line-height: 30px;
+  color: #fff;
+  border-radius: 3px;
+  cursor: pointer;
+}
+
+body::-webkit-scrollbar {
+  /*滚动条整体样式*/
+  width: 6px;
+  /*高宽分别对应横竖滚动条的尺寸*/
+  height: 6px;
+}
+.addOrCreateRoom >>> .el-dialog {
+  height: 200px;
+}
+.addOrCreateRoom >>> .el-dialog__header {
+  background: #32455b;
+  color: #fff;
+  height: 40px;
+  line-height: 40px;
+  padding: 0 0 0 20px;
+}
+.addOrCreateRoom >>> .el-dialog__headerbtn {
+  top: 13px !important;
+}
+.addOrCreateRoom >>> .el-dialog__body {
+  background: #f3f3f3;
+  height: 100%;
+}
+.addRoom_box {
+  background: #fff;
+  width: 100%;
+  height: 100%;
+  position: relative;
+}
+.inputBox {
+  padding: 30px 0 0 20px;
+}
+.inputBox >>> .el-input {
+  width: 95% !important;
+}
+.room_b {
+  margin: 10px 0;
+}
+.room_btn {
+  position: absolute;
+  bottom: 35px;
+  left: 25%;
+}
+.noRoom {
+  margin: 10% auto 0;
+}
+</style>

+ 1 - 1
src/components/tools/jsmind.vue

@@ -471,7 +471,7 @@ export default {
 .jsmind_layout {
   display: flex;
   flex-direction: column;
-  width: 500px;
+  width: 700px;
   height: calc(100%);
   /* height: 500px; */
   /* margin: 15px 5px 0 0; */

+ 18 - 0
src/components/tools/leftBar.vue

@@ -122,6 +122,24 @@
             </div>
             <span slot="title">学习资料</span>
           </el-menu-item>
+          <el-menu-item index="/GridList">
+            <div class="img" v-if="path == '/GridList'">
+              <img src="../../assets/icon/new-active.svg" alt="" />
+            </div>
+            <div class="img" v-else>
+              <img src="../../assets/icon/notice.png" alt="" />
+            </div>
+            <span slot="title">思维网格列表</span>
+          </el-menu-item>
+          <el-menu-item index="/wordList">
+            <div class="img" v-if="path == '/wordList'">
+              <img src="../../assets/icon/new-active.svg" alt="" />
+            </div>
+            <div class="img" v-else>
+              <img src="../../assets/icon/notice.png" alt="" />
+            </div>
+            <span slot="title">思维网格列表</span>
+          </el-menu-item>
           <!-- <el-menu-item index="/ask">
             <div class="img" v-if="path == '/ask'">
               <img

+ 26 - 7
src/router/index.js

@@ -22,6 +22,8 @@ import liveRoom from '@/components/pages/liveRoom'
 import addPPt from '@/components/pages/addPPt'
 import studyLibrary from '@/components/pages/studyLibrary'
 import evaluation from '@/components/pages/evaluation'
+import GridList from '@/components/pages/GridList'
+import wordList from '@/components/pages/wordList'
 
 Vue.use(Router).use(ElementUI)
 
@@ -184,13 +186,30 @@ export default new Router({
             meta: {
                 requireAuth: '' // 不需要鉴权
             }
-        }, {
-          path: '/evaluation',
-          name: 'evaluation',
-          component: evaluation,
-          meta: {
-            requireAuth: '' // 不需要鉴权
-          }
+        },
+        {
+            path: '/evaluation',
+            name: 'evaluation',
+            component: evaluation,
+            meta: {
+                requireAuth: '' // 不需要鉴权
+            }
+        },
+        {
+            path: '/GridList',
+            name: 'GridList',
+            component: GridList,
+            meta: {
+                requireAuth: '' // 不需要鉴权
+            }
+        },
+        {
+            path: '/wordList',
+            name: 'wordList',
+            component: wordList,
+            meta: {
+                requireAuth: '' // 不需要鉴权
+            }
         },
     ]
 })