detail.vue 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755
  1. <template>
  2. <view>
  3. <view style="position: fixed;width: 100%;z-index: 999;background: #FFFFFF;" id="top">
  4. <view class="video_box">
  5. <image
  6. v-if="!startStatus"
  7. :src="infoData.firstImage === null ? 'https://cdn.uviewui.com/uview/swiper/3.jpg' : infoData.firstImage"
  8. style="width: 100%;height: 460rpx;"
  9. ></image>
  10. <image v-if="!startStatus" class="video_play" src="/static/play.png" @click="startVideo"></image>
  11. <polyv-player
  12. v-else
  13. id="playerVideo"
  14. playerId="playerVideo"
  15. height="460rpx"
  16. :vid="vid"
  17. :showSettingBtn="true"
  18. isAllowSeek="ifViewed"
  19. :showPlaybackRateBtn="false"
  20. :enablePlayGesture="true"
  21. ></polyv-player>
  22. </view>
  23. <view>
  24. <u-row>
  25. <u-col span="8" offset="1">
  26. <view class="video_t1">{{ infoData.name || pageData.courseName }}</view>
  27. </u-col>
  28. <u-col span="3">
  29. <view class="video_t1">共{{ chapterList.length }}章节</view>
  30. </u-col>
  31. </u-row>
  32. </view>
  33. <view><u-tabs :list="list" font-size="24" bar-width="90" :current="current" @change="change" active-color="#32467B"></u-tabs></view>
  34. <u-line color="#D6D6DB" />
  35. </view>
  36. <view class="box" @touchmove="touchMove">
  37. <view id="modules1">
  38. <!-- 课程目录-->
  39. <view style="padding-top: 15rpx;">
  40. <u-row>
  41. <u-col span="9">
  42. <view class="video_t2" style="display: flex;align-items: center;">
  43. <view class="top_line"></view>
  44. 课程目录
  45. </view>
  46. </u-col>
  47. <u-col span="3" text-align="right">
  48. <view class="video_t2" @click="swipStatus">
  49. 共{{ chapterList.length }}章节
  50. <u-icon name="arrow-right" size="28" style="transition: all 0.2s;margin-left:10rpx" :class="activeStatus ? 'rotoct' : ''"></u-icon>
  51. </view>
  52. </u-col>
  53. </u-row>
  54. <!-- <view class="scroll_box">
  55. <scroll-view class="r_sliper" scroll-x="true">
  56. <view v-for="(item, index) in chapterList" :key="index" style="margin-right: 20rpx;display:inline-block"><view class="r_t2">{{item.name}}</view></view>
  57. </scroll-view>
  58. </view> -->
  59. <view class="catalogBox" :class="activeStatus ? 'changeCatalogBox' : ''">
  60. <view
  61. class="catalogA"
  62. v-for="(item, index) in chapterList"
  63. :key="index"
  64. :class="activeStatusCata === item.chapterId ? 'activesq' : ''"
  65. @click="activeList(item, index)"
  66. >
  67. {{ item.name }}
  68. </view>
  69. </view>
  70. </view>
  71. <u-line color="#D6D6DB" />
  72. </view>
  73. <view id="modules2">
  74. <!-- 课程介绍-->
  75. <view style="padding-top: 15rpx;">
  76. <u-row>
  77. <u-col span="8">
  78. <view class="video_t2" style="display: flex;align-items: center;">
  79. <view class="top_line"></view>
  80. 课程介绍
  81. </view>
  82. </u-col>
  83. </u-row>
  84. </view>
  85. <view class="t2" v-html="pageData.introduction"></view>
  86. <u-line color="#D6D6DB" />
  87. </view>
  88. <!-- 出题名师-->
  89. <view id="modules3">
  90. <view style="padding: 15rpx 0;">
  91. <u-row>
  92. <u-col span="8">
  93. <view class="video_t2" style="display: flex;align-items: center;">
  94. <view class="top_line"></view>
  95. 出题名师
  96. </view>
  97. </u-col>
  98. </u-row>
  99. <u-row>
  100. <view style="margin: 25rpx;display: flex;">
  101. <view><image :src="$method.splitImgHost(teacherInfo.avatar)" class="teacher_img"></image></view>
  102. <view class="teacher_t">
  103. <view>{{ teacherInfo.teacherName }}</view>
  104. <view>{{ teacherInfo.introduce }}</view>
  105. </view>
  106. </view>
  107. </u-row>
  108. </view>
  109. <u-line color="#D6D6DB" />
  110. </view>
  111. <!-- 相关推荐-->
  112. <view style="padding-top: 15rpx;" id="modules4" :style="'padding-bottom:' + modules4Bottom + 'px'">
  113. <u-row>
  114. <u-col span="8">
  115. <view class="video_t2" style="display: flex;align-items: center;">
  116. <view class="top_line"></view>
  117. 相关推荐
  118. </view>
  119. </u-col>
  120. </u-row>
  121. <view style="margin: 10rpx;">
  122. <view class="tj_box" v-for="(item, index) in commendList" :key="index" @click="getNavTo(item)">
  123. <image :src="$method.splitImgHost(item.coverUrl)" style="width: 320rpx;height: 160rpx;"></image>
  124. <view style="font-size: 24rpx;color: #666666;text-align: left;">{{ item.courseName }}</view>
  125. <view>
  126. <u-row>
  127. <u-col span="6">
  128. <view style="margin-left: 20rpx;">
  129. <image src="/static/people.png" style="width: 20rpx;height: 20rpx;"></image>
  130. <text style="color: #999999;font-size: 20rpx;margin-left: 10rpx;">2023</text>
  131. </view>
  132. </u-col>
  133. <u-col span="6" text-align="right">
  134. <text style="color: #E91313;font-size: 16rpx;margin-left: 8rpx;">活动价</text>
  135. <text style="color: #E91313;font-size: 24rpx;font-weight: bold;">¥{{ item.price }}</text>
  136. </u-col>
  137. </u-row>
  138. </view>
  139. </view>
  140. </view>
  141. </view>
  142. </view>
  143. <view class="footer_tab" id="foot">
  144. <u-line color="#D6D6DB" />
  145. <view style="height: 100%;display: flex;align-items: center;position: relative;">
  146. <view style="text-align: center;margin-left: 30rpx;" @click="favorites">
  147. <image :src="collecStatus ? '/static/star.png' : '/static/sc.png'" class="sc"></image>
  148. <view class="sc_t">收藏</view>
  149. </view>
  150. <view style="text-align: center;margin-left: 30rpx;">
  151. <view class="price_t1">¥{{ pageData.price }}</view>
  152. <view class="price_t2">¥699</view>
  153. </view>
  154. <view class="buy" @click="jumpBuy">立即购买</view>
  155. </view>
  156. </view>
  157. <u-popup v-model="showBox" mode="bottom" border-radius="14">
  158. <view class="content">
  159. <scroll-view scroll-y="true" style="height: 300rpx;">
  160. <view v-if="boxList.length > 0">
  161. <view
  162. v-for="(item, index) in boxList"
  163. :key="index"
  164. style="line-height: 60rpx;border-bottom: 1rpx solid #eee;display: flex;align-items: center;justify-content: space-between;padding: 15rpx 0;"
  165. :style="infoData.sectionId === item.sectionId ? 'color:#1677ff;' : ''"
  166. @click="getsec(item)"
  167. >
  168. <view>{{ item.name }}</view>
  169. <u-icon v-if="infoData.sectionId === item.sectionId" name="checkbox-mark"></u-icon>
  170. </view>
  171. </view>
  172. <view v-else>暂无内容</view>
  173. </scroll-view>
  174. <view class="confrim-btn" style="margin-top: 10rpx;"><u-button @click="showBox = false">取消</u-button></view>
  175. </view>
  176. </u-popup>
  177. </view>
  178. </template>
  179. <script>
  180. export default {
  181. data() {
  182. return {
  183. list: [
  184. {
  185. name: '课程目录'
  186. },
  187. {
  188. name: '课程介绍'
  189. },
  190. {
  191. name: '出题名师'
  192. },
  193. {
  194. name: '相关推荐'
  195. }
  196. ],
  197. activeStatus: false, //课程目录下拉样式变化是否开启
  198. activeStatusCata: 0, //当前选中章节
  199. current: 0,
  200. h1: 0,
  201. h2: 0,
  202. h3: 0,
  203. h4: 0,
  204. hh1: 0,
  205. hh2: 0,
  206. hh3: 0,
  207. hh4: 0,
  208. foot_h: 0,
  209. top_h: 0,
  210. windowHeight: 0,
  211. modules4Bottom: 0,
  212. isClick: false,
  213. // vid: 'd5f6d309fe0b016d3844b194a8b32249_d', // 视频ID
  214. vid: '', // 视频ID
  215. sign: '',
  216. ts: '',
  217. startStatus: false,
  218. queryData: {}, //页面跳转内容
  219. pageData: {},
  220. infoData: {},
  221. chapterList: [], //章列表
  222. teacherInfo: {},
  223. faceGetState: true, //模拟今天是否人脸识别
  224. showBox: false,
  225. boxList: [], //章节弹窗列表
  226. payStatus: true, //是否购买该课程
  227. commendList: [], //推荐课程列表
  228. collecStatus: false, //收藏状态
  229. initH4: 0
  230. };
  231. },
  232. onLoad(option) {
  233. const Verify = require('@/wxcomponents/verify_mpsdk/main.js');
  234. Verify.init();
  235. this.$api.courseInfo(option.id).then(res => {
  236. this.queryData = res.data.data;
  237. this.getTeacher(res.data.data.teacherIds);
  238. this.getChapter(res.data.data.courseId);
  239. this.getcommendList(res.data.data.courseId);
  240. });
  241. },
  242. onShow() {
  243. if (!uni.getStorageSync('union_id') && this.$store.state.token === '') {
  244. } else {
  245. this.favoritesStatus();
  246. }
  247. let that = this;
  248. this.windowHeight = uni.getSystemInfoSync().windowHeight;
  249. setTimeout(function() {
  250. that.getHeight();
  251. }, 1800);
  252. },
  253. onPageScroll: function(e) {
  254. //防止触发两次跳动
  255. if (this.isClick) {
  256. return;
  257. }
  258. if (e.scrollTop <= this.hh1) {
  259. this.current = 0;
  260. }
  261. if (e.scrollTop <= this.hh2 && e.scrollTop > this.hh1) {
  262. this.current = 1;
  263. }
  264. if (e.scrollTop <= this.hh3 && e.scrollTop > this.hh2) {
  265. this.current = 2;
  266. }
  267. if (e.scrollTop > this.hh3) {
  268. this.current = 3;
  269. }
  270. },
  271. methods: {
  272. getHeight() {
  273. let that = this;
  274. },
  275. swipStatus() {
  276. this.activeStatus = !this.activeStatus;
  277. let self = this;
  278. self.$nextTick(function() {
  279. self.getHeight();
  280. });
  281. },
  282. getHeight() {
  283. let that = this;
  284. const query = uni.createSelectorQuery().in(this);
  285. query
  286. .select('#modules1')
  287. .boundingClientRect(data => {
  288. that.h1 = data.height;
  289. that.countHeight(that);
  290. })
  291. .exec();
  292. query
  293. .select('#modules2')
  294. .boundingClientRect(data => {
  295. that.h2 = data.height;
  296. console.log(data.height, 66);
  297. that.countHeight(that);
  298. })
  299. .exec();
  300. query
  301. .select('#modules3')
  302. .boundingClientRect(data => {
  303. that.h3 = data.height;
  304. that.countHeight(that);
  305. })
  306. .exec();
  307. query
  308. .select('#modules4')
  309. .boundingClientRect(data => {
  310. that.h4 = data.height;
  311. console.log(data.height, 4444);
  312. // that.h4 = data.height;
  313. if (that.h4 == 0) {
  314. that.h4 = data.height;
  315. }
  316. that.countHeight(that);
  317. })
  318. .exec();
  319. query
  320. .select('#foot')
  321. .boundingClientRect(data => {
  322. that.foot_h = data.height;
  323. that.countModelusPadding();
  324. })
  325. .exec();
  326. query
  327. .select('#top')
  328. .boundingClientRect(data => {
  329. that.top_h = data.height;
  330. that.countModelusPadding();
  331. })
  332. .exec();
  333. },
  334. favoritesStatus() {
  335. this.$api.coursecollectPD(this.queryData.courseId).then(result => {
  336. if (result.data.data === undefined) {
  337. this.collecStatus = false;
  338. } else {
  339. this.collecStatus = true;
  340. }
  341. });
  342. },
  343. favorites() {
  344. var self = this;
  345. if (!uni.getStorageSync('union_id') && this.$store.state.token === '') {
  346. uni.navigateTo({
  347. url: '/pages/login/login'
  348. });
  349. } else {
  350. if (this.collecStatus) {
  351. this.$api.coursecollectPD(this.queryData.courseId).then(results => {
  352. self.$api.deletecoursecollect(results.data.data.collectCourseId).then(resz => {
  353. self.favoritesStatus();
  354. });
  355. });
  356. } else {
  357. var data = {
  358. userId: this.$store.state.userInfo.userId,
  359. courseId: this.queryData.courseId
  360. };
  361. this.$api.coursecollect(data).then(res => {
  362. self.favoritesStatus();
  363. });
  364. }
  365. }
  366. },
  367. getcommendList(v) {
  368. let self = this;
  369. var data = {
  370. courseId: v
  371. };
  372. this.$api.courseInforecommendList(data).then(res => {
  373. self.commendList = res.data.data;
  374. self.$nextTick(function() {
  375. self.getHeight();
  376. });
  377. });
  378. },
  379. activeList(item, index) {
  380. var self = this;
  381. var dataset = {
  382. chapterId: item.chapterId
  383. };
  384. this.$api.coursesectionlist(dataset).then(result => {
  385. self.boxList = result.data.rows;
  386. });
  387. this.showBox = true;
  388. },
  389. getsec(item) {
  390. this.startStatus = false;
  391. this.infoData = item;
  392. this.vid = this.infoData.vid;
  393. this.activeStatusCata = item.chapterId;
  394. this.showBox = false;
  395. },
  396. getChapter(v) {
  397. var self = this;
  398. var data = {
  399. courseId: v
  400. };
  401. this.$api.coursechapterlist(data).then(res => {
  402. var chaList = res.data.rows;
  403. if (chaList.length === 0) {
  404. uni.showToast({
  405. title: '暂无相关章节内容',
  406. icon: 'none',
  407. duration: 2000
  408. });
  409. return;
  410. }
  411. var dataset = {
  412. chapterId: res.data.rows[0].chapterId
  413. };
  414. self.$api.coursesectionlist(dataset).then(result => {
  415. self.getsec(result.data.rows[0]);
  416. });
  417. this.chapterList = chaList;
  418. });
  419. },
  420. getTeacher(v) {
  421. let self = this;
  422. var data = {
  423. teacherIds: v
  424. };
  425. this.$api.teacherList(data).then(res => {
  426. self.teacherInfo = res.data.rows[0];
  427. });
  428. },
  429. startVideo() {
  430. if (!uni.getStorageSync('union_id') && this.$store.state.token === '') {
  431. uni.navigateTo({
  432. url: '/pages/login/login'
  433. });
  434. } else {
  435. //模拟今天是否人脸识别
  436. if (!this.faceGetState) {
  437. this.certification();
  438. return;
  439. }
  440. if (!this.payStatus) {
  441. uni.showToast({
  442. title: '暂未购买该课程',
  443. icon: 'none',
  444. duration: 2000
  445. });
  446. return;
  447. }
  448. if (this.vid === null) {
  449. uni.showToast({
  450. title: '视频加载失败',
  451. icon: 'none',
  452. duration: 2000
  453. });
  454. return;
  455. }
  456. this.$api
  457. .polyvVideoSign(this.vid)
  458. .then(res => {
  459. this.startStatus = true;
  460. })
  461. .catch(err => {
  462. console.log('报错');
  463. });
  464. }
  465. },
  466. async certification() {
  467. var self = this;
  468. const faceBiz = await self.$api.facecertificationPicBizToken();
  469. self.BizToken = faceBiz.data.data.bizToken;
  470. wx.startVerify({
  471. data: {
  472. token: self.BizToken
  473. },
  474. success: result => {
  475. setTimeout(() => {
  476. self.$api.facecertificationPicDetectInfo(self.BizToken).then(faceRec => {
  477. if (faceRec.data.data === 0) {
  478. uni.showToast({
  479. title: '识别成功',
  480. icon: 'none',
  481. duration: 2000
  482. });
  483. } else {
  484. uni.showToast({
  485. title: '识别失败',
  486. icon: 'none',
  487. duration: 2000
  488. });
  489. console.log('识别失败');
  490. }
  491. });
  492. }, 500);
  493. },
  494. fail: err => {
  495. setTimeout(() => {
  496. console.log('识别功能失败');
  497. uni.showModal({
  498. title: '提示',
  499. content: err,
  500. showCancel: false
  501. });
  502. }, 500);
  503. }
  504. });
  505. },
  506. touchMove(e) {
  507. this.isClick = false;
  508. },
  509. countModelusPadding() {
  510. let offsetHeight = this.windowHeight - this.foot_h - this.top_h;
  511. this.modules4Bottom = offsetHeight > this.h4 ? offsetHeight - this.h4 : 7;
  512. },
  513. countHeight(that) {
  514. this.hh1 = this.h1;
  515. this.hh2 = this.h1 + this.h2;
  516. this.hh3 = this.h1 + this.h2 + this.h3;
  517. this.hh4 = this.h1 + this.h2 + this.h3 + this.h4;
  518. },
  519. getNavTo(item) {
  520. this.$navTo.togo('/pages2/course/detail', {
  521. id: item.courseId
  522. });
  523. },
  524. change(index) {
  525. this.current = index;
  526. let that = this;
  527. this.isClick = true;
  528. if (index == 0) {
  529. uni.pageScrollTo({
  530. scrollTop: 0
  531. });
  532. }
  533. if (index == 1) {
  534. uni.pageScrollTo({
  535. scrollTop: that.h1 + 4
  536. });
  537. }
  538. if (index == 2) {
  539. uni.pageScrollTo({
  540. scrollTop: that.h1 + that.h2 + 4
  541. });
  542. }
  543. if (index == 3) {
  544. uni.pageScrollTo({
  545. scrollTop: that.h1 + that.h2 + that.h3 + 4
  546. });
  547. }
  548. },
  549. jumpBuy() {
  550. var self = this;
  551. uni.getStorage({
  552. key: 'union_id',
  553. success: function(res) {
  554. // 继续操作
  555. },
  556. fail: function(err) {
  557. //重新登入
  558. self.$navTo.togo('/pages/login/login', {});
  559. }
  560. });
  561. }
  562. }
  563. };
  564. </script>
  565. <style>
  566. ::-webkit-scrollbar {
  567. width: 0;
  568. height: 0;
  569. color: transparent;
  570. }
  571. </style>
  572. <style scope>
  573. .content {
  574. padding: 24rpx;
  575. text-align: left;
  576. }
  577. .catalogBox {
  578. display: flex;
  579. align-items: center;
  580. flex-wrap: nowrap;
  581. overflow-x: auto;
  582. padding-left: 38rpx;
  583. max-height: 305rpx;
  584. overflow-y: auto;
  585. transition: all 0.4s;
  586. }
  587. .catalogBox > .catalogA {
  588. min-width: 200rpx;
  589. height: 48rpx;
  590. line-height: 48rpx;
  591. // text-align: center;
  592. border: 2rpx solid transparent;
  593. white-space: nowrap;
  594. text-overflow: ellipsis;
  595. overflow: hidden;
  596. word-break: break-all;
  597. border-radius: 10rpx;
  598. background: rgba(22, 119, 255, 0.05);
  599. padding-left: 19rpx;
  600. box-sizing: border-box;
  601. padding-right: 15rpx;
  602. margin-right: 16rpx;
  603. margin-bottom: 20rpx;
  604. margin-top: 15rpx;
  605. font-size: 24rpx;
  606. color: #666;
  607. }
  608. .catalogBox > .activesq {
  609. border-color: #1677ff;
  610. }
  611. .changeCatalogBox {
  612. display: block;
  613. }
  614. .catalogBox::-webkit-scrollbar {
  615. display: none; /* Chrome Safari */
  616. }
  617. .box {
  618. position: relative;
  619. top: 600rpx;
  620. padding-bottom: 88rpx;
  621. }
  622. .price_t2 {
  623. font-size: 18rpx;
  624. font-family: PingFang SC;
  625. font-weight: 500;
  626. text-decoration: line-through;
  627. color: #999999;
  628. }
  629. .price_t1 {
  630. font-size: 33rpx;
  631. font-family: PingFang SC;
  632. font-weight: bold;
  633. color: #e91313;
  634. }
  635. .sc_t {
  636. font-size: 22rpx;
  637. color: #000000;
  638. }
  639. .sc {
  640. width: 29rpx;
  641. height: 29rpx;
  642. }
  643. .buy {
  644. width: 138rpx;
  645. height: 48rpx;
  646. line-height: 48rpx;
  647. background: #32467b;
  648. border-radius: 10rpx;
  649. color: #ffffff;
  650. font-size: 28rpx;
  651. text-align: center;
  652. vertical-align: middle;
  653. position: absolute;
  654. right: 30rpx;
  655. }
  656. .video_body {
  657. padding-bottom: 96rpx;
  658. }
  659. .footer_tab {
  660. position: fixed;
  661. bottom: 0;
  662. height: 96rpx;
  663. width: 100%;
  664. background-color: #ffffff;
  665. }
  666. .tj_box {
  667. width: 50%;
  668. display: inline-block;
  669. text-align: center;
  670. margin: 10rpx 0;
  671. }
  672. .teacher_t {
  673. font-size: 24rpx;
  674. font-family: PingFang SC;
  675. font-weight: 400;
  676. color: #666666;
  677. line-height: 36rpx;
  678. margin-left: 15rpx;
  679. }
  680. .teacher_img {
  681. width: 87rpx;
  682. height: 129rpx;
  683. }
  684. .t2 {
  685. font-size: 24rpx;
  686. font-family: PingFang SC;
  687. color: #666666;
  688. line-height: 36rpx;
  689. margin: 15rpx;
  690. }
  691. .r_t2 {
  692. width: 201rpx;
  693. height: 49rpx;
  694. background: rgba(22, 119, 255, 0.05);
  695. border: 1rpx solid #32467b;
  696. border-radius: 16rpx;
  697. color: #666666;
  698. font-size: 23rpx;
  699. text-align: center;
  700. display: flex;
  701. align-items: center;
  702. padding: 5rpx;
  703. }
  704. .scroll_box {
  705. width: 100%;
  706. height: 60rpx;
  707. background: #ffffff;
  708. box-shadow: 0rpx 0rpx 16rpx 4rpx rgba(145, 156, 178, 0.1);
  709. white-space: nowrap;
  710. overflow: hidden;
  711. margin: 15rpx 0;
  712. }
  713. .r_sliper {
  714. padding: 0 20rpx;
  715. }
  716. .top_line {
  717. width: 6rpx;
  718. height: 22rpx;
  719. background: #32467b;
  720. margin-right: 10rpx;
  721. }
  722. .video_t2 {
  723. font-size: 24rpx;
  724. font-family: PingFang SC;
  725. font-weight: 500;
  726. color: #666666;
  727. }
  728. .video_t1 {
  729. font-size: 28rpx;
  730. font-family: PingFang SC;
  731. font-weight: bold;
  732. color: #333333;
  733. }
  734. .video_play {
  735. position: absolute;
  736. width: 95rpx;
  737. height: 95rpx;
  738. top: 0;
  739. left: 0;
  740. right: 0;
  741. bottom: 0;
  742. margin: auto;
  743. }
  744. .video_box {
  745. position: relative;
  746. }
  747. .rotoct {
  748. transform: rotate(90deg);
  749. }
  750. page {
  751. background: #ffffff;
  752. }
  753. </style>