courseItem.vue 20 KB

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