SanHQin 8 tháng trước cách đây
mục cha
commit
46a3e31a13

+ 723 - 0
src/components/classRoomHelper/component/reviewArea.vue

@@ -0,0 +1,723 @@
+<template>
+  <div class="reviewArea" v-loading="loading">
+		<div class="pzTop2">
+ 
+        <div class="checkbox">
+
+					<div class="cb-tabList">
+						<div :class="[commentTagShow==0?'cb-tabItem':'']" @click="commentTagShow=0">评论</div>
+
+						<div :class="[commentTagShow==2?'cb-tabItem':'']" @click="commentTagShow=2">总评</div>
+					</div>
+          <el-select v-model="pzStype" @change="selectPz" class="selectBox" v-show="commentTagShow == 0">
+            <el-option label="时间降序" :value="1"></el-option>
+            <el-option label="时间升序" :value="2"></el-option>
+            <el-option label="我的评课" :value="3"></el-option>
+          </el-select>
+        </div>
+      </div>
+			<div :class="pzList && pzList.length ? 'pzBox' : 'noPzBox'" v-if="commentTagShow==0">
+        <div class="pzListBox" v-if="pzList && pzList.length">
+          <div class="pzList" v-for="(pz, pzIndex) in pzList" :key="pzIndex">
+            <div class="pzNavTop">
+              <div>评</div>
+              <div>
+                {{
+                  pz.username && pz.username.length > 5
+                    ? pz.username.substring(0, 5) + "..."
+                    : pz.username
+                }}的评论
+              </div>
+              <div
+                class="pzDelete"
+                v-if="pz.userid == userid"
+                @click="deletePz(pz.id)"
+              >
+                删除
+              </div>
+            </div>
+            <div
+              @click="checkImg(getImgList(pz.content))"
+              class="pzContent cont"
+              v-html="pz.content"
+              v-if="pz.type == '1'"
+            ></div>
+            <div class="pzContent" v-if="pz.type == '2'">
+              <audio :src="pz.content" controls="controls" ref="audio">
+                Your browser does not support the audio element.
+              </audio>
+            </div>
+            <div class="pzContent" v-if="pz.type == '3'">
+              <img
+                :src="pz.content"
+                style="width: 90%; margin: 0 auto; display: block"
+                @click="previewImg(pz.content)"
+              />
+            </div>
+            <div class="timeAndReply">
+              <div class="time">
+                {{ pz.time }}
+              </div>
+              <div @click="setReplyIndex(pz.id, pzIndex)">回复</div>
+            </div>
+
+            <div v-if="pz.hfList && pz.hfList.length > 0" class="hfBox">
+              <div
+                v-for="(h, hIndex) in pz.hfList"
+                :key="hIndex"
+                class="hfItem"
+              >
+                <div class="whoReplyWho">
+                  <div class="hfName">{{ h.username }}</div>
+                  <div class="hfImg">
+                    <img src="../../../assets/icon/newIcons/right.png" alt="" />
+                  </div>
+                  <div class="hfName">{{ pz.username }}</div>
+                </div>
+                <div class="hfContent" v-html="h.content"></div>
+                <div class="hfBottom">
+                  <div class="hfTime">{{ h.time }}</div>
+                  <div
+                    class="deleteHfItem"
+                    @click="deleteReply(h.id)"
+                    v-if="userid == h.userid"
+                  >
+                    <img src="../../../assets/icon/newIcons/delete.png" alt="" />
+                  </div>
+                </div>
+              </div>
+            </div>
+
+            <!-- <div class="replyBox" v-if="replyIndex[pzIndex] && replyIndex[pzIndex] == true">
+              <div class="replyInput">
+                <el-input v-model="reply[pzIndex]"></el-input>
+              </div>
+              <el-button @click="addHf(pz.id, pzIndex)">回复</el-button>
+            </div> -->
+          </div>
+        </div>
+        <div class="noPz" v-else>
+          <img src="../../../assets/icon/noPz.png" alt="" />
+        </div>
+        <div class="addPzButton">
+          <div class="addPz" @click="(addPzDialog = true), (pzType = 1)">
+            添加评论
+          </div>
+          <!-- <div class="img1">
+            <div @click="(addPzDialog = true), (pzType = 2)">
+              <img src="../assets/audio.png" /><span>音频</span>
+            </div>
+          </div> -->
+        </div>
+      </div>
+			<div class="scoreList" v-if="commentTagShow==1">
+				<scoreItem v-for="item in scoreList.datalist" @refresh="getScoreList" :data="item" :isScore="scoreList.isScoreList.filter(i=>(i.userid==item.userid && i.courseid == item.courseId))" :key="item.courseId"/>
+			</div>
+			<div class="scoreList" v-if="commentTagShow==2" style="position: relative">
+        <scoreZong :courseid="id" :userid="userid" @insertMemorandum="insertMemorandum"></scoreZong>
+			</div>
+			<div v-if="addPzDialog == true" class="addDialogCss" v-el-drag-dialog>
+      <div class="pzTop">
+        <div class="teacherPz">
+          <div class="teacherPzImg">
+            <img src="../../../assets/icon/teacherPz.png" alt="" />
+          </div>
+          <div style="margin-left: 10px; height: 25px">教师评论</div>
+        </div>
+        <div @click="addPzDialog = false">
+          <img src="../../../assets/close1.png" class="pzClose" alt="" />
+        </div>
+      </div>
+      <div class="addPzBox">
+        <div class="addPzCheck">
+          <span :class="{ isChooseActive: pzType == 1 }" @click="pzType = 1"
+            >文本</span
+          >
+          <!-- <span :class="{isChooseActive:pzType==3}" @click="pzType = 3">图片</span> -->
+          <span :class="{ isChooseActive: pzType == 2 }" @click="pzType = 2"
+            >音频</span
+          >
+        </div>
+        <div style="height: calc(100% - 95px)">
+          <!-- <textarea class="binfo_input pzConText" cols placeholder="请填写项目课程关键问题...." v-model="pzConText"
+            v-if="pzType == 1"></textarea> -->
+          <editor-bar
+            class="binfo_input pzConText"
+            style="width: 100% !important"
+            placeholder="请输入任务描述"
+            v-model="pzConText"
+            @change="change"
+            v-if="pzType == 1"
+          ></editor-bar>
+          <Audio @addPz="addPz" class="pzAudioClass" v-if="pzType == 2"></Audio>
+          <!-- <div class="pzAudioClass" v-if="pzType == 3">
+            <div @click="addImg($event)">
+              <el-button type="primary">上传图片</el-button>
+              <input type="file" accept="image/png, image/gif, image/jpeg" style="display: none"
+                @change="beforeUpload1($event, 4)" />
+            </div>
+          </div> -->
+        </div>
+        <div class="addTextCss" @click="addPz('1')" v-if="pzType == 1">
+          确定
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import scoreItem from '../../scoreList/scoreItem.vue'
+import scoreZong from '../../scoreZong/index.vue'
+import EditorBar from "../../tools/wangEnduit.vue";
+import Audio from "../../components/audio.vue";
+export default {
+	components:{
+		scoreItem,
+		scoreZong,
+		EditorBar,
+		Audio
+	},	
+	props:{
+		taskCount:{
+			type:Number,
+			default:0
+		},
+		courseType:{
+			type:Number,
+			default:0
+		},
+		
+	},
+	watch:{
+		taskCount(){
+			this.selectPz();
+		},
+		courseType(){
+			this.selectPz();
+		}
+	},
+  data() {
+    return {
+      commentTagShow: 0,
+      pzStype: 1,
+      pzList: [],
+			loading:false,
+			pzDialog:false,
+      id: this.$route.query.courseId,
+      userid: this.$route.query.userid,
+			addPzDialog:false,
+			pzType:0,
+			pzConText:"",
+			scoreList:{
+				datalist:[],
+				isScoreList:[]
+			},
+    };
+  },
+  methods: {
+		insertMemorandum(_html) {
+      //保存行为操作
+      //variable
+      //btn
+      let params = [
+        {
+          uid: this.userid,
+          courseId: this.courseId+(this.tcid2?this.tcid2:""),
+          content: _html
+        }
+      ];
+
+      this.ajax
+        .post(
+          this.$store.state.api + "insert_systemOperation_countdownBehavior",
+          params
+        )
+        .then(res => {
+          if (res.data == 1) {
+            console.log("保存操作成功");
+          } else {
+            console.log("保存操作失败");
+          }
+        })
+        .catch(e => {
+          console.log("保存操作失败");
+          console.log(e);
+        });
+    },
+    selectPz() {
+      let params = {
+        cid: this.id,
+        s: this.courseType,
+        t: this.taskCount,
+        type: this.pzStype,
+        uid: this.userid
+      };
+      this.ajax
+        .get(this.$store.state.api + "selectPzListType", params)
+        .then(res => {
+          this.pzList = res.data[0];
+          var a = res.data[1];
+          for (var i = 0; i < a.length; i++) {
+            for (var j = 0; j < this.pzList.length; j++) {
+              if (!this.pzList[j].hfList) {
+                this.pzList[j].hfList = [];
+              }
+              if (a[i].pid == this.pzList[j].id) {
+                this.pzList[j].hfList.push(a[i]);
+              }
+            }
+          }
+        })
+        .catch(err => {
+          console.error(err);
+        });
+    },
+		getScoreList(){
+			let params = {
+        cid: this.id,
+      };
+      this.ajax
+        .get(this.$store.state.api + "selectTestCourseByCid", params)
+        .then((res) => {
+					let result = res.data;
+					this.scoreList.datalist = result[0];
+					this.scoreList.isScoreList = result[1];
+        })
+        .catch((err) => {
+          console.error(err);
+        });
+		},
+		addPz(type, content) {
+      if (type == "1" && this.pzConText == "") {
+        this.$message.error("评论不能为空!");
+        return;
+      }
+      let params = [
+        {
+          cid: this.id,
+          uid: this.userid,
+          s: this.courseType,
+          t: this.taskCount,
+          c: type == "1" ? this.pzConText : content,
+          type: type,
+        },
+      ];
+      this.ajax
+        .post(this.$store.state.api + "addPz2", params)
+        .then((res) => {
+          this.$message({
+            message: "添加成功",
+            type: "success",
+          });
+          this.pzConText = "";
+          this.addPzDialog = false;
+          this.selectPz();
+					this.insertMemorandum(`使用<span class="btn">评论</span>功能,添加评论`)
+        })
+        .catch((err) => {
+          this.$message.error("添加失败");
+          console.error(err);
+        });
+				
+    },
+		change(val){
+			console.log(val);
+		}
+  },
+	mounted() {
+		this.selectPz();
+		this.getScoreList();
+	},
+};
+</script>
+
+<style scoped>
+.reviewArea {
+  width: 100%;
+  height: 100%;
+	
+}
+
+.pzTop2 .check {
+  text-align: center;
+  cursor: pointer;
+  box-sizing: border-box;
+  display: flex;
+}
+
+.pzTop2 img {
+  width: 25px;
+  cursor: pointer;
+}
+
+.pzTop2 .checkbox {
+  display: flex;
+  align-items: center;
+  padding: 5px 10px;
+  flex: 0 0 auto;
+  font-weight: bold;
+  border-bottom: 1px solid #eee;
+  justify-content: space-between;
+}
+
+.checkbox>.cb-tabList{
+	height:40px;
+	display:flex;
+	align-items:center;
+}
+
+.cb-tabList>div{
+	margin-right:20px;
+	font-weight:400;
+	cursor:pointer;
+}
+
+.cb-tabList>.cb-tabItem{
+	color:#1684FC;
+	position:relative;
+}
+
+.cb-tabItem::after{
+	content:"";
+	width:100%;
+	height:2px;
+	background:#1684FC;
+	position:absolute;
+	bottom:-5px;
+	left:0
+}
+
+.pzBox,
+.noPzBox {
+  height: calc(100% - 60px);
+  /* background: #ededed; */
+  background: #fff;
+  /* border-radius: 0 0 15px 15px; */
+}
+
+.noPzBox {
+  display: flex;
+  flex-direction: column;
+  flex-wrap: nowrap;
+  justify-content: center;
+  align-items: center;
+}
+
+.pzList {
+  background: #f7f7f7;
+  width: 90%;
+  margin: 0 auto 15px;
+  border-radius: 5px;
+}
+
+.pzNavTop {
+  display: flex;
+  flex-direction: row;
+  flex-wrap: nowrap;
+  padding: 10px 10px 0 10px;
+  align-items: center;
+}
+
+.pzDelete {
+  cursor: pointer;
+  margin-left: auto;
+  font-size: 14px;
+  color: #afafaf;
+}
+
+.pzNavTop > div:nth-child(1) {
+  background: #3760af;
+  width: 35px;
+  height: 35px;
+  color: #fff;
+  text-align: center;
+  line-height: 35px;
+  border-radius: 50%;
+  font-size: 14px;
+}
+
+.pzNavTop > div:nth-child(2) {
+  font-size: 18px;
+  color: #959595;
+  margin-left: 5px;
+}
+
+.pzContent {
+  padding: 10px;
+  word-break: break-word;
+}
+
+.pzContent audio {
+  width: 100%;
+}
+
+.pzContent audio::-webkit-media-controls-panel {
+  background: #fff;
+}
+
+.pzContent >>> img {
+  max-width: 100%;
+}
+
+.pzListBox {
+  padding-top: 15px;
+  height: calc(100% - 110px);
+  overflow: auto;
+}
+
+.addPzButton {
+  position: relative;
+  margin-top: 3px;
+  width: 100%;
+}
+
+.addPzButton .img1 {
+  position: absolute;
+  top: 50%;
+  right: 25px;
+  transform: translateY(-50%);
+  height: 100%;
+  display: flex;
+  align-items: center;
+}
+
+.addPzButton .img1 div {
+  display: flex;
+}
+
+.addPzButton .img1 div img {
+  width: 28px;
+  margin-left: 10px;
+  cursor: pointer;
+}
+
+.addPzButton .img1 div span {
+  font-size: 14px;
+  margin: 4px 0 0 3px;
+  color: #afafaf;
+}
+
+.addPz {
+  background: #4b79ce;
+  width: 100px;
+  color: #fff;
+  font-size: 12px;
+  height: 30px;
+  margin: 0 auto;
+  text-align: center;
+  line-height: 30px;
+  border-radius: 10px;
+  cursor: pointer;
+}
+
+.addDialogCss {
+  position: fixed;
+  width: 600px;
+  height: 70%;
+  min-height: 450px;
+  box-shadow: 0px 0 8px 0px #555555;
+  border-radius: 15px;
+  z-index: 999;
+  left: 50%;
+  top: 50%;
+  margin: -18% 0 0 -300px;
+}
+
+.teacherPz {
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+  flex-wrap: nowrap;
+}
+
+.teacherPzImg {
+  width: 30px;
+  height: 30px;
+}
+
+.teacherPzImg > img {
+  width: 100%;
+  height: 100%;
+}
+
+.addPzBox {
+  height: calc(100% - 40px);
+  background: #ededed;
+  border-bottom-left-radius: 15px;
+  border-bottom-right-radius: 15px;
+}
+
+.pzAudioClass {
+  margin: 15px 14px;
+  background: #fff;
+  height: 100%;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+}
+
+.pzConText {
+  width: 95%;
+  height: 100%;
+  margin: 10px auto 0;
+  border: none;
+  background: #fff;
+  border-radius: 0px;
+}
+
+.pzConText >>> .text {
+  height: calc(100% - 82px);
+}
+
+.whoReplyWho > .hfImg {
+  width: 12px;
+  height: 12px;
+  margin: 0 5px;
+}
+.whoReplyWho > .hfImg > img {
+  width: 100%;
+  height: 100%;
+}
+.hfContent {
+  padding-top: 10px;
+  box-sizing: border-box;
+  display: -webkit-box;
+  overflow: hidden;
+  white-space: normal !important;
+  text-overflow: ellipsis;
+  word-wrap: break-word;
+  -webkit-box-orient: vertical;
+}
+
+.hfTime {
+  text-align: left;
+  box-sizing: border-box;
+  padding: 10px 0 10px 0px;
+  color: #bfbfbf;
+  font-size: 14px;
+}
+
+.timeAndReply {
+  display: flex;
+  flex-direction: row;
+  flex-wrap: nowrap;
+  justify-content: space-between;
+  align-items: center;
+  font-size: 14px;
+  box-sizing: border-box;
+  padding: 0 10px 10px 0px;
+}
+.timeAndReply .time {
+  color: #bfbfbf;
+  padding: 0 0 0 10px;
+  box-sizing: border-box;
+}
+.timeAndReply > div:last-child {
+  cursor: pointer;
+  color: #777;
+}
+
+.hfBox {
+  padding: 10px;
+  box-sizing: border-box;
+}
+
+.whoReplyWho {
+  display: flex;
+  flex-direction: row;
+  flex-wrap: nowrap;
+  align-items: baseline;
+  justify-content: flex-start;
+}
+.hfBottom {
+  display: flex;
+  flex-direction: row;
+  flex-wrap: nowrap;
+  align-items: center;
+  justify-content: space-between;
+  font-size: 14px;
+}
+.deleteHfItem {
+  cursor: pointer;
+  width: 20px;
+  height: 20px;
+}
+
+.deleteHfItem > img {
+  width: 100%;
+  height: 100%;
+}
+
+.addPzCheck {
+  display: flex;
+  flex-direction: row;
+  flex-wrap: nowrap;
+  padding: 10px 15px 0;
+}
+
+.addPzCheck span {
+  cursor: pointer;
+  padding-bottom: 5px;
+  font-weight: bold;
+}
+
+.addPzCheck span + span {
+  margin-left: 10px;
+}
+
+.addPzCheck .isChooseActive {
+  color: #3e88f4;
+  border-bottom: 2px solid #2f80f3;
+}
+.pzTop {
+  color: #fff;
+  background: #000;
+  display: flex;
+  flex-direction: row;
+  flex-wrap: nowrap;
+  align-items: center;
+  justify-content: space-between;
+  height: 40px;
+  border-radius: 15px 15px 0 0;
+  user-select: none;
+}
+
+.pzTop > div:nth-child(1) {
+  padding-left: 10px;
+}
+
+.pzTop > div:nth-child(2) {
+  width: 15px;
+  height: 15px;
+  padding-right: 10px;
+  cursor: pointer;
+}
+
+.pzTop > div:nth-child(2) > img {
+  width: 100%;
+  height: 100%;
+}
+
+
+.addTextCss {
+  background: #4b79ce;
+  width: 80px;
+  height: 30px;
+  text-align: center;
+  color: #fff;
+  line-height: 30px;
+  border-radius: 10px;
+  margin: 10px auto 0;
+  cursor: pointer;
+}
+
+.scoreList{
+	width:100%;
+	height:100%;
+	box-sizing:border-box;
+	padding:10px 15px;
+	overflow:auto;
+	padding-bottom:80px;
+}
+</style>

