courseDetail.vue 79 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693
  1. <template>
  2. <div class="pb_content">
  3. <div class="pb_content_body" style="height: 100%">
  4. <div class="body_student">
  5. <div class="student_head">
  6. <div
  7. v-if="screenType != 2"
  8. class="return"
  9. @click.stop="
  10. goTo(
  11. '/index?userid=' +
  12. userid +
  13. '&oid=' +
  14. oid +
  15. '&org=' +
  16. org +
  17. '&cid=' +
  18. classId +
  19. '&tType=' +
  20. tType +
  21. '&screenType=' +
  22. screenType
  23. )
  24. "
  25. >
  26. <div class="returnIndexImg">
  27. <img src="../assets/icon/newIcon/returnIndex.png" alt="" />
  28. </div>
  29. <div>返回</div>
  30. <!-- <img src="../assets/icon/return.png" alt="" /> -->
  31. </div>
  32. <div class="box_course">
  33. <div class="wheel">
  34. <img
  35. style="object-fit: cover"
  36. :src="
  37. this.courseDetail.cover != null &&
  38. this.courseDetail.cover != ''
  39. ? JSON.parse(this.courseDetail.cover).length > 0
  40. ? JSON.parse(this.courseDetail.cover)[0].url
  41. : mr
  42. : mr
  43. "
  44. alt
  45. />
  46. </div>
  47. <div class="right_box">
  48. <div class="rightT">
  49. <div class="right_box_title">{{ courseDetail.title }}</div>
  50. <div class="jd">{{ chapInfo.length }}阶段</div>
  51. <div class="jd">{{ rw }}任务</div>
  52. </div>
  53. <div class="cType" v-if="courseType.length">
  54. <div
  55. class="all_choose"
  56. v-for="(item, index) in courseType"
  57. :key="index"
  58. >
  59. <span style="color: #717c8d; font-weight: 400">{{
  60. item + ":"
  61. }}</span>
  62. <span
  63. class="type_children"
  64. v-for="(item2, index2) in courseTypeJson[item]"
  65. :key="index2"
  66. >{{ item2 }}</span
  67. >
  68. </div>
  69. </div>
  70. <div class="cType" style="align-items: flex-start">
  71. <div
  72. style="
  73. min-width: fit-content;
  74. color: #717c8d;
  75. font-weight: 400;
  76. "
  77. >
  78. 创建者:<span style="font-weight: bold; color: #0e1e33">{{
  79. courseDetail.username
  80. }}</span>
  81. </div>
  82. <div
  83. style="display: flex; align-items: center; margin-left: 32px"
  84. >
  85. <div style="color: #717c8d; font-weight: 400">参与人数:</div>
  86. <!-- <div class="man">
  87. <img src="../assets/people.png" alt />
  88. </div> -->
  89. <div class="person" style="font-weight: bold; color: #0e1e33">
  90. {{
  91. courseDetail.vcount != null ? courseDetail.vcount : 0
  92. }}人
  93. </div>
  94. </div>
  95. </div>
  96. <div class="cType" style="color: #6c6c6c">
  97. <div
  98. class="Tname"
  99. v-if="Tname.length > 0"
  100. @click="TnameCheck = !TnameCheck"
  101. style="color: #717c8d; font-weight: 400"
  102. >
  103. 协同人员:<span
  104. v-for="(tname, tIndex) in TnameCheck
  105. ? Tname
  106. : Tname.slice(0, 6)"
  107. :key="tIndex"
  108. style="margin: 0 5px; font-weight: 400; color: #0e1e33"
  109. >{{ tname }}</span
  110. ><span
  111. style="margin: 0 5px; font-weight: 400; color: #b2b2b2"
  112. v-if="!TnameCheck && Tname.length > 6"
  113. >更多....</span
  114. >
  115. </div>
  116. </div>
  117. <!-- <div
  118. class="cType"
  119. style="font-size: 18px; color: #6c6c6c"
  120. v-if="classList.length && tType != 2"
  121. >
  122. <div class="teaClass">
  123. <div>授课班级:</div>
  124. <div>
  125. <el-button
  126. @click="gotoCourse('')"
  127. style="background: #4a9eed; color: #fff; margin: 0 5px"
  128. v-if="classList.length != 1"
  129. >全部</el-button
  130. ><el-button
  131. @click="gotoCourse(item.id)"
  132. v-for="(item, index) in classList"
  133. :key="index"
  134. style="background: #4a9eed; color: #fff; margin: 0 5px"
  135. >{{ item.name }}</el-button
  136. >
  137. </div>
  138. </div>
  139. </div> -->
  140. <div class="btnBox">
  141. <!-- <div class="now_study" @click="dialogVisible = true">
  142. 立即学习
  143. </div> -->
  144. <div
  145. class="now_study"
  146. @click="setQr(courseDetail.courseId)"
  147. v-if="tType != 2"
  148. >
  149. <div class="returnIndexImg">
  150. <img src="../assets/icon/newIcon/codeIcon.png" alt="" />
  151. </div>
  152. <div>生成二维码</div>
  153. </div>
  154. <div
  155. class="now_study"
  156. @click="dialogVisibleGroup = true"
  157. v-if="courseDetail.state == 1"
  158. >
  159. <div class="returnIndexImg">
  160. <img src="../assets/icon/newIcon/groupIcon.png" alt="" />
  161. </div>
  162. <div>
  163. {{
  164. courseDetail.userid != userid &&
  165. courseDetail.course_teacher &&
  166. courseDetail.course_teacher.indexOf(userid) == -1
  167. ? "加入分组"
  168. : "设置分组"
  169. }}
  170. </div>
  171. </div>
  172. <!-- <div
  173. class="now_group"
  174. v-if="groupInfo && courseDetail.state == 1"
  175. >
  176. <span>所在分组:</span>{{ groupInfo.name }}
  177. </div> -->
  178. </div>
  179. <div
  180. v-if="tType != 2"
  181. class="goToStudy"
  182. @click="goToStudyOrDia(classList)"
  183. >
  184. <div class="returnIndexImg">
  185. <img src="../assets/icon/newIcon/people.png" alt="" />
  186. </div>
  187. <div>立即授课</div>
  188. </div>
  189. </div>
  190. </div>
  191. </div>
  192. <div class="student_body">
  193. <div class="sLeft" v-if="courseDetail.brief">
  194. <div class="courseT">项目详情</div>
  195. <div class="courseTd">{{ courseDetail.brief }}</div>
  196. </div>
  197. <div :class="courseDetail.brief != '' ? 'rightTd' : 'noBRight'">
  198. <div v-if="tType == 1 || tType == 4" class="checkBox">
  199. <span :class="{ active: type == 2 }" @click="type = 2"
  200. >阶段选择</span
  201. >
  202. <span
  203. :class="{ active: type == 1 }"
  204. @click="getCTwo"
  205. v-if="courseDetail.state == 1"
  206. >课程分析</span
  207. >
  208. </div>
  209. <div
  210. v-if="((tType == 1 || tType == 4) && type == 2) || tType == 2"
  211. :class="courseDetail.brief != '' ? 'rightTd' : 'noBRight'"
  212. style="width: 100%; padding-top: 20px"
  213. >
  214. <div
  215. class="courseItem"
  216. v-for="(item, index) in chapInfo"
  217. :key="index"
  218. @click="addUserRate(index)"
  219. :class="{
  220. disabled: isFollow == 2 && tType == 2 && followC != index,
  221. }"
  222. >
  223. <div class="jdAndTask">
  224. <div>第{{ index + 1 }}阶段</div>
  225. <div
  226. v-if="courseDetail.state == 2 || courseDetail.state == 3"
  227. >
  228. 任务查看
  229. </div>
  230. <div :title="item.dyName">
  231. {{ item.dyName }}
  232. </div>
  233. </div>
  234. <div style="font-size: 14px; font-weight: 400; color: #717c8d">
  235. {{ item.chapterInfo[0].taskJson.length }}个任务
  236. </div>
  237. </div>
  238. <!-- <div
  239. class="blue_box_one"
  240. v-for="(item, index) in chapInfo"
  241. :key="index"
  242. @click="addUserRate(index)"
  243. :class="{
  244. disabled: isFollow == 2 && tType == 2 && followC != index,
  245. }"
  246. >
  247. <div v-if="courseDetail.state == 1">第{{ index + 1 }}阶段</div>
  248. <div v-if="courseDetail.state == 2 || courseDetail.state == 3">
  249. 任务查看
  250. </div>
  251. <div :title="item.dyName">{{ item.dyName }}</div>
  252. <div>{{ item.chapterInfo[0].taskJson.length }}个任务</div>
  253. </div> -->
  254. </div>
  255. <div
  256. v-if="
  257. (tType == 1 || tType == 4) &&
  258. Object.keys(chaptersJson).length &&
  259. type == 1
  260. "
  261. class="detail"
  262. >
  263. <div class="detail_box">
  264. <div class="title">
  265. <span class="toolIcon">工具分析</span>
  266. <div class="statebox">
  267. <div>
  268. <span class="taskIcon">全部阶段:</span
  269. ><span>{{ chaptersJson.state.stage }}</span>
  270. </div>
  271. <div>
  272. <span class="finishIcon">已进行:</span
  273. ><span>{{ chaptersJson.state.finish }}</span>
  274. </div>
  275. <div>
  276. <span class="learningIcon">未进行:</span
  277. ><span style="color: #fe9999">{{
  278. chaptersJson.state.learing
  279. }}</span>
  280. </div>
  281. </div>
  282. </div>
  283. <div class="box" v-if="chaptersJson.tool.length">
  284. <div class="progress">
  285. <div
  286. v-for="(item, index) in chaptersJson.tool"
  287. :key="index"
  288. class="chapter"
  289. >
  290. <div class="stageCss" @click="addUserRate(index)">
  291. <div
  292. style="
  293. width: 95%;
  294. height: 60px;
  295. display: flex;
  296. justify-content: space-between;
  297. flex-direction: row;
  298. flex-wrap: nowrap;
  299. align-items: center;
  300. "
  301. >
  302. <el-tooltip
  303. class="item"
  304. effect="light"
  305. :content="item.name"
  306. placement="top"
  307. >
  308. <div
  309. class="titleCss"
  310. style="width: 80%; max-width: unset"
  311. >
  312. 第{{ index + 1 }}阶段 {{ item.name }}
  313. </div>
  314. </el-tooltip>
  315. <div
  316. style="
  317. font-size: 14px;
  318. font-weight: 400;
  319. color: #3681fc;
  320. min-width: 30px;
  321. "
  322. >
  323. 查看
  324. </div>
  325. </div>
  326. </div>
  327. <!-- {{ chaptersJson.chapterState[index].isFinsh ? '已完成' : '进行中' }} -->
  328. <div class="task">
  329. <div
  330. v-for="(item2, index2) in item.array"
  331. :key="index + '-' + index2"
  332. class="taskBox"
  333. :class="item.array.length > 1 ? 'borderRight' : ''"
  334. >
  335. <div class="taskName">
  336. <div class="navIndex">任务{{ index2 + 1 }}:</div>
  337. <div>
  338. <el-tooltip
  339. class="item"
  340. effect="light"
  341. :content="item2.name"
  342. placement="top"
  343. >
  344. <div
  345. class="titleCss"
  346. style="
  347. font-size: 14px;
  348. font-weight: 400;
  349. color: #717c8d;
  350. "
  351. >
  352. {{ item2.name }}
  353. </div>
  354. </el-tooltip>
  355. </div>
  356. </div>
  357. <div class="p_tool_box">
  358. <span
  359. v-for="(item3, index3) in item2.array"
  360. :key="index + '-' + index2 + '-' + index3"
  361. class="p_tool"
  362. >
  363. <div v-if="item3.tool == 1">
  364. <img
  365. src="../assets/icon/secondToolList/whiteBoard.png"
  366. alt
  367. />
  368. <div>电子白板</div>
  369. </div>
  370. <div v-if="item3.tool == 3">
  371. <img
  372. src="../assets/icon/secondToolList/mindMapping.png"
  373. alt
  374. />
  375. <div>思维导图</div>
  376. </div>
  377. <div v-if="item3.tool == 6">
  378. <img
  379. src="../assets/icon/secondToolList/doc.png"
  380. alt
  381. />
  382. <div>协同文档</div>
  383. </div>
  384. <div v-if="item3.tool == 7">
  385. <img
  386. src="../assets/icon/secondToolList/mindNetwork.png"
  387. alt
  388. />
  389. <div>思维网格</div>
  390. </div>
  391. <div v-if="item3.tool == 8">
  392. <img
  393. src="../assets/icon/secondToolList/library.png"
  394. alt
  395. />
  396. <div>素材库</div>
  397. </div>
  398. <div v-if="item3.tool == 17">
  399. <img
  400. src="../assets/icon/secondToolList/library.png"
  401. alt
  402. />
  403. <div>学习资料</div>
  404. </div>
  405. <div v-if="item3.tool == 2">
  406. <img
  407. src="../assets/icon/secondToolList/note.png"
  408. alt
  409. />
  410. <div>便签</div>
  411. </div>
  412. <div v-if="item3.tool == 4">
  413. <img
  414. src="../assets/icon/thirdToolList/ask.png"
  415. alt
  416. />
  417. <div>问卷调查</div>
  418. </div>
  419. <div v-if="item3.tool == 45">
  420. <img
  421. src="../assets/icon/thirdToolList/choose.png"
  422. alt
  423. />
  424. <div>选择题</div>
  425. </div>
  426. <!-- <div v-if="item3.tool == 5">
  427. <img
  428. src="../assets/icon/thirdToolList/score.png"
  429. alt
  430. />
  431. <div >量规评分</div>
  432. </div> -->
  433. <div v-if="item3.tool == 10">
  434. <img
  435. src="../assets/icon/thirdToolList/time.png"
  436. alt
  437. />
  438. <div>倒计时</div>
  439. </div>
  440. <div v-if="item3.tool == 15">
  441. <img
  442. src="../assets/icon/thirdToolList/answer.png"
  443. alt
  444. />
  445. <div>问答工具</div>
  446. </div>
  447. <div v-if="item3.tool == 26">
  448. <img
  449. src="../assets/icon/thirdToolList/courseDesign.png"
  450. alt
  451. />
  452. <div>课程设计</div>
  453. </div>
  454. <div v-if="item3.tool == 18">
  455. <img
  456. src="../assets/icon/thirdToolList/trainPlatform.png"
  457. alt
  458. />
  459. <div>训练服务器</div>
  460. </div>
  461. <div v-if="item3.tool == 16">
  462. <img
  463. src="../assets/icon/thirdToolList/work.png"
  464. alt
  465. />
  466. <div>作业提交</div>
  467. </div>
  468. <div v-if="item3.tool == 21">
  469. <img
  470. src="../assets/icon/fourthToolList/program.png"
  471. alt
  472. />
  473. <div>编程平台</div>
  474. </div>
  475. <div v-if="item3.tool == 22">
  476. <img
  477. src="../assets/icon/fourthToolList/program.png"
  478. alt
  479. />
  480. <div>AI体验</div>
  481. </div>
  482. <div v-if="item3.tool == 23">
  483. <img
  484. src="../assets/icon/fourthToolList/program.png"
  485. alt
  486. />
  487. <div>Python</div>
  488. </div>
  489. <div v-if="item3.tool == 24">
  490. <img
  491. src="../assets/icon/fourthToolList/AIprogram.png"
  492. alt
  493. />
  494. <div>AI平台</div>
  495. </div>
  496. <div v-if="item3.tool == 25">
  497. <img
  498. src="../assets/icon/thirdToolList/evalua.png"
  499. alt
  500. />
  501. <div>目标管理</div>
  502. </div>
  503. <div v-if="item3.tool == 31">
  504. <img
  505. src="../assets/icon/secondToolList/networkPanel.png"
  506. alt
  507. />
  508. <div>数学画板</div>
  509. </div>
  510. <div v-if="item3.tool == 28">
  511. <img
  512. src="../assets/icon/secondToolList/translation.png"
  513. alt
  514. />
  515. <div>翻译</div>
  516. </div>
  517. <div v-if="item3.tool == 37">
  518. <img
  519. src="../assets/icon/secondToolList/mohe.png"
  520. alt
  521. />
  522. <div>魔盒识字</div>
  523. </div>
  524. <div v-if="item3.tool == 38">
  525. <img
  526. src="../assets/icon/secondToolList/24game.png"
  527. alt
  528. />
  529. <div>24点</div>
  530. </div>
  531. <div v-if="item3.tool == 39">
  532. <img
  533. src="../assets/icon/secondToolList/GeoGebra.png"
  534. alt
  535. />
  536. <div>GeoGebra</div>
  537. </div>
  538. <div v-if="item3.tool == 32">
  539. <img
  540. src="../assets/icon/thirdToolList/code.png"
  541. alt
  542. />
  543. <div>源码编辑</div>
  544. </div>
  545. <div v-if="item3.tool == 40">
  546. <img
  547. src="../assets/icon/secondToolList/eval.png"
  548. alt
  549. />
  550. <div>学生评价</div>
  551. </div>
  552. <div v-if="item3.tool == 41">
  553. <img
  554. src="../assets/icon/thirdToolList/select.png"
  555. alt
  556. />
  557. <div>选择填空</div>
  558. </div>
  559. <div v-if="item3.tool == 44">
  560. <img
  561. src="../assets/icon/thirdToolList/hanClass.png"
  562. alt
  563. />
  564. <div>汉字宫</div>
  565. </div>
  566. <div v-if="item3.tool == 47">
  567. <img
  568. src="../assets/icon/fourthToolList/conSentences.png"
  569. alt
  570. />
  571. <div>连词成句</div>
  572. </div>
  573. <div v-if="item3.tool == 48">
  574. <img
  575. src="../assets/icon/fourthToolList/table.png"
  576. alt
  577. />
  578. <div>表格</div>
  579. </div>
  580. <div v-if="item3.tool == 49">
  581. <img
  582. src="../assets/icon/fourthToolList/group.png"
  583. alt
  584. />
  585. <div>学生分组</div>
  586. </div>
  587. <div v-if="item3.tool == 50">
  588. <img
  589. src="../assets/icon/thirdToolList/plwork.png"
  590. alt
  591. />
  592. <div>批量上传</div>
  593. </div>
  594. <div v-if="item3.tool == 57">
  595. <img
  596. src="../assets/icon/fourthToolList/cocopi.png"
  597. alt
  598. />
  599. <div>CocoPi</div>
  600. </div>
  601. <div v-if="item3.tool == 58">
  602. <img
  603. src="../assets/icon/fourthToolList/car.png"
  604. alt
  605. />
  606. <div>模拟驾驶</div>
  607. </div>
  608. <div v-if="item3.tool == 59">
  609. <img
  610. src="../assets/icon/fourthToolList/lineSearch.png"
  611. alt
  612. />
  613. <div>路径搜索</div>
  614. </div>
  615. <div v-if="item3.tool == 60">
  616. <img
  617. src="../assets/icon/fourthToolList/deepLearning.png"
  618. alt
  619. />
  620. <div>深度学习</div>
  621. </div>
  622. <div v-if="item3.tool == 61">
  623. <img
  624. src="../assets/icon/fourthToolList/allHistory.png"
  625. alt
  626. />
  627. <div>深度学习</div>
  628. </div>
  629. <div v-if="item3.tool == 62">
  630. <img
  631. src="../assets/icon/fourthToolList/interVideo.png"
  632. alt
  633. />
  634. <div>交互视频</div>
  635. </div>
  636. <div v-if="item3.tool == 63">
  637. <img
  638. src="../assets/icon/fourthToolList/Wood.png"
  639. alt
  640. />
  641. <div>海龟编程</div>
  642. </div>
  643. <div v-if="item3.tool == undefined">
  644. <img
  645. src="../assets/icon/empytool.png"
  646. alt
  647. style="width: 64px; height: 75px"
  648. />
  649. </div>
  650. </span>
  651. </div>
  652. </div>
  653. </div>
  654. </div>
  655. </div>
  656. </div>
  657. </div>
  658. <div
  659. class="detail_box"
  660. v-if="Object.keys(chaptersJson.time).length"
  661. >
  662. <div class="title">
  663. <span class="frequencyIcon">活跃频率</span>
  664. </div>
  665. <div class="box">
  666. <div>
  667. <Heatmap
  668. :Josn="chaptersJson.time"
  669. :num="chaptersJson.studentCount"
  670. ></Heatmap>
  671. </div>
  672. </div>
  673. </div>
  674. <div class="detail_box">
  675. <div class="title"><span class="timeIcon">实施时间</span></div>
  676. <div class="box">
  677. <div style="font-size: 22px; margin: 15px 0 45px">
  678. {{ courseDetail.title }}
  679. </div>
  680. <div class="chapter_time_box" style="margin-left: 170px">
  681. <div
  682. v-for="(item, index) in chaptersJson.work"
  683. :key="index"
  684. class="c_box"
  685. >
  686. <div class="stage_box" style="left: -195px">
  687. <div
  688. style="
  689. min-width: 150px;
  690. position: relative;
  691. left: -5px;
  692. "
  693. >
  694. {{ item.time }}
  695. </div>
  696. <div class="yuan"></div>
  697. <div class="stage">
  698. 第{{ index + 1 }}阶段 {{ item.name }}
  699. </div>
  700. <div
  701. class="s_up"
  702. :class="{ s_up2: !item.is }"
  703. @click="item.is = !item.is"
  704. >
  705. <img src="../assets/icon/up.png" alt="" />
  706. </div>
  707. </div>
  708. <div v-show="item.is">
  709. <div
  710. v-for="(item2, index2) in item.chapter"
  711. :key="index + '-' + index2"
  712. >
  713. <div
  714. style="
  715. display: flex;
  716. flex-direction: row;
  717. flex-wrap: nowrap;
  718. align-items: center;
  719. "
  720. v-if="
  721. item2.task[0].tool != undefined && item2.isWork
  722. "
  723. >
  724. <div
  725. style="
  726. width: 13px;
  727. height: 13px;
  728. background: #5a82cb 100%;
  729. border-radius: 50%;
  730. margin-right: 10px;
  731. "
  732. ></div>
  733. <div
  734. style="
  735. color: #4376c3;
  736. font-size: 20px;
  737. font-weight: bold;
  738. "
  739. >
  740. 任务{{ index2 + 1 }}:{{ item2.name }}
  741. </div>
  742. </div>
  743. <div class="p_tool_box2">
  744. <span
  745. v-for="(item3, index3) in item2.task"
  746. :key="index + '-' + index2 + '-' + index3"
  747. class="p_tool2"
  748. >
  749. <div
  750. class="toolBigBox"
  751. style="
  752. display: flex;
  753. flex-direction: row;
  754. flex-wrap: nowrap;
  755. align-items: center;
  756. "
  757. v-if="item3.works.length"
  758. >
  759. <div
  760. style="
  761. display: flex;
  762. flex-direction: row;
  763. flex-wrap: nowrap;
  764. align-items: flex-end;
  765. min-width: 140px;
  766. "
  767. >
  768. <div class="lineBox"></div>
  769. <div class="toolbox">
  770. <div
  771. style="font-size: 16px; font-weight: bold"
  772. >
  773. 步骤{{ index3 + 1 }}:
  774. </div>
  775. <div v-if="item3.tool == 1">电子白板</div>
  776. <div v-if="item3.tool == 3">思维导图</div>
  777. <div v-if="item3.tool == 6">协同文档</div>
  778. <div v-if="item3.tool == 7">思维网格</div>
  779. <div v-if="item3.tool == 8">素材库</div>
  780. <div v-if="item3.tool == 17">学习资料</div>
  781. <div v-if="item3.tool == 2">便签</div>
  782. <div v-if="item3.tool == 4">问卷调查</div>
  783. <div v-if="item3.tool == 45">选择题</div>
  784. <div v-if="item3.tool == 10">倒计时</div>
  785. <div v-if="item3.tool == 15">问答工具</div>
  786. <div v-if="item3.tool == 26">课程设计</div>
  787. <div v-if="item3.tool == 18">
  788. 训练服务器
  789. </div>
  790. <div v-if="item3.tool == 16">作业提交</div>
  791. <div v-if="item3.tool == 21">编程平台</div>
  792. <div v-if="item3.tool == 22">AI体验</div>
  793. <div v-if="item3.tool == 23">Python</div>
  794. <div v-if="item3.tool == 24">AI平台</div>
  795. <div v-if="item3.tool == 25">目标管理</div>
  796. <div v-if="item3.tool == 31">数学画板</div>
  797. <div v-if="item3.tool == 28">翻译</div>
  798. <div v-if="item3.tool == 37">魔盒识字</div>
  799. <div v-if="item3.tool == 38">24点</div>
  800. <div v-if="item3.tool == 39">GeoGebra</div>
  801. <div v-if="item3.tool == 32">源码编辑</div>
  802. <div v-if="item3.tool == 40">学生评价</div>
  803. <div v-if="item3.tool == 41">选择填空</div>
  804. <div v-if="item3.tool == 44">汉字宫</div>
  805. <div v-if="item3.tool == 47">连词成句</div>
  806. <div v-if="item3.tool == 48">表格</div>
  807. <div v-if="item3.tool == 49">学生分组</div>
  808. <div v-if="item3.tool == 50">批量上传</div>
  809. <div v-if="item3.tool == 57">CocoPi</div>
  810. <div v-if="item3.tool == 58">模拟驾驶</div>
  811. <div v-if="item3.tool == 59">路径搜索</div>
  812. <div v-if="item3.tool == 60">深度学习</div>
  813. </div>
  814. </div>
  815. <div
  816. v-if="item3.works.length"
  817. style="
  818. display: flex;
  819. flex-direction: row;
  820. flex-wrap: wrap;
  821. align-items: center;
  822. margin-left: 10px;
  823. "
  824. >
  825. <!-- works:[],likeCount: 0, commentCount: 0, score: 0, isScore: 0 -->
  826. <div class="disCss">
  827. <div class="blueBtn">
  828. 作业数量:{{ item3.works.length }}
  829. </div>
  830. <div
  831. v-if="chaptersJson.studentCount"
  832. class="blueBtn"
  833. >
  834. 任务完成率:{{
  835. (
  836. (item3.works.length /
  837. chaptersJson.studentCount) *
  838. 100
  839. ).toFixed(2) > 100.0
  840. ? 100 + "%"
  841. : (
  842. (item3.works.length /
  843. chaptersJson.studentCount) *
  844. 100
  845. ).toFixed(2) + "%"
  846. }}
  847. </div>
  848. <div class="blueBtn">
  849. <div>点赞:{{ item3.likeCount }}</div>
  850. <div style="margin-left: 15px">
  851. 评论:{{ item3.commentCount }}
  852. </div>
  853. </div>
  854. </div>
  855. <div v-if="item3.isScore">
  856. <div class="disCss">
  857. <div class="blueBtn">
  858. 作业评价量:{{ item3.isScore }}
  859. </div>
  860. <div class="blueBtn">
  861. 评价平均分:{{
  862. (item3.score / item3.isScore).toFixed(
  863. 2
  864. )
  865. }}分
  866. </div>
  867. </div>
  868. </div>
  869. </div>
  870. </div>
  871. </span>
  872. </div>
  873. </div>
  874. </div>
  875. </div>
  876. </div>
  877. </div>
  878. </div>
  879. <!-- <div v-for="(item, index) in Object.keys(chaptersJson.time)" :key="index">
  880. {{ '时间:' + item + '次数:' + chaptersJson.time[item] }}</div> -->
  881. <!-- <div>实施时间:{{ chaptersJson.startTime }}</div> -->
  882. </div>
  883. </div>
  884. </div>
  885. <!-- <div
  886. style="
  887. text-align: center;
  888. padding: 30px 0 20px 0;
  889. box-sizing: border-box;
  890. "
  891. >
  892. 此处滚动加载..
  893. </div>-->
  894. <el-dialog
  895. title="阶段选择"
  896. :visible.sync="dialogVisible"
  897. :append-to-body="true"
  898. width="700px"
  899. :before-close="handleClose"
  900. class="dialog_change"
  901. >
  902. <div style="font-size: 20px">请选择阶段</div>
  903. <div
  904. style="
  905. padding: 20px 30px;
  906. display: flex;
  907. flex-direction: row;
  908. flex-wrap: wrap;
  909. "
  910. >
  911. <div
  912. class="blue_box"
  913. v-for="(item, index) in chapInfo"
  914. :key="index"
  915. @click="addUserRate(index)"
  916. >
  917. <div>第{{ index + 1 }}阶段</div>
  918. <div>{{ item.dyName }}</div>
  919. <div>{{ item.chapterInfo[0].taskJson.length }}个任务</div>
  920. </div>
  921. </div>
  922. </el-dialog>
  923. <Group
  924. :dialogVisibleGroup.sync="dialogVisibleGroup"
  925. :classList="classList"
  926. :cid="id"
  927. :courseDetail="courseDetail"
  928. :userid="userid"
  929. :oid="oid"
  930. :type="tType"
  931. :classId="classId"
  932. @getGroup="getGroup"
  933. ></Group>
  934. </div>
  935. </div>
  936. <el-dialog title="课程二维码" :visible.sync="dialogVisibleQR" width="400px">
  937. <div class="qrcode" ref="qrCodeUrl"></div>
  938. </el-dialog>
  939. <el-dialog
  940. title="选择授课班级"
  941. :visible.sync="dialogVisibleSk"
  942. width="626px"
  943. class="diy_sk"
  944. >
  945. <div class="classBox">
  946. <div @click="gotoCourse('')">全部</div>
  947. <div
  948. @click="gotoCourse(item.id)"
  949. v-for="(item, index) in classList"
  950. :key="index"
  951. >
  952. {{ item.name }}
  953. </div>
  954. </div>
  955. <div class="cancelDiy" @click="dialogVisibleSk = false">取消</div>
  956. </el-dialog>
  957. </div>
  958. </template>
  959. <script>
  960. import Heatmap from "./tools/heatmap.vue";
  961. import Group from "./group/group.vue";
  962. import QRCode from "qrcodejs2";
  963. export default {
  964. components: {
  965. Heatmap,
  966. Group,
  967. },
  968. data() {
  969. return {
  970. choose: 0,
  971. dialogVisibleSk: false,
  972. dialogVisible: false,
  973. dialogVisibleGroup: false,
  974. id: this.$route.query.courseId,
  975. userid: this.$route.query.userid,
  976. oid: this.$route.query.oid,
  977. org: this.$route.query.org,
  978. classId: this.$route.query.cid,
  979. tType: this.$route.query.tType,
  980. screenType: this.$route.query.screenType,
  981. courseDetail: {},
  982. classList: [],
  983. aStudentName: [],
  984. chapInfo: [],
  985. courseType: [],
  986. Tname: [],
  987. TnameCheck: false,
  988. courseTypeJson: {},
  989. userinfo: [],
  990. mr: "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/noBanner1656409780264.jpg",
  991. rw: 0,
  992. chaptersJson: {},
  993. type: 2,
  994. inviteCode: [],
  995. groupInfo: "",
  996. isFollow: "",
  997. followC: "",
  998. dialogVisibleQR: false,
  999. };
  1000. },
  1001. methods: {
  1002. handleClose(done) {
  1003. done();
  1004. },
  1005. setQr(cid) {
  1006. this.dialogVisibleQR = true;
  1007. setTimeout(() => {
  1008. this.$refs.qrCodeUrl.innerHTML = "";
  1009. var qrcode = new QRCode(this.$refs.qrCodeUrl, {
  1010. text: "https://cloud.cocorobo.hk/#/course?courseid=" + cid, // 需要转换为二维码的内容
  1011. width: 350,
  1012. height: 350,
  1013. colorDark: "#000000",
  1014. colorLight: "#ffffff",
  1015. correctLevel: QRCode.CorrectLevel.H,
  1016. });
  1017. }, 500);
  1018. },
  1019. goTo(path) {
  1020. this.$router.push(path);
  1021. },
  1022. gotoCourse(id) {
  1023. if (this.courseDetail.state == 1) {
  1024. if (this.classList.length) {
  1025. this.goTo(
  1026. "/studyStudent?type=0&courseId=" +
  1027. this.id +
  1028. "&userid=" +
  1029. this.userid +
  1030. "&oid=" +
  1031. this.oid +
  1032. "&org=" +
  1033. this.org +
  1034. "&cid=" +
  1035. this.classId +
  1036. "&tType=" +
  1037. this.tType +
  1038. "&screenType=" +
  1039. this.screenType +
  1040. "&tcid=" +
  1041. id
  1042. );
  1043. } else {
  1044. this.goTo(
  1045. "/studyStudent?type=0&courseId=" +
  1046. this.id +
  1047. "&userid=" +
  1048. this.userid +
  1049. "&oid=" +
  1050. this.oid +
  1051. "&org=" +
  1052. this.org +
  1053. "&cid=" +
  1054. this.classId +
  1055. "&tType=" +
  1056. this.tType +
  1057. "&screenType=" +
  1058. this.screenType
  1059. );
  1060. }
  1061. } else if (this.courseDetail.state == 2) {
  1062. if (this.classList.length) {
  1063. this.goTo(
  1064. "/studystudentE2?type=0&courseId=" +
  1065. this.id +
  1066. "&userid=" +
  1067. this.userid +
  1068. "&oid=" +
  1069. this.oid +
  1070. "&org=" +
  1071. this.org +
  1072. "&cid=" +
  1073. this.classId +
  1074. "&tType=" +
  1075. this.tType +
  1076. "&screenType=" +
  1077. this.screenType +
  1078. "&tcid=" +
  1079. id
  1080. );
  1081. } else {
  1082. this.goTo(
  1083. "/studystudentE2?type=0&courseId=" +
  1084. this.id +
  1085. "&userid=" +
  1086. this.userid +
  1087. "&oid=" +
  1088. this.oid +
  1089. "&org=" +
  1090. this.org +
  1091. "&cid=" +
  1092. this.classId +
  1093. "&tType=" +
  1094. this.tType +
  1095. "&screenType=" +
  1096. this.screenType
  1097. );
  1098. }
  1099. } else if (this.courseDetail.state == 3) {
  1100. if (this.classList.length) {
  1101. this.goTo(
  1102. "/studystudentE3?type=0&courseId=" +
  1103. this.id +
  1104. "&userid=" +
  1105. this.userid +
  1106. "&oid=" +
  1107. this.oid +
  1108. "&org=" +
  1109. this.org +
  1110. "&cid=" +
  1111. this.classId +
  1112. "&tType=" +
  1113. this.tType +
  1114. "&screenType=" +
  1115. this.screenType +
  1116. "&tcid=" +
  1117. id
  1118. );
  1119. } else {
  1120. this.goTo(
  1121. "/studystudentE3?type=0&courseId=" +
  1122. this.id +
  1123. "&userid=" +
  1124. this.userid +
  1125. "&oid=" +
  1126. this.oid +
  1127. "&org=" +
  1128. this.org +
  1129. "&cid=" +
  1130. this.classId +
  1131. "&tType=" +
  1132. this.tType +
  1133. "&screenType=" +
  1134. this.screenType
  1135. );
  1136. }
  1137. }
  1138. },
  1139. goToStudyOrDia(l) {
  1140. if (l.length > 0) {
  1141. this.dialogVisibleSk = true;
  1142. } else {
  1143. this.addUserRate(0);
  1144. }
  1145. },
  1146. addUserRate(i) {
  1147. // var suid = this.userid;
  1148. // if (
  1149. // JSON.parse(this.courseDetail.course_student).indexOf(suid) == -1 &&
  1150. // JSON.parse(this.courseDetail.userid) != suid
  1151. // ) {
  1152. // this.$message.error("你没有该权限");
  1153. // return;
  1154. // }
  1155. // var a =
  1156. // this.courseDetail.course_student != ""
  1157. // ? JSON.parse(this.courseDetail.course_student)
  1158. // : "";
  1159. // if (this.courseDetail.userid != suid) {
  1160. // if (this.userinfo.type == 2) {
  1161. // if (a != "") {
  1162. // if (
  1163. // JSON.parse(this.courseDetail.course_student).indexOf(suid) == -1
  1164. // ) {
  1165. // this.$message.error("你没有该权限");
  1166. // return;
  1167. // }
  1168. // } else {
  1169. // this.$message.error("暂无项目学员,请联系老师添加项目学员!");
  1170. // return;
  1171. // }
  1172. // }
  1173. // }
  1174. if (this.isFollow == 2 && this.tType == 2 && this.followC != i) {
  1175. return;
  1176. }
  1177. let params = {
  1178. uid: this.userid,
  1179. cid: this.id,
  1180. };
  1181. this.ajax
  1182. .get(this.$store.state.api + "addUserR", params)
  1183. .then((res) => {
  1184. console.log(res.data);
  1185. this.updateVc();
  1186. if (this.tType == 1 || this.tType == 4) {
  1187. if (this.courseDetail.state == 1) {
  1188. this.goTo(
  1189. "/studyStudent?type=" +
  1190. i +
  1191. "&courseId=" +
  1192. this.id +
  1193. "&userid=" +
  1194. this.userid +
  1195. "&oid=" +
  1196. this.oid +
  1197. "&org=" +
  1198. this.org +
  1199. "&cid=" +
  1200. this.classId +
  1201. "&tType=" +
  1202. this.tType +
  1203. "&screenType=" +
  1204. this.screenType
  1205. );
  1206. } else if (this.courseDetail.state == 2) {
  1207. this.goTo(
  1208. "/studystudentE2?type=" +
  1209. i +
  1210. "&courseId=" +
  1211. this.id +
  1212. "&userid=" +
  1213. this.userid +
  1214. "&oid=" +
  1215. this.oid +
  1216. "&org=" +
  1217. this.org +
  1218. "&cid=" +
  1219. this.classId +
  1220. "&tType=" +
  1221. this.tType +
  1222. "&screenType=" +
  1223. this.screenType
  1224. );
  1225. } else if (this.courseDetail.state == 3) {
  1226. this.goTo(
  1227. "/studystudentE3?type=" +
  1228. i +
  1229. "&courseId=" +
  1230. this.id +
  1231. "&userid=" +
  1232. this.userid +
  1233. "&oid=" +
  1234. this.oid +
  1235. "&org=" +
  1236. this.org +
  1237. "&cid=" +
  1238. this.classId +
  1239. "&tType=" +
  1240. this.tType +
  1241. "&screenType=" +
  1242. this.screenType
  1243. );
  1244. }
  1245. } else if (this.tType == 2) {
  1246. this.gotoCourse(this.classId);
  1247. } else {
  1248. this.goTo(
  1249. "/study?type=" +
  1250. i +
  1251. "&courseId=" +
  1252. this.id +
  1253. "&userid=" +
  1254. this.userid +
  1255. "&oid=" +
  1256. this.oid +
  1257. "&org=" +
  1258. this.org +
  1259. "&cid=" +
  1260. this.classId +
  1261. "&tType=" +
  1262. this.tType +
  1263. "&screenType=" +
  1264. this.screenType
  1265. );
  1266. }
  1267. })
  1268. .catch((err) => {
  1269. console.error(err);
  1270. });
  1271. },
  1272. updateVc() {
  1273. let params = {
  1274. cid: this.id,
  1275. };
  1276. this.ajax
  1277. .get(this.$store.state.api + "updateVc", params)
  1278. .then((res) => {
  1279. console.log(res.data);
  1280. })
  1281. .catch((err) => {
  1282. console.error(err);
  1283. });
  1284. },
  1285. async getCourseDetail1() {
  1286. const loading = this.$loading.service({
  1287. background: "rgba(255, 255, 255, 0.7)",
  1288. target: document.querySelector(".student_table"),
  1289. });
  1290. let params = {
  1291. courseId: this.id,
  1292. };
  1293. let res = await this.ajax.get(
  1294. this.$store.state.api + "selectCourseDetail2",
  1295. params
  1296. );
  1297. loading.close();
  1298. // this.total = res.data[0].length > 0 ? res.data[0][0].num : 0;
  1299. this.courseDetail = res.data[0][0];
  1300. this.isFollow = res.data[0][0].follow;
  1301. this.followC = res.data[0][0].followC
  1302. ? res.data[0][0].followC.split("-")[0]
  1303. : "";
  1304. this.classList = res.data[3];
  1305. let groupData = res.data[5];
  1306. var a = res.data[0];
  1307. var b = res.data[1];
  1308. var c = res.data[2];
  1309. for (var i = 0; i < b.length; i++) {
  1310. // if (!this.id) {
  1311. // this.courseType[b[i].id] = [];
  1312. // }
  1313. for (var j = 0; j < a.length; j++) {
  1314. if (b[i].id == a[j].pid) {
  1315. if (!this.courseTypeJson[b[i].name]) {
  1316. this.courseType.push(b[i].name);
  1317. this.courseTypeJson[b[i].name] = [];
  1318. }
  1319. this.courseTypeJson[b[i].name].push(a[j].name);
  1320. }
  1321. }
  1322. }
  1323. this.Tname = [];
  1324. for (var k = 0; k < c.length; k++) {
  1325. this.Tname.push(c[k].name);
  1326. }
  1327. console.log(this.courseTypeJson.length);
  1328. this.aStudentName = res.data[2];
  1329. this.chapInfo = JSON.parse(this.courseDetail.chapters);
  1330. for (var z = 0; z < this.chapInfo.length; z++) {
  1331. this.rw += this.chapInfo[z].chapterInfo[0].taskJson.length;
  1332. }
  1333. this.inviteCode = [];
  1334. for (var i = 0; i < res.data[4].length; i++) {
  1335. this.inviteCode.push({
  1336. cid: res.data[4][i].classid,
  1337. ic: res.data[4][i].code,
  1338. });
  1339. }
  1340. if (res.data[3].length != this.inviteCode.length) {
  1341. let classArray = [];
  1342. let noClassArray = [];
  1343. for (var i = 0; i < res.data[3].length; i++) {
  1344. classArray.push(res.data[3][i].id);
  1345. noClassArray.push(res.data[3][i].id);
  1346. }
  1347. this.inviteCode = this.inviteCode.filter((el) => {
  1348. if (classArray.indexOf(el.cid) != -1) {
  1349. noClassArray.splice(noClassArray.indexOf(el.cid), 1);
  1350. return el;
  1351. }
  1352. });
  1353. for (var i = 0; i < noClassArray.length; i++) {
  1354. await this.getInviteCode(noClassArray[i]);
  1355. }
  1356. let a = this.inviteCode;
  1357. console.log(this.inviteCode);
  1358. this.addInviteCode();
  1359. }
  1360. this.groupInfo = "";
  1361. if (groupData.length) {
  1362. gp: for (var g = 0; g < groupData.length; g++) {
  1363. if (groupData[g].userid == this.userid) {
  1364. let gid = groupData[g].groupCid;
  1365. let groupA = JSON.parse(groupData[g].group).group;
  1366. for (var gA = 0; gA < groupA.length; gA++) {
  1367. if (groupA[gA].id == gid) {
  1368. this.groupInfo = {
  1369. name: groupA[gA].name,
  1370. };
  1371. break gp;
  1372. }
  1373. }
  1374. }
  1375. }
  1376. }
  1377. // debugger
  1378. },
  1379. addInviteCode() {
  1380. let params = [
  1381. {
  1382. courseId: this.id,
  1383. inviteCode: JSON.stringify(this.inviteCode),
  1384. },
  1385. ];
  1386. this.ajax
  1387. .post(this.$store.state.api + "addInviteCode", params)
  1388. .then((res) => {})
  1389. .catch((err) => {
  1390. console.error(err);
  1391. });
  1392. },
  1393. getCTwo() {
  1394. this.type = 1;
  1395. this.getCourseDetail2();
  1396. },
  1397. getCourseDetail2() {
  1398. const loading = this.$loading.service({
  1399. background: "rgba(255, 255, 255, 0.7)",
  1400. target: document.querySelector(".student_table"),
  1401. });
  1402. let params = {
  1403. courseId: this.id,
  1404. };
  1405. this.ajax
  1406. .get(this.$store.state.api + "selectCourseDetail", params)
  1407. .then((res) => {
  1408. loading.close();
  1409. // this.total = res.data[0].length > 0 ? res.data[0][0].num : 0;
  1410. this.courseDetail = res.data[0][0];
  1411. var a = res.data[0];
  1412. var b = res.data[1];
  1413. var c = res.data[2];
  1414. var d = res.data[3];
  1415. for (var i = 0; i < b.length; i++) {
  1416. // if (!this.id) {
  1417. // this.courseType[b[i].id] = [];
  1418. // }
  1419. for (var j = 0; j < a.length; j++) {
  1420. if (b[i].id == a[j].pid) {
  1421. if (!this.courseTypeJson[b[i].name]) {
  1422. this.courseType.push(b[i].name);
  1423. this.courseTypeJson[b[i].name] = [];
  1424. }
  1425. this.courseTypeJson[b[i].name].push(a[j].name);
  1426. }
  1427. }
  1428. }
  1429. this.Tname = [];
  1430. for (var k = 0; k < c.length; k++) {
  1431. this.Tname.push(c[k].name);
  1432. }
  1433. console.log(this.courseTypeJson.length);
  1434. this.aStudentName = res.data[2];
  1435. this.chapInfo = JSON.parse(this.courseDetail.chapters);
  1436. for (var z = 0; z < this.chapInfo.length; z++) {
  1437. this.rw += this.chapInfo[z].chapterInfo[0].taskJson.length;
  1438. }
  1439. let _chapters = JSON.parse(a[0].chapters);
  1440. let _works = res.data[3];
  1441. let _sCont = res.data[4];
  1442. let _comment = res.data[5];
  1443. let _chaptersJson = {
  1444. chapterState: _chapters,
  1445. state: {
  1446. stage: _chapters.length,
  1447. finish: 0,
  1448. learing: 0,
  1449. },
  1450. tool: [],
  1451. chapter: [],
  1452. time: {},
  1453. startTime: _works.length ? _works[0].time : "",
  1454. work: [],
  1455. studentCount: _sCont[0].usercount,
  1456. };
  1457. let timeAarry = [];
  1458. for (var j = 0; j < _works.length; j++) {
  1459. timeAarry.push(_works[j].vtime);
  1460. }
  1461. timeAarry.forEach((item) => {
  1462. _chaptersJson.time[item] = _chaptersJson.time[item] + 1 || 1;
  1463. });
  1464. for (var i = 0; i < _chapters.length; i++) {
  1465. _chaptersJson.chapterState[i].isFinsh = false;
  1466. // _chaptersJson.tool[i] = []
  1467. _chaptersJson.tool[i] = { array: [], name: _chapters[i].dyName };
  1468. _chaptersJson.chapter[i] = [];
  1469. _chaptersJson.work[i] = {
  1470. name: _chapters[i].dyName,
  1471. chapter: [],
  1472. time: "",
  1473. };
  1474. for (var j = 0; j < _works.length; j++) {
  1475. if (i == _works[j].stage) {
  1476. _chaptersJson.chapterState[i].isFinsh = true;
  1477. _chaptersJson.work[i].time = _works[j].time;
  1478. _chaptersJson.state.finish++;
  1479. break;
  1480. }
  1481. }
  1482. let el = _chapters[i].chapterInfo[0].taskJson;
  1483. for (var z = 0; z < el.length; z++) {
  1484. // _chaptersJson.tool[i][z] = [];
  1485. _chaptersJson.tool[i].array[z] = { array: [], name: el[z].task };
  1486. _chaptersJson.chapter[i][z] = [];
  1487. _chaptersJson.work[i].chapter[z] = {
  1488. name: el[z].task,
  1489. task: [],
  1490. isWork: false,
  1491. };
  1492. if (d.length > 0) {
  1493. _chaptersJson.work[i].chapter[z].isWork = true;
  1494. }
  1495. _chaptersJson.work[i].is = false;
  1496. let tools = el[z].toolChoose;
  1497. for (var k = 0; k < tools.length; k++) {
  1498. _chaptersJson.work[i].chapter[z].task[k] = {
  1499. tool: tools[k].tool[0],
  1500. works: [],
  1501. likeCount: 0,
  1502. commentCount: 0,
  1503. score: 0,
  1504. isScore: 0,
  1505. };
  1506. for (var j = 0; j < _works.length; j++) {
  1507. if (
  1508. i == _works[j].stage &&
  1509. z == _works[j].task &&
  1510. k == _works[j].tool
  1511. ) {
  1512. _chaptersJson.work[i].chapter[z].task[k].works.push(
  1513. _works[j]
  1514. );
  1515. if (_works[j].score) {
  1516. _chaptersJson.work[i].chapter[z].task[k].score +=
  1517. JSON.parse(_works[j].score).wScore;
  1518. _chaptersJson.work[i].chapter[z].task[k].isScore++;
  1519. }
  1520. }
  1521. }
  1522. for (var j = 0; j < _comment.length; j++) {
  1523. if (
  1524. i == _comment[j].stage &&
  1525. z == _comment[j].task &&
  1526. k == _comment[j].tool
  1527. ) {
  1528. if (_comment[j].cType == 1) {
  1529. _chaptersJson.work[i].chapter[z].task[k].likeCount++;
  1530. }
  1531. if (_comment[j].cType == 2) {
  1532. _chaptersJson.work[i].chapter[z].task[k].commentCount++;
  1533. }
  1534. }
  1535. }
  1536. // if (_chaptersJson.chapter[i][z].indexOf(tools[k].tool[0]) == -1) {
  1537. // _chaptersJson.tool[i][z].push(tools[k].tool[0])
  1538. // }
  1539. _chaptersJson.chapter[i][z][k] = { tool: tools[k].tool[0] };
  1540. // _chaptersJson.tool[i][z][k] = { tool: tools[k].tool[0] };
  1541. _chaptersJson.tool[i].array[z].array[k] = {
  1542. tool: tools[k].tool[0],
  1543. };
  1544. }
  1545. }
  1546. }
  1547. _chaptersJson.state.learing =
  1548. _chaptersJson.state.stage - _chaptersJson.state.finish;
  1549. this.chaptersJson = _chaptersJson;
  1550. // debugger
  1551. })
  1552. .catch((err) => {
  1553. loading.close();
  1554. console.error(err);
  1555. });
  1556. },
  1557. getGroup() {
  1558. this.getCourseDetail1();
  1559. },
  1560. getUser() {
  1561. let params = { uid: this.userid };
  1562. this.ajax
  1563. .get(this.$store.state.api + "getUser", params)
  1564. .then((res) => {
  1565. this.userinfo = res.data[0][0];
  1566. })
  1567. .catch((err) => {
  1568. console.error(err);
  1569. });
  1570. },
  1571. // getSName() {
  1572. // let params = {
  1573. // uid: JSON.stringify(this.courseDetail.course_student),
  1574. // };
  1575. // this.ajax
  1576. // .get(this.$store.state.api + "selectSName", params)
  1577. // .then((res) => {
  1578. // this.aStudentName = res.data[0];
  1579. // })
  1580. // .catch((err) => {
  1581. // console.error(err);
  1582. // });
  1583. // },
  1584. async getInviteCode(cid) {
  1585. let code = this.randomNumber();
  1586. // let params = {
  1587. // code: code,
  1588. // oid: this.oid,
  1589. // }
  1590. // let type = 1
  1591. // for (var i = 0; i < this.inviteCode.length; i++) {
  1592. // if (this.inviteCode[i].cid != cid && code == this.inviteCode[i].ic) {
  1593. // type = 2
  1594. // }
  1595. // }
  1596. // if (type == 2) {
  1597. // this.getInviteCode(cid)
  1598. // return;
  1599. // }
  1600. // const res = await this.ajax.get(this.$store.state.api + "selectInviteCode2", params)
  1601. // if (res.data.length && res.data[0].length && res.data[0][0].courseId != this.cid) {
  1602. // this.getInviteCode(cid)
  1603. // return;
  1604. // }
  1605. let array = [];
  1606. for (var i = 0; i < this.inviteCode.length; i++) {
  1607. array.push(this.inviteCode[i].cid);
  1608. }
  1609. if (array.indexOf(cid) != -1) {
  1610. this.inviteCode[array.indexOf(cid)].ic = code;
  1611. } else {
  1612. this.inviteCode.push({ cid: cid, ic: code });
  1613. }
  1614. },
  1615. randomNumber() {
  1616. // 随机生成两位数
  1617. // let num = Math.floor(Math.random() * 900) + 100;
  1618. // 生成 0 到 99 之间的随机整数
  1619. const randomNumber = Math.floor(Math.random() * 100);
  1620. // 如果随机数小于 10,补上前导零
  1621. const num =
  1622. randomNumber < 10 ? "0" + randomNumber : randomNumber.toString();
  1623. // 随机生成两个大写字母
  1624. let letters = "";
  1625. let chars2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
  1626. for (let i = 0; i < 3; i++) {
  1627. letters += chars2.charAt(Math.floor(Math.random() * chars2.length));
  1628. }
  1629. // 随机生成两位数字和字母的组合
  1630. let mix = "";
  1631. let chars =
  1632. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
  1633. for (let i = 0; i < 3; i++) {
  1634. let char = chars.charAt(Math.floor(Math.random() * chars.length));
  1635. mix += char;
  1636. }
  1637. // 随机选择一种类型
  1638. let type = Math.floor(Math.random() * 3);
  1639. return num;
  1640. // 根据类型输出结果
  1641. switch (type) {
  1642. case 0:
  1643. console.log(num); // 输出两位数
  1644. return num;
  1645. case 1:
  1646. console.log(letters); // 输出两个大写字母
  1647. return letters;
  1648. case 2:
  1649. console.log(mix); // 输出两位数字和字母的组合
  1650. return mix;
  1651. }
  1652. },
  1653. },
  1654. created() {
  1655. // if(this.tType == 1 || this.tType == 4){
  1656. // this.getCourseDetail2();
  1657. // }else{
  1658. // this.getCourseDetail1();
  1659. // }
  1660. this.getCourseDetail1();
  1661. this.getUser();
  1662. document.scrollingElement.scrollTop = 0;
  1663. // this.getSName();
  1664. },
  1665. };
  1666. </script>
  1667. <style scoped>
  1668. @media screen and (max-width: 1024px) {
  1669. /* .Tname {
  1670. width: 500px;
  1671. white-space: nowrap;
  1672. overflow: hidden;
  1673. text-overflow: ellipsis;
  1674. } */
  1675. }
  1676. .body_student {
  1677. margin: 10px auto;
  1678. width: 98%;
  1679. height: 100%;
  1680. }
  1681. .student_head {
  1682. width: 100%;
  1683. background: #fff;
  1684. height: 30%;
  1685. position: relative;
  1686. }
  1687. .returnIndexImg {
  1688. width: 18px;
  1689. margin: 0 7px 0 0;
  1690. height: auto;
  1691. box-sizing: border-box;
  1692. display: flex;
  1693. align-items: center;
  1694. }
  1695. .returnIndexImg > img {
  1696. width: 100%;
  1697. }
  1698. .wheel {
  1699. width: 250px;
  1700. max-height: 146px;
  1701. display: flex;
  1702. align-items: center;
  1703. }
  1704. .man {
  1705. width: 16px;
  1706. height: 16px;
  1707. }
  1708. .wheel > img,
  1709. .man > img {
  1710. width: 100%;
  1711. height: 100%;
  1712. }
  1713. .box_course {
  1714. display: flex;
  1715. padding: 25px 0 20px 60px;
  1716. }
  1717. .right_box {
  1718. display: flex;
  1719. flex-direction: column;
  1720. margin-left: 30px;
  1721. align-items: flex-start;
  1722. width: calc(100% - 350px);
  1723. }
  1724. .right_box_title {
  1725. font-size: 20px;
  1726. font-weight: bold;
  1727. max-width: calc(100% - 190px);
  1728. white-space: nowrap;
  1729. overflow: hidden;
  1730. text-overflow: ellipsis;
  1731. }
  1732. .people {
  1733. display: flex;
  1734. margin-top: 20px;
  1735. }
  1736. .person {
  1737. margin-left: 10px;
  1738. /* line-height: 18px; */
  1739. }
  1740. .btnBox {
  1741. display: flex;
  1742. margin-top: 20px;
  1743. }
  1744. .now_study {
  1745. width: 136px;
  1746. height: 36px;
  1747. color: #717c8d;
  1748. background: #f0f4fa;
  1749. text-align: center;
  1750. line-height: 36px;
  1751. border-radius: 5px;
  1752. font-size: 13px;
  1753. cursor: pointer;
  1754. display: flex;
  1755. flex-direction: row;
  1756. flex-wrap: nowrap;
  1757. align-items: center;
  1758. justify-content: center;
  1759. }
  1760. .now_study + .now_study {
  1761. margin-left: 10px;
  1762. }
  1763. .goToStudy {
  1764. width: 120px;
  1765. height: 45px;
  1766. background: #3681fc;
  1767. border-radius: 8px;
  1768. color: #fff;
  1769. display: flex;
  1770. flex-direction: row;
  1771. flex-wrap: nowrap;
  1772. align-items: center;
  1773. justify-content: center;
  1774. position: absolute;
  1775. right: 25px;
  1776. bottom: 25px;
  1777. font-size: 16px;
  1778. cursor: pointer;
  1779. }
  1780. .now_group {
  1781. height: 35px;
  1782. font-size: 14px;
  1783. line-height: 35px;
  1784. margin-left: 32px;
  1785. }
  1786. .now_group > span:nth-child(1) {
  1787. color: rgb(108, 108, 108);
  1788. }
  1789. .choose_who {
  1790. display: flex;
  1791. margin: 15px 0 0 25px;
  1792. }
  1793. .who_choose {
  1794. height: 28px;
  1795. cursor: pointer;
  1796. }
  1797. .choose_who > div:nth-child(2) {
  1798. margin-left: 35px;
  1799. }
  1800. .choose {
  1801. border-bottom: 5px solid #4a9eed;
  1802. color: #4a9eed;
  1803. }
  1804. .student_body {
  1805. display: flex;
  1806. }
  1807. .student_body,
  1808. .right {
  1809. width: 100%;
  1810. margin: 10px auto;
  1811. min-height: 688px;
  1812. }
  1813. .nav {
  1814. margin: auto 25px;
  1815. width: 80%;
  1816. padding-top: 5px;
  1817. text-indent: 25px;
  1818. }
  1819. .pic {
  1820. width: 100%;
  1821. display: flex;
  1822. flex-direction: row;
  1823. flex-wrap: wrap;
  1824. height: 100%;
  1825. justify-content: space-evenly;
  1826. }
  1827. .Img {
  1828. /*width: 30%; */
  1829. width: 300px;
  1830. margin: 20px 50px;
  1831. margin: 20px 10px;
  1832. border: 1px solid #dbdbdb;
  1833. border-radius: 5px;
  1834. overflow: hidden;
  1835. }
  1836. .Img > img {
  1837. width: 100%;
  1838. height: 100%;
  1839. }
  1840. .student_body_one,
  1841. .right_one {
  1842. width: 100%;
  1843. margin: 0 auto;
  1844. background: #fff;
  1845. margin-top: 10px;
  1846. min-height: 688px;
  1847. }
  1848. .student {
  1849. width: 85%;
  1850. display: flex;
  1851. flex-direction: row;
  1852. flex-wrap: wrap;
  1853. justify-content: flex-start;
  1854. margin: auto 10px;
  1855. }
  1856. .student > div {
  1857. width: 12%;
  1858. height: 35px;
  1859. background: #e3759a;
  1860. text-align: center;
  1861. border: 1px solid #e3759a;
  1862. border-radius: 5px;
  1863. color: #fff;
  1864. line-height: 35px;
  1865. margin: 10px;
  1866. }
  1867. .dialog_change >>> .el-dialog {
  1868. border-radius: 5px;
  1869. }
  1870. .dialog_change >>> .el-dialog__header {
  1871. background: #303030;
  1872. height: 36px;
  1873. line-height: 36px;
  1874. padding-left: 10px;
  1875. padding: 0px 10px 0px;
  1876. }
  1877. .dialog_change >>> .el-dialog__headerbtn {
  1878. top: 10px !important;
  1879. right: 10px !important;
  1880. }
  1881. .dialog_change >>> .el-dialog__title {
  1882. color: #fff;
  1883. font-size: 14px;
  1884. line-height: 5px;
  1885. }
  1886. .dialog_change >>> .el-dialog__body {
  1887. background: #f5f5f5;
  1888. }
  1889. .blue_box {
  1890. align-items: center;
  1891. display: flex;
  1892. flex-direction: column;
  1893. justify-content: center;
  1894. }
  1895. .blue_box,
  1896. .blue_box_one {
  1897. width: 30%;
  1898. height: 100px;
  1899. text-align: center;
  1900. color: #fff;
  1901. background-image: linear-gradient(90deg, #477cd7, #65b9fc);
  1902. border-radius: 15px;
  1903. margin: 15px 0 15px 15px;
  1904. cursor: pointer;
  1905. }
  1906. .courseItem {
  1907. width: 299px;
  1908. height: 70px;
  1909. background: #f0f4fa;
  1910. border-radius: 8px;
  1911. margin-right: 16px;
  1912. margin-bottom: 16px;
  1913. display: flex;
  1914. flex-direction: row;
  1915. flex-wrap: nowrap;
  1916. align-items: flex-start;
  1917. justify-content: center;
  1918. padding-top: 20px;
  1919. cursor: pointer;
  1920. }
  1921. .jdAndTask {
  1922. display: flex;
  1923. flex-direction: column;
  1924. flex-wrap: nowrap;
  1925. justify-content: center;
  1926. align-items: flex-start;
  1927. }
  1928. .jdAndTask > div:nth-child(1) {
  1929. font-size: 18px;
  1930. font-weight: bold;
  1931. color: #0e1e33;
  1932. margin-bottom: 10px;
  1933. }
  1934. .jdAndTask > div:nth-child(2) {
  1935. font-size: 14px;
  1936. font-weight: 400;
  1937. color: #717c8d;
  1938. max-width: 180px;
  1939. white-space: nowrap;
  1940. overflow: hidden;
  1941. text-overflow: ellipsis;
  1942. word-break: break-word;
  1943. width: 180px;
  1944. }
  1945. .blue_box_one {
  1946. width: 200px;
  1947. height: 200px;
  1948. background-image: linear-gradient(90deg, #477cd7, #65b9fc);
  1949. display: flex;
  1950. flex-direction: column;
  1951. flex-wrap: nowrap;
  1952. align-items: center;
  1953. justify-content: center;
  1954. }
  1955. .blue_box_one > div {
  1956. margin: 5px 0;
  1957. }
  1958. .blue_box_one > div:nth-child(1) {
  1959. font-size: 20px;
  1960. font-weight: bold;
  1961. }
  1962. .blue_box > div:nth-child(2) {
  1963. margin-top: 10px;
  1964. }
  1965. .blue_box_one > div:nth-child(2) {
  1966. white-space: nowrap;
  1967. text-overflow: ellipsis;
  1968. overflow: hidden;
  1969. word-break: break-all;
  1970. width: 100%;
  1971. text-align: center;
  1972. max-width: calc(100% - 85px);
  1973. margin: 0 auto;
  1974. }
  1975. .return {
  1976. background: #f0f4fa;
  1977. width: 75px;
  1978. height: 36px;
  1979. color: #717c8d;
  1980. text-align: center;
  1981. line-height: 36px;
  1982. margin-right: 20px;
  1983. cursor: pointer;
  1984. border-radius: 5px;
  1985. position: absolute;
  1986. right: 10px;
  1987. top: 24px;
  1988. font-size: 14px;
  1989. display: flex;
  1990. flex-direction: row;
  1991. flex-wrap: nowrap;
  1992. justify-content: center;
  1993. align-items: center;
  1994. }
  1995. .return > img {
  1996. width: 100%;
  1997. height: 100%;
  1998. }
  1999. .cType {
  2000. display: flex;
  2001. flex-direction: row;
  2002. justify-content: center;
  2003. align-items: center;
  2004. margin-top: 20px;
  2005. }
  2006. .cType > div > span {
  2007. font-weight: 400;
  2008. color: #717c8d;
  2009. }
  2010. .type_children + .type_children {
  2011. margin-left: 10px;
  2012. }
  2013. .all_choose {
  2014. margin-right: 10px;
  2015. max-width: 250px;
  2016. white-space: nowrap;
  2017. overflow: hidden;
  2018. text-overflow: ellipsis;
  2019. }
  2020. .rightT {
  2021. display: flex;
  2022. flex-direction: row;
  2023. flex-wrap: nowrap;
  2024. align-items: center;
  2025. width: calc(100% - 20px);
  2026. }
  2027. .jd {
  2028. background: #e0eafb;
  2029. margin-left: 12px;
  2030. border-radius: 4px;
  2031. font-size: 14px;
  2032. color: #3681fc;
  2033. width: 90px;
  2034. height: 28px;
  2035. text-align: center;
  2036. line-height: 28px;
  2037. }
  2038. .sLeft {
  2039. width: 19%;
  2040. margin-right: 10px;
  2041. background: rgb(255, 255, 255);
  2042. padding: 20px 20px 0 20px;
  2043. box-sizing: border-box;
  2044. border-radius: 12px;
  2045. }
  2046. .courseT {
  2047. border-left: 3px solid #3681fc;
  2048. padding-left: 5px;
  2049. font-weight: bold;
  2050. }
  2051. .courseTd {
  2052. padding-top: 15px;
  2053. height: 700px;
  2054. overflow: auto;
  2055. word-break: break-word;
  2056. }
  2057. .courseTd::-webkit-scrollbar {
  2058. /*滚动条整体样式*/
  2059. width: 6px;
  2060. /*高宽分别对应横竖滚动条的尺寸*/
  2061. height: 6px;
  2062. }
  2063. /*定义滚动条轨道 内阴影+圆角*/
  2064. .courseTd::-webkit-scrollbar {
  2065. border-radius: 10px;
  2066. background-color: #eee;
  2067. }
  2068. /*定义滑块 内阴影+圆角*/
  2069. .courseTd::-webkit-scrollbar-thumb {
  2070. border-radius: 10px;
  2071. -webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.3);
  2072. background-color: rgba(0, 0, 0, 0.1);
  2073. }
  2074. .rightTd,
  2075. .noBRight {
  2076. width: calc(100% - 19% - 10px);
  2077. background: #fff;
  2078. display: flex;
  2079. flex-direction: row;
  2080. flex-wrap: wrap;
  2081. align-content: flex-start;
  2082. align-items: center;
  2083. justify-content: flex-start;
  2084. border-radius: 12px;
  2085. padding-left: 17px;
  2086. }
  2087. .rightTd:nth-child(5n),
  2088. .noBRight:nth-child(5n) {
  2089. margin-right: 0;
  2090. }
  2091. .noBRight {
  2092. width: 100%;
  2093. }
  2094. .Tname {
  2095. word-break: break-all;
  2096. width: auto;
  2097. /* overflow: hidden;
  2098. white-space: nowrap;
  2099. text-overflow: ellipsis; */
  2100. }
  2101. /* .TnameC{
  2102. width:auto;
  2103. overflow: unset;
  2104. white-space: unset;
  2105. text-overflow: unset;
  2106. } */
  2107. .Tname > span {
  2108. cursor: pointer;
  2109. color: #1463eb;
  2110. margin-left: 10px;
  2111. }
  2112. .detail {
  2113. width: 100%;
  2114. padding: 15px;
  2115. box-sizing: border-box;
  2116. }
  2117. .statebox {
  2118. display: flex;
  2119. align-items: center;
  2120. box-sizing: border-box;
  2121. margin-left: 30px;
  2122. }
  2123. .statebox div {
  2124. padding: 10px 20px;
  2125. border-radius: 5px;
  2126. background: #fff;
  2127. display: flex;
  2128. align-items: center;
  2129. height: 46px;
  2130. line-height: 46px;
  2131. box-sizing: border-box;
  2132. }
  2133. .statebox div + div {
  2134. margin-left: 20px;
  2135. }
  2136. .statebox div span {
  2137. font-size: 16px;
  2138. display: flex;
  2139. align-items: center;
  2140. }
  2141. .statebox div span + span {
  2142. margin-left: 10px;
  2143. color: #1463eb;
  2144. }
  2145. .p_tool_box {
  2146. display: flex;
  2147. flex-wrap: wrap;
  2148. /* color: #fff; */
  2149. padding: 0 15px 10px;
  2150. align-items: center;
  2151. justify-content: space-evenly;
  2152. border-radius: 5px;
  2153. height: 200px;
  2154. overflow: auto;
  2155. max-width: 150px;
  2156. }
  2157. .p_tool {
  2158. display: flex;
  2159. margin-top: 10px;
  2160. }
  2161. .p_tool > div {
  2162. display: flex;
  2163. flex-direction: column;
  2164. align-items: center;
  2165. min-width: 60px;
  2166. }
  2167. .p_tool > div img {
  2168. width: 50px;
  2169. height: 50px;
  2170. }
  2171. .p_tool > div > div {
  2172. margin-top: 5px;
  2173. font-size: 12px;
  2174. }
  2175. .p_tool_box2 {
  2176. padding: 10px 15px;
  2177. }
  2178. .p_tool2 {
  2179. margin-right: 20px;
  2180. display: flex;
  2181. flex-direction: column;
  2182. align-items: flex-start;
  2183. /* margin-bottom: 10px; */
  2184. }
  2185. .p_tool2 > div:nth-child(1) {
  2186. margin-bottom: 10px;
  2187. }
  2188. .toolBigBox {
  2189. display: flex;
  2190. flex-direction: column;
  2191. }
  2192. .toolSta {
  2193. display: flex;
  2194. margin: 20px 0 0;
  2195. }
  2196. .toolSta > div {
  2197. display: flex;
  2198. }
  2199. .toolSta > div + div {
  2200. margin-left: 50px;
  2201. }
  2202. .toolSta > div > div:nth-child(1) {
  2203. margin: 10px 10px 0 0;
  2204. }
  2205. .blueBtn {
  2206. background: rgb(79, 140, 223);
  2207. color: #fff;
  2208. display: flex;
  2209. padding: 10px 15px;
  2210. /* min-width: 150px; */
  2211. min-width: 165px;
  2212. font-size: 16px;
  2213. align-items: center;
  2214. border-radius: 5px;
  2215. }
  2216. .toolSta > div > div:nth-child(2) > div + div {
  2217. margin-top: 10px;
  2218. }
  2219. .toolSta > div > div:nth-child(2) > div > div + div {
  2220. margin: 0 20px;
  2221. }
  2222. .p_tool2 .toolbox {
  2223. display: flex;
  2224. align-items: center;
  2225. margin-top: 10px;
  2226. }
  2227. .p_tool2 .toolbox > div {
  2228. font-size: 16px;
  2229. font-weight: bold;
  2230. }
  2231. .checkBox {
  2232. display: flex;
  2233. padding: 20px 0 0 20px;
  2234. box-sizing: border-box;
  2235. width: 100%;
  2236. }
  2237. .checkBox span {
  2238. padding: 0 5px 5px;
  2239. cursor: pointer;
  2240. font-size: 18px;
  2241. font-weight: 400;
  2242. }
  2243. .checkBox span + span {
  2244. margin-left: 20px;
  2245. }
  2246. .checkBox .active {
  2247. border-bottom: 3px solid #3681fc;
  2248. color: #3681fc;
  2249. font-weight: bold;
  2250. }
  2251. .detail_box {
  2252. background-color: #f0f4fa;
  2253. padding: 15px 20px;
  2254. box-sizing: border-box;
  2255. width: 100%;
  2256. border-radius: 12px;
  2257. }
  2258. .detail_box + .detail_box {
  2259. margin-top: 20px;
  2260. }
  2261. .detail_box .title {
  2262. display: flex;
  2263. align-items: center;
  2264. }
  2265. .detail_box .title > span:nth-child(1) {
  2266. font-size: 18px;
  2267. display: flex;
  2268. align-items: center;
  2269. font-weight: 400;
  2270. color: #0e1e33;
  2271. }
  2272. .detail_box .box {
  2273. margin-top: 20px;
  2274. border-radius: 5px;
  2275. /* width: 100%; */
  2276. box-sizing: border-box;
  2277. overflow: auto;
  2278. }
  2279. .progress {
  2280. display: -webkit-box;
  2281. display: -ms-flexbox;
  2282. width: 100%;
  2283. overflow: auto;
  2284. }
  2285. .chapter {
  2286. margin-right: 30px;
  2287. min-width: 180px;
  2288. background-color: #fff;
  2289. border-radius: 12px;
  2290. }
  2291. .chapter + .chapter {
  2292. padding-left: 10px;
  2293. border-left: 1px solid rgb(220, 220, 220);
  2294. }
  2295. .chapter .stage {
  2296. width: 100%;
  2297. color: #fff;
  2298. background: linear-gradient(90deg, #477cd7, #65b9fc);
  2299. border-radius: 5px;
  2300. height: 50px;
  2301. line-height: 50px;
  2302. font-size: 18px;
  2303. text-align: center;
  2304. min-width: 180px;
  2305. }
  2306. .chapter .task {
  2307. display: flex;
  2308. width: 100%;
  2309. min-width: 180px;
  2310. padding-top: 15px;
  2311. }
  2312. .chapter .task .taskBox {
  2313. min-width: 180px;
  2314. height: 100%;
  2315. }
  2316. .borderRight {
  2317. border-right: 1px solid #eceef7;
  2318. }
  2319. .chapter .task .taskBox + .taskBox {
  2320. margin-left: 10px;
  2321. }
  2322. .chapter .task .taskBox .taskName {
  2323. text-align: center;
  2324. margin: 10px 0 10px 10px;
  2325. display: flex;
  2326. flex-direction: row;
  2327. flex-wrap: nowrap;
  2328. align-items: center;
  2329. min-width: 180px;
  2330. width: 100%;
  2331. }
  2332. /* .toolIcon::before {
  2333. content: "";
  2334. width: 26px;
  2335. height: 26px;
  2336. display: inline-block;
  2337. background-image: url(../assets/icon/toolion.png);
  2338. background-size: 100% 100%;
  2339. }
  2340. .toolIcon::before {
  2341. content: "";
  2342. width: 26px;
  2343. height: 26px;
  2344. display: inline-block;
  2345. background-image: url(../assets/icon/toolion.png);
  2346. background-size: 100% 100%;
  2347. }
  2348. .taskIcon::before {
  2349. content: "";
  2350. width: 26px;
  2351. height: 26px;
  2352. display: inline-block;
  2353. background-image: url(../assets/icon/task.png);
  2354. background-size: 100% 100%;
  2355. }
  2356. .finishIcon::before {
  2357. content: "";
  2358. width: 26px;
  2359. height: 26px;
  2360. display: inline-block;
  2361. background-image: url(../assets/icon/finish.png);
  2362. background-size: 100% 100%;
  2363. } */
  2364. .learningIcon {
  2365. color: #fe9999;
  2366. }
  2367. /* .learningIcon::before {
  2368. content: "";
  2369. width: 22px;
  2370. height: 22px;
  2371. display: inline-block;
  2372. background-image: url(../assets/icon/learning.png);
  2373. background-size: 100% 100%;
  2374. }
  2375. .frequencyIcon::before {
  2376. content: "";
  2377. width: 26px;
  2378. height: 26px;
  2379. display: inline-block;
  2380. background-image: url(../assets/icon/frequency.png);
  2381. background-size: 100% 100%;
  2382. }
  2383. .timeIcon::before {
  2384. content: "";
  2385. width: 26px;
  2386. height: 26px;
  2387. display: inline-block;
  2388. background-image: url(../assets/icon/time.png);
  2389. background-size: 100% 100%;
  2390. } */
  2391. .chapter_time_box {
  2392. border-left: 5px solid #f0f0f0;
  2393. padding: 0 30px;
  2394. box-sizing: border-box;
  2395. margin-top: 35px;
  2396. }
  2397. .c_box {
  2398. padding-top: 40px;
  2399. position: relative;
  2400. margin-top: 45px;
  2401. }
  2402. .c_box .stage_box {
  2403. display: flex;
  2404. align-items: center;
  2405. position: absolute;
  2406. top: -20px;
  2407. left: -45px;
  2408. }
  2409. .c_box .stage_box .yuan {
  2410. width: 25px;
  2411. height: 25px;
  2412. background: rgb(244, 244, 244);
  2413. border-radius: 25px;
  2414. display: flex;
  2415. align-items: center;
  2416. justify-content: center;
  2417. margin-right: 10px;
  2418. }
  2419. .c_box .stage_box .yuan::before {
  2420. content: "";
  2421. width: 15px;
  2422. height: 15px;
  2423. background: rgb(59, 149, 238);
  2424. border-radius: 25px;
  2425. }
  2426. .c_box .stage_box .stage {
  2427. background: linear-gradient(90deg, #477cd7, #65b9fc);
  2428. border-radius: 5px;
  2429. height: 50px;
  2430. line-height: 50px;
  2431. font-size: 18px;
  2432. color: #fff;
  2433. width: fit-content;
  2434. padding: 0 20px;
  2435. }
  2436. .s_up {
  2437. cursor: pointer;
  2438. transition: all 0.5s;
  2439. }
  2440. .s_up img {
  2441. width: 35px;
  2442. }
  2443. .s_up2 {
  2444. transform: rotate(90deg);
  2445. }
  2446. .lineBox {
  2447. width: 5px;
  2448. height: 20px;
  2449. background-image: linear-gradient(180deg, #3c65ba, #a1c6ec);
  2450. margin-right: 5px;
  2451. }
  2452. .disCss {
  2453. display: flex;
  2454. flex-direction: row;
  2455. flex-wrap: nowrap;
  2456. align-items: center;
  2457. }
  2458. .disCss > div {
  2459. margin: 10px 10px 0 0;
  2460. }
  2461. .titleCss {
  2462. max-width: 100px;
  2463. white-space: nowrap;
  2464. overflow: hidden;
  2465. text-overflow: ellipsis;
  2466. word-break: break-word;
  2467. margin-left: 10px;
  2468. font-size: 16px;
  2469. font-weight: bold;
  2470. color: #0e1e33;
  2471. }
  2472. .navIndex {
  2473. font-weight: bold;
  2474. color: #0e1e33;
  2475. font-size: 14px;
  2476. }
  2477. .stageCss {
  2478. cursor: pointer;
  2479. display: flex;
  2480. flex-direction: row;
  2481. flex-wrap: nowrap;
  2482. justify-content: center;
  2483. align-items: center;
  2484. border-bottom: 1px solid #e7ebf1;
  2485. }
  2486. .disabled {
  2487. background: rgba(210, 210, 210, 1);
  2488. }
  2489. .teaClass {
  2490. display: flex;
  2491. flex-direction: row;
  2492. flex-wrap: nowrap;
  2493. align-items: center;
  2494. }
  2495. .teaClass > div:nth-child(1) {
  2496. min-width: 90px;
  2497. }
  2498. .diy_sk >>> .el-dialog {
  2499. box-shadow: 0px 0px 12px 1px rgba(0, 0, 0, 0.16);
  2500. border-radius: 18px 18px 18px 18px;
  2501. }
  2502. .diy_sk >>> .el-dialog__title {
  2503. font-size: 16px;
  2504. font-weight: bold;
  2505. color: #0e1e33;
  2506. }
  2507. .diy_sk >>> .el-dialog__body {
  2508. padding: 0 20px 15px 20px;
  2509. }
  2510. .classBox {
  2511. display: flex;
  2512. flex-direction: row;
  2513. flex-wrap: wrap;
  2514. justify-content: flex-start;
  2515. align-items: flex-start;
  2516. min-height: 300px;
  2517. }
  2518. .classBox > div {
  2519. width: 106px;
  2520. height: 32px;
  2521. background: #f0f4fa;
  2522. border-radius: 4px;
  2523. font-weight: 400;
  2524. color: #717c8d;
  2525. font-size: 14px;
  2526. text-align: center;
  2527. line-height: 32px;
  2528. margin: 0 8px 8px 0;
  2529. cursor: pointer;
  2530. }
  2531. .cancelDiy {
  2532. width: 102px;
  2533. height: 36px;
  2534. background: #e7ebf1;
  2535. border-radius: 4px;
  2536. font-size: 14px;
  2537. font-weight: 400;
  2538. color: #717c8d;
  2539. text-align: center;
  2540. line-height: 32px;
  2541. margin: 0 auto;
  2542. cursor: pointer;
  2543. }
  2544. </style>