courseDetail.vue 25 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162
  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 v-if="screenType != 2 && screenType != '2studio'" class="return" @click.stop="
  7. goTo(
  8. '/studioIndex?userid=' +
  9. userid +
  10. '&oid=' +
  11. oid +
  12. '&org=' +
  13. org +
  14. '&cid=' +
  15. classId +
  16. '&tType=' +
  17. tType +
  18. '&role=' +
  19. role +
  20. '&screenType=' +
  21. screenType
  22. )
  23. ">
  24. 返回
  25. </div>
  26. <div class="box_course">
  27. <div class="wheel">
  28. <img style="object-fit: cover" :src="
  29. this.courseDetail.cover != null &&
  30. this.courseDetail.cover != ''
  31. ? JSON.parse(this.courseDetail.cover).length > 0
  32. ? JSON.parse(this.courseDetail.cover)[0].url
  33. : mr
  34. : mr
  35. " alt />
  36. </div>
  37. <div class="right_box">
  38. <div class="rightT">
  39. <div class="right_box_title">{{ courseDetail.title }}</div>
  40. <div class="jd">{{ chapInfo.length }}阶段</div>
  41. <div class="jd">{{ rw }}任务</div>
  42. </div>
  43. <div class="cType">
  44. <div class="all_choose" v-for="(item, index) in courseType" :key="index">
  45. <span style="color: #6c6c6c">{{ item + ":" }}</span>
  46. <span class="type_children" v-for="(item2, index2) in courseTypeJson[item]" :key="index2">{{ item2
  47. }}</span>
  48. </div>
  49. </div>
  50. <div class="cType" style="font-size: 18px; color: #6c6c6c">
  51. <div style="min-width:150px">
  52. 创建者:<span style="color: #000">{{
  53. courseDetail.username
  54. }}</span>
  55. </div>
  56. <div class="Tname" v-if="Tname.length > 0" @click="TnameCheck = !TnameCheck">
  57. 协同人员:<span v-for="(tname, tIndex) in TnameCheck ? Tname : Tname.slice(0,6)" :key="tIndex" style="margin: 0 5px; color: #000">{{ tname
  58. }}</span><span style="margin: 0 5px; color: #b2b2b2" v-if="!TnameCheck && Tname.length > 6">更多....</span>
  59. </div>
  60. </div>
  61. <div class="cType" style="font-size: 18px; color: #6c6c6c">
  62. </div>
  63. <!-- <div class="btnBox">
  64. <div class="now_study" @click="goToCongress">工作进展</div>
  65. </div> -->
  66. </div>
  67. </div>
  68. </div>
  69. <div class="student_body">
  70. <div class="sLeft" v-if="courseDetail.brief">
  71. <div class="courseT">课程详情</div>
  72. <div class="courseTd">{{ courseDetail.brief }}</div>
  73. </div>
  74. <div :class="courseDetail.brief != '' ? 'rightTd' : 'noBRight'">
  75. <div class="checkBox">
  76. <span :class="{ active: type == 1 }" @click="type = 1">阶段选择</span>
  77. <span :class="{ active: type == 2 }" @click="type = 2">项目进展</span>
  78. </div>
  79. <div :class="courseDetail.brief != '' ? 'rightTd' : 'noBRight'" v-show="type == 1">
  80. <div class="blue_box_one" v-for="(item, index) in chapInfo" :key="index" @click="addUserRate(index)">
  81. <div>第{{ index + 1 }}阶段</div>
  82. <div :title="item.dyName">{{ item.dyName }}</div>
  83. <div>{{ item.chapterInfo[0].taskJson.length }}个任务</div>
  84. </div>
  85. </div>
  86. <div :class="courseDetail.brief != '' ? 'rightTd' : 'noBRight'" v-if="type == 2">
  87. <courseProgress :cid="id" :userid="userid" :oid="oid" :org="org"></courseProgress>
  88. </div>
  89. </div>
  90. </div>
  91. <el-dialog title="阶段选择" :visible.sync="dialogVisible" :append-to-body="true" width="700px"
  92. :before-close="handleClose" class="dialog_change">
  93. <div style="font-size: 20px">请选择阶段</div>
  94. <div style="
  95. padding: 20px 30px;
  96. display: flex;
  97. flex-direction: row;
  98. flex-wrap: wrap;
  99. ">
  100. <div class="blue_box" v-for="(item, index) in chapInfo" :key="index" @click="addUserRate(index)">
  101. <div>第{{ index + 1 }}阶段</div>
  102. <div>{{ item.dyName }}</div>
  103. <div>{{ item.chapterInfo[0].taskJson.length }}个任务</div>
  104. </div>
  105. </div>
  106. </el-dialog>
  107. </div>
  108. </div>
  109. </div>
  110. </template>
  111. <script>
  112. import Heatmap from '../tools/heatmap.vue'
  113. import courseProgress from './courseProgress.vue'
  114. export default {
  115. components: {
  116. Heatmap,
  117. courseProgress
  118. },
  119. data() {
  120. return {
  121. choose: 0,
  122. dialogVisible: false,
  123. id: this.$route.query.courseId,
  124. userid: this.$route.query.userid,
  125. oid: this.$route.query.oid,
  126. org: this.$route.query.org,
  127. classId: this.$route.query.cid,
  128. tType: this.$route.query.tType,
  129. role: this.$route.query.role,
  130. screenType: this.$route.query.screenType,
  131. courseDetail: {},
  132. aStudentName: [],
  133. chapInfo: [],
  134. courseType: [],
  135. Tname: [],
  136. TnameCheck:false,
  137. courseTypeJson: {},
  138. userinfo: [],
  139. mr: "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/noBanner1656409780264.jpg",
  140. rw: 0,
  141. chaptersJson: {},
  142. type: 1,
  143. };
  144. },
  145. methods: {
  146. goToCongress(){
  147. window.location.href='https://pbl.cocorobo.cn/pbl-teacher-table/dist/#/studioCourseProgress?cid=' +
  148. this.id +
  149. '&userid=' +
  150. this.userid +
  151. '&oid=' +
  152. this.oid +
  153. '&org=' +
  154. this.org
  155. },
  156. handleClose(done) {
  157. done();
  158. },
  159. goTo(path) {
  160. this.$router.push(path);
  161. },
  162. addUserRate(i) {
  163. // var suid = this.userid;
  164. // if (
  165. // JSON.parse(this.courseDetail.course_student).indexOf(suid) == -1 &&
  166. // JSON.parse(this.courseDetail.userid) != suid
  167. // ) {
  168. // this.$message.error("你没有该权限");
  169. // return;
  170. // }
  171. // var a =
  172. // this.courseDetail.course_student != ""
  173. // ? JSON.parse(this.courseDetail.course_student)
  174. // : "";
  175. // if (this.courseDetail.userid != suid) {
  176. // if (this.userinfo.type == 2) {
  177. // if (a != "") {
  178. // if (
  179. // JSON.parse(this.courseDetail.course_student).indexOf(suid) == -1
  180. // ) {
  181. // this.$message.error("你没有该权限");
  182. // return;
  183. // }
  184. // } else {
  185. // this.$message.error("暂无项目学员,请联系老师添加项目学员!");
  186. // return;
  187. // }
  188. // }
  189. // }
  190. // let params = {
  191. // uid: this.userid,
  192. // cid: this.id,
  193. // };
  194. // this.ajax
  195. // .get(this.$store.state.api + "addUserR", params)
  196. // .then((res) => {
  197. // console.log(res.data);
  198. // this.updateVc();
  199. this.goTo(
  200. "/studyStudentStudio?type=" +
  201. i +
  202. "&courseId=" +
  203. this.id +
  204. "&userid=" +
  205. this.userid +
  206. "&oid=" +
  207. this.oid +
  208. "&org=" +
  209. this.org +
  210. "&cid=" +
  211. this.classId +
  212. '&role=' +
  213. this.role +
  214. "&tType=" +
  215. this.tType +
  216. "&screenType=" +
  217. this.screenType
  218. );
  219. // })
  220. // .catch((err) => {
  221. // console.error(err);
  222. // });
  223. },
  224. getCourseDetail() {
  225. const loading = this.$loading.service({
  226. background: "rgba(255, 255, 255, 0.7)",
  227. target: document.querySelector(".student_table"),
  228. });
  229. let params = {
  230. courseId: this.id,
  231. };
  232. this.ajax
  233. .get(this.$store.state.api + "selectStudioCourseDetail2", params)
  234. .then((res) => {
  235. loading.close();
  236. // this.total = res.data[0].length > 0 ? res.data[0][0].num : 0;
  237. this.courseDetail = res.data[0][0];
  238. var a = res.data[0];
  239. var b = res.data[1];
  240. var c = res.data[2];
  241. for (var i = 0; i < b.length; i++) {
  242. // if (!this.id) {
  243. // this.courseType[b[i].id] = [];
  244. // }
  245. for (var j = 0; j < a.length; j++) {
  246. if (b[i].id == a[j].pid) {
  247. if (!this.courseTypeJson[b[i].name]) {
  248. this.courseType.push(b[i].name);
  249. this.courseTypeJson[b[i].name] = [];
  250. }
  251. this.courseTypeJson[b[i].name].push(a[j].name);
  252. }
  253. }
  254. }
  255. for (var k = 0; k < c.length; k++) {
  256. this.Tname.push(c[k].name);
  257. }
  258. console.log(this.courseTypeJson.length);
  259. this.aStudentName = res.data[2];
  260. this.chapInfo = JSON.parse(this.courseDetail.chapters);
  261. for (var z = 0; z < this.chapInfo.length; z++) {
  262. this.rw += this.chapInfo[z].chapterInfo[0].taskJson.length;
  263. }
  264. let _chapters = JSON.parse(a[0].chapters)
  265. let _works = res.data[3];
  266. let _sCont = res.data[4];
  267. let _comment = res.data[5];
  268. let _chaptersJson = {
  269. chapterState: _chapters,
  270. state: {
  271. stage: _chapters.length,
  272. finish: 0,
  273. learing: 0,
  274. },
  275. tool: [],
  276. chapter: [],
  277. time: {},
  278. startTime: _works.length ? _works[0].time : '',
  279. work: [],
  280. studentCount: _sCont[0].usercount
  281. }
  282. let timeAarry = []
  283. for (var j = 0; j < _works.length; j++) {
  284. timeAarry.push(_works[j].vtime)
  285. }
  286. timeAarry.forEach(item => {
  287. _chaptersJson.time[item] = (_chaptersJson.time[item] + 1) || 1
  288. })
  289. for (var i = 0; i < _chapters.length; i++) {
  290. _chaptersJson.chapterState[i].isFinsh = false;
  291. _chaptersJson.tool[i] = []
  292. _chaptersJson.chapter[i] = []
  293. _chaptersJson.work[i] = { name: _chapters[i].dyName, chapter: [] }
  294. for (var j = 0; j < _works.length; j++) {
  295. if (i == _works[j].stage) {
  296. _chaptersJson.chapterState[i].isFinsh = true;
  297. _chaptersJson.state.finish++
  298. break;
  299. }
  300. }
  301. let el = _chapters[i].chapterInfo[0].taskJson;
  302. for (var z = 0; z < el.length; z++) {
  303. _chaptersJson.tool[i][z] = []
  304. _chaptersJson.chapter[i][z] = []
  305. _chaptersJson.work[i].chapter[z] = { name: el[z].task, task: [] }
  306. _chaptersJson.work[i].is = false;
  307. let tools = el[z].toolChoose
  308. for (var k = 0; k < tools.length; k++) {
  309. _chaptersJson.work[i].chapter[z].task[k] = { tool: tools[k].tool[0], works: [], likeCount: 0, commentCount: 0, score: 0, isScore: 0 }
  310. for (var j = 0; j < _works.length; j++) {
  311. if (i == _works[j].stage && z == _works[j].task && k == _works[j].tool) {
  312. _chaptersJson.work[i].chapter[z].task[k].works.push(_works[j])
  313. if (_works[j].score) {
  314. _chaptersJson.work[i].chapter[z].task[k].score += JSON.parse(_works[j].score).wScore
  315. _chaptersJson.work[i].chapter[z].task[k].isScore++
  316. }
  317. }
  318. }
  319. for (var j = 0; j < _comment.length; j++) {
  320. if (i == _comment[j].stage && z == _comment[j].task && k == _comment[j].tool) {
  321. if (_comment[j].cType == 1) {
  322. _chaptersJson.work[i].chapter[z].task[k].likeCount++
  323. }
  324. if (_comment[j].cType == 2) {
  325. _chaptersJson.work[i].chapter[z].task[k].commentCount++
  326. }
  327. }
  328. }
  329. // if (_chaptersJson.chapter[i][z].indexOf(tools[k].tool[0]) == -1) {
  330. // _chaptersJson.tool[i][z].push(tools[k].tool[0])
  331. // }
  332. _chaptersJson.chapter[i][z][k] = { tool: tools[k].tool[0] }
  333. _chaptersJson.tool[i][z][k] = { tool: tools[k].tool[0] }
  334. }
  335. }
  336. }
  337. _chaptersJson.state.learing = _chaptersJson.state.stage - _chaptersJson.state.finish
  338. this.chaptersJson = _chaptersJson
  339. // debugger
  340. })
  341. .catch((err) => {
  342. loading.close();
  343. console.error(err);
  344. });
  345. },
  346. getUser() {
  347. let params = { uid: this.userid };
  348. this.ajax
  349. .get(this.$store.state.api + "getUser", params)
  350. .then((res) => {
  351. this.userinfo = res.data[0][0];
  352. })
  353. .catch((err) => {
  354. console.error(err);
  355. });
  356. },
  357. // getSName() {
  358. // let params = {
  359. // uid: JSON.stringify(this.courseDetail.course_student),
  360. // };
  361. // this.ajax
  362. // .get(this.$store.state.api + "selectSName", params)
  363. // .then((res) => {
  364. // this.aStudentName = res.data[0];
  365. // })
  366. // .catch((err) => {
  367. // console.error(err);
  368. // });
  369. // },
  370. },
  371. created() {
  372. this.getCourseDetail();
  373. this.getUser();
  374. document.scrollingElement.scrollTop = 0;
  375. // this.getSName();
  376. },
  377. };
  378. </script>
  379. <style scoped>
  380. @media screen and (max-width: 1024px) {
  381. /* .Tname {
  382. width: 500px;
  383. white-space: nowrap;
  384. overflow: hidden;
  385. text-overflow: ellipsis;
  386. } */
  387. }
  388. .body_student {
  389. margin: 10px auto;
  390. width: 98%;
  391. height: 100%;
  392. }
  393. .student_head {
  394. width: 100%;
  395. background: #fff;
  396. height: 30%;
  397. position: relative;
  398. }
  399. .wheel {
  400. width: 250px;
  401. max-height: 146px;
  402. display: flex;
  403. align-items: center;
  404. }
  405. .man {
  406. width: 16px;
  407. height: 16px;
  408. }
  409. .wheel>img,
  410. .man>img {
  411. width: 100%;
  412. height: 100%;
  413. }
  414. .box_course {
  415. display: flex;
  416. padding: 25px 0 20px 60px;
  417. }
  418. .right_box {
  419. display: flex;
  420. flex-direction: column;
  421. margin-left: 30px;
  422. align-items: flex-start;
  423. width: calc(100% - 350px);
  424. }
  425. .right_box_title {
  426. font-size: 23px;
  427. max-width: calc(100% - 190px);
  428. white-space: nowrap;
  429. overflow: hidden;
  430. text-overflow: ellipsis;
  431. }
  432. .people {
  433. display: flex;
  434. margin-top: 20px;
  435. }
  436. .person {
  437. margin-left: 10px;
  438. /* line-height: 18px; */
  439. }
  440. .now_study {
  441. width: 150px;
  442. height: 35px;
  443. color: #fff;
  444. background: #4a9eed;
  445. text-align: center;
  446. line-height: 35px;
  447. border-radius: 5px;
  448. font-size: 13px;
  449. cursor: pointer;
  450. margin-top: 30px;
  451. }
  452. .choose_who {
  453. display: flex;
  454. margin: 15px 0 0 25px;
  455. }
  456. .who_choose {
  457. height: 28px;
  458. cursor: pointer;
  459. }
  460. .choose_who>div:nth-child(2) {
  461. margin-left: 35px;
  462. }
  463. .choose {
  464. border-bottom: 5px solid #4a9eed;
  465. color: #4a9eed;
  466. }
  467. .student_body {
  468. display: flex;
  469. }
  470. .student_body,
  471. .right {
  472. width: 100%;
  473. margin: 10px auto;
  474. min-height: 688px;
  475. }
  476. .nav {
  477. margin: auto 25px;
  478. width: 80%;
  479. padding-top: 5px;
  480. text-indent: 25px;
  481. }
  482. .pic {
  483. width: 100%;
  484. display: flex;
  485. flex-direction: row;
  486. flex-wrap: wrap;
  487. height: 100%;
  488. justify-content: space-evenly;
  489. }
  490. .Img {
  491. /*width: 30%; */
  492. width: 300px;
  493. margin: 20px 50px;
  494. margin: 20px 10px;
  495. border: 1px solid #dbdbdb;
  496. border-radius: 5px;
  497. overflow: hidden;
  498. }
  499. .Img>img {
  500. width: 100%;
  501. height: 100%;
  502. }
  503. .student_body_one,
  504. .right_one {
  505. width: 100%;
  506. margin: 0 auto;
  507. background: #fff;
  508. margin-top: 10px;
  509. min-height: 688px;
  510. }
  511. .student {
  512. width: 85%;
  513. display: flex;
  514. flex-direction: row;
  515. flex-wrap: wrap;
  516. justify-content: flex-start;
  517. margin: auto 10px;
  518. }
  519. .student>div {
  520. width: 12%;
  521. height: 35px;
  522. background: #e3759a;
  523. text-align: center;
  524. border: 1px solid #e3759a;
  525. border-radius: 5px;
  526. color: #fff;
  527. line-height: 35px;
  528. margin: 10px;
  529. }
  530. .dialog_change>>>.el-dialog {
  531. border-radius: 5px;
  532. }
  533. .dialog_change>>>.el-dialog__header {
  534. background: #303030;
  535. height: 36px;
  536. line-height: 36px;
  537. padding-left: 10px;
  538. padding: 0px 10px 0px;
  539. }
  540. .dialog_change>>>.el-dialog__headerbtn {
  541. top: 10px !important;
  542. right: 10px !important;
  543. }
  544. .dialog_change>>>.el-dialog__title {
  545. color: #fff;
  546. font-size: 14px;
  547. line-height: 5px;
  548. }
  549. .dialog_change>>>.el-dialog__body {
  550. background: #f5f5f5;
  551. }
  552. .blue_box {
  553. align-items: center;
  554. display: flex;
  555. flex-direction: column;
  556. justify-content: center;
  557. }
  558. .blue_box,
  559. .blue_box_one {
  560. width: 30%;
  561. height: 100px;
  562. text-align: center;
  563. color: #fff;
  564. background-image: linear-gradient(90deg, #477cd7, #65b9fc);
  565. border-radius: 15px;
  566. margin: 15px 0 15px 15px;
  567. cursor: pointer;
  568. }
  569. .blue_box_one {
  570. width: 200px;
  571. height: 200px;
  572. background-image: linear-gradient(90deg, #477cd7, #65b9fc);
  573. display: flex;
  574. flex-direction: column;
  575. flex-wrap: nowrap;
  576. align-items: center;
  577. justify-content: center;
  578. }
  579. .blue_box_one>div {
  580. margin: 5px 0;
  581. }
  582. .blue_box_one>div:nth-child(1) {
  583. font-size: 20px;
  584. font-weight: bold;
  585. }
  586. .blue_box>div:nth-child(2) {
  587. margin-top: 10px;
  588. }
  589. .blue_box_one>div:nth-child(2) {
  590. white-space: nowrap;
  591. text-overflow: ellipsis;
  592. overflow: hidden;
  593. word-break: break-all;
  594. width: 100%;
  595. text-align: center;
  596. max-width: calc(100% - 85px);
  597. margin: 0 auto;
  598. }
  599. .return {
  600. background: #205cc6;
  601. width: 70px;
  602. height: 30px;
  603. color: #fff;
  604. text-align: center;
  605. line-height: 32px;
  606. margin-right: 20px;
  607. cursor: pointer;
  608. border-radius: 5px;
  609. position: absolute;
  610. right: 0;
  611. top: 24px;
  612. font-size: 14px;
  613. }
  614. .return>img {
  615. width: 100%;
  616. height: 100%;
  617. }
  618. .cType {
  619. display: flex;
  620. flex-direction: row;
  621. justify-content: center;
  622. align-items: center;
  623. margin-top: 20px;
  624. }
  625. .cType>div>span {
  626. font-size: 18px;
  627. }
  628. .type_children+.type_children {
  629. margin-left: 10px;
  630. }
  631. .all_choose {
  632. margin-right: 10px;
  633. /* max-width: 250px; */
  634. white-space: nowrap;
  635. overflow: hidden;
  636. text-overflow: ellipsis;
  637. }
  638. .rightT {
  639. display: flex;
  640. flex-direction: row;
  641. flex-wrap: nowrap;
  642. align-items: center;
  643. width: calc(100% - 20px);
  644. }
  645. .jd {
  646. background: #4a9eed;
  647. margin-left: 15px;
  648. border-radius: 10px;
  649. color: #fff;
  650. width: 70px;
  651. height: 25px;
  652. text-align: center;
  653. line-height: 25px;
  654. }
  655. .sLeft {
  656. width: 14%;
  657. margin-right: 10px;
  658. background: rgb(255, 255, 255);
  659. padding: 20px 15px 0 15px;
  660. box-sizing: border-box;
  661. border-radius: 10px;
  662. }
  663. .courseT {
  664. border-left: 3px solid #2e66c9;
  665. padding-left: 5px;
  666. color: #2e66c9;
  667. font-weight: bold;
  668. }
  669. .courseTd {
  670. padding-top: 15px;
  671. height: 700px;
  672. overflow: auto;
  673. word-break: break-word;
  674. }
  675. .courseTd::-webkit-scrollbar {
  676. /*滚动条整体样式*/
  677. width: 6px;
  678. /*高宽分别对应横竖滚动条的尺寸*/
  679. height: 6px;
  680. }
  681. /*定义滚动条轨道 内阴影+圆角*/
  682. .courseTd::-webkit-scrollbar {
  683. border-radius: 10px;
  684. background-color: #eee;
  685. }
  686. /*定义滑块 内阴影+圆角*/
  687. .courseTd::-webkit-scrollbar-thumb {
  688. border-radius: 10px;
  689. -webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.3);
  690. background-color: rgba(0, 0, 0, 0.1);
  691. }
  692. .rightTd,
  693. .noBRight {
  694. width: 84%;
  695. background: #fff;
  696. display: flex;
  697. flex-direction: row;
  698. flex-wrap: wrap;
  699. align-content: flex-start;
  700. align-items: center;
  701. justify-content: flex-start;
  702. }
  703. .noBRight {
  704. width: 100%;
  705. }
  706. .Tname {
  707. cursor: pointer;
  708. margin-left: 40px;
  709. word-break: break-all;
  710. width:auto;
  711. /* overflow: hidden;
  712. white-space: nowrap;
  713. text-overflow: ellipsis; */
  714. }
  715. /* .TnameC{
  716. width:auto;
  717. overflow: unset;
  718. white-space: unset;
  719. text-overflow: unset;
  720. } */
  721. .detail {
  722. width: 100%;
  723. padding: 15px;
  724. box-sizing: border-box;
  725. }
  726. .statebox {
  727. display: flex;
  728. align-items: center;
  729. box-sizing: border-box;
  730. margin-left: 30px;
  731. }
  732. .statebox div {
  733. padding: 10px 20px;
  734. border-radius: 5px;
  735. background: #fff;
  736. display: flex;
  737. align-items: center;
  738. }
  739. .statebox div+div {
  740. margin-left: 20px;
  741. }
  742. .statebox div span {
  743. font-size: 16px;
  744. display: flex;
  745. align-items: center;
  746. }
  747. .statebox div span+span {
  748. margin-left: 10px;
  749. color: #1463eb;
  750. }
  751. .p_tool_box {
  752. display: flex;
  753. flex-wrap: wrap;
  754. background: rgb(217, 227, 239);
  755. /* color: #fff; */
  756. padding: 0 15px 10px;
  757. align-items: center;
  758. justify-content: space-evenly;
  759. border-radius: 5px;
  760. height: 200px;
  761. overflow: auto;
  762. }
  763. .p_tool {
  764. display: flex;
  765. margin-top: 10px;
  766. }
  767. .p_tool>div {
  768. display: flex;
  769. flex-direction: column;
  770. align-items: center;
  771. min-width: 60px;
  772. }
  773. .p_tool>div img {
  774. width: 50px;
  775. height: 50px;
  776. }
  777. .p_tool>div>div {
  778. margin-top: 5px;
  779. font-size: 12px;
  780. }
  781. .p_tool_box2 {
  782. padding: 10px 15px;
  783. }
  784. .p_tool2 {
  785. margin-right: 20px;
  786. display: flex;
  787. flex-direction: column;
  788. align-items: flex-start;
  789. /* margin-bottom: 10px; */
  790. }
  791. .p_tool2>div:nth-child(1) {
  792. margin-bottom: 10px;
  793. }
  794. .toolBigBox {
  795. display: flex;
  796. flex-direction: column;
  797. }
  798. .toolSta {
  799. display: flex;
  800. margin: 20px 0 0;
  801. }
  802. .toolSta>div {
  803. display: flex;
  804. }
  805. .toolSta>div+div {
  806. margin-left: 50px;
  807. }
  808. .toolSta>div>div:nth-child(1) {
  809. margin: 10px 10px 0 0;
  810. }
  811. .toolSta>div>div:nth-child(2)>div {
  812. background: rgb(79, 140, 223);
  813. color: #fff;
  814. display: flex;
  815. padding: 10px 15px;
  816. min-width: 150px;
  817. font-size: 16px;
  818. align-items: center;
  819. border-radius: 5px;
  820. }
  821. .toolSta>div:nth-child(2)>div:nth-child(2)>div {
  822. background: rgb(53, 103, 172);
  823. }
  824. .toolSta>div>div:nth-child(2)>div+div {
  825. margin-top: 10px;
  826. }
  827. .toolSta>div>div:nth-child(2)>div>div+div {
  828. margin: 0 20px;
  829. }
  830. .p_tool2 .toolbox {
  831. display: flex;
  832. align-items: center;
  833. margin-top: 10px;
  834. }
  835. .checkBox {
  836. display: flex;
  837. padding: 20px 0 0 20px;
  838. box-sizing: border-box;
  839. width: 100%;
  840. }
  841. .checkBox span {
  842. padding: 0 10px 5px;
  843. cursor: pointer;
  844. font-size: 18px;
  845. }
  846. .checkBox span+span {
  847. margin-left: 20px;
  848. }
  849. .checkBox .active {
  850. border-bottom: 2px solid rgb(75, 151, 229);
  851. cursor: pointer;
  852. }
  853. .detail_box {
  854. background-color: rgb(231, 240, 247);
  855. padding: 15px 20px;
  856. box-sizing: border-box;
  857. width: 100%;
  858. }
  859. .detail_box+.detail_box {
  860. margin-top: 20px;
  861. }
  862. .detail_box .title {
  863. display: flex;
  864. align-items: center;
  865. }
  866. .detail_box .title>span:nth-child(1) {
  867. font-size: 20px;
  868. display: flex;
  869. align-items: center;
  870. }
  871. .detail_box .box {
  872. margin-top: 20px;
  873. background-color: #fff;
  874. padding: 15px 20px;
  875. border-radius: 5px;
  876. /* width: 100%; */
  877. box-sizing: border-box;
  878. overflow: auto;
  879. }
  880. .progress {
  881. display: -webkit-box;
  882. display: -ms-flexbox;
  883. width: 100%;
  884. overflow: auto;
  885. padding: 15px 0;
  886. }
  887. .chapter {
  888. margin-right: 10px;
  889. }
  890. .chapter+.chapter {
  891. padding-left: 10px;
  892. border-left: 1px solid rgb(220, 220, 220);
  893. }
  894. .chapter .stage {
  895. width: 100%;
  896. color: #fff;
  897. background: linear-gradient(90deg, #477cd7, #65b9fc);
  898. border-radius: 5px;
  899. height: 50px;
  900. line-height: 50px;
  901. font-size: 18px;
  902. text-align: center;
  903. }
  904. .chapter .task {
  905. display: flex;
  906. width: 100%;
  907. }
  908. .chapter .task .taskBox {
  909. min-width: 110px;
  910. max-width: 180px;
  911. height: 100%;
  912. }
  913. .chapter .task .taskBox+.taskBox {
  914. margin-left: 10px;
  915. }
  916. .chapter .task .taskBox .taskName {
  917. text-align: center;
  918. margin: 10px
  919. }
  920. .toolIcon::before {
  921. content: '';
  922. width: 26px;
  923. height: 26px;
  924. display: inline-block;
  925. background-image: url(../../assets/icon/toolion.png);
  926. background-size: 100% 100%;
  927. }
  928. .toolIcon::before {
  929. content: '';
  930. width: 26px;
  931. height: 26px;
  932. display: inline-block;
  933. background-image: url(../../assets/icon/toolion.png);
  934. background-size: 100% 100%;
  935. }
  936. .taskIcon::before {
  937. content: '';
  938. width: 26px;
  939. height: 26px;
  940. display: inline-block;
  941. background-image: url(../../assets/icon/task.png);
  942. background-size: 100% 100%;
  943. }
  944. .finishIcon::before {
  945. content: '';
  946. width: 26px;
  947. height: 26px;
  948. display: inline-block;
  949. background-image: url(../../assets/icon/finish.png);
  950. background-size: 100% 100%;
  951. }
  952. .learningIcon::before {
  953. content: '';
  954. width: 22px;
  955. height: 22px;
  956. display: inline-block;
  957. background-image: url(../../assets/icon/learning.png);
  958. background-size: 100% 100%;
  959. }
  960. .frequencyIcon::before {
  961. content: '';
  962. width: 26px;
  963. height: 26px;
  964. display: inline-block;
  965. background-image: url(../../assets/icon/frequency.png);
  966. background-size: 100% 100%;
  967. }
  968. .timeIcon::before {
  969. content: '';
  970. width: 26px;
  971. height: 26px;
  972. display: inline-block;
  973. background-image: url(../../assets/icon/time.png);
  974. background-size: 100% 100%;
  975. }
  976. .chapter_time_box {
  977. border-left: 5px solid #f0f0f0;
  978. padding: 0 30px;
  979. box-sizing: border-box;
  980. margin-top: 35px;
  981. }
  982. .c_box {
  983. padding-top: 40px;
  984. position: relative;
  985. margin-top: 45px;
  986. }
  987. .c_box .stage_box {
  988. display: flex;
  989. align-items: center;
  990. position: absolute;
  991. top: -20px;
  992. left: -45px;
  993. }
  994. .c_box .stage_box .yuan {
  995. width: 25px;
  996. height: 25px;
  997. background: rgb(244, 244, 244);
  998. border-radius: 25px;
  999. display: flex;
  1000. align-items: center;
  1001. justify-content: center;
  1002. margin-right: 10px;
  1003. }
  1004. .c_box .stage_box .yuan::before {
  1005. content: '';
  1006. width: 15px;
  1007. height: 15px;
  1008. background: rgb(59, 149, 238);
  1009. border-radius: 25px;
  1010. }
  1011. .c_box .stage_box .stage {
  1012. background: linear-gradient(90deg, #477cd7, #65b9fc);
  1013. border-radius: 5px;
  1014. height: 50px;
  1015. line-height: 50px;
  1016. font-size: 18px;
  1017. color: #fff;
  1018. width: fit-content;
  1019. padding: 0 20px;
  1020. }
  1021. .s_up {
  1022. cursor: pointer;
  1023. transition: all .5s;
  1024. }
  1025. .s_up img {
  1026. width: 35px;
  1027. }
  1028. .s_up2 {
  1029. transform: rotate(90deg);
  1030. }
  1031. .btnBox{
  1032. display: flex;
  1033. }
  1034. </style>