courseSection.vue 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806
  1. <template>
  2. <view
  3. style="display: flex; justify-content: space-between; align-items: center"
  4. @click="getVideo"
  5. >
  6. <view
  7. style="
  8. display: flex;
  9. justify-content: space-between;
  10. align-items: center;
  11. margin: 20rpx 0;
  12. width: 100%;
  13. "
  14. >
  15. <view style="display: flex; align-items: center; flex: 1">
  16. <view class="tag tagColor1" v-if="menuItem.sectionType == 1">视频</view>
  17. <view class="tag tagColor2" v-if="menuItem.sectionType == 2">直播</view>
  18. <view class="tag tagColor3" v-if="menuItem.sectionType == 3">回放</view>
  19. <view class="t_content">
  20. <view
  21. v-if="menuItem.sectionType == 1"
  22. :class="{ color1: isActive }"
  23. >{{ menuItem.name || "" }}</view
  24. >
  25. <view
  26. v-if="menuItem.sectionType == 2"
  27. :class="{ color2: isActive }"
  28. >{{ menuItem.name || "" }}</view
  29. >
  30. <view
  31. v-if="menuItem.sectionType == 3"
  32. :class="{ color3: isActive }"
  33. >{{ menuItem.name || "" }}</view
  34. >
  35. <view
  36. style="font-size: 20rpx; color: #ff3b30"
  37. v-if="menuItem.sectionType == 2 && menuItem.liveStartTime"
  38. >
  39. <view v-if="menuItem.liveStartTime > nowTime || !isBuy">
  40. <text>{{
  41. $method.timestampToTime(menuItem.liveStartTime, (isDay = false))
  42. }}</text
  43. >-
  44. <text>{{
  45. $method.timestampToTime(menuItem.liveEndTime, (isDay = false))
  46. }}</text>
  47. </view>
  48. <template v-if="isLast()">
  49. <view v-if="liveLast.watchStatus == 'live'">
  50. <text>直播中</text>
  51. </view>
  52. <view v-if="liveLast.watchStatus == 'end'">
  53. <text>当前直播回放视频请稍后再查看</text>
  54. </view>
  55. </template>
  56. </view>
  57. <view
  58. style="font-size: 20rpx; color: #ff3b30"
  59. v-if="menuItem.sectionType == 3"
  60. >
  61. <view v-if="!menuItem.recordingUrl">
  62. <text>当前直播回放视频请稍后再查看</text>
  63. </view>
  64. <view v-else> 回放中 </view>
  65. </view>
  66. </view>
  67. <view v-if="menuItem.sectionType == null">{{
  68. menuItem.name || ""
  69. }}</view>
  70. <!-- 学习中 -->
  71. <view v-if="isActive" class="learnings">
  72. <image
  73. src="/pages3/static/imgs/learning_icon.gif"
  74. class="learning_icon"
  75. ></image>
  76. </view>
  77. </view>
  78. <view
  79. style="font-size: 20rpx; color: #ff3b30"
  80. v-if="menuItem.liveStartTime && menuItem.sectionType != 3 && isBuy"
  81. >
  82. <template v-if="!isLast() && !isLive">
  83. <view class="tagWillPlay" v-if="menuItem.liveStartTime > nowTime">
  84. <text>待开播</text>
  85. </view>
  86. <view
  87. class="tagPlaying"
  88. v-if="
  89. menuItem.liveStartTime <= nowTime &&
  90. menuItem.liveEndTime > nowTime
  91. "
  92. >
  93. <text>直播中</text>
  94. </view>
  95. <view class="tagPlayed" v-if="menuItem.liveEndTime < nowTime">
  96. <text>已结束</text>
  97. </view>
  98. </template>
  99. </view>
  100. <!-- 直播课程没有学习状态 -->
  101. <template v-if="!isLive">
  102. <view v-if="isRebuild || menuItem.rebuild > 0" class="tagRe"
  103. >待重修</view
  104. >
  105. <view v-else>
  106. <view v-if="menuItem.learning == 1" class="tagGreen">已学完</view>
  107. </view>
  108. </template>
  109. <view
  110. v-if="checkTest()"
  111. class="exercises"
  112. @click.stop="toDoSectionExam()"
  113. >
  114. <text class="exe_w">习题</text>
  115. <u-icon name="arrow-right" color="#498AFE" size="28"></u-icon>
  116. </view>
  117. </view>
  118. <view v-if="menuItem.tryListen && !isBuy" class="tryBox"> 试看 </view>
  119. </view>
  120. </template>
  121. <script>
  122. import { mapGetters } from "vuex";
  123. export default {
  124. name: "courseSection",
  125. props: {
  126. isLive: false, //是否是直播课
  127. orderGoodsId: {
  128. default: 0,
  129. },
  130. preItem: {
  131. default: undefined,
  132. },
  133. learningOrder: {
  134. //是否设置学习顺序 1 章节顺序 0不设置 2从头学到尾顺序
  135. type: Number,
  136. default: 0,
  137. },
  138. courseId: {
  139. type: Number,
  140. default: 0,
  141. },
  142. goodsId: {
  143. type: Number,
  144. default: 0,
  145. },
  146. menuItem: {
  147. type: Object,
  148. default: {},
  149. },
  150. isBuy: {
  151. type: Boolean,
  152. default: false,
  153. },
  154. levelId: {
  155. type: String,
  156. default: "",
  157. },
  158. isRebuild: {
  159. type: Boolean,
  160. default: false,
  161. },
  162. gradeId: {
  163. type: Number,
  164. default: 0,
  165. },
  166. nextMenuItem: {
  167. type: Object,
  168. default: () => {
  169. return {};
  170. },
  171. },
  172. sectionMaxNum: {
  173. default: undefined,
  174. },
  175. // 章->所有节试卷列表
  176. ChapterSectionExam: {
  177. type: Array,
  178. default: () => [],
  179. },
  180. // 区分是模块试卷还是章试卷,3是模块试卷
  181. testType: {
  182. type: Number,
  183. default: 0,
  184. },
  185. menuAllList: {
  186. // 课程所有子目录结构列表
  187. type: Array,
  188. default: () => [],
  189. },
  190. sectionItem: {
  191. type: Object,
  192. default: () => {
  193. return {};
  194. },
  195. },
  196. },
  197. watch: {
  198. menuItem(val) {
  199. console.log(val, "val");
  200. },
  201. },
  202. data() {
  203. return {
  204. nowTime: 0,
  205. playId: "",
  206. clickLock: false, //点击锁,防止连续点击多次
  207. moduleSectionExam: [], // 模块下的所有节试卷列表
  208. chapterExams: {},
  209. moduleExams: {},
  210. // newMenuAllList: [],
  211. };
  212. },
  213. onLoad() {},
  214. created() {
  215. if (this.testType == 3) {
  216. // 模块下的所有节试卷列表
  217. this.$api
  218. .reSectionExamList({
  219. chapterId: 0,
  220. courseId: this.courseId,
  221. gradeId: this.gradeId,
  222. orderGoodsId: this.orderGoodsId,
  223. })
  224. .then((res) => {
  225. if (res.data.code == 200) {
  226. this.moduleSectionExam = res.data.data || [];
  227. }
  228. });
  229. }
  230. },
  231. mounted() {
  232. this.nowTime = Number(new Date().getTime() / 1000).toFixed(0);
  233. },
  234. methods: {
  235. isLast() {
  236. if (this.liveLast) {
  237. let sectionASame =
  238. this.liveLast.sectionId ==
  239. (this.menuItem.sectionId || this.menuItem.menuId);
  240. let chapterSame =
  241. this.liveLast.chapterId == (this.menuItem.chapterId || 0);
  242. let moduleSame =
  243. this.liveLast.moduleId == (this.menuItem.moduleId || 0);
  244. return sectionASame && chapterSame && moduleSame;
  245. } else {
  246. return false;
  247. }
  248. },
  249. toDoSectionExam() {
  250. if (this.testType == 3) {
  251. this.ModuleExam();
  252. } else {
  253. this.ChapterExam();
  254. }
  255. },
  256. checkTest() {
  257. let data =
  258. this.testType == 3 ? this.moduleSectionExam : this.ChapterSectionExam;
  259. let id =
  260. this.testType == 3 ? this.menuItem.menuId : this.menuItem.sectionId;
  261. if (!data) {
  262. return false;
  263. }
  264. return data.some((e) => e.sectionId == id);
  265. },
  266. ChapterExam() {
  267. this.chapterExams = this.ChapterSectionExam.find(
  268. (e) => e.sectionId == this.menuItem.sectionId
  269. );
  270. let moduleId = this.chapterExams.moduleId || 0;
  271. let chapterId = this.chapterExams.chapterId || 0;
  272. let sectionId = this.chapterExams.sectionId || this.chapterExams.menuId;
  273. uni.navigateTo({
  274. url:
  275. "/pages2/class/questionBank?courseId=" +
  276. this.courseId +
  277. "&gradeId=" +
  278. this.gradeId +
  279. "&isFromVideo=1&id=" +
  280. this.chapterExams.typeId +
  281. "&goodsid=" +
  282. this.goodsId +
  283. "&moduleId=" +
  284. moduleId +
  285. "&chapterId=" +
  286. chapterId +
  287. "&sectionId=" +
  288. sectionId +
  289. "&orderGoodsId=" +
  290. this.orderGoodsId +
  291. "&type=2",
  292. });
  293. },
  294. ModuleExam() {
  295. let sectionId = this.menuItem.sectionId || this.menuItem.menuId;
  296. this.moduleExams = this.moduleSectionExam.find(
  297. (e) => e.sectionId == sectionId
  298. );
  299. let moduleId = this.moduleExams.moduleId || 0;
  300. let chapterId = this.moduleExams.chapterId || 0;
  301. uni.navigateTo({
  302. url:
  303. "/pages2/class/questionBank?courseId=" +
  304. this.courseId +
  305. "&gradeId=" +
  306. this.gradeId +
  307. "&isFromVideo=1&id=" +
  308. this.moduleExams.typeId +
  309. "&goodsid=" +
  310. this.goodsId +
  311. "&moduleId=" +
  312. moduleId +
  313. "&chapterId=" +
  314. chapterId +
  315. "&sectionId=" +
  316. sectionId +
  317. "&orderGoodsId=" +
  318. this.orderGoodsId +
  319. "&type=2",
  320. });
  321. },
  322. studyRecordMenuAllList() {
  323. return new Promise((resolve) => {
  324. this.$api
  325. .studyRecordMenuAllList({
  326. courseId: this.courseId,
  327. gradeId: this.gradeId,
  328. goodsId: this.goodsId,
  329. orderGoodsId: this.orderGoodsId,
  330. })
  331. .then((res) => {
  332. if (res.data.code == 200) {
  333. resolve(res.data.data);
  334. }
  335. });
  336. });
  337. },
  338. gradeCheckGoodsStudy() {
  339. return new Promise((resolve) => {
  340. this.$api
  341. .gradeCheckGoodsStudy({
  342. goodsId: this.goodsId,
  343. gradeId: this.gradeId,
  344. moduleId: this.menuItem.moduleId || 0,
  345. chapterId: this.menuItem.chapterId || 0,
  346. sectionId: this.menuItem.sectionId || this.menuItem.menuId,
  347. orderGoodsId: this.orderGoodsId,
  348. })
  349. .then((res) => {
  350. resolve(res.data.data);
  351. });
  352. });
  353. },
  354. goodsTodayStudySectionNum() {
  355. return new Promise((resolve) => {
  356. this.$api
  357. .goodsTodayStudySectionNum({
  358. goodsId: this.goodsId,
  359. gradeId: this.gradeId,
  360. orderGoodsId: this.orderGoodsId,
  361. })
  362. .then((res) => {
  363. if (res.data.code == 200) {
  364. resolve(res.data.data);
  365. }
  366. });
  367. });
  368. },
  369. getVideo() {
  370. if (this.clickLock) {
  371. return;
  372. }
  373. if (this.$method.isGoLogin()) {
  374. return;
  375. }
  376. if (this.menuItem.id == this.playSectionId) {
  377. return;
  378. }
  379. this.clickLock = true;
  380. // && !this.menuItem.isRebuild
  381. if (this.learningOrder == 2 && !this.isLive) {
  382. //要按从头到尾顺序学习, 且不是重修课程
  383. if (this.preItem) {
  384. // let rows = await this.studyRecordMenuAllList();
  385. let rows = this.menuAllList;
  386. let newRows = [];
  387. for (let i = 0; i < rows.length; i++) {
  388. let moduleTrue =
  389. rows[i].moduleId == this.menuItem.moduleId ||
  390. rows[i].moduleId == 0;
  391. let chapterTrue =
  392. rows[i].chapterId == this.menuItem.chapterId ||
  393. rows[i].chapterId == 0;
  394. let sectionTrue =
  395. rows[i].sectionId == this.menuItem.sectionId ||
  396. rows[i].sectionId == this.menuItem.menuId;
  397. if (moduleTrue && chapterTrue && sectionTrue) {
  398. break;
  399. } else {
  400. if (rows[i].sectionType != 2) {
  401. newRows.push(rows[i]);
  402. }
  403. }
  404. }
  405. let isAllLearn = newRows.every((item) => {
  406. return item.studyStatus == 1;
  407. });
  408. if (isAllLearn) {
  409. this.playVideo();
  410. } else {
  411. uni.showToast({
  412. icon: "none",
  413. title: "请按顺序学习视频课程",
  414. });
  415. }
  416. } else {
  417. //第一章第一节
  418. this.playVideo();
  419. }
  420. } else {
  421. this.playVideo();
  422. }
  423. setTimeout(() => {
  424. this.clickLock = false;
  425. }, 3000);
  426. },
  427. studyRecordGetChannelBasicInfo(channelId) {
  428. return new Promise((resolve) => {
  429. this.$api
  430. .studyRecordGetChannelBasicInfo({
  431. channelId,
  432. })
  433. .then((res) => {
  434. resolve(res.data.data);
  435. });
  436. });
  437. },
  438. async playVideo() {
  439. if (this.menuItem.sectionType == 1 || this.menuItem.sectionType == 3) {
  440. //1视频 3回放
  441. if (!this.isBuy) {
  442. //非购买
  443. if (!this.menuItem.tryListen) {
  444. //不允许试听
  445. this.clickLock = false;
  446. return;
  447. } else {
  448. this.menuItem.courseId = this.courseId;
  449. uni.$emit("getSection", this.menuItem);
  450. return;
  451. }
  452. }
  453. let learnNum = await this.goodsTodayStudySectionNum();
  454. let hasLearn = await this.gradeCheckGoodsStudy();
  455. if (this.sectionMaxNum > 0) {
  456. if (learnNum >= this.sectionMaxNum && !hasLearn) {
  457. uni.showToast({
  458. icon: "none",
  459. title: `每天最多学习${this.sectionMaxNum}节`,
  460. });
  461. this.clickLock = false;
  462. return;
  463. }
  464. }
  465. if (!this.menuItem.recordingUrl) {
  466. uni.showToast({
  467. title: "暂无播放地址数据",
  468. icon: "none",
  469. });
  470. this.clickLock = false;
  471. return;
  472. }
  473. // 回放
  474. if (this.menuItem.sectionType == 3) {
  475. let moduleId = this.menuItem.moduleId || 0;
  476. let chapterId = this.menuItem.chapterId || 0;
  477. let sectionId = this.menuItem.sectionId || this.menuItem.menuId;
  478. let uuid = new Date().valueOf() + "";
  479. // buyCourse 是否购买课程:1是 0否,type=vod是回放
  480. let encode = encodeURIComponent(
  481. this.config.hostLive +
  482. "/pages/live/index?token=" +
  483. uni.getStorageSync("token") +
  484. "&userInfo=" +
  485. JSON.stringify(this.userInfo) +
  486. "&channelId=" +
  487. this.menuItem.liveUrl +
  488. "&gradeId=" +
  489. this.gradeId +
  490. "&courseId=" +
  491. this.courseId +
  492. "&goodsId=" +
  493. this.goodsId +
  494. "&orderGoodsId=" +
  495. this.orderGoodsId +
  496. "&sectionId=" +
  497. sectionId +
  498. "&chapterId=" +
  499. chapterId +
  500. "&moduleId=" +
  501. moduleId +
  502. "&buyCourse=1" +
  503. "&ident=" +
  504. uuid +
  505. "&sectionType=3" +
  506. "&vid=" +
  507. this.menuItem.recordingUrl
  508. );
  509. uni.navigateTo({
  510. url: `../../pages/webview/index?url=` + encode,
  511. });
  512. return;
  513. }
  514. if (this.playSectionId > 0) {
  515. //切换视频
  516. let oldSectionId = this.playSectionId;
  517. uni.$emit("changeSection", oldSectionId);
  518. }
  519. // console.log('===设置播放的节IDthis.menuItem,', this.menuItem, this.playId);
  520. //设置播放的节ID
  521. this.$store.commit("updatePlayNextId", this.playId);
  522. uni.$emit("levelId", this.levelId);
  523. uni.$emit("getSection", this.menuItem);
  524. uni.$emit("isRebuild", this.isRebuild);
  525. }
  526. if (this.menuItem.sectionType == 2) {
  527. //直播
  528. if (!this.isBuy) {
  529. //非购买
  530. this.clickLock = false;
  531. return;
  532. }
  533. let learnNum = await this.goodsTodayStudySectionNum();
  534. let hasLearn = await this.gradeCheckGoodsStudy();
  535. if (this.sectionMaxNum > 0 && !this.isLive) {
  536. if (learnNum >= this.sectionMaxNum && !hasLearn) {
  537. uni.showToast({
  538. icon: "none",
  539. title: `每天最多学习${this.sectionMaxNum}节`,
  540. });
  541. this.clickLock = false;
  542. return;
  543. }
  544. }
  545. if (!this.menuItem.liveUrl) {
  546. uni.showToast({
  547. title: "暂无直播地址数据",
  548. icon: "error",
  549. });
  550. return;
  551. }
  552. let data = await this.studyRecordGetChannelBasicInfo(
  553. this.menuItem.liveUrl
  554. );
  555. let nowTime = +this.$method.timest();
  556. if (this.menuItem.liveStartTime > nowTime) {
  557. if (data.watchStatus == "end" || data.watchStatus == "playback") {
  558. this.clickLock = false;
  559. uni.showToast({
  560. title: "直播未开始",
  561. icon: "none",
  562. });
  563. return;
  564. }
  565. } else if (
  566. this.menuItem.liveStartTime < nowTime &&
  567. this.menuItem.liveEndTime > nowTime
  568. ) {
  569. if (data.watchStatus == "end" || data.watchStatus == "playback") {
  570. this.clickLock = false;
  571. uni.showToast({
  572. title: "暂无直播",
  573. icon: "none",
  574. });
  575. return;
  576. }
  577. } else if (this.menuItem.liveEndTime < nowTime) {
  578. if (!data) {
  579. uni.showToast({
  580. title: "直播已结束",
  581. icon: "none",
  582. });
  583. return;
  584. }
  585. if (data.watchStatus == "end" || data.watchStatus == "playback") {
  586. this.clickLock = false;
  587. uni.showToast({
  588. title: "直播已结束",
  589. icon: "none",
  590. });
  591. return;
  592. }
  593. }
  594. let moduleId = this.menuItem.moduleId || 0;
  595. let chapterId = this.menuItem.chapterId || 0;
  596. let sectionId = this.menuItem.sectionId || this.menuItem.menuId;
  597. let uuid = new Date().valueOf() + "";
  598. // buyCourse 是否购买课程:1是 0否
  599. let encode = encodeURIComponent(
  600. this.config.hostLive +
  601. "/pages/live/index?token=" +
  602. uni.getStorageSync("token") +
  603. "&userInfo=" +
  604. JSON.stringify(this.userInfo) +
  605. "&channelId=" +
  606. this.menuItem.liveUrl +
  607. "&gradeId=" +
  608. this.gradeId +
  609. "&courseId=" +
  610. this.courseId +
  611. "&goodsId=" +
  612. this.goodsId +
  613. "&orderGoodsId=" +
  614. this.orderGoodsId +
  615. "&sectionId=" +
  616. sectionId +
  617. "&chapterId=" +
  618. chapterId +
  619. "&moduleId=" +
  620. moduleId +
  621. "&buyCourse=1" +
  622. "&ident=" +
  623. uuid +
  624. "&sectionType=2"
  625. );
  626. uni.navigateTo({
  627. url: `../../pages/webview/index?url=` + encode,
  628. });
  629. return;
  630. }
  631. },
  632. },
  633. computed: {
  634. ...mapGetters([
  635. "playSectionId",
  636. "userInfo",
  637. "liveLast",
  638. "config",
  639. ]),
  640. isActive() {
  641. let moduleId = this.menuItem.moduleId || 0;
  642. let chapterId = this.menuItem.chapterId || 0;
  643. let sectionId = this.menuItem.sectionId || this.menuItem.menuId;
  644. let moduleId1 = this.sectionItem.moduleId || 0;
  645. let chapterId1 = this.sectionItem.chapterId || 0;
  646. let sectionId1 = this.sectionItem.sectionId || this.sectionItem.menuId;
  647. return (
  648. moduleId == moduleId1 &&
  649. chapterId == chapterId1 &&
  650. sectionId == sectionId1
  651. );
  652. },
  653. },
  654. };
  655. </script>
  656. <style scoped lang="scss">
  657. .tagGreen {
  658. width: 80rpx;
  659. height: 28rpx;
  660. background: #34c759;
  661. border-radius: 8rpx;
  662. font-size: 20rpx;
  663. color: #ffffff;
  664. text-align: center;
  665. }
  666. .tagWillPlay {
  667. width: 80rpx;
  668. height: 28rpx;
  669. background: #ebf4ff;
  670. border-radius: 8rpx;
  671. font-size: 20rpx;
  672. color: #007aff;
  673. text-align: center;
  674. }
  675. .tagPlaying {
  676. width: 80rpx;
  677. height: 28rpx;
  678. background: #fff7eb;
  679. border-radius: 8rpx;
  680. font-size: 20rpx;
  681. color: #ff9500;
  682. text-align: center;
  683. }
  684. .tagPlayed {
  685. width: 80rpx;
  686. height: 28rpx;
  687. background: #eeeeee;
  688. border-radius: 8rpx;
  689. font-size: 20rpx;
  690. color: #666666;
  691. text-align: center;
  692. }
  693. .tagRe {
  694. width: 80rpx;
  695. height: 28rpx;
  696. background: #ff3b30;
  697. border-radius: 8rpx;
  698. font-size: 20rpx;
  699. color: #ffffff;
  700. text-align: center;
  701. }
  702. .tryBox {
  703. width: 103rpx;
  704. height: 48rpx;
  705. background: #fff;
  706. border-radius: 24rpx;
  707. color: #3577e8;
  708. font-size: 24rpx;
  709. line-height: 48rpx;
  710. text-align: center;
  711. border: 1rpx solid #3577e8;
  712. }
  713. .icon_up {
  714. width: 24rpx;
  715. height: 24rpx;
  716. }
  717. .t_content3 {
  718. color: #007aff;
  719. }
  720. .t_content2 {
  721. color: #007aff;
  722. }
  723. .t_content1 {
  724. color: #007aff;
  725. }
  726. .t_content {
  727. font-size: 30rpx;
  728. margin-left: 10rpx;
  729. color: #666666;
  730. flex: 1;
  731. }
  732. .tagColor3 {
  733. border: 2rpx solid #ff9500;
  734. color: #ff9500;
  735. }
  736. .tagColor2 {
  737. border: 2rpx solid #ff3b30;
  738. color: #ff3b30;
  739. }
  740. .tagColor1 {
  741. border: 2rpx solid #007aff;
  742. color: #007aff;
  743. }
  744. .color3 {
  745. color: #ff9500;
  746. }
  747. .color2 {
  748. color: #ff3b30;
  749. }
  750. .color1 {
  751. color: #007aff;
  752. }
  753. .tag {
  754. border-radius: 8rpx;
  755. font-size: 20rpx;
  756. padding: 4rpx 10rpx;
  757. }
  758. .exercises {
  759. margin-left: 10rpx;
  760. font-size: 26rpx;
  761. color: #498afe;
  762. > text {
  763. margin-right: 6rpx;
  764. }
  765. }
  766. .learnings {
  767. margin-right: 8rpx;
  768. .learning_icon {
  769. width: 40rpx;
  770. height: 40rpx;
  771. margin-right: 4rpx;
  772. }
  773. }
  774. </style>