liveProjectDetail.vue 70 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423
  1. <template>
  2. <div
  3. style="
  4. background: rgb(230, 234, 240);
  5. width: 100%;
  6. margin: 0;
  7. position: relate;
  8. height: 100%;
  9. "
  10. >
  11. <div class="blackBottom">
  12. <div
  13. style="
  14. display: flex;
  15. flex-direction: row;
  16. flex-wrap: nowrap;
  17. align-items: stretch;
  18. padding-left: 10px;
  19. "
  20. >
  21. <div class="logoLive">
  22. <img src="../assets/icon/logo.png" alt />
  23. </div>
  24. <div style="color: #fff; line-height: 45px; padding-left: 15px">
  25. introduce a festival (Final)
  26. </div>
  27. </div>
  28. </div>
  29. <div class="isNoOther">
  30. <div
  31. class="imgMiddle"
  32. :class="isBlock > 0 ? 'imghalf' : 'imgMiddle'"
  33. v-show="!full"
  34. >
  35. <pdf
  36. :pdfUrl="pdfUrl"
  37. style="width: 100%; height: 100%"
  38. :ppage="ppage"
  39. @getPageTotal="getPageTotal"
  40. @getWidth="getWidth"
  41. ></pdf>
  42. <div
  43. class="workd_media"
  44. style="height: 100%"
  45. v-if="videoBlock == 6"
  46. :style="{ width: Vwidth }"
  47. >
  48. <video-player
  49. class="video-player vjs-custom-skin"
  50. :playsinline="true"
  51. :options="playerO[0]"
  52. ref="zVideo"
  53. @play="onPlayerPlay($event)"
  54. style="width: 100%; height: 100%"
  55. ></video-player>
  56. </div>
  57. <div class="video_wrapper" v-if="videoBlock == 6"></div>
  58. </div>
  59. <div
  60. style="
  61. background: #d0d6e4;
  62. width: 40%;
  63. height: 100%;
  64. max-width: 40%;
  65. overflow: auto;
  66. "
  67. :class="{ fullStyle: full }"
  68. v-if="isBlock > 0"
  69. >
  70. <div
  71. style="
  72. background: #fff;
  73. width: 96%;
  74. margin: 10px auto;
  75. height: 96%;
  76. position: relative;
  77. "
  78. >
  79. <div
  80. style="color: #bfbfbf; padding: 15px 0 15px 25px; font-size: 20px"
  81. v-if="isBlock == 3"
  82. >
  83. 课堂评价
  84. </div>
  85. <div
  86. style="color: #bfbfbf; padding: 15px 0 15px 25px; font-size: 20px"
  87. v-if="isBlock == 8"
  88. >
  89. 根据题目选择对应的答案
  90. </div>
  91. <div
  92. style="
  93. margin-left: 25px;
  94. border-bottom: 3px solid #2c83ee;
  95. width: 70px;
  96. padding-bottom: 3px;
  97. text-align: center;
  98. padding-top: 15px;
  99. "
  100. v-if="isBlock == 1"
  101. >
  102. 开始答题
  103. </div>
  104. <div class="answerBox" v-if="isBlock == 1">
  105. <div class="answerBox">
  106. <div
  107. style="
  108. display: flex;
  109. flex-direction: column;
  110. flex-wrap: wrap;
  111. align-items: center;
  112. justify-content: center;
  113. "
  114. v-for="item in 1"
  115. :key="item"
  116. >
  117. <div class="choose_style">
  118. <span
  119. @click="isChooseActive(1)"
  120. :class="typeC.indexOf(1) != -1 ? 'isChoose' : ''"
  121. v-if="
  122. tools[ppage - 1].choice && tools[ppage - 1].choice > 0
  123. "
  124. >A</span
  125. >
  126. <span
  127. @click="isChooseActive(2)"
  128. :class="typeC.indexOf(2) != -1 ? 'isChoose' : ''"
  129. v-if="
  130. tools[ppage - 1].choice && tools[ppage - 1].choice > 1
  131. "
  132. >B</span
  133. >
  134. <span
  135. @click="isChooseActive(3)"
  136. :class="typeC.indexOf(3) != -1 ? 'isChoose' : ''"
  137. v-if="
  138. tools[ppage - 1].choice && tools[ppage - 1].choice > 2
  139. "
  140. >C</span
  141. >
  142. <span
  143. @click="isChooseActive(4)"
  144. :class="typeC.indexOf(4) != -1 ? 'isChoose' : ''"
  145. v-if="
  146. tools[ppage - 1].choice && tools[ppage - 1].choice > 3
  147. "
  148. >D</span
  149. >
  150. </div>
  151. <el-button style="margin: 0 auto" @click="showMember(item)"
  152. >提交</el-button
  153. >
  154. </div>
  155. </div>
  156. </div>
  157. <div
  158. class="answerBox tools_box"
  159. v-if="isBlock == 4"
  160. style="padding: 10px 0 0 25px; width: 100%; max-width: 100%"
  161. >
  162. <div style="color: #d1d1d1; font-size: 24px">课堂实践</div>
  163. <div
  164. style="
  165. margin: 20px 0 20px 0;
  166. border-bottom: 4px solid #3e86f3;
  167. width: 75px;
  168. text-align: center;
  169. padding-bottom: 3px;
  170. "
  171. >
  172. 选择工具
  173. </div>
  174. <div
  175. style="
  176. display: flex;
  177. flex-direction: row;
  178. flex-wrap: wrap;
  179. width: 100%;
  180. justify-content: flex-start;
  181. align-items: center;
  182. "
  183. >
  184. <div
  185. v-if="
  186. tools[ppage - 1].tools &&
  187. tools[ppage - 1].tools.indexOf(1) != -1
  188. "
  189. @click="checkTools(1)"
  190. class="toolCss"
  191. >
  192. <div class="toolImg">
  193. <img src="../assets/icon/secondToolList/whiteBoard.png" alt />
  194. <div>电子白板</div>
  195. </div>
  196. </div>
  197. <div
  198. v-if="
  199. tools[ppage - 1].tools &&
  200. tools[ppage - 1].tools.indexOf(3) != -1
  201. "
  202. @click="checkTools(3)"
  203. class="toolCss"
  204. >
  205. <div class="toolImg">
  206. <img
  207. src="../assets/icon/secondToolList/mindMapping.png"
  208. alt
  209. />
  210. <div>思维导图</div>
  211. </div>
  212. </div>
  213. <div
  214. v-if="
  215. tools[ppage - 1].tools &&
  216. tools[ppage - 1].tools.indexOf(28) != -1
  217. "
  218. @click="checkTools(28)"
  219. class="toolCss"
  220. >
  221. <div class="toolImg">
  222. <img src="../assets/icon/thirdToolList/translation.png" alt />
  223. <div>翻译</div>
  224. </div>
  225. </div>
  226. <div
  227. v-if="
  228. tools[ppage - 1].tools &&
  229. tools[ppage - 1].tools.indexOf(4) != -1
  230. "
  231. @click="checkTools(4)"
  232. class="toolCss"
  233. >
  234. <div class="toolImg">
  235. <img src="../assets/icon/thirdToolList/ask.png" alt />
  236. <div>问卷调查</div>
  237. </div>
  238. </div>
  239. <div
  240. v-if="
  241. tools[ppage - 1].tools &&
  242. tools[ppage - 1].tools.indexOf(6) != -1
  243. "
  244. @click="checkTools(6)"
  245. class="toolCss"
  246. >
  247. <div class="toolImg">
  248. <img src="../assets/icon/secondToolList/doc.png" alt />
  249. <div>协同文档</div>
  250. </div>
  251. </div>
  252. <div
  253. v-if="
  254. tools[ppage - 1].tools &&
  255. tools[ppage - 1].tools.indexOf(7) != -1
  256. "
  257. @click="checkTools(7)"
  258. class="toolCss"
  259. >
  260. <div class="toolImg">
  261. <img
  262. src="../assets/icon/secondToolList/mindNetwork.png"
  263. alt
  264. />
  265. <div>思维网格</div>
  266. </div>
  267. </div>
  268. <div
  269. v-if="
  270. tools[ppage - 1].tools &&
  271. tools[ppage - 1].tools.indexOf(16) != -1
  272. "
  273. @click="addImg($event)"
  274. class="toolCss"
  275. >
  276. <div class="toolImg">
  277. <img src="../assets/icon/firstToolList/myMessage.png" alt />
  278. <div>
  279. 上传文件
  280. <input
  281. type="file"
  282. accept="image/png, image/gif, image/jpeg"
  283. style="display: none"
  284. @change="beforeUpload1($event, 1)"
  285. />
  286. </div>
  287. </div>
  288. </div>
  289. <div
  290. v-if="
  291. tools[ppage - 1].tools &&
  292. tools[ppage - 1].tools.indexOf(29) != -1
  293. "
  294. @click="addImg($event)"
  295. class="toolCss"
  296. >
  297. <div class="toolImg">
  298. <img src="../assets/icon/firstToolList/myMessage.png" alt />
  299. <div>
  300. 上传视频
  301. <input
  302. type="file"
  303. accept="video/mp4, video/quicktime, video/x-msvideo"
  304. style="display: none"
  305. @change="beforeUpload1($event, 2)"
  306. />
  307. </div>
  308. </div>
  309. </div>
  310. </div>
  311. </div>
  312. <div
  313. class="answerBox"
  314. style="height: 100%"
  315. v-if="isBlock == 2"
  316. ref="qrcodePicture"
  317. >
  318. <div style="height: 100%; width: 100%">
  319. <div v-if="toolCount == 1" class="tools_child_box">
  320. <div class="tools_title">
  321. <span>电子白板</span>
  322. <div>
  323. <img
  324. src="../assets/full.png"
  325. class="full"
  326. @click="fullTools"
  327. />
  328. </div>
  329. </div>
  330. <iframe
  331. webkitallowfullscreen
  332. mozallowfullscreen
  333. allowfullscreen
  334. style="width: 100%; height: 100%; border: none"
  335. src="https://iwb.cocorobo.cn/"
  336. ref="whiteBoard"
  337. ></iframe>
  338. </div>
  339. <div v-if="toolCount == 3" class="tools_child_box">
  340. <div class="tools_title">
  341. <span>思维导图</span>
  342. <div>
  343. <img
  344. src="../assets/full.png"
  345. class="full"
  346. @click="fullTools"
  347. />
  348. </div>
  349. </div>
  350. <iframe
  351. webkitallowfullscreen
  352. mozallowfullscreen
  353. allowfullscreen
  354. style="width: 100%; height: 100%; border: none"
  355. src="//cloud.cocorobo.cn/kityminder-editor/dist/index.html"
  356. ref="mind"
  357. ></iframe>
  358. </div>
  359. <div v-if="toolCount == 28" class="tools_child_box">
  360. <div class="tools_title">
  361. <span>翻译</span>
  362. <div>
  363. <img
  364. src="../assets/full.png"
  365. class="full"
  366. @click="fullTools"
  367. />
  368. </div>
  369. </div>
  370. <iframe
  371. webkitallowfullscreen
  372. mozallowfullscreen
  373. allowfullscreen
  374. style="width: 100%; height: 100%; border: none"
  375. src="//dict.youdao.com/"
  376. ref="mind"
  377. ></iframe>
  378. </div>
  379. <div v-if="toolCount == 6" class="tools_child_box">
  380. <div class="tools_title">
  381. <span>协同文档</span>
  382. <div>
  383. <img
  384. src="../assets/full.png"
  385. class="full"
  386. @click="fullTools"
  387. />
  388. </div>
  389. </div>
  390. <iframe
  391. webkitallowfullscreen
  392. mozallowfullscreen
  393. allowfullscreen
  394. style="width: 100%; height: 100%; border: none"
  395. src="https://cloud.cocorobo.cn/Office/Word/WordEditArea.htm"
  396. ></iframe>
  397. </div>
  398. <div v-if="toolCount == 7" class="tools_child_box">
  399. <div class="tools_title">
  400. <span>思维网格</span>
  401. <div>
  402. <img
  403. src="../assets/full.png"
  404. class="full"
  405. @click="fullTools"
  406. />
  407. </div>
  408. </div>
  409. <iframe
  410. webkitallowfullscreen
  411. mozallowfullscreen
  412. allowfullscreen
  413. style="width: 100%; height: 100%; border: none"
  414. src="https://pbl.cocorobo.cn/pbl-teacher-table/dist/#/Grid"
  415. ref="grid"
  416. ></iframe>
  417. </div>
  418. <div
  419. id="shishi_loading"
  420. style="
  421. width: 100%;
  422. height: 100%;
  423. background: #0000008f;
  424. position: absolute;
  425. top: 0;
  426. left: 0;
  427. z-index: 99999999999999;
  428. display: none;
  429. justify-content: center;
  430. align-items: center;
  431. "
  432. >
  433. <div
  434. style="
  435. color: #fff;
  436. padding: 15px;
  437. background: #00000070;
  438. border-radius: 5px;
  439. font-size: 18px;
  440. display: flex;
  441. align-items: center;
  442. "
  443. >
  444. <img
  445. src="https://pbl.cocorobo.cn/pbl-student-table/dist/js/loading.gif"
  446. alt
  447. style="width: 26px; margin-right: 10px"
  448. />
  449. <span>上传中...</span>
  450. </div>
  451. </div>
  452. <!-- <div class="nextStepBox">
  453. <div class="nextStepOne" @click="(isBlock = 4), (full = false)">
  454. 返回
  455. </div>
  456. </div> -->
  457. <div
  458. class="nextStepOne"
  459. style="float: right"
  460. @click="addJtWork(4)"
  461. v-if="toolCount == 1 || toolCount == 3 || toolCount == 7"
  462. >
  463. 截图
  464. </div>
  465. <!-- <div
  466. class="nextStepOne"
  467. style="float: right"
  468. @click="addImg($event)"
  469. v-if="toolCount == 1 || toolCount == 3 || toolCount == 7"
  470. >
  471. 上传文件
  472. <input
  473. type="file"
  474. accept="image/png, image/gif, image/jpeg"
  475. style="display: none"
  476. @change="beforeUpload1($event, 1)"
  477. />
  478. </div>-->
  479. </div>
  480. </div>
  481. <div
  482. class="answerBox"
  483. v-if="
  484. isBlock == 3 &&
  485. tools[ppage - 1].tools &&
  486. tools[ppage - 1].tools.indexOf(14) != -1
  487. "
  488. style="padding: 0 0 0 25px"
  489. >
  490. <div>
  491. <div
  492. class="score_box"
  493. v-for="(ra, raIndex) in tools[ppage - 1].rateArray"
  494. :key="raIndex"
  495. >
  496. <span>{{ ra }} </span>
  497. <el-rate v-model="rateList[raIndex]"></el-rate>
  498. </div>
  499. </div>
  500. <span
  501. slot="footer"
  502. class="dialog-footer sztFooter"
  503. style="
  504. padding: 0 0 30px 0px;
  505. position: absolute;
  506. right: 20px;
  507. bottom: 0;
  508. "
  509. >
  510. <!-- <el-button @click="isBlock = 0">取消</el-button> -->
  511. <el-button type="primary" @click="addWork(6)">确定</el-button>
  512. </span>
  513. </div>
  514. <div
  515. class="answerBox"
  516. v-if="
  517. isBlock == 8 &&
  518. tools[ppage - 1].tools &&
  519. tools[ppage - 1].tools.indexOf(27) != -1
  520. "
  521. style="padding: 0 0 0 25px"
  522. >
  523. <div>
  524. <div
  525. v-for="(tk, tIndex) in tools[ppage - 1].choice"
  526. :key="tIndex"
  527. class="tkCss"
  528. >
  529. <div style="margin-right: 10px; font-size: 18px">
  530. {{ tIndex + 1 }}、
  531. </div>
  532. <el-select v-model="tkAnswer[tIndex]" placeholder="请选择答案">
  533. <el-option
  534. v-for="(tkA, tkAIndex) in tools[ppage - 1].tkAnswerBox"
  535. :key="tkAIndex"
  536. :label="tkA"
  537. :value="tkA"
  538. ></el-option>
  539. </el-select>
  540. <span
  541. v-if="tiankongAnswer.length && isNoHomeWork"
  542. class="tiankongAnswer"
  543. :class="{
  544. tfalse: tiankongAnswer[tIndex] != tkAnswer[tIndex],
  545. }"
  546. >正确答案:{{ tiankongAnswer[tIndex] }}</span
  547. >
  548. </div>
  549. </div>
  550. <span
  551. slot="footer"
  552. class="dialog-footer sztFooter"
  553. style="
  554. padding: 0 0 30px 0px;
  555. position: absolute;
  556. right: 20px;
  557. bottom: 0;
  558. "
  559. >
  560. <!-- <el-button @click="isBlock = 0">取消</el-button> -->
  561. <el-button type="primary" @click="addWork(5)">提交</el-button>
  562. </span>
  563. </div>
  564. <div
  565. class="answerBox"
  566. v-if="isBlock == 5"
  567. style="padding: 10px 0 0 25px"
  568. >
  569. <div style="color: #d1d1d1; font-size: 24px">课堂实践</div>
  570. <div
  571. style="
  572. margin: 20px 0 20px 0;
  573. border-bottom: 4px solid #3e86f3;
  574. width: 75px;
  575. text-align: center;
  576. padding-bottom: 3px;
  577. "
  578. >
  579. 选择附件
  580. </div>
  581. <div
  582. style="
  583. display: flex;
  584. flex-direction: row;
  585. flex-wrap: wrap;
  586. width: 100%;
  587. justify-content: flex-start;
  588. align-items: center;
  589. "
  590. >
  591. <div
  592. v-if="tools[ppage - 1].file && tools[ppage - 1].file.length"
  593. class="fileBox"
  594. >
  595. <div
  596. class="fileListCss"
  597. v-for="(v, vIndex) in videoList"
  598. :key="vIndex"
  599. >
  600. <div class="fileCss" @click="playVideo(v.src, vIndex)">
  601. <img src="../assets/uploadMp4.png" alt />
  602. </div>
  603. <div>{{ v.name }}</div>
  604. </div>
  605. <div
  606. class="fileListCss"
  607. v-for="(f, fIndex) in fileList"
  608. :key="fIndex"
  609. >
  610. <div class="fileCss" @click="openFile(f.src)">
  611. <img src="../assets/file.png" alt />
  612. </div>
  613. <div>{{ f.name }}</div>
  614. </div>
  615. </div>
  616. </div>
  617. <!-- <div class="nextStepBox">
  618. <div class="nextStepOne" @click="isBlock = 0">关闭</div>
  619. </div>-->
  620. </div>
  621. <!-- <div class="answerBox" :class="{ fullStyle: full }" v-if="isBlock == 6">
  622. <div style="height: 70%; width: 100%">
  623. <div class="wheel">
  624. <div class="workd_media" style="height: 100%">
  625. <video-player
  626. class="video-player vjs-custom-skin"
  627. :playsinline="true"
  628. :options="playerO[0]"
  629. @play="onPlayerPlay($event)"
  630. style="width: 90%; height: 100%; margin: 0 0 0 30px"
  631. ></video-player>
  632. </div>
  633. </div>
  634. </div>
  635. </div>-->
  636. <div
  637. class="answerBox"
  638. style="height: 100%"
  639. :class="{ fullStyle: full }"
  640. v-if="isBlock == 7"
  641. >
  642. <div style="height: 70%; width: 100%">
  643. <div class="wheel" style="height: 520px; width: 100%">
  644. <iframe
  645. style="width: 100%; height: 100%; border: none"
  646. :src="pptImgUrl"
  647. ></iframe>
  648. </div>
  649. <div class="nextStepBox" style="margin-top: 5%">
  650. <div class="nextStepOne" @click="isBlock = 5">返回</div>
  651. </div>
  652. </div>
  653. </div>
  654. <div
  655. class="answerBox"
  656. :class="{ fullStyle: full }"
  657. v-if="isBlock == 9"
  658. >
  659. <div style="height: 70%; width: 100%">
  660. <div class="wheel">
  661. <div style="height: 100%">
  662. <audio
  663. style="margin: 0 auto; display: block"
  664. :src="audioUrl"
  665. controls="controls"
  666. ref="audio"
  667. >
  668. Your browser does not support the audio element.
  669. </audio>
  670. </div>
  671. </div>
  672. <!-- <div class="nextStepBox" style="margin-top: 5%">
  673. <div class="nextStepOne" @click="isBlock = 0">关闭</div>
  674. </div>-->
  675. </div>
  676. </div>
  677. <div
  678. class="answerBox"
  679. :class="{ fullStyle: full }"
  680. v-if="isBlock == 10"
  681. >
  682. <div style="height: 70%; width: 100%">
  683. <div class="wheel">
  684. <div style="height: 100%">
  685. <el-button type="primary" @click="startRecorder()">{{
  686. !isRecord ? "开始录音" : "结束录音"
  687. }}</el-button>
  688. <el-button type="primary" @click="playRecorder()">{{
  689. !isPlayerRecord ? "录音播放" : "停止播放"
  690. }}</el-button>
  691. <el-button type="primary" @click="getMp3Data()"
  692. >上传录音</el-button
  693. >
  694. <div
  695. style="
  696. margin: 10px auto 0;
  697. display: flex;
  698. align-items: center;
  699. "
  700. v-if="LuAudioUrl"
  701. >
  702. <span>已上传录音:</span>
  703. <audio :src="LuAudioUrl" controls="controls" ref="audio">
  704. Your browser does not support the audio element.
  705. </audio>
  706. </div>
  707. </div>
  708. </div>
  709. <!-- <div class="nextStepBox" style="margin-top: 5%">
  710. <div class="nextStepOne" @click="isBlock = 0">关闭</div>
  711. </div>-->
  712. </div>
  713. </div>
  714. </div>
  715. </div>
  716. </div>
  717. <div class="blackBottomB" v-if="false">
  718. <!-- <div
  719. class="nextStepOne"
  720. style="float: right"
  721. @click="addImg($event)"
  722. v-if="tools[ppage - 1].tools && tools[ppage - 1].tools.indexOf(16) != -1"
  723. >
  724. 上传文件
  725. <input
  726. type="file"
  727. accept="image/png, image/gif, image/jpeg"
  728. style="display: none"
  729. @change="beforeUpload1($event, 1)"
  730. />
  731. </div>
  732. <div
  733. class="nextStepOne"
  734. style="float: right"
  735. @click="addImg($event)"
  736. v-if="tools[ppage - 1].tools && tools[ppage - 1].tools.indexOf(29) != -1"
  737. >
  738. 上传视频
  739. <input
  740. type="file"
  741. accept="video/mp4, video/quicktime, video/x-msvideo"
  742. style="display: none"
  743. @change="beforeUpload1($event, 2)"
  744. />
  745. </div>-->
  746. </div>
  747. <div v-if="proVisible" class="mask">
  748. <div class="progressBox">
  749. <div class="lbox">
  750. <img src="../assets/loading.gif" />上传中,请稍后
  751. </div>
  752. <el-progress
  753. :text-inside="true"
  754. :stroke-width="20"
  755. :percentage="progress"
  756. style="width: 80%"
  757. ></el-progress>
  758. </div>
  759. </div>
  760. <el-dialog
  761. :visible.sync="dialogVisible"
  762. :append-to-body="true"
  763. width="500px"
  764. :before-close="handleClose"
  765. class="dialog_diy"
  766. >
  767. <div style="text-align: center; padding: 20px 0 50px 0; font-size: 18px">
  768. 提交成功
  769. </div>
  770. <div
  771. style="
  772. width: 200px;
  773. background: #4d8ae0;
  774. height: 35px;
  775. margin: 0 auto;
  776. text-align: center;
  777. line-height: 35px;
  778. color: #fff;
  779. border-radius: 5px;
  780. cursor: pointer;
  781. "
  782. @click="dialogVisible = false"
  783. >
  784. 确定
  785. </div>
  786. </el-dialog>
  787. <el-dialog
  788. :visible.sync="dialogVisiblePick"
  789. :append-to-body="true"
  790. width="500px"
  791. class="dialog_diy"
  792. :close-on-click-modal="false"
  793. >
  794. <div style="text-align: center; padding: 20px 0 50px 0; font-size: 18px">
  795. 你被老师点名起来回答了!!!
  796. </div>
  797. <div
  798. style="
  799. width: 200px;
  800. background: #4d8ae0;
  801. height: 35px;
  802. margin: 0 auto;
  803. text-align: center;
  804. line-height: 35px;
  805. color: #fff;
  806. border-radius: 5px;
  807. cursor: pointer;
  808. "
  809. @click="pick2"
  810. >
  811. 确定
  812. </div>
  813. </el-dialog>
  814. <div v-html="iframeInnerHtml" ref="iframeIh" class="iframeBox"></div>
  815. </div>
  816. </template>
  817. <script>
  818. import pdf from "./components/pdf";
  819. import html2canvas from "html2canvas";
  820. import Recorder from "js-audio-recorder";
  821. const lamejs = require("lamejs");
  822. const recorder = new Recorder({
  823. sampleBits: 16, // 采样位数,支持 8 或 16,默认是16
  824. sampleRate: 48000, // 采样率,支持 11025、16000、22050、24000、44100、48000,根据浏览器默认值,我的chrome是48000
  825. numChannels: 1, // 声道,支持 1 或 2, 默认是1
  826. // compiling: false,(0.x版本中生效,1.x增加中) // 是否边录边转换,默认是false
  827. });
  828. // 绑定事件-打印的是当前录音数据
  829. recorder.onprogress = function (params) {
  830. // console.log('--------------START---------------')
  831. // console.log('录音时长(秒)', params.duration);
  832. // console.log('录音大小(字节)', params.fileSize);
  833. // console.log('录音音量百分比(%)', params.vol);
  834. // console.log('当前录音的总数据([DataView, DataView...])', params.data);
  835. // console.log('--------------END---------------')
  836. };
  837. export default {
  838. components: {
  839. pdf,
  840. },
  841. data() {
  842. return {
  843. iframeInnerHtml: "",
  844. pdfUrl:
  845. "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E4%B8%8A%E8%AF%BE%E8%AF%BE%E4%BB%B6---%E4%BA%94%E4%B8%8Bintroduce%20a%20festival%20%28Final%20%29%281%291661829428281.pdf",
  846. pptImgUrl: "",
  847. ppage: 2,
  848. full: false,
  849. pageTotal: 0,
  850. howTools: 0,
  851. toolsList: [],
  852. timer: null,
  853. isLoading: false,
  854. formLabelWidth: "100px",
  855. userid: this.$route.query.userid,
  856. cid: this.$route.query.courseId,
  857. oid: this.$route.query.oid,
  858. mr: require("../assets/kc1.png"),
  859. timu: [],
  860. dialogVisible: false,
  861. dialogVisiblePick: false,
  862. answerBox: "",
  863. isNoHomeWork: false,
  864. answer: [
  865. { name: "A.1568" },
  866. { name: "B.720" },
  867. { name: "C.1728" },
  868. { name: "D.480" },
  869. ],
  870. steps: 0,
  871. isBlock: 0,
  872. isNext: false,
  873. isAnswer: false,
  874. upload: [
  875. {
  876. url: "",
  877. },
  878. ],
  879. noneBtnImg: false,
  880. proVisible: false,
  881. progress: 0,
  882. typeC: [],
  883. toolCount: 0,
  884. tools: [
  885. {}, //tools: [30]
  886. // {
  887. // file: [
  888. // {
  889. // name: "音频1.MP3",
  890. // src: "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E6%9F%B3%E8%BD%BB%E9%A2%82%20-%20%E6%BA%AF%EF%BC%88%E9%92%A2%E7%90%B4%E7%89%88%EF%BC%891661673251415.mp3",
  891. // },
  892. // ],
  893. // }
  894. "",
  895. {
  896. file: [
  897. {
  898. name: "视频1.mp4",
  899. src: "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E5%AA%92%E4%BD%9311661413782505.mp4",
  900. },
  901. ],
  902. },
  903. "", //问答题
  904. { tools: [9], choice: 3, answer: [2, 3] },
  905. { tools: [9], choice: 3, answer: [2] }, //协同文档
  906. { tools: [9], choice: 3, answer: [3] }, //思维导图
  907. { tools: [9], choice: 3, answer: [1] },
  908. { tools: [9], choice: 3, answer: [2] },
  909. { tools: [12] },
  910. {
  911. tools: [27],
  912. answer: [
  913. "Time",
  914. "Weather",
  915. "Activities before the festival",
  916. "Activities during the festival",
  917. "Food",
  918. "Reason",
  919. "Feelings",
  920. ],
  921. choice: 7,
  922. tkAnswerBox: [
  923. "Feelings",
  924. "Weather",
  925. "Activities before the festival",
  926. "Origin",
  927. "Food",
  928. "Time",
  929. "Activities during the festival",
  930. "Reason",
  931. ],
  932. },
  933. {
  934. file: [
  935. {
  936. name: "视频2.mp4",
  937. src: "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E5%AA%92%E4%BD%9321661413797366.mp4",
  938. },
  939. ],
  940. },
  941. { tools: [9] },
  942. { tools: [3] },
  943. { tools: [16] },
  944. {
  945. tools: [14],
  946. rateArray: [
  947. "聚焦主题",
  948. "有开头结尾",
  949. "语言正确,流畅",
  950. "书写规范,美观",
  951. ],
  952. },
  953. "",
  954. "",
  955. { tools: [29] },
  956. "",
  957. "",
  958. //1、电子白板 2、便签 3、思维导图 4、问卷调查 5、量规评分 6、协同文档 7、思维网格 8、素材库 9、选择题 10、倒计时 11、问答题 12、选人回答 13、分小组 14、老师对提交作业进行评价 15、问答 16、作业提交 17、学习资料 18、训练平台 19、目标管理 20、课程设计 21、编程平台 22、AI体验 23、python 24、AI平台
  959. ],
  960. rateList: [],
  961. tkAnswerBox: [],
  962. tkAnswer: [],
  963. imgUrl: "",
  964. imgFile: "",
  965. imgFileUp: [],
  966. videoList: [],
  967. videoList2: [],
  968. audioUrl: "",
  969. fileList: [],
  970. playerOptions: {
  971. playbackRates: [0.7, 1.0, 1.5, 2.0], //播放速度
  972. autoplay: false, //如果true,浏览器准备好时开始回放。
  973. muted: false, // 默认情况下将会消除任何音频。
  974. loop: false, // 导致视频一结束就重新开始。
  975. preload: "auto", // 建议浏览器在<video>加载元素后是否应该开始下载视频数据。auto浏览器选择最佳行为,立即开始加载视频(如果浏览器支持)
  976. language: "zh-CN",
  977. aspectRatio: "16:9", // 将播放器置于流畅模式,并在计算播放器的动态大小时使用该值。值应该代表一个比例 - 用冒号分隔的两个数字(例如"16:9"或"4:3")
  978. fluid: true, // 当true时,Video.js player将拥有流体大小。换句话说,它将按比例缩放以适应其容器。
  979. sources: [
  980. {
  981. type: "video/mp4", //这里的种类支持很多种:基本视频格式、直播、流媒体等,具体可以参看git网址项目 || "video/ogg"|| "video/webm"
  982. src: "", //url地址require("../../assets/media/aaa.mp4")
  983. },
  984. ],
  985. // poster: require("../../assets/tu31.png"), //你的封面地址
  986. // poster: dataRes.imgUrl, //你的封面地址
  987. notSupportedMessage: "此视频暂无法播放,请稍后再试", //允许覆盖Video.js无法播放媒体源时显示的默认信息。
  988. controlBar: {
  989. timeDivider: true, //当前时间和持续时间的分隔符
  990. durationDisplay: true, //显示持续时间
  991. remainingTimeDisplay: false, //是否显示剩余时间功能
  992. fullscreenToggle: true, //全屏按钮
  993. },
  994. },
  995. playerO: {},
  996. videoindex: 0,
  997. videoBlock: 0,
  998. Vwidth: 0,
  999. tiankongAnswer: [],
  1000. LuAudioUrl: "",
  1001. isRecord: false,
  1002. isPlayerRecord: false,
  1003. };
  1004. },
  1005. methods: {
  1006. // 开始录音
  1007. startRecorder() {
  1008. let _this = this;
  1009. if (!_this.isRecord) {
  1010. recorder.destroy(); // 销毁录音
  1011. _this.isRecord = true;
  1012. recorder.start().then(
  1013. () => {},
  1014. (error) => {
  1015. _this.$message.error(`${error.name} : ${error.message}`);
  1016. // 出错了
  1017. console.log(`${error.name} : ${error.message}`);
  1018. }
  1019. );
  1020. } else {
  1021. _this.isRecord = false;
  1022. recorder.stop(); // 结束录音
  1023. }
  1024. },
  1025. // 录音播放
  1026. playRecorder() {
  1027. if (!recorder.fileSize) {
  1028. return;
  1029. }
  1030. if (!this.isPlayerRecord) {
  1031. this.isPlayerRecord = true;
  1032. recorder.play();
  1033. } else {
  1034. this.isPlayerRecord = false;
  1035. recorder.stopPlay(); // 停止录音播放
  1036. }
  1037. recorder.onplayend = () => {
  1038. this.isPlayerRecord = false;
  1039. console.log("onplayend");
  1040. };
  1041. },
  1042. /**
  1043. * 文件格式转换 wav-map3
  1044. * */
  1045. getMp3Data() {
  1046. if (!recorder.fileSize) {
  1047. this.$message.error("请录音后在上传语音");
  1048. return;
  1049. }
  1050. const mp3Blob = this.convertToMp3(recorder.getWAV());
  1051. let audioFile = this.dataURLtoAudio(mp3Blob, "音频");
  1052. console.log(audioFile);
  1053. this.beforeUpload1(audioFile, 3);
  1054. // recorder.download(mp3Blob, "recorder", "mp3");
  1055. },
  1056. convertToMp3(wavDataView) {
  1057. // 获取wav头信息
  1058. const wav = lamejs.WavHeader.readHeader(wavDataView); // 此处其实可以不用去读wav头信息,毕竟有对应的config配置
  1059. const { channels, sampleRate } = wav;
  1060. const mp3enc = new lamejs.Mp3Encoder(channels, sampleRate, 128);
  1061. // 获取左右通道数据
  1062. const result = recorder.getChannelData();
  1063. const buffer = [];
  1064. const leftData =
  1065. result.left &&
  1066. new Int16Array(result.left.buffer, 0, result.left.byteLength / 2);
  1067. const rightData =
  1068. result.right &&
  1069. new Int16Array(result.right.buffer, 0, result.right.byteLength / 2);
  1070. const remaining = leftData.length + (rightData ? rightData.length : 0);
  1071. const maxSamples = 1152;
  1072. for (let i = 0; i < remaining; i += maxSamples) {
  1073. const left = leftData.subarray(i, i + maxSamples);
  1074. let right = null;
  1075. let mp3buf = null;
  1076. if (channels === 2) {
  1077. right = rightData.subarray(i, i + maxSamples);
  1078. mp3buf = mp3enc.encodeBuffer(left, right);
  1079. } else {
  1080. mp3buf = mp3enc.encodeBuffer(left);
  1081. }
  1082. if (mp3buf.length > 0) {
  1083. buffer.push(mp3buf);
  1084. }
  1085. }
  1086. const enc = mp3enc.flush();
  1087. if (enc.length > 0) {
  1088. buffer.push(enc);
  1089. }
  1090. return new Blob(buffer, { type: "audio/mp3" });
  1091. },
  1092. dataURLtoAudio(blob, filename) {
  1093. return new File([blob], filename, { type: "audio/mp3" });
  1094. },
  1095. change(val) {
  1096. console.log(val);
  1097. },
  1098. goTo(path) {
  1099. this.$router.push(path);
  1100. },
  1101. tableRowClassName({ row, rowIndex }) {
  1102. if ((rowIndex + 1) % 2 === 0) {
  1103. return "even_row";
  1104. } else {
  1105. return "";
  1106. }
  1107. },
  1108. jump(cid) {
  1109. window.parent.postMessage({ cid: cid, type: "1" }, "*");
  1110. },
  1111. handleCurrentChange(val) {
  1112. // console.log(`当前页: ${val}`);
  1113. this.page = val;
  1114. },
  1115. init() {},
  1116. handleClose(done) {
  1117. done();
  1118. },
  1119. handleRemove(file, fileList) {
  1120. console.log(file, fileList);
  1121. },
  1122. onExceed() {
  1123. this.$message.error("课程海报仅支持上传一张,请删除后再进行上传");
  1124. },
  1125. //uuid生成
  1126. guid() {
  1127. return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(
  1128. /[xy]/g,
  1129. function (c) {
  1130. var r = (Math.random() * 16) | 0,
  1131. v = c == "x" ? r : (r & 0x3) | 0x8;
  1132. return v.toString(16);
  1133. }
  1134. );
  1135. },
  1136. time() {
  1137. if (!this.now) {
  1138. this.now = new Date().getTime();
  1139. return true;
  1140. } else {
  1141. let time = new Date().getTime();
  1142. if (time - this.now > 3000) {
  1143. this.now = time;
  1144. return true;
  1145. } else {
  1146. return false;
  1147. }
  1148. }
  1149. },
  1150. // answerWork() {
  1151. // this.steps++;
  1152. // },
  1153. addTool(t) {
  1154. if (t == 1) {
  1155. window.parent.postMessage({ tools: "1" }, "*");
  1156. } else if (t == 3) {
  1157. window.parent.postMessage({ tools: "3" }, "*");
  1158. } else if (t == 7) {
  1159. window.parent.postMessage({ tools: "7" }, "*");
  1160. }
  1161. },
  1162. answerQue() {
  1163. this.dialogVisible = true;
  1164. },
  1165. isChooseActive(t) {
  1166. if (this.typeC.length == 0) {
  1167. this.typeC.push(t);
  1168. } else {
  1169. if (this.typeC.indexOf(t) != -1) {
  1170. this.typeC.splice(this.typeC.indexOf(t), 1);
  1171. } else {
  1172. this.typeC.push(t);
  1173. }
  1174. }
  1175. },
  1176. showMember(i) {
  1177. if (this.typeC.length > 0) {
  1178. this.addWork(1);
  1179. } else {
  1180. this.$message.error("至少选择一个答案!");
  1181. }
  1182. },
  1183. clean(type) {
  1184. if (type == 1) {
  1185. this.upload[0].url.splice(0, 1);
  1186. } else if (type == 2) {
  1187. this.upload[0].upVedio.splice(0, 1);
  1188. }
  1189. },
  1190. addImg(e) {
  1191. var el = e.currentTarget;
  1192. el.getElementsByTagName("input")[0].click();
  1193. },
  1194. imgChange(file, fileList, type) {
  1195. if (type == 1) {
  1196. var _tmp = this.upload[0].url;
  1197. } else if (type == 2) {
  1198. // var _tmp = this.upload[0].upVedio;
  1199. var _tmp = this.upload[0].url;
  1200. } else if (type == 100) {
  1201. var _tmp = this.imgFileUp;
  1202. }
  1203. this.noneBtnImg = _tmp.length >= 1;
  1204. },
  1205. beforeUpload1(event, type) {
  1206. var file;
  1207. if (type == 3) {
  1208. file = event;
  1209. } else {
  1210. file = event.target.files[0];
  1211. }
  1212. var credentials = {
  1213. accessKeyId: "AKIATLPEDU37QV5CHLMH",
  1214. secretAccessKey: "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",
  1215. }; //秘钥形式的登录上传
  1216. window.AWS.config.update(credentials);
  1217. window.AWS.config.region = "cn-northwest-1"; //设置区域
  1218. var bucket = new window.AWS.S3({ params: { Bucket: "ccrb" } }); //选择桶
  1219. var _this = this;
  1220. if (file) {
  1221. _this.progress = 0;
  1222. _this.proVisible = true;
  1223. var params = {
  1224. Key:
  1225. file.name.split(".")[0] +
  1226. new Date().getTime() +
  1227. "." +
  1228. file.name.split(".")[file.name.split(".").length - 1],
  1229. ContentType: file.type,
  1230. Body: file,
  1231. "Access-Control-Allow-Credentials": "*",
  1232. ACL: "public-read",
  1233. }; //key可以设置为桶的相抵路径,Body为文件, ACL最好要设置
  1234. var options = {
  1235. partSize: 2048 * 1024 * 1024,
  1236. queueSize: 2,
  1237. leavePartsOnError: true,
  1238. };
  1239. bucket
  1240. .upload(params, options)
  1241. .on("httpUploadProgress", function (evt) {
  1242. //这里可以写进度条
  1243. // console.log("Uploaded : " + parseInt((evt.loaded * 80) / evt.total) + '%');
  1244. _this.progress = parseInt((evt.loaded * 80) / evt.total);
  1245. })
  1246. .send(function (err, data) {
  1247. _this.progress = 100;
  1248. setTimeout(() => {
  1249. _this.proVisible = false;
  1250. }, 1000);
  1251. if (err) {
  1252. var a = _this.$refs.upload1.uploadFiles;
  1253. a.splice(a.length - 1, a.length);
  1254. _this.$message.error("上传失败");
  1255. } else {
  1256. _this.upload[0].url = "";
  1257. if (type == 1) {
  1258. _this.upload[0].url = data.Location;
  1259. _this.imgChange(null, null, type);
  1260. _this.addWork(4);
  1261. } else if (type == 2) {
  1262. _this.upload[0].url = data.Location;
  1263. _this.imgChange(null, null, type);
  1264. _this.addWork(7);
  1265. } else if (type == 3) {
  1266. _this.LuAudioUrl = data.Location;
  1267. _this.addWork(8);
  1268. }
  1269. console.log(data.Location);
  1270. }
  1271. });
  1272. }
  1273. },
  1274. beforeUpload2(event) {
  1275. var file = event;
  1276. var credentials = {
  1277. accessKeyId: "AKIATLPEDU37QV5CHLMH",
  1278. secretAccessKey: "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",
  1279. }; //秘钥形式的登录上传
  1280. window.AWS.config.update(credentials);
  1281. window.AWS.config.region = "cn-northwest-1"; //设置区域
  1282. var bucket = new window.AWS.S3({ params: { Bucket: "ccrb" } }); //选择桶
  1283. var _this = this;
  1284. _this.progress = 0;
  1285. _this.proVisible = true;
  1286. if (file) {
  1287. var params = {
  1288. Key: file.name.split(".")[0] + new Date().getTime() + "." + "png",
  1289. ContentType: file.type,
  1290. Body: file,
  1291. "Access-Control-Allow-Credentials": "*",
  1292. ACL: "public-read",
  1293. }; //key可以设置为桶的相抵路径,Body为文件, ACL最好要设置
  1294. var options = {
  1295. partSize: 2048 * 1024 * 1024,
  1296. queueSize: 2,
  1297. leavePartsOnError: true,
  1298. };
  1299. bucket
  1300. .upload(params, options)
  1301. .on("httpUploadProgress", function (evt) {
  1302. //这里可以写进度条
  1303. // console.log("Uploaded : " + parseInt((evt.loaded * 80) / evt.total) + '%');
  1304. _this.progress = parseInt((evt.loaded * 80) / evt.total);
  1305. })
  1306. .send(function (err, data) {
  1307. _this.progress = 100;
  1308. setTimeout(() => {
  1309. _this.proVisible = false;
  1310. }, 1000);
  1311. if (err) {
  1312. var a = _this.$refs.upload1.uploadFiles;
  1313. a.splice(a.length - 1, a.length);
  1314. _this.$message.error("上传失败");
  1315. } else {
  1316. _this.imgFileUp.push({
  1317. name: file.name,
  1318. url: data.Location,
  1319. uid: file.uid,
  1320. });
  1321. _this.imgChange(null, null, type);
  1322. console.log(data.Location);
  1323. }
  1324. });
  1325. }
  1326. },
  1327. addJtWork(type) {
  1328. if (this.isNoHomeWork == true || this.isAnswer == true) {
  1329. this.$confirm(
  1330. "您已经提交了该作业了,如果您再提交将覆盖上次提交的作业!",
  1331. "提示",
  1332. {
  1333. confirmButtonText: "确定",
  1334. cancelButtonText: "取消",
  1335. type: "warning",
  1336. }
  1337. )
  1338. .then(() => {
  1339. this.getImg();
  1340. this.addSWork(type);
  1341. })
  1342. .catch(() => {});
  1343. } else {
  1344. this.getImg();
  1345. // this.addSWork(type);
  1346. }
  1347. },
  1348. addWork(type) {
  1349. if (type == 5) {
  1350. if (this.tkAnswer.length == 0) {
  1351. this.$message.error("请选择对应的答案");
  1352. return;
  1353. }
  1354. }
  1355. // else if (this.upload[0].upVedio.length == 0) {
  1356. // this.$message.error("请上传视频");
  1357. // return;
  1358. // }
  1359. // else if (this.upload[0].upIntro == "") {
  1360. // this.$message.error("请填写简要描述");
  1361. // return;
  1362. // }
  1363. var _str = "";
  1364. if (type == 6) {
  1365. _str = "您已经提交了评价了,如果您再提交将覆盖上次提交的评价!";
  1366. } else {
  1367. _str = "您已经提交了该作业了,如果您再提交将覆盖上次提交的作业!";
  1368. }
  1369. if (this.isNoHomeWork == true || this.isAnswer == true) {
  1370. this.$confirm(_str, "提示", {
  1371. confirmButtonText: "确定",
  1372. cancelButtonText: "取消",
  1373. type: "warning",
  1374. })
  1375. .then(() => {
  1376. this.addSWork(type);
  1377. })
  1378. .catch(() => {});
  1379. } else {
  1380. this.addSWork(type);
  1381. }
  1382. },
  1383. addSWork(type) {
  1384. var a;
  1385. if (type == 4 || type == 7) {
  1386. a = this.upload[0].url;
  1387. } else if (type == 6) {
  1388. a = JSON.stringify(this.rateList);
  1389. } else if (type == 1) {
  1390. a = JSON.stringify(this.typeC);
  1391. } else if (type == 5) {
  1392. a = JSON.stringify(this.tkAnswer);
  1393. } else {
  1394. a = this.LuAudioUrl;
  1395. }
  1396. let params = {
  1397. uid: this.userid,
  1398. cid: this.cid,
  1399. p: this.ppage - 1,
  1400. t: type,
  1401. upload: a,
  1402. // upload: JSON.stringify(this.imgFileUp),
  1403. };
  1404. this.ajax
  1405. .get(this.$store.state.api + "insertSWork", params)
  1406. .then((res) => {
  1407. // this.isNoHomeWork = true;
  1408. // this.dialogVisible = true;
  1409. // this.upload = res.data[0][0].upload;
  1410. this.$message({
  1411. message: "提交成功",
  1412. type: "success",
  1413. });
  1414. this.selectSWork();
  1415. if (this.tools[this.ppage - 1].tools.indexOf(12) != -1) {
  1416. this.pick();
  1417. this.isBlock = 0;
  1418. }
  1419. })
  1420. .catch((err) => {
  1421. this.$message.error("提交成功");
  1422. console.error(err);
  1423. });
  1424. },
  1425. selectSWork() {
  1426. let _type = 0;
  1427. if (this.tools[this.ppage - 1].tools) {
  1428. if (
  1429. this.tools[this.ppage - 1].tools.indexOf(1) != -1 ||
  1430. this.tools[this.ppage - 1].tools.indexOf(3) != -1 ||
  1431. this.tools[this.ppage - 1].tools.indexOf(6) != -1 ||
  1432. this.tools[this.ppage - 1].tools.indexOf(7) != -1 ||
  1433. this.tools[this.ppage - 1].tools.indexOf(10) != -1 ||
  1434. this.tools[this.ppage - 1].tools.indexOf(16) != -1 ||
  1435. this.tools[this.ppage - 1].tools.indexOf(13) != -1
  1436. ) {
  1437. _type = 4;
  1438. } else if (this.tools[this.ppage - 1].tools.indexOf(9) != -1) {
  1439. _type = 1;
  1440. } else if (this.tools[this.ppage - 1].tools.indexOf(27) != -1) {
  1441. _type = 5;
  1442. } else if (this.tools[this.ppage - 1].tools.indexOf(14) != -1) {
  1443. _type = 6;
  1444. } else if (this.tools[this.ppage - 1].tools.indexOf(29) != -1) {
  1445. _type = 7;
  1446. } else if (
  1447. this.tools[this.ppage - 1].tools.indexOf(30) != -1 ||
  1448. this.tools[this.ppage - 1].tools.indexOf(12) != -1
  1449. ) {
  1450. _type = 8;
  1451. }
  1452. }
  1453. this.isAnswer = false;
  1454. this.isNoHomeWork = false;
  1455. let params = {
  1456. uid: this.userid,
  1457. cid: this.cid,
  1458. p: this.ppage - 1,
  1459. type: _type,
  1460. };
  1461. this.ajax
  1462. .get(this.$store.state.api + "selectSWork", params)
  1463. .then((res) => {
  1464. if (res.data[0].length > 0) {
  1465. if (res.data[0][0].type == 1) {
  1466. this.isAnswer = true;
  1467. this.typeC = JSON.parse(res.data[0][0].upload);
  1468. } else if (res.data[0][0].type == 5) {
  1469. this.isNoHomeWork = true;
  1470. this.tkAnswer = JSON.parse(res.data[0][0].upload);
  1471. } else if (res.data[0][0].type == 4 || res.data[0][0].type == 7) {
  1472. this.isNoHomeWork = true;
  1473. this.upload[0].url = res.data[0][0].upload;
  1474. } else if (res.data[0][0].type == 6) {
  1475. this.isNoHomeWork = true;
  1476. this.rateList = JSON.parse(res.data[0][0].upload);
  1477. } else if (res.data[0][0].type == 8) {
  1478. this.isNoHomeWork = true;
  1479. this.LuAudioUrl = res.data[0][0].upload;
  1480. }
  1481. }
  1482. })
  1483. .catch((err) => {
  1484. console.log("暂无作业");
  1485. console.error(err);
  1486. });
  1487. },
  1488. getImg() {
  1489. var iframeHtml;
  1490. let iframeBody;
  1491. if (this.toolCount == 1) {
  1492. iframeHtml = this.$refs.whiteBoard;
  1493. } else if (this.toolCount == 3) {
  1494. iframeHtml = this.$refs.mind;
  1495. } else if (this.toolCount == 7) {
  1496. iframeHtml = this.$refs.grid;
  1497. }
  1498. iframeBody = iframeHtml.contentWindow.document.body;
  1499. this.iframeInnerHtml = iframeBody.innerHTML;
  1500. var iframeIh = this.$refs.iframeIh;
  1501. iframeIh.innerHTML = this.iframeInnerHtml;
  1502. this.$forceUpdate();
  1503. console.log(iframeIh);
  1504. // var iframeHtml = this.$refs.whiteBoard;
  1505. document.getElementById("shishi_loading").style.display = "flex";
  1506. var _ajs = iframeHtml.contentWindow.document.createElement("script");
  1507. _ajs.type = "text/javascript";
  1508. _ajs.innerHTML =
  1509. 'var _js = document.createElement("script");\n' +
  1510. '_js.type="text/javascript";\n' +
  1511. '_js.src="https://html2canvas.hertzen.com/dist/html2canvas.min.js";\n' +
  1512. "_js.onload = function(){\n" +
  1513. ' var a = document.getElementsByTagName("img")\n' +
  1514. ' for(var i = 0;i<a.length;i++){a[i].crossOrigin="anonymous"}\n' +
  1515. " html2canvas(document.body).then(canvas => {\n" +
  1516. ' var base64Url = canvas.toDataURL("image/png");\n' +
  1517. 'var base64 = "<img src=" + base64Url + " />"\n' +
  1518. 'var file = dataURLtoFile_shishi(base64Url, "截图")\n' +
  1519. "beforeUpload_shishi(file," +
  1520. "'" +
  1521. this.userid +
  1522. "'" +
  1523. ", " +
  1524. "'" +
  1525. this.cid +
  1526. "'" +
  1527. ", " +
  1528. "'" +
  1529. (this.ppage - 1) +
  1530. "'" +
  1531. ", " +
  1532. "'4'" +
  1533. ")\n" +
  1534. " });\n" +
  1535. "}\n" +
  1536. "document.head.appendChild(_js);\n";
  1537. iframeHtml.contentWindow.document.head.appendChild(_ajs);
  1538. // iframeHtml.contentWindow.jietu_shishi(this.userid, this.cid);
  1539. // 第一个参数是需要生成截图的元素,第二个是自己需要配置的参数,宽高等
  1540. // html2canvas(iframeBody, {
  1541. // allowTaint: true,
  1542. // backgroundColor: null, //画出来的图片有白色的边框,不要可设置背景为透明色(null)
  1543. // useCORS: true, //支持图片跨域
  1544. // scale: 1, //设置放大的倍数
  1545. // }).then((canvas) => {
  1546. // // 把生成的base64位图片上传到服务器,生成在线图片地址
  1547. // let url = canvas.toDataURL("image/png"); // toDataURL: 图片格式转成 base64
  1548. // this.imgUrl = url; //将图片下载到本地
  1549. // let a = document.createElement("a"); // 生成一个a元素
  1550. // let event = new MouseEvent("click"); // 创建一个单击事件
  1551. // a.download = "作业"; // 设置图片名称没有设置则为默认
  1552. // a.href = this.imgUrl; // 将生成的URL设置为a.href属性
  1553. // a.dispatchEvent(event); // 触发a的单击事件
  1554. // let file = this.dataURLtoFile(url, "作业");
  1555. // this.imgFile = file;
  1556. // this.beforeUpload2(this.imgFile);
  1557. // this.addSWork();
  1558. // console.log(this.imgFile);
  1559. // });
  1560. },
  1561. dataURLtoFile(dataurl, filename) {
  1562. let arr = dataurl.split(","),
  1563. mime = arr[0].match(/:(.*?);/)[1],
  1564. bstr = atob(arr[1]),
  1565. n = bstr.length,
  1566. u8arr = new Uint8Array(n);
  1567. while (n--) {
  1568. u8arr[n] = bstr.charCodeAt(n);
  1569. }
  1570. return new File([u8arr], filename, { type: mime });
  1571. },
  1572. search() {},
  1573. selectFile() {
  1574. this.fileList = [];
  1575. this.videoList = [];
  1576. this.videoList2 = [];
  1577. var a = ["PDF", "DOC", "DOCX", "PPT", "PPTX", "XLSX", "XLS"];
  1578. var b = this.tools[this.ppage - 1].file;
  1579. for (var i = 0; i < b.length; i++) {
  1580. if (
  1581. a.indexOf(
  1582. b[i].src
  1583. .split(".")
  1584. [b[i].src.split(".").length - 1].toLocaleUpperCase()
  1585. ) != -1
  1586. ) {
  1587. this.fileList.push(b[i]);
  1588. } else if (
  1589. b[i].src
  1590. .split(".")
  1591. [b[i].src.split(".").length - 1].toLocaleUpperCase() == "MP3"
  1592. ) {
  1593. this.videoList2.push(b[i]);
  1594. } else {
  1595. this.videoList.push(b[i]);
  1596. }
  1597. }
  1598. if (this.videoList.length) {
  1599. this.playVideo();
  1600. } else if (this.videoList2.length) {
  1601. this.playVideo2();
  1602. } else {
  1603. this.videoBlock = 0;
  1604. }
  1605. },
  1606. openFile(u) {
  1607. this.pptImgUrl = "https://view.officeapps.live.com/op/view.aspx?src=" + u;
  1608. this.isBlock = 7;
  1609. },
  1610. playVideo() {
  1611. var d = JSON.parse(JSON.stringify(this.playerOptions));
  1612. // for (var i = 0; i < this.videoList.length; i++) {
  1613. d.sources[0].src = this.videoList[0].src;
  1614. this.playerO[0] = d;
  1615. // this.videoindex = i;
  1616. // }
  1617. // this.isBlock = 6;
  1618. this.videoBlock = 6;
  1619. },
  1620. playVideo2() {
  1621. this.audioUrl = this.videoList2[0].src;
  1622. this.isBlock = 9;
  1623. },
  1624. switchVideo(media) {
  1625. this.playerO = {};
  1626. this.playerOptions.poster = "";
  1627. this.playerOptions.sources[0].src = media;
  1628. this.playerO = this.playerOptions;
  1629. },
  1630. onPlayerPlay() {},
  1631. howPage(page) {
  1632. if (!this.pageTotal) {
  1633. return;
  1634. }
  1635. if (page == this.pageTotal) {
  1636. // this.isBlock = 3;
  1637. } else {
  1638. this.isBlock = 0;
  1639. if (
  1640. this.tools[page - 1].tools &&
  1641. this.tools[page - 1].tools.indexOf(9) != -1
  1642. ) {
  1643. this.isBlock = 1;
  1644. }
  1645. // if (this.ppage > 3) {
  1646. // this.isBlock = 2;
  1647. // }
  1648. this.full = false;
  1649. this.howTools = 0;
  1650. this.toolCount = 0;
  1651. if (this.tools[page - 1].tools && this.tools[page - 1].tools[0] == 12) {
  1652. this.isBlock = 0;
  1653. }
  1654. if (
  1655. this.tools[page - 1].tools &&
  1656. (this.tools[page - 1].tools.indexOf(1) != -1 ||
  1657. this.tools[page - 1].tools.indexOf(3) != -1 ||
  1658. this.tools[page - 1].tools.indexOf(7) != -1)
  1659. ) {
  1660. this.isBlock = 4;
  1661. }
  1662. if (
  1663. this.tools[page - 1].tools &&
  1664. this.tools[page - 1].tools.length > 1
  1665. ) {
  1666. this.isBlock = 4;
  1667. }
  1668. if (this.tools[page - 1].tools && !this.tools[page - 1].tools.length) {
  1669. this.isBlock = 0;
  1670. }
  1671. if (
  1672. this.tools[this.ppage - 1].tools &&
  1673. this.tools[this.ppage - 1].tools.indexOf(14) != -1
  1674. ) {
  1675. this.isBlock = 3;
  1676. } else if (
  1677. this.tools[this.ppage - 1].tools &&
  1678. (this.tools[this.ppage - 1].tools.indexOf(3) != -1 ||
  1679. this.tools[this.ppage - 1].tools.indexOf(3) != -1 ||
  1680. this.tools[this.ppage - 1].tools.indexOf(6) != -1 ||
  1681. this.tools[this.ppage - 1].tools.indexOf(7) != -1 ||
  1682. this.tools[this.ppage - 1].tools.indexOf(10) != -1 ||
  1683. this.tools[this.ppage - 1].tools.indexOf(16) != -1 ||
  1684. this.tools[this.ppage - 1].tools.indexOf(29) != -1 ||
  1685. this.tools[this.ppage - 1].tools.indexOf(13) != -1)
  1686. ) {
  1687. if (this.tools[this.ppage - 1].tools.indexOf(1) != -1) {
  1688. // this.toolCount = 1;
  1689. this.checkTools(1);
  1690. } else if (this.tools[this.ppage - 1].tools.indexOf(3) != -1) {
  1691. this.checkTools(3);
  1692. } else if (this.tools[this.ppage - 1].tools.indexOf(28) != -1) {
  1693. this.checkTools(28);
  1694. } else if (this.tools[this.ppage - 1].tools.indexOf(4) != -1) {
  1695. this.checkTools(4);
  1696. } else if (this.tools[this.ppage - 1].tools.indexOf(6) != -1) {
  1697. this.checkTools(6);
  1698. } else if (this.tools[this.ppage - 1].tools.indexOf(7) != -1) {
  1699. this.checkTools(7);
  1700. }
  1701. // this.isBlock = 2;
  1702. } else if (
  1703. this.tools[this.ppage - 1].file &&
  1704. this.tools[this.ppage - 1].file.length
  1705. ) {
  1706. this.selectFile();
  1707. } else if (
  1708. this.tools[this.ppage - 1].tools &&
  1709. this.tools[this.ppage - 1].tools.indexOf(27) != -1
  1710. ) {
  1711. if (this.tools[this.ppage - 1].answer) {
  1712. this.tiankongAnswer = this.tools[this.ppage - 1].answer;
  1713. }
  1714. this.isBlock = 8;
  1715. }
  1716. if (this.tools[page - 1].tools && this.tools[page - 1].tools[0] == 30) {
  1717. this.isBlock = 10;
  1718. }
  1719. if (
  1720. this.tools[this.ppage - 1].file &&
  1721. this.tools[this.ppage - 1].file.length
  1722. ) {
  1723. } else {
  1724. this.videoBlock = 0;
  1725. }
  1726. }
  1727. this.selectSWork();
  1728. },
  1729. pick() {
  1730. let params = [
  1731. {
  1732. h: "",
  1733. cid: this.cid,
  1734. },
  1735. ];
  1736. this.ajax
  1737. .post(this.$store.state.api + "updatePPTHandle", params)
  1738. .then((res) => {
  1739. // this.dialogVisiblePick = false;
  1740. })
  1741. .catch((err) => {
  1742. console.error(err);
  1743. });
  1744. },
  1745. pick2() {
  1746. this.dialogVisiblePick = false;
  1747. this.isBlock = 10;
  1748. },
  1749. setPage() {
  1750. let params = {
  1751. id: this.cid,
  1752. };
  1753. this.ajax
  1754. .get(this.$store.state.api + "selectPptPage", params)
  1755. .then((res) => {
  1756. if (res.data[0].length > 0) {
  1757. if (
  1758. res.data[0][0].handle &&
  1759. JSON.parse(res.data[0][0].handle).type == 2 &&
  1760. JSON.parse(res.data[0][0].handle).userid == this.userid &&
  1761. this.isBlock != 10 &&
  1762. this.tools[res.data[0][0].page - 1].tools.indexOf(12) != -1
  1763. ) {
  1764. this.dialogVisiblePick = true;
  1765. }
  1766. // if (
  1767. // res.data[0][0].handle &&
  1768. // JSON.parse(res.data[0][0].handle).type == 1 &&
  1769. // this.videoList.length
  1770. // ) {
  1771. // let handle = JSON.parse(res.data[0][0].handle);
  1772. // let a = this.$refs.zVideo;
  1773. // if (handle.isPlay == 1) {
  1774. // a.player.play();
  1775. // } else if (handle.isPlay == 2) {
  1776. // a.player.pause();
  1777. // }
  1778. // } else if(this.$refs.zVideo){
  1779. // this.$refs.zVideo.player.pause();
  1780. // }
  1781. if (this.ppage == res.data[0][0].page && this.isBlock !== 0) {
  1782. return;
  1783. } else {
  1784. this.ppage = res.data[0][0].page;
  1785. // this.ppage = 1;
  1786. // this.ppage = 11;
  1787. this.typeC = [];
  1788. this.isAnswer = false;
  1789. this.howPage(this.ppage);
  1790. }
  1791. }
  1792. })
  1793. .catch((err) => {
  1794. // this.$message.error("查询失败");
  1795. console.error(err);
  1796. });
  1797. },
  1798. getPageTotal(total) {
  1799. this.pageTotal = total;
  1800. },
  1801. getWidth(total) {
  1802. this.Vwidth = total;
  1803. },
  1804. fullTools() {
  1805. this.full = !this.full;
  1806. },
  1807. checkTools(tcount) {
  1808. this.isBlock = 2;
  1809. this.toolCount = tcount;
  1810. let _this = this;
  1811. _this.$nextTick(() => {
  1812. setTimeout(() => {
  1813. const script1 = document.createElement("script");
  1814. script1.type = "text/javascript";
  1815. script1.src =
  1816. "https://pbl.cocorobo.cn/pbl-student-table/dist/js/jquery-3.6.0.min.js";
  1817. const script2 = document.createElement("script");
  1818. script2.type = "text/javascript";
  1819. script2.src =
  1820. "https://pbl.cocorobo.cn/pbl-student-table/dist/js/aws-sdk-2.235.1.min.js";
  1821. const script3 = document.createElement("script");
  1822. script3.type = "text/javascript";
  1823. script3.src =
  1824. "https://html2canvas.hertzen.com/dist/js/html2canvas.min.js";
  1825. const script4 = document.createElement("script");
  1826. script4.type = "text/javascript";
  1827. script4.src =
  1828. "https://pbl.cocorobo.cn/pbl-student-table/dist/js/jietu.js";
  1829. if (_this.toolCount == 1) {
  1830. _this.$refs.whiteBoard.onload = () => {
  1831. _this.$refs.whiteBoard.contentWindow.document.body.appendChild(
  1832. script1
  1833. );
  1834. _this.$refs.whiteBoard.contentWindow.document.body.appendChild(
  1835. script2
  1836. );
  1837. // _this.$refs.whiteBoard.contentWindow.document.body.appendChild(script3);
  1838. _this.$refs.whiteBoard.contentWindow.document.body.appendChild(
  1839. script4
  1840. );
  1841. };
  1842. } else if (_this.toolCount == 3) {
  1843. _this.$refs.mind.onload = () => {
  1844. _this.$refs.mind.contentWindow.document.body.appendChild(script1);
  1845. _this.$refs.mind.contentWindow.document.body.appendChild(script2);
  1846. // _this.$refs.mind.contentWindow.document.body.appendChild(script3);
  1847. _this.$refs.mind.contentWindow.document.body.appendChild(script4);
  1848. };
  1849. } else if (_this.toolCount == 7) {
  1850. _this.$refs.grid.onload = () => {
  1851. _this.$refs.grid.contentWindow.document.body.appendChild(script1);
  1852. _this.$refs.grid.contentWindow.document.body.appendChild(script2);
  1853. // _this.$refs.grid.contentWindow.document.body.appendChild(script3);
  1854. _this.$refs.grid.contentWindow.document.body.appendChild(script4);
  1855. };
  1856. }
  1857. }, 0);
  1858. });
  1859. },
  1860. },
  1861. beforeDestroy() {
  1862. clearInterval(this.timer);
  1863. this.timer = null;
  1864. // window.removeEventListener("message");
  1865. },
  1866. created() {
  1867. // this.selectSWork();
  1868. let _this = this;
  1869. this.timer = setInterval(() => {
  1870. _this.setPage();
  1871. }, 1000);
  1872. // window.addEventListener("message", function (e) {
  1873. // // 监听 message 事件
  1874. // if (e.data.type && e.data.type == "shishi_canvas") {
  1875. // console.log(e.data.data);
  1876. // }
  1877. // });
  1878. },
  1879. };
  1880. </script>
  1881. <style scoped>
  1882. .dialog_diy >>> .el-dialog__header {
  1883. background: #3d67bc !important;
  1884. padding: 15px 20px;
  1885. }
  1886. .dialog_diy >>> .el-dialog__title {
  1887. color: #fff;
  1888. }
  1889. .dialog_diy >>> .el-dialog__headerbtn {
  1890. top: 9px;
  1891. }
  1892. .dialog_diy >>> .el-dialog__headerbtn .el-dialog__close {
  1893. color: #fff;
  1894. }
  1895. .dialog_diy >>> .el-dialog__headerbtn .el-dialog__close:hover {
  1896. color: #fff;
  1897. }
  1898. .blackBottom {
  1899. background: rgb(0, 0, 0);
  1900. height: 45px;
  1901. width: 100%;
  1902. display: flex;
  1903. flex-direction: row;
  1904. flex-wrap: nowrap;
  1905. align-items: center;
  1906. justify-content: space-between;
  1907. }
  1908. .imgMiddle {
  1909. width: 100%;
  1910. position: relative;
  1911. height: 100%;
  1912. }
  1913. .imgMiddle > img,
  1914. .imghalf > img,
  1915. .szt > img,
  1916. .uploadImg > img,
  1917. .uploadVedio > img,
  1918. .uploadImgPic > img,
  1919. .logoLive > img,
  1920. .close > img,
  1921. .deleteWord > img {
  1922. width: 100%;
  1923. height: 100%;
  1924. }
  1925. .deleteWord {
  1926. width: 22px !important;
  1927. height: 22px;
  1928. position: absolute;
  1929. right: -5px;
  1930. top: -5px;
  1931. cursor: pointer;
  1932. }
  1933. .blackBottomB {
  1934. position: sticky;
  1935. bottom: 0px;
  1936. left: 0px;
  1937. display: flex;
  1938. flex-direction: row;
  1939. flex-wrap: wrap;
  1940. align-content: center;
  1941. justify-content: space-between;
  1942. align-items: center;
  1943. background: rgb(0, 0, 0);
  1944. height: 45px;
  1945. width: 100%;
  1946. }
  1947. .blackBottomB > div:nth-child(1) {
  1948. margin-left: 10px !important;
  1949. }
  1950. .blackButton {
  1951. color: #fff;
  1952. background: #066ebe;
  1953. width: 100px;
  1954. height: 30px;
  1955. line-height: 30px;
  1956. text-align: center;
  1957. margin: 0 25px;
  1958. border-radius: 5px;
  1959. font-size: 15px;
  1960. cursor: pointer;
  1961. }
  1962. .isNoOther {
  1963. width: 100%;
  1964. display: flex;
  1965. height: calc(100% - 45px);
  1966. }
  1967. .imghalf {
  1968. width: 60% !important;
  1969. }
  1970. .answerBox {
  1971. padding: 25px;
  1972. overflow: auto;
  1973. height: 70%;
  1974. box-sizing: border-box;
  1975. }
  1976. .answerTimuBox {
  1977. display: flex;
  1978. flex-direction: row;
  1979. flex-wrap: nowrap;
  1980. align-items: center;
  1981. justify-content: space-between;
  1982. padding-bottom: 15px;
  1983. }
  1984. .memberBox {
  1985. display: flex;
  1986. flex-direction: row;
  1987. flex-wrap: wrap;
  1988. align-items: center;
  1989. }
  1990. .memberBox > div {
  1991. background: rgb(240, 185, 204);
  1992. width: 120px;
  1993. color: #fff;
  1994. height: 40px;
  1995. text-align: center;
  1996. line-height: 40px;
  1997. border-radius: 5px;
  1998. margin: 0 15px 15px 0;
  1999. cursor: pointer;
  2000. }
  2001. .viewSta {
  2002. background: rgb(97, 97, 97);
  2003. color: #bebebe;
  2004. margin: 20% auto 20px;
  2005. width: 300px;
  2006. height: 40px;
  2007. text-align: center;
  2008. line-height: 40px;
  2009. border-radius: 5px;
  2010. cursor: pointer;
  2011. }
  2012. .szt {
  2013. width: 450px;
  2014. margin: 20px auto;
  2015. }
  2016. .sztFooter {
  2017. padding: 20px 10px 50px 0;
  2018. display: flex;
  2019. flex-direction: row;
  2020. flex-wrap: nowrap;
  2021. justify-content: flex-end;
  2022. align-items: center;
  2023. }
  2024. .timuButton {
  2025. background: #649ef2;
  2026. width: 75px;
  2027. height: 27px;
  2028. line-height: 27px;
  2029. text-align: center;
  2030. border-radius: 5px;
  2031. color: #fff;
  2032. margin-right: 20px;
  2033. display: inline-block;
  2034. }
  2035. .anserBoxCss {
  2036. margin: 30px 0 20px 0;
  2037. }
  2038. .anserBoxCss >>> .el-radio__label {
  2039. font-size: 18px;
  2040. }
  2041. .anserBoxCss >>> .el-radio__inner {
  2042. border-radius: 0px !important;
  2043. }
  2044. .nextStepBox {
  2045. display: flex;
  2046. justify-content: center;
  2047. margin-top: 10px;
  2048. }
  2049. .nextStepOne {
  2050. background: #6b92c9;
  2051. color: #fff;
  2052. width: 110px;
  2053. text-align: center;
  2054. height: 35px;
  2055. line-height: 35px;
  2056. font-size: 14px;
  2057. border-radius: 5px;
  2058. cursor: pointer;
  2059. }
  2060. .nextStepOne,
  2061. .nextStepOne {
  2062. margin-left: 10px;
  2063. }
  2064. .toolList {
  2065. display: flex;
  2066. flex-direction: row;
  2067. flex-wrap: wrap;
  2068. justify-content: flex-start;
  2069. align-items: center;
  2070. }
  2071. .tools {
  2072. display: flex;
  2073. flex-direction: column;
  2074. align-items: center;
  2075. margin-right: 20px;
  2076. }
  2077. .tools > div:nth-child(1) {
  2078. width: 60px;
  2079. }
  2080. .tools > div:nth-child(1) > img {
  2081. width: 100%;
  2082. height: 100%;
  2083. }
  2084. .uploadImg {
  2085. width: 100px;
  2086. margin: 10px 0 0 15px;
  2087. cursor: pointer;
  2088. }
  2089. .upImg {
  2090. display: flex;
  2091. flex-direction: column;
  2092. flex-wrap: nowrap;
  2093. align-items: center;
  2094. justify-content: center;
  2095. color: rgb(182, 182, 182);
  2096. font-size: 20px;
  2097. }
  2098. .binfo_input {
  2099. font: inherit;
  2100. color: currentColor;
  2101. width: 100%;
  2102. margin: 0;
  2103. padding: 15px 14px;
  2104. display: block;
  2105. min-width: 0;
  2106. outline: none;
  2107. box-sizing: content-box;
  2108. background: none;
  2109. -webkit-tap-highlight-color: transparent;
  2110. border: 1px solid rgba(0, 0, 0, 0.23);
  2111. border-radius: 4px;
  2112. box-sizing: border-box;
  2113. resize: none;
  2114. }
  2115. .binfo_input:focus-visible {
  2116. border: 1px solid rgba(61, 103, 188);
  2117. }
  2118. .hengCss {
  2119. display: flex;
  2120. flex-direction: row;
  2121. flex-wrap: wrap;
  2122. align-items: center;
  2123. padding: 5px 0 0 20px;
  2124. }
  2125. .uploadImgPic {
  2126. width: 100px;
  2127. height: 100px;
  2128. position: relative;
  2129. margin: 0 20px 0 0;
  2130. }
  2131. .uploadImgPic > div {
  2132. width: 100px;
  2133. white-space: nowrap;
  2134. overflow: hidden;
  2135. text-overflow: ellipsis;
  2136. }
  2137. .mask {
  2138. background-color: rgba(0, 0, 0, 0);
  2139. position: fixed;
  2140. top: 0;
  2141. left: 0;
  2142. width: 100%;
  2143. height: 100%;
  2144. z-index: 20000;
  2145. display: flex;
  2146. align-items: center;
  2147. justify-content: center;
  2148. }
  2149. .progressBox {
  2150. width: 500px;
  2151. height: 180px;
  2152. background: #fff;
  2153. border-radius: 10px;
  2154. box-shadow: 0 0 6px 1px #bfbfbf;
  2155. display: flex;
  2156. align-items: center;
  2157. justify-content: center;
  2158. flex-direction: column;
  2159. }
  2160. .progressBox .lbox {
  2161. height: 100px;
  2162. font-size: 19px;
  2163. display: flex;
  2164. align-items: center;
  2165. }
  2166. .progressBox .lbox img {
  2167. width: 40px;
  2168. margin-right: 20px;
  2169. }
  2170. .progressBox >>> .el-progress-bar__outer {
  2171. background-color: #d1dfff !important;
  2172. }
  2173. .progressBox .lbox {
  2174. height: 100px;
  2175. font-size: 19px;
  2176. display: flex;
  2177. align-items: center;
  2178. }
  2179. .progressBox .lbox img {
  2180. width: 40px;
  2181. margin-right: 20px;
  2182. }
  2183. .logoLive {
  2184. width: 35px;
  2185. }
  2186. .choose_style {
  2187. display: flex;
  2188. justify-content: center;
  2189. align-items: center;
  2190. width: 100%;
  2191. margin: 10px 0 30px;
  2192. }
  2193. .choose_style span {
  2194. background: #f8f9ff;
  2195. color: #677fff;
  2196. border: 1px solid #95b5ff;
  2197. padding: 15px 20px;
  2198. font-size: 25px;
  2199. border-radius: 18px;
  2200. cursor: pointer;
  2201. }
  2202. .choose_style span + span {
  2203. margin-left: 25px;
  2204. }
  2205. .isChoose {
  2206. color: #fff !important;
  2207. background: #5e78fa !important;
  2208. }
  2209. .close {
  2210. position: absolute;
  2211. right: 10px;
  2212. top: 10px;
  2213. width: 20px;
  2214. cursor: pointer;
  2215. }
  2216. .score_box {
  2217. font-size: 14px;
  2218. }
  2219. .score_box >>> .el-rate {
  2220. margin: 10px 0 20px 0;
  2221. }
  2222. .score_box >>> .el-rate__icon {
  2223. font-size: 23px;
  2224. }
  2225. .bz >>> .el-textarea__inner {
  2226. width: 80%;
  2227. background: #f9f9f9;
  2228. border: 1px solid #afafaf;
  2229. border-radius: 0px;
  2230. }
  2231. .tools_title {
  2232. background: #000;
  2233. position: absolute;
  2234. width: 100%;
  2235. top: 0;
  2236. left: 0;
  2237. display: flex;
  2238. align-items: center;
  2239. height: 40px;
  2240. justify-content: space-between;
  2241. padding: 0 15px;
  2242. box-sizing: border-box;
  2243. }
  2244. .tools_title span {
  2245. color: #fff;
  2246. }
  2247. .tools_title div {
  2248. display: flex;
  2249. align-items: center;
  2250. }
  2251. .full,
  2252. .closeImg {
  2253. height: 22px;
  2254. cursor: pointer;
  2255. }
  2256. .tools_title img,
  2257. img {
  2258. margin-left: 10px;
  2259. }
  2260. .tools_box {
  2261. width: 38.5%;
  2262. max-width: 38.5%;
  2263. overflow: auto;
  2264. background: rgb(255, 255, 255);
  2265. height: 91.5%;
  2266. position: relative;
  2267. margin: 10px 15px;
  2268. }
  2269. .tools_child_box {
  2270. width: 100%;
  2271. height: calc(90% - 40px);
  2272. padding-top: 40px;
  2273. }
  2274. .fullStyle {
  2275. width: 100% !important;
  2276. max-width: 100% !important;
  2277. }
  2278. .toolCss {
  2279. display: flex;
  2280. flex-direction: column;
  2281. flex-wrap: wrap;
  2282. width: calc(100% / 6);
  2283. align-items: center;
  2284. text-align: center;
  2285. }
  2286. .toolImg {
  2287. width: 70px;
  2288. height: 70px;
  2289. cursor: pointer;
  2290. }
  2291. .toolImg > img {
  2292. width: 100%;
  2293. height: 100%;
  2294. margin: 0 !important;
  2295. }
  2296. .toolImg > div {
  2297. font-size: 14px;
  2298. }
  2299. .iframeBox {
  2300. overflow: auto;
  2301. position: absolute;
  2302. top: 0;
  2303. z-index: -2;
  2304. width: 100%;
  2305. height: 100%;
  2306. }
  2307. .fileBox {
  2308. display: flex;
  2309. flex-direction: row;
  2310. flex-wrap: wrap;
  2311. align-items: center;
  2312. justify-content: flex-start;
  2313. align-content: center;
  2314. width: 100%;
  2315. }
  2316. .fileListCss {
  2317. display: flex;
  2318. flex-direction: column;
  2319. flex-wrap: nowrap;
  2320. align-items: center;
  2321. margin: 0 15px 15px 0;
  2322. }
  2323. .fileCss {
  2324. width: 70px;
  2325. height: 70px;
  2326. cursor: pointer;
  2327. margin: 0 0 10px 0;
  2328. }
  2329. .fileCss > img {
  2330. width: 100%;
  2331. height: 100%;
  2332. margin: 0;
  2333. }
  2334. .wheel {
  2335. width: 100%;
  2336. height: 100%;
  2337. }
  2338. .video-player >>> .video-js {
  2339. height: 100%;
  2340. }
  2341. .tkCss {
  2342. display: flex;
  2343. flex-direction: row;
  2344. align-items: center;
  2345. flex-wrap: nowrap;
  2346. margin-bottom: 15px;
  2347. }
  2348. .workd_media {
  2349. /* width: 1497.42px; */
  2350. /* width: auto; */
  2351. height: 100%;
  2352. position: absolute;
  2353. top: 0;
  2354. left: 50%;
  2355. transform: translateX(-50%);
  2356. z-index: 999;
  2357. }
  2358. .tiankongAnswer {
  2359. margin-left: 10px;
  2360. color: #1834c0;
  2361. }
  2362. .tfalse {
  2363. color: rgb(189, 30, 30) !important;
  2364. }
  2365. .video_wrapper {
  2366. width: 100%;
  2367. height: 100%;
  2368. position: absolute;
  2369. z-index: 99999;
  2370. background: #fff;
  2371. background: transparent;
  2372. top: 0;
  2373. }
  2374. </style>