|
|
@@ -1,10 +1,10 @@
|
|
|
<template>
|
|
|
<div class="choiceQuestionDetailDialog">
|
|
|
- <div class="content" :style="{
|
|
|
+ <div class="content" @click="clickContent(true)" :style="{
|
|
|
width: slideWidth + 'px',
|
|
|
height: slideHeight + 'px',
|
|
|
}">
|
|
|
- <span v-show="false" class="closeIcon" @click="closeSlideIndex()">
|
|
|
+ <span v-show="false" class="closeIcon" @click.stop="closeSlideIndex()">
|
|
|
<img src="../../../assets/img/close.png" />
|
|
|
</span>
|
|
|
|
|
|
@@ -20,7 +20,7 @@
|
|
|
v-if="props.showData.unsubmittedStudents.length > 0">/{{ props.showData.workArray.length +
|
|
|
props.showData.unsubmittedStudents.length
|
|
|
}}</span></div>
|
|
|
- <span v-if="props.showData.unsubmittedStudents.length > 0" @click="viewUnsubmittedStudents()">{{
|
|
|
+ <span v-if="props.showData.unsubmittedStudents.length > 0" @click.stop="viewUnsubmittedStudents()">{{
|
|
|
lang.ssViewSubmitStatus2 }}</span>
|
|
|
</div>
|
|
|
<!--<span class="c_t45_t_btn" :class="{'c_t45_t_btn_noActive': props.showData.workIndex <= 0}" @click="changeWorkIndex(0)">{{ lang.ssPrevQ }}</span>-->
|
|
|
@@ -31,7 +31,7 @@
|
|
|
" v-if="props.showData.choiceQuestionListData[props.showData.workIndex] &&
|
|
|
props.showData.choiceQuestionListData[props.showData.workIndex]
|
|
|
.timuList.length > 0
|
|
|
- " @click="previewImageToolRef.previewImage(props.showData.choiceQuestionListData[props.showData.workIndex]
|
|
|
+ " @click.stop="previewImageToolRef.previewImage(props.showData.choiceQuestionListData[props.showData.workIndex]
|
|
|
.timuList[0].src)" />
|
|
|
<!-- <span class="c_t45_type" v-if="
|
|
|
props.showData.choiceQuestionListData[props.showData.workIndex]
|
|
|
@@ -60,7 +60,7 @@
|
|
|
</svg>{{ lang.ssAnalysis }}
|
|
|
</div>
|
|
|
<div class="ai_refresh" :class="{ 'disabled': currentAnalysis && currentAnalysis.loading }"
|
|
|
- @click="aiAnalysisRefresh45()">
|
|
|
+ @click.stop="aiAnalysisRefresh45()">
|
|
|
{{ lang.ssAIGenerate }}
|
|
|
<svg viewBox="0 0 1024 1024" width="200" height="200">
|
|
|
<path
|
|
|
@@ -82,7 +82,7 @@
|
|
|
</div>
|
|
|
</div>
|
|
|
<div class="cq_changeBtn" v-if="props.showData.choiceQuestionListData.length > 1">
|
|
|
- <div :class="{ cq_cb_disabled: props.showData.workIndex <= 0 }" @click="changeWorkIndex(0)">
|
|
|
+ <div :class="{ cq_cb_disabled: props.showData.workIndex <= 0 }" @click.stop="changeWorkIndex(0)">
|
|
|
<svg style="transform: rotate(-90deg);" viewBox="0 0 1024 1024" version="1.1" width="200" height="200">
|
|
|
<path
|
|
|
d="M512 330.666667c14.933333 0 29.866667 4.266667 40.533333 14.933333l277.33333399 234.666667c27.733333 23.466667 29.866667 64 8.53333301 89.6-23.466667 27.733333-64 29.866667-89.6 8.53333299L512 477.866667l-236.8 200.53333299c-27.733333 23.466667-68.266667 19.19999999-89.6-8.53333299-23.466667-27.733333-19.19999999-68.266667 8.53333301-89.6l277.33333399-234.666667c10.666667-10.666667 25.6-14.933333 40.533333-14.933333z"
|
|
|
@@ -91,7 +91,7 @@
|
|
|
</div>
|
|
|
<span>{{ props.showData.workIndex + 1 }}/{{ props.showData.choiceQuestionListData.length }}</span>
|
|
|
<div :class="{ cq_cb_disabled: props.showData.workIndex >= props.showData.choiceQuestionListData.length - 1 }"
|
|
|
- @click="changeWorkIndex(1)">
|
|
|
+ @click.stop="changeWorkIndex(1)">
|
|
|
<svg style="transform: rotate(90deg);" viewBox="0 0 1024 1024" version="1.1" width="200" height="200">
|
|
|
<path
|
|
|
d="M512 330.666667c14.933333 0 29.866667 4.266667 40.533333 14.933333l277.33333399 234.666667c27.733333 23.466667 29.866667 64 8.53333301 89.6-23.466667 27.733333-64 29.866667-89.6 8.53333299L512 477.866667l-236.8 200.53333299c-27.733333 23.466667-68.266667 19.19999999-89.6-8.53333299-23.466667-27.733333-19.19999999-68.266667 8.53333301-89.6l277.33333399-234.666667c10.666667-10.666667 25.6-14.933333 40.533333-14.933333z"
|
|
|
@@ -113,7 +113,7 @@
|
|
|
v-if="props.showData.unsubmittedStudents.length > 0">/{{ props.showData.workArray.length +
|
|
|
props.showData.unsubmittedStudents.length
|
|
|
}}</span></div>
|
|
|
- <span v-if="props.showData.unsubmittedStudents.length > 0" @click="viewUnsubmittedStudents()">{{
|
|
|
+ <span v-if="props.showData.unsubmittedStudents.length > 0" @click.stop="viewUnsubmittedStudents()">{{
|
|
|
lang.ssViewSubmitStatus2 }}</span>
|
|
|
</div>
|
|
|
<!--<span class="c_t45_t_btn" :class="{'c_t45_t_btn_noActive': props.showData.workIndex <= 0}" @click="changeWorkIndex(0)">{{ lang.ssPrevQ }}</span>-->
|
|
|
@@ -124,7 +124,7 @@
|
|
|
" v-if="props.showData.choiceQuestionListData[props.showData.workIndex] &&
|
|
|
props.showData.choiceQuestionListData[props.showData.workIndex]
|
|
|
.timuList.length > 0
|
|
|
- " @click="previewImageToolRef.previewImage(props.showData.choiceQuestionListData[props.showData.workIndex]
|
|
|
+ " @click.stop="previewImageToolRef.previewImage(props.showData.choiceQuestionListData[props.showData.workIndex]
|
|
|
.timuList[0].src)" />
|
|
|
<!-- <span class="c_t45_type" v-if="
|
|
|
props.showData.choiceQuestionListData[props.showData.workIndex]
|
|
|
@@ -153,7 +153,7 @@
|
|
|
</svg>{{ lang.ssAnalysis }}
|
|
|
</div>
|
|
|
<div class="ai_refresh" :class="{ 'disabled': currentAnalysis && currentAnalysis.loading }"
|
|
|
- @click="aiAnalysisRefresh78()">
|
|
|
+ @click.stop="aiAnalysisRefresh78()" v-if="false">
|
|
|
{{ lang.ssAIGenerate }}
|
|
|
<svg viewBox="0 0 1024 1024" width="200" height="200">
|
|
|
<path
|
|
|
@@ -175,7 +175,7 @@
|
|
|
</div>
|
|
|
</div>
|
|
|
<div class="cq_changeBtn" v-if="props.showData.choiceQuestionListData.length > 1">
|
|
|
- <div :class="{ cq_cb_disabled: props.showData.workIndex <= 0 }" @click="changeWorkIndex(0)">
|
|
|
+ <div :class="{ cq_cb_disabled: props.showData.workIndex <= 0 }" @click.stop="changeWorkIndex(0)">
|
|
|
<svg style="transform: rotate(-90deg);" viewBox="0 0 1024 1024" version="1.1" width="200" height="200">
|
|
|
<path
|
|
|
d="M512 330.666667c14.933333 0 29.866667 4.266667 40.533333 14.933333l277.33333399 234.666667c27.733333 23.466667 29.866667 64 8.53333301 89.6-23.466667 27.733333-64 29.866667-89.6 8.53333299L512 477.866667l-236.8 200.53333299c-27.733333 23.466667-68.266667 19.19999999-89.6-8.53333299-23.466667-27.733333-19.19999999-68.266667 8.53333301-89.6l277.33333399-234.666667c10.666667-10.666667 25.6-14.933333 40.533333-14.933333z"
|
|
|
@@ -184,7 +184,7 @@
|
|
|
</div>
|
|
|
<span>{{ props.showData.workIndex + 1 }}/{{ props.showData.choiceQuestionListData.length }}</span>
|
|
|
<div :class="{ cq_cb_disabled: props.showData.workIndex >= props.showData.choiceQuestionListData.length - 1 }"
|
|
|
- @click="changeWorkIndex(1)">
|
|
|
+ @click.stop="changeWorkIndex(1)">
|
|
|
<svg style="transform: rotate(90deg);" viewBox="0 0 1024 1024" version="1.1" width="200" height="200">
|
|
|
<path
|
|
|
d="M512 330.666667c14.933333 0 29.866667 4.266667 40.533333 14.933333l277.33333399 234.666667c27.733333 23.466667 29.866667 64 8.53333301 89.6-23.466667 27.733333-64 29.866667-89.6 8.53333299L512 477.866667l-236.8 200.53333299c-27.733333 23.466667-68.266667 19.19999999-89.6-8.53333299-23.466667-27.733333-19.19999999-68.266667 8.53333301-89.6l277.33333399-234.666667c10.666667-10.666667 25.6-14.933333 40.533333-14.933333z"
|
|
|
@@ -199,7 +199,7 @@
|
|
|
<div class="c_t15_title">{{ workDetail.json.answerQ }}</div>
|
|
|
<span class="c_t15_type">{{ lang.ssQATest }}</span>
|
|
|
<div class="c_t15_content" v-show="!lookWorkData">
|
|
|
- <div class="c_t15_c_item" v-for="item in processedWorkArray" :key="item.id" @click="lookWork(item.id)">
|
|
|
+ <div class="c_t15_c_item" v-for="item in processedWorkArray" :key="item.id" @click.stop="lookWork(item.id)">
|
|
|
<div class="c_t15_c_i_top">
|
|
|
<span>S</span>
|
|
|
<div>{{ item.name }}</div>
|
|
|
@@ -211,7 +211,8 @@
|
|
|
</div>
|
|
|
|
|
|
<div class="aiAnalysis" style="margin-top:1rem ;"
|
|
|
- v-if="processedWorkArray.length > 0 && lookWorkData === null && workDetail.type === '15'">
|
|
|
+ v-if="processedWorkArray.length > 0 && lookWorkData === null && workDetail.type === '15'"
|
|
|
+ @click.stop="clickContent(false)">
|
|
|
<div class="ai_header">
|
|
|
<div class="ai_title">
|
|
|
<svg viewBox="0 0 1024 1024" width="200" height="200">
|
|
|
@@ -224,7 +225,7 @@
|
|
|
</svg>{{ lang.ssAnalysis }}
|
|
|
</div>
|
|
|
<div class="ai_refresh" :class="{ 'disabled': currentAnalysis && currentAnalysis.loading }"
|
|
|
- @click="aiAnalysisRefresh15()">
|
|
|
+ @click.stop="aiAnalysisRefresh15()">
|
|
|
{{ lang.ssAIGenerate }}
|
|
|
<svg viewBox="0 0 1024 1024" width="200" height="200">
|
|
|
<path
|
|
|
@@ -240,7 +241,7 @@
|
|
|
<div class="ai_echartsData" v-if="currentAnalysis && currentAnalysis.json.keyword">
|
|
|
<div class="title">{{ lang.ssKeyword }}:</div>
|
|
|
<span v-for="(item, index) in currentAnalysis.json.keyword" :key="index">{{ item }}</span>
|
|
|
- <div class="btn" @click="openEchatsDialog()">{{ lang.ssViewKeywordCloud }}</div>
|
|
|
+ <div class="btn" @click.stop="openEchatsDialog()">{{ lang.ssViewKeywordCloud }}</div>
|
|
|
</div>
|
|
|
<div class="generatingContent" v-if="currentAnalysis && currentAnalysis.generatingContent">{{
|
|
|
lang.ssGeneratingContent }}...</div>
|
|
|
@@ -249,9 +250,9 @@
|
|
|
</div>
|
|
|
|
|
|
|
|
|
- <div class="c_t15_workDetail" v-if="lookWorkData">
|
|
|
+ <div class="c_t15_workDetail" v-if="lookWorkData" @click.stop="clickContent(false)">
|
|
|
<div class="c_t15_wd_top">
|
|
|
- <img src="../../../assets/img/arrow_left.png" @click="lookWork('')" />
|
|
|
+ <img src="../../../assets/img/arrow_left.png" @click.stop="lookWork('')" />
|
|
|
<span>S</span>
|
|
|
<div>{{ lookWorkData.name }}</div>
|
|
|
</div>
|
|
|
@@ -259,7 +260,62 @@
|
|
|
<span v-html="lookWorkData.content.answer"></span>
|
|
|
<div class="c_t15_wd_c_imageList" v-if="lookWorkData.content.fileList.length > 0">
|
|
|
<img v-for="item in lookWorkData.content.fileList" :src="item.url" :key="item.uploadTime"
|
|
|
- @click="lookImage(item.url)" />
|
|
|
+ @click.stop="lookImage(item.url)" />
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <!-- 拍照 -->
|
|
|
+ <div class="c_t15" v-if="workDetail && workDetail.type === '79' && props.showData">
|
|
|
+ <div class="c_t15_title">{{ workDetail.json.answerQ }}</div>
|
|
|
+ <span class="c_t15_type">{{ lang.ssPhoto }}</span>
|
|
|
+ <div class="c_t15_content" v-show="!lookWorkData">
|
|
|
+ <div class="c_t15_c_item" v-for="item in processedWorkArray" :key="item.id"
|
|
|
+ @click.stop="item.content && item.content.fileList.length > 0 ? lookWork(item.id) : ''">
|
|
|
+ <div class="c_t15_c_i_top">
|
|
|
+ <span>S</span>
|
|
|
+ <div>{{ item.name }}</div>
|
|
|
+ </div>
|
|
|
+ <div class="c_t73_c_i_bottom" v-if="item.content && item.content.fileList.length > 0">
|
|
|
+ <img :src="item.content.fileList[0].url" />
|
|
|
+ </div>
|
|
|
+ <div class="c_t73_c_i_bottom" v-else>
|
|
|
+ <span>{{ lang.ssNoPhoto }}</span>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="c_t79_workDetail" v-if="lookWorkData" @click.stop="clickContent(false)">
|
|
|
+ <div class="c_t79_wd_top">
|
|
|
+ <img src="../../../assets/img/arrow_left.png" @click.stop="lookWork('')" />
|
|
|
+ <span>S</span>
|
|
|
+ <div>{{ lookWorkData.name }}</div>
|
|
|
+ </div>
|
|
|
+ <div class="c_t79_wd_content">
|
|
|
+ <img :src="lookWorkData.content.fileList[lookWorkIndex].url"
|
|
|
+ @click.stop="lookImage(lookWorkData.content.fileList[lookWorkIndex].url)" />
|
|
|
+ </div>
|
|
|
+ <!-- <div class="nextAndUpBtn" v-if="lookWorkData.content.fileList.length>1">
|
|
|
+ <span :class="{no_active:lookWorkIndex==0}" @click="changelookWorkIndex(0)">{{ lang.ssPrevP }}</span>
|
|
|
+ <span :class="{no_active:lookWorkData.content.fileList.length-1<=lookWorkIndex}" @click="changelookWorkIndex(1)">{{ lang.ssNextP }}</span>
|
|
|
+ </div> -->
|
|
|
+ <div class="cq_changeBtn" v-if="lookWorkData.content.fileList.length > 1">
|
|
|
+ <div :class="{ cq_cb_disabled: lookWorkIndex <= 0 }" @click.stop="changelookWorkIndex(0)">
|
|
|
+ <svg style="transform: rotate(-90deg);" viewBox="0 0 1024 1024" version="1.1" width="200" height="200">
|
|
|
+ <path
|
|
|
+ d="M512 330.666667c14.933333 0 29.866667 4.266667 40.533333 14.933333l277.33333399 234.666667c27.733333 23.466667 29.866667 64 8.53333301 89.6-23.466667 27.733333-64 29.866667-89.6 8.53333299L512 477.866667l-236.8 200.53333299c-27.733333 23.466667-68.266667 19.19999999-89.6-8.53333299-23.466667-27.733333-19.19999999-68.266667 8.53333301-89.6l277.33333399-234.666667c10.666667-10.666667 25.6-14.933333 40.533333-14.933333z"
|
|
|
+ fill=""></path>
|
|
|
+ </svg>
|
|
|
+ </div>
|
|
|
+ <span>{{ lookWorkIndex + 1 }}/{{ lookWorkData.content.fileList.length }}</span>
|
|
|
+ <div :class="{ cq_cb_disabled: lookWorkIndex >= lookWorkData.content.fileList.length - 1 }"
|
|
|
+ @click.stop="changelookWorkIndex(1)">
|
|
|
+ <svg style="transform: rotate(90deg);" viewBox="0 0 1024 1024" version="1.1" width="200" height="200">
|
|
|
+ <path
|
|
|
+ d="M512 330.666667c14.933333 0 29.866667 4.266667 40.533333 14.933333l277.33333399 234.666667c27.733333 23.466667 29.866667 64 8.53333301 89.6-23.466667 27.733333-64 29.866667-89.6 8.53333299L512 477.866667l-236.8 200.53333299c-27.733333 23.466667-68.266667 19.19999999-89.6-8.53333299-23.466667-27.733333-19.19999999-68.266667 8.53333301-89.6l277.33333399-234.666667c10.666667-10.666667 25.6-14.933333 40.533333-14.933333z"
|
|
|
+ fill=""></path>
|
|
|
+ </svg>
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
@@ -270,7 +326,7 @@
|
|
|
<div class="c_t72_title">{{ lang.ssAiApp }}</div>
|
|
|
<span class="c_t72_type">{{ lang.ssAiApp }}</span>
|
|
|
<div class="c_t72_content" v-show="!lookWorkData">
|
|
|
- <div class="c_t72_c_item" v-for="item in processedWorkArray" :key="item.id" @click="lookWork(item.id)">
|
|
|
+ <div class="c_t72_c_item" v-for="item in processedWorkArray" :key="item.id" @click.stop="lookWork(item.id)">
|
|
|
<div class="c_t72_c_i_top">
|
|
|
<span>S</span>
|
|
|
<div>{{ item.name }}</div>
|
|
|
@@ -279,7 +335,8 @@
|
|
|
</div>
|
|
|
|
|
|
<div class="aiAnalysis" style="margin-top:1rem ;"
|
|
|
- v-if="processedWorkArray.length > 0 && lookWorkData === null && props.showData.toolType === 72">
|
|
|
+ v-if="processedWorkArray.length > 0 && lookWorkData === null && props.showData.toolType === 72"
|
|
|
+ @click.stop="clickContent(false)">
|
|
|
<div class="ai_header">
|
|
|
<div class="ai_title">
|
|
|
<svg viewBox="0 0 1024 1024" width="200" height="200">
|
|
|
@@ -292,7 +349,7 @@
|
|
|
</svg>{{ lang.ssAnalysis }}
|
|
|
</div>
|
|
|
<div class="ai_refresh" :class="{ 'disabled': currentAnalysis && currentAnalysis.loading }"
|
|
|
- @click="aiAnalysisRefresh72()">
|
|
|
+ @click.stop="aiAnalysisRefresh72()">
|
|
|
{{ lang.ssAIGenerate }}
|
|
|
<svg viewBox="0 0 1024 1024" width="200" height="200">
|
|
|
<path
|
|
|
@@ -302,16 +359,15 @@
|
|
|
|
|
|
</div>
|
|
|
</div>
|
|
|
- <div class="ai_content" v-if="currentAnalysis && currentAnalysis.json">
|
|
|
- {{ currentAnalysis.json.text }}
|
|
|
+ <div class="ai_content" v-if="currentAnalysis && currentAnalysis.json" v-html="currentAnalysis.json.text">
|
|
|
</div>
|
|
|
<div class="ai_updateTime" v-if="currentAnalysis">{{ lang.ssUpdateTime }}:{{ currentAnalysis.update_at }}
|
|
|
</div>
|
|
|
</div>
|
|
|
|
|
|
- <div class="c_t72_workDetail" v-if="lookWorkData">
|
|
|
+ <div class="c_t72_workDetail" v-if="lookWorkData" @click.stop="clickContent(false)">
|
|
|
<div class="c_t72_wd_top">
|
|
|
- <img src="../../../assets/img/arrow_left.png" @click="lookWork('')" />
|
|
|
+ <img src="../../../assets/img/arrow_left.png" @click.stop="lookWork('')" />
|
|
|
<span>S</span>
|
|
|
<div>{{ lookWorkData.name }}</div>
|
|
|
</div>
|
|
|
@@ -344,7 +400,8 @@
|
|
|
{{ item.type }}
|
|
|
</div>
|
|
|
<div class="na_m_i_content">
|
|
|
- <img @click="lookImage(item3)" style="height: 100px;width: auto;cursor: pointer;" :src="item3" />
|
|
|
+ <img @click.stop="lookImage(item3)" style="height: 100px;width: auto;cursor: pointer;"
|
|
|
+ :src="item3" />
|
|
|
</div>
|
|
|
</div>
|
|
|
</template>
|
|
|
@@ -361,7 +418,7 @@
|
|
|
<div class="c_t73_title">{{ lang.ssPageImage }}</div>
|
|
|
<span class="c_t73_type">{{ lang.ssHPage }}</span>
|
|
|
<div class="c_t73_content" v-show="!lookWorkData">
|
|
|
- <div class="c_t73_c_item" v-for="item in processedWorkArray" :key="item.id" @click="lookWork(item.id)">
|
|
|
+ <div class="c_t73_c_item" v-for="item in processedWorkArray" :key="item.id" @click.stop="lookWork(item.id)">
|
|
|
<div class="c_t73_c_i_top">
|
|
|
<span>S</span>
|
|
|
<div>{{ item.name }}</div>
|
|
|
@@ -372,9 +429,9 @@
|
|
|
</div>
|
|
|
</div>
|
|
|
|
|
|
- <div class="c_t73_workDetail" v-if="lookWorkData">
|
|
|
+ <div class="c_t73_workDetail" v-if="lookWorkData" @click.stop="clickContent(false)">
|
|
|
<div class="c_t73_wd_top">
|
|
|
- <img src="../../../assets/img/arrow_left.png" @click="lookWork('')" />
|
|
|
+ <img src="../../../assets/img/arrow_left.png" @click.stop="lookWork('')" />
|
|
|
<span>S</span>
|
|
|
<div>{{ lookWorkData.name }}</div>
|
|
|
</div>
|
|
|
@@ -442,7 +499,9 @@ const echartsDialogRef = ref<any>(null)
|
|
|
// ai分析数据
|
|
|
const aiAnalysisData = ref<Array<any>>([])
|
|
|
|
|
|
-const md = new MarkdownIt()
|
|
|
+const md = new MarkdownIt({
|
|
|
+ html: true,
|
|
|
+})
|
|
|
const { getFile } = useImport()
|
|
|
|
|
|
// 判断是否是 URL 链接
|
|
|
@@ -488,7 +547,7 @@ const processWorkContent = async (content: string, toolType: number): Promise<an
|
|
|
}
|
|
|
|
|
|
try {
|
|
|
- if ([45, 15, 78].includes(toolType)) {
|
|
|
+ if ([45, 15, 78, 79].includes(toolType)) {
|
|
|
return JSON.parse(decodeURIComponent(contentToParse))
|
|
|
}
|
|
|
else if (toolType === 72) {
|
|
|
@@ -596,11 +655,23 @@ const lookImage = (url: string) => {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+const lookWorkIndex = ref<number>(0)
|
|
|
// 查看作业
|
|
|
const lookWork = (id: string) => {
|
|
|
+ lookWorkIndex.value = 0
|
|
|
lookWorkDetail.value = id
|
|
|
}
|
|
|
|
|
|
+// 切换查看作业图片
|
|
|
+const changelookWorkIndex = (type: number) => {
|
|
|
+ if (type === 0 && lookWorkIndex.value > 0) {
|
|
|
+ lookWorkIndex.value = lookWorkIndex.value - 1
|
|
|
+ }
|
|
|
+ else if (type === 1 && lookWorkIndex.value < lookWorkData.value.content.fileList.length - 1) {
|
|
|
+ lookWorkIndex.value = lookWorkIndex.value + 1
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
// 选择题图表实例
|
|
|
const myChart = ref<any>(null)
|
|
|
|
|
|
@@ -1283,29 +1354,29 @@ const getWordCloud15 = () => {
|
|
|
const aiAnalysisRefresh72 = async () => {
|
|
|
|
|
|
let chatMsg = ``
|
|
|
-
|
|
|
+ console.log('processedWorkArray.value', processedWorkArray.value)
|
|
|
processedWorkArray.value.forEach((i) => {
|
|
|
- i.content.forEach(j => {
|
|
|
- if (j.messages) {
|
|
|
- j.messages.forEach((a) => {
|
|
|
- chatMsg += `\n${a.sender}:
|
|
|
+ if (typeof i.content === 'object') {
|
|
|
+ i.content.forEach(j => {
|
|
|
+ if (j.messages) {
|
|
|
+ j.messages.forEach((a) => {
|
|
|
+ chatMsg += `\n${a.sender}:
|
|
|
${a.content}\n`
|
|
|
- })
|
|
|
- }
|
|
|
- if (j.imageUrls) {
|
|
|
- j.imageUrls.forEach((a) => {
|
|
|
- chatMsg += `\n${a}\n`
|
|
|
- })
|
|
|
- }
|
|
|
-
|
|
|
- })
|
|
|
+ })
|
|
|
+ }
|
|
|
+ if (j.imageUrls) {
|
|
|
+ j.imageUrls.forEach((a) => {
|
|
|
+ chatMsg += `\n${a}\n`
|
|
|
+ })
|
|
|
+ }
|
|
|
|
|
|
+ })
|
|
|
+ }
|
|
|
})
|
|
|
-
|
|
|
-
|
|
|
+ // if(props.userId)
|
|
|
|
|
|
// - 未提交学生:${JSON.stringify(props.showData.unsubmittedStudents.map((item: any) => item.name))}
|
|
|
- const msg = `# CONTEXT #
|
|
|
+ let msg = `# CONTEXT #
|
|
|
你是K-12阶段的AI教育课堂分析助手,基于上传的课件、逐字稿,以及当页的学生答题数据(选择题/问答题/智能体对话)进行智能分析。
|
|
|
|
|
|
# OBJECTIVE #
|
|
|
@@ -1333,6 +1404,47 @@ ${a.content}\n`
|
|
|
# EXAMPLES #
|
|
|
样例:
|
|
|
智能体对话显示学生对“模型训练”概念模糊,多次询问“为什么不能直接告诉机器答案”。针对概念混淆学生,补充“人类学习类比”相关解释,巩固“从数据中学习规律”核心认知。`
|
|
|
+
|
|
|
+
|
|
|
+ if (["6c56ec0e-2c74-11ef-bee5-005056b86db5", "aea65da6-4399-11f1-9985-005056924926", "9c236d45-49cd-11f1-9985-005056924926"].includes(props.userId)) {
|
|
|
+ msg = `你是K-12阶段的AI教育课堂分析助手,基于当前课程信息以及当页的学生与单/多智能体对话数据,进行深入的智能分析。
|
|
|
+
|
|
|
+### 任务目标
|
|
|
+1. **总体统计分析**:
|
|
|
+ - 分析学生表现数据,例如全班学生互动数据,包括但不限于参与度、互动轮次、作文批改分布、作业完成情况等。
|
|
|
+ - 提取核心统计指标,例如发现共性问题、互动模式、分层水平分布、关键评分、完成度、优秀或需关注的学生。
|
|
|
+
|
|
|
+2. **洞察(Key Insights)**:
|
|
|
+ - 不是所有模块都需要的
|
|
|
+ - 输出的模块使用1~3句快速完成核心发现输出
|
|
|
+ - 保持简短、直观、易快速理解。
|
|
|
+3. **不输出教学建议或干预措施**。
|
|
|
+
|
|
|
+### 输出格式
|
|
|
+1. Markdown表格:展示关键统计指标(发言次数、互动频率、提问数量、主题分布)。
|
|
|
+2. ASCII条形图(可选):展示各项指标对比情况(绝对不要ASCII条形图,应该显示指标名字)
|
|
|
+3. 洞察与建议:分点呈现,每点对应具体统计指标或数据来源,保持精简,直观、易快速理解。
|
|
|
+**注意,不必输出多余的开场白(可以有非常简短的),转场,铺垫,形容词等,尽可能把输出留给有价值的发现**
|
|
|
+**对于重点要注意的内容,可以用 <span style="color:red"> 内容 </span> 以及 markdown的强调语法来highlight**
|
|
|
+
|
|
|
+### 注意事项
|
|
|
+- 输出简洁明了,重点突出。
|
|
|
+- 所有数字列右对齐,必要时显示百分比。
|
|
|
+- 避免冗长文字和详细案例描述。
|
|
|
+- 保持专业、友好语气,可使用 Emoji 提示情绪、课堂氛围或学生表现状态。
|
|
|
+- 输出保持在600字左右
|
|
|
+
|
|
|
+#INPUT#
|
|
|
+课程数据:
|
|
|
+- 课程名称:${props.courseDetail.title}
|
|
|
+- 课程学科:${props.courseDetail.name}
|
|
|
+当前页面答题数据(问答题):【分析重点】
|
|
|
+- AI应用
|
|
|
+- 对话数据:${chatMsg}
|
|
|
+`
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
console.log('cs', msg)
|
|
|
if (!currentAnalysis.value) {
|
|
|
aiAnalysisData.value.push({
|
|
|
@@ -1358,7 +1470,7 @@ ${a.content}\n`
|
|
|
if (event.type === 'message') {
|
|
|
aiAnalysisData.value.find((item: any) => {
|
|
|
return item.pid === props.workId + (props.cid ? ',' + props.cid : '') && item.index === props.showData.workIndex
|
|
|
- }).json.text = event.data
|
|
|
+ }).json.text = md.render(event.data)
|
|
|
|
|
|
aiAnalysisData.value.find((item: any) => {
|
|
|
return item.pid === props.workId + (props.cid ? ',' + props.cid : '') && item.index === props.showData.workIndex
|
|
|
@@ -1367,7 +1479,7 @@ ${a.content}\n`
|
|
|
else if (event.type === 'messageEnd') {
|
|
|
aiAnalysisData.value.find((item: any) => {
|
|
|
return item.pid === props.workId + (props.cid ? ',' + props.cid : '') && item.index === props.showData.workIndex
|
|
|
- }).json.text = event.data
|
|
|
+ }).json.text = md.render(event.data)
|
|
|
aiAnalysisData.value.find((item: any) => {
|
|
|
return item.pid === props.workId + (props.cid ? ',' + props.cid : '') && item.index === props.showData.workIndex
|
|
|
}).noEnd = false
|
|
|
@@ -1376,7 +1488,7 @@ ${a.content}\n`
|
|
|
}).update_at = new Date().toLocaleString('zh-CN', { year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', second: '2-digit', hour12: false }).replace(/\//g, '-')
|
|
|
saveAnalysis()
|
|
|
}
|
|
|
- }).catch(err => {
|
|
|
+ }, '', [], 'open-qwen-plus-latest').catch(err => {
|
|
|
console.log('err', err)
|
|
|
})
|
|
|
}
|
|
|
@@ -1396,9 +1508,9 @@ const currentAnalysis = computed(() => {
|
|
|
if (_result) {
|
|
|
return _result
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
return null
|
|
|
-
|
|
|
+
|
|
|
})
|
|
|
|
|
|
// 保存分析
|
|
|
@@ -1423,22 +1535,24 @@ const saveAnalysis = () => {
|
|
|
}
|
|
|
|
|
|
|
|
|
+// 点击边框
|
|
|
+const clickContent = (flag: boolean) => {
|
|
|
+ if (flag && lookWorkDetail.value && workDetail.value?.type !== '45' && workDetail.value?.type !== '78') {
|
|
|
+ lookWork('')
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
// 监听 props.showData.workDetail.id 变化
|
|
|
watch(
|
|
|
() => props.showData?.workDetail,
|
|
|
(newId, oldId) => {
|
|
|
- if (newId && newId !== oldId) {
|
|
|
- getAnalysis()
|
|
|
- }
|
|
|
+ getAnalysis()
|
|
|
},
|
|
|
{ immediate: true }
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
-// onMounted(()=>{
|
|
|
-// getAnalysis()
|
|
|
-// })
|
|
|
|
|
|
// 组件卸载时清理ECharts实例
|
|
|
onUnmounted(() => {
|
|
|
@@ -1703,6 +1817,33 @@ onUnmounted(() => {
|
|
|
-webkit-line-clamp: 2;
|
|
|
-webkit-box-orient: vertical;
|
|
|
}
|
|
|
+
|
|
|
+ .c_t73_c_i_bottom {
|
|
|
+ margin-top: 15px;
|
|
|
+ font-weight: 300;
|
|
|
+ font-size: 14px;
|
|
|
+ // height: 40px;
|
|
|
+ max-width: 100%;
|
|
|
+ overflow: hidden;
|
|
|
+ text-overflow: ellipsis;
|
|
|
+ display: -webkit-box;
|
|
|
+ -webkit-line-clamp: 2;
|
|
|
+ -webkit-box-orient: vertical;
|
|
|
+
|
|
|
+ img {
|
|
|
+ width: 100%;
|
|
|
+ height: 200px;
|
|
|
+ object-fit: cover;
|
|
|
+ }
|
|
|
+
|
|
|
+ span {
|
|
|
+ width: 100%;
|
|
|
+ height: 200px;
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: center;
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -1772,6 +1913,104 @@ onUnmounted(() => {
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ .c_t79_workDetail {
|
|
|
+ width: 100%;
|
|
|
+ height: auto;
|
|
|
+ margin-top: 40px;
|
|
|
+ box-shadow: 4px 4px 14px 0px rgba(252, 207, 0, 0.5);
|
|
|
+ box-sizing: border-box;
|
|
|
+ padding: 16px;
|
|
|
+ border-radius: 12px;
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+
|
|
|
+ .c_t79_wd_top {
|
|
|
+ width: 100%;
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ gap: 15px;
|
|
|
+
|
|
|
+ &>img {
|
|
|
+ width: 25px;
|
|
|
+ height: 25px;
|
|
|
+ cursor: pointer;
|
|
|
+ }
|
|
|
+
|
|
|
+ &>span {
|
|
|
+ display: block;
|
|
|
+ width: 30px;
|
|
|
+ height: 30px;
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: center;
|
|
|
+ background: rgba(252, 207, 0, 1);
|
|
|
+ border-radius: 4px;
|
|
|
+ color: rgba(255, 255, 255, 1);
|
|
|
+ font-weight: bold;
|
|
|
+ font-size: 16px;
|
|
|
+ }
|
|
|
+
|
|
|
+ &>div {
|
|
|
+ color: rgba(0, 0, 0, 0.7);
|
|
|
+ font-weight: 800;
|
|
|
+ font-size: 18px;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .c_t79_wd_content {
|
|
|
+ width: 100%;
|
|
|
+ margin-top: 20px;
|
|
|
+ max-height: 100%;
|
|
|
+ overflow: auto;
|
|
|
+ flex-wrap: wrap;
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: center;
|
|
|
+
|
|
|
+ &>img {
|
|
|
+ max-width: 100%;
|
|
|
+ height: 300px;
|
|
|
+ object-fit: cover;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .cq_changeBtn {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ gap: 1.5rem;
|
|
|
+ margin: 1rem auto;
|
|
|
+
|
|
|
+ &>div {
|
|
|
+ padding: .6rem;
|
|
|
+ border-radius: .5rem;
|
|
|
+ border: solid 2px #F6C82B;
|
|
|
+ display: flex;
|
|
|
+ justify-content: center;
|
|
|
+ align-items: center;
|
|
|
+ cursor: pointer;
|
|
|
+
|
|
|
+ &>svg {
|
|
|
+ fill: #F6C82D;
|
|
|
+ width: 1rem;
|
|
|
+ height: 1rem;
|
|
|
+ }
|
|
|
+
|
|
|
+ &.cq_cb_disabled {
|
|
|
+ cursor: not-allowed !important;
|
|
|
+ border-color: #FEF8E9 !important;
|
|
|
+ }
|
|
|
+
|
|
|
+ &.cq_cb_disabled>svg {
|
|
|
+ fill: #A3A3A3 !important;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ &>span {
|
|
|
+ font-weight: 500;
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
.c_t72 {
|
|
|
@@ -2211,6 +2450,23 @@ onUnmounted(() => {
|
|
|
&>.ai_content {
|
|
|
font-size: 1rem;
|
|
|
font-weight: 500;
|
|
|
+
|
|
|
+ :deep(table) {
|
|
|
+ border-collapse: collapse;
|
|
|
+ width: 100%;
|
|
|
+ margin: 0.5rem 0;
|
|
|
+
|
|
|
+ th,
|
|
|
+ td {
|
|
|
+ border: 1px solid #ddd;
|
|
|
+ padding: 0.5rem;
|
|
|
+ text-align: left;
|
|
|
+ }
|
|
|
+
|
|
|
+ th {
|
|
|
+ background: #f5f5f5;
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
&>.ai_echartsData {
|
|
|
@@ -2246,4 +2502,34 @@ onUnmounted(() => {
|
|
|
font-weight: 500;
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+.nextAndUpBtn {
|
|
|
+ width: 100%;
|
|
|
+ height: auto;
|
|
|
+ display: grid;
|
|
|
+ grid-template-columns: 1fr 1fr;
|
|
|
+ margin-top: 20px;
|
|
|
+ gap: 15px;
|
|
|
+
|
|
|
+ &>span {
|
|
|
+ display: flex;
|
|
|
+ justify-content: center;
|
|
|
+ align-items: center;
|
|
|
+ width: 100%;
|
|
|
+ height: 40px;
|
|
|
+ border-radius: 5px;
|
|
|
+ font-size: 14px;
|
|
|
+ font-weight: 500;
|
|
|
+ color: #fff;
|
|
|
+ background: #f6c82b;
|
|
|
+ cursor: pointer;
|
|
|
+ }
|
|
|
+
|
|
|
+ &>.no_active {
|
|
|
+ background: #cccccc !important;
|
|
|
+ color: #999999 !important;
|
|
|
+ cursor: not-allowed !important;
|
|
|
+ pointer-events: none !important;
|
|
|
+ }
|
|
|
+}
|
|
|
</style>
|