+ 38 - 35
src/components/classRoomHelper/component/searchArea.vue

@@ -1083,7 +1083,7 @@
           ></el-input>
 
           <el-input
-            v-loading="loading || chatLoading"
+            v-loading="loading"
             v-if="sendFnType == 1 && isTalk"
             :readonly="isReadonly"
             @focus="setCursorToEnd"
@@ -1096,7 +1096,7 @@
           <div
             class="s_b_recorded"
             @click.stop="talk()"
-            v-loading="loading || chatLoading"
+            v-loading="loading"
             v-if="sendFnType && !isTalk"
           >
             <span>点击说话</span>
@@ -1134,7 +1134,7 @@
           </el-tooltip>
 
           <el-tooltip
-            v-if="sendFnType == 1 && text == '' && !isTalk && !chatLoading"
+            v-if="sendFnType == 1 && text == '' && !isTalk"
             class="item"
             effect="light"
             content="文字输入"
@@ -1166,39 +1166,10 @@
             </span>
           </el-tooltip>
 
-          <el-tooltip
-            v-if="text == '' && !isTalk && !chatLoading"
-            class="item"
-            effect="light"
-            content="语音助手"
-            placement="top"
-          >
-            <span @click.stop="openPhone">
-              <svg
-                width="22"
-                height="22"
-                viewBox="0 0 22 22"
-                fill="none"
-                xmlns="http://www.w3.org/2000/svg"
-              >
-                <path
-                  fill-rule="evenodd"
-                  clip-rule="evenodd"
-                  d="M6.84155 5.76478C6.55991 5.4855 6.10327 5.4855 5.82162 5.76478L4.37921 7.1951C4.23486 7.33825 4.18177 7.5001 4.19436 7.6318C4.3842 9.61702 5.57859 12.5019 7.56276 14.4694C9.61252 16.502 11.9775 17.6669 14.4337 17.8187C14.5856 17.8281 14.7568 17.7668 14.8985 17.6263L16.2213 16.3145C16.5253 16.0132 16.4975 15.5167 16.1619 15.2504L14.8224 14.1878C14.5354 13.9602 14.1218 13.9829 13.8619 14.2405L13.3463 14.7518C12.6962 15.3965 11.6475 15.5966 10.809 15.0406C10.2045 14.6397 9.43899 14.0617 8.70643 13.3353C7.92049 12.556 7.30647 11.7387 6.90026 11.1205C6.41585 10.3834 6.52495 9.47493 7.0107 8.83269L7.88884 7.67165C8.10418 7.38693 8.07563 6.98852 7.82185 6.73686L6.84155 5.76478ZM4.80168 4.7534C5.64663 3.91553 7.01655 3.91554 7.86149 4.7534L8.84178 5.72547C9.60314 6.48045 9.6888 7.67569 9.04277 8.52984L8.16462 9.69089C7.99476 9.91548 7.99659 10.169 8.10873 10.3396C8.47364 10.8949 9.02654 11.63 9.72637 12.3239C10.3781 12.9702 11.0661 13.4905 11.6108 13.8516C11.8045 13.9801 12.0985 13.9664 12.3264 13.7404L12.842 13.2292C13.6215 12.4561 14.8626 12.388 15.7235 13.0709L17.063 14.1335C18.0699 14.9323 18.1531 16.4217 17.2413 17.3259L15.9185 18.6377C15.5191 19.0336 14.9558 19.284 14.344 19.2462C11.4699 19.0687 8.78913 17.7083 6.54282 15.4808C4.31506 13.2717 2.97905 10.0743 2.7584 7.76683C2.69877 7.14323 2.96262 6.57704 3.35928 6.18372L4.80168 4.7534Z"
-                  fill="#3681FC"
-                />
-                <path
-                  fill-rule="evenodd"
-                  clip-rule="evenodd"
-                  d="M11.9697 2.96967C12.2626 2.67678 12.7374 2.67678 13.0303 2.96967L19.0303 8.96967C19.3232 9.26256 19.3232 9.73744 19.0303 10.0303C18.7374 10.3232 18.2626 10.3232 17.9697 10.0303L11.9697 4.03033C11.6768 3.73744 11.6768 3.26256 11.9697 2.96967ZM11.2197 7.78033C10.9268 7.48744 10.9268 7.01256 11.2197 6.71967C11.5126 6.42678 11.9874 6.42678 12.2803 6.71967L15.2803 9.71967C15.5732 10.0126 15.5732 10.4874 15.2803 10.7803C14.9874 11.0732 14.5126 11.0732 14.2197 10.7803L11.2197 7.78033Z"
-                  fill="#3681FC"
-                />
-              </svg>
-            </span>
-          </el-tooltip>
+          
 
           <el-tooltip
