courseSection.vue 22 KB

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