detail.html 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. {extend name="public/container"}{block name="head_top"}
  2. <link rel="stylesheet" href="{__PLUG_PATH}swiper/swiper-3.4.1.min.css">
  3. <script type="text/javascript" src="{__PLUG_PATH}swiper/swiper-3.4.1.jquery.min.js"></script>
  4. <script type="text/javascript"
  5. src="{__WAP_PATH}crmeb/js/car-model.js"></script>{/block}{block name="title"}{$storeInfo.store_name}{/block}{block name="content"}
  6. <div id="store_detail" class="wrapper product-con">
  7. <section>
  8. <div class="banner">
  9. <ul class="swiper-wrapper"> {volist name="storeInfo.slider_image" id="vo"}
  10. <li class="swiper-slide"><img src="{$vo}"/></li>
  11. {/volist}
  12. </ul>
  13. </div>
  14. <div class="product-info">
  15. <div class="title">{$storeInfo.store_name}</div>
  16. <div class="price">¥{$storeInfo.price|floatval}</div>
  17. <div class="oldprice">原价:¥{$storeInfo.ot_price|floatval}</div>
  18. <div class="info-amount flex"><span class="current">商品编号:{$storeInfo.id}</span> <span class="">库存:{$storeInfo.stock}{$storeInfo.unit_name}</span>
  19. <span class="fr">销量:{$storeInfo.ficti+$storeInfo.sales}{$storeInfo.unit_name}</span></div>
  20. {gt name="storeInfo['give_integral']" value="0"}
  21. <div class="integral">积分:{$storeInfo.give_integral|floatval} <span>赠送</span></div>
  22. {/gt}
  23. </div>
  24. <div class="pro-attributes" @click="cardUp" v-show="productAttr && productAttr.length > 0" v-cloak="">选择
  25. {{productAttrCate}}
  26. </div>
  27. <div class="like-it" v-cloak=""><i class="zan-btn iconfont icon-thumbsup" :class="{'icon-thumbsup110':product.userLike == true}" @click="like"></i> 点赞
  28. <span v-text="product.like_num"></span>次
  29. </div>
  30. {notempty name="reply"}
  31. <div class="item-box">
  32. <div class="item-tit"><i class="line"></i><i class="iconfont icon-pinglun1"></i><span>评价</span><i
  33. class="line"></i></div>
  34. <div class="assess-hot"><p class="title">宝贝评价({$replyCount})</p>
  35. <div class="assess-hot-con">
  36. <div class="user-info flex">
  37. <div class="avatar"><img src="{$reply.avatar}"/></div>
  38. <div class="name">{$reply.nickname}</div>
  39. <div class="star{$reply.star} all"><span class="num"></span></div>
  40. </div>
  41. <div class="txt-info">{$reply.comment}</div>
  42. <div class="pro-parameter"><span>{$reply.add_time}</span> <span>{$reply.suk}</span></div>
  43. {gt name="replyCount" value="1"}
  44. <a class="more" href="{:url('reply_list',['productId'=>$storeInfo['id']])}">查看全部评价</a>
  45. {/gt}
  46. </div>
  47. </div>
  48. </div>
  49. {/notempty}
  50. <div class="item-box">
  51. <div class="item-tit"><i class="line"></i><i class="iconfont icon-icon-tupian"></i><span>详情</span><i class="line"></i></div>
  52. <div class="con-box" ref="store_desc"></div>
  53. </div>
  54. <div class="footer-bar flex">
  55. <a href="{:Url('Service/service_list',array('mer_id'=>$mer_id))}"> <span class="iconfont icon-kefu"></span><p>客服</p></a>
  56. <a class="collect-btn iconfont icon-xing1" :class="{'icon-xing2':product.userCollect == true}" @click="collect" href="javascript:void(0)"><p>收藏</p></a>
  57. <a href="{:Url('store/cart')}"> <span class="iconfont icon-icon-shoppingcart-02"></span> <p>购物车</p> <span class="cart_num" v-show="cartNum > 0" v-cloak="" v-text="cartNum"></span> </a>
  58. <div class="big-btn buy-car" @click="cardUp">加入购物车</div>
  59. <div class="big-btn confirm" @click="cardUp">立即购买</div>
  60. </div>
  61. </section>
  62. {notempty name="similarity"}
  63. <section class="template-piclist">
  64. <div class="template-prolist">
  65. <div class="title-like flex"><span class="title-line left"></span> <span class="icon"></span> <span>新品推荐</span> <span class="title-line right"></span></div>
  66. </div>
  67. <ul class="flex"> {volist name="similarity" id="store"}
  68. <li><a href="{:url('store/detail',array('id'=>$store['id']))}">
  69. <div class="picture"><img src="{$store.image}"/></div>
  70. <div class="pro-info"><p class="title">{$store.store_name}</p>
  71. <!--<p class="conut">已售{$store.sales}</p>-->
  72. <p class="conut">已售{$store.ficti}</p>
  73. <p class="price">¥{$store.price|floatval}</p></div>
  74. <div class="buy-car-btn"><i class="iconfont icon-gouwuche"></i></div>
  75. </a></li>
  76. {/volist}
  77. </ul>
  78. </section>
  79. {/notempty}
  80. <shop-card ref="shopCard" :show="cardShow" :product="productCardInfo" :attr-list="productAttr"
  81. :on-change="changeAttr" :on-close="cardClose" :on-cart="goCart" :on-buy="goBuy"></shop-card>
  82. <script ref="store_desc_temp" type="text/template">{$storeInfo.description}</script>
  83. <div style="height:1rem;"></div>
  84. </div>
  85. <script>
  86. window.$urlShare = "{$urlShare}";
  87. window.$product = <?php unset($storeInfo['description']); echo json_encode($storeInfo);?>;
  88. window.$productAttr = <?php echo json_encode($productAttr) ?: '[]'; ?>;
  89. window.$productValue = <?php echo json_encode($productValue) ?: '{}'; ?>;</script>
  90. <script type="text/javascript">
  91. requirejs(['vue', 'axios', 'helper', 'store', '{__WAP_PATH}crmeb/module/store/shop-card.js'], function (Vue, axios, $h, storeApi, shopCard) {
  92. new Vue({
  93. el: "#store_detail",
  94. components: {'shop-card': shopCard},
  95. data: {
  96. cardShow: false,
  97. product: $product,
  98. productAttr: $productAttr || [],
  99. productValue: $productValue || {},
  100. productCardInfo: {},
  101. status: {like: false, collect: false},
  102. cartNum: 0
  103. },
  104. computed: {
  105. productAttrCate: function () {
  106. return this.productAttr.map(function (attr) {
  107. return attr.attr_name;
  108. }).join(',');
  109. }
  110. },
  111. methods: {
  112. cardClose: function () {
  113. this.cardShow = false;
  114. }, cardUp: function () {
  115. this.cardShow = true;
  116. }, goCart: function (values, cartNum) {
  117. var checkedAttr = this.productValue[values.sort().join(',')], that = this;
  118. // console.log(values);
  119. // console.log(checkedAttr);
  120. storeApi.setCart({
  121. cartNum: cartNum,
  122. uniqueId: checkedAttr === undefined ? 0 : checkedAttr.unique,
  123. productId: this.product.id
  124. }, function () {
  125. that.getCartNum();
  126. $h.pushMsg('加入购物车成功!');
  127. });
  128. that.cardClose();
  129. }, goBuy: function (values, cartNum) {
  130. var checkedAttr = this.productValue[values.sort().join(',')];
  131. storeApi.goBuy({
  132. cartNum: cartNum,
  133. uniqueId: checkedAttr === undefined ? 0 : checkedAttr.unique,
  134. productId: this.product.id
  135. }, function (cartId) {
  136. location.href = $h.U({c: 'store', a: 'confirm_order', p: {cartId: cartId}});
  137. });
  138. this.cardClose();
  139. }, changeAttr: function (values) {
  140. console.log(values);
  141. //console.log(values.sort());
  142. //console.log(values.sort().join(','));
  143. var checkedAttr = this.productValue[values.sort().join(',')];
  144. //console.log(values);console.log(checkedAttr);
  145. if (!checkedAttr) {
  146. this.setProductCardInfo({stock: 0});
  147. } else {
  148. this.setProductCardInfo({
  149. stock: checkedAttr.stock,
  150. price: checkedAttr.price,
  151. image: checkedAttr.image
  152. });
  153. }
  154. }, setProductCardInfo: function (info) {
  155. info || (info = {});
  156. this.$set(this, 'productCardInfo', {
  157. image: info.image !== undefined ? info.image : this.product.image,
  158. price: info.price !== undefined ? info.price : this.product.price,
  159. stock: info.stock !== undefined ? info.stock : this.product.stock
  160. });
  161. }, like: function () {
  162. var that = this;
  163. if (that.status.like) return false;
  164. that.status.like = true;
  165. if (this.product.userLike) {
  166. storeApi.unlikeProduct(this.product.id, 'product', function () {
  167. setTimeout(function () {
  168. that.product.like_num -= 1;
  169. that.product.userLike = false;
  170. that.status.like = false;
  171. }, 300);
  172. }, function (err) {
  173. that.status.like = false;
  174. });
  175. } else {
  176. storeApi.likeProduct(this.product.id, 'product', function () {
  177. setTimeout(function () {
  178. that.product.like_num += 1;
  179. that.product.userLike = true;
  180. that.status.like = false;
  181. }, 300);
  182. }, function (err) {
  183. that.status.like = false;
  184. });
  185. }
  186. }, collect: function () {
  187. var that = this;
  188. if (that.status.collect) return false;
  189. that.status.collect = true;
  190. if (this.product.userCollect) {
  191. storeApi.unCollectProduct(this.product.id, 'product', function () {
  192. setTimeout(function () {
  193. that.product.userCollect = false;
  194. that.status.collect = false;
  195. }, 300);
  196. }, function (err) {
  197. that.status.collect = false;
  198. });
  199. } else {
  200. storeApi.collectProduct(this.product.id, 'product', function () {
  201. setTimeout(function () {
  202. that.product.userCollect = true;
  203. that.status.collect = false;
  204. }, 300);
  205. }, function (err) {
  206. that.status.collect = false;
  207. });
  208. }
  209. }, pushMsg: function (msg, fn) {
  210. $h.pushMsg(msg, fn)
  211. }, init: function () {
  212. new Swiper('.banner', {
  213. paginationClickable: false,
  214. autoplay: 3000,
  215. loop: false,
  216. speed: 1000,
  217. autoplayDisableOnInteraction: false,
  218. pagination: '.swiper-pagination',
  219. });
  220. }, getCartNum: function () {
  221. var that = this;
  222. storeApi.getCartNum(function (cartNum) {
  223. that.cartNum = cartNum;
  224. });
  225. }
  226. },
  227. mounted: function () {
  228. var wxApi = mapleWx($jssdk(), function () {
  229. this.onMenuShareAll({
  230. title: $product.store_name,
  231. desc: $product.store_info || $product.store_name,
  232. // imgUrl: location.origin + $product.image,
  233. imgUrl: $product.image,
  234. link: $urlShare || "{:url('store/detail',array('id'=>$storeInfo['id'],'spuid'=>$userInfo['uid']))}"
  235. });
  236. });
  237. this.$nextTick(function () {
  238. this.$refs.store_desc.innerHTML = this.$refs.store_desc_temp.innerHTML;
  239. });
  240. this.getCartNum();
  241. this.init();
  242. this.setProductCardInfo();
  243. }
  244. });
  245. });</script>{/block}