courseItem.vue 20 KB

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