courseItem.vue 21 KB

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