-            v-if="isTalk && !chatLoading"
+            v-if="isTalk"
             class="item"
             effect="light"
             content="结束录音"
@@ -1248,7 +1219,7 @@
           </el-tooltip>
 
           <el-tooltip
-            v-if="chatLoading"
+            v-if="chatLoading && sendFnType==0"
             class="item"
             effect="light"
             content="停止发送"
@@ -1269,6 +1240,37 @@
                 />
               </svg>
             </span>
+          </el-tooltip>
+
+					<el-tooltip
+            v-if="text == '' && !isTalk"
+            class="item"
+            effect="light"
+            content="语音助手"
+            placement="top"
+          >
+            <span @click.stop="openPhone">
+              <svg
+                width="22"
+                height="22"
+                viewBox="0 0 22 22"
+                fill="none"
+                xmlns="http://www.w3.org/2000/svg"
+              >
+                <path
+                  fill-rule="evenodd"
+                  clip-rule="evenodd"
+                  d="M6.84155 5.76478C6.55991 5.4855 6.10327 5.4855 5.82162 5.76478L4.37921 7.1951C4.23486 7.33825 4.18177 7.5001 4.19436 7.6318C4.3842 9.61702 5.57859 12.5019 7.56276 14.4694C9.61252 16.502 11.9775 17.6669 14.4337 17.8187C14.5856 17.8281 14.7568 17.7668 14.8985 17.6263L16.2213 16.3145C16.5253 16.0132 16.4975 15.5167 16.1619 15.2504L14.8224 14.1878C14.5354 13.9602 14.1218 13.9829 13.8619 14.2405L13.3463 14.7518C12.6962 15.3965 11.6475 15.5966 10.809 15.0406C10.2045 14.6397 9.43899 14.0617 8.70643 13.3353C7.92049 12.556 7.30647 11.7387 6.90026 11.1205C6.41585 10.3834 6.52495 9.47493 7.0107 8.83269L7.88884 7.67165C8.10418 7.38693 8.07563 6.98852 7.82185 6.73686L6.84155 5.76478ZM4.80168 4.7534C5.64663 3.91553 7.01655 3.91554 7.86149 4.7534L8.84178 5.72547C9.60314 6.48045 9.6888 7.67569 9.04277 8.52984L8.16462 9.69089C7.99476 9.91548 7.99659 10.169 8.10873 10.3396C8.47364 10.8949 9.02654 11.63 9.72637 12.3239C10.3781 12.9702 11.0661 13.4905 11.6108 13.8516C11.8045 13.9801 12.0985 13.9664 12.3264 13.7404L12.842 13.2292C13.6215 12.4561 14.8626 12.388 15.7235 13.0709L17.063 14.1335C18.0699 14.9323 18.1531 16.4217 17.2413 17.3259L15.9185 18.6377C15.5191 19.0336 14.9558 19.284 14.344 19.2462C11.4699 19.0687 8.78913 17.7083 6.54282 15.4808C4.31506 13.2717 2.97905 10.0743 2.7584 7.76683C2.69877 7.14323 2.96262 6.57704 3.35928 6.18372L4.80168 4.7534Z"
+                  fill="#3681FC"
+                />
+                <path
+                  fill-rule="evenodd"
+                  clip-rule="evenodd"
+                  d="M11.9697 2.96967C12.2626 2.67678 12.7374 2.67678 13.0303 2.96967L19.0303 8.96967C19.3232 9.26256 19.3232 9.73744 19.0303 10.0303C18.7374 10.3232 18.2626 10.3232 17.9697 10.0303L11.9697 4.03033C11.6768 3.73744 11.6768 3.26256 11.9697 2.96967ZM11.2197 7.78033C10.9268 7.48744 10.9268 7.01256 11.2197 6.71967C11.5126 6.42678 11.9874 6.42678 12.2803 6.71967L15.2803 9.71967C15.5732 10.0126 15.5732 10.4874 15.2803 10.7803C14.9874 11.0732 14.5126 11.0732 14.2197 10.7803L11.2197 7.78033Z"
+                  fill="#3681FC"
+                />
+              </svg>
+            </span>
           </el-tooltip>
         </div>
         <!-- <div class="voice_or_keyboard">
