courseDetail.vue 94 KB

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