小程序端工程代码
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.

866 lines
26 KiB

  1. <template>
  2. <view :class="productConClass">
  3. <view v-if="storeInfo.id">
  4. <!-- 轮播图 -->
  5. <product-con-swiper :img-urls="storeInfo.sliderImageArr"></product-con-swiper>
  6. <!-- 商品信息描述 -->
  7. <view class="wrapper">
  8. <view class="share acea-row row-between row-bottom">
  9. <view class="money font-color-red">
  10. <text class="num">{{ attr.productSelect.integral || storeInfo.integral }}积分</text>
  11. </view>
  12. </view>
  13. <view class="introduce">{{ storeInfo.storeName }}</view>
  14. <view class="label acea-row row-between-wrapper">
  15. <text>库存:{{ storeInfo.stock }}{{ storeInfo.unitName }}</text>
  16. <text>销量:{{ storeInfo.sales }}{{ storeInfo.unitName }}</text>
  17. </view>
  18. </view>
  19. <!-- 规格 -->
  20. <view class="attribute acea-row row-between-wrapper" @click="selecAttrTap">
  21. <view>
  22. <text>{{ attrTxt }}</text>
  23. <text class="atterTxt">{{ attrValue }}</text>
  24. </view>
  25. <view class="iconfont icon-jiantou"></view>
  26. </view>
  27. <!-- 用户评价 -->
  28. <view class="userEvaluation" v-if="replyCount">
  29. <view class="title acea-row row-between-wrapper">
  30. <view>用户评价({{ replyCount }})</view>
  31. <text @click="goEvaluateList(id)" class="praise">
  32. <text class="font-color-red">{{ replyChance }}%</text>好评率
  33. <text class="iconfont icon-jiantou"></text>
  34. </text>
  35. </view>
  36. <user-evaluation :reply="reply"></user-evaluation>
  37. </view>
  38. <!-- 商品详情 -->
  39. <view class="product-intro">
  40. <text class="title"><text>产品介绍</text></text>
  41. <view class="conter" v-html="storeInfo.description"></view>
  42. </view>
  43. <view style="height: 100rpx"></view>
  44. <!-- 操作栏 -->
  45. <view class="footer acea-row row-between-wrapper">
  46. <view class="item" @click="goHome">
  47. <view class="iconfont icon-shouye-xianxing"></view>
  48. <text>首页</text>
  49. </view>
  50. <view class="bnt in-bnt acea-row">
  51. <view class="buy" @click="tapBuy">
  52. <text>立即兑换</text>
  53. </view>
  54. </view>
  55. </view>
  56. <!-- 商品规格弹窗 -->
  57. <ProductWindow :isIntegral="isIntegral" v-on:changeFun="changeFun" :attr="attr" :cartNum="cart_num"></ProductWindow>
  58. <!-- 分享海报 -->
  59. <StorePoster v-on:setPosterImageStatus="setPosterImageStatus" :posterImageStatus="posterImageStatus" :posterData="posterData" :goodId="id"></StorePoster>
  60. </view>
  61. </view>
  62. </template>
  63. <script>
  64. // import { swiper, swiperSlide } from "vue-awesome-swiper";
  65. import ProductConSwiper from '@/components/ProductConSwiper'
  66. import UserEvaluation from '@/components/UserEvaluation'
  67. import CouponPop from '@/components/CouponPop'
  68. import ProductWindow from '@/components/ProductWindow'
  69. import StorePoster from '@/components/StorePoster'
  70. import ShareInfo from '@/components/ShareInfo'
  71. import { getProductDetail, postCartAdd, getCartCount, getProductCode } from '@/api/store'
  72. import { getCoupon, getCollectAdd, getCollectDel, getUserInfo } from '@/api/user'
  73. import cookie from '@/utils/store/cookie'
  74. import { isWeixin, PosterCanvas, handleQrCode, handleUrlParam, getCurrentPageUrlWithArgs } from '@/utils'
  75. import { wechatEvevt } from '@/libs/wechat'
  76. import { imageBase64 } from '@/api/public'
  77. import { mapGetters } from 'vuex'
  78. export default {
  79. name: 'GoodsCon',
  80. components: {
  81. // swiper,
  82. // swiperSlide,
  83. ProductConSwiper,
  84. UserEvaluation,
  85. CouponPop,
  86. ProductWindow,
  87. StorePoster,
  88. ShareInfo,
  89. },
  90. data: function() {
  91. return {
  92. shareInfoStatus: false,
  93. weixinStatus: false,
  94. mapShow: false,
  95. mapKey: '',
  96. posterData: {
  97. image: '',
  98. title: '',
  99. price: '',
  100. code: '',
  101. },
  102. posterImageStatus: false,
  103. animated: false,
  104. coupon: {
  105. coupon: false,
  106. list: [],
  107. },
  108. attr: {
  109. cartAttr: false,
  110. productAttr: [],
  111. productSelect: {},
  112. },
  113. isOpen: false, //是否打开属性组件
  114. productValue: [],
  115. id: 0,
  116. storeInfo: {},
  117. couponList: [],
  118. attrTxt: '请选择',
  119. attrValue: '',
  120. cart_num: 1, //购买数量
  121. replyCount: '',
  122. replyChance: '',
  123. reply: [],
  124. priceName: 0,
  125. CartCount: 0,
  126. posters: false,
  127. banner: [{}, {}],
  128. swiperRecommend: {
  129. pagination: {
  130. el: '.swiper-pagination',
  131. clickable: true,
  132. },
  133. autoplay: false,
  134. loop: false,
  135. speed: 1000,
  136. observer: true,
  137. observeParents: true,
  138. },
  139. goodList: [],
  140. systemStore: {},
  141. qqmapsdk: null,
  142. productConClass: 'product-con',
  143. tempName: '全国包邮',
  144. isIntegral: false,
  145. }
  146. },
  147. computed: mapGetters(['isLogin', 'location']),
  148. mounted: function() {
  149. this.$store.commit('get_to', 'goodcon')
  150. let url = handleQrCode()
  151. if (!url) {
  152. url = handleUrlParam(getCurrentPageUrlWithArgs())
  153. }
  154. this.coupons()
  155. if (url && url.id) {
  156. this.id = url.id
  157. let urlSpread = parseInt(url.spread)
  158. if (urlSpread) {
  159. cookie.set('spread', urlSpread)
  160. }
  161. } else {
  162. this.id = this._route.query.id
  163. }
  164. this.isIntegral = url.isIntegral == 'true'
  165. this.productCon()
  166. this.setOpenShare()
  167. },
  168. watch: {
  169. posterImageStatus(status) {
  170. console.log(status)
  171. if (status) {
  172. this.productConClass = 'noscroll product-con'
  173. } else {
  174. this.productConClass = 'product-con'
  175. }
  176. },
  177. },
  178. methods: {
  179. onShareAppMessage: function() {
  180. return {
  181. title: this.storeInfo.storeName,
  182. imageUrl: this.storeInfo.image,
  183. path: 'pages/shop/GoodsCon/index?id=' + this.storeInfo.id + '&spread=' + uni.getStorageSync('uid') + '&pageType=good&codeType=routine',
  184. success(res) {
  185. uni.showToast({
  186. title: '分享成功',
  187. })
  188. },
  189. fail(res) {
  190. uni.showToast({
  191. title: '分享失败',
  192. icon: 'none',
  193. })
  194. },
  195. }
  196. },
  197. goHome() {
  198. this.$yrouter.switchTab('/pages/home/index')
  199. },
  200. goShoppingCart() {
  201. this.$yrouter.switchTab('/pages/shop/ShoppingCart/index')
  202. },
  203. goCustomerList() {
  204. this.$yrouter.push({
  205. path: '/pages/user/CustomerList/index',
  206. })
  207. },
  208. goStoreList() {
  209. this.$yrouter.push({
  210. path: '/pages/shop/StoreList/index',
  211. })
  212. },
  213. goEvaluateList(id) {
  214. this.$yrouter.push({
  215. path: '/pages/shop/EvaluateList/index',
  216. query: {
  217. id,
  218. },
  219. })
  220. },
  221. telPhone(phoneNumber) {
  222. uni.makePhoneCall({
  223. phoneNumber: phoneNumber,
  224. fail() {
  225. console.log('取消拨打')
  226. },
  227. })
  228. },
  229. showChang: function(data) {
  230. this.$yrouter.push({
  231. path: '/pages/map/index',
  232. query: data,
  233. })
  234. },
  235. updateTitle() {
  236. // document.title = this.storeInfo.storeName || this.$yroute.meta.title;
  237. },
  238. setShareInfoStatus: function() {
  239. this.shareInfoStatus = !this.shareInfoStatus
  240. this.posters = false
  241. },
  242. shareCode: function() {
  243. var that = this
  244. getProductCode(that.id).then(res => {
  245. that.posterData.code = res.data.code
  246. that.listenerActionSheet()
  247. })
  248. },
  249. setPosterImageStatus: function() {
  250. this.posterImageStatus = !this.posterImageStatus
  251. this.posters = false
  252. },
  253. //产品详情接口;
  254. productCon: function() {
  255. let that = this
  256. let from = this.location
  257. if (this.$deviceType == 'app') {
  258. from.from = 'app'
  259. }
  260. uni.showLoading({
  261. title: '加载中',
  262. mask: true,
  263. })
  264. getProductDetail(that.id, from)
  265. .then(res => {
  266. res.data.storeInfo.description = res.data.storeInfo.description.replace(/\<img/gi, '<img style="max-width:100%;height:auto;"')
  267. that.$set(that, 'storeInfo', res.data.storeInfo)
  268. // 给 attr 赋值,将请求回来的规格赋值给 attr
  269. that.$set(that.attr, 'productAttr', res.data.productAttr)
  270. that.$set(that, 'productValue', res.data.productValue)
  271. that.$set(that, 'replyCount', res.data.replyCount)
  272. that.$set(that, 'replyChance', res.data.replyChance)
  273. that.reply = res.data.reply ? [res.data.reply] : []
  274. that.$set(that, 'reply', that.reply)
  275. that.$set(that, 'priceName', res.data.priceName)
  276. that.$set(that, 'tempName', res.data.tempName)
  277. that.posterData.image = that.storeInfo.image
  278. if (that.storeInfo.storeName.length > 30) {
  279. that.posterData.title = that.storeInfo.storeName.substring(0, 30) + '...'
  280. } else {
  281. that.posterData.title = that.storeInfo.storeName
  282. }
  283. that.posterData.price = that.storeInfo.price
  284. that.posterData.code = that.storeInfo.codeBase
  285. that.systemStore = res.data.systemStore
  286. let good_list = res.data.goodList || []
  287. let goodArray = []
  288. let count = Math.ceil(good_list.length / 6)
  289. for (let i = 0; i < count; i++) {
  290. var list = good_list.slice(i * 6, 6)
  291. if (list.length)
  292. goodArray.push({
  293. list: list,
  294. })
  295. }
  296. that.mapKay = res.data.mapKay
  297. that.$set(that, 'goodList', goodArray)
  298. that.updateTitle()
  299. that.DefaultSelect()
  300. that.getCartCount()
  301. })
  302. .catch(err => {
  303. uni.showToast({
  304. title: err.msg || err.response.data.msg || err.response.data.message,
  305. icon: 'none',
  306. duration: 2000,
  307. })
  308. })
  309. .finally(() => {
  310. uni.hideLoading()
  311. })
  312. },
  313. //默认选中属性;
  314. DefaultSelect: function() {
  315. let productAttr = this.attr.productAttr
  316. let value = []
  317. for (let i = 0; i < productAttr.length; i++) {
  318. this.$set(productAttr[i], 'index', 0)
  319. value.push(productAttr[i].attrValueArr[0])
  320. }
  321. //sort();排序函数:数字-英文-汉字;
  322. let productSelect = this.productValue[value.sort().join(',')]
  323. if (productSelect && productAttr.length) {
  324. this.$set(this.attr.productSelect, 'store_name', this.storeInfo.storeName)
  325. this.$set(this.attr.productSelect, 'image', productSelect.image)
  326. this.$set(this.attr.productSelect, 'price', productSelect.price)
  327. this.$set(this.attr.productSelect, 'stock', productSelect.stock)
  328. this.$set(this.attr.productSelect, 'unique', productSelect.unique)
  329. this.$set(this.attr.productSelect, 'integral', productSelect.integral)
  330. this.$set(this.attr.productSelect, 'cart_num', 1)
  331. this.$set(this, 'attrValue', value.sort().join(','))
  332. this.$set(this, 'attrTxt', '已选择')
  333. } else if (!productSelect && productAttr.length) {
  334. this.$set(this.attr.productSelect, 'store_name', this.storeInfo.storeName)
  335. this.$set(this.attr.productSelect, 'image', this.storeInfo.image)
  336. this.$set(this.attr.productSelect, 'price', this.storeInfo.price)
  337. this.$set(this.attr.productSelect, 'integral', this.storeInfo.integral)
  338. this.$set(this.attr.productSelect, 'stock', 0)
  339. this.$set(this.attr.productSelect, 'unique', '')
  340. this.$set(this.attr.productSelect, 'cart_num', 0)
  341. this.$set(this, 'attrValue', '')
  342. this.$set(this, 'attrTxt', '请选择')
  343. } else if (!productSelect && !productAttr.length) {
  344. this.$set(this.attr.productSelect, 'store_name', this.storeInfo.storeName)
  345. this.$set(this.attr.productSelect, 'image', this.storeInfo.image)
  346. this.$set(this.attr.productSelect, 'price', this.storeInfo.price)
  347. this.$set(this.attr.productSelect, 'stock', this.storeInfo.stock)
  348. this.$set(this.attr.productSelect, 'integral', this.storeInfo.integral)
  349. this.$set(this.attr.productSelect, 'unique', this.storeInfo.unique || '')
  350. this.$set(this.attr.productSelect, 'cart_num', 1)
  351. this.$set(this, 'attrValue', '')
  352. this.$set(this, 'attrTxt', '请选择')
  353. }
  354. },
  355. //购物车;
  356. ChangeCartNum: function(changeValue) {
  357. //changeValue:是否 加|减
  358. //获取当前变动属性
  359. let productSelect = this.productValue[this.attrValue]
  360. //如果没有属性,赋值给商品默认库存
  361. if (productSelect === undefined && !this.attr.productAttr.length) {
  362. productSelect = this.attr.productSelect
  363. }
  364. //无属性值即库存为0;不存在加减;
  365. if (productSelect === undefined) return
  366. let stock = productSelect.stock || 0
  367. let num = this.attr.productSelect
  368. if (changeValue) {
  369. num.cart_num++
  370. if (num.cart_num > stock) {
  371. this.$set(this.attr.productSelect, 'cart_num', stock)
  372. this.$set(this, 'cart_num', stock)
  373. } else {
  374. this.$set(this.attr.productSelect, 'cart_num', num.cart_num)
  375. this.$set(this, 'cart_num', num.cart_num)
  376. }
  377. } else {
  378. num.cart_num--
  379. if (num.cart_num < 1) {
  380. this.$set(this.attr.productSelect, 'cart_num', 1)
  381. this.$set(this, 'cart_num', 1)
  382. } else {
  383. this.$set(this.attr.productSelect, 'cart_num', num.cart_num)
  384. this.$set(this, 'cart_num', num.cart_num)
  385. }
  386. }
  387. },
  388. //将父级向子集多次传送的函数合二为一;
  389. changeFun: function(opt) {
  390. if (typeof opt !== 'object') opt = {}
  391. let action = opt.action || ''
  392. let value = opt.value === undefined ? '' : opt.value
  393. this[action] && this[action](value)
  394. },
  395. //打开优惠券插件;
  396. couponTap: function() {
  397. let that = this
  398. that.coupons()
  399. that.coupon.coupon = true
  400. },
  401. changecoupon: function(msg) {
  402. this.coupon.coupon = msg
  403. this.coupons()
  404. },
  405. currentcoupon: function(res) {
  406. let that = this
  407. that.coupon.coupon = false
  408. that.$set(that.coupon.list[res], 'is_use', true)
  409. },
  410. //可领取优惠券接口;
  411. coupons: function() {
  412. let that = this,
  413. q = {
  414. page: 1,
  415. limit: 20,
  416. }
  417. getCoupon(q).then(res => {
  418. that.$set(that, 'couponList', res.data || [])
  419. that.$set(that.coupon, 'list', res.data)
  420. })
  421. },
  422. //打开属性插件;
  423. selecAttrTap: function() {
  424. this.attr.cartAttr = true
  425. this.isOpen = true
  426. },
  427. changeattr: function(msg) {
  428. // 修改了规格
  429. console.log(msg)
  430. this.attr.cartAttr = msg
  431. this.isOpen = false
  432. },
  433. //选择属性;
  434. ChangeAttr: function(res) {
  435. // 修改了规格
  436. let productSelect = this.productValue[res.value]
  437. console.log(productSelect)
  438. if (productSelect) {
  439. this.attr.productAttr[res.indexw].index = res.indexn
  440. this.$set(this.attr.productSelect, 'image', productSelect.image)
  441. this.$set(this.attr.productSelect, 'price', productSelect.price)
  442. this.$set(this.attr.productSelect, 'stock', productSelect.stock)
  443. this.$set(this.attr.productSelect, 'unique', productSelect.unique)
  444. this.$set(this.attr.productSelect, 'integral', productSelect.integral)
  445. this.$set(this.attr.productSelect, 'cart_num', 1)
  446. this.$set(this, 'attrValue', res.value)
  447. this.$set(this, 'attrTxt', '已选择')
  448. } else {
  449. this.$set(this.attr.productSelect, 'image', this.storeInfo.image)
  450. this.$set(this.attr.productSelect, 'price', this.storeInfo.price)
  451. this.$set(this.attr.productSelect, 'integral', this.storeInfo.price)
  452. this.$set(this.attr.productSelect, 'stock', 0)
  453. this.$set(this.attr.productSelect, 'unique', '')
  454. this.$set(this.attr.productSelect, 'cart_num', 0)
  455. this.$set(this, 'attrValue', '')
  456. this.$set(this, 'attrTxt', '请选择')
  457. }
  458. },
  459. //收藏商品
  460. setCollect: function() {
  461. let that = this,
  462. id = that.storeInfo.id,
  463. category = 'collect'
  464. if (that.storeInfo.userCollect) {
  465. getCollectDel(id, category).then(function() {
  466. that.storeInfo.userCollect = !that.storeInfo.userCollect
  467. })
  468. } else {
  469. getCollectAdd(id, category).then(function() {
  470. that.storeInfo.userCollect = !that.storeInfo.userCollect
  471. })
  472. }
  473. },
  474. // 点击加入购物车按钮
  475. joinCart: function() {
  476. //0=加入购物车
  477. this.goCat(0)
  478. },
  479. // 加入购物车;
  480. goCat: function(news) {
  481. let that = this,
  482. productSelect = that.productValue[this.attrValue]
  483. //打开属性
  484. if (that.attrValue) {
  485. //默认选中了属性,但是没有打开过属性弹窗还是自动打开让用户查看默认选中的属性
  486. that.attr.cartAttr = !that.isOpen ? true : false
  487. } else {
  488. if (that.isOpen) that.attr.cartAttr = true
  489. else that.attr.cartAttr = !that.attr.cartAttr
  490. }
  491. //只有关闭属性弹窗时进行加入购物车
  492. if (that.attr.cartAttr === true && that.isOpen === false) return (that.isOpen = true)
  493. //如果有属性,没有选择,提示用户选择
  494. if (that.attr.productAttr.length && productSelect === undefined && that.isOpen === true) {
  495. uni.showToast({
  496. title: '产品库存不足,请选择其它',
  497. icon: 'none',
  498. duration: 2000,
  499. })
  500. return
  501. }
  502. let q = {
  503. productId: that.id,
  504. cartNum: that.attr.productSelect.cart_num,
  505. new: news,
  506. uniqueId: that.attr.productSelect !== undefined ? that.attr.productSelect.unique : '',
  507. }
  508. postCartAdd(q)
  509. .then(function(res) {
  510. console.log(res)
  511. that.isOpen = false
  512. that.attr.cartAttr = false
  513. if (news) {
  514. if (!res.data) {
  515. uni.showToast({
  516. title: res.msg || res.data.msg || res.data.message,
  517. icon: 'none',
  518. duration: 2000,
  519. })
  520. return
  521. }
  522. that.$yrouter.push({
  523. path: '/pages/order/OrderSubmission/index',
  524. query: {
  525. id: res.data.cartId,
  526. isIntegral: that.isIntegral,
  527. },
  528. })
  529. } else {
  530. uni.showToast({
  531. title: '添加购物车成功',
  532. icon: 'success',
  533. duration: 2000,
  534. complete: () => {
  535. that.getCartCount(true)
  536. },
  537. })
  538. }
  539. })
  540. .catch(error => {
  541. console.log(error)
  542. that.isOpen = false
  543. uni.showToast({
  544. title: error.msg || error.response.data.msg || error.response.data.message,
  545. icon: 'none',
  546. duration: 2000,
  547. })
  548. })
  549. },
  550. //获取购物车数量
  551. getCartCount: function(isAnima) {
  552. let that = this
  553. const isLogin = that.isLogin
  554. if (isLogin) {
  555. getCartCount({
  556. numType: 0,
  557. }).then(res => {
  558. that.CartCount = res.data.count
  559. //加入购物车后重置属性
  560. if (isAnima) {
  561. that.animated = true
  562. setTimeout(function() {
  563. that.animated = false
  564. }, 500)
  565. }
  566. })
  567. }
  568. },
  569. //立即购买;
  570. tapBuy: function() {
  571. // 1=直接购买
  572. this.goCat(1)
  573. },
  574. listenerActionSheet: function() {
  575. if (isWeixin() === true) {
  576. this.weixinStatus = true
  577. }
  578. this.posters = true
  579. },
  580. listenerActionClose: function() {
  581. this.posters = false
  582. },
  583. setOpenShare: function() {
  584. var data = this.storeInfo
  585. var href = this.location.href
  586. if (this.$deviceType == 'weixin') {
  587. if (this.isLogin) {
  588. getUserInfo().then(res => {
  589. href = href.indexOf('?') === -1 ? href + '?spread=' + res.data.uid : href + '&spread=' + res.data.uid
  590. var configAppMessage = {
  591. desc: data.storeInfo,
  592. title: data.storeName,
  593. link: href,
  594. imgUrl: data.image,
  595. }
  596. wechatEvevt(['updateAppMessageShareData', 'updateTimelineShareData'], configAppMessage)
  597. .then(res => {})
  598. .catch(res => {
  599. if (res.is_ready) {
  600. res.wx.updateAppMessageShareData(configAppMessage)
  601. res.wx.updateTimelineShareData(configAppMessage)
  602. }
  603. })
  604. })
  605. } else {
  606. var configAppMessage = {
  607. desc: data.storeInfo,
  608. title: data.storeName,
  609. link: href,
  610. imgUrl: data.image,
  611. }
  612. wechatEvevt(['updateAppMessageShareData', 'updateTimelineShareData'], configAppMessage)
  613. .then(res => {})
  614. .catch(res => {
  615. if (res.is_ready) {
  616. res.wx.updateAppMessageShareData(configAppMessage)
  617. res.wx.updateTimelineShareData(configAppMessage)
  618. }
  619. })
  620. }
  621. }
  622. },
  623. },
  624. }
  625. </script>
  626. <style scoped lang="less">
  627. .geoPage {
  628. position: fixed;
  629. width: 100%;
  630. height: 100%;
  631. top: 0;
  632. z-index: 10000;
  633. }
  634. .product-con .store-info {
  635. margin-top: 0.2 * 100rpx;
  636. background-color: #fff;
  637. }
  638. .product-con .store-info .title {
  639. padding: 0 0.3 * 100rpx;
  640. font-size: 0.28 * 100rpx;
  641. color: #282828;
  642. height: 0.8 * 100rpx;
  643. line-height: 0.8 * 100rpx;
  644. border-bottom: 0.01 * 100rpx solid #f5f5f5;
  645. }
  646. .product-con .store-info .info {
  647. padding: 0 0.3 * 100rpx;
  648. height: 1.26 * 100rpx;
  649. }
  650. .product-con .store-info .info .picTxt {
  651. width: 100%;
  652. display: flex;
  653. align-items: center;
  654. }
  655. .product-con .store-info .info .picTxt .pictrue {
  656. width: 0.76 * 100rpx;
  657. height: 0.76 * 100rpx;
  658. margin-right: 0.2 * 100rpx;
  659. }
  660. .product-con .store-info .info .picTxt .pictrue image {
  661. width: 100%;
  662. height: 100%;
  663. border-radius: 0.06 * 100rpx;
  664. }
  665. .product-con .store-info .info .picTxt .text {
  666. flex: 1;
  667. }
  668. .product-con .store-info .info .picTxt .text .name {
  669. font-size: 0.3 * 100rpx;
  670. color: #282828;
  671. }
  672. .product-con .store-info .info .picTxt .text .address {
  673. font-size: 0.24 * 100rpx;
  674. color: #666;
  675. margin-top: 0.03 * 100rpx;
  676. }
  677. .product-con .store-info .info .picTxt .text .address .iconfont {
  678. color: #707070;
  679. font-size: 0.18 * 100rpx;
  680. margin-left: 0.1 * 100rpx;
  681. }
  682. .product-con .store-info .info .picTxt .addressBox {
  683. display: flex;
  684. flex-direction: column;
  685. align-items: flex-end;
  686. }
  687. .product-con .store-info .info .picTxt .addressBox .iconfont {
  688. font-size: 0.4 * 100rpx;
  689. }
  690. .product-con .store-info .info .picTxt .addressBox .addressTxt {
  691. font-size: 0.24 * 100rpx;
  692. color: #eb3729;
  693. }
  694. .product-con .store-info .praise {
  695. font-size: 0.28 * 100rpx;
  696. color: #808080;
  697. }
  698. .product-con .store-info .praise .iconfont {
  699. font-size: 0.28 * 100rpx;
  700. }
  701. .product-con .superior {
  702. background-color: #fff;
  703. margin-top: 0.2 * 100rpx;
  704. }
  705. .product-con .superior .title {
  706. height: 0.98 * 100rpx;
  707. }
  708. .product-con .superior .title image {
  709. width: 0.3 * 100rpx;
  710. height: 0.3 * 100rpx;
  711. }
  712. .product-con .superior .title .titleTxt {
  713. margin: 0 0.2 * 100rpx;
  714. font-size: 0.3 * 100rpx;
  715. background-image: linear-gradient(to right, #f57a37 0%, #f21b07 100%);
  716. background-image: -webkit-linear-gradient(to right, #f57a37 0%, #f21b07 100%);
  717. background-image: -moz-linear-gradient(to right, #f57a37 0%, #f21b07 100%);
  718. -webkit-background-clip: text;
  719. -webkit-text-fill-color: transparent;
  720. }
  721. .product-con .superior .slider-banner {
  722. width: 6.9 * 100rpx;
  723. margin: 0 auto;
  724. padding-bottom: 0.2 * 100rpx;
  725. }
  726. .product-con .superior .slider-banner .list {
  727. width: 100%;
  728. padding-bottom: 0.2 * 100rpx;
  729. }
  730. .product-con .superior .slider-banner .list .item {
  731. width: 2.15 * 100rpx;
  732. margin: 0 0.22 * 100rpx 0.3 * 100rpx 0;
  733. font-size: 0.26 * 100rpx;
  734. }
  735. .product-con .superior .slider-banner .list .item:nth-of-type(3n) {
  736. margin-right: 0;
  737. }
  738. .product-con .superior .slider-banner .list .item .pictrue {
  739. width: 100%;
  740. height: 2.15 * 100rpx;
  741. }
  742. .product-con .superior .slider-banner .list .item .pictrue image {
  743. width: 100%;
  744. height: 100%;
  745. border-radius: 0.06 * 100rpx;
  746. }
  747. .product-con .superior .slider-banner .list .item .name {
  748. color: #282828;
  749. margin-top: 0.12 * 100rpx;
  750. }
  751. .product-con .superior .slider-banner .swiper-pagination-bullet {
  752. background-color: #999;
  753. }
  754. .product-con .superior .slider-banner .swiper-pagination-bullet-active {
  755. background-color: #e93323;
  756. }
  757. .mask {
  758. -webkit-filter: blur(2px);
  759. -moz-filter: blur(2px);
  760. -ms-filter: blur(2px);
  761. filter: blur(2px);
  762. }
  763. .product-con .product-intro .conter view {
  764. width: 100% !important;
  765. }
  766. .generate-posters {
  767. width: 100%;
  768. height: 1.7 * 100rpx;
  769. background-color: #fff;
  770. position: fixed;
  771. left: 0;
  772. bottom: 0;
  773. z-index: 99;
  774. transform: translate3d(0, 100%, 0);
  775. -webkit-transform: translate3d(0, 100%, 0);
  776. -ms-transform: translate3d(0, 100%, 0);
  777. -moz-transform: translate3d(0, 100%, 0);
  778. -o-transform: translate3d(0, 100%, 0);
  779. transition: all 0.3s cubic-bezier(0.25, 0.5, 0.5, 0.9);
  780. -webkit-transition: all 0.3s cubic-bezier(0.25, 0.5, 0.5, 0.9);
  781. -moz-transition: all 0.3s cubic-bezier(0.25, 0.5, 0.5, 0.9);
  782. -o-transition: all 0.3s cubic-bezier(0.25, 0.5, 0.5, 0.9);
  783. }
  784. .generate-posters.on {
  785. transform: translate3d(0, 0, 0);
  786. -webkit-transform: translate3d(0, 0, 0);
  787. -ms-transform: translate3d(0, 0, 0);
  788. -moz-transform: translate3d(0, 0, 0);
  789. -o-transform: translate3d(0, 0, 0);
  790. }
  791. .generate-posters .item {
  792. flex: 50%;
  793. -webkit-flex: 50%;
  794. -ms-flex: 50%;
  795. text-align: center;
  796. }
  797. .generate-posters .item .iconfont {
  798. font-size: 0.8 * 100rpx;
  799. color: #5eae72;
  800. }
  801. .generate-posters .item .iconfont.icon-haibao {
  802. color: #5391f1;
  803. }
  804. .noscroll {
  805. height: 100%;
  806. overflow: hidden;
  807. }
  808. .product-con .footer {
  809. .in-bnt {
  810. width: auto;
  811. flex: 1;
  812. margin-left: 30rpx;
  813. & > view {
  814. width: 100%;
  815. border-radius: 50rpx;
  816. }
  817. }
  818. }
  819. </style>