operationBtn.vue 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853
  1. <template>
  2. <view>
  3. <view class="userInfo">
  4. <!-- 1.头像 -->
  5. <navigator v-show="isShowCent" hover-class="none"
  6. :url="'/pages/discover/discover_user/index?id='+list.authorId" class="pictrue">
  7. <image class="userAvatar" :src="list.authorAvatar || urlDomain+'crmebimage/presets/morenT.png'"
  8. mode="aspectFill">
  9. </image>
  10. <view v-if="!list.isConcerned && list.authorId!==uid" class="guanzhu" @click.stop="followAuthor(list)">
  11. <text class="iconfont icon-ic_increase"></text></view>
  12. <view v-else class="yiguanzhu"><text class="iconfont"></text></view>
  13. </navigator>
  14. <!-- 其他按钮 -->
  15. <view v-for="(item, index) in operationButton(list, isShowCent)" :key="index"
  16. @click.stop="handleButton(item);" class="flex-column" :style="{ marginTop : item.top}">
  17. <!-- 提到的商品 -->
  18. <view v-if="item.type==='collection'" @click="openMore(list)" class="mention"
  19. style="opacity: 0.9; margin-top: 18px;">
  20. <image src="../static/images/collection.png"></image>
  21. <text class="count">{{list.productList.length}}</text>
  22. </view>
  23. <view :class="item.style">
  24. <text class="iconfont" :class="( item.type === 'like' && list.userIsLike ? 'likeNumActive' : '') + ' ' + item.icon"></text>
  25. </view>
  26. <text class="info-text">{{item.num && item.num > 0 ? item.num : item.text}}</text>
  27. </view>
  28. <view class="manage" v-show="showManage">
  29. <view v-for="(item, index) in myOperationButton(list)" :key="index" class="items" @click.stop="handleMyOperationButton(item)">
  30. <text class="iconfont" :class="item.icon"></text>
  31. <text>{{item.text}}</text>
  32. </view>
  33. </view>
  34. </view>
  35. <!-- 评论 -->
  36. <tui-bottom-popup :zIndex="98" :maskZIndex="97" :show="showComment" @close="closeComment">
  37. <view
  38. :style="'width: 100%; background-color: #fff; border-top-left-radius: 40rpx; border-top-right-radius: 40rpx;'">
  39. <discoverComment v-if="showComment" fromTo="popupView" :noteId="noteId" :noteDetails="noteDetail"
  40. @close="closeComment">
  41. </discoverComment>
  42. </view>
  43. </tui-bottom-popup>
  44. <!-- 他提到的宝贝弹窗 -->
  45. <uni-popup type="bottom" ref="pinglunMentioned">
  46. <view
  47. :style="'width: '+ windowWidth +'px;background-color: #F5F5F5;max-height:1200rpx; border-top-left-radius: 40rpx; border-top-right-radius: 40rpx;overflow-y: scroll;'">
  48. <mentioned ref="mentioned" :list="proList" @close="popup" fromType="video" :goodsStyle="goodsStyle">
  49. </mentioned>
  50. </view>
  51. </uni-popup>
  52. <!-- 分享按钮 -->
  53. <image v-if="H5ShareBox" class="shareImg" :src="urlDomain+'crmebimage/presets/share-info.png'"
  54. @click="H5ShareBox = false"></image>
  55. <!-- 分享按钮 -->
  56. <view class="generate-posters acea-row row-middle" :class="posters ? 'on' : ''">
  57. <!-- #ifndef MP -->
  58. <button class="item" :class="weixinStatus ? 'item3' : ''" hover-class='none' v-if="weixinStatus === true"
  59. @click="H5ShareBox = true">
  60. <view class="iconfont icon-icon_WeChat_1"></view>
  61. <view class="">发送给朋友</view>
  62. </button>
  63. <!-- #endif -->
  64. <!-- #ifdef MP -->
  65. <button class="item" :class="weixinStatus ? 'item3' : ''" open-type="share" hover-class='none'
  66. @click="goFriend">
  67. <view class="iconfont icon-icon_WeChat_1"></view>
  68. <view class="">发送给朋友</view>
  69. </button>
  70. <!-- #endif -->
  71. <button class="item" :class="weixinStatus ? 'item3' : ''" hover-class='none' @click="goPoster">
  72. <view class="iconfont icon-a-ic_picture1"></view>
  73. <view class="">生成海报</view>
  74. </button>
  75. </view>
  76. <view class="mask" v-if="posters" @click="listenerActionClose"></view>
  77. <!-- 海报展示 -->
  78. <view class='mask' v-if="posterImageStatus"></view>
  79. <view class='poster-pop' v-if="posterImageStatus">
  80. <image src='../static/images/poster-close.png' class='close' @click="posterImageClose"></image>
  81. <image :src='posterImage' class="image"></image>
  82. <!-- #ifndef H5 -->
  83. <view class="keep" @click="handleSavePosterPath">保存到相册</view>
  84. <!-- #endif -->
  85. </view>
  86. <view class="canvas" v-if="canvasStatus">
  87. <canvas style="width:750px;height:1190px;" canvas-id="myCanvas"></canvas>
  88. </view>
  89. <canvas v-if="qrcodecanvasStatus" class="qrcodecanvasStatus" canvas-id="qrcode"
  90. :style="{width: `${qrcodeSize}px`, height: `${qrcodeSize}px`}" />
  91. </view>
  92. </template>
  93. <script>
  94. import {
  95. mapGetters
  96. } from "vuex";
  97. import {
  98. discoverFollowAuthor,
  99. discoverNoteLike
  100. } from "../../../libs/follow";
  101. import {
  102. Debounce
  103. } from "../../../utils/validate";
  104. import {
  105. toLogin
  106. } from "../../../libs/login";
  107. import {
  108. myOperationButton,
  109. operationButton
  110. } from "./config";
  111. import tuiBottomPopup from "./tui-bottom-popup";
  112. import mentioned from "./mentioned";
  113. import discoverComment from "./discoverComment";
  114. import BaseTextMore from "./BaseTextMore";
  115. import {goodsStyle} from "../discover_video/default";
  116. import {imageBase64} from "../../../api/public";
  117. import uQRCode from "../../../js_sdk/Sansnn-uQRCode/uqrcode";
  118. import {noteDelApi, noteReplySwitchApi} from "../../../api/discover";
  119. import {workOrderServiceEndApi} from "../../admin/workOrder_manage/workOrder";
  120. import util from "../../../utils/util";
  121. import {mpQrcode} from "../../../api/api";
  122. import {base64src} from "../../../utils/base64src";
  123. export default {
  124. name: "operationBtn",
  125. components: {
  126. tuiBottomPopup,
  127. mentioned,
  128. discoverComment,
  129. BaseTextMore
  130. },
  131. computed: {
  132. ...mapGetters(['userInfo', 'isLogin', 'uid', 'globalData']),
  133. windowWidth() {
  134. const vars = this.$getCssVarStyle();
  135. return vars['--screen-width'] || '100%';
  136. },
  137. },
  138. props: {
  139. list: {
  140. type: Object,
  141. default: function() {
  142. return {};
  143. }
  144. },
  145. noteId: {
  146. type: [String, Number],
  147. default: ''
  148. }
  149. },
  150. data() {
  151. return {
  152. goodsStyle, //商品样式
  153. isShowCent: true, //是否展示内容
  154. urlDomain: this.$Cache.get("imgHost"),
  155. H5ShareBox: false,
  156. statusTop: 0, //审核状态样式
  157. showManage: false, //是否显示操作
  158. posters: false,
  159. weixinStatus: false, //是否是微信
  160. posterImageStatus: false,
  161. storeImage: '', //海报产品图
  162. PromotionCode: '', //二维码图片
  163. canvasStatus: false, //海报绘图标签
  164. posterImage: '', //海报路径
  165. posterbackgd: '../static/images/posterbackgd.png',
  166. codeImg: "",
  167. qrcodeSize: 600,
  168. proList: [], //商品列表
  169. popupShow: false, //商品弹窗
  170. showComment: false,
  171. noteDetail: {},
  172. qrcodecanvasStatus: true, //h5分享二维码
  173. }
  174. },
  175. mounted() {
  176. //#ifdef H5
  177. this.make(this.uid, this.noteId);
  178. this.ShareInfo(this.list);
  179. // #endif
  180. // #ifdef MP
  181. this.imgTop = this.list.cover;
  182. this.getQrcode(this.noteId);
  183. // #endif
  184. },
  185. methods: {
  186. // 视频编辑
  187. myOperationButton,
  188. // 视频操作按钮
  189. operationButton,
  190. // 操作自己视频
  191. handleMyOperationButton: Debounce(function(item) {
  192. switch (item.type) {
  193. case 'edit':
  194. this.handleEdit(this.list)
  195. break;
  196. case 'delete':
  197. this.deleteTopic(this.list)
  198. break;
  199. case 'message':
  200. this.replySwitch(this.list)
  201. break;
  202. }
  203. }),
  204. // 编辑
  205. handleEdit(){
  206. this.$util.navigateTo(`/pages/discover/discover_release/index?noteId=${this.noteId}`);
  207. },
  208. //禁止评论
  209. replySwitch(item) {
  210. if (!item.platReplySwitch && item.replyStatus === 3) {
  211. this.$util.Tips({
  212. title: '平台设置不可评论'
  213. });
  214. } else {
  215. noteReplySwitchApi(item.id).then(res => {
  216. if (item.replyStatus === 1) {
  217. this.$set(item, 'replyStatus', 2)
  218. this.$util.Tips({
  219. title: '禁止成功'
  220. });
  221. } else {
  222. this.$set(item, 'replyStatus', 1)
  223. this.$util.Tips({
  224. title: '开启成功'
  225. });
  226. }
  227. }).catch(err => {
  228. uni.showToast({
  229. title: err,
  230. icon: 'none'
  231. })
  232. });
  233. }
  234. },
  235. // 删除内容
  236. async deleteTopic(item) {
  237. const result = await uni.showModal({
  238. content: "确定要删除该内容么?",
  239. });
  240. if (result[0] || result[1].cancel) return;
  241. try {
  242. await noteDelApi(item.id)
  243. util.Tips({
  244. title: '删除成功'
  245. });
  246. setTimeout(function() {
  247. uni.redirectTo({
  248. url: '/pages/discover/discover_user/index'
  249. })
  250. }, 1000);
  251. }catch (err) {
  252. uni.showToast({
  253. title: err,
  254. icon: 'none'
  255. })
  256. }
  257. },
  258. // 小程序二维码
  259. getQrcode(id) {
  260. let data = {
  261. scene: 'id=' + id + '&sd=' + this.uid,
  262. page: 'pages/discover/discover_video/routineVideo/index'
  263. }
  264. mpQrcode(data).then(res => {
  265. base64src(res.data.code, Date.now(), res => {
  266. this.PromotionCode = res;
  267. });
  268. }).catch(err => {
  269. this.errT = err;
  270. });
  271. },
  272. //微信分享
  273. ShareInfo(noteDetail) {
  274. let data = noteDetail;
  275. let href = location.href;
  276. if (this.$wechat.isWeixin()) {
  277. href = href.indexOf("?") === -1 ? href + "?sd=" + this.uid + '&id=' + noteDetail.id : href +
  278. "&sd=" + this.uid + '&id=' + this.noteId;
  279. let configAppMessage = {
  280. desc: data.content,
  281. title: data.title,
  282. link: href,
  283. imgUrl: data.cover
  284. };
  285. this.$wechat.wechatEvevt([
  286. "updateAppMessageShareData",
  287. "updateTimelineShareData",
  288. "onMenuShareAppMessage",
  289. "onMenuShareTimeline"
  290. ], configAppMessage).then(res => {}).catch(err => {
  291. console.log(err);
  292. })
  293. }
  294. },
  295. // 关注作者
  296. followAuthor: Debounce(function(item) {
  297. if (this.isLogin) {
  298. discoverFollowAuthor(item.authorId).then(() => {
  299. this.$set(item, 'isConcerned', !item.isConcerned);
  300. });
  301. } else {
  302. toLogin();
  303. }
  304. }),
  305. handleButton: Debounce(function(item) {
  306. switch (item.type) {
  307. case 'like':
  308. this.likeToggle(this.list)
  309. break;
  310. case 'comment':
  311. this.toComment(this.list)
  312. break;
  313. case 'share':
  314. this.listenerActionSheet()
  315. break;
  316. case 'more':
  317. this.showManage = !this.showManage
  318. break;
  319. case 'collection':
  320. this.openMore(this.list);
  321. break;
  322. case 'enlarge':
  323. this.onHideCent();
  324. break;
  325. }
  326. }),
  327. //收起内容
  328. onHideCent() {
  329. this.isShowCent = !this.isShowCent;
  330. this.showManage = false
  331. },
  332. // 查看提到的宝贝
  333. openMore(item) {
  334. this.proList = item.productList;
  335. this.$refs.pinglunMentioned.open('bottom');
  336. },
  337. //关闭提到的宝贝
  338. popup() {
  339. this.$refs.pinglunMentioned.close();
  340. },
  341. // 分享
  342. listenerActionSheet() {
  343. // #ifdef H5
  344. if (this.$wechat.isWeixin() === true) {
  345. this.weixinStatus = true;
  346. }
  347. // #endif
  348. this.posters = true;
  349. },
  350. //点赞
  351. likeToggle(item) {
  352. if (this.isLogin) {
  353. discoverNoteLike(item.id).then(() => {
  354. this.$set(item, 'userIsLike', !item.userIsLike);
  355. if (!item.userIsLike) {
  356. item.likeNum--;
  357. item.likeNum = item.likeNum == 0 ? 0 : item.likeNum
  358. } else {
  359. item.likeNum++;
  360. }
  361. });
  362. } else {
  363. toLogin();
  364. }
  365. },
  366. //打开评论
  367. toComment(item) {
  368. this.noteDetail = item;
  369. uni.showToast({
  370. title: '加载中...',
  371. icon: 'none',
  372. position: 'bottom',
  373. duration: 300
  374. })
  375. this.showComment = true
  376. },
  377. //关闭评论
  378. closeComment(){
  379. this.showComment = false
  380. },
  381. // 生成二维码;
  382. make(uid, id) {
  383. let href = location.href.split('?')[0] + '?noteId=' + id + "&sd=" + uid;
  384. uQRCode.make({
  385. canvasId: 'qrcode',
  386. text: href,
  387. size: this.qrcodeSize,
  388. margin: 10,
  389. success: res => {
  390. this.PromotionCode = res;
  391. },
  392. complete: () => {},
  393. fail: res => {
  394. this.$util.Tips({
  395. title: '海报二维码生成失败!'
  396. });
  397. }
  398. })
  399. },
  400. //h5 转base64
  401. async getImageBase64(images) {
  402. let res = await imageBase64({
  403. url: images
  404. })
  405. return res.data.code
  406. },
  407. /**
  408. * 生成海报
  409. */
  410. async goPoster() {
  411. let that = this;
  412. if (that.posterImage) {
  413. that.posterImageStatus = true
  414. that.posters = false
  415. return
  416. }
  417. let arr2
  418. uni.showLoading({
  419. title: '海报生成中',
  420. mask: true
  421. });
  422. that.posters = false;
  423. that.qrcodecanvasStatus = true;
  424. that.$set(that, 'canvasStatus', true);
  425. // #ifdef MP
  426. arr2 = [that.posterbackgd, await this.$util.downloadFilestoreImage(that.list.cover), that
  427. .PromotionCode, await this.$util.downloadFilestoreImage(that.list.authorAvatar)
  428. ];
  429. // #endif
  430. // #ifdef H5
  431. arr2 = [that.posterbackgd, await that.getImageBase64(that.list.cover), that.PromotionCode,
  432. await that.getImageBase64(that.list.authorAvatar)
  433. ];
  434. // #endif
  435. //生成推广海报
  436. that.$util.videoPosterCanvas(arr2, that.list.content, that.list.authorName,
  437. function(tempFilePath) {
  438. that.qrcodecanvasStatus = false
  439. that.$set(that, 'posterImage', tempFilePath);
  440. that.$set(that, 'posterImageStatus', true);
  441. that.$set(that, 'canvasStatus', false);
  442. uni.hideLoading();
  443. }, (err) => {
  444. that.qrcodecanvasStatus = false
  445. that.$set(that, 'canvasStatus', false);
  446. uni.hideLoading();
  447. });
  448. },
  449. //保存海报
  450. handleSavePosterPath(){
  451. this.$util.savePosterPath(this.posterImage).then(userInfo => {
  452. this.posterImageClose();
  453. });
  454. },
  455. share() {
  456. this.H5ShareBox = true;
  457. },
  458. // 分享关闭
  459. listenerActionClose: function() {
  460. this.posters = false;
  461. },
  462. //隐藏海报
  463. posterImageClose: function() {
  464. this.posterImageStatus = false
  465. },
  466. // 小程序关闭分享弹窗;
  467. goFriend: function() {
  468. this.posters = false;
  469. },
  470. }
  471. }
  472. </script>
  473. <style lang="scss" scoped>
  474. .onHide {
  475. width: 66rpx;
  476. height: 66rpx;
  477. border-radius: 50%;
  478. background-color: rgba(0, 0, 0, .4);
  479. color: #fff;
  480. text-align: center;
  481. line-height: 66rpx;
  482. margin: auto;
  483. }
  484. .icon-ic_enlarge2, .icon-ic_reduce{
  485. font-size: 40rpx;
  486. }
  487. .icon-ic_love_2, .icon-ic_love_2{
  488. font-size: 68rpx;
  489. }
  490. .icon-icon_comment{
  491. font-size: 60rpx;
  492. }
  493. .icon-icon_transmit{
  494. font-size: 64rpx;
  495. }
  496. .generate-posters {
  497. width: 100%;
  498. height: 170rpx;
  499. background-color: #fff;
  500. position: fixed;
  501. left: 0;
  502. bottom: 0;
  503. z-index: 388;
  504. transform: translate3d(0, 100%, 0);
  505. transition: all 0.3s cubic-bezier(0.25, 0.5, 0.5, 0.9);
  506. border-top: 1px solid #eee;
  507. align-content: center;
  508. align-items: center;
  509. flex-direction: row;
  510. .item {
  511. /* #ifdef H5 */
  512. flex: 100%;
  513. /* #endif */
  514. /* #ifndef H5 */
  515. flex: 33.33%;
  516. /* #endif */
  517. text-align: center;
  518. font-size: 30rpx;
  519. &.item3 {
  520. flex: 33.33%;
  521. }
  522. .iconfont {
  523. font-size: 80rpx;
  524. color: #5eae72;
  525. .icon-a-ic_picture1 {
  526. color: #5391f1;
  527. }
  528. }
  529. }
  530. }
  531. .mask {
  532. position: fixed;
  533. top: 0;
  534. left: 0;
  535. right: 0;
  536. bottom: 0;
  537. background-color: rgba(0, 0, 0, 0.6);
  538. z-index: 9;
  539. }
  540. .generate-posters.on {
  541. transform: translate3d(0, 0, 0);
  542. }
  543. .flex-column {
  544. display: flex;
  545. flex-direction: column;
  546. }
  547. .userInfo {
  548. position: absolute;
  549. bottom: 100rpx;
  550. right: 24rpx;
  551. flex-direction: column;
  552. text-align: center;
  553. display: flex;
  554. width: 92rpx;
  555. .pictrue {
  556. flex-direction: column;
  557. justify-content: center;
  558. align-items: center;
  559. position: relative;
  560. // margin-bottom: 18rpx;
  561. image {
  562. width: 92rpx;
  563. height: 92rpx;
  564. }
  565. .guanzhu {
  566. width: 42rpx;
  567. height: 42rpx;
  568. display: flex;
  569. align-items: center;
  570. justify-content: center;
  571. color: #fff;
  572. background: #E93323;
  573. border-radius: 100%;
  574. position: relative;
  575. top: -20rpx;
  576. left: 29rpx;
  577. .iconfont {
  578. font-size: 20rpx;
  579. }
  580. }
  581. .yiguanzhu {
  582. width: 42rpx;
  583. height: 42rpx;
  584. }
  585. }
  586. .mention {
  587. width: 92rpx;
  588. height: 92rpx;
  589. position: relative;
  590. image {
  591. width: 58rpx;
  592. height: 58rpx;
  593. position: absolute;
  594. right: 16rpx;
  595. }
  596. .count {
  597. width: 30rpx;
  598. height: 30rpx;
  599. line-height: 30rpx;
  600. background: #fff;
  601. border-radius: 100%;
  602. display: flex;
  603. align-items: center;
  604. justify-content: center;
  605. color: #E93323;
  606. position: absolute;
  607. right: 8rpx;
  608. top: -12rpx;
  609. font-size: 20rpx;
  610. }
  611. }
  612. .iconfont {
  613. color: #ffffff;
  614. &.likeNumActive {
  615. color: #E93323;
  616. }
  617. }
  618. }
  619. .info-text {
  620. margin-top: 10rpx;
  621. color: #ffffff;
  622. font-size: 22rpx;
  623. }
  624. .userAvatar {
  625. border-radius: 500%;
  626. border-style: solid;
  627. border-width: 2px;
  628. border-color: #ffffff;
  629. width: 80rpx;
  630. height: 80rpx;
  631. display: block;
  632. }
  633. .video-dian {
  634. position: relative;
  635. width: 66rpx;
  636. height: 66rpx;
  637. align-items: center;
  638. justify-content: center;
  639. flex-direction: row;
  640. left: 12rpx;
  641. .dian {
  642. display: inline-block;
  643. width: 13rpx;
  644. height: 13rpx;
  645. background-color: #fff;
  646. border-radius: 100%;
  647. margin-right: 10rpx;
  648. &:last-child {
  649. margin-right: 0;
  650. }
  651. }
  652. }
  653. .product {
  654. display: block;
  655. margin-top: 27rpx;
  656. .product-item {
  657. display: inline-block;
  658. width: 444rpx;
  659. height: 136rpx;
  660. background: rgba(0, 0, 0, .55);
  661. border-radius: 16rpx;
  662. padding: 16rpx 15rpx;
  663. margin-right: 30rpx;
  664. }
  665. ::v-deep uni-swiper,
  666. ::v-deep swiper {
  667. display: block;
  668. width: 500rpx !important;
  669. height: 136rpx !important;
  670. .swiper-count {
  671. display: block;
  672. width: 444rpx !important;
  673. height: 136rpx !important;
  674. background: rgba(0, 0, 0, .55);
  675. border-radius: 12rpx;
  676. padding: 16rpx 15rpx;
  677. }
  678. .swiper-item {
  679. display: block;
  680. }
  681. }
  682. .item-count {
  683. width: 414rpx;
  684. flex-direction: row;
  685. justify-content: space-between;
  686. border-radius: 12rpx;
  687. .picture {
  688. width: 104rpx;
  689. height: 104rpx;
  690. border-radius: 16rpx;
  691. image {
  692. width: 104rpx;
  693. height: 104rpx;
  694. border-radius: 10rpx;
  695. }
  696. }
  697. .product-text {
  698. width: 296rpx;
  699. justify-content: space-between;
  700. .buy {
  701. padding: 4rpx 7rpx;
  702. background: #5D5747;
  703. border-radius: 3px 3px 3px 3px;
  704. font-size: 16rpx;
  705. display: inline-block;
  706. }
  707. .name {
  708. width: 266rpx;
  709. font-size: 26rpx;
  710. }
  711. .product-price {
  712. display: flex;
  713. flex-direction: row;
  714. justify-content: space-between;
  715. align-items: center;
  716. .price {
  717. display: flex;
  718. flex-direction: row;
  719. align-items: flex-end;
  720. font-size: 24rpx;
  721. text {
  722. font-size: 26rpx;
  723. }
  724. }
  725. .buy-btn {
  726. width: 89rpx;
  727. height: 36rpx;
  728. display: flex;
  729. align-items: center;
  730. justify-content: center;
  731. color: #fff;
  732. border-radius: 26rpx;
  733. background: #E93323;
  734. font-size: 20rpx;
  735. }
  736. }
  737. }
  738. }
  739. }
  740. .content {
  741. width: 590rpx;
  742. position: absolute;
  743. bottom: 80rpx;
  744. /* justify-content: center; */
  745. padding: 15rpx 0;
  746. flex-direction: column;
  747. justify-content: flex-start;
  748. color: #ffffff;
  749. left: 24rpx;
  750. .time {
  751. font-size: 24rpx;
  752. color: rgba(255, 255, 255, 0.5);
  753. margin-left: 12rpx;
  754. }
  755. .cart {
  756. height: 48rpx;
  757. flex-direction: row;
  758. .cartName {
  759. font-size: 28rpx;
  760. color: #fff;
  761. }
  762. }
  763. }
  764. .manage {
  765. width: 210rpx;
  766. background: #ffffff;
  767. box-shadow: 0 2rpx 15rpx rgba(0, 0, 0, 0.1);
  768. padding: 0 15rpx;
  769. position: absolute;
  770. bottom: -65rpx;
  771. right: 113rpx;
  772. z-index: 10;
  773. border-radius: 16rpx;
  774. .iconfont {
  775. color: #333 !important;
  776. }
  777. &::before {
  778. content: "";
  779. display: inline-block;
  780. width: 26rpx;
  781. height: 26rpx;
  782. background: #ffffff;
  783. transform: rotate(137deg);
  784. position: absolute;
  785. top: 102rpx;
  786. right: -8rpx;
  787. box-shadow: -1rpx -1rpx 1rpx rgba(0, 0, 0, 0.05);
  788. }
  789. .items {
  790. border-bottom: 1px solid #EEEEEE;
  791. color: #282828;
  792. font-size: 26rpx;
  793. padding: 20rpx 0;
  794. display: flex;
  795. align-items: center;
  796. &:last-child {
  797. border-bottom: none;
  798. }
  799. .iconfont {
  800. margin: 0 16rpx 0;
  801. }
  802. }
  803. }
  804. </style>