courseItem.vue 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845
  1. <template>
  2. <view class="courselist-item" style="height: 100%">
  3. <view class="courselist-con x-start" @click="toCourseDetail(info,sourceType)">
  4. <view class="courselist-img">
  5. <!-- <view class="status">进行中</view> -->
  6. <image :src="info.thumbnail" mode="aspectFill"></image>
  7. </view>
  8. <view class="courselist-con-r">
  9. <view @click.passive.stop="taskFun(info,sourceType)">
  10. <text class="more-t">{{ info.title }}</text>
  11. <view class="btn_icon" style="margin-left: 5px" @click="copyId">
  12. <image :src="imgpath + '/app/images/copy_icon.png'" mode="aspectFill"></image>
  13. </view>
  14. </view>
  15. <view class="courselist-desc one-t" v-show="from != 'course'">{{ info.courseName }}</view>
  16. <view :class="from == 'course' ? 'courselist-con-timebox ' : 'courselist-con-timebox x-f'"
  17. @click.passive.stop="taskFun(info,sourceType)">
  18. <view class="x-f acea-row">
  19. <u-icon class="icon" name="hourglass" color="#999" size="20"></u-icon>
  20. 开始时间:{{ info.startDateTime ? info.startDateTime : '' }}
  21. </view>
  22. <view class="x-f acea-row">
  23. <u-icon class="icon" name="hourglass-half-fill" color="#999" size="20"></u-icon>
  24. 结束时间:{{ info.endDateTime ? info.endDateTime : '' }}
  25. </view>
  26. <view class="justify-between align-center">
  27. <view class="x-f acea-row">
  28. <u-icon class="icon" name="clock" color="#999" size="16"></u-icon>
  29. {{ $formatSeconds(info.duration, 1) }}
  30. </view>
  31. <view class="u-border radius50 ptb8 plr18 base-color-6" style="width: fit-content"
  32. @click="showtime = !showtime">调整看课时间</view>
  33. </view>
  34. <u-modal :show="showtime" :title="titletime" @confirm="confirmtime" @close="showtime = !showtime"
  35. @cancel="showtime = !showtime" :closeOnClickOverlay="true" :showCancelButton="true">
  36. <view class="slot-content">
  37. <view class="justify-start align-center">
  38. <view class="mr20">开始时间:</view>
  39. <u-input v-model="startTimevalue" placeholder="请选择开始时间"
  40. @focus="startTime = !startTime"></u-input>
  41. </view>
  42. <view class="justify-start align-center mt20">
  43. <view class="mr20">结束时间:</view>
  44. <u-input v-model="endTimevalue" placeholder="请选择结束时间"
  45. @focus="endtime = !endtime"></u-input>
  46. </view>
  47. </view>
  48. </u-modal>
  49. <u-datetime-picker :show="startTime" v-model="value1" mode="time" @cancel="startTime = !startTime"
  50. @confirm="confirmstart"></u-datetime-picker>
  51. <u-datetime-picker :show="endtime" v-model="value2" mode="time" @cancel="endtime = !endtime"
  52. @confirm="confirmend"></u-datetime-picker>
  53. </view>
  54. </view>
  55. </view>
  56. <view class="justify-start align-center ml20">
  57. <view class="base-color-6 mr20">所属项目</view>
  58. <view>{{ info.projectName }}</view>
  59. </view>
  60. <view class="courselist-footer x-f">
  61. <!--#ifdef APP-PLUS-->
  62. <view class="courselist-footer-item x-c" @click="handleSendIm()">
  63. <u-icon name="share-square" color="#1677ff" size="18"></u-icon>
  64. 分享课程
  65. </view>
  66. <!--#endif-->
  67. <!--#ifdef MP-WEIXIN-->
  68. <view class="courselist-footer-item x-c" @click="handleClick()">
  69. <u-icon name="share-square" color="#1677ff" size="18"></u-icon>
  70. 分享课程
  71. </view>
  72. <!--#endif-->
  73. <!--#ifdef H5-->
  74. <view class="courselist-footer-item x-c" @click="handleShare">
  75. <u-icon name="share-square" color="#1677ff" size="18"></u-icon>
  76. 分享课程
  77. </view>
  78. <!--#endif-->
  79. <view class="courselist-footer-item x-c" @click="createTask(info)">
  80. 一键群发
  81. </view>
  82. <view class="courselist-footer-item x-c" v-show="activeTab == 1" @click="handleStatistics">
  83. <u-icon name="share-square" color="#1677ff" size="18"></u-icon>
  84. 课程统计
  85. </view>
  86. <view class="courselist-footer-item x-c shuju" v-show="activeTab == 2" @click="handleStatistics">
  87. <u-icon name="share-square" color="#1677ff" size="18"></u-icon>
  88. 数据统计
  89. </view>
  90. </view>
  91. <!-- 分享弹窗 -->
  92. <u-popup :show="showShare" :closeOnClickOverlay="true" :round="20" @close="closeShare" @open="openShare">
  93. <view class="sharePop x-ac">
  94. <!--#ifdef MP-WEIXIN-->
  95. <view class="sharePop-item y-f card-share">
  96. <image :src="imgPath + '/app/images/card_icon.png'" mode="aspectFill"
  97. style="width: 80rpx; height: 80rpx; margin-top: 20rpx"></image>
  98. <view style="font-weight: bold; margin-bottom: 4px">生成卡片</view>
  99. <view style="font-size: 12px; color: #888">指导分享轻松转发</view>
  100. </view>
  101. <!--#endif-->
  102. <!--#ifdef H5-->
  103. <view class="sharePop-item y-f" @click="buildimg">
  104. <image :src="imgPath + '/app/images/poster_icon.png'" mode="aspectFill"></image>
  105. <view style="font-weight: bold; margin-bottom: 4px">生成海报</view>
  106. <view style="font-size: 12px; color: #888">保存海报美观宣传</view>
  107. </view>
  108. <view class="sharePop-item y-f" @click="copyLink">
  109. <image :src="imgPath + '/app/images/link_icon.png'" mode="aspectFill"></image>
  110. <view style="font-weight: bold; margin-bottom: 4px">复制链接</view>
  111. <view style="font-size: 12px; color: #888">生成链接一键复制</view>
  112. </view>
  113. <!--#endif-->
  114. </view>
  115. </u-popup>
  116. <!-- 设置链接有效时长弹窗 -->
  117. <u-modal :show="setTimeShow" content="content" class="model" @confirm="confirmTime" :closeOnClickOverlay="true"
  118. :asyncClose="false" @close="closetext">
  119. <view class="setTimebox">
  120. <view class="timetip">不传默认以系统参数为准</view>
  121. <view class="x-f">
  122. <text style="margin-right: 20px">链接有效时长(分钟)</text>
  123. <u-input fontSize="14px" placeholder="链接有效时长" border="none" v-model="time" maxlength="5"></u-input>
  124. </view>
  125. </view>
  126. </u-modal>
  127. <!-- <u-notify ref="uNotify" message=""></u-notify> -->
  128. <!-- 生成海报 -->
  129. <u-popup :show="setImg" @close="closeimg" :round="12" style="z-index: 999">
  130. <view class="w100 h540 center">
  131. <image :src="codeLink.url" mode="aspectFill"></image>
  132. </view>
  133. <view class="justify-around mb40">
  134. <!-- <view class="column justify-center align-center" @click="shareimg">
  135. <image :src=:src="imgPath+'/app/image/wechat.png'" class="w80 h80"></image>
  136. <view class="mt10">微信好友</view>
  137. </view> -->
  138. <view class="column justify-center align-center" @click="downimg">
  139. <image :src="imgPath + '/app/image/downicon.png'" class="w80 h80"></image>
  140. <view class="mb10">长按图片保存</view>
  141. </view>
  142. </view>
  143. </u-popup>
  144. <u-overlay :show="showzhidao" @click="showzhidao = false" style="z-index: 9999">
  145. <view class="point-box">
  146. <view class="imgshe">
  147. <image :src="imgPath + '/app/image/point.png'" class="w300 h300"></image>
  148. </view>
  149. <view class="column colorf fs32 xu-box fs40 align-center justify-center">
  150. <view class="justify-center">
  151. 点击右上角
  152. <image :src="imgPath + '/app/image/wxmore.png'" class="w50 h50 mlr10" />
  153. </view>
  154. <view class="mt20">选择 “转发给朋友”</view>
  155. <view style="color: #cbcbcb" class="fs28 mt40">点击任意位置关闭弹窗</view>
  156. </view>
  157. </view>
  158. </u-overlay>
  159. </view>
  160. </template>
  161. <script>
  162. import {
  163. props
  164. } from 'uview-ui/libs/mixin/mixin';
  165. import {
  166. sharecourselink,
  167. buildCode,
  168. getSDK,
  169. updataTime
  170. } from '../api/courseManage';
  171. import IMSDK, {
  172. IMMethods,
  173. MessageStatus,
  174. MessageType,
  175. SessionType
  176. } from 'openim-uniapp-polyfill';
  177. export default {
  178. props: {
  179. activeTab: {
  180. type: [Number, String],
  181. default: 0
  182. },
  183. // 来源
  184. from: {
  185. type: String,
  186. default: 'live'
  187. },
  188. sourceType: {
  189. type: String,
  190. default: ''
  191. },
  192. info: {
  193. type: Object,
  194. default: () => {
  195. return {};
  196. }
  197. },
  198. parentMethod: {
  199. type: Function
  200. }
  201. },
  202. data() {
  203. return {
  204. cavansimg: false,
  205. showShare: false,
  206. setTimeShow: false,
  207. time: '',
  208. user: [],
  209. type: 1,
  210. copylink: '',
  211. codeLink: '',
  212. setImg: false,
  213. sendCourse: false,
  214. painterId: 'myPainter',
  215. isLongPress: false,
  216. painterSrc: '',
  217. showzhidao: false,
  218. imgPath: this.$store.getters.imgpath,
  219. imgs: this.$store.getters.imgpath + '/app/image/logoshare.png',
  220. showtime: false,
  221. titletime: '调整看课时间',
  222. endTimevalue: '',
  223. startTimevalue: '',
  224. startTime: false,
  225. endtime: false,
  226. value1: '00:00',
  227. value2: '23:59'
  228. };
  229. },
  230. computed: {
  231. imgPath() {
  232. return this.$store.getters.imgpath;
  233. }
  234. },
  235. onLoad() {},
  236. onShow() {
  237. this.setTimeShow = false
  238. this.showShare = false
  239. },
  240. mounted() {
  241. this.user = uni.getStorageSync('companyUserInfo') ? JSON.parse(uni.getStorageSync('companyUserInfo')) : {};
  242. },
  243. methods: {
  244. confirmstart(e) {
  245. this.startTimevalue = e.value;
  246. this.startTime = !this.startTime;
  247. console.log(e);
  248. },
  249. confirmend(e) {
  250. this.endTimevalue = e.value;
  251. this.endtime = !this.endtime;
  252. console.log(e);
  253. },
  254. confirmtime() {
  255. if (this.startTimevalue == '') {
  256. uni.showToast({
  257. title: '请选择开始时间',
  258. icon: 'none',
  259. duration: 1000
  260. });
  261. return;
  262. }
  263. if (this.endTimevalue == '') {
  264. uni.showToast({
  265. title: '请选择结束时间',
  266. icon: 'none',
  267. duration: 1000
  268. });
  269. return;
  270. }
  271. this.showtime = !this.showtime;
  272. const data = {
  273. periodId: this.info.periodId,
  274. courseId: this.info.courseId,
  275. videoId: this.info.videoId,
  276. startDateTime: this.info.startDateTime.substring(0, 10) + ' ' + this.startTimevalue + ':00',
  277. endDateTime: this.info.endDateTime.substring(0, 10) + ' ' + this.endTimevalue + ':59'
  278. };
  279. updataTime([data]).then((res) => {
  280. if (res.code == 200) {
  281. uni.showToast({
  282. title: '完成看课时间调整!',
  283. icon: 'none',
  284. duration: 1000
  285. });
  286. this.$emit('retime', 1);
  287. } else {
  288. uni.showToast({
  289. title: res.msg,
  290. icon: 'none',
  291. duration: 1000
  292. });
  293. }
  294. });
  295. },
  296. handleClick() {
  297. this.parentMethod();
  298. this.$emit('trigger-share', {
  299. title: this.info.courseName + this.info.title,
  300. path: 'pages_course/videovip',
  301. onshow: true,
  302. params: {
  303. companyId: this.user.companyId,
  304. companyUserId: this.user.userId,
  305. id: this.info.id,
  306. projectId: this.info.projectId,
  307. courseId: this.info.courseId,
  308. videoId: this.info.videoId,
  309. periodId: this.info.periodId
  310. },
  311. img: this.info.thumbnail || this.imgs
  312. });
  313. },
  314. handleSendIm() {
  315. this.sendCourse = true;
  316. this.setTimeShow = true;
  317. },
  318. async handleSendImAction(linkId) {
  319. let payloadJson = {
  320. payload: {
  321. data: "course",
  322. extension: {
  323. title: this.info.title,
  324. appRealLink: this.copylink,
  325. courseUrl: this.info.thumbnail
  326. }
  327. }
  328. };
  329. let forwardMessage = {
  330. data: JSON.stringify(payloadJson),
  331. extension: '',
  332. description: 'course'
  333. };
  334. this.info.linkId = linkId
  335. uni.setStorageSync('courseItemData', this.info)
  336. uni.navigateTo({
  337. url: `/pages_im/pages/common/contactChoose/index?type=SendCourse&forwardMessage=${encodeURIComponent(JSON.stringify(forwardMessage))}&linkId=${linkId}`
  338. });
  339. },
  340. // 获取jssdk
  341. getjssdklist() {
  342. const param = {
  343. url: window.location.href.split('#')[0] // 注意去除 hash
  344. };
  345. getSDK(param).then((res) => {
  346. wx.config({
  347. debug: false,
  348. appId: res.data.appId, // 必填,公众号的唯一标识
  349. timestamp: res.data.timestamp, // 必填,生成签名的时间戳
  350. nonceStr: res.data.nonceStr, // 必填,生成签名的随机串
  351. signature: res.data.signature, // 必填,签名
  352. jsApiList: ['updateAppMessageShareData', 'onMenuShareAppMessage'] // 必填,需要使用的JS接口列表
  353. });
  354. });
  355. },
  356. shareimg() {
  357. let self = this;
  358. //分享好友
  359. // 配置--配置全局
  360. console.log(self.info.thumbnail + self.copylink, 11111);
  361. wx.ready(function() {
  362. //需在用户可能点击分享按钮前就先调用
  363. wx.updateAppMessageShareData({
  364. title: self.info.courseName + self.info.title, // 分享标题
  365. desc: self.info.description, // 分享描述
  366. // link: self.copylink,
  367. link: self.copylink,
  368. // 分享链接,该链接域名或路径必须与当前页面对应的公众 号JS安全域名一致
  369. imgUrl: self.info.thumbnail || self.imgs, // 分享图标
  370. success: function(res) {
  371. console.log(self.info, '456');
  372. self.showzhidao = true;
  373. self.setImg = false;
  374. self.showShare = false;
  375. // 设置成功
  376. uni.showToast({
  377. title: '卡片已生成',
  378. icon: 'none',
  379. duration: 1000
  380. });
  381. }
  382. });
  383. // 另外一个方法·
  384. wx.onMenuShareAppMessage({
  385. title: self.info.courseName + self.info.title, // 分享标题
  386. desc: self.info.title, // 分享描述
  387. link: self.copylink,
  388. // 分享链接,该链接域名或路径必须与当前页面对应的公众 号JS安全域名一致
  389. imgUrl: self.info.thumbnail, // 分享图标
  390. success: function(res) {
  391. console.log(self.info, '456');
  392. self.showzhidao = true;
  393. self.setImg = false;
  394. self.showShare = false;
  395. // 设置成功
  396. uni.showToast({
  397. title: '卡片已生成',
  398. icon: 'none',
  399. duration: 1000
  400. });
  401. }
  402. // complete: function(res) {
  403. // uni.showToast({
  404. // title: JSON.stringify(res),
  405. // icon: 'none',
  406. // duration: 2000
  407. // })
  408. // }
  409. });
  410. // wx.error((res) => {
  411. // console.log('wx.error:', res);
  412. // })
  413. });
  414. },
  415. downimg() {},
  416. handleLongPress() {
  417. this.isLongPress = true;
  418. // 延时执行保存操作,避免误触
  419. setTimeout(() => {
  420. if (this.isLongPress) {
  421. this.saveImage();
  422. }
  423. }, 1000); // 1000毫秒后执行保存操作
  424. },
  425. saveImage() {
  426. const painter = this.$painter.getPainter(this.painterId);
  427. painter.saveImage(
  428. 'jpg',
  429. (path) => {
  430. uni.saveImageToPhotosAlbum({
  431. filePath: path,
  432. success: () => {
  433. uni.showToast({
  434. title: '保存成功'
  435. });
  436. },
  437. fail: () => {
  438. uni.showToast({
  439. title: '保存失败',
  440. icon: 'none'
  441. });
  442. }
  443. });
  444. },
  445. 'myCanvas'
  446. );
  447. },
  448. closeimg() {
  449. this.setImg = false;
  450. this.showShare = false;
  451. },
  452. closetext() {
  453. this.setTimeShow = false;
  454. },
  455. buildimg() {
  456. this.buildimgAcode();
  457. },
  458. //生成海报和二维码
  459. buildimgAcode() {
  460. uni.showLoading({
  461. title: '正在生成中...'
  462. });
  463. buildCode({
  464. companyId: this.user.companyId,
  465. companyUserId: this.user.userId,
  466. courseId: this.info.courseId,
  467. effectiveDuration: this.time,
  468. videoId: this.info.videoId,
  469. imgUrl: this.info.thumbnail,
  470. title: this.info.title,
  471. duration: this.info.duration,
  472. periodId: this.info.periodId,
  473. id: this.info.id
  474. }).then((res) => {
  475. if (res.code == 200) {
  476. this.codeLink = res.posterImage;
  477. this.setImg = true;
  478. this.getlink();
  479. console.log(this.codeLink);
  480. } else {
  481. uni.showToast({
  482. icon: 'none',
  483. title: res.msg
  484. });
  485. }
  486. });
  487. },
  488. taskFun(info, sourceType) {
  489. if (sourceType == 'createTask') {
  490. return this.$emit('courseClick', info);
  491. }
  492. },
  493. toCourseDetail(info, sourceType) {
  494. if (sourceType == 'createTask') {
  495. return this.$emit('courseClick', info);
  496. }
  497. uni.navigateTo({
  498. // url: '/pages/courseManage/course/learning?course='+JSON.stringify(info)
  499. // url: `/pages/courseManage/course/learning?course=${JSON.stringify(info)}&isvip=1`
  500. url: '/pages_managedata/coursedetail?videoId=' + info.videoId + '&id=' + info.id +
  501. '&periodId=' + info.periodId
  502. });
  503. },
  504. handleShare() {
  505. // #ifdef H5
  506. this.getjssdklist();
  507. this.showShare = true;
  508. // #endif
  509. // this.getlink('preload'); // 提前加载链接
  510. },
  511. closeShare() {
  512. this.showShare = false;
  513. // console.log('open');
  514. },
  515. openShare() {
  516. // this.showShare = false
  517. // console.log('close');
  518. },
  519. copyLink() {
  520. this.setTimeShow = true;
  521. },
  522. confirmTime() {
  523. const params = {
  524. companyId: this.user.companyId,
  525. companyUserId: this.user.userId,
  526. courseId: this.info.courseId,
  527. effectiveDuration: this.time,
  528. videoId: this.info.videoId,
  529. periodId: this.info.periodId,
  530. type: 1,
  531. id: this.info.id
  532. };
  533. sharecourselink(params).then((res) => {
  534. this.showShare = false;
  535. this.setTimeShow = false;
  536. if (res.code == 200) {
  537. this.copylink = res.url;
  538. if (this.sendCourse) {
  539. this.sendCourse = false;
  540. this.handleSendImAction(res.linkId);
  541. return;
  542. }
  543. setTimeout(() => {
  544. uni.setClipboardData({
  545. data: this.copylink,
  546. success: () => {
  547. uni.showToast({
  548. title: '链接已复制',
  549. icon: 'none',
  550. duration: 2000
  551. });
  552. },
  553. fail: () => {
  554. uni.showToast({
  555. title: '复制失败',
  556. icon: 'none'
  557. });
  558. }
  559. });
  560. }, 100);
  561. } else {
  562. uni.showToast({
  563. icon: 'none',
  564. title: res.msg
  565. });
  566. }
  567. });
  568. },
  569. getlink(type) {
  570. const params = {
  571. companyId: this.user.companyId,
  572. companyUserId: this.user.userId,
  573. courseId: this.info.courseId,
  574. time: this.time,
  575. periodId: this.info.periodId,
  576. id: this.info.id,
  577. // type: this.type,
  578. videoId: this.info.videoId
  579. };
  580. sharecourselink(params).then((res) => {
  581. if (res.code == 200) {
  582. this.copylink = res.url;
  583. // 强制使用 HTTPS
  584. // if (this.copylink.startsWith('http://')) {
  585. // this.copylink = this.copylink.replace('http://', 'https://');
  586. // }
  587. } else {
  588. uni.showToast({
  589. icon: 'none',
  590. title: res.msg
  591. });
  592. }
  593. });
  594. },
  595. handleStatistics() {
  596. const info = {
  597. courseId: this.info.courseId,
  598. title: this.info.title,
  599. thumbnail: this.info.thumbnail,
  600. createTime: this.info.createTime,
  601. duration: this.info.duration,
  602. fileId: this.info.fileId,
  603. courseName: this.info.courseName,
  604. videoId: this.info.videoId,
  605. periodId: this.info.periodId
  606. };
  607. console.log();
  608. uni.navigateTo({
  609. url: '/pages_manage/statistic?info=' + JSON.stringify(info)
  610. });
  611. },
  612. copyId() {
  613. uni.setClipboardData({
  614. data: this.info.title,
  615. success: () => {
  616. // this.$refs.uNotify.show({
  617. // top: 0,
  618. // type: 'success',
  619. // // color: '#000',
  620. // // bgColor: '#e8e8e8',
  621. // message: '复制课程标题成功',
  622. // duration: 1000 * 2,
  623. // fontSize: 20,
  624. // safeAreaInsetTop: true
  625. // })
  626. uni.showToast({
  627. icon: 'none',
  628. title: '复制课程标题成功'
  629. });
  630. }
  631. });
  632. },
  633. createTask(e) {
  634. uni.setStorageSync('courseItemArr', e)
  635. uni.navigateTo({
  636. url: '/pages_manage/createTask?title=一键群发'
  637. })
  638. }
  639. }
  640. };
  641. </script>
  642. <style scoped lang="scss">
  643. .card-share {
  644. position: relative;
  645. }
  646. .share {
  647. display: inline-block;
  648. position: absolute;
  649. top: 0;
  650. left: 0;
  651. width: 100%;
  652. height: 100%;
  653. opacity: 0;
  654. }
  655. .imgshe {
  656. display: flex;
  657. flex-direction: row-reverse;
  658. }
  659. .point-box {
  660. height: 100%;
  661. width: 100%;
  662. .xu-box {
  663. border: #f5f5f5 4rpx dashed;
  664. padding: 20rpx 20rpx;
  665. }
  666. }
  667. #codeurl {
  668. position: relative;
  669. }
  670. ::v-deep {
  671. .model .u-fade-enter-active {
  672. z-index: 10075 !important;
  673. }
  674. }
  675. .sharePop {
  676. background-color: #fff;
  677. padding: 30rpx 0;
  678. border-radius: 20px 20px 0 0;
  679. /* #ifdef MP-WEIXIN */
  680. /* #endif */
  681. /* #ifdef H5 */
  682. padding-bottom: 100px;
  683. /* #endif */
  684. &-item {
  685. padding: 0 10px;
  686. box-sizing: border-box;
  687. font-family: PingFang SC, PingFang SC;
  688. font-weight: 400;
  689. font-size: 14px;
  690. display: inline-flex !important;
  691. image {
  692. height: 48px;
  693. width: 48px;
  694. margin-bottom: 10px;
  695. }
  696. }
  697. }
  698. .setTimebox {
  699. font-family: PingFang SC, PingFang SC;
  700. font-weight: 400;
  701. font-size: 14px;
  702. }
  703. .timetip {
  704. font-family: PingFang SC, PingFang SC;
  705. font-weight: 400;
  706. font-size: 14px;
  707. color: #2979ff;
  708. text-align: center;
  709. margin-bottom: 5px;
  710. }
  711. .courselist {
  712. font-family: PingFang SC, PingFang SC;
  713. font-weight: 400;
  714. font-size: 14px;
  715. &-item {
  716. width: 100%;
  717. border-radius: 14px;
  718. background-color: #fff;
  719. overflow: hidden;
  720. margin-bottom: 10px;
  721. }
  722. &-con {
  723. padding: 10px 10px 5px 10px;
  724. font-size: 12px;
  725. color: #777;
  726. }
  727. &-con-r {
  728. flex: 1;
  729. overflow: hidden;
  730. .more-t {
  731. flex: 1;
  732. font-size: 14px;
  733. color: #222;
  734. display: inline;
  735. }
  736. image {
  737. width: 20px;
  738. height: 20px;
  739. }
  740. .btn_icon {
  741. font-size: 14px;
  742. color: #1677ff;
  743. display: inline-flex;
  744. align-items: center;
  745. }
  746. }
  747. &-img {
  748. width: 110px;
  749. height: 70px;
  750. border-radius: 10px;
  751. overflow: hidden;
  752. flex-shrink: 0;
  753. margin-right: 10px;
  754. position: relative;
  755. image {
  756. height: 100%;
  757. width: 100%;
  758. }
  759. .status {
  760. position: absolute;
  761. top: 0;
  762. left: 0;
  763. z-index: 2;
  764. height: 21px;
  765. padding: 0 5px;
  766. box-sizing: border-box;
  767. line-height: 21px;
  768. border-radius: 10px 0 10px 0;
  769. text-align: center;
  770. color: #fff;
  771. background-color: #08ce36;
  772. }
  773. }
  774. &-desc {
  775. flex: 1;
  776. margin-top: 7px;
  777. }
  778. &-con-timebox {
  779. margin-top: 7px;
  780. flex-wrap: wrap;
  781. .acea-row {
  782. margin-right: 12px;
  783. margin-bottom: 5px;
  784. flex-wrap: nowrap;
  785. }
  786. .icon {
  787. margin-right: 5px;
  788. }
  789. }
  790. &-footer {
  791. padding: 5px;
  792. font-size: 14px;
  793. &-item {
  794. flex: 1;
  795. text-align: center;
  796. color: #1677ff;
  797. padding: 6px;
  798. box-sizing: border-box;
  799. }
  800. .shishi {
  801. border-left: 1px solid #f5f5f5;
  802. }
  803. .shuju {
  804. border-radius: 5px;
  805. border: 1px solid #1677ff;
  806. }
  807. }
  808. }
  809. </style>