@@ -1631,6 +1633,7 @@ export default {
     showTipsFn() {
 			this.showTipsList = this.tipsList[this.tipsList.length-1]
       this.showTips = true;
+			this.$parent.getTipsListTime(5000)
     },
     insertMemorandum(_html) {
       //保存行为操作

+ 30 - 4
src/components/classRoomHelper/component/taskArea.vue

@@ -186,10 +186,7 @@
               :class="[
                 'aa_ab_t_cl_item',
                 showBottomCard == 2
-                  ? checkAnswer(
-                      topicList[showTopicIndex].answer,
-                      topicList[showTopicIndex].answer2
-                    ).yes.includes(index)
+                  ? (typeof topicList[showTopicIndex].answer== 'number'?topicList[showTopicIndex].answer == index:topicList[showTopicIndex].answer.includes(index))
                     ? 'aa_ab_t_cl_itemYes'
                     : checkAnswer(
                         topicList[showTopicIndex].answer,
@@ -220,6 +217,27 @@
               <span v-else
                 >{{ chooseList[index] }}、<span>{{ item }}</span></span
               >
+              <div
+                class="aa_ab_t_cl_itemAnswer"
+                v-if="(typeof topicList[showTopicIndex].answer== 'number'?topicList[showTopicIndex].answer == index:topicList[showTopicIndex].answer.includes(index)) && showBottomCard==2"
+              >
+                <svg
+                  t="1724308424838"
+                  class="icon"
+                  viewBox="0 0 1024 1024"
+                  version="1.1"
+                  xmlns="http://www.w3.org/2000/svg"
+                  p-id="4297"
+                  width="200"
+                  height="200"
+                >
+                  <path
+                    d="M817.728 198.72l111.744 114.56-545.216 532.128-285.92-273.024 110.528-115.712 174.176 166.336z"
+                    fill="#3581FC"
+                    p-id="4298"
+                  ></path>
+                </svg>
+              </div>
             </div>
           </div>
           <div class="aa_ab_t_btnArea">
@@ -858,6 +876,7 @@ export default {
             _result.no = [answer2];
           }
         } else {
+					console.log("多选题")
           if (
             answer.length == answer2.length &&
             answer.every(i => answer2.includes(i))
@@ -2154,16 +2173,23 @@ ${_choiceText}
   margin-top: 15px;
   display: flex;
   flex-wrap: wrap;
+  justify-content: space-between;
 }
 
 .aa_ab_t_cl_item > span {
   word-break: break-all;
+  float: left;
 }
 
 .aa_ab_t_cl_item img {
   width: 90%;
 }
 
+.aa_ab_t_cl_itemAnswer > svg {
+  width: 20px;
+  height: 20px;
+}
+
 .aa_ab_t_cl_itemNo {
   border-color: #ee3e3e !important;
 }

+ 23 - 3
src/components/classRoomHelper/index.vue

@@ -33,6 +33,8 @@
       />
 
       <languageAssistant ref="languageAssistantRef" v-if="itemType == 4" />
+
+			<reviewArea ref="reviewAreaRef" v-if="itemType==5" :courseType="courseType" :taskCount="taskCount"/>
       <!-- <dialogArea
         :courseDetail="courseDetail"
 				:openMegaphone="openMegaphone"
@@ -58,7 +60,7 @@
           </el-tooltip>
         </div>
 
-        <div @click="$emit('review')" v-if="tType == 1">
+        <div @click="changeItemType(5)" v-if="tType == 1">
           <el-tooltip class="item" effect="dark" content="评论" placement="top">
             <img
               :src="require('../../assets/icon/course/comment2.svg')"
@@ -262,6 +264,7 @@ import timepiece from "./component/timepiece.vue";
 import countdown from "./component/countdown.vue";
 import AnnotationCanvas from "./component/AnnotationCanvas.vue";
 import languageAssistant from "./component/languageAssistant.vue";
+import reviewArea from "./component/reviewArea.vue";
 import { v4 as uuidv4 } from "uuid";
 // 自定义指令,用于处理点击外部区域的事件
 const clickOutside = {
@@ -303,7 +306,8 @@ export default {
     timepiece,
     countdown,
     AnnotationCanvas,
-    languageAssistant
+    languageAssistant,
+		reviewArea
   },
   props: {
     courseDetail: {
@@ -360,7 +364,9 @@ export default {
 			canShowTips:false,
 			showTipsLoading:false,
 			tipsList:[],
-			firstEnterTime:null
+			firstEnterTime:null,
+			canGetTips:true,
+			getTipsTimer:null,
     };
   },
   mounted() {
@@ -368,11 +374,22 @@ export default {
     this.getFileId();
 		this.firstEnterTime = new Date().getTime();
 		setTimeout(()=>{
+			this.canGetTips = true;
 			this.getTipsList()
 		},3000)
   },
   methods: {
+		getTipsListTime(time = 5000){
+			if(this.getTipsTimer)clearTimeout(this.getTipsListTime)
+			this.getTipsTimer = setTimeout(()=>{
+				this.canGetTips = true;
+				this.getTipsList();
+				this.getTipsTimer = null;
+			},time)
+		},
 		getTipsList(){
+			return new Promise((resolve)=>{
+				if(!this.canGetTips)return;
 			this.showTipsLoading = true;
 			let nowTaskObj = this.navList[this.courseType].task[this.taskCount]
 			let nowTask = `【任务${this.taskCount+1}:${nowTaskObj.taskName}】`
@@ -452,12 +469,15 @@ let params = {
 					
           this.showTipsLoading = false;
 					this.canShowTips = true;
+					this.canGetTips = false;
+					resolve()
         })
         .catch(e => {
           this.showTipsLoading = false;
           this.$message.error("获取课堂小贴士失败");
           console.log(e);
         });
+			})
 		},
 		handleBlur(){
 			// console.log(this.fold)