index.vue 46 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389
  1. <template>
  2. <div class="contrastObservation" v-loading="loading">
  3. <div class="co_card co_aggregateData" v-loading="aggregateLoading">
  4. <div class="co_ad_title">
  5. <img
  6. :src="
  7. require('../../../assets/icon/contrastObservation/titleIcon.svg')
  8. "
  9. />
  10. <span>总数据对比</span>
  11. </div>
  12. <div class="co_ad_chartArea">
  13. <chart :data="aggregateData.chartData" />
  14. </div>
  15. <div class="co_ad_messageArea" v-html="aggregateData.message"></div>
  16. </div>
  17. <div class="co_card co_ai_card">
  18. <div class="co_c_main" v-loading="aiLoading">
  19. <div class="co_c_title">AI观察结果</div>
  20. <div
  21. class="co_c_m_message"
  22. v-for="(item, index) in aiData"
  23. :key="index"
  24. >
  25. <div class="co_c_m_m_title co_ai_title">
  26. <el-tooltip
  27. class="item"
  28. effect="dark"
  29. :content="item.description"
  30. placement="bottom"
  31. popper-class="text_tooltip"
  32. >
  33. <span>{{ item.title }}</span>
  34. </el-tooltip>
  35. </div>
  36. <div class="score">
  37. <span class="titleBlob">评分:</span>{{ item.score }}
  38. </div>
  39. <div class="message">
  40. <span class="titleBlob">结论:</span>{{ item.message }}
  41. </div>
  42. <div class="basis">
  43. <span class="titleBlob">依据:</span>
  44. <ol>
  45. <li
  46. v-for="(item2, index2) in item.basis.length ? item.basis : []"
  47. :key="index2"
  48. >
  49. {{ item2 }}
  50. </li>
  51. </ol>
  52. </div>
  53. <!-- <div class="co_c_m_m_text">{{ item.message }}</div> -->
  54. </div>
  55. </div>
  56. </div>
  57. <div class="co_card co_teacher_card">
  58. <div class="co_c_main" v-loading="teacherLoading">
  59. <div class="co_c_title">教师观察结果</div>
  60. <div
  61. class="co_c_m_message"
  62. v-for="(item, index) in teacherData"
  63. :key="index"
  64. >
  65. <div class="co_c_m_m_title co_teacher_title">
  66. <el-tooltip
  67. class="item"
  68. effect="dark"
  69. :content="item.description"
  70. placement="bottom"
  71. popper-class="text_tooltip"
  72. >
  73. <span>{{ item.title }}</span>
  74. </el-tooltip>
  75. </div>
  76. <div class="score">
  77. <span class="titleBlob">评分:</span>{{ item.score }}
  78. </div>
  79. <div class="message">
  80. <span class="titleBlob">结论:</span>{{ item.message }}
  81. </div>
  82. <div class="basis">
  83. <span class="titleBlob">依据:</span>
  84. <ol>
  85. <li
  86. v-for="(item2, index2) in item.basis.length ? item.basis : []"
  87. :key="index2"
  88. >
  89. {{ item2 }}
  90. </li>
  91. </ol>
  92. </div>
  93. <!-- <div class="co_c_m_m_text">{{ item.message }}</div> -->
  94. </div>
  95. </div>
  96. </div>
  97. <div class="co_card co_contrast_card">
  98. <div class="co_c_main" v-loading="contrastLoading">
  99. <div class="co_c_title">对比观察结果</div>
  100. <div
  101. class="co_c_m_message"
  102. v-for="(item, index) in contrastData"
  103. :key="index"
  104. >
  105. <div class="co_c_m_m_title co_contrast_title">
  106. <el-tooltip
  107. class="item"
  108. effect="dark"
  109. :content="item.description"
  110. placement="bottom"
  111. popper-class="text_tooltip"
  112. >
  113. <span>{{ item.title }}</span>
  114. </el-tooltip>
  115. </div>
  116. <div class="similarity">
  117. <span class="titleBlob compareTitle">相同点:</span>
  118. <span>{{ item.similarity }}</span>
  119. </div>
  120. <!-- <div class="compare" v-else>
  121. <div class="titleBlob">相同点:</div>
  122. <ol>
  123. <li
  124. v-for="(item2, index2) in item.similarity.length ? item.similarity : []"
  125. :key="index2"
  126. >
  127. {{ item2 }}
  128. </li>
  129. </ol>
  130. </div> -->
  131. <div class="difference">
  132. <span class="titleBlob compareTitle">不同点:</span>
  133. <span>{{ item.difference }}</span>
  134. </div>
  135. <!-- <div class="compare" v-else>
  136. <div class="titleBlob">不同点:</div>
  137. <ol>
  138. <li
  139. v-for="(item2, index2) in item.difference.length ? item.difference : []"
  140. :key="index2"
  141. >
  142. {{ item2 }}
  143. </li>
  144. </ol>
  145. </div> -->
  146. <!--<div class="score">评分:{{ item.score }}分</div>
  147. <div class="message">结论:{{ item.message }}</div>
  148. <div class="basis">
  149. <span>依据:</span>
  150. <ol>
  151. <li
  152. v-for="(item2, index2) in item.basis.length ? item.basis : []"
  153. :key="index2"
  154. >
  155. {{ item2 }}
  156. </li>
  157. </ol>
  158. </div>-->
  159. <!-- <div class="co_c_m_m_text">{{ item.message }}</div> -->
  160. </div>
  161. </div>
  162. </div>
  163. <div
  164. :class="['refresh',(loading ||aggregateLoading ||aiLoading ||teacherLoading ||contrastLoading)?'refreshDisabled':'']"
  165. @click.stop="refresh()"
  166. v-loading="
  167. loading ||
  168. aggregateLoading ||
  169. aiLoading ||
  170. teacherLoading ||
  171. contrastLoading
  172. "
  173. >
  174. <img
  175. :src="require('../../../assets/icon/contrastObservation/refresh.svg')"
  176. />
  177. </div>
  178. </div>
  179. </template>
  180. <script>
  181. import chart from "./component/chart";
  182. import { v4 as uuidv4 } from "uuid";
  183. export default {
  184. components: {
  185. chart,
  186. },
  187. data() {
  188. return {
  189. tid: this.$route.query["tid"],
  190. testId: {
  191. testId: "",
  192. checkUrl: "",
  193. doUrl: "",
  194. },
  195. editorBarData: {
  196. type: 0,
  197. content: "",
  198. },
  199. testData: null,
  200. isDoTestList: [],
  201. loading: false,
  202. aggregateLoading: false,
  203. aiLoading: false,
  204. teacherLoading: false,
  205. contrastLoading: false,
  206. classroomObservationData: [],
  207. aggregateData: {
  208. message: ``,
  209. chartData: {
  210. legend: {
  211. data: ["AI的观察结果", "教师观察结果"],
  212. },
  213. radar: {
  214. // shape: 'circle',
  215. indicator: [
  216. { name: "教学设计", max: 10 },
  217. { name: "教学实施", max: 10 },
  218. { name: "学生参与", max: 10 },
  219. { name: "知识建构", max: 10 },
  220. { name: "课堂氛围", max: 10 },
  221. { name: "教学评价", max: 10 },
  222. ],
  223. },
  224. series: [
  225. {
  226. name: "Budget vs spending",
  227. type: "radar",
  228. data: [
  229. {
  230. value: [0, 0, 0, 0, 0, 0],
  231. name: "AI的观察结果",
  232. },
  233. {
  234. value: [0, 0, 0, 0, 0, 0],
  235. name: "教师观察结果",
  236. },
  237. ],
  238. },
  239. ],
  240. },
  241. },
  242. aiData: [],
  243. teacherData: [],
  244. contrastData: [],
  245. };
  246. },
  247. methods: {
  248. refresh() {
  249. if(this.loading || this.aggregateLoading || this.aiLoading || this.teacherLoading || this.contrastLoading)return;
  250. this.getData();
  251. },
  252. // 获取绑定的testId
  253. getBindTestId() {
  254. return new Promise((resolve, reject) => {
  255. if (this.loading || !this.tid) return;
  256. this.loading = true;
  257. let pram = {
  258. tid: this.tid,
  259. type: "0",
  260. };
  261. this.ajax
  262. .post("https://gpt4.cocorobo.cn/get_classroom_observation_new", pram)
  263. .then((res) => {
  264. let _result = res.data.FunctionResponse.result;
  265. if (_result) {
  266. let _jsonData = JSON.parse(_result);
  267. let baseMessage = _jsonData[0];
  268. let _bmJsonData = JSON.parse(baseMessage.jsonData);
  269. let _testData = _bmJsonData.testData;
  270. this.editorBarData = _bmJsonData.editorBarData;
  271. if (_testData) {
  272. this.testId = _testData;
  273. resolve();
  274. } else {
  275. this.$message.error("该观察未绑定表单");
  276. return;
  277. }
  278. }
  279. })
  280. .catch((e) => {
  281. this.$message.error("获取testId失败");
  282. console.log(e);
  283. return;
  284. })
  285. .finally(() => {
  286. this.loading = false;
  287. });
  288. });
  289. },
  290. // 获取绑定的表单数据
  291. getBindTestData() {
  292. return new Promise((resolve, reject) => {
  293. if (!this.testId.testId || !this.tid) return;
  294. this.loading = true;
  295. this.ajax
  296. .get(this.$store.state.api + "getTestWorksNoPage", {
  297. cid: this.testId.testId,
  298. cn: "",
  299. })
  300. .then((res) => {
  301. if (res.data[0].length != 0) {
  302. let _result = res.data[0][0];
  303. _result.chapters = JSON.parse(_result.chapters);
  304. // _result.cover = JSON.parse(_result.cover);
  305. this.testData = _result;
  306. resolve();
  307. }
  308. if (res.data[1].length != 0) {
  309. let _doTest = res.data[1];
  310. _doTest.forEach((i) => {
  311. i.courseJson = JSON.parse(i.courseJson);
  312. });
  313. this.isDoTestList = _doTest;
  314. }
  315. })
  316. .catch((e) => {
  317. this.$message.info("获取表单数据失败");
  318. console.log(e);
  319. return;
  320. })
  321. .finally((_) => {
  322. this.loading = false;
  323. });
  324. });
  325. },
  326. // 获取教师观察结果
  327. getTeacherResultData() {
  328. return new Promise((resolve, reject) => {
  329. if (this.teacherLoading || !this.testData) return;
  330. if(!this.testData>0)return this.$message.error("绑定的表单无数据")
  331. this.teacherLoading = true;
  332. this.teacherData = [];
  333. let _workData = [];
  334. this.isDoTestList.forEach((item, index) => {
  335. if (index == 0) {
  336. item.courseJson.forEach((i) => {
  337. if (i.type == 1) {
  338. // 选择题
  339. if (i.json.type == 1) {
  340. // 单选题
  341. _workData.push({
  342. typeName: "单选题",
  343. type: "1-1",
  344. title: i.json.title,
  345. checkList: i.json.array,
  346. answer: i.json.answer[0],
  347. userAnswer: [i.json.answer2[0]],
  348. score: i.json.score,
  349. });
  350. } else if (i.json.type == 2) {
  351. //多选题
  352. _workData.push({
  353. typeName: "多选题",
  354. type: "1-2",
  355. title: i.json.title,
  356. checkList: i.json.array,
  357. answer: i.json.answer,
  358. userAnswer: [i.json.answer2],
  359. score: i.json.score,
  360. });
  361. }
  362. } else if (i.type == 7) {
  363. //评分
  364. _workData.push({
  365. typeName: "评分题",
  366. type: "7",
  367. title: i.json.title,
  368. max: i.json.big,
  369. min: i.json.small,
  370. userAnswer: [i.json.answer2],
  371. });
  372. } else if (i.type == 3) {
  373. //问答题
  374. _workData.push({
  375. typeName: "问答题",
  376. type: "3",
  377. title: i.json.title,
  378. score: i.json.score,
  379. answer: i.json.answer,
  380. userAnswer: [i.json.answer2],
  381. });
  382. } else if (i.type == 5) {
  383. //附件上传
  384. }
  385. });
  386. } else {
  387. item.courseJson.forEach((i) => {
  388. if (i.type == 1) {
  389. // 选择题
  390. if (i.json.type == 1) {
  391. // 单选题
  392. let _index = _workData.findIndex((j) => j.type == "1-1");
  393. if (_index != -1) {
  394. _workData[_index].userAnswer.push(i.json.answer2[0]);
  395. }
  396. } else if (i.json.type == 2) {
  397. //多选题
  398. let _index = _workData.findIndex((j) => j.type == "1-2");
  399. if (_index != -1) {
  400. _workData[_index].userAnswer.push(i.json.answer2);
  401. }
  402. }
  403. } else if (i.type == 7) {
  404. //评分
  405. let _index = _workData.findIndex((j) => j.type == "7");
  406. if (_index != -1) {
  407. _workData[_index].userAnswer.push(i.json.answer2);
  408. }
  409. } else if (i.type == 3) {
  410. //问答题
  411. let _index = _workData.findIndex((j) => j.type == "3");
  412. if (_index != -1) {
  413. _workData[_index].userAnswer.push(i.json.answer2);
  414. }
  415. } else if (i.type == 5) {
  416. //附件上传
  417. }
  418. });
  419. }
  420. });
  421. let _workText = ``;
  422. _workData.forEach((i) => {
  423. if (i.type == "1-1") {
  424. let _checkListText = ``;
  425. i.checkList.forEach((i2, index) => {
  426. _checkListText += `选项${index + 1}:${i2.option}\n`;
  427. });
  428. let _userAnswerText = ``;
  429. let _newAnswer = [];
  430. i.userAnswer.forEach((i2) => {
  431. if (typeof i2 === "number") {
  432. _newAnswer.push(i2);
  433. } else {
  434. _newAnswer.push(...i2);
  435. }
  436. });
  437. i.checkList.forEach((item, index) => {
  438. _userAnswerText += `选择选项${index + 1}的次数:${
  439. _newAnswer.filter((i3) => i3 === index).length
  440. }\n`;
  441. });
  442. _workText += `单选题:\n总分:${i.score}分\n题目:${
  443. i.title
  444. }\n答案:选项${
  445. i.answer + 1
  446. }\n选项:\n${_checkListText}${_userAnswerText}\n`;
  447. } else if (i.type == "1-2") {
  448. let _checkListText = ``;
  449. i.checkList.forEach((i2, index) => {
  450. _checkListText += `选项${index + 1}:${i2.option}\n`;
  451. });
  452. let _answerText = ``;
  453. i.answer.forEach((i4, index4) => {
  454. if (index4 != 0) _answerText += `、`;
  455. _answerText += `选项${index4 + 1}`;
  456. });
  457. let _userAnswerText = ``;
  458. let _newAnswer = [];
  459. i.userAnswer.forEach((i2) => {
  460. if (typeof i2 === "number") {
  461. _newAnswer.push(i2);
  462. } else {
  463. _newAnswer.push(...i2);
  464. }
  465. });
  466. i.checkList.forEach((item, index) => {
  467. _userAnswerText += `选择选项${index + 1}的次数:${
  468. _newAnswer.filter((i3) => i3 === index).length
  469. }\n`;
  470. });
  471. _workText += `多选题:\n总分:${i.score}分\n题目:${i.title}\n答案:${_answerText}\n选项:\n${_checkListText}${_userAnswerText}\n`;
  472. } else if (i.type == "7") {
  473. let _userAnswerText = ``;
  474. let _groupUserAnswer = [];
  475. i.userAnswer.forEach((i2) => {
  476. if (!_groupUserAnswer.includes(i2)) {
  477. _groupUserAnswer.push(i2);
  478. }
  479. });
  480. _groupUserAnswer.forEach((i3) => {
  481. _userAnswerText += `${i3}:${
  482. i.userAnswer.filter((i4) => i4 === i3).length
  483. }\n`;
  484. });
  485. _workText += `评分题:\n最大评分:${i.max}\n最小评分:${i.min}\n评分与次数:\n${_userAnswerText}\n\n`;
  486. } else if (i.type == "3") {
  487. let _userAnswerText = ``;
  488. let _groupUserAnswer = [];
  489. i.userAnswer.forEach((i2) => {
  490. if (!_groupUserAnswer.includes(i2)) {
  491. _groupUserAnswer.push(i2);
  492. }
  493. });
  494. _groupUserAnswer.forEach((i3) => {
  495. _userAnswerText += `${i3}:${
  496. i.userAnswer.filter((i4) => i4 === i3).length
  497. }\n`;
  498. });
  499. _workText += `问答题:\n总分:${i.score}分\n题目:${i.title}\n答案:${i.answer}\n答题与次数:\n${_userAnswerText}\n\n`;
  500. }
  501. });
  502. let _msg = `
  503. NOTICE
  504. Language: Please use the same language as the user requirement, if the user speaks Chinese, the specific text of your answer should also be in Chinese.
  505. ## 任务
  506. 你是专业的教育评估专家,熟悉教学评估的六个维度,了解如何从课堂观察报告中提取关键信息,并进行深入分析。
  507. 请你基于以下【课堂观察报告】,请你按照【教学目标与内容编排、教学策略与课堂组织、学生参与和学习体验、知识建构和能力培养、课堂氛围与师生关系、教学评价与反馈改进】这六个维度进行分析、总结,并按指定格式输出内容。
  508. 1. 教学目标与内容编排:评估教学目标的明确性、内容的科学性、系统性和前沿性,内容与学生实际生活的联系,以及教学活动、资源的合理编排。
  509. 2. 教学策略与课堂组织:分析教师采用的教学模式、教学方法和策略,组织管理能力,师生互动方式,多媒体技术运用,以及教学设计实施的效果。
  510. 3. 学生参与和学习体验:关注学生在课堂上的参与度、参与深度,包括回答问题、提出疑问、讨论互动、动手实践、探究性学习等,以及学习体验的积极性。
  511. 4. 知识建构和能力培养:分析学生对知识的理解深度,知识内化、迁移应用,参与高阶思维活动的情况,以及培养批判性思维、创新能力、问题解决能力等核心素养的效果。
  512. 5. 课堂氛围与师生关系:包括课堂氛围、师生关系、同伴互助、学习动机激发、心理安全感等软实力因素,以及对学生个体差异的关注和包容。
  513. 6. 教学评价与反馈改进:评估教师对学生学习效果的评价方式及时性,形成性评价、小测验、作业反馈等评价方式的运用,反馈质量对学习的促进作用,并根据评价结果持续改进教学。
  514. ## 输出
  515. ### 输出要求
  516. ### 输出格式
  517. [
  518. {
  519. "title":"教学目标与内容编排",
  520. "description":"评估教学目标的明确性、内容的科学性、系统性和前沿性,内容与学生实际生活的联系,以及教学活动、资源的合理编排。",
  521. "score":"满分10分,给出具体的分值。",
  522. "message": "给出具体的评分理由。使用3个完整的句子。",
  523. "basis":["基于【课堂观察报告】中每个模块的分析数据,提供对应的评分依据,也就是支持你结论的数据。列举出至少3个依据。"],
  524. },
  525. {
  526. "title": "教学策略与课堂组织",
  527. "description":"分析教师采用的教学模式、教学方法和策略,组织管理能力,师生互动方式,多媒体技术运用,以及教学设计实施的效果。",
  528. "score":"满分10分,给出具体的分值。",
  529. "message":"给出具体的评分理由。使用3个完整的句子。",
  530. "basis":["基于【课堂观察报告】中每个模块的分析数据,提供对应的评分依据,也就是支持你结论的数据。列举出至少3个依据。使用"],
  531. },
  532. {
  533. "title": "学生参与和学习体验",
  534. "description":"关注学生在课堂上的参与度、参与深度,包括回答问题、提出疑问、讨论互动、动手实践、探究性学习等,以及学习体验的积极性。",
  535. "score":"满分10分,给出具体的分值。",
  536. "message":"给出具体的评分理由。使用3个完整的句子。",
  537. "basis":["基于【课堂观察报告】中每个模块的分析数据,提供对应的评分依据,也就是支持你结论的数据。列举出至少3个依据。使用"],
  538. },
  539. {
  540. "title": "知识建构和能力培养",
  541. "description":"分析学生对知识的理解深度,知识内化、迁移应用,参与高阶思维活动的情况,以及培养批判性思维、创新能力、问题解决能力等核心素养的效果。",
  542. "score":"满分10分,给出具体的分值。",
  543. "message":"给出具体的评分理由。使用3个完整的句子。",
  544. "basis":["基于【课堂观察报告】中每个模块的分析数据,提供对应的评分依据,也就是支持你结论的数据。列举出至少3个依据。使用"],
  545. },
  546. {
  547. "title": "课堂氛围与师生关系",
  548. "description":"包括课堂氛围、师生关系、同伴互助、学习动机激发、心理安全感等软实力因素,以及对学生个体差异的关注和包容。",
  549. "score":"满分10分,给出具体的分值。",
  550. "message":"给出具体的评分理由。使用3个完整的句子。",
  551. "basis":["基于【课堂观察报告】中每个模块的分析数据,提供对应的评分依据,也就是支持你结论的数据。列举出至少3个依据。使用"],
  552. },
  553. {
  554. "title": "教学评价与反馈改进",
  555. "description":"评估教师对学生学习效果的评价方式及时性,形成性评价、小测验、作业反馈等评价方式的运用,反馈质量对学习的促进作用,并根据评价结果持续改进教学。",
  556. "score":"满分10分,给出具体的分值。",
  557. "message":"给出具体的评分理由。使用3个完整的句子。",
  558. "basis":["基于【课堂观察报告】中每个模块的分析数据,提供对应的评分依据,也就是支持你结论的数据。列举出至少3个依据。使用"],
  559. },
  560. ]
  561. ## 教师课堂观察报告
  562. ### 1. 教学目标与内容编排
  563. > 评估教学目标的明确性、内容的科学性、系统性和前沿性,内容与学生实际生活的联系,以及教学活动、资源的合理编排。
  564. 评分:{满分10分,给出具体的分值。}
  565. 结论:{给出具体的评分理由。使用3个完整的句子。}
  566. 依据:{基于【课堂观察报告】中每个模块的分析数据,提供对应的评分依据,也就是支持你结论的数据。列举出至少3个依据。}
  567. ### 2. 教学策略与课堂组织
  568. > 分析教师采用的教学模式、教学方法和策略,组织管理能力,师生互动方式,多媒体技术运用,以及教学设计实施的效果。
  569. 评分:
  570. 结论:
  571. 依据:
  572. ### 3.
  573. ### 4.
  574. ### 5.
  575. ### 6.
  576. ## 数据
  577. ${_workText}
  578. ### 课堂实录文稿
  579. ${this.editorBarData.type == 0 ? this.editorBarData.content : ""}`;
  580. const _uuid = uuidv4();
  581. let params = {
  582. model: "gpt-3.5-turbo",
  583. temperature: 0,
  584. max_tokens: 4096,
  585. top_p: 1,
  586. frequency_penalty: 0,
  587. presence_penalty: 0,
  588. messages: [{ role: "user", content: _msg }],
  589. uid: _uuid,
  590. mind_map_question: "",
  591. stream: false,
  592. };
  593. this.ajax
  594. .post("https://gpt4.cocorobo.cn/chat", params)
  595. .then((res) => {
  596. let _data = res.data.FunctionResponse.choices[0];
  597. let _jsonData = _data.message.content;
  598. _jsonData = _jsonData
  599. .replaceAll("```json", "")
  600. .replaceAll("```", "");
  601. let _result = JSON.parse(_jsonData);
  602. this.teacherData = _result;
  603. resolve();
  604. })
  605. .catch((e) => {
  606. console.log(e);
  607. this.$message.error("生成教师观察结果失败");
  608. })
  609. .finally((_) => {
  610. this.teacherLoading = false;
  611. });
  612. });
  613. },
  614. //获取观察数据
  615. getClassroomObservationData() {
  616. return new Promise((resolve, reject) => {
  617. let params = {
  618. tid: this.tid,
  619. };
  620. this.loading = true;
  621. this.ajax
  622. .post("https://gpt4.cocorobo.cn/get_classroom_ob_tid", params)
  623. .then((res) => {
  624. let _data = res.data.FunctionResponse.result;
  625. let _result = JSON.parse(_data);
  626. this.classroomObservationData = _result;
  627. resolve();
  628. });
  629. });
  630. },
  631. // 获取AI观察结果
  632. getAiResultData() {
  633. return new Promise((resolve, reject) => {
  634. if (this.aiLoading || this.loading) return;
  635. if (!this.classroomObservationData.length > 0){
  636. return this.getClassroomObservationData().then(_=>{
  637. this.getAiResultData().then(_=>{
  638. resolve();
  639. });
  640. })
  641. };
  642. this.aiLoading = true;
  643. this.aiData = [];
  644. let _workText = ``; //转换的提示词
  645. let _sum = 0;
  646. this.classroomObservationData.forEach(i=>{
  647. if([0,1,2].includes(i.Type)){
  648. let _jsonObj = JSON.parse(i.jsonData);
  649. if(!_jsonObj.courseName){
  650. if(_jsonObj.name!=="课堂记录"){
  651. _workText+=`名称:${_jsonObj.name}\n分析内容:${_jsonObj.content}\n\n`
  652. }
  653. }
  654. }
  655. })
  656. let _msg = `
  657. NOTICE
  658. Language: Please use the same language as the user requirement, if the user speaks Chinese, the specific text of your answer should also be in Chinese.
  659. ## 任务
  660. 你是专业的教育评估专家,熟悉教学评估的六个维度,了解如何从课堂观察报告中提取关键信息,并进行深入分析。
  661. 请你基于以下【课堂观察报告】,请你按照【教学目标与内容编排、教学策略与课堂组织、学生参与和学习体验、知识建构和能力培养、课堂氛围与师生关系、教学评价与反馈改进】这六个维度进行分析、总结,并按指定格式输出内容。
  662. 1. 教学目标与内容编排:评估教学目标的明确性、内容的科学性、系统性和前沿性,内容与学生实际生活的联系,以及教学活动、资源的合理编排。
  663. 2. 教学策略与课堂组织:分析教师采用的教学模式、教学方法和策略,组织管理能力,师生互动方式,多媒体技术运用,以及教学设计实施的效果。
  664. 3. 学生参与和学习体验:关注学生在课堂上的参与度、参与深度,包括回答问题、提出疑问、讨论互动、动手实践、探究性学习等,以及学习体验的积极性。
  665. 4. 知识建构和能力培养:分析学生对知识的理解深度,知识内化、迁移应用,参与高阶思维活动的情况,以及培养批判性思维、创新能力、问题解决能力等核心素养的效果。
  666. 5. 课堂氛围与师生关系:包括课堂氛围、师生关系、同伴互助、学习动机激发、心理安全感等软实力因素,以及对学生个体差异的关注和包容。
  667. 6. 教学评价与反馈改进:评估教师对学生学习效果的评价方式及时性,形成性评价、小测验、作业反馈等评价方式的运用,反馈质量对学习的促进作用,并根据评价结果持续改进教学。
  668. ## 输出
  669. ### 输出要求
  670. ### 输出格式
  671. [
  672. {
  673. "title":"教学目标与内容编排",
  674. "description":"评估教学目标的明确性、内容的科学性、系统性和前沿性,内容与学生实际生活的联系,以及教学活动、资源的合理编排。",
  675. "score":"满分10分,给出具体的分值。",
  676. "message": "给出具体的评分理由。使用3个完整的句子。",
  677. "basis":["基于【课堂观察报告】中每个模块的分析数据,提供对应的评分依据,也就是支持你结论的数据。列举出至少3个依据。"],
  678. },
  679. {
  680. "title": "教学策略与课堂组织",
  681. "description":"分析教师采用的教学模式、教学方法和策略,组织管理能力,师生互动方式,多媒体技术运用,以及教学设计实施的效果。",
  682. "score":"满分10分,给出具体的分值。",
  683. "message":"给出具体的评分理由。使用3个完整的句子。",
  684. "basis":["基于【课堂观察报告】中每个模块的分析数据,提供对应的评分依据,也就是支持你结论的数据。列举出至少3个依据。使用"],
  685. },
  686. {
  687. "title": "学生参与和学习体验",
  688. "description":"关注学生在课堂上的参与度、参与深度,包括回答问题、提出疑问、讨论互动、动手实践、探究性学习等,以及学习体验的积极性。",
  689. "score":"满分10分,给出具体的分值。",
  690. "message":"给出具体的评分理由。使用3个完整的句子。",
  691. "basis":["基于【课堂观察报告】中每个模块的分析数据,提供对应的评分依据,也就是支持你结论的数据。列举出至少3个依据。使用"],
  692. },
  693. {
  694. "title": "知识建构和能力培养",
  695. "description":"分析学生对知识的理解深度,知识内化、迁移应用,参与高阶思维活动的情况,以及培养批判性思维、创新能力、问题解决能力等核心素养的效果。",
  696. "score":"满分10分,给出具体的分值。",
  697. "message":"给出具体的评分理由。使用3个完整的句子。",
  698. "basis":["基于【课堂观察报告】中每个模块的分析数据,提供对应的评分依据,也就是支持你结论的数据。列举出至少3个依据。使用"],
  699. },
  700. {
  701. "title": "课堂氛围与师生关系",
  702. "description":"包括课堂氛围、师生关系、同伴互助、学习动机激发、心理安全感等软实力因素,以及对学生个体差异的关注和包容。",
  703. "score":"满分10分,给出具体的分值。",
  704. "message":"给出具体的评分理由。使用3个完整的句子。",
  705. "basis":["基于【课堂观察报告】中每个模块的分析数据,提供对应的评分依据,也就是支持你结论的数据。列举出至少3个依据。使用"],
  706. },
  707. {
  708. "title": "教学评价与反馈改进",
  709. "description":"评估教师对学生学习效果的评价方式及时性,形成性评价、小测验、作业反馈等评价方式的运用,反馈质量对学习的促进作用,并根据评价结果持续改进教学。",
  710. "score":"满分10分,给出具体的分值。",
  711. "message":"给出具体的评分理由。使用3个完整的句子。",
  712. "basis":["基于【课堂观察报告】中每个模块的分析数据,提供对应的评分依据,也就是支持你结论的数据。列举出至少3个依据。使用"],
  713. },
  714. ]
  715. ## AI课堂观察报告
  716. ### 1. 教学目标与内容编排
  717. > 评估教学目标的明确性、内容的科学性、系统性和前沿性,内容与学生实际生活的联系,以及教学活动、资源的合理编排。
  718. 评分:{满分10分,给出具体的分值。}
  719. 结论:{给出具体的评分理由。使用3个完整的句子。}
  720. 依据:{基于【课堂观察报告】中每个模块的分析数据,提供对应的评分依据,也就是支持你结论的数据。需要指出具体是哪一个模型以及该模型对应的内容。列举出至少3个依据。}
  721. ### 2. 教学策略与课堂组织
  722. > 分析教师采用的教学模式、教学方法和策略,组织管理能力,师生互动方式,多媒体技术运用,以及教学设计实施的效果。
  723. 评分:
  724. 结论:
  725. 依据:
  726. ### 3.
  727. ### 4.
  728. ### 5.
  729. ### 6.
  730. ## 数据
  731. ${_workText}
  732. ### 课堂实录文稿
  733. ${this.editorBarData.type == 0 ? this.editorBarData.content : ""}`;
  734. const _uuid = uuidv4();
  735. let params = {
  736. model: "gpt-3.5-turbo",
  737. temperature: 0,
  738. max_tokens: 4096,
  739. top_p: 1,
  740. frequency_penalty: 0,
  741. presence_penalty: 0,
  742. messages: [{ role: "user", content: _msg }],
  743. uid: _uuid,
  744. mind_map_question: "",
  745. stream: false,
  746. };
  747. this.ajax
  748. .post("https://gpt4.cocorobo.cn/chat", params)
  749. .then((res) => {
  750. let _data = res.data.FunctionResponse.choices[0];
  751. let _jsonData = _data.message.content;
  752. _jsonData = _jsonData
  753. .replaceAll("```json", "")
  754. .replaceAll("```", "");
  755. let _result = JSON.parse(_jsonData);
  756. this.aiData = _result;
  757. resolve();
  758. })
  759. .catch((e) => {
  760. console.log(e);
  761. this.$message.error("生成ai观察结果失败");
  762. })
  763. .finally((_) => {
  764. this.aiLoading = false;
  765. });
  766. });
  767. },
  768. // 获取对比观察
  769. getContrastResultData() {
  770. return new Promise((resolve, reject) => {
  771. if (this.contrastLoading || this.loading) return;
  772. if (!this.teacherData.length > 0) {
  773. return this.$message.error("缺少教师观察结果");
  774. } else if (!this.aiData.length > 0) {
  775. return this.$message.error("缺少ai观察结果");
  776. }
  777. this.contrastLoading = true;
  778. this.contrastData = [];
  779. let _teacherWorkText = ``; //教师观察转换的提示词
  780. let _aiWorkText = ``; //ai观察转换的提示词
  781. // 转换教师观察结果数据
  782. this.teacherData.forEach((i) => {
  783. _teacherWorkText += `
  784. 标题:${i.title}
  785. 描述:${i.description}
  786. 评分:${i.score}
  787. 结论:${i.message}
  788. 依据:${i.basis.join("、")}\n
  789. `;
  790. });
  791. //转换ai观察结果数据
  792. this.aiData.forEach((i) => {
  793. _aiWorkText += `
  794. 标题:${i.title}
  795. 描述:${i.description}
  796. 评分:${i.score}
  797. 结论:${i.message}
  798. 依据:${i.basis.join("、")}\n
  799. `;
  800. });
  801. let _msg = `
  802. NOTICE
  803. Language: Please use the same language as the user requirement, if the user speaks Chinese, the specific text of your answer should also be in Chinese.
  804. ## 任务
  805. 你是专业的教育评估专家,熟悉教学评估的六个维度,了解如何从课堂观察报告中提取关键信息,并进行深入分析。
  806. 以下是两份不同的【课堂观察报告】,两个包含均从这六个维度对课堂进行分析,【教学目标与内容编排、教学策略与课堂组织、学生参与和学习体验、知识建构和能力培养、课堂氛围与师生关系、教学评价与反馈改进】这六个维度。请你对两个报告的内容从六个不同维度进行对比分析。
  807. 1. 教学目标与内容编排:评估教学目标的明确性、内容的科学性、系统性和前沿性,内容与学生实际生活的联系,以及教学活动、资源的合理编排。
  808. 2. 教学策略与课堂组织:分析教师采用的教学模式、教学方法和策略,组织管理能力,师生互动方式,多媒体技术运用,以及教学设计实施的效果。
  809. 3. 学生参与和学习体验:关注学生在课堂上的参与度、参与深度,包括回答问题、提出疑问、讨论互动、动手实践、探究性学习等,以及学习体验的积极性。
  810. 4. 知识建构和能力培养:分析学生对知识的理解深度,知识内化、迁移应用,参与高阶思维活动的情况,以及培养批判性思维、创新能力、问题解决能力等核心素养的效果。
  811. 5. 课堂氛围与师生关系:包括课堂氛围、师生关系、同伴互助、学习动机激发、心理安全感等软实力因素,以及对学生个体差异的关注和包容。
  812. 6. 教学评价与反馈改进:评估教师对学生学习效果的评价方式及时性,形成性评价、小测验、作业反馈等评价方式的运用,反馈质量对学习的促进作用,并根据评价结果持续改进教学。
  813. ## 输出
  814. ### 输出要求
  815. ### 输出格式
  816. [
  817. {
  818. "title":"教学目标与内容编排",
  819. "description":"评估教学目标的明确性、内容的科学性、系统性和前沿性,内容与学生实际生活的联系,以及教学活动、资源的合理编排。",
  820. "similarity":"使用3句完整的话进行描述",
  821. "difference": "使用3句完整的话进行描述"
  822. },
  823. {
  824. "title": "教学策略与课堂组织",
  825. "description":"分析教师采用的教学模式、教学方法和策略,组织管理能力,师生互动方式,多媒体技术运用,以及教学设计实施的效果。",
  826. "similarity":"使用3句完整的话进行描述",
  827. "difference": "使用3句完整的话进行描述"
  828. },
  829. {
  830. "title": "学生参与和学习体验",
  831. "description":"关注学生在课堂上的参与度、参与深度,包括回答问题、提出疑问、讨论互动、动手实践、探究性学习等,以及学习体验的积极性。",
  832. "similarity":"使用3句完整的话进行描述(最好是数组)",
  833. "similarity":"使用3句完整的话进行描述",
  834. "difference": "使用3句完整的话进行描述"
  835. },
  836. {
  837. "title": "知识建构和能力培养",
  838. "description":"分析学生对知识的理解深度,知识内化、迁移应用,参与高阶思维活动的情况,以及培养批判性思维、创新能力、问题解决能力等核心素养的效果。",
  839. "similarity":"使用3句完整的话进行描述",
  840. "difference": "使用3句完整的话进行描述"
  841. },
  842. {
  843. "title": "课堂氛围与师生关系",
  844. "description":"包括课堂氛围、师生关系、同伴互助、学习动机激发、心理安全感等软实力因素,以及对学生个体差异的关注和包容。",
  845. "similarity":"使用3句完整的话进行描述",
  846. "difference": "使用3句完整的话进行描述"
  847. },
  848. {
  849. "title": "教学评价与反馈改进",
  850. "description":"评估教师对学生学习效果的评价方式及时性,形成性评价、小测验、作业反馈等评价方式的运用,反馈质量对学习的促进作用,并根据评价结果持续改进教学。",
  851. "similarity":"使用3句完整的话进行描述",
  852. "difference": "使用3句完整的话进行描述"
  853. }
  854. ]
  855. ### 1. 教学目标与内容编排
  856. > 评估教学目标的明确性、内容的科学性、系统性和前沿性,内容与学生实际生活的联系,以及教学活动、资源的合理编排。
  857. 相同点:{使用3句完整的话进行描述}
  858. 不同点:{使用3句完整的话进行描述}
  859. ### 2. 教学策略与课堂组织
  860. > 分析教师采用的教学模式、教学方法和策略,组织管理能力,师生互动方式,多媒体技术运用,以及教学设计实施的效果。
  861. ### 3.
  862. ### 4.
  863. ### 5.
  864. ### 6.
  865. ## 数据
  866. ### 教师课堂观察报告
  867. ${_teacherWorkText}
  868. ### AI课堂观察报告
  869. ${_aiWorkText}
  870. `;
  871. // this.contrastLoading = false;
  872. // console.log("对比观察提示词👇👇")
  873. // console.log(_msg)
  874. // return;
  875. const _uuid = uuidv4();
  876. let params = {
  877. model: "gpt-3.5-turbo",
  878. temperature: 0,
  879. max_tokens: 4096,
  880. top_p: 1,
  881. frequency_penalty: 0,
  882. presence_penalty: 0,
  883. messages: [{ role: "user", content: _msg }],
  884. uid: _uuid,
  885. mind_map_question: "",
  886. stream: false,
  887. };
  888. this.ajax
  889. .post("https://gpt4.cocorobo.cn/chat", params)
  890. .then((res) => {
  891. let _data = res.data.FunctionResponse.choices[0];
  892. let _jsonData = _data.message.content;
  893. _jsonData = _jsonData
  894. .replaceAll("```json", "")
  895. .replaceAll("```", "");
  896. let _result = JSON.parse(_jsonData);
  897. this.contrastData = _result;
  898. })
  899. .catch((e) => {
  900. console.log(e);
  901. this.$message.error("生成ai观察结果失败");
  902. })
  903. .finally((_) => {
  904. this.contrastLoading = false;
  905. });
  906. });
  907. },
  908. // 获取总数据对比
  909. getAggregateResultData() {
  910. return new Promise((resolve, reject) => {
  911. if (!this.aiData.length > 0) {
  912. return this.$message.info("请先获取ai观察结果");
  913. } else if (!this.teacherData.length > 0) {
  914. return this.$message.error("请先获取教师观察结果");
  915. }
  916. this.aggregateLoading = true;
  917. this.aggregateData.message = "";
  918. let _teacherWorkText = ``; //教师观察转换的提示词
  919. let _aiWorkText = ``; //ai观察转换的提示词
  920. // 转换教师观察结果数据
  921. this.teacherData.forEach((i) => {
  922. _teacherWorkText += `
  923. 标题:${i.title}
  924. 描述:${i.description}
  925. 评分:${i.score}
  926. 结论:${i.message}
  927. 依据:${i.basis.join("、")}\n
  928. `;
  929. });
  930. //转换ai观察结果数据
  931. this.aiData.forEach((i) => {
  932. _aiWorkText += `
  933. 标题:${i.title}
  934. 描述:${i.description}
  935. 评分:${i.score}
  936. 结论:${i.message}
  937. 依据:${i.basis.join("、")}\n
  938. `;
  939. });
  940. let _msg = `
  941. NOTICE
  942. Language: Please use the same language as the user requirement, if the user speaks Chinese, the specific text of your answer should also be in Chinese.
  943. ## 任务
  944. 你是专业的教育评估专家,熟悉教学评估的六个维度,了解如何从课堂观察报告中提取关键信息,并进行深入分析。
  945. 以下是两份不同的【课堂观察报告】,两个包含均从这六个维度对课堂进行分析,【教学目标与内容编排、教学策略与课堂组织、学生参与和学习体验、知识建构和能力培养、课堂氛围与师生关系、教学评价与反馈改进】这六个维度。请你对两个报告的内容进行对比分析,指出其中的相同点和不同点。仅仅输出一段完整的小论文进行介绍,使用不超过10句完整的话,需适当指出各自的得分情况。
  946. 1. 教学目标与内容编排:评估教学目标的明确性、内容的科学性、系统性和前沿性,内容与学生实际生活的联系,以及教学活动、资源的合理编排。
  947. 2. 教学策略与课堂组织:分析教师采用的教学模式、教学方法和策略,组织管理能力,师生互动方式,多媒体技术运用,以及教学设计实施的效果。
  948. 3. 学生参与和学习体验:关注学生在课堂上的参与度、参与深度,包括回答问题、提出疑问、讨论互动、动手实践、探究性学习等,以及学习体验的积极性。
  949. 4. 知识建构和能力培养:分析学生对知识的理解深度,知识内化、迁移应用,参与高阶思维活动的情况,以及培养批判性思维、创新能力、问题解决能力等核心素养的效果。
  950. 5. 课堂氛围与师生关系:包括课堂氛围、师生关系、同伴互助、学习动机激发、心理安全感等软实力因素,以及对学生个体差异的关注和包容。
  951. 6. 教学评价与反馈改进:评估教师对学生学习效果的评价方式及时性,形成性评价、小测验、作业反馈等评价方式的运用,反馈质量对学习的促进作用,并根据评价结果持续改进教学。
  952. ## 输出
  953. ### 输出要求
  954. ### 输出格式
  955. {仅仅输出一段完整的小论文进行介绍,使用不超过10句完整的话,需适当指出各自的得分情况。最好是字符串}
  956. ## 数据
  957. ### 教师课堂观察报告
  958. ${_teacherWorkText}
  959. ### AI课堂观察报告
  960. ${_aiWorkText}
  961. `;
  962. // console.log("总数居对比");
  963. // console.log(_msg)
  964. // return this.aggregateLoading = false;
  965. const _uuid = uuidv4();
  966. let params = {
  967. model: "gpt-3.5-turbo",
  968. temperature: 0,
  969. max_tokens: 4096,
  970. top_p: 1,
  971. frequency_penalty: 0,
  972. presence_penalty: 0,
  973. messages: [{ role: "user", content: _msg }],
  974. uid: _uuid,
  975. mind_map_question: "",
  976. stream: false,
  977. };
  978. this.ajax
  979. .post("https://gpt4.cocorobo.cn/chat", params)
  980. .then((res) => {
  981. let _data = res.data.FunctionResponse.choices[0];
  982. let _result = _data.message.content;
  983. this.aggregateData.message = _result;
  984. // let _jsonData = _data.message.content;
  985. // _jsonData = _jsonData.replaceAll("```json", "").replaceAll("```", "");
  986. // let _result = JSON.parse(_jsonData);
  987. // this.aiData = _result;
  988. })
  989. .catch((e) => {
  990. console.log(e);
  991. this.$message.error("生成总结数据对比");
  992. })
  993. .finally((_) => {
  994. this.aggregateLoading = false;
  995. });
  996. });
  997. },
  998. // 计算总数据对比里的雷达图
  999. getAggregateChartData() {
  1000. if (!this.aiData.length > 0) {
  1001. return this.$message.info("请先获取ai观察结果");
  1002. } else if (!this.teacherData.length > 0) {
  1003. return this.$message.error("请先获取教师观察结果");
  1004. }
  1005. let _teacherData = {
  1006. value: [],
  1007. name: "教师观察结果",
  1008. };
  1009. let _aiData = {
  1010. value: [],
  1011. name: "AI的观察结果",
  1012. };
  1013. let _chartData = JSON.parse(JSON.stringify(this.aggregateData.chartData));
  1014. let _titleList = {
  1015. 教学目标与内容编排: 0,
  1016. 教学策略与课堂组织: 1,
  1017. 学生参与和学习体验: 2,
  1018. 知识建构和能力培养: 3,
  1019. 课堂氛围与师生关系: 4,
  1020. 教学评价与反馈改进: 5,
  1021. };
  1022. this.teacherData.forEach((i) => {
  1023. if (i.title in _titleList) {
  1024. let _scoreStr = i.score;
  1025. _scoreStr=parseInt(_scoreStr.replaceAll('分',''))
  1026. _teacherData.value[_titleList[i.title]] = parseInt(_scoreStr);
  1027. }
  1028. });
  1029. this.aiData.forEach((i) => {
  1030. if (i.title in _titleList) {
  1031. let _scoreStr = i.score;
  1032. _scoreStr=parseInt(_scoreStr.replaceAll('分',''))
  1033. _aiData.value[_titleList[i.title]] = parseInt(_scoreStr);
  1034. }
  1035. });
  1036. _chartData.series[0].data = [_aiData, _teacherData];
  1037. this.aggregateData.chartData = _chartData;
  1038. },
  1039. //获取
  1040. getData() {
  1041. // 获取观察所绑定的表单
  1042. this.getBindTestId().then((_) => {
  1043. // 后去表单的数据
  1044. this.getBindTestData().then((_) => {
  1045. Promise.all([
  1046. this.getTeacherResultData(),
  1047. this.getAiResultData(),
  1048. ]).then((_) => {
  1049. this.getAggregateChartData();
  1050. this.getContrastResultData();
  1051. this.getAggregateResultData();
  1052. });
  1053. });
  1054. });
  1055. },
  1056. },
  1057. mounted() {
  1058. this.getData();
  1059. },
  1060. };
  1061. </script>
  1062. <style scoped>
  1063. .contrastObservation {
  1064. min-width: 1500px;
  1065. /* min-height: 800px; */
  1066. width: 100%;
  1067. height: 100vh;
  1068. display: flex;
  1069. background-color: #f0f2f5;
  1070. box-sizing: border-box;
  1071. padding: 30px 20px;
  1072. background-image: #d4d8f6;
  1073. display: flex;
  1074. justify-content: space-around;
  1075. align-items: center;
  1076. position: relative;
  1077. }
  1078. .refresh {
  1079. position: fixed;
  1080. right: 0;
  1081. top: 40px;
  1082. width: 60px;
  1083. height: 60px;
  1084. background-color: #fff;
  1085. border-radius: 12px 0px 0px 12px;
  1086. display: flex;
  1087. justify-content: center;
  1088. align-items: center;
  1089. box-shadow: 0 16px 24px 2px #0000000a;
  1090. cursor: pointer;
  1091. }
  1092. .refreshDisabled{
  1093. cursor: not-allowed;
  1094. }
  1095. .co_card_area {
  1096. width: 100%;
  1097. height: 100%;
  1098. display: flex;
  1099. justify-content: space-around;
  1100. align-items: center;
  1101. }
  1102. .co_card {
  1103. min-width: 24%;
  1104. max-width: 24%;
  1105. width: 23%;
  1106. height: 100%;
  1107. box-sizing: border-box;
  1108. border-radius: 12px;
  1109. background-color: #fff;
  1110. box-sizing: border-box;
  1111. padding: 20px;
  1112. position: relative;
  1113. overflow: hidden;
  1114. }
  1115. .co_aggregateData {
  1116. background-color: #fbfcfe;
  1117. display: flex;
  1118. flex-direction: column;
  1119. justify-content: space-between;
  1120. }
  1121. .co_ad_title {
  1122. height: 35px;
  1123. font-size: 22px;
  1124. color: #434e69;
  1125. font-weight: 600;
  1126. display: flex;
  1127. align-items: center;
  1128. margin-bottom: 20px;
  1129. }
  1130. .co_ad_title > img {
  1131. width: 25px;
  1132. height: 25px;
  1133. margin-right: 10px;
  1134. }
  1135. .co_ad_chartArea {
  1136. width: 100%;
  1137. height: 45%;
  1138. max-height: 45%;
  1139. margin-bottom: 20px;
  1140. }
  1141. .co_ad_messageArea {
  1142. width: 100%;
  1143. height: calc(100% - 35px - 45% - 40px);
  1144. background-color: #eef2fc;
  1145. box-sizing: border-box;
  1146. padding: 20px;
  1147. overflow-y: auto;
  1148. border: solid 1px #e0eafb;
  1149. border-radius: 6px;
  1150. white-space: pre-line;
  1151. font-size: 18px;
  1152. }
  1153. .co_ai_card {
  1154. padding: 8px 0 0 0;
  1155. background: linear-gradient(to right, #3673e8, #ad88fd);
  1156. /* background: linear-gradient(#f4eefd, #fff, #fff, #fff, #fff, #fff); */
  1157. /* height: calc(100% - 10px); */
  1158. }
  1159. .co_ai_card > .co_c_main {
  1160. background: linear-gradient(#f4eefd, #fff, #fff, #fff, #fff, #fff);
  1161. }
  1162. .co_teacher_card {
  1163. padding: 8px 0 0 0;
  1164. background: linear-gradient(to right, #3673e8, #88fdc5);
  1165. /* background: linear-gradient(#f5fffa, #fff, #fff, #fff, #fff, #fff); */
  1166. /* height: calc(100% - 10px); */
  1167. }
  1168. .co_teacher_card > .co_c_main {
  1169. background: linear-gradient(#f5fffa, #fff, #fff, #fff, #fff, #fff);
  1170. }
  1171. .co_contrast_card {
  1172. padding: 8px 0 0 0;
  1173. background: linear-gradient(to right, #fdcd72, #fd8888);
  1174. /* background: linear-gradient(#fffaee, #fff, #fff, #fff, #fff, #fff); */
  1175. /* height: calc(100% - 10px); */
  1176. }
  1177. .co_contrast_card > .co_c_main {
  1178. background: linear-gradient(#fffaee, #fff, #fff, #fff, #fff, #fff);
  1179. }
  1180. .co_c_main {
  1181. width: calc(100%);
  1182. height: calc(100%);
  1183. padding: 20px;
  1184. box-sizing: border-box;
  1185. border-radius: 12px;
  1186. overflow-x: hidden;
  1187. }
  1188. .co_c_title {
  1189. width: calc(100% + 20px);
  1190. height: 80px;
  1191. display: flex;
  1192. justify-content: center;
  1193. align-items: center;
  1194. position: relative;
  1195. left: -20px;
  1196. top: -20px;
  1197. font-size: 24px;
  1198. box-sizing: border-box;
  1199. }
  1200. .co_c_m_message {
  1201. width: 100%;
  1202. height: auto;
  1203. margin-bottom: 20px;
  1204. }
  1205. .co_c_m_m_title {
  1206. width: 100%;
  1207. height: 50px;
  1208. display: flex;
  1209. align-items: center;
  1210. font-size: 22px;
  1211. font-weight: bold;
  1212. position: relative;
  1213. }
  1214. .co_c_m_m_title > span {
  1215. position: relative;
  1216. transition: 0.3s;
  1217. }
  1218. .co_c_m_m_title > span:hover {
  1219. color: #3681fc;
  1220. cursor: help;
  1221. }
  1222. .co_c_m_m_title > span::before {
  1223. content: "";
  1224. width: 100%;
  1225. height: 10px;
  1226. position: absolute;
  1227. bottom: 0;
  1228. left: 0;
  1229. opacity: 0.5;
  1230. }
  1231. .co_ai_title > span::before {
  1232. background: linear-gradient(to right, #3673e8, #ad88fd);
  1233. }
  1234. .co_teacher_title > span::before {
  1235. background: linear-gradient(to right, #3673e8, #88fdc5);
  1236. }
  1237. .co_contrast_title > span::before {
  1238. background: linear-gradient(to right, #fdcd72, #fd8888);
  1239. }
  1240. .message,
  1241. .score,
  1242. .basis {
  1243. font-size: 18px;
  1244. }
  1245. .basis > ol {
  1246. margin-left: 30px;
  1247. }
  1248. .compare > ol {
  1249. margin-left: 30px;
  1250. }
  1251. .similarity,
  1252. .difference,
  1253. .compare {
  1254. font-size: 18px;
  1255. margin-bottom: 10px;
  1256. }
  1257. .titleBlob {
  1258. font-weight: bold;
  1259. }
  1260. /* .compareTitle{
  1261. margin-left: 10px;
  1262. position: relative;
  1263. display: inline-block;
  1264. }
  1265. .compareTitle::after{
  1266. content: "";
  1267. width: 20px;
  1268. height: 20px;
  1269. position: relative;
  1270. } */
  1271. </style>