You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1819 lines
64 KiB

3 months ago
  1. <template>
  2. <view :data-theme="theme">
  3. <skeleton :show="showSkeleton" :isNodes="isNodes" ref="skeleton" loading="chiaroscuro" selector="skeleton"
  4. bgcolor="#FFF"></skeleton>
  5. <view class="skeleton" :style="{visibility: showSkeleton ? 'hidden' : 'visible'}">
  6. <!-- 头部 -->
  7. <view class='navbar' :class="opacity>0.6?'bgwhite':''">
  8. <view class='navbarH' :style='"height:"+navH+"rpx;"'>
  9. <view class='navbarCon acea-row' :style="{ paddingRight: navbarRight + 'px' }">
  10. <!-- #ifdef MP -->
  11. <view class="select_nav flex justify-center align-center" id="home" :style="{ top: homeTop + 'rpx' }">
  12. <text class="iconfont icon-fanhui2 px-20" @tap="returns"></text>
  13. <text class="iconfont icon-gengduo5 px-20" @tap="showNav"></text>
  14. <text class="nav_line"></text>
  15. </view>
  16. <!-- #endif -->
  17. <!-- #ifdef H5 || APP-PLUS -->
  18. <view id="home" class="home acea-row row-center-wrapper iconfont icon-xiangzuo h5_back" :class="opacity>0.5?'on':''"
  19. :style="{ top: homeTop + 'rpx' }" v-if="returnShow" @tap="returns">
  20. </view>
  21. <!-- #endif -->
  22. <view class="header flex justify-between align-center">
  23. <view class="item" :class="navActive === index ? 'on' : ''" v-for="(item,index) in navList"
  24. :key='index' @tap="tap(item,index)">
  25. {{ item }}
  26. </view>
  27. </view>
  28. <!-- #ifdef H5 || APP-PLUS -->
  29. <view class="right_select" :style="{ top: homeTop + 'rpx' }" @tap="showNav">
  30. <text class="iconfont icon-gengduo2"></text>
  31. </view>
  32. <!-- #endif -->
  33. </view>
  34. </view>
  35. </view>
  36. <view class="dialog_nav" :style='"top:"+navH+"rpx;"' v-show="currentPage">
  37. <view class="dialog_nav_item" :class="item.after" v-for="(item,index) in selectNavList" :key="index" @click="linkPage(item.url)">
  38. <text class="iconfont" :class="item.icon"></text>
  39. <text class="pl-20">{{item.name}}</text>
  40. </view>
  41. </view>
  42. <view class='product-con'>
  43. <scroll-view :scroll-top="scrollTop" scroll-y='true' scroll-with-animation="true" :style="'height:'+height+'px;'"
  44. @scroll="scroll">
  45. <view id="past0">
  46. <productConSwiper :imgUrls='imgUrls' class="skeleton-rect" :videoline="videoLink"
  47. ></productConSwiper>
  48. <view class='nav acea-row row-between-wrapper mb30 skeleton-rect'>
  49. <view class='money'><text class='num'>{{storeInfo.price}}</text><text class='y-money'>{{storeInfo.otPrice}}</text></view>
  50. <view class='acea-row row-middle'>
  51. <view class='time flex' v-if="status == 2">
  52. <view>
  53. <text class="iconfont icon-miaosha1"></text>
  54. <text class="pl-06" style="font-size: 26rpx;">距结束:</text>
  55. </view>
  56. <countDown :bgColor="bgColor" :is-day="false" :tip-text="' '" :day-text="' '" :hour-text="' : '" :minute-text="' : '" :second-text="' '"
  57. :datatime="datatime"></countDown>
  58. </view>
  59. </view>
  60. </view>
  61. <view class="pad30 mb30">
  62. <view class='wrapper borRadius14 mb30'>
  63. <view class='introduce acea-row row-between'>
  64. <view class='infor skeleton-rect'> {{storeInfo.storeName}}</view>
  65. <view class='iconfont icon-fenxiang' @click="listenerActionSheet"></view>
  66. </view>
  67. <view class='label acea-row row-middle'>
  68. <view class='stock skeleton-rect'>累计销售{{parseFloat(storeInfo.sales) + parseFloat(storeInfo.ficti) || 0}}{{storeInfo.unitName}}</view>
  69. <view class="skeleton-rect">限量: {{ attribute.productSelect.quota ? attribute.productSelect.quota : 0 }} {{storeInfo.unitName}}</view>
  70. </view>
  71. </view>
  72. <view class='attribute mb30 borRadius14' @click="selecAttr">
  73. <view class="acea-row row-between-wrapper">
  74. <view class="line1 skeleton-rect">{{attrTxt}}
  75. <text class='atterTxt'>{{attrValue}}</text>
  76. </view>
  77. <view class='iconfont icon-jiantou'></view>
  78. </view>
  79. <view class="acea-row row-between-wrapper" style="margin-top:7px;padding-left:55px;" v-if="skuArr.length > 1">
  80. <view class="flex">
  81. <image :src="item.image" v-for="(item,index) in skuArr.slice(0,4)" :key="index" class="attrImg"></image>
  82. </view>
  83. <view class="switchTxt">{{skuArr.length}}种规格可选</view>
  84. </view>
  85. </view>
  86. <view class='userEvaluation' id="past1">
  87. <view class='title acea-row row-between-wrapper' :style="replyCount==0?'border-bottom-left-radius:14rpx;border-bottom-right-radius:14rpx;':''">
  88. <view>用户评价({{replyCount}})</view>
  89. <navigator class='praise' hover-class='none' :url="'/pages/goods/goods_comment_list/index?productId='+ storeInfo.productId">
  90. <text class='font_color'>{{replyChance}}%</text>好评率
  91. <text class='iconfont icon-jiantou'></text>
  92. </navigator>
  93. </view>
  94. <userEvaluation :reply="reply" v-if="replyCount"></userEvaluation>
  95. </view>
  96. </view>
  97. </view>
  98. <view class='product-intro' id="past2">
  99. <view class='title'>
  100. <image :src="urlDomain+'crmebimage/perset/staticImg/xzuo.png'"></image>
  101. <span class="sp">产品详情</span>
  102. <image :src="urlDomain+'crmebimage/perset/staticImg/xyou.png'"></image>
  103. </view>
  104. <view class='conter'>
  105. <jyf-parser :html="storeInfo.content" ref="article" :tag-style="tagStyle"></jyf-parser>
  106. </view>
  107. </view>
  108. <view style='height:120rpx;'></view>
  109. </scroll-view>
  110. <view class='footer acea-row row-between-wrapper'>
  111. <!-- #ifdef MP -->
  112. <button hover-class='none' class='item skeleton-rect' @click="onClickService"
  113. v-if="chatConfig.telephone_service_switch === 'open'">
  114. <view class='iconfont icon-kefu'></view>
  115. <view>客服</view>
  116. </button>
  117. <template v-else>
  118. <button open-type="contact" hover-class='none' class='item skeleton-rect' v-if="chatConfig.wx_chant_independent=='open'">
  119. <view class='iconfont icon-kefu'></view>
  120. <view>客服</view>
  121. </button>
  122. <button class="item" hover-class='none' @click="wxChatService" v-else>
  123. <view class='iconfont icon-kefu'></view>
  124. <text>联系客服</text>
  125. </button>
  126. </template>
  127. <!-- #endif -->
  128. <!-- #ifndef MP -->
  129. <navigator hover-class="none" class="item skeleton-rect" @click="onClickService">
  130. <view class="iconfont icon-kefu"></view>
  131. <view>客服</view>
  132. </navigator>
  133. <!-- #endif -->
  134. <view @tap='setCollect' class='item skeleton-rect'>
  135. <view class='iconfont icon-shoucang1' v-if="userCollect"></view>
  136. <view class='iconfont icon-shoucang' v-else></view>
  137. <view>收藏</view>
  138. </view>
  139. <view class="bnt acea-row skeleton-rect" v-if="dataShow == 0">
  140. <view class="joinCart bnts" @tap="openAlone" v-if="masterStatus !=='soldOut'">单独购买</view>
  141. <view class="bg-color-hui bnts radius" v-if="masterStatus =='soldOut'">单独购买</view>
  142. <view class="buy bnts">立即购买</view>
  143. </view>
  144. <view class="bnt acea-row skeleton-rect" v-if="status == 2 && attribute.productSelect.quota>0 && datatime > new Date().getTime()/1000">
  145. <view class="joinCart bnts" @tap="openAlone" v-if="masterStatus !=='soldOut'">单独购买</view>
  146. <view class="bg-color-hui bnts radius" v-if="masterStatus =='soldOut'">单独购买</view>
  147. <view class="buy bnts" @tap="goCat">立即购买</view>
  148. </view>
  149. <view class="bnt acea-row skeleton-rect" v-if="status == 2 && (attribute.productSelect.quota <= 0) && datatime > new Date().getTime()/1000">
  150. <view class="joinCart bnts" @tap="openAlone" v-if="masterStatus !=='soldOut'">单独购买</view>
  151. <view class="bg-color-hui bnts radius" v-if="masterStatus =='soldOut'">单独购买</view>
  152. <view class="bnts bg-color-hui">已售罄</view>
  153. </view>
  154. <view class="bnt acea-row skeleton-rect" v-if="status == 0">
  155. <view class="joinCart bnts" @tap="openAlone" v-if="masterStatus !=='soldOut'">单独购买</view>
  156. <view class="bg-color-hui bnts radius" v-if="masterStatus =='soldOut'">单独购买</view>
  157. <view class="buy bnts bg-color-hui">已关闭</view>
  158. </view>
  159. <view class="bnt acea-row skeleton-rect" v-if="status == 1">
  160. <view class="joinCart bnts" @tap="openAlone" v-if="masterStatus !=='soldOut'">单独购买</view>
  161. <view class="bg-color-hui bnts radius" v-if="masterStatus =='soldOut'">单独购买</view>
  162. <view class="buy bnts bg-color-hui">未开始</view>
  163. </view>
  164. <view class="bnt acea-row skeleton-rect" v-if="status == 2 && new Date().getTime()/1000 - datatime >=0">
  165. <view class="joinCart bnts" @tap="openAlone" v-if="masterStatus !=='soldOut'">单独购买</view>
  166. <view class="bg-color-hui bnts radius" v-if="masterStatus =='soldOut'">单独购买</view>
  167. <view class="buy bnts bg-color-hui">已结束</view>
  168. </view>
  169. </view>
  170. </view>
  171. <!-- <shareRedPackets :sharePacket="sharePacket" @listenerActionSheet="listenerActionSheet" @closeChange="closeChange"></shareRedPackets> -->
  172. <product-window :attr='attribute' :limitNum='1' @myevent="onMyEvent" @ChangeAttr="ChangeAttr" @ChangeCartNum="ChangeCartNum"
  173. @attrVal="attrVal" @iptCartNum="iptCartNum" @getImg="showImg"></product-window>
  174. <!-- 分享按钮 -->
  175. <view class="generate-posters" :class="posters ? 'on' : ''">
  176. <view class="generateCon acea-row row-middle">
  177. <!-- #ifndef MP -->
  178. <button class="item" hover-class="none" v-if="weixinStatus === true" @click="H5ShareBox = true">
  179. <view class="pictrue">
  180. <image :src="urlDomain+'crmebimage/perset/staticImg/weixin.png'"></image>
  181. </view>
  182. <view class="">分享给好友</view>
  183. </button>
  184. <!-- #endif -->
  185. <!-- #ifdef MP -->
  186. <button class="item" open-type="share" hover-class="none">
  187. <view class="pictrue">
  188. <image :src="urlDomain+'crmebimage/perset/staticImg/weixin.png'"></image>
  189. </view>
  190. <view class="">分享给好友</view>
  191. </button>
  192. <!-- #endif -->
  193. <!-- #ifdef APP-PLUS -->
  194. <view class="item" @click="appShare('WXSceneSession')">
  195. <view class="iconfont icon-weixin3"></view>
  196. <view class="">微信好友</view>
  197. </view>
  198. <view class="item" @click="appShare('WXSenceTimeline')">
  199. <view class="iconfont icon-pengyouquan"></view>
  200. <view class="">微信朋友圈</view>
  201. </view>
  202. <!-- #endif -->
  203. <!-- #ifdef H5 || MP -->
  204. <view class="item" @click="getpreviewImage">
  205. <view class="pictrue">
  206. <image :src="urlDomain+'crmebimage/perset/staticImg/changan.png'"></image>
  207. </view>
  208. <view class="">预览发图</view>
  209. </view>
  210. <!-- #endif -->
  211. <!-- #ifdef MP -->
  212. <button class="item" hover-class="none" @click="savePosterPath">
  213. <view class="pictrue">
  214. <image :src="urlDomain+'crmebimage/perset/staticImg/haibao.png'"></image>
  215. </view>
  216. <view class="">保存海报</view>
  217. </button>
  218. <!-- #endif -->
  219. </view>
  220. <view class="generateClose acea-row row-center-wrapper" @click="posterImageClose">取消</view>
  221. </view>
  222. <cus-previewImg ref="cusPreviewImg" :list="skuArr" @changeSwitch="changeSwitch" />
  223. <view class="mask" v-if="posters" @click="closePosters"></view>
  224. <view class="mask" v-if="canvasStatus" @click="listenerActionClose"></view>
  225. <view class="mask_transparent" v-if="currentPage" @touchmove="hideNav" @click="hideNav()"></view>
  226. <!-- 海报展示 -->
  227. <view class='poster-pop' v-if="canvasStatus">
  228. <image :src='posterImage'></image>
  229. </view>
  230. <view class="canvas" v-else>
  231. <canvas style="width:750px;height:1190px;" canvas-id="firstCanvas"></canvas>
  232. <canvas canvas-id="qrcode" :style="{width: `${qrcodeSize}px`, height: `${qrcodeSize}px`}"/>
  233. </view>
  234. <!-- 发送给朋友图片 -->
  235. <view class="share-box" v-if="H5ShareBox">
  236. <image :src="urlDomain+'crmebimage/perset/staticImg/share-info.png'" @click="H5ShareBox = false"></image>
  237. </view>
  238. </view>
  239. </view>
  240. </template>
  241. <script>
  242. const app = getApp();
  243. import uQRCode from '@/js_sdk/Sansnn-uQRCode/uqrcode.js'
  244. import {
  245. HTTP_H5_URL
  246. } from '@/config/app.js';
  247. import {
  248. mapGetters
  249. } from "vuex";
  250. import {
  251. getSeckillDetail,
  252. seckillCode
  253. } from '@/api/activity.js';
  254. import {
  255. collectAdd,
  256. collectDel,
  257. getReplyList,
  258. getReplyConfig
  259. } from '@/api/store.js';
  260. import productConSwiper from '@/components/productConSwiper/index.vue'
  261. import productWindow from '@/components/productWindow/index.vue'
  262. import userEvaluation from '@/components/userEvaluation/index.vue'
  263. import cusPreviewImg from '@/components/cus-previewImg/cus-previewImg.vue'
  264. // #ifdef MP
  265. import { base64src } from '@/utils/base64src.js'
  266. import {
  267. getQrcode
  268. } from '@/api/api.js';
  269. // #endif
  270. import parser from "@/components/jyf-parser/jyf-parser";
  271. import countDown from '@/components/countDown';
  272. import shareRedPackets from '@/components/shareRedPackets';
  273. import {
  274. imageBase64
  275. } from "@/api/public";
  276. import {
  277. toLogin
  278. } from '@/libs/login.js';
  279. import { silenceBindingSpread } from "@/utils";
  280. import { spread } from "@/api/user";
  281. export default {
  282. data() {
  283. return {
  284. urlDomain: this.$Cache.get("imgHost"),
  285. showSkeleton: true, //骨架屏显示隐藏
  286. isNodes: 0, //控制什么时候开始抓取元素节点,只要数值改变就重新抓取
  287. bgColor: {
  288. 'bgColor': '#333333',
  289. 'Color': '#fff',
  290. 'isDay': true,
  291. 'width': '44rpx',
  292. 'timeTxtwidth': '16rpx',
  293. },
  294. dataShow: 0,
  295. id: 0,
  296. time: 0,
  297. countDownHour: "00",
  298. countDownMinute: "00",
  299. countDownSecond: "00",
  300. storeInfo: {},
  301. imgUrls: [],
  302. parameter: {
  303. 'navbar': '1',
  304. 'return': '1',
  305. 'title': '抢购详情页',
  306. 'color': false
  307. },
  308. attribute: {
  309. cartAttr: false,
  310. productAttr: [],
  311. productSelect: {}
  312. },
  313. productValue: [],
  314. isOpen: false,
  315. attr: '请选择',
  316. attrValue: '',
  317. status: 1,
  318. isAuto: false,
  319. isShowAuth: false,
  320. iShidden: false,
  321. limitNum: 1, //限制本属性产品的个数;
  322. personNum: 0, //限制用户购买的个数;
  323. iSplus: false,
  324. replyCount: 0, //总评论数量
  325. reply: [], //评论列表
  326. replyChance: 0,
  327. navH: "",
  328. navList: ['商品', '评价', '详情'],
  329. opacity: 0,
  330. scrollY: 0,
  331. topArr: [],
  332. toView: '',
  333. height: 0,
  334. heightArr: [],
  335. lock: false,
  336. scrollTop: 0,
  337. tagStyle: {
  338. img: 'width:100%;display:block;',
  339. table: 'width:100%',
  340. video: 'width:100%'
  341. },
  342. datatime: 0,
  343. navActive: 0,
  344. meunHeight: 0,
  345. backH: '',
  346. posters: false,
  347. weixinStatus: false,
  348. posterImageStatus: false,
  349. canvasStatus: false, //海报绘图标签
  350. storeImage: '', //海报产品图
  351. PromotionCode: '', //二维码图片
  352. posterImage: '', //海报路径
  353. posterbackgd: `${this.$Cache.get("imgHost")}crmebimage/perset/staticImg/posterbackgd.png`,
  354. actionSheetHidden: false,
  355. cart_num:'',
  356. attrTxt: '',
  357. qrcodeSize: 600,
  358. imagePath:'',//海报路径
  359. imgTop:'',
  360. H5ShareBox: false, //公众号分享图片
  361. sharePacket: {
  362. isState: true, //默认不显示
  363. },
  364. buyNum: 1,
  365. errT: '',
  366. returnShow: true,
  367. homeTop: 20,
  368. navbarRight: 0,
  369. userCollect: false,
  370. theme:app.globalData.theme,
  371. skuArr:[],
  372. currentPage:false,
  373. selectSku:{},
  374. selectNavList:[
  375. {name:'首页',icon:'icon-shouye8',url:'/pages/index/index',after:'dialog_after'},
  376. {name:'搜索',icon:'icon-sousuo6',url:'/pages/goods/goods_search/index',after:'dialog_after'},
  377. {name:'购物车',icon:'icon-gouwuche7',url:'/pages/order_addcart/order_addcart',after:'dialog_after'},
  378. {name:'我的收藏',icon:'icon-shoucang3',url:'/pages/users/user_goods_collection/index',after:'dialog_after'},
  379. {name:'个人中心',icon:'icon-gerenzhongxin1',url:'/pages/user/index'},
  380. ],
  381. chatConfig:{
  382. consumer_hotline:'',
  383. telephone_service_switch:'close',
  384. wx_chant_independent:'open'
  385. }, //客服配置
  386. masterStatus:'',
  387. openPages: '' ,//分享地址
  388. videoLink: '',
  389. }
  390. },
  391. components: {
  392. shareRedPackets,
  393. productConSwiper,
  394. 'productWindow': productWindow,
  395. userEvaluation,
  396. cusPreviewImg ,
  397. "jyf-parser": parser,
  398. countDown
  399. },
  400. computed: mapGetters(['isLogin','uid','chatUrl']),
  401. watch:{
  402. isLogin:{
  403. handler:function(newV,oldV){
  404. if(newV){
  405. this.getSeckillDetail();
  406. }
  407. },
  408. deep:true
  409. }
  410. },
  411. onLoad(options) {
  412. setTimeout(() => {
  413. this.isNodes++;
  414. }, 500);
  415. let that = this;
  416. that.$store.commit("PRODUCT_TYPE", 'normal');
  417. let statusBarHeight = '';
  418. var pages = getCurrentPages();
  419. that.$set(that,'chatConfig',that.$Cache.getItem('chatConfig'));
  420. //that.returnShow = pages.length === 1 ? false : true;
  421. //设置商品列表高度
  422. uni.getSystemInfo({
  423. success: function(res) {
  424. that.height = res.windowHeight
  425. statusBarHeight = res.statusBarHeight
  426. //res.windowHeight:获取整个窗口高度为px,*2为rpx;98为头部占据的高度;
  427. },
  428. });
  429. // #ifndef APP-PLUS
  430. this.navH = app.globalData.navHeight
  431. // #endif
  432. // #ifdef APP-PLUS
  433. this.navH = 90
  434. // #endif
  435. // #ifdef MP
  436. let menuButtonInfo = uni.getMenuButtonBoundingClientRect()
  437. this.meunHeight = menuButtonInfo.height
  438. this.backH = (that.navH / 2) + (this.meunHeight / 2)
  439. that.$set(that,'theme',that.$Cache.get('theme')); //用户从分享卡片进入的场景下获取主题色配置
  440. // #endif
  441. if (!options.scene && !options.id){
  442. this.showSkeleton = false;
  443. this.$util.Tips({
  444. title: '缺少参数无法查看商品'
  445. }, {
  446. url: '/pages/index/index'
  447. });
  448. return;
  449. }
  450. if (options.id) this.id = options.id;
  451. // 仅仅小程序扫码进入获取商品id,商品类型
  452. if (options.scene) {
  453. let qrCodeValue = this.$util.getUrlParams(decodeURIComponent(options.scene));
  454. let mapeMpQrCodeValue = this.$util.formatMpQrCodeData(qrCodeValue);
  455. this.id = mapeMpQrCodeValue.id ? mapeMpQrCodeValue.id : '';
  456. app.globalData.spread = mapeMpQrCodeValue.spread;
  457. }
  458. if(options.spread) app.globalData.spread = options.spread;
  459. this.getSeckillDetail();
  460. this.$nextTick(() => {
  461. // #ifdef MP
  462. const menuButton = uni.getMenuButtonBoundingClientRect();
  463. const query = uni.createSelectorQuery().in(this);
  464. query
  465. .select('#home')
  466. .boundingClientRect(data => {
  467. this.homeTop = menuButton.top * 2 + menuButton.height - data.height;
  468. })
  469. .exec();
  470. // #endif
  471. })
  472. if(this.isLogin && parseInt(app.globalData.spread)>0){
  473. silenceBindingSpread()
  474. }
  475. },
  476. methods: {
  477. wxChatService(){
  478. let chatUrlArr = this.chatUrl.split('?')
  479. uni.navigateTo({
  480. url:`/pages/users/web_page/index?webUel=${chatUrlArr[0]}&title=客服&${chatUrlArr[1]}`
  481. })
  482. },
  483. // app分享
  484. // #ifdef APP-PLUS
  485. appShare(scene){
  486. let that = this
  487. let routes = getCurrentPages(); // 获取当前打开过的页面路由数组
  488. let curRoute = routes[routes.length - 1].$page.fullPath // 获取当前页面路由,也就是最后一个打开的页面路由
  489. uni.share({
  490. provider: "weixin",
  491. scene: scene,
  492. type: 0,
  493. href: `${HTTP_H5_URL}${curRoute}&spread=${that.uid}`,
  494. title: that.storeInfo.storeName,
  495. summary:app.globalData.companyName,
  496. imageUrl: that.storeInfo.image,
  497. success: function (res) {
  498. that.posters = false;
  499. },
  500. fail: function (err) {
  501. uni.showToast({
  502. title:'分享失败',
  503. icon:'none',
  504. duration:2000
  505. })
  506. that.posters = false;
  507. }
  508. });
  509. },
  510. // #endif
  511. onClickService(){
  512. if(this.chatConfig.telephone_service_switch === 'open'){
  513. uni.makePhoneCall({
  514. phoneNumber: this.chatConfig.consumer_hotline //仅为示例
  515. });
  516. }else{
  517. // #ifdef APP-PLUS
  518. uni.navigateTo({
  519. url: '/pages/users/web_page/index?webUel=' + this.chatUrl + '&title=客服'
  520. })
  521. // #endif
  522. // #ifndef APP-PLUS
  523. location.href = this.chatUrl;
  524. // #endif
  525. }
  526. },
  527. closePosters:function(){
  528. this.posters = false;
  529. },
  530. getProductReplyList: function() {
  531. getReplyList(this.storeInfo.productId, {
  532. page: 1,
  533. limit: 3,
  534. type: 0,
  535. }).then(res => {
  536. this.reply = res.data.list ? [res.data.list[0]] : [];
  537. })
  538. },
  539. getProductReplyCount: function() {
  540. let that = this;
  541. getReplyConfig(that.storeInfo.productId).then(res => {
  542. that.$set(that, 'replyChance', res.data.replyChance * 100);
  543. that.$set(that, 'replyCount', res.data.sumCount);
  544. });
  545. },
  546. /**
  547. * 购物车手动填写
  548. *
  549. */
  550. iptCartNum: function (e) {
  551. this.$set(this.attribute.productSelect, 'cart_num', e?e:1);
  552. this.$set(this, "cart_num", e);
  553. if (e > 1) {
  554. return this.$util.Tips({
  555. title: `该商品每次限购1${this.storeInfo.unitName}`
  556. });
  557. }
  558. },
  559. // 后退
  560. returns: function() {
  561. uni.navigateBack()
  562. },
  563. getSeckillDetail: function() {
  564. let that = this;
  565. getSeckillDetail(that.id).then(res => {
  566. this.dataShow = 1;
  567. this.masterStatus = res.data.masterStatus;
  568. this.storeInfo = res.data.storeSeckill;
  569. this.userCollect = res.data.userCollect;
  570. this.status = this.storeInfo.seckillStatus;
  571. this.datatime = Number(this.storeInfo.timeSwap);
  572. let sliderImage = JSON.parse(res.data.storeSeckill.sliderImage);
  573. if (that.getFileType(sliderImage[0]) == 'video') {
  574. //判断轮播图第一张是否是视频,如果是,就赋值给videoLink,并且将其在轮播图中删除
  575. this.$set(this, 'videoLink', sliderImage[0]);
  576. sliderImage.splice(0, 1);
  577. }
  578. this.imgUrls = sliderImage || [];
  579. this.attribute.productAttr = res.data.productAttr;
  580. this.productValue = res.data.productValue;
  581. this.personNum = res.data.storeSeckill.quota;
  582. this.attribute.productSelect.num = res.data.storeSeckill.num;
  583. for(let key in res.data.productValue){
  584. let obj = res.data.productValue[key];
  585. that.skuArr.push(obj)
  586. }
  587. this.$set(this, "selectSku", that.skuArr[0]);
  588. this.getProductReplyList();
  589. this.getProductReplyCount();
  590. let productAttr = res.data.productAttr.map(item => {
  591. return {
  592. attrName : item.attrName,
  593. attrValues: item.attrValues.split(','),
  594. id:item.id,
  595. isDel:item.isDel,
  596. productId:item.productId,
  597. type:item.type
  598. }
  599. });
  600. this.$set(this.attribute,'productAttr',productAttr);
  601. // #ifdef H5
  602. that.storeImage = that.storeInfo.image;
  603. that.make();
  604. that.setShare();
  605. that.getImageBase64(that.storeInfo.image);
  606. // #endif
  607. // #ifdef MP
  608. that.getQrcode();
  609. that.imgTop = res.data.storeSeckill.image
  610. // #endif
  611. // #ifndef H5
  612. that.downloadFilestoreImage();
  613. // #endif
  614. that.DefaultSelect();
  615. setTimeout(function() {
  616. that.infoScroll();
  617. }, 1000);
  618. that.openPages = '/pages/activity/goods_seckill_details/index?id=' + that.id + '&spread=' + that.uid ;
  619. setTimeout(() => {
  620. that.showSkeleton = false
  621. }, 1000)
  622. }).catch(err => {
  623. that.$util.Tips({
  624. title:err
  625. },{
  626. tab:3
  627. })
  628. });
  629. },
  630. getFileType(fileName) {
  631. // 后缀获取
  632. let suffix = '';
  633. // 获取类型结果
  634. let result = '';
  635. try {
  636. const flieArr = fileName.split('.');
  637. suffix = flieArr[flieArr.length - 1];
  638. } catch (err) {
  639. suffix = '';
  640. }
  641. // fileName无后缀返回 false
  642. if (!suffix) {
  643. return false;
  644. }
  645. suffix = suffix.toLocaleLowerCase();
  646. // 图片格式
  647. const imglist = ['png', 'jpg', 'jpeg', 'bmp', 'gif'];
  648. // 进行图片匹配
  649. result = imglist.find(item => item === suffix);
  650. if (result) {
  651. return 'image';
  652. }
  653. // 匹配 视频
  654. const videolist = ['mp4', 'm2v', 'mkv', 'rmvb', 'wmv', 'avi', 'flv', 'mov', 'm4v'];
  655. result = videolist.find(item => item === suffix);
  656. if (result) {
  657. return 'video';
  658. }
  659. // 其他 文件类型
  660. return 'other';
  661. },
  662. setShare: function() {
  663. this.$wechat.isWeixin() &&
  664. this.$wechat.wechatEvevt([
  665. "updateAppMessageShareData",
  666. "updateTimelineShareData",
  667. "onMenuShareAppMessage",
  668. "onMenuShareTimeline"
  669. ], {
  670. desc: app.globalData.companyName,
  671. title: this.storeInfo.storeName,
  672. link: location.href,
  673. imgUrl: this.storeInfo.image
  674. }).then(res => {
  675. }).catch(err => {
  676. console.log(err);
  677. });
  678. },
  679. /**
  680. * 默认选中属性
  681. *
  682. */
  683. DefaultSelect: function() {
  684. let self = this, productAttr = self.attribute.productAttr,value = [];
  685. for (var key in self.productValue) {
  686. if (self.productValue[key].quota > 0) {
  687. value = productAttr.length ? key.split(",") : [];
  688. break;
  689. }
  690. }
  691. for (let i = 0; i < value.length; i++) {
  692. self.$set(productAttr[i], "index", value[i]);
  693. }
  694. //sort();排序函数:数字-英文-汉字;
  695. let productSelect = this.productValue[value.join(",")];
  696. if (productSelect && productAttr.length) {
  697. self.$set(
  698. self.attribute.productSelect,
  699. "storeName",
  700. self.storeInfo.storeName
  701. );
  702. self.$set(self.attribute.productSelect, "image", productSelect.image);
  703. self.$set(self.attribute.productSelect, "price", productSelect.price);
  704. self.$set(self.attribute.productSelect, "stock", productSelect.stock);
  705. self.$set(self.attribute.productSelect, "unique", productSelect.id);
  706. self.$set(self.attribute.productSelect, "quota", productSelect.quota);
  707. self.$set(self.attribute.productSelect, "quotaShow", productSelect.quotaShow);
  708. self.$set(self.attribute.productSelect, "cart_num", 1);
  709. self.$set(self, "attrValue", value.join(","));
  710. this.$set(self, "attrTxt", "已选择")
  711. self.attrValue = value.join(",")
  712. } else if (!productSelect && productAttr.length) {
  713. self.$set(
  714. self.attribute.productSelect,
  715. "storeName",
  716. self.storeInfo.storeName
  717. );
  718. self.$set(self.attribute.productSelect, "image", self.storeInfo.image);
  719. self.$set(self.attribute.productSelect, "price", self.storeInfo.price);
  720. self.$set(self.attribute.productSelect, "quota", 0);
  721. self.$set(self.attribute.productSelect, "quota", 0);
  722. self.$set(self.attribute.productSelect, "stock", 0);
  723. self.$set(self.attribute.productSelect, "unique", "");
  724. self.$set(self.attribute.productSelect, "cart_num", 0);
  725. self.$set(self, "attrValue", "");
  726. self.$set(self, "attrTxt", "请选择");
  727. } else if (!productSelect && !productAttr.length) {
  728. self.$set(
  729. self.attribute.productSelect,
  730. "storeName",
  731. self.storeInfo.storeName
  732. );
  733. self.$set(self.attribute.productSelect, "image", self.storeInfo.image);
  734. self.$set(self.attribute.productSelect, "price", self.storeInfo.price);
  735. self.$set(self.attribute.productSelect, "quota", self.storeInfo.quota);
  736. self.$set(self.attribute.productSelect, "quotaShow", self.storeInfo.quotaShow);
  737. self.$set(self.attribute.productSelect, "stock", self.storeInfo.stock);
  738. self.$set(
  739. self.attribute.productSelect,
  740. "unique", ""
  741. );
  742. self.$set(self.attribute.productSelect, "cart_num", 1);
  743. self.$set(self, "attrValue", "");
  744. self.$set(self, "attrTxt", "请选择");
  745. }
  746. },
  747. selecAttr: function() {
  748. this.attribute.cartAttr = true
  749. },
  750. showNav(){
  751. this.currentPage = !this.currentPage;
  752. },
  753. onMyEvent: function() {
  754. this.$set(this.attribute, 'cartAttr', false);
  755. this.$set(this, 'isOpen', false);
  756. },
  757. /**
  758. * 购物车数量加和数量减
  759. *
  760. */
  761. ChangeCartNum: function(changeValue) {
  762. //changeValue:是否 加|减
  763. //获取当前变动属性
  764. let productSelect = this.productValue[this.attrValue];
  765. if (this.cart_num) {
  766. productSelect.cart_num = this.cart_num;
  767. this.attribute.productSelect.cart_num = this.cart_num;
  768. }
  769. //如果没有属性,赋值给商品默认库存
  770. if (productSelect === undefined && !this.attribute.productAttr.length)
  771. productSelect = this.attribute.productSelect;
  772. //无属性值即库存为0;不存在加减;
  773. if (productSelect === undefined) return;
  774. let stock = productSelect.stock || 0;
  775. let quota = productSelect.quota || 0;
  776. let num = this.attribute.productSelect;
  777. let nums = this.storeInfo.num || 0;
  778. //设置默认数据
  779. if (productSelect.cart_num == undefined) productSelect.cart_num = 1;
  780. if (changeValue) {
  781. if (num.cart_num === 1) {
  782. return this.$util.Tips({
  783. title: `该商品每次限购1${this.storeInfo.unitName}`
  784. });
  785. }
  786. num.cart_num++;
  787. let arrMin = [];
  788. arrMin.push(nums);
  789. arrMin.push(quota);
  790. arrMin.push(stock);
  791. let minN = Math.min.apply(null, arrMin);
  792. if (num.cart_num >= minN) {
  793. this.$set(this.attribute.productSelect, "cart_num", minN ? minN : 1);
  794. this.$set(this, "cart_num", minN ? minN : 1);
  795. }
  796. this.$set(this, "cart_num", num.cart_num);
  797. this.$set(this.attribute.productSelect, "cart_num", num.cart_num);
  798. } else {
  799. num.cart_num--;
  800. if (num.cart_num < 1) {
  801. this.$set(this.attribute.productSelect, "cart_num", 1);
  802. this.$set(this, "cart_num", 1);
  803. }
  804. this.$set(this, "cart_num", num.cart_num);
  805. this.$set(this.attribute.productSelect, "cart_num", num.cart_num);
  806. }
  807. },
  808. attrVal(val) {
  809. this.attribute.productAttr[val.indexw].index = this.attribute.productAttr[val.indexw].attrValues[val.indexn];
  810. },
  811. /**
  812. * 属性变动赋值
  813. *
  814. */
  815. ChangeAttr: function(res) {
  816. this.$set(this,'cart_num',1);
  817. let productSelect = this.productValue[res];
  818. this.$set(this, "selectSku", productSelect);
  819. if (productSelect) {
  820. this.$set(this.attribute.productSelect, "image", productSelect.image);
  821. this.$set(this.attribute.productSelect, "price", productSelect.price);
  822. this.$set(this.attribute.productSelect, "stock", productSelect.stock);
  823. this.$set(this.attribute.productSelect, "unique", productSelect.id);
  824. this.$set(this.attribute.productSelect, "cart_num", 1);
  825. this.$set(this.attribute.productSelect, "quota", productSelect.quota);
  826. this.$set(this.attribute.productSelect, "quotaShow", productSelect.quotaShow);
  827. this.$set(this, "attrValue", res);
  828. this.attrTxt = "已选择"
  829. } else {
  830. this.$set(this.attribute.productSelect, "image", this.storeInfo.image);
  831. this.$set(this.attribute.productSelect, "price", this.storeInfo.price);
  832. this.$set(this.attribute.productSelect, "stock", 0);
  833. this.$set(this.attribute.productSelect, "unique", "");
  834. this.$set(this.attribute.productSelect, "cart_num", 0);
  835. this.$set(this.attribute.productSelect, "quota", 0);
  836. this.$set(this.attribute.productSelect, "quotaShow", 0);
  837. this.$set(this, "attrValue", "");
  838. this.attrTxt = "已选择"
  839. }
  840. },
  841. scroll: function(e) {
  842. var that = this,
  843. scrollY = e.detail.scrollTop;
  844. var opacity = scrollY / 500;
  845. opacity = opacity > 1 ? 1 : opacity;
  846. that.opacity = opacity
  847. that.scrollY = scrollY
  848. if (that.lock) {
  849. that.lock = false
  850. return;
  851. }
  852. for (var i = 0; i < that.topArr.length; i++) {
  853. if (scrollY < that.topArr[i] - (app.globalData.navHeight / 2) + that.heightArr[i]) {
  854. that.navActive = i
  855. break
  856. }
  857. }
  858. if(that.currentPage == true){
  859. that.$set(that,'currentPage',false);
  860. }
  861. },
  862. tap: function(item, index) {
  863. var id = item.id;
  864. var index = index;
  865. var that = this;
  866. // if (!this.data.good_list.length && id == "past2") {
  867. // id = "past3"
  868. // }
  869. this.toView = id;
  870. this.navActive = index;
  871. this.lock = true;
  872. this.scrollTop = index > 0 ? that.topArr[index] - (app.globalData.navHeight / 2) : that.topArr[index]
  873. },
  874. infoScroll: function() {
  875. var that = this,
  876. topArr = [],
  877. heightArr = [];
  878. for (var i = 0; i < that.navList.length; i++) { //productList
  879. //获取元素所在位置
  880. var query = wx.createSelectorQuery().in(this);
  881. var idView = "#past" + i;
  882. // if (!that.data.good_list.length && i == 2) {
  883. // var idView = "#past" + 3;
  884. // }
  885. query.select(idView).boundingClientRect();
  886. query.exec(function(res) {
  887. var top = res[0].top;
  888. var height = res[0].height;
  889. topArr.push(top);
  890. heightArr.push(height);
  891. that.topArr = topArr
  892. that.heightArr = heightArr
  893. });
  894. };
  895. },
  896. /**
  897. * 收藏商品
  898. */
  899. setCollect: function() {
  900. var that = this;
  901. if (this.userCollect) {
  902. collectDel(this.storeInfo.productId).then(res => {
  903. that.userCollect = !that.userCollect
  904. })
  905. } else {
  906. collectAdd(this.storeInfo.productId).then(res => {
  907. that.userCollect = !that.userCollect
  908. })
  909. }
  910. },
  911. /*
  912. * 单独购买
  913. */
  914. openAlone: function() {
  915. uni.navigateTo({
  916. url: `/pages/goods/goods_details/index?id=${this.storeInfo.productId}`
  917. })
  918. },
  919. /*
  920. * 下订单
  921. */
  922. goCat: function() {
  923. var that = this;
  924. var productSelect = this.productValue[this.attrValue];
  925. var productSelect = this.productValue[this.attrValue];
  926. if (that.cart_num > 1) {
  927. return this.$util.Tips({
  928. title: `该商品每人限购1${this.storeInfo.unitName}`
  929. });
  930. }
  931. //打开属性
  932. if (this.isOpen)
  933. this.attribute.cartAttr = true
  934. else
  935. this.attribute.cartAttr = !this.attribute.cartAttr
  936. //只有关闭属性弹窗时进行加入购物车
  937. if (this.attribute.cartAttr === true && this.isOpen == false) return this.isOpen = true
  938. //如果有属性,没有选择,提示用户选择
  939. if (this.attribute.productAttr.length && productSelect === undefined && this.isOpen == true) return app.$util.Tips({
  940. title: '请选择属性'
  941. });
  942. this.$Order.getPreOrder("buyNow",[{
  943. "attrValueId": parseFloat(this.attribute.productSelect.unique),
  944. "seckillId": parseFloat(this.id),
  945. "productNum": parseFloat(this.cart_num ? this.cart_num : this.attribute.productSelect.cart_num),
  946. "productId": parseFloat(this.storeInfo.productId)
  947. }]);
  948. },
  949. /**
  950. * 分享打开
  951. *
  952. */
  953. listenerActionSheet: function() {
  954. // #ifdef H5
  955. if (this.$wechat.isWeixin() === true) {
  956. this.weixinStatus = true;
  957. }
  958. // #endif
  959. // #ifndef APP-PLUS
  960. this.goPoster()
  961. // #endif
  962. this.posters = true;
  963. },
  964. // 分享关闭
  965. listenerActionClose: function() {
  966. this.posters = false;
  967. },
  968. //隐藏海报
  969. posterImageClose: function() {
  970. this.canvasStatus = false;
  971. this.posters = false;
  972. },
  973. //替换安全域名
  974. setDomain: function(url) {
  975. url = url ? url.toString() : '';
  976. //本地调试打开,生产请注销
  977. if (url.indexOf("https://") > -1) return url;
  978. else return url.replace('http://', 'https://');
  979. },
  980. //获取海报产品图
  981. downloadFilestoreImage: function() {
  982. let that = this;
  983. uni.downloadFile({
  984. url: that.setDomain(that.storeInfo.image),
  985. success: function(res) {
  986. that.storeImage = res.tempFilePath;
  987. },
  988. fail: function() {
  989. return that.$util.Tips({
  990. title: ''
  991. });
  992. that.storeImage = '';
  993. },
  994. });
  995. },
  996. getImageBase64:function(images){
  997. let that = this;
  998. imageBase64({url:images}).then(res=>{
  999. that.$set(that,'imgTop',res.data.code);
  1000. })
  1001. },
  1002. // 小程序关闭分享弹窗;
  1003. goFriend: function() {
  1004. this.posters = false;
  1005. },
  1006. /**
  1007. * 生成海报
  1008. */
  1009. goPoster: function() {
  1010. let that = this;
  1011. uni.showLoading({
  1012. title: '海报生成中',
  1013. mask: true
  1014. });
  1015. that.posters = false;
  1016. let arrImagesUrl = '';
  1017. let arrImagesUrlTop = '';
  1018. if(!that.PromotionCode){
  1019. uni.hideLoading();
  1020. that.$util.Tips({
  1021. title: that.errT
  1022. });
  1023. return
  1024. }
  1025. setTimeout(() => {
  1026. if (!that.imgTop) {
  1027. uni.hideLoading();
  1028. that.$util.Tips({
  1029. title: '无法生成商品海报!'
  1030. });
  1031. return
  1032. }
  1033. }, 2000);
  1034. uni.downloadFile({
  1035. url: that.imgTop, //仅为示例,并非真实的资源
  1036. success: (res) => {
  1037. arrImagesUrlTop = res.tempFilePath;
  1038. let arrImages = [that.posterbackgd, arrImagesUrlTop, that.PromotionCode];
  1039. let storeName = that.storeInfo.storeName;
  1040. let price = that.storeInfo.price;
  1041. setTimeout(() => {
  1042. that.$util.PosterCanvas(arrImages, storeName, price, that.storeInfo.otPrice,function(tempFilePath) {
  1043. that.posterImage = tempFilePath;
  1044. that.canvasStatus = true;
  1045. uni.hideLoading();
  1046. });
  1047. }, 500);
  1048. }
  1049. });
  1050. },
  1051. // 小程序二维码
  1052. getQrcode(){
  1053. let that = this;
  1054. let data = {
  1055. pid: that.uid,
  1056. id: that.id,
  1057. path: 'pages/activity/goods_seckill_details/index'
  1058. }
  1059. getQrcode(data).then(res=>{
  1060. base64src(res.data.code,Date.now(), res => {
  1061. that.PromotionCode = res;
  1062. });
  1063. }).catch(err => {
  1064. that.errT = err;
  1065. });
  1066. },
  1067. // 生成二维码;
  1068. make() {
  1069. let href = location.href.split('?')[0] + "?id="+ this.id + "&spread=" + this.uid;
  1070. uQRCode.make({
  1071. canvasId: 'qrcode',
  1072. text: href,
  1073. size: this.qrcodeSize,
  1074. margin: 10,
  1075. success: res => {
  1076. this.PromotionCode = res;
  1077. },
  1078. complete: (res) => {
  1079. },
  1080. fail:res=>{
  1081. this.$util.Tips({
  1082. title: '海报二维码生成失败!'
  1083. });
  1084. }
  1085. })
  1086. },
  1087. // 图片预览;
  1088. getpreviewImage: function() {
  1089. if (this.posterImage) {
  1090. let photoList = [];
  1091. photoList.push(this.posterImage)
  1092. uni.previewImage({
  1093. urls: photoList,
  1094. current: this.posterImage
  1095. });
  1096. } else {
  1097. this.$util.Tips({
  1098. title: '您的海报尚未生成'
  1099. });
  1100. }
  1101. },
  1102. /*
  1103. * 保存到手机相册
  1104. */
  1105. // #ifdef MP
  1106. savePosterPath: function() {
  1107. let that = this;
  1108. uni.getSetting({
  1109. success(res) {
  1110. if (!res.authSetting['scope.writePhotosAlbum']) {
  1111. uni.authorize({
  1112. scope: 'scope.writePhotosAlbum',
  1113. success() {
  1114. uni.saveImageToPhotosAlbum({
  1115. filePath: that.posterImage,
  1116. success: function(res) {
  1117. that.posterImageClose();
  1118. that.$util.Tips({
  1119. title: '保存成功',
  1120. icon: 'success'
  1121. });
  1122. },
  1123. fail: function(res) {
  1124. that.$util.Tips({
  1125. title: '保存失败'
  1126. });
  1127. }
  1128. })
  1129. }
  1130. })
  1131. } else {
  1132. uni.saveImageToPhotosAlbum({
  1133. filePath: that.posterImage,
  1134. success: function(res) {
  1135. that.posterImageClose();
  1136. that.$util.Tips({
  1137. title: '保存成功',
  1138. icon: 'success'
  1139. });
  1140. },
  1141. fail: function(res) {
  1142. that.$util.Tips({
  1143. title: '保存失败'
  1144. });
  1145. },
  1146. })
  1147. }
  1148. }
  1149. })
  1150. },
  1151. // #endif
  1152. setShareInfoStatus: function() {
  1153. let data = this.storeInfo;
  1154. let href = location.href;
  1155. if (this.$wechat.isWeixin()) {
  1156. href =
  1157. href.indexOf("?") === -1 ?
  1158. href + "?spread=" + this.uid :
  1159. href + "&spread=" + this.uid;
  1160. let configAppMessage = {
  1161. desc: app.globalData.companyName,
  1162. title: data.storeName,
  1163. link: href,
  1164. imgUrl: data.image
  1165. };
  1166. this.$wechat.wechatEvevt(["updateAppMessageShareData", "updateTimelineShareData"], configAppMessage)
  1167. }
  1168. },
  1169. hideNav(){
  1170. this.currentPage = false;
  1171. },
  1172. //下拉导航页面跳转
  1173. linkPage(url){
  1174. if(url == '/pages/index/index' || url == '/pages/order_addcart/order_addcart' || url == '/pages/user/index'){
  1175. uni.switchTab({
  1176. url
  1177. })
  1178. }else{
  1179. uni.navigateTo({
  1180. url
  1181. })
  1182. }
  1183. this.currentPage = false
  1184. },
  1185. showImg(index){
  1186. this.$refs.cusPreviewImg.open(this.selectSku.suk)
  1187. },
  1188. changeSwitch(e){
  1189. let productSelect = this.skuArr[e];
  1190. this.$set(this,'selectSku',productSelect);
  1191. var skuList = productSelect.suk.split(',');
  1192. skuList.forEach((i,index)=>{
  1193. this.$set(this.attribute.productAttr[index],'index',skuList[index]);
  1194. })
  1195. if (productSelect) {
  1196. this.$set(this.attribute.productSelect, "image", productSelect.image);
  1197. this.$set(this.attribute.productSelect, "price", productSelect.price);
  1198. this.$set(this.attribute.productSelect, "stock", productSelect.stock);
  1199. this.$set(this.attribute.productSelect, "unique", productSelect.id);
  1200. this.$set(this.attribute.productSelect, "quota", productSelect.quota);
  1201. this.$set(this.attribute.productSelect, "quotaShow", productSelect.quotaShow);
  1202. this.$set(this.attribute.productSelect, "cart_num", 1);
  1203. this.$set(this, "attrTxt", "已选择")
  1204. this.$set(this, "attrValue", productSelect.suk)
  1205. }
  1206. }
  1207. },
  1208. //#ifdef MP
  1209. onShareAppMessage() {
  1210. let that = this;
  1211. return {
  1212. title: that.storeInfo.title,
  1213. path: app.globalData.openPages,
  1214. imageUrl: that.storeInfo.image
  1215. };
  1216. },
  1217. //#endif
  1218. }
  1219. </script>
  1220. <style scoped lang="scss">
  1221. .pl-06{
  1222. padding-left: 6rpx;
  1223. }
  1224. .pr-14{
  1225. padding-right: 14rpx;
  1226. }
  1227. .select_nav{
  1228. width: 170rpx !important;
  1229. height: 60rpx !important;
  1230. border-radius: 33rpx;
  1231. background: rgba(255, 255, 255, 0.3);
  1232. border: 1px solid rgba(0,0,0,0.07);
  1233. color: #000;
  1234. position: fixed;
  1235. font-size: 18px;
  1236. line-height: 58rpx;
  1237. z-index: 1000;
  1238. left: 14rpx;
  1239. }
  1240. .px-20{
  1241. padding: 0 20rpx 0;
  1242. }
  1243. .nav_line{
  1244. content: '';
  1245. display: inline-block;
  1246. width: 1px;
  1247. height: 34rpx;
  1248. background: rgba(0, 0, 0, 0.2);
  1249. position: absolute;
  1250. left: 0;
  1251. right: 0;
  1252. margin: auto;
  1253. }
  1254. .bgwhite{
  1255. background: #fff;
  1256. }
  1257. .input {
  1258. display: flex;
  1259. align-items: center;
  1260. /* #ifdef MP */
  1261. width: 300rpx;
  1262. /* #endif */
  1263. /* #ifndef MP */
  1264. width: 460rpx;
  1265. /* #endif */
  1266. height: 58rpx;
  1267. padding: 0 0 0 30rpx;
  1268. border: 1px solid #E0E0E0;
  1269. border-radius: 29rpx;
  1270. color: #BBBBBB;
  1271. font-size: 26rpx;
  1272. position: fixed;
  1273. left: 0;
  1274. right: 0;
  1275. margin: auto;
  1276. background: #fff;
  1277. .iconfont {
  1278. margin-right: 20rpx;
  1279. font-size: 26rpx;
  1280. color: #666666;
  1281. }
  1282. }
  1283. .container_detail{
  1284. /* #ifdef MP */
  1285. margin-top:32rpx;
  1286. /* #endif */
  1287. }
  1288. .tab_nav{
  1289. width: 100%;
  1290. height: 48px;
  1291. padding:0 30rpx 0;
  1292. }
  1293. .h5_back {
  1294. color: #000;
  1295. position: fixed;
  1296. left:20rpx;
  1297. font-size: 32rpx;
  1298. text-align: center;
  1299. width: 58rpx;
  1300. height: 58rpx;
  1301. background: rgba(255, 255, 255, 0.3);
  1302. border: 1px solid rgba(0,0,0,0.1);
  1303. border-radius: 50%;
  1304. }
  1305. .right_select{
  1306. width: 58rpx;
  1307. height: 58rpx;
  1308. background: rgba(255, 255, 255, 0.3);
  1309. border: 1px solid rgba(0,0,0,0.1);
  1310. border-radius: 50%;
  1311. position: fixed;
  1312. right: 20rpx;
  1313. text-align: center;
  1314. line-height: 58rpx;
  1315. }
  1316. .dialog_nav{
  1317. position: absolute;
  1318. /* #ifdef MP */
  1319. left: 14rpx;
  1320. /* #endif */
  1321. /* #ifdef H5 || APP-PLUS*/
  1322. right: 14rpx;
  1323. /* #endif */
  1324. width: 240rpx;
  1325. background: #FFFFFF;
  1326. box-shadow: 0px 0px 16rpx rgba(0, 0, 0, 0.08);
  1327. z-index: 310;
  1328. border-radius: 14rpx;
  1329. &::before{
  1330. content: '';
  1331. width: 0;
  1332. height: 0;
  1333. position: absolute;
  1334. /* #ifdef MP */
  1335. left: 0;
  1336. right: 0;
  1337. margin:auto;
  1338. /* #endif */
  1339. /* #ifdef H5 || APP-PLUS */
  1340. right: 8px;
  1341. /* #endif */
  1342. top:-9px;
  1343. border-bottom: 10px solid #F5F5F5;
  1344. border-left: 10px solid transparent; /*transparent 表示透明*/
  1345. border-right: 10px solid transparent;
  1346. }
  1347. }
  1348. .dialog_nav_item{
  1349. width: 100%;
  1350. height: 84rpx;
  1351. line-height: 84rpx;
  1352. padding: 0 20rpx 0;
  1353. box-sizing: border-box;
  1354. border-bottom: #eee;
  1355. font-size: 28rpx;
  1356. color: #333;
  1357. position: relative;
  1358. .iconfont{
  1359. font-size: 32rpx;
  1360. }
  1361. }
  1362. .dialog_after{
  1363. ::after{
  1364. content: '';
  1365. position: absolute;
  1366. width:86px;
  1367. height: 1px;
  1368. background-color: #EEEEEE;
  1369. bottom: 0;
  1370. right: 0;
  1371. }
  1372. }
  1373. .justify-center{
  1374. justify-content: center;
  1375. }
  1376. .align-center {
  1377. align-items: center;
  1378. }
  1379. .pl-20{
  1380. padding-left: 20rpx;
  1381. }
  1382. .userEvaluation{
  1383. i{
  1384. display: inline-block;
  1385. }
  1386. }
  1387. .product-con{
  1388. .line1{
  1389. width: 600rpx;
  1390. }
  1391. }
  1392. .share-box {
  1393. z-index: 1000;
  1394. position: fixed;
  1395. left: 0;
  1396. top: 0;
  1397. width: 100%;
  1398. height: 100%;
  1399. image {
  1400. width: 100%;
  1401. height: 100%;
  1402. }
  1403. }
  1404. .generate-posters {
  1405. width: 100%;
  1406. height: 318rpx;
  1407. background-color: #fff;
  1408. position: fixed;
  1409. left: 0;
  1410. bottom: 0;
  1411. z-index: 388;
  1412. transform: translate3d(0, 100%, 0);
  1413. transition: all 0.3s cubic-bezier(0.25, 0.5, 0.5, 0.9);
  1414. border-top: 1rpx solid #eee;
  1415. .generateCon {
  1416. height: 220rpx;
  1417. }
  1418. .generateClose {
  1419. height: 98rpx;
  1420. font-size: 28rpx;
  1421. color: #333333;
  1422. border-top: 1px solid #eee;
  1423. }
  1424. .item {
  1425. .pictrue {
  1426. width: 96rpx;
  1427. height: 96rpx;
  1428. border-radius: 50%;
  1429. margin: 0 auto 6rpx auto;
  1430. image {
  1431. width: 100%;
  1432. height: 100%;
  1433. border-radius: 50%;
  1434. }
  1435. }
  1436. }
  1437. }
  1438. .generate-posters.on {
  1439. transform: translate3d(0, 0, 0);
  1440. }
  1441. .generate-posters .item {
  1442. flex: 1;
  1443. text-align: center;
  1444. font-size: 30rpx;
  1445. }
  1446. .generate-posters .item .iconfont {
  1447. font-size: 80rpx;
  1448. color: #5eae72;
  1449. }
  1450. .generate-posters .item .iconfont.icon-haibao {
  1451. color: #5391f1;
  1452. }
  1453. .generate-posters .item .iconfont.icon-haowuquan1 {
  1454. color: #ff954d;
  1455. }
  1456. .navbar .header {
  1457. font-size: 30rpx;
  1458. color: #050505;
  1459. display: flex;
  1460. align-items: center;
  1461. /* #ifndef MP */
  1462. width: 460rpx;
  1463. /* #endif */
  1464. /* #ifdef MP */
  1465. width: 360rpx;
  1466. /* #endif */
  1467. height: 100rpx;
  1468. position: fixed;
  1469. left: 0;
  1470. right: 0;
  1471. margin: auto;
  1472. }
  1473. .icon-xiangzuo {
  1474. /* #ifdef H5 */
  1475. top: 20rpx !important;
  1476. /* #endif */
  1477. }
  1478. .navbar .header .item {
  1479. position: relative;
  1480. margin: 0 25rpx;
  1481. }
  1482. .navbar .header .item.on:before {
  1483. position: absolute;
  1484. width: 60rpx;
  1485. height: 5rpx;
  1486. background-repeat: no-repeat;
  1487. content: "";
  1488. background-image: linear-gradient(to right, #ff3366 0%, #ff6533 100%);
  1489. bottom: -10rpx;
  1490. left: 50%;
  1491. margin-left: -28rpx;
  1492. }
  1493. .navbar {
  1494. position: fixed;
  1495. // background-color: #fff;
  1496. top: 0;
  1497. left: 0;
  1498. z-index: 98;
  1499. width: 100%;
  1500. }
  1501. .navbar .navbarH {
  1502. position: relative;
  1503. }
  1504. .navbar .navbarH .navbarCon {
  1505. position: absolute;
  1506. bottom: 0;
  1507. height: 100rpx;
  1508. width: 100%;
  1509. }
  1510. .product-con .nav {
  1511. background-image: url('data:image/png;base64,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
  1512. background-repeat: no-repeat;
  1513. background-size: 100% 100%;
  1514. width: 100%;
  1515. height: 110rpx;
  1516. padding: 0 30rpx;
  1517. box-sizing: border-box;
  1518. @include main_bg_color(theme);
  1519. }
  1520. .product-con .nav .money {
  1521. font-size: 28rpx;
  1522. color: #fff;
  1523. font-weight: 700;
  1524. }
  1525. .product-con .nav .money .num {
  1526. font-size: 48rpx;
  1527. }
  1528. .product-con .nav .money .y-money {
  1529. font-size: 26rpx;
  1530. margin-left: 10rpx;
  1531. text-decoration: line-through;
  1532. }
  1533. .product-con .nav .time {
  1534. font-size: 20rpx;
  1535. color: #fff;
  1536. text-align: center;
  1537. }
  1538. .product-con .nav .time .timeCon {
  1539. margin-top: 10rpx;
  1540. }
  1541. .product-con .nav .time .timeCon .num {
  1542. padding: 0 7rpx;
  1543. font-size: 22rpx;
  1544. color: #ff3d3d;
  1545. background-color: #fff;
  1546. border-radius: 2rpx;
  1547. }
  1548. .product-con .nav .timeState {
  1549. font-size: 28RPX;
  1550. color: #FFF;
  1551. }
  1552. .product-con .nav .iconfont {
  1553. color: #fff;
  1554. font-size: 30rpx;
  1555. margin-left: 20rpx;
  1556. }
  1557. .product-con .wrapper .introduce {
  1558. margin: 0;
  1559. }
  1560. .product-con .wrapper .introduce .infor {
  1561. width: 570rpx;
  1562. }
  1563. .product-con .wrapper .introduce .iconfont {
  1564. font-size: 36rpx;
  1565. color: #999999;
  1566. }
  1567. .product-con .wrapper .label {
  1568. margin: 18rpx 0 0 0;
  1569. font-size: 24rpx;
  1570. color: #82848f;
  1571. }
  1572. .product-con .wrapper .label .stock {
  1573. width: 255rpx;
  1574. margin-right: 28rpx;
  1575. }
  1576. .product-con .footer {
  1577. padding: 0 20rpx 0 30rpx;
  1578. position: fixed;
  1579. bottom: 0;
  1580. width: 100%;
  1581. box-sizing: border-box;
  1582. background-color: #fff;
  1583. z-index: 99;
  1584. border-top: 1rpx solid #f0f0f0;
  1585. height: 100rpx;
  1586. height: calc(100rpx+ constant(safe-area-inset-bottom)); ///兼容 IOS<11.2/
  1587. height: calc(100rpx + env(safe-area-inset-bottom)); ///兼容 IOS>11.2/
  1588. }
  1589. .product-con .footer .item {
  1590. font-size: 18rpx;
  1591. color: #666;
  1592. }
  1593. .product-con .footer .item .iconfont {
  1594. text-align: center;
  1595. font-size: 40rpx;
  1596. }
  1597. .product-con .footer .item .iconfont.icon-shoucang1 {
  1598. @include main-color(theme);
  1599. }
  1600. .product-con .footer .item .iconfont.icon-gouwuche1 {
  1601. font-size: 40rpx;
  1602. position: relative;
  1603. }
  1604. .product-con .footer .item .iconfont.icon-gouwuche1 .num {
  1605. color: #fff;
  1606. position: absolute;
  1607. font-size: 18rpx;
  1608. padding: 2rpx 8rpx 3rpx;
  1609. border-radius: 200rpx;
  1610. top: -10rpx;
  1611. right: -10rpx;
  1612. }
  1613. .product-con .footer .bnt {
  1614. width: 540rpx;
  1615. height: 76rpx;
  1616. }
  1617. .product-con .footer .bnt .bnts {
  1618. width: 270rpx;
  1619. text-align: center;
  1620. line-height: 76rpx;
  1621. color: #fff;
  1622. font-size: 28rpx;
  1623. }
  1624. .product-con .footer .bnt .joinCart {
  1625. border-radius: 50rpx 0 0 50rpx;
  1626. @include left_color(theme);
  1627. }
  1628. .radius{
  1629. border-radius: 50rpx 0 0 50rpx !important;
  1630. }
  1631. .bg_color{
  1632. @include main_bg_color(theme);
  1633. }
  1634. .font_color{
  1635. @include main_color(theme);
  1636. }
  1637. .product-con .footer .bnt .buy {
  1638. border-radius: 0 50rpx 50rpx 0;
  1639. // background-image: linear-gradient(to right, #fa6514 0%, #e93323 100%);
  1640. @include main_bg_color(theme);
  1641. }
  1642. .setCollectBox {
  1643. font-size: 18rpx;
  1644. color: #666;
  1645. }
  1646. .bg-color-hui {
  1647. background: #bbbbbb !important;
  1648. border-radius: 0 50rpx 50rpx 0;
  1649. }
  1650. .canvas {
  1651. position:fixed;
  1652. z-index: -5;
  1653. opacity: 0;
  1654. }
  1655. .poster-pop {
  1656. width: 450rpx;
  1657. height: 714rpx;
  1658. position: fixed;
  1659. left: 50%;
  1660. transform: translateX(-50%);
  1661. z-index: 99;
  1662. top: 50%;
  1663. margin-top: -357rpx;
  1664. }
  1665. .poster-pop image {
  1666. width: 100%;
  1667. height: 100%;
  1668. display: block;
  1669. }
  1670. .poster-pop .close {
  1671. width: 46rpx;
  1672. height: 75rpx;
  1673. position: fixed;
  1674. right: 0;
  1675. top: -73rpx;
  1676. display: block;
  1677. }
  1678. .poster-pop .save-poster {
  1679. background-color: #df2d0a;
  1680. font-size: 22rpx;
  1681. color: #fff;
  1682. text-align: center;
  1683. height: 76rpx;
  1684. line-height: 76rpx;
  1685. width: 100%;
  1686. }
  1687. .poster-pop .keep {
  1688. color: #fff;
  1689. text-align: center;
  1690. font-size: 25rpx;
  1691. margin-top: 10rpx;
  1692. }
  1693. .mask {
  1694. position: fixed;
  1695. top: 0;
  1696. left: 0;
  1697. right: 0;
  1698. bottom: 0;
  1699. background-color: rgba(0, 0, 0, 0.6);
  1700. z-index: 9;
  1701. }
  1702. .mask_transparent{
  1703. position: fixed;
  1704. top: 0;
  1705. left: 0;
  1706. right: 0;
  1707. bottom: 0;
  1708. background:transparent;
  1709. z-index: 300;
  1710. }
  1711. .home-nav {
  1712. /* #ifdef H5 */
  1713. top: 20rpx !important;
  1714. /* #endif */
  1715. }
  1716. .home-nav {
  1717. color: #fff;
  1718. position: fixed;
  1719. font-size: 33rpx;
  1720. width: 56rpx;
  1721. height: 56rpx;
  1722. z-index: 999;
  1723. left: 33rpx;
  1724. background: rgba(190, 190, 190, 0.5);
  1725. border-radius: 50%;
  1726. &.on{
  1727. background: unset;
  1728. color: #333;
  1729. }
  1730. }
  1731. .home-nav .line {
  1732. width: 1rpx;
  1733. height: 24rpx;
  1734. background: rgba(255, 255, 255, 0.25);
  1735. }
  1736. .home-nav .icon-xiangzuo {
  1737. width: auto;
  1738. font-size: 28rpx;
  1739. }
  1740. .attrImg{
  1741. width: 66rpx;
  1742. height: 66rpx;
  1743. border-radius: 6rpx;
  1744. display: block;
  1745. margin-right: 14rpx;
  1746. }
  1747. .switchTxt{
  1748. height: 60rpx;
  1749. flex: 1;
  1750. line-height: 60rpx;
  1751. box-sizing: border-box;
  1752. background: #EEEEEE;
  1753. padding-right: 0 24rpx 0;
  1754. border-radius: 8rpx;
  1755. text-align: center;
  1756. }
  1757. </style>