liveProjectDetail.vue 67 KB

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