lindaobin 4 lat temu
rodzic
commit
3f669f3845
100 zmienionych plików z 3979 dodań i 105 usunięć
  1. 1 1
      components/basic-component/app-rich/components/wxParseImg.vue
  2. 11 0
      components/page-component/app-attr/app-attr.vue
  3. 22 0
      components/page-component/app-goods-list/app-goods-list.vue
  4. 1 1
      components/page-component/app-my-order/app-my-order.vue
  5. 13 0
      components/page-component/app-order-goods-info/app-order-goods-info.vue
  6. 2 0
      components/page-component/app-product-list/app-product-list.vue
  7. 47 13
      components/page-component/goods/app-goods-banner.vue
  8. 210 4
      components/page-component/goods/bd-detail.vue
  9. 77 4
      components/page-component/goods/bd-info.vue
  10. 169 33
      components/page-component/goods/u-attr.vue
  11. 289 0
      components/page-component/goods/u-open-pic.vue
  12. 19 4
      components/u-charts/component.vue
  13. 14 1
      core/apiUrl.js
  14. 1 1
      manifest.json
  15. 81 9
      pages.json
  16. 8 3
      pages/cart/components/app-shop-product/app-shop-product.vue
  17. 867 0
      pages/goods/contrast.vue
  18. 86 13
      pages/goods/goods.vue
  19. 3 1
      pages/goods/list.vue
  20. 149 0
      pages/goods/priceMove.vue
  21. 24 7
      pages/order-submit/app-submit-goods.vue
  22. 31 3
      pages/order-submit/order-submit.vue
  23. 1 1
      pages/order/index/index.vue
  24. 14 1
      pages/order/order-detail/order-detail.vue
  25. 196 0
      pages/priceTell/priceTell.vue
  26. 374 0
      pages/sp/clerk/clerk.vue
  27. 290 0
      pages/sp/components/app-card-detail.vue
  28. 272 0
      pages/sp/components/app-card-give.vue
  29. 50 0
      pages/sp/details/details-no-share.vue
  30. 66 0
      pages/sp/details/details.vue
  31. 82 0
      pages/sp/give/give.vue
  32. BIN
      pages/sp/image/icon-card-qrcode.png
  33. 388 0
      pages/sp/index/index.vue
  34. 33 0
      pages/test/test.vue
  35. 29 1
      pages/user-center/user-center.vue
  36. 22 0
      plugins/advance/components/detail-bottom-button.vue
  37. 1 1
      plugins/advance/components/detail-price-share.vue
  38. 1 1
      plugins/advance/detail/detail.vue
  39. 22 0
      plugins/bargain/activity/activity.vue
  40. 11 0
      plugins/miaosha/goods/goods.vue
  41. 2 2
      siteinfo.js
  42. BIN
      static/image/icon/icon-contrast.png
  43. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/common/main.js.map
  44. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/common/runtime.js.map
  45. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/common/vendor.js.map
  46. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/app-button/app-button.js.map
  47. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/app-cart-image/app-cart-image.js.map
  48. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/app-check-box/app-check-box.js.map
  49. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/app-close/app-close.js.map
  50. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/app-composition/app-composition.js.map
  51. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/app-css-icon/app-css-icon.js.map
  52. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/app-datetime-picker/app-datetime-picker.js.map
  53. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/app-empty-bottom/app-empty-bottom.js.map
  54. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/app-empty/app-empty.js.map
  55. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/app-form-id/app-form-id.js.map
  56. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/app-hotspot/app-hotspot.js.map
  57. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/app-image/app-image.js.map
  58. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/app-input/app-input.js.map
  59. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/app-iphone-x/app-iphone-x.js.map
  60. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/app-jump-button/app-jump-button.js.map
  61. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/app-layout/app-coupon-modal/app-coupon-modal.js.map
  62. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/app-layout/app-layout.js.map
  63. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/app-layout/app-payment/app-payment.js.map
  64. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/app-layout/app-permissions-auth/app-permissions-auth.js.map
  65. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/app-layout/app-user-login/app-user-login.js.map
  66. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/app-layout/u-authorized-iphone/u-authorized-iphone.js.map
  67. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/app-load-text/app-load-text.js.map
  68. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/app-loading/app-loading.js.map
  69. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/app-model/app-model.js.map
  70. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/app-order/app-form-data.js.map
  71. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/app-prompt-box/app-prompt-box.js.map
  72. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/app-radio/app-radio-group.js.map
  73. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/app-radio/app-radio.js.map
  74. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/app-report-error/app-report-error.js.map
  75. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/app-rich/components/wxParseAudio.js.map
  76. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/app-rich/components/wxParseImg.js.map
  77. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/app-rich/components/wxParseTable.js.map
  78. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/app-rich/components/wxParseTemplate0.js.map
  79. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/app-rich/components/wxParseTemplate1.js.map
  80. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/app-rich/components/wxParseVideo.js.map
  81. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/app-rich/parse.js.map
  82. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/app-tab-bar/app-tab-bar.js.map
  83. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/app-tab-nav/app-tab-nav.js.map
  84. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/app-textarea/app-textarea.js.map
  85. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/app-timer/app-timer.js.map
  86. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/app-upload-image/app-upload-image.js.map
  87. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/u-count-to/u-count-to.js.map
  88. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/u-mask/u-mask.js.map
  89. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/u-popup/u-popup.js.map
  90. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/uni-swiper-dot/uni-swiper-dot.js.map
  91. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/components/page-component/app-account-balance/app-account-balance.js.map
  92. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/components/page-component/app-account-balance/app-account-style.js.map
  93. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/components/page-component/app-ad/app-ad.js.map
  94. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/components/page-component/app-area-picker/app-area-picker.js.map
  95. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/components/page-component/app-associated-link/app-associated-link.js.map
  96. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/components/page-component/app-attr/app-attr.js.map
  97. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/components/page-component/app-buy-prompt/app-buy-prompt.js.map
  98. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/components/page-component/app-cash-model/app-cash-model.js.map
  99. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/components/page-component/app-category-list/app-category-list.js.map
  100. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/components/page-component/app-check-in/app-check-in.js.map

+ 1 - 1
components/basic-component/app-rich/components/wxParseImg.vue

xqd
@@ -30,7 +30,7 @@
 		computed: {
 			newStyleStr: function() {
 				console.log(this.parentNode)
-				if (this.parentNode.styleStr && this.parentNode.styleStr.indexOf('text-align: center') > -1) {
+				if (this.parentNode && this.parentNode.styleStr && this.parentNode.styleStr.indexOf('text-align: center') > -1) {
 					this.style += 'margin: 0 auto';
 				}
 				return this.style;

+ 11 - 0
components/page-component/app-attr/app-attr.vue

xqd
@@ -667,6 +667,17 @@
 				}
             },
             buy() {
+				if (this.$user.isLogin() && this.$store.state.user.info) {
+				    let  member_level =this.$store.state.user.info.identity.member_level;
+					if(member_level<this.goods.member_level){
+						uni.showToast({
+						    title: '您的会员等级未达到'+this.goods.member_name+',继续加油哟。。。',
+						    icon: 'none'
+						});
+						return;
+					}
+					
+				}
                 if (!this.submit()) return false;
                 if (this.noPay) {
                     this.$emit('pay', this.number);

+ 22 - 0
components/page-component/app-goods-list/app-goods-list.vue

xqd xqd
@@ -284,6 +284,17 @@
                 this.request_pt(id);
             },
             multiplayer() {
+				if (this.$user.isLogin() && this.$store.state.user.info) {
+				    let  member_level =this.$store.state.user.info.identity.member_level;
+					if(member_level<this.detail.member_level){
+						uni.showToast({
+						    title: '您的会员等级未达到'+this.detail.member_name+',继续加油哟。。。',
+						    icon: 'none'
+						});
+						return;
+					}
+					
+				}
                 let that = this;
                 if (that.pt) {
                     if (that.selectAttr && Object.keys(that.selectAttr).length === 0) {
@@ -444,6 +455,17 @@
                 })
             },
             individual() {
+				if (this.$user.isLogin() && this.$store.state.user.info) {
+				    let  member_level =this.$store.state.user.info.identity.member_level;
+					if(member_level<this.detail.member_level){
+						uni.showToast({
+						    title: '您的会员等级未达到'+this.detail.member_name+',继续加油哟。。。',
+						    icon: 'none'
+						});
+						return;
+					}
+					
+				}
                 let that = this;
                 if (that.pt) {
                     that.pt = false;

+ 1 - 1
components/page-component/app-my-order/app-my-order.vue

xqd
@@ -61,7 +61,7 @@
             theme: String
         },
         methods: {
-            goUrl(url, openType = 'navigate') {
+            goUrl(url, openType = 'navigate') { 
                 switch (openType) {
                     case 'navigate':
                         uni.navigateTo({

+ 13 - 0
components/page-component/app-order-goods-info/app-order-goods-info.vue

xqd xqd
@@ -17,6 +17,15 @@
                         <view class='main-right price'>¥{{pluginData.price_list ? pluginData.price_list[pluginIndex].value : goods.total_price}}</view>
                     </view>
                 </view>
+				<view class="screen" v-if="JSON.stringify(service_data)!='{}'&&JSON.stringify(service_data)!='[]'" style="display:flex;justify-content: space-between;margin-top:4px;">
+					<view class="screen_left" style="font-size: 24rpx;color: #999999;">×1
+						<text class="goods-price-unit" style="padding-left:10px;">{{service_data.name}}{{service_data.year}}年{{service_data.price}}元</text>  
+					</view>
+					<view class="screen_right">
+						<text class="goods-price-unit">¥</text> 
+						{{service_data.price}}111
+					</view>
+				</view>  
                 <view class="composition-price" v-if="plugin == 'composition'">
                     搭配套餐价<text>¥{{goods.total_price}}</text>
                 </view>
@@ -31,6 +40,10 @@ export default {
         return {}
     },
     props: {
+		service_data:{
+			type:Object,
+			default:{}
+		},
         goods: {
             type: Object,
             default: {}

+ 2 - 0
components/page-component/app-product-list/app-product-list.vue

xqd
@@ -176,6 +176,8 @@
 
         methods: {
             routeGo(data) {
+				console.log(180)
+				console.log(data)
                 this.$emit('routeGo', data);
             },
             specification(goods) {

+ 47 - 13
components/page-component/goods/app-goods-banner.vue

xqd xqd xqd xqd xqd xqd
@@ -17,20 +17,40 @@
             indicator-active-color="#30353c"
         >
             <!-- #ifndef MP-BAIDU -->
-                <swiper-item v-if="videoUrl && getVideo == 1 && sign !== 'lottery' && sign !== 'bargain' && sign !== 'community' && sign !== 'wholesale'">
-                    <view class="swiper-img" @click="routeJumpT" v-bind:style="{backgroundImage: 'url(' + picList[0].pic_url + ')'}">
+               <swiper-item v-for="(item, index) in videoUrl" v-bind:key="index" v-if="type == 'video' && videoUrl && getVideo == 1 && sign !== 'lottery' && sign !== 'bargain' && sign !== 'community' && sign !== 'wholesale'">
+                  <!--  <view class="swiper-img" @click="routeJumpT" v-bind:style="{backgroundImage: 'url(' + picList[0].pic_url + ')'}">
                         <image class="video-play" src="/static/image/video-play.png"></image>
-                    </view>
+                    </view> -->
+				<!-- 	<app-video
+					    v-if="type == 'video'"
+					    height="750rpx"
+					    v-bind:pic-url="item.video_url"
+					    v-bind:url="item.video_url"
+					    v-on:video-start="videoStart"
+						v-bind:play="true"
+						v-bind:video_id="item.id"
+					    v-on:tap.native.stop="preventD"
+					></app-video> -->
+				<video-new
+						v-if="cur_index==index"
+						class="video"
+						:video_id="item.id"
+						:video_url="item.video_url"
+						height="720rpx"
+						:play="true"
+						:cur_index="cur_index"
+						
+				></video-new>
                 </swiper-item>
             <!-- #endif-->
 
-            <swiper-item v-for="(item, index) in picList" v-bind:key="index">
+            <swiper-item v-for="(item, index) in picList" v-bind:key="index" v-if="type=='picture'">
                 <view class="swiper-img" v-bind:style="{backgroundImage: 'url(' + item.pic_url + ')'}"
                       @click="clickImage(index)">
-
+					
                     <!-- #ifndef MP-BAIDU -->
                     <app-video
-                        v-if="index === 0 && videoUrl && getVideo == 0"
+                        v-if="type == 'video' && index === 0 && videoUrl && getVideo == 0"
                         height="750rpx"
                         v-bind:pic-url="item.pic_url"
                         v-bind:url="videoUrl"
@@ -38,7 +58,7 @@
                         v-on:tap.native.stop="preventD"
                     ></app-video>
                     <app-video
-                        v-if="index === 0 && videoUrl && getVideo == 1 && (sign === 'lottery' || sign === 'bargain' || sign === 'community' || sign === 'wholesale')"
+                        v-if="type == 'video' && index === 0 && videoUrl && getVideo == 1 && (sign === 'lottery' || sign === 'bargain' || sign === 'community' || sign === 'wholesale')"
                         height="750rpx"
                         v-bind:pic-url="item.pic_url"
                         v-bind:url="videoUrl"
@@ -49,7 +69,7 @@
 
                     <!-- #ifdef MP-BAIDU-->
                     <app-video
-                        v-if="index === 0 && videoUrl"
+                        v-if="type == 'video' && index === 0 && videoUrl"
                         height="750rpx"
                         v-bind:pic-url="item.pic_url"
                         v-bind:url="videoUrl"
@@ -82,13 +102,22 @@
 <script>
 
     import appVideo from "../../page-component/app-video/app-video.vue";
-    import { mapState, mapGetters } from 'vuex';
+    import videoNew from '../../page-component/goods/app-goods-video.vue';
+   
+	import { mapState, mapGetters } from 'vuex';
 
     export default {
         components: {
-            'app-video': appVideo
+            'app-video': appVideo,
+			videoNew
         },
         props: {
+			type:{
+				type: String,
+				default() {
+				    return 'picture'
+				}
+			},
             picList: {
                 type: Array,
                 default() {
@@ -105,7 +134,10 @@
                 }
             },
             videoUrl: {
-                type: String
+                type: Array,
+                default() {
+                    return []
+                }
             },
             goods_id: {
                 type: Number
@@ -116,12 +148,14 @@
         },
         data() {
             return {
-                autoplay: true
+                autoplay: true,
+				cur_index:0
             };
         },
         methods: {
-            bannerChange() {
+            bannerChange(e) {
                 this.$event.trigger(this.$const.EVENT_VIDEO_END);
+				this.cur_index=e.detail.current
             },
             videoStart(videoStatus) {
                 videoStatus ? this.autoplay = false : this.autoplay = true;

+ 210 - 4
components/page-component/goods/bd-detail.vue

xqd xqd xqd xqd
@@ -1,10 +1,28 @@
 <template>
     <view class="bd-detail">
         <view class="detail" v-if="newDetail">
-            <image src="/static/image/icon/goods-detail.png"></image>
-            <app-rich-text
+            <!-- <image src="/static/image/icon/goods-detail.png"></image> -->
+			<view class="detail-title">
+				<view class="detail-text" :class="{'active':tab==1}" @click="tab=1">图文详情</view>
+				<view class="detail-text" :class="{'active':tab==2}" @click="tab=2">详细参数</view>
+				<view class="detail-text" :class="{'active':tab==3}" @click="tab=3">售后保障</view>
+			</view>
+            <app-rich-text v-if="tab==1"
                 :content="newDetail"
             ></app-rich-text>
+			<view class="contrast" v-if="tab==2">
+				<view class="list" v-for="(item,index) of contrastList.list" :key="index" v-if="contrastList.list">
+					<view class="contrast_title" v-if="item.length>0">{{item[0].title}}</view>  
+					<view class="contrast_item" v-for="(value,key) of item" :key="key">
+						<view class="contrast_key" :class="'contrast_key'+(ind+1)" v-for="(ite,ind) of value.text" :key="ind">
+							{{ite}}
+						</view> 
+					</view>
+				</view> 
+			</view> 
+			<app-rich-text v-if="tab==3"
+			    :content="newAfterDetail"
+			></app-rich-text>
         </view>
     </view>
 </template>
@@ -18,18 +36,110 @@ export default {
     components: {
         'app-rich-text': appRichText,
     },
-
+	data(){
+		return{
+			tab:1,
+			contrastList:null
+		}
+	},
     props: {
+		goodsId:{
+			default:null
+		},
         detail: {
             type: String,
             default() {
                 return '';
             }
         },
+		after_detail: {
+            type: String,
+            default() {
+                return '';
+            }
+        }
     },
+	watch:{
+		goodsId:{
+			handler(newName, oldName) {
+				this.$request({
+				    url: this.$api.poster.goods_contrast,
+				    data: {
+				        goods_id: this.goodsId
+				    }
+				}).then(response => {
+					if(response.code == 0){
+						this.formatData(response.data)
+					}
+				})
+			}, 
+			immediate: true
+		}
+	},
     created() {
         this.$store.dispatch('gConfig/setImageWidth', 48);
-    },
+    }, 
+	methods:{
+		getParams(){ 
+			this.$request({
+			    url: this.$api.poster.goods_contrast,
+			    data: {
+			        goods_id: params
+			    }
+			}).then(response => {
+				if(response.code == 0){ 
+					this.formatData(response.data)
+				}
+			})
+		},
+		formatData(data){
+			let _this = this
+			let list = []
+			let info = []
+			console.log(data)
+			//商品信息
+			data.forEach((items,indexs)=>{
+				let obj = {}
+				obj.guarantee_pic = items.goods.guarantee_pic
+				obj.id = items.goods.id
+				obj.name = items.goods.name
+				obj.price = items.goods.price
+				info.push(obj)
+			})
+			console.log(288)
+			console.log(info)
+			//参数信息
+			data.forEach((items,indexs)=>{
+				if(indexs==0){ 
+					data[indexs].params.forEach((item,index)=>{
+						let line = []
+						data[indexs].params[index].params.forEach((ite,inde)=>{ 
+							let text = [] 
+							let title = ''
+							text.push(data[indexs].params[index].params[inde].name)  
+							text.push(data[indexs].params[index].params[inde].value)
+							data.forEach((it,i)=>{
+								if(i!=0){
+									text.push(data[i].params[index].params[inde].value)
+								}
+							})
+							title = data[indexs].params[index].name  
+							line.push({
+								title:title,
+								text:text
+							}) 
+						})
+						list.push(line)
+					}) 
+				} 
+			}) 
+			this.contrastList = {}
+			this.contrastList.list = list
+			this.contrastList.info = info 
+			console.log(128)
+			console.log(this.contrastList)
+		},
+	},
     computed: {
         newDetail() {
             let detail = '正在加载数据,模拟网络延迟2秒😝';
@@ -38,6 +148,13 @@ export default {
             }
             return detail;
         },
+		newAfterDetail() {
+		    let after_detail = '正在加载数据,模拟网络延迟2秒😝';
+		    if (this.after_detail) {
+		        after_detail = this.after_detail;
+		    }
+		    return after_detail;
+		},
     }
 }
 </script>
@@ -55,5 +172,94 @@ export default {
         height: #{80rpx};
         display: block;
     }
+	.detail-title{ 
+		display:flex; 
+		padding-bottom:8px;
+		.detail-text{
+			justify-content: space-between;
+			width:50%;
+			text-align: center;
+			line-height:31px;
+			display: block; 
+			text-align: center;
+			font-size:14px;
+		}
+		.active{
+			color:rgb(242,28,28);
+		}
+	}
+}
+.list{  
+	background:#fff;border:0.5px solid #f7f7f7; 
+	.contrast_title {
+		line-height:38px;height:40px;box-sizing:border-box;text-align:center;padding:0 8px;font-weight:600;
+		font-size:12px;color:#2d2d32;border:0.5px solid #f7f7f7;
+	}
+	.contrast_item {
+		display:flex; 
+		.contrast_key{
+			font-size:12px;
+			width:80px;
+			height:auto;
+			box-sizing:border-box;
+			text-align:center;
+			padding:10px 8px;
+			line-height:20px;
+			min-height:40px;
+			border:0.5px solid #f7f7f7;  
+			display:flex;
+			text-align:center;
+			align-items: center; 
+			overflow:hidden;
+			flex-wrap: wrap; 
+			.pic{
+				width:100%;height:100px;
+				text-align:center;
+				float:left;
+				image{
+					width:100px;
+					height:100px;
+				}
+			}
+			
+			.name{
+				margin-top:10px;
+				width:100%;
+				float:left; 
+				font-size:12px;
+				line-height: 14px;
+				max-height: 28px;
+				height:28px;
+				overflow: hidden;
+			}
+			.price{
+				width:100%;
+				float:left;
+				color:#f21c1c;
+				font-size:12px;
+			}
+			.buy{
+				display: block;
+				width: 90px;
+				height: 30px;
+				text-align: center;
+				line-height: 30px;
+				border-radius: 3px;
+				margin: 5px auto 8px;
+				color:#fff;
+				background:#f21c1c;
+			}
+			.cancel{
+				width:100%;
+				float:left;
+				color: #3caaff;
+			}
+			.unable{
+				color:#aaa;
+			}
+		}   
+		.contrast_key2,.contrast_key3,.contrast_key4,.contrast_key5{justify-content: space-around;width:calc(100% - 80px);text-align:center;} 
+		
+	} 
 }
 </style>

+ 77 - 4
components/page-component/goods/bd-info.vue

xqd xqd xqd xqd xqd xqd
@@ -1,7 +1,5 @@
 <template>
     <view class="bd-info">
-        <text class="bd-name u-line-2">{{name}}</text>
-        <text class="bd-subtitle u-line-3" v-if="subtitle">{{subtitle}}</text>
         <view class="dir-left-nowrap bd-price-share">
             <view class="box-grow-1" :class="isNegotiable === 1 ? 'cross-center' : ''">
                 <template v-if="isNegotiable !== 1">
@@ -43,7 +41,12 @@
                     <text :class="[theme.color, 'bd-negotiable']">价格面议</text>
                 </template>
             </view>
-
+			<!-- <template v-if="isShowShare">
+                <view class="box-grow-0 bd-share dir-top-nowrap" @click="contrastClick" style="margin-right:8px;">
+                    <image class="bd-icon" src="../../../static/image/icon/icon-contrast.png"></image>
+                    <text class="bd-text">对比</text>
+                </view>
+            </template> -->
             <template v-if="isShowShare">
                 <view class="box-grow-0 bd-share dir-top-nowrap" @click="shareClick">
                     <image class="bd-icon" src="../../../static/image/icon/icon-share.png"></image>
@@ -74,11 +77,31 @@
                 ></app-share-qr-code>
             </template>
         </view>
-        <slot></slot>
+        <text class="bd-name u-line-2">{{name}}</text>
+        <text class="bd-subtitle u-line-3" v-if="subtitle">{{subtitle}}</text>
+		<slot></slot>
         <app-vip-card v-if="isVip" background="#fff" top="20rpx"></app-vip-card>
         <view class="bd-margin" v-if="flashSale">
             <bd-flash-sale :flash-sale="flashSale" :theme="theme"></bd-flash-sale>
         </view>
+		<view class="bd-margin main-between box-grow-1" style="font-size: 28upx;" >
+		    <view class="box-grow-0 bd-share" @click="gotoPriceMove">
+		        <image class="nbd-icon" src="../../../static/image/icon/icon-share.png"></image>
+		        <text class="">价格走势</text>
+		    </view>
+			<view class="box-grow-0 bd-share" @click="gotoPriceTell">
+			    <image class="nbd-icon" src="../../../static/image/icon/icon-share.png"></image>
+			    <text class="">降价通知</text>
+			</view>
+			<view class="box-grow-0 bd-share" @click="contrastClick">
+			    <image class="nbd-icon" src="../../../static/image/icon/icon-contrast.png"></image>
+			    <text class="">商品对比</text>
+			</view>
+			<view class="box-grow-0 bd-share" @click="gotoOpenPic">
+			    <image class="nbd-icon" src="../../../static/image/icon/icon-share.png"></image>
+			    <text class="">开箱展示</text>
+			</view>
+		</view>
         <view class="bd-margin" v-if="levelShow === 2 && isNegotiable === 0">
             <bd-join-member
                 :member-max-price="`${priceMemberMax}`"
@@ -154,6 +177,9 @@
             appSharePic: String,
             appShareTitle: String,
             goods: Object,
+			signid:String,
+			attrid:String,
+			checkprice:String,
             isVip: Boolean
         },
         data() {
@@ -188,9 +214,51 @@
             }
         },
         methods: {
+			gotoOpenPic(){
+				this.$emit('gotoOpenPic');
+			},
+			gotoPriceMove(){
+				if(!this.signid||this.signid=='')
+				{
+					uni.showToast({
+						title:"请先选择规格",
+						 icon:"none"
+					})
+					return;
+				}	
+				let title=this.name+this.subtitle;
+				uni.navigateTo({
+					url:`/pages/goods/priceMove?id=${this.goodsId}&&signid=${this.signid}&&title=${title}`
+				})
+			},
+			gotoPriceTell(){
+				if(!this.attrid||this.attrid=='')
+				{
+					uni.showToast({
+						title:"请先选择规格",
+						 icon:"none"
+					})
+					return;
+				}	
+				let title=this.name+this.subtitle;
+				uni.navigateTo({
+					url:`/pages/priceTell/priceTell?id=${this.goodsId}&&attrid=${this.attrid}&&price=${this.checkprice}`
+				})
+			},
             quickShare(e) {
                 this.$emit('quickShare', e);
             },
+			contrastClick(){
+				// 判断登入
+				// if (!this.$user.isLogin()) {
+				//     this.$user.getInfo().then(() => {
+				//     });
+				// } else { 
+				    uni.navigateTo({
+				    	url: `/pages/goods/contrast?id=${this.goodsId}`
+				    });
+				//}
+			},
             shareClick() {
                 // 判断登入
                 if (!this.$user.isLogin()) {
@@ -242,6 +310,11 @@
         width: 40upx;
         height: 40upx;
     }
+	.bd-share .nbd-icon {
+	    width: 28upx;
+	    height: 28upx;
+		margin-right:10upx;
+	}
     .bd-share .bd-text {
         color: #767676;
         font-size: 20upx;

+ 169 - 33
components/page-component/goods/u-attr.vue

xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd
@@ -46,8 +46,23 @@
                                       v-for="(attr, key) in item.attr_list" :key="key">
                                     {{attr.attr_name}}
                                 </view>
-                            </view>
-                        </view>
+                            </view> 
+                        </view>  
+						<view class="service" v-if="service_screen&&service_screen.screenList">
+							<view class="service_title">服务</view>
+							<view class="service_item">
+								<view>碎屏险</view>
+								<view>{{service_screen.screenList.intro}}</view>
+							</view>
+							<view class="service_value">
+								<view class="service_block" 
+									v-for="(item,index) of service_screen.screenList['card_data']" 
+									:class="{service_block_active:index == serviceId}"
+									@click="select_service(index)">
+										{{item.name}}{{item.year}}年{{item.price}}元
+								</view>
+							</view>
+						</view>
                         <view class="u-number dir-left-nowrap main-between cross-center">
                             <view class="u-text">数量</view>
                             <view class="dir-left-nowrap u-input-box">
@@ -147,10 +162,55 @@
                 newValue: false,
                 picUrl: null,
                 newGroup: [],
-                number: 1
+                number: 1,
+				service_screen:null,		//碎屏险
+				service_label:null,			//当前对屏对象
+				serviceId:null,				//碎屏险ID
+				card_id:null
             }
         },
         methods: {
+			select_service(index){
+				if(this.serviceId && this.serviceId == index){
+					this.serviceId = null
+				}else{
+					this.serviceId = index
+				} 
+				if(this.serviceId || this.serviceId===0){
+					this.service_screen.screenList['card_data'].forEach((item,index)=>{
+						console.log(index)
+						console.log(this.serviceId)
+						if(index == this.serviceId){
+							this.service_label = item
+							this.card_id = this.service_screen.screenList['card_id']
+						}
+					})
+				}else{
+					this.service_label = null
+				}
+			},
+			getservice(copyGroup, attrNum_0, select){
+				console.log('getservice,164')
+				console.log(copyGroup, attrNum_0, select)
+				console.log(this.goods.attr)
+				console.log(select)
+				let select_val = []
+				this.goods.attr.forEach((item,index)=>{
+					console.log(item)
+					let select_item_list = [] 
+					let select_item_value = ''
+					item.attr_list.forEach((value,key)=>{ 
+						select_item_value = value.attr_group_id+'-'+value.attr_id
+						select_item_list.push(select_item_value) 
+					})
+					if(JSON.stringify(select) == JSON.stringify(select_item_list)){ 
+						this.service_screen = item
+					}
+					 
+				})
+				 
+				
+			},
             close: function() {
                 this.$emit('input', false);
             },
@@ -163,6 +223,7 @@
                 });
             },
             identifier: function(copyGroup, attrNum_0, select) {
+				console.log('identifier,175')
                 copyGroup.forEach(f => {
                     f.attr_list.forEach(c => {
                         let param = `${f.attr_group_id}-${c.attr_id}`;
@@ -171,6 +232,7 @@
                 });
             },
             selectCheck: function(copyAttr, attrNum_0, select) {
+				console.log('selectCheck,183')
                 copyAttr.forEach(f => {
                     let arr = [];
                     let sign = 0;
@@ -189,11 +251,15 @@
                 });
             },
             storeAttr: function(attr_id, group_id, num_0) {
+				console.log(201) 
                 if (num_0 === true) return;
                 let newGroup = this.newGroup;
                 let copyAttr = this.copyAttr;
-                let select = [];
-                newGroup.forEach((i, index) => {
+                let select = []; 
+				console.log(newGroup)
+				console.log(attr_id)
+				console.log(group_id)
+                newGroup.forEach((i, index) => { 
                     let attr_list = i.attr_list;
                     attr_list.forEach((k) => {
                         if (i.attr_group_id === group_id) {
@@ -215,7 +281,13 @@
                     });
                 });
                 let attrNum_0 = [];
-                this.selectCheck(copyAttr, attrNum_0, select);
+				console.log(230)
+				console.log(copyAttr)
+				console.log(attrNum_0)
+				console.log(select)
+				
+                this.selectCheck(copyAttr, attrNum_0, select); 
+				
                 this.$nextTick(() => {
                     if (this.number > this.stock) this.number = this.stock;
                 });
@@ -258,6 +330,7 @@
                 let attrNum_0 = [];
                 this.selectCheck(copyAttr, attrNum_0, select);
                 this.identifier(copyGroup, attrNum_0, select);
+				this.getservice(copyGroup, attrNum_0, select);	//getservice
                 this.newGroup = copyGroup;
             },
             numberBlur: function (e) {
@@ -299,8 +372,8 @@
                 }
                 this.close();
             },
-            rightSubmit:function() {
-                let attrs = [];
+            rightSubmit:function() { 
+				let _this = this
                 if (!this.checked) {
                     uni.showToast({
                         title: '请先选规格',
@@ -308,32 +381,60 @@
                     });
                     return false;
                 }
-                this.checked.attr_list.forEach(item => {
-                    attrs.push({
-                        attr_id: item.attr_id,
-                        attr_group_id: item.attr_group_id
-                    });
-                });
-                let goods = {
-                    mch_id: this.goods.mch_id ? this.goods.mch_id : 0,
-                    goods_list: [
-                        {
-                            id: this.goods.id,
-                            attrs,
-                            num: this.number,
-                            cat_id: 0,
-                            goods_attr_id: this.checked.id
-                        }
-                    ]
-                }
-                if (this.rightFunc === true) {
-                    this.$emit('rightFunc', goods);
-                } else {
-                    this.shop(goods);
-                }
-                this.close();
-            },
+				
+		
+				// if (!this.service_label) {
+				// 	uni.showModal({
+				// 		title: '提示',
+				// 		content: '确定不需要碎屏险吗?',
+				// 		success: function (res) {
+				// 			if (res.confirm) {
+				// 				_this.submit()
+				// 			} else if (res.cancel) {
+				// 				return false
+				// 			}
+				// 		}
+				// 	});
+				// }else{
+				// 	this.submit()
+				// } 
+				this.submit()
+            },
+			submit(){
+				let attrs = [];
+				let _this = this
+				_this.checked.attr_list.forEach(item => {
+				    attrs.push({
+				        attr_id: item.attr_id,
+				        attr_group_id: item.attr_group_id
+				    });
+				});
+				let goods = {
+				    mch_id: _this.goods.mch_id ? _this.goods.mch_id : 0,
+				    goods_list: [
+				        {
+				            id: _this.goods.id,
+				            attrs,
+				            num: _this.number,
+				            cat_id: 0,
+							card_id:_this.card_id,
+				            goods_attr_id: _this.checked.id, 
+							service_label: _this.service_label
+				        }
+				    ]
+				}
+				if (_this.rightFunc === true) {
+					console.log(333)
+				    _this.$emit('rightFunc', goods);
+				} else {
+					console.log(336)
+				    _this.shop(goods);
+				}
+				_this.close();
+			},
             shop: function(goods) {
+				console.log(342)
+				console.log(goods)
                 uni.navigateTo({
                     url: `/pages/order-submit/order-submit?mch_list=${JSON.stringify([goods])}`
                 });
@@ -582,4 +683,39 @@
     .u-btn-color {
         color: #ffffff;
     }
+	.service_title{  
+		padding-top: 10px;
+		margin:14px 10px 10px; 
+		font-weight: 700;
+		font-size: 13px;
+	}
+	.service_item{
+		margin:14px 10px 0px; 
+		font-size:26rpx;
+		color:#666;
+		display:flex;
+		justify-content: space-between;
+	}
+	.service_value{
+		display:flex;
+		flex-wrap: wrap;
+		padding:0px 10px;
+	}
+	.service_block{
+		min-width:46%;
+		height: 28px;
+		line-height:26px;
+		border: 1px solid #f5f5f5;
+		border-radius: 16px;
+		text-align:center;
+		margin-right: 10px;
+		margin-top: 10px;
+		font-size: 12px;
+		background-color: #f5f5f5;
+		position: relative;
+	}
+	.service_block_active{
+		color:#f21c1c;
+		border:1px solid #f21c1c;
+	}
 </style>

+ 289 - 0
components/page-component/goods/u-open-pic.vue

xqd
@@ -0,0 +1,289 @@
+<template>
+    <view class="u-attr">
+       
+        <u-popup v-model="newValue" mode="center"  :safeAreaInsetBottom="true" @close="close">
+        <view class="u-content" >
+            <view class='u-header main-between'>
+				<view>开箱展示</view>
+				 <view @click="close"><image class="bd-icon" src="../../../static/image/icon/clear.png"></image></view>
+			</view>
+            <view class="u-body dir-top-nowrap cross-center">
+              <!--  <image class="u-img" :src="img"></image>
+                <text class="u-text">申请获取您绑定的手机号</text> -->
+               <swiper
+                    class="swiper"
+                    
+                    v-bind:indicator-dots="picList.length>1"
+                    circular
+                    @change='bannerChange'
+                    indicator-color="rgba(255,255,255,.3)"
+                    indicator-active-color="#30353c"
+                >
+                 
+                
+                    <swiper-item v-for="(item, index) in picList" v-bind:key="index">
+                        <view class="swiper-img"
+                              @click="clickImage(index)" v-bind:style="{backgroundImage: 'url(' + item.pic_url + ')'}">
+                			
+                
+                        </view>
+                    </swiper-item>
+                </swiper>
+				<view class="bd-subtitle">左右滑动查看开箱展示</view>
+            </view>
+        </view>
+		  
+        </u-popup>
+    </view>
+</template>
+
+<script>
+    import uPopup from '../../basic-component/u-popup/u-popup.vue';
+    import appPrice from "../goods/app-price.vue";
+    import appMemberMark from "../app-member-mark/app-member-mark.vue";
+
+    export default {
+        name: "u-open-pic",
+        props: {
+			newValue:{
+				type:Boolean,
+				default:true
+			},
+			picList:{
+				type:Array,
+				default(){
+                    return []
+                }
+			}
+        },
+        data() {
+            return {
+              
+            }
+        },
+        methods: {
+			close: function() {
+			    this.$emit('closeOpenPic', false);
+			},
+        },
+        components: {
+            uPopup,
+            appPrice,
+            appMemberMark
+        },
+        computed: {
+           
+        },
+        watch: {
+          
+        }
+    }
+</script>
+
+<style scoped lang="scss">
+    .u-model {
+        width: 750upx;
+    }
+    .u-top {
+        margin: 0 24upx;
+        border-bottom: 1upx solid #e2e2e2;
+        height: 140upx;
+    }
+    .u-close-image {
+        width: 54upx;
+        height: 78upx;
+        padding: 24upx 0 24rpx 24rpx;
+        margin-left: 24rpx;
+    }
+    .bd-close-image {
+        width: 30upx;
+        height: 30upx;
+    }
+    .u-pic {
+        width: 200rpx;
+        height: 200rpx;
+        padding: 4upx;
+        border-radius: 8rpx;
+        position: relative;
+        top: -64upx;
+        background-color: #ffffff;
+    }
+    .u-img {
+        width: 192rpx;
+        height: 192rpx;
+        background-color: #ffffff;
+    }
+    .u-info {
+        width: 424upx;
+        height: 136upx;
+        padding: 45upx 0 0 24upx;
+    }
+    .u-scroll-view {
+        width: 100%;
+        max-height: calc(80vh - 154upx);
+    }
+    .u-attr-group {
+        margin:24upx 32upx 0 32upx;
+        border-bottom: 1upx solid #e2e2e2;
+    }
+    .u-number {
+        height: 124upx;
+        margin: 0 32upx;
+    }
+    .u-group-name {
+        margin-bottom: 20upx;
+    }
+    .u-group-item {
+        padding: 15upx 24upx;
+        border-radius: 8upx;
+        margin:0 20upx 20upx 0;
+        font-size: 26upx;
+    }
+    .u-checked {
+        color: #ffffff;
+    }
+    .u-unchecked {
+        background-color: #f2f2f2;
+        color: #353535;
+    }
+    .u-attr_num_0 {
+        background-color: #f7f7f7;
+        color: #cdcdcd;
+    }
+    .u-stock {
+        font-size: 24upx;
+        color: #999999;
+    }
+    .u-price {
+        margin-right: 12upx;
+    }
+    .u-input {
+        width: 88upx;
+        height: 60upx;
+        background-color: #f7f7f7;
+        font-size: 20upx;
+        color: #353535;
+        text-align: center;
+    }
+    .u-input-box {
+        width: 218upx;
+    }
+    .u-number-btn {
+        height: 60upx;
+        width: 60upx;
+        background-repeat: no-repeat;
+        background-size: 100% 100%;
+        background-position: center;
+    }
+    .u-number-btn:first-child {
+        margin-right: 5upx;
+    }
+    .u-number-btn:last-child {
+        margin-left: 5upx;
+    }
+    .u-reduced-1 {
+        background-image: url("../../../static/image/icon/can-be-reduced.png");
+    }
+    .u-reduced-0 {
+        background-image: url("../../../static/image/cart/can-be-reduced.png");
+    }
+    .u-added-1 {
+        background-image: url("../../../static/image/cart/can-be-added.png");
+    }
+    .u-text {
+        font-size: 26upx;
+        color: #666666;
+    }
+    .u-bottom {
+        height: 110upx;
+    }
+    .u-btn {
+        text-align: center;
+        line-height: 110upx;
+    }
+    .u-btn-color {
+        color: #ffffff;
+    }
+	.service_title{  
+		padding-top: 10px;
+		margin:14px 10px 10px; 
+		font-weight: 700;
+		font-size: 13px;
+	}
+	.service_item{
+		margin:14px 10px 0px; 
+		font-size:26rpx;
+		color:#666;
+		display:flex;
+		justify-content: space-between;
+	}
+	.service_value{
+		display:flex;
+		flex-wrap: wrap;
+		padding:0px 10px;
+	}
+	.service_block{
+		min-width:46%;
+		height: 28px;
+		line-height:26px;
+		border: 1px solid #f5f5f5;
+		border-radius: 16px;
+		text-align:center;
+		margin-right: 10px;
+		margin-top: 10px;
+		font-size: 12px;
+		background-color: #f5f5f5;
+		position: relative;
+	}
+	.service_block_active{
+		color:#f21c1c;
+		border:1px solid #f21c1c;
+	}
+	.swiper {
+	    height: #{500rpx};
+	width: #{500rpx};
+	    .swiper-img {
+	        width: 100%;
+	        height: #{500rpx};
+	        background-size: cover;
+	        background-repeat: no-repeat;
+	        background-position: center;
+	        position: relative;
+	    }
+	}
+	.u-content {
+	    background-color: #ffffff;
+	}
+	
+	.u-header {
+	   padding: 5upx;
+	    border-bottom: 1upx solid #eeeeee;
+	    color: #353535;
+	    font-size: 28upx;
+	}
+	.u-img {
+	    width: 88upx;
+	    height: 88upx;
+	    text-align: center;
+	    margin: 32upx 0 40upx;
+	}
+	.u-body {
+	    padding: 0 24upx;
+	
+	}
+	.u-text {
+	    margin-bottom: 40upx;
+	    font-size: 26upx;
+	    color: #666666;
+	}
+	.bd-icon {
+	    width: 40upx;
+	    height: 40upx;
+	}
+	.bd-subtitle{
+		padding: 5upx;
+		font-size: 24upx;
+		line-height: 44upx;
+		color: #999999;
+	}
+</style>

+ 19 - 4
components/u-charts/component.vue

xqd xqd xqd
@@ -29,6 +29,10 @@
 				type: String,
 				default: 'u-canvas',
 			},
+			maxy:{
+				type: Number,
+				default: 180
+			},
 			cWidth: {
 				default: 375,
 			},
@@ -114,9 +118,9 @@
 						gridType: 'dash',
 						gridColor: '#CCCCCC',
 						dashLength: 8,
-						splitNumber: 5,
+						splitNumber: 6,
 						min: 10,
-						max: 180,
+						max: this.maxy,
 						format: (val) => {
 							return val.toFixed(0) + '元'
 						}
@@ -131,10 +135,21 @@
 				});
 			},
 			// 这里仅作为示例传入两个参数,cid为canvas-id,newdata为更新的数据,需要更多参数请自行修改
-			changeData(cid,newdata) {
+			changeData(cid,newdata,maxy=180) {
 				canvases[cid].updateData({
 					series: newdata.series,
-					categories: newdata.categories
+					categories: newdata.categories,
+					yAxis:{
+						gridType: 'dash',
+						gridColor: '#CCCCCC',
+						dashLength: 8,
+						splitNumber: 6,
+						min: 10,
+						max: maxy,
+						format: (val) => {
+							return val.toFixed(0) + '元'
+						}
+					}
 				});
 			},
 			touchStart(e) {

+ 14 - 1
core/apiUrl.js

xqd xqd
@@ -136,20 +136,29 @@ const apiUrl = {
         attr: 'api/goods/attr',
         comments_list: 'api/goods/comments-list',
         recommend: 'api/goods/recommend',
-        new_recommend: 'api/goods/new-recommend',
+        new_recommend: 'api/goods/new-recommend', 
         cat_style: 'api/goods/cat-style',
         goods_video_list: '/api/goods/goods-list',
         poster: '/api/goods/poster',
         hot_search: '/api/goods/hot-search',
+		PriceMove:'api/goods/price-move',
+		GetPriceTell:'api/goods/get-price-tell',
+		UpdatePriceTell:'api/goods/update-price-tell'
     },
     card: {
         index: 'api/card/user-card',
+		indexsp: 'api/sp/user-card',
         detail: 'api/card/user-card-detail',
+		detailsp: 'api/sp/user-card-detail',
         qrcode: 'api/card/card-qrcode',
+		sqrcode: 'api/sp/card-qrcode',
         clerk: 'api/card/card-clerk',
+		clerksp: 'api/sp/card-clerk',
         history: 'api/card/clerk-history',
         give: 'api/card/give',
+		givesp: 'api/sp/give',
         receive: 'api/card/receive',
+		receivesp: 'api/sp/receive',
     },
     share: {
         apply: 'api/share/apply',
@@ -299,6 +308,10 @@ const apiUrl = {
         topic: 'api/qrcode/topic',
         footprint: 'api/qrcode/footprint',
         goods_new: 'api/qrcode/goods-new',
+		goods_contrast: 'api/goods/params',
+		cat_list: 'api/cat/list',
+		cat: 'api/cat/two', 
+		search: 'api/cat/keyword',
         card: 'api/card/give-poster',
         coupon: 'api/coupon/give-poster',
     },

+ 1 - 1
manifest.json

xqd
@@ -18,7 +18,7 @@
     },
     "quickapp" : {},
     "mp-weixin" : {
-        "appid" : "wxd7992ad53447080a",
+        "appid" : "wxb4f05dac6f3012dc",
         "setting" : {
             "urlCheck" : false,
             "minified" : true,

+ 81 - 9
pages.json

xqd xqd xqd xqd
@@ -1,26 +1,45 @@
 {
     "pages": [
-        {
-            "path": "pages/index/index",
-            "style": {
-                "navigationBarTitleText": "首页"
-            }
-        },
+		{
+		    "path": "pages/index/index",
+		    "style": {
+		        "navigationBarTitleText": "首页"
+		    }
+		},{
+		    "path" : "pages/test/test",
+		    "style" :                                                                                    
+		    {
+		        "navigationBarTitleText": "",
+		        "enablePullDownRefresh": false
+		    }
+		    
+		},
+  
+		{
+		    "path" : "pages/priceTell/priceTell",
+		    "style" :                                                                                    
+		    {
+		        "navigationBarTitleText": "降价通知",
+		        "enablePullDownRefresh": false
+		    }
+		    
+		},
         {
             "path": "pages/rules/index",
             "style": {
                 "navigationBarTitleText": "规则"
             }
         }
+       
     ],
     "globalStyle": {
         "navigationBarTextStyle": "black",
         "navigationBarTitleText": "",
         "navigationBarBackgroundColor": "#F8F8F8",
-        "backgroundColor": "#F8F8F8"
+        "backgroundColor": "#F8F8F8" 
     },
     "navigateToMiniProgramAppIdList": [
-        "wx3efb95b9c5579418"
+        "wxb4f05dac6f3012dc"
     ],
     "subPackages": [
         {
@@ -92,7 +111,7 @@
                 {
                     "path": "index/index",
                     "style": {
-                        "navigationBarTitleText": ""
+                        "navigationBarTitleText": "卡券详情"
                     }
                 },
                 {
@@ -121,6 +140,41 @@
                 }
             ]
         },
+		{
+		    "root": "pages/sp",
+		    "pages": [
+		        {
+		            "path": "index/index",
+		            "style": {
+		                "navigationBarTitleText": "碎屏险详情"
+		            }
+		        },
+		        {
+		            "path": "details/details",
+		            "style": {
+		                "navigationBarTitleText": "碎屏险详情"
+		            }
+		        },
+		        {
+		            "path": "details/details-no-share",
+		            "style": {
+		                "navigationBarTitleText": "碎屏险详情"
+		            }
+		        },
+		        {
+		            "path": "clerk/clerk",
+		            "style": {
+		                "navigationBarTitleText": "核销碎屏险"
+		            }
+		        },
+		        {
+		            "path": "give/give",
+		            "style": {
+		                "navigationBarTitleText": ""
+		            }
+		        }
+		    ]
+		},
         {
             "root": "pages/balance",
             "pages": [
@@ -186,6 +240,24 @@
                             "bounce": "none"
                         }
                     }
+                },
+                {
+                    "path": "contrast",
+                    "style": {
+                        "navigationBarTitleText": "商品对比", 
+                        "app-plus": {
+                            "bounce": "none"
+                        }
+                    }
+                }
+                ,{
+                    "path" : "priceMove",
+                    "style" :                                                                                    
+                {
+                    "navigationBarTitleText": "",
+                    "enablePullDownRefresh": false
+                }
+                
                 }
             ]
         },

+ 8 - 3
pages/cart/components/app-shop-product/app-shop-product.vue

xqd xqd
@@ -48,7 +48,11 @@
                             {{item.attr_group_name}}: {{item.attr_name}}
                         </text>
                     </view>
-
+					
+					
+					<!-- 碎屏险  cat/cat -->
+					
+					
                     <view class="app-miaosha dir-left-nowrap main-left cross-center" v-if="good.sign === 'miaosha'">
                         <icon class="app-miaosha-icon"
                               v-if="good.miaosha_status === 2 || good.miaosha_status === 1"></icon>
@@ -80,12 +84,13 @@
                     </view>
 
                     <view class="dir-top-nowrap" v-if="good.new_status === 0 && good.sign !== 'wholesale'">
-                        <view class="reduce-price" v-if="good.reduce_price > 0 && good.new_status === 0">
+                        					
+						<view class="reduce-price" v-if="good.reduce_price > 0 && good.new_status === 0">
                             比加入时降¥{{good.reduce_price}}
                         </view>
                         <view class="app-price-button dir-left-nowrap main-between cross-center">
                             <text class="app-price" :class="theme+ '-m-text ' + theme">
-                                {{good.attrs.price}}
+                                {{good.attrs.price}}<view>84</view>	
                             </text>
                             <view v-if="good.sign != 'wholesale'">
                                 <app-add-subtract

+ 867 - 0
pages/goods/contrast.vue

xqd
@@ -0,0 +1,867 @@
+<template>
+    <app-layout>  
+		<view class="player" v-if="show_catList">
+			<view class="player-content">
+				<view class="player-title">请选择品牌</view>
+				<view class="player-search">
+					<view class="input"><input type="text" placeholder="请输入商品名称" v-model="player_search"/></view>
+					<view class="btn" @click="getShop()">搜索</view>
+				</view>
+				<view class="player-list">
+					<view class="player-item" v-for="(item,index) of cat_list" 
+						@click="getShop(item.id)"
+						:key="index">
+						{{item.name}} 
+					</view>
+				</view> 
+				<view class="player-close" @click="hidden_catList">关闭</view>
+			</view> 
+		</view>
+		<view class="player player-one" v-if="show_cat">
+			<view class="player-content">
+				<view class="player-title">请选择分类商品</view>
+				<view class="player-search">
+					<view class="input"><input type="text" placeholder="请输入商品名称" v-model="player_search"/></view>
+					<view class="btn" @click="getShop()">搜索</view>
+				</view>
+				<view class="player-list">
+					<view class="player-item" v-for="(item,index) of cat_list_one" 
+						@click="addContrast(item.goods_id)"
+						:key="index">
+						<view class="player-left"><img :src="item.cover_pic" /></view>
+						<view class="player-right">
+							<view class="player-name">{{item.name}}</view>
+							<view class="player-price">¥{{item.price}}</view>
+						</view>
+					</view>
+				</view> 
+				<view class="player-close" @click="hidden_cat">关闭</view>
+			</view> 
+		</view>
+        <template v-if="goods">  
+			<view style="width:100%;overflow-x:scroll;"> 
+				<view class="contrast" style="width:772px;">  
+					<view class="title">隐藏相同属性</view>
+					<view class="colmun" v-if="contrastList">
+						<view class="list" v-if="contrastList.info">
+							<view class="contrast_item">
+								<view class="contrast_key">商品信息</view>
+								<view class="contrast_key" :class="'contrast_key'+(index+2)" v-for="(item,index) of contrastList.info" :key="index">
+									<view class="pic"><img alt="手机图片" :src="item.cover_pic" /></view>
+									<view class="name">{{item.name}}</view>
+									<view class="price">¥{{item.price}}</view>
+									<view class="buy" @click="goBuy(item.id,item.type)">立即购买</view>
+									<view class="cancel" 
+										:class="{unable:index==0}"
+										@click="cancel(item.id,index)">移除</view> 
+								</view>
+								<view class="contrast_key" :class="'contrast_key'+(index+2)" v-for="(item,index) of (4 - contrastList.info.length)" :key="index"> 
+									<view class="buy" @click="getShopList()">添加商品</view> 
+								</view>
+							</view>
+						</view>
+						<view class="list" v-for="(item,index) of contrastList.list" :key="index" v-if="contrastList.list" style="width:772px;float:left;">
+							<view class="contrast_title" v-if="item.length>0">{{item[0].title}}</view>  
+							<view class="contrast_item" v-for="(value,key) of item" :key="key">
+								<view class="contrast_key" :class="'contrast_key'+(ind+1)" v-for="(ite,ind) of value.text" :key="ind">
+									{{ite}}
+								</view>
+								<view class="contrast_key" :class="'contrast_key'+(ind+1)" v-for="(ite,ind) of (5 - value.text.length)" :key="ind">
+								</view>
+							</view>
+						</view>  
+					</view>
+				</view>
+			</view> 
+			<u-attr
+			    v-if="is_negotiable === 0 && exchangeStatus ==null"
+			    v-model="attrShow"
+			    :goods="goods"
+			    :themeObject="themeObject"
+			    :checked="checked"
+			    @check="check"
+			>
+			</u-attr>
+        </template> 
+    </app-layout>
+</template>
+
+<script>
+	import {mapGetters, mapState} from "vuex";
+    import appGoodsBanner from "../../components/page-component/goods/app-goods-banner.vue";
+    import appGoodsRecommend from "../../components/page-component/app-goods-recommend/app-goods-recommend.vue";
+    import appQuickNavigation from "../../components/page-component/app-quick-navigation/app-quick-navigation.vue";
+    import appComposition from'../../components/basic-component/app-composition/app-composition.vue';
+    import AppVipCard from '../../components/page-component/app-vip-card/app-vip-card';
+    import uniSwiperDot from '../../components/basic-component/uni-swiper-dot/uni-swiper-dot';
+    import appGoodsFlashSale from '../../components/page-component/goods/app-goods-flash-sale.vue';
+    import uAttr from '../../components/page-component/goods/u-attr.vue';
+	import appGoodsFullReduce from '../../components/page-component/goods/app-goods-full-reduce.vue';
+	import bdInfo from '@/components/page-component/goods/bd-info';
+    import bdCoupon from '@/components/page-component/goods/bd-coupon.vue';
+    import bdXbc from '@/components/page-component/goods/bd-xbc.vue';
+    import bdKb from '@/components/page-component/goods/bd-kb.vue';
+    import bdHc from '@/components/page-component/goods/bd-hc.vue';
+    import bdDetail from '@/components/page-component/goods/bd-detail.vue';
+    import bdComments from '@/components/page-component/goods/bd-comments.vue';
+    import appClose from '@/components/basic-component/app-close/app-close.vue';  
+	
+    export default {
+        name: "goods",
+        components: {
+            appGoodsBanner,
+            'app-goods-recommend': appGoodsRecommend,
+            'app-quick-navigation': appQuickNavigation,
+            'app-composition': appComposition,
+            appClose,
+            uniSwiperDot,
+            AppVipCard,
+			appGoodsFlashSale,
+			appGoodsFullReduce,
+            uAttr,
+            bdInfo,
+            bdCoupon,
+            bdXbc,
+            bdKb,
+            bdHc,
+            bdDetail,
+            bdComments
+        },
+        data() {
+            return { 
+				contrastList:null, 				//对比参数列表
+				contrastApi:this.$api.poster.goods_contrast,
+				catListApi:this.$api.poster.cat_list,
+				searchApi:this.$api.poster.search,
+				catApi:this.$api.poster.cat,
+				player_search:'',
+				cat_id:null,					//购物车类型id-父级
+				cat_list:null,					//购物车列表
+				cat_list_one:null,				//商品列表
+				show_catList:false,				//是否显示推荐商品类型列表
+				show_cat:false,					//显示商品列表
+				attrShow:false,		
+				
+                showClose: false,
+                is_open: 0,
+                goods: null,
+                selectAttr: null,
+                recommend_list: null,
+                is_vip: false,
+                is_vip_card_user: 0,
+                current: 0,
+                discount: null,
+                attrShow: false,
+                shareData: null,
+				contact_tel:'',
+				contact: '',
+				contact_web:'',
+                poster_config: this.$api.goods.poster,
+                poster_generate: this.$api.poster.goods_new,
+                // 限时抢购
+				flash_sale: null,
+                checked: null,
+                // 商品服务
+                services: null,
+                // 商品详情
+                detail: null,
+                // 商品ID
+                goodsId: null,
+                // 套餐组合
+                composition: null,
+                autoplay: true,
+                full_reduce: null,
+                goods_marketing_award: null,
+                express: null,
+                goods_marketing: null,
+                exchangeStatus: null,
+                exchange: null,
+
+                price: null,
+                level_show: null,
+                sales: null,
+                unit: null,
+                is_sales: null,
+                extra_quick_share: null,
+                price_max: null,
+                price_min: null,
+                price_member_max: null,
+                price_member_min: null,
+                original_price: null,
+                subtitle: null,
+                is_negotiable: null,
+                name: null,
+                app_share_pic: null,
+                app_share_title: null,
+                goodsType: null,
+                favorite: null,
+                goods_coupon_center: null,
+                guarantee_title: null,
+                guarantee_pic: null,
+                param_content: null,
+                param_name: null,
+                attr_groups: null,
+                goods_num: null,
+                good_stock: null
+            };
+        },
+        computed: {
+            themeObject:function() {
+                return {
+                    back: this.getTheme + '-m-back ' + this.getTheme,
+                    backP: this.getTheme + '-m-back-p ' + this.getTheme,
+                    backO: this.getTheme + '-m-back-o ' + this.getTheme,
+                    theme: this.getTheme,
+                    color: this.getTheme + '-m-text ' + this.getTheme,
+                    sBack: this.getTheme + '-s-back ' + this.getTheme,
+                    border: this.getTheme + '-m-border ' + this.getTheme,
+                }
+            },
+            ...mapState({
+                mall: state => state.mallConfig.mall,
+                gConfig: state => state.gConfig,
+            }),
+			...mapGetters('mallConfig', {
+				getTheme: 'getTheme',
+			}),
+			good_negotiable: function() {
+            	let good_negotiable = this.mall.setting.good_negotiable;
+            	this.contact_tel = '';
+				this.contact = '';
+				this.contact_web = '';
+            	let arr = [];
+            	for (let i = 0; i < good_negotiable.length; i++) {
+            		if (good_negotiable[i] === 'contact_tel') {
+						this.contact_tel = 'contact_tel';
+					}
+					if (good_negotiable[i] === 'contact') {
+						this.contact = 'contact';
+					}
+					if (good_negotiable[i] === 'contact_web') {
+						this.contact_web = 'contact_web';
+					}
+				}
+            	if (this.contact_tel) {
+					arr.push(this.contact_tel);
+				}
+				if (this.contact) {
+					arr.push(this.contact);
+				}
+				if (this.contact_web) {
+					arr.push(this.contact_web);
+				}
+				return arr;
+			},
+            contactBtn: function() {
+                const len = this.good_negotiable.length;
+                const theme = this.getTheme;
+                if (len === 3 && (theme === 'a' || theme === 'b' || theme === 'f')) {
+                    return `${theme}-m-back ${theme}-s-text ${theme}`;
+                } else if (len === 3 && !(theme === 'a' ||  theme === 'b' || theme === 'f')) {
+                    return `${theme}-m-back ${theme}-s-text ${theme}`;
+                } if (len === 2 && (theme === 'a' || theme === 'b' || theme === 'f') && !this.contact_tel) {
+                    return `${theme}-s-back text ${theme}`;
+                } else if (len === 2 && (theme === 'a' || theme === 'b' || theme === 'f') && this.contact_tel) {
+                    return `${theme}-m-back ${theme}-s-text ${theme}`;
+                } else if (len === 2 && !(theme === 'a' || theme === 'b' || theme === 'f') && !this.contact_tel) {
+                    return `${theme}-s-back text ${theme}`;
+                } else if (len === 2 && !(theme === 'a' || theme === 'b' || theme === 'f') && this.contact_tel) {
+                    return `${theme}-m-back ${theme}-s-text ${theme}`;
+                } else {
+                    return `${theme}-m-back ${theme}-s-text ${theme}`;
+                }
+            }
+        },
+        onLoad(options) {
+            // #ifdef MP-WEIXIN
+            wx.showShareMenu({
+                menus: ['shareAppMessage', 'shareTimeline']
+            })
+            // #endif
+            if (this.isLogin) {
+                this.$store.dispatch('user/info');
+            } else {
+            }
+            if(options.exchange) {
+                this.exchangeStatus = options.exchange;
+                this.exchange = options;
+            } 
+            this.loadData(options.id);
+			let lastId = wx.getStorageSync("current")
+			if(lastId){
+				if(lastId != options.id){
+					wx.removeStorageSync("contrast")
+					wx.setStorageSync("current",options.id)
+				} 
+			}else{
+				wx.setStorageSync("current",options.id)	 
+			} 
+        },
+        onShareAppMessage(object) {
+            if (object.from === 'button' && this.shareData) {
+                return this.$shareAppMessage(this.shareData);
+            }
+            return this.$shareAppMessage({
+                title: this.app_share_title ? this.app_share_title : this.name,
+                imageUrl: this.app_share_pic ? this.app_share_pic : '',
+                path: '/pages/goods/goods',
+                params: {
+                    id: this.goodsId
+                }
+            });
+        },
+        // #ifdef MP-WEIXIN
+        onShareTimeline() {
+            // 分享朋友圈beta
+            return this.$shareTimeline({
+                title: this.app_share_title ? this.app_share_title : this.name,
+                query: {
+                    id: this.goodsId
+                }
+            });
+        },
+        // #endif
+        methods: { 
+			goBuy(id,data){
+				//判断登陆 
+				uni.navigateTo({
+					url: `/pages/goods/goods?id=${id}`
+				}); 
+			},
+			cancel(id,index){ 
+				console.log(id,index)
+				if(index){
+					let contrast = wx.getStorageSync("contrast")  
+					console.log(contrast)
+					let len = contrast.indexOf(id) 
+					console.log(len)
+					if(len>=0){
+						contrast.splice(len,1) 
+						console.log(contrast)
+						if(contrast.length==0){
+							console.log(342)
+							wx.removeStorageSync("contrast")
+						}else{
+							wx.setStorageSync("contrast",contrast)
+						}
+						this.getCurrentData()
+					}
+				}
+			},
+			addContrast(id){
+				let current = wx.getStorageSync("current")
+				let contrast = wx.getStorageSync("contrast")   
+				if(current != id){
+					if(!contrast){ 
+						contrast = [] 
+					} 
+					contrast.push(id)
+					wx.setStorageSync("contrast",contrast)  
+					this.show_catList = false
+					this.show_cat = false
+					this.player_search = ''
+					console.log(363)
+					console.log(contrast)
+					this.getCurrentData()
+				} 
+			},
+			hidden_cat(){
+				this.show_cat = false
+				this.player_search = ''
+			},
+			getShop(id){ 
+				let keyword = this.player_search
+				let params 
+				let url 
+				
+				if(id){
+					url = this.catApi
+					params = {
+					    cat_id: id
+					}
+				}else{
+					url = this.searchApi
+					params = {
+					    keyword: keyword
+					}
+				}  
+				console.log(387)
+				console.log(params)
+				 let resUrl = this.catApi
+				 this.$request({
+				     url: url,
+				     data: params
+				 }).then(response => {
+				     this.$hideLoading(); 
+				     if (response.code === 0) {   
+						this.cat_list_one = response.data.list
+						this.show_cat = true
+						this.show_catList = false
+				 	}
+				 }) 
+			},
+			hidden_catList(){
+				this.show_catList = false
+				this.player_search = ''
+			},
+			getShopList(){
+				 let resUrl = this.catListApi
+				 this.$request({
+				     url: this.catListApi,
+				     data: {
+				         cat_id: this.cat_id
+				     }
+				 }).then(response => {
+				     this.$hideLoading(); 
+					 console.log(412)
+
+					if (response.code === 0) {   
+						this.cat_list = response.data.list 
+						this.show_catList = true
+				 	}
+				 }) 
+			},
+			getCurrentData(){ 
+				let query = this.goodsId
+				let contrast = wx.getStorageSync("contrast")  
+				console.log(427)
+				console.log(contrast)
+				if(contrast){ 
+					console.log(430,this.goodsId)
+					query = this.goodsId + ',' + contrast.join(',')  
+				}  
+				let resUrl =  this.contrastApi
+				console.log(433)
+				console.log('query:',query)
+				this.$request({
+				    url: this.contrastApi,
+				    data: {
+				        goods_id: query
+				    }
+				}).then(response => {
+				    this.$hideLoading(); 
+				    if (response.code === 0) { 
+						//当前商品类型id
+						if(response.data.length>=0&&response.data[0].cat_id){ 
+							this.cat_id = response.data[0].cat_id 
+						}   
+						this.formatData(response.data)
+					}
+				}) 
+			},
+			formatData(data){ 
+				let _this = this
+				let list = []
+				let info = [] 
+				//商品信息
+				data.forEach((items,indexs)=>{
+					let obj = {}
+					obj.cover_pic = items.goods.cover_pic
+					obj.id = items.goods.id
+					obj.name = items.goods.name
+					obj.price = items.goods.price
+					info.push(obj)
+				}) 
+				//参数信息
+				data.forEach((items,indexs)=>{
+					if(indexs==0){ 
+						data[indexs].params.forEach((item,index)=>{
+							let line = []
+							data[indexs].params[index].params.forEach((ite,inde)=>{ 
+								let text = [] 
+								let title = ''
+								
+								text.push(data[indexs].params[index].params[inde].name)  
+								text.push(data[indexs].params[index].params[inde].value)
+								data.forEach((it,i)=>{
+									if(i!=0){
+										if(data[i].params.length>0)
+											text.push(data[i].params[index].params[inde].value||'')
+									}
+								})
+								title = data[indexs].params[index].name  
+								line.push({
+									title:title,
+									text:text
+								}) 
+							})
+							list.push(line)
+						}) 
+					} 
+				}) 
+				this.contrastList = {}
+				this.contrastList.list = list
+				this.contrastList.info = info 
+			},
+			
+            getMall(e) {
+                this.is_open = e.is_open;
+            },
+            toExchange() {
+                let mch_list = [{
+                    mch_id: 0,
+                    goods_list: [{
+                        id: this.exchange.id,
+                        attr: this.exchange.attr,
+                        num: this.exchange.goods_num,
+                        cat_id: 0,
+                        goods_attr_id: this.exchange.attr_id
+                    }],
+                    code: this.exchange.code,
+                    token: this.exchange.token,
+                }];
+                let url = `/pages/order-submit/order-submit?mch_list=${JSON.stringify(mch_list)}`;
+                url += `&preview_url=${encodeURIComponent(this.$api.exchange.exchange_preview)}&submit_url=${encodeURIComponent(this.$api.exchange.exchange_submit)}&plugin=exchange`;
+                uni.navigateTo({
+                    url: url
+                })
+            },
+            // 规格选择
+            check(obj) {
+                this.checked = obj;
+            },
+            change(e) {
+                if(e.detail.source === 'touch') {
+                    this.current = e.detail.current;
+                }
+                if(e.detail.source === 'autoplay') {
+                    this.current = e.detail.current;
+                }
+            },
+            quickShare(info) {
+                this.shareData = info;
+            },
+            toComposition(item) {
+                let id = item.id > 0 ? item.id : this.composition.list[0].id
+                uni.navigateTo({
+                    url: this.composition.url + '?goods_id=' + this.goodsId + '&composition_id=' + id
+                })
+            },
+            loadData(id) { 
+                this.$showLoading();
+                this.$request({
+                    url: this.$api.goods.detail,
+                    data: {
+                        id: id
+                    }
+                }).then(response => {
+                    this.$hideLoading();
+                    if (response.code === 0) {
+                        let { services,
+                            detail, name,
+                            vip_card_appoint, plugin_extra, id,
+                            goods_activity, goods_marketing_award,
+                            goods_marketing, express,
+                            price, sales,
+                            level_show, is_sales, unit, extra_quick_share,
+                            price_max, price_min, price_member_max,
+                            price_member_min, original_price, subtitle,
+                            is_negotiable, app_share_title,
+                            app_share_pic, type, favorite, goods_coupon_center,
+                            guarantee_title, guarantee_pic, param_content,
+                            param_name, attr_groups, goods_num, good_stock
+                        } = response.data.goods;
+                        uni.setNavigationBarTitle({
+                            title: name
+                        }); 
+						
+                        this.name = name;
+                        this.app_share_pic = app_share_pic;
+                        this.app_share_title = app_share_title;
+                        this.goods = response.data.goods;
+                        this.services = services;
+                        this.detail = detail;
+                        this.goodsId = id;
+                        this.flash_sale = plugin_extra.flash_sale;
+                        this.composition = plugin_extra.composition;
+                        this.goods_marketing_award = goods_marketing_award;
+                        this.goods_marketing = goods_marketing;
+                        this.express = express;
+                        this.price = price;
+                        this.level_show = level_show;
+                        this.sales = sales;
+                        this.unit = unit;
+                        this.is_sales = is_sales;
+                        this.price_max = price_max;
+                        this.price_min = price_min;
+                        this.price_member_max = price_member_max;
+                        this.price_member_min = price_member_min;
+                        this.original_price = original_price;
+                        this.subtitle = subtitle;
+                        this.is_negotiable = is_negotiable;
+                        this.extra_quick_share = extra_quick_share;
+                        this.goodsType = type;
+                        this.favorite = favorite;
+                        this.goods_coupon_center = goods_coupon_center;
+                        this.guarantee_title = guarantee_title;
+                        this.param_content = param_content;
+                        this.guarantee_pic = guarantee_pic;
+                        this.attr_groups = attr_groups;
+                        this.param_name = param_name;
+                        this.goods_num = goods_num;
+                        this.good_stock = good_stock;
+                        if (goods_activity) {
+                            this.full_reduce = goods_activity.full_reduce;
+                        }
+                        if(vip_card_appoint.discount || vip_card_appoint.discount === '0.00') {
+                            this.is_vip = true;
+                            this.discount = vip_card_appoint.discount
+                        }
+                        this.is_vip_card_user = vip_card_appoint.is_vip_card_user;
+                        this.loadRecommend();
+						
+						//
+						this.getCurrentData()
+                    } else {
+                        uni.showToast({
+                            title: response.msg,
+                            icon: 'none'
+                        });
+                    }
+                }).catch(() => {
+                    this.$hideLoading();
+                });
+            },
+            onAttr(data) {
+                this.selectAttr = data;
+            },
+            loadRecommend() {
+                this.$request({
+                    url: this.$api.goods.new_recommend,
+                    data: {
+                        goods_id: this.goodsId,
+                        type: 'goods'
+                    }
+                }).then(response => {
+                    if (response.code === 0) {
+                        this.recommend_list = response.data.list;
+                    }
+                });
+            },
+            back() {
+                uni.reLaunch({
+                    url: '/pages/index/index'
+                });
+            },
+            setFavorite() {
+                let url = this.$api.user.favorite_add;
+                let favorite = true;
+                if (this.favorite) {
+                    url = this.$api.user.favorite_remove;
+                    favorite = false;
+                }
+                this.favorite = favorite;
+                this.$request({
+                    url: url,
+                    data: {
+                        goods_id: this.goodsId
+                    }
+                }).then(response => {
+                    if (response.code === 0) {
+                    } else {
+                        uni.showModal({
+                            title: '提示',
+                            content: response.msg,
+                            showCancel: false
+                        });
+                    }
+                });
+            },
+            clickAttr(data) {
+                if (this.goods.type === 'ecard' && data === 0) {
+                    uni.showToast({
+                        title: '虚拟商品不允许加入购物车',
+                        icon: 'none'
+                    });
+                    return;
+                }
+                this.attrShow = true;
+            },
+			setCoupon(index) {
+				this.$set(this.goods_coupon_center[index], 'is_receive', 1);
+			}
+        },
+        onShow() {
+            this.autoplay = true;
+            this.showClose = false;
+            setTimeout(()=>{
+                this.showClose = true;
+            })
+        },
+        onHidden() {
+            this.autoplay = false;
+        }
+    }
+</script>
+
+<style scoped lang="scss">  
+	
+	.player{
+		background:rgba(0,0,0,0.4);position:fixed;left:0;top:0;width:100%;height:100%;
+		text-align:center;z-index:100;
+		.player-content{
+			position:absolute;left:50%;top:40%;transform:translate(-50%,-50%);
+			width:80%;background: #fff;
+			.player-title{
+				width: 100%;
+				height: 45px;
+				border-bottom: 1px solid #dfdfdf;
+				background: #fcfcfc;
+				line-height: 44px;
+				text-align: center;
+				font-size: 16px; 
+			}
+			.player-search{
+				width: 100%;line-height: 44px;text-align: center;
+				font-size: 16px;height: 45px;border-bottom: 1px solid #dfdfdf;
+				display:flex;justify-content: space-around;
+				.input{
+					width:72%;display:inline-block;  
+					input{text-align:left;padding-left:10px;
+						outline:none;border:none;background:none;width:100%;margin-top:7px;display:block;height:30px;border-radius:20px;border:1px solid #ccc;
+					}
+				}
+				.btn{
+					display:inline-block;line-height:44px;
+					margin-right:4%;
+				}
+			}
+			.player-list{
+				max-height:320px;
+				overflow:scroll;
+				.player-item{
+					margin:0px 10px; 
+					height: 40px;
+					line-height: 40px;
+					border-bottom: 1px solid #e3e3e3;
+					box-sizing: border-box;
+					padding: 0px 10px;
+					color: #45a1de;
+					text-align:left;
+					display:flex; 
+					.player-left{
+						min-width:60px;
+						width:60px;
+						max-width:60px;
+						height:60px; 
+						margin:10px 10px 10px 0;
+						flex-shink:0;
+						flex-grow:0;
+						image{
+							width:100%;
+							height:100%;
+						}
+					}
+					.player-right{ 
+						margin:10px  0;
+						flex-grow: 1;
+						height:60px;
+						.player-name{
+							font-size:14px;font-weight:700;
+							margin-bottom:4px;color:#333;
+							display: -webkit-box;
+							-webkit-box-orient: vertical;
+							-webkit-line-clamp: 2;
+							overflow: hidden;
+						}
+						.player-price{
+							font-size:12px;
+							line-height:14px;
+							color:#f21c1c;
+						}
+					}
+				}
+			}
+			
+			.player-close{
+				color: #45a1de; 
+				padding:10px;
+				cursor:pointer;
+			}
+		}
+	}
+	.player-one .player-content .player-list .player-item{height:80px;line-height:18px;}
+    .contrast{position:relative;}
+	.title{position:fixed;left:0;top:0;width:100%;background:#ececec;text-align:center;color:red;font-size:14px;line-height:36px;height:36px;}
+	.colmun{
+		width:772px;
+		padding-bottom:40px;
+		padding-top:36px;
+		overflow:hidden;
+		text-align:center;
+		border:1px solid rgb(239, 242, 245); 
+		.list{  
+			.contrast_title {
+				line-height:38px;height:40px;box-sizing:border-box;text-align:left;padding:0 8px;font-weight:600;
+				font-size:12px;color:#f21c1c;background:rgb(239, 242, 245);border:1px solid rgb(239, 242, 245);
+			}
+			.contrast_item {
+				display:flex;
+				border:1px solid rgb(239, 242, 245);
+				.contrast_key{
+					font-size:12px;
+					width:80px;
+					height:auto;
+					box-sizing:border-box;
+					text-align:center;
+					padding:10px 8px;
+					line-height:20px;
+					min-height:40px;
+					border:1px solid rgb(239, 242, 245);  
+					display:flex;
+					text-align:center;
+					align-items: center; 
+					overflow:hidden;
+					flex-wrap: wrap; 
+					.pic{
+						width:100%;height:100px;
+						text-align:center;
+						float:left;
+						image{
+							width:100px;
+							height:100px;
+						}
+					}
+					
+					.name{
+						margin-top:10px;
+						width:100%;
+						float:left; 
+						font-size:12px;
+						line-height: 14px;
+						max-height: 28px;
+						height:28px;
+						overflow: hidden;
+					}
+					.price{
+						width:100%;
+						float:left;
+						color:#f21c1c;
+						font-size:12px;
+					}
+					.buy{
+						display: block;
+						width: 90px;
+						height: 30px;
+						text-align: center;
+						line-height: 30px;
+						border-radius: 3px;
+						margin: 5px auto 8px;
+						color:#fff;
+						background:#f21c1c;
+					}
+					.cancel{
+						width:100%;
+						float:left;
+						color: #3caaff;
+					}
+					.unable{
+						color:#aaa;
+					}
+				}   
+				.contrast_key2,.contrast_key3,.contrast_key4,.contrast_key5{justify-content: space-around;width:173px;text-align:center;} 
+				
+			} 
+		}
+	} 
+</style>

+ 86 - 13
pages/goods/goods.vue

xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd
@@ -1,14 +1,33 @@
 <template>
     <app-layout>
         <view v-if="!goods" class="u-goods-detail"></view>
-        <template v-if="goods">
-            <!--商品轮播图-->
-            <app-goods-banner
-                v-bind:pic-list="goods.pic_url"
-                v-bind:share="goods.share"
-                v-bind:video-url="goods.video_url"
-                v-bind:goods_id="goodsId"
-            ></app-goods-banner>
+        <template v-if="goods">  
+			<view style="position:relative;overflow:hidden;">
+				<view style="width:100%;display:flex;justify-content: flex-start;"> 
+					<view style="width:100%;" v-if="type=='video'">
+						<app-goods-banner 
+							:type="type"
+						    v-bind:pic-list="goods.pic_url"
+						    v-bind:share="goods.share"
+						    v-bind:video-url="goods.banner_video"
+						    v-bind:goods_id="goodsId"
+						></app-goods-banner>
+					</view>
+					<view style="width:100%;" v-if="type=='picture'">
+						<app-goods-banner 
+							:type="type"
+							v-bind:pic-list="goods.pic_url"
+							v-bind:share="goods.share"
+							v-bind:video-url="goods.banner_video"
+							v-bind:goods_id="goodsId"
+						></app-goods-banner> 
+					</view>  
+				</view> 
+				<view style="position:absolute;left:50%;transform:translate(-50%,0);bottom:20px;display:flex;flex-wrap:nowrap;background:#fff;border-radius:28px;">
+					<view class="banner_btn" v-if="goods.banner_video&&goods.banner_video.length>0" :class="{active:type=='video'}" @click="type='video'">视频({{goods.banner_video.length}})</view>
+					<view class="banner_btn" :class="{active:type=='picture'}" @click="type='picture'">图片({{goods.pic_url.length}})</view> 
+				</view>
+			</view>
             <bd-info
                 :theme="themeObject"
                 :name="name"
@@ -35,7 +54,11 @@
                 :poster-config="poster_config + `&goods_id=` + goodsId"
                 :poster-generate="poster_generate + `&goods_id=` + goodsId"
                 :has-poster-nav="true"
+				:signid="checked?checked.sign_id :''"
+				:attrid="checked?checked.id :''"
+				:checkprice="checked?checked.price :''"
                 v-bind:goods="goods"
+				@gotoOpenPic="openPic"
             ></bd-info>
             <!--商品优惠券-->
             <bd-coupon @change="setCoupon" :theme="themeObject" :coupons="goods_coupon_center"></bd-coupon>
@@ -84,7 +107,7 @@
             </view>
             <bd-comments :goods-id="goodsId"></bd-comments>
             <!--商品详情-->
-            <bd-detail :detail="detail"></bd-detail>
+            <bd-detail :detail="detail" :after_detail="after_detail" :goodsId="goodsId"></bd-detail>
             <!--相关推荐-->
             <app-goods-recommend :sureCart="true" :theme="getTheme" :goods-list="recommend_list"></app-goods-recommend>
             <!--空格区域-->
@@ -194,6 +217,7 @@
             </u-attr>
         </template>
         <app-close v-if="showClose" :modal="false" @update="getMall"></app-close>
+		<uOpenPic :picList="goods.open_pic" :newValue="showOpenPic" @closeOpenPic="closeOpenPic"></uOpenPic>
     </app-layout>
 </template>
 
@@ -216,10 +240,11 @@
     import bdDetail from '@/components/page-component/goods/bd-detail.vue';
     import bdComments from '@/components/page-component/goods/bd-comments.vue';
     import appClose from '@/components/basic-component/app-close/app-close.vue';
-
+	 import uOpenPic from '@/components/page-component/goods/u-open-pic.vue';
     export default {
         name: "goods",
         components: {
+			uOpenPic,
             appGoodsBanner,
             'app-goods-recommend': appGoodsRecommend,
             'app-quick-navigation': appQuickNavigation,
@@ -240,6 +265,8 @@
         },
         data() {
             return {
+				type:'video',
+				showOpenPic:false,
                 showClose: false,
                 is_open: 0,
                 goods: null,
@@ -263,6 +290,7 @@
                 services: null,
                 // 商品详情
                 detail: null,
+				after_detail:null,
                 // 商品ID
                 goodsId: null,
                 // 套餐组合
@@ -371,6 +399,8 @@
             }
         },
         onLoad(options) {
+			console.log(374)
+			console.log(options)
             // #ifdef MP-WEIXIN
             wx.showShareMenu({
                 menus: ['shareAppMessage', 'shareTimeline']
@@ -411,6 +441,20 @@
         },
         // #endif
         methods: {
+			openPic(){
+				if(!this.goods.open_pic||typeof this.goods.open_pic !="object"||this.goods.open_pic.length==0)
+				{
+					uni.showToast({
+						title:"主人还没有上传开箱图片",
+						icon:"none"
+					})
+					return;
+				}
+				this.showOpenPic=true;
+			},
+			closeOpenPic(e){
+				this.showOpenPic=e;
+			},
             getMall(e) {
                 this.is_open = e.is_open;
             },
@@ -455,6 +499,9 @@
                 })
             },
             loadData(id) {
+				console.log(458)
+				console.log('loadData')
+				console.log(id)
                 this.$showLoading();
                 this.$request({
                     url: this.$api.goods.detail,
@@ -465,7 +512,7 @@
                     this.$hideLoading();
                     if (response.code === 0) {
                         let { services,
-                            detail, name,
+                            detail, after_detail,name,
                             vip_card_appoint, plugin_extra, id,
                             goods_activity, goods_marketing_award,
                             goods_marketing, express,
@@ -487,7 +534,8 @@
                         this.goods = response.data.goods;
                         this.services = services;
                         this.detail = detail;
-                        this.goodsId = id;
+						this.after_detail=after_detail;
+                        this.goodsId = id; 
                         this.flash_sale = plugin_extra.flash_sale;
                         this.composition = plugin_extra.composition;
                         this.goods_marketing_award = goods_marketing_award;
@@ -588,7 +636,19 @@
                     });
                     return;
                 }
-                this.attrShow = true;
+				if (this.$user.isLogin() && this.$store.state.user.info) {
+				    let  member_level =this.$store.state.user.info.identity.member_level;
+					if(member_level<this.goods.member_level){
+						uni.showToast({
+						    title: '您的会员等级未达到'+this.goods.member_name+',继续加油哟。。。',
+						    icon: 'none'
+						});
+						return;
+					}
+					
+				}
+				 this.attrShow = true;
+               
             },
 			setCoupon(index) {
 				this.$set(this.goods_coupon_center[index], 'is_receive', 1);
@@ -741,4 +801,17 @@
     .ecard-text {
         color: #999999;
     }
+	.banner_btn{
+		width: 64px;
+		height: 22px;
+		line-height: 20px;
+		background: #fff;
+		border-radius: 28px; 
+		text-align: center;
+		font-size: 14px;
+	}
+	.active{ 
+		color:#fff;
+		background: linear-gradient(#ff6404,#f21c1c); 
+	}
 </style>

+ 3 - 1
pages/goods/list.vue

xqd xqd
@@ -115,7 +115,7 @@
 
 			},
             // 数据请求
-            async request(status) {
+            async request(status) { 
                 const res = await this.$request({
 	                url: this.$api.default.goods_list,
 	                method: 'get',
@@ -138,6 +138,8 @@
                         this.goods_list.push(...res.data.list);
                         // this.oldList.push(...res.data.list);
                     }
+					// console.log(142)
+					// console.log(this.goods_list)
                     if (this.page === 1 && this.page_count === 1) {
                         this.noGoods = true;
                     }

+ 149 - 0
pages/goods/priceMove.vue

xqd
@@ -0,0 +1,149 @@
+<template>
+	<view class="bg-wh" style="background-color: #FFFFFF;">
+		<view class="bd-name u-line-2 text-center margin-top">{{title}}</view>
+		<view class="qiun-columns">
+				<view class="qiun-charts" >
+	<!-- 	<uchar  canvasId="priceLine" :maxy="max" :opts="opts" chartType="liney"></uchar> -->
+				<canvas :id="canvasId" :canvasId="canvasId" :style="{'width':cWidth*pixelRatio+'px','height':cHeight*pixelRatio+'px', 'transform': 'scale('+(1/pixelRatio)+')','margin-left':-cWidth*(pixelRatio-1)/2+'px','margin-top':-cHeight*(pixelRatio-1)/2+'px'}"></canvas>
+				
+				</view>
+			</view>
+	</view>
+</template>
+
+<script>
+	import {mapGetters, mapState} from "vuex";
+	import uCharts from "../../components/u-charts/u-charts.min.js"
+	export default {
+		components: {
+		   
+		},
+		data() {
+			return {
+				title:'',
+				canvasId:'priceLine',
+				max:180,
+				pixelRatio:1,
+				cWidth:375,
+				cHeight:250,
+				canvases:null,
+				opts:{
+					categories:[],
+					series:[{
+							name:"价格曲线",
+							data:[],
+							color:'#409eff'
+						}]
+				}
+			};
+		},
+		onLoad(options){
+			 //this.$refs.priceLine.init();
+			 uni.setNavigationBarTitle({
+			 	title:"价格走势"
+			 })
+			 this.title=options.title
+			 this.getData(options.id,options.signid)
+		},
+		methods:{
+			getData(goods_id,sign_id){
+				let that=this;
+				this.$request({
+				    url: this.$api.goods.PriceMove,
+				    data: {
+				        goods_id: goods_id,
+						sign_id:sign_id
+				    }
+				}).then(response => {
+				    this.$hideLoading();
+				    if (response.code === 0) {
+						
+				       that.max=response.data.max;
+					   let categories=[];
+					   let seriesData=[];
+					   response.data.priceMove.forEach((value)=>{
+						   let tempTime=value.created_at.split(" ")[0];
+						   let time=tempTime.split("-");
+						   categories.push(time[1]+'/'+time[2])
+						   seriesData.push(value.price)
+					   })
+					   that.categories=categories;
+					   that.series= [{
+							name:"价格曲线",
+							data:seriesData,
+							color:'#409eff'
+						}]
+						that.canvases = new uCharts({
+						$this: that,
+						canvasId: that.canvasId,
+						type: 'line',
+						fontSize: 11,
+						legend: true,
+						dataLabel: true,
+						dataPointShape: true,
+						background: '#FFFFFF',
+						pixelRatio: 1,
+						categories: that.categories,
+						series: that.series,
+						animation: true,
+						enableScroll: true,
+						xAxis: {
+							type: 'grid',
+							gridColor: '#CCCCCC',
+							gridType: 'dash',
+							dashLength: 8,
+							itemCount: that.categories.length,
+							scrollShow: true
+						},
+						yAxis: {
+							gridType: 'dash',
+							gridColor: '#CCCCCC',
+							dashLength: 8,
+							splitNumber: 6,
+							min: 10,
+							max: that.max,
+							format: (val) => {
+								return '¥'+val.toFixed(0) 
+							}
+						},
+						width: 375,
+						height: 250 ,
+						extra: {
+							line: {
+								type: 'straight'
+							}
+						}
+					});
+					  
+				    } else {
+				        uni.showToast({
+				            title: response.msg,
+				            icon: 'none'
+				        });
+				    }
+				}).catch(() => {
+				    this.$hideLoading();
+				});
+			}
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	page{
+		background-color: #FFFFFF;
+	}
+	.qiun-charts {
+		width: 750upx;
+		height: 500upx;
+		background-color: #FFFFFF;
+		bottom:100upx;
+		position: absolute;
+	}
+	
+	.charts {
+		width: 750upx;
+		height: 500upx;
+		background-color: #FFFFFF;
+	}
+</style>

+ 24 - 7
pages/order-submit/app-submit-goods.vue

xqd xqd xqd xqd
@@ -1,25 +1,29 @@
 <template>
-    <view class="app-submit-goods">
-
+    <view class="app-submit-goods"> 
         <view v-if="plugin !== 'composition'"
               class="app-submit-goods-item">
             <view v-for="(goodsItem, goodsIndex) in list.goods_list" :key="goodsIndex"
                   class="goods-item">
-                <view class="dir-left-nowrap">
+                <view class="dir-left-nowrap"> 
                     <view class="box-grow-0" style="position: relative;">
                         <view v-if="goodsItem.address_disabled === true" class="address-disabled">不在配送范围内</view>
                         <image class="goods-image"
                                :src="goodsItem.goods_attr.pic_url ? goodsItem.goods_attr.pic_url : goodsItem.cover_pic"></image>
                     </view>
-                    <view class="box-grow-1 dir-top-nowrap">
+                    <view class="box-grow-1 dir-top-nowrap">  
                         <view class="goods-name box-grow-1">{{goodsItem.name}}</view>
-                        <view class="box-grow-0">
+                        <view class="box-grow-0"> 
                             <view class="dir-left-wrap attr-list">
                                 <view v-for="(attrItem,attrIndex) in goodsItem.attr_list"
                                       :key="attrIndex"
                                       class="attr-item">
                                     {{attrItem.attr_group_name}}:{{attrItem.attr_name}}
-                                </view>
+                                </view> 
+								<view v-for="(attrItem,attrIndex) in goodsItem.screenList"
+								      :key="attrIndex"
+								      class="attr-item">
+								    {{attrItem.attr_group_name}}:{{attrItem.attr_name}}
+								</view>
                             </view>
                             <view class="dir-left-nowrap">
                                 <view class="box-grow-1 goods-num">×{{goodsItem.num}}</view>
@@ -35,6 +39,15 @@
                                 </view>
                             </view>
                         </view>
+						<view class="screen" v-if="goodsItem.service_list&&JSON.stringify(goodsItem.service_list)!='[]'&&JSON.stringify(goodsItem.service_list)!='{}'" style="display:flex;justify-content: space-between;margin-top:4px;" :data="goodsItem.service_list.id">
+							<view class="screen_left" style="font-size: 24rpx;color: #999999;">×1
+								<text class="goods-price-unit" style="padding-left:10px;">{{goodsItem.service_list.name}}{{goodsItem.service_list.year}}年{{goodsItem.service_list.price}}元</text>  
+							</view>
+							<view class="screen_right">
+								<text class="goods-price-unit">¥</text> 
+								{{goodsItem.service_list.price}}  
+							</view>
+						</view>  
                     </view>
                 </view>
                 <view v-for="(discount,discountIndex) in goodsItem.discounts"
@@ -69,7 +82,7 @@
                                           class="attr-item">
                                         {{attrItem.attr_group_name}}:{{attrItem.attr_name}}
                                     </view>
-                                </view>
+                                </view> 
                                 <view class="dir-left-nowrap goods-other">
                                     <view class="box-grow-1 goods-num">×{{goodsItem.num}}</view>
                                     <view v-if="compositionItem.type == 2" class="box-grow-0 goods-price-info">
@@ -131,6 +144,10 @@
         data() {
             return {}
         },
+		mounted(){
+			console.log(141)
+			console.log(this.list.goods_list[0].attr_list)
+		},
         computed: {
             ...mapState({
                 appImg: state => state.mallConfig.__wxapp_img,

+ 31 - 3
pages/order-submit/order-submit.vue

xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd
@@ -112,7 +112,9 @@
                   <view>以下商品满{{mch.pick_up_price}}元起送</view>
                 </view>
                 <app-submit-goods :theme="theme" v-on:updateList="updateList" :index="mchIndex" :plugin="plugin" :list="mch"></app-submit-goods>
-                <view class="line"></view>
+                
+				
+				<view class="line"></view>
                 <template v-if="(mch.coupon && mch.coupon.enabled) ||
                                 (mch.member_discount > 0 || mch.member_discount < 0) ||
                                 (mch.integral && mch.integral.can_use) ||
@@ -292,7 +294,7 @@
                             <view v-for="(discount,discountIndex) in subGoodsItem.discounts" :key="discountIndex" style="text-align: right" :class="theme + '-m-text ' + theme">
                               {{discount.name}}: {{discount.value}}
                             </view>
-                          </view>
+                          </view> 
                         </view>
                       </view>
                     </view>
@@ -305,6 +307,7 @@
             </view>
           </view>
         </view>
+		
         <!-- 结算底栏 -->
         <view class="submit-bar dir-left-nowrap safe-area-inset-bottom" v-if="previewData">
             <view class="box-grow-1 cross-center u-submit-bar-height">
@@ -386,6 +389,12 @@ export default {
             mchList: '',
         };
     },
+	mounted(){
+		setTimeout(()=>{
+			console.log(393)
+			console.log(this.previewData.mch_list)
+		},2000) 
+	},
     computed: {
         ...mapState({
             appImg: state => state.mallConfig.__wxapp_img,
@@ -413,13 +422,19 @@ export default {
     },
     onLoad(options) {
         let mchList = JSON.parse(options.mch_list);
+		console.log(416)
+		console.log(mchList)
         let list = [];
         for(let item of mchList) {
             if(item.mch_id > 0) {
                 list.push(item.mch_id)
             }
         }
+		console.log(list)
         this.mchList = JSON.stringify(list);
+		
+		 
+		
         if (this.submitLock) return;
         this.setFormData(options);
         this.$event.on(this.$const.EVENT_USER_LOGIN).then(() => {
@@ -513,6 +528,8 @@ export default {
             this.$store.commit('orderSubmit/mutSetFormData', formData);
         },
         setFormData(options) {
+			console.log(529)
+			console.log(options)
             this.previewUrl = decodeURIComponent(options.preview_url || this.$api.order.preview);
             this.submitUrl = decodeURIComponent(options.submit_url || this.$api.order.submit);
             this.plugin = options.plugin || null;
@@ -524,7 +541,8 @@ export default {
             if (this.showPayResult === 'true') this.showPayResult = true;
             if (this.showPayResult === 'false') this.showPayResult = false;
             const list = JSON.parse(options.mch_list);
-
+			console.log(list)
+			
             // 商户列表先做下排序,主商城必须在最前
             for (let i in list) {
                 if (parseInt(list[i].mch_id) === 0) {
@@ -545,6 +563,8 @@ export default {
                     list[i].goods_list[j].cart_id = list[i].goods_list[j].cart_id || 0;
                 }
             }
+			console.log(564)
+			console.log(list)
             this.$store.commit('orderSubmit/mutSetFormData', {
                 list: list,
                 address_id: 0,
@@ -556,6 +576,9 @@ export default {
                 mask: true,
                 title: '加载中',
             });
+			console.log(578)
+			console.log(this.$store.state.orderSubmit)
+			console.log(this.previewUrl)
             this.$request({
                 url: this.previewUrl,
                 method: 'post',
@@ -566,18 +589,23 @@ export default {
                 this.loadingPreviewData = false;
                 uni.hideLoading();
                 if (response.code === 0) {
+					console.log(591)
+					console.log(response)
                     if (response.data.allZiti && !response.data.address) {
                         response.data.address = {
                             name: '',
                             mobile: '',
                         };
                     }
+					console.log(response.data.mch_list)
                     for (let i in response.data.mch_list) {
                         response.data.mch_list[i].showCouponPicker = false;
                         response.data.mch_list[i].noCoupons = false;
                         response.data.mch_list[i].showInsertRows = false;
                     }
                     this.previewData = response.data;
+					console.log(606)
+					console.log(this.previewData) 
                     this.setDiyFormScrollStatus();
                     this.checkCouponError();
                     this.updateStoreDistance();

+ 1 - 1
pages/order/index/index.vue

xqd
@@ -30,7 +30,7 @@
                                     </template>
                                 </view>
                                 <view v-for='(dItem, dIndex) in item.detail' :key='dIndex' class='view-2'>
-                                    <app-order-goods-info :goods='dItem.goods_info' :plugin-data="item.plugin_data" :plugin-index="dIndex"></app-order-goods-info>
+                                    <app-order-goods-info :goods='dItem.goods_info' :service_data="dItem.service_data" :plugin-data="item.plugin_data" :plugin-index="dIndex"></app-order-goods-info>
                                 </view>
                             </view>
                         </app-jump-button>

+ 14 - 1
pages/order/order-detail/order-detail.vue

xqd xqd
@@ -204,6 +204,11 @@
                                 }}抵扣¥{{ orderDetail.advance_order.swell_deposit }}
                             </text>
                         </view>
+						<view class="item-box">
+						    <view class="dir-left-nowrap item ">
+						        <text class='box-grow-1' style="color: #ff4544;font-size: 24rpx;">阶段一</text>
+						    </view> 
+						</view>
                         <view class="item-box">
                             <view class="dir-left-nowrap item ">
                                 <text class='box-grow-1' style="color: #ff4544;font-size: 24rpx;">阶段一</text>
@@ -295,7 +300,15 @@
                     <view v-if="orderDetail.plugin_data.exchange_count >= 0" class='dir-left-nowrap item'>
                         <view class='box-grow-1'>兑换金额</view>
                         <view class='box-grow-0'>¥{{ orderDetail.total_goods_original_price }}</view>
-                    </view>
+                    </view> 
+					<view class='dir-left-nowrap item' v-for="(item,index) of orderDetail.detail" v-if="orderDetail.sign !== 'advance' && orderDetail.goods_type === 'goods'">
+						<view 
+							style="justify-content: space-between;display:flex;width:100%;"
+							v-if="JSON.stringify(item.service_data)!='[]'&&JSON.stringify(item.service_data)!='{}'">
+							<view class='box-grow-1'>碎屏险</view>
+							<view class='box-grow-0'>¥{{ item.service_data.price }}</view> 
+						</view>
+					</view>
                     <view class='dir-left-nowrap item' v-if="orderDetail.sign !== 'advance' && orderDetail.goods_type === 'goods'">
                         <view class='box-grow-1'>运费</view>
                         <view class='box-grow-0'>¥{{ orderDetail.express_price }}</view>

+ 196 - 0
pages/priceTell/priceTell.vue

xqd
@@ -0,0 +1,196 @@
+<template>
+	<app-layout>
+		<view class="bd-subtitle "  style="padding-left:30rpx;padding-right:30rpx;line-height:36rpx;">当前商品价格低于您设置的价格时,我们会以消息推送的方式通知您,只会通知一次,不会影响您正常使用。</view>
+		
+	    <view class="app-view margin-top" style="margin-top: 50upx;">
+
+	        <view class="app-line app-border cross-center">
+	            <text class="app-text box-grow-0">当前价格</text>
+				<text class="address-input " style="color: #FF4544;">¥{{nowPrice}} </text>
+	        </view>
+	        <view class="app-line app-border  cross-center">
+	            <text class="app-text box-grow-0">期望价格</text>
+	            <input class="address-input" type="text" placeholder="低于此价格会通知你" v-model="form.price"/>
+	        </view>
+			<view class="app-line app-border  cross-center">
+			    <text class="app-text box-grow-0">短信通知</text>
+			    <input class="address-input" type="number" placeholder="输入电话号码" v-model="form.mobile"/>
+			</view>
+	     </view>
+	    <view class="app-button">
+	        <app-button @click="submit" :theme="getTheme" arrangement="row" type="important"  width="90%">
+	            <text class="app-text">确定</text>
+	        </app-button>
+	    </view>
+	</app-layout>
+</template>
+
+<script>
+	import {mapGetters, mapState} from "vuex";
+	
+	export default {
+		name: "priceTell",
+		computed: {
+		    ...mapGetters('mallConfig', {
+		        getTheme: 'getTheme',
+		    }),
+		},
+		data() {
+			return {
+				nowPrice:10,
+				form: {
+				    price: '',
+				    mobile: ''
+				},
+				goods_id:0,
+				attr_id:0
+				
+			};
+		},
+		onLoad(options){
+			this.nowPrice=options.price
+			this.goods_id=options.id
+			this.attr_id=options.attrid
+			this.getDetail(options.id,options.attrid);
+		},
+		methods:{
+			getDetail(goods_id,attr_id){
+				let user_id = 0;
+				if (this.$user.isLogin() && this.$store.state.user.info) {
+				    user_id = this.$store.state.user.info.options.user_id;
+					let that=this;
+					this.$request({
+					    url: this.$api.goods.GetPriceTell,
+					    data: {
+					        goods_id: goods_id,
+							attr_id:attr_id,
+							user_id:user_id
+					    }
+					}).then(response => {
+					    this.$hideLoading();
+					    if (response.code === 0) {
+							that.form.price=response.data.price
+							that.form.mobile=response.data.mobile
+					     
+						  
+					    } else {
+			
+							console.log( response.msg)
+					    }
+					}).catch(() => {
+					    this.$hideLoading();
+					});
+					
+				}
+			},
+		submit() {
+			if(this.form.price===''){
+				uni.showToast({
+					title:"请输入期望价格",
+					icon:"none"
+				})
+				return;
+			}
+			if(this.form.mobile===''||this.form.mobile.length!=11){
+				uni.showToast({
+					title:"请输入正确的手机价格",
+					icon:"none"
+				})
+				return;
+			}
+			if (this.$user.isLogin() && this.$store.state.user.info) {
+				console.log(this.$store.state.user.info)
+			   let user_id = this.$store.state.user.info.options.user_id;
+			   let	mall_id= this.$store.state.user.info.options.mall_id;
+				let that=this;
+				this.$request({
+				    url: this.$api.goods.UpdatePriceTell,
+				    data: {
+				        goods_id: that.goods_id,
+						attr_id:that.attr_id,
+						user_id:user_id,
+						mall_id:mall_id,
+						mobile:that.form.mobile,
+						price:String(that.form.price)
+				    }
+				}).then(response => {
+				    this.$hideLoading();
+				    if (response.code === 0) {
+						uni.showToast({title: "提交成功", icon: 'none'});
+						setTimeout(()=>{
+							uni.navigateBack({delta: 1});
+						},1000)
+						
+				     
+					  
+				    } else {
+						uni.showToast({title: response.msg, icon: 'fail'});
+				    }
+				}).catch(() => {
+				    this.$hideLoading();
+				});
+				
+			}
+			
+			},
+		}
+	}
+</script>
+
+<style lang="scss">
+ .bd-subtitle {
+        margin-top: 23upx;
+        font-size: 24upx;
+        line-height: 34upx;
+        color: #999999;
+    }
+	.address-input {
+	    width: #{580rpx};
+	    font-size: #{28rpx};
+	    color: #353535;
+	}
+	.app-view {
+	    background: #f7f7f7;
+	    .app-line {
+	        background-color: #ffffff;
+	        height: #{99rpx};
+	        line-height: #{99rpx};
+	        padding: #{0 24upx};
+	        text.app-text {
+	            font-size: #{28rpx};
+	            color: $uni-important-color-black;
+	            width: #{124rpx};
+	        }
+	    }
+	
+	    .app-border {
+	        border-bottom: #{1rpx} solid $uni-weak-color-one;
+	    }
+	
+	    .c-address {
+	        padding-right: #{24rpx};
+	        font-size: #{28rpx};
+	        color: #353535;
+	    }
+	
+	    .icon-arrow-image {
+	        width: #{12rpx};
+	        height: #{24rpx};
+	        background-image: url("../../static/image/icon/arrow-right.png");
+	        background-size: 100% auto;
+	        background-repeat: no-repeat;
+	    }
+	
+	    .tip {
+	        padding: #{0 24rpx 24rpx 24rpx};
+	        background: #ffffff;
+	        color: #b7b7b7;
+	    }
+	}
+	.app-button {
+	   bottom: 20upx;
+	   position: absolute;
+	   width: 100%;
+	   
+	}
+</style>

+ 374 - 0
pages/sp/clerk/clerk.vue

xqd
@@ -0,0 +1,374 @@
+<template>
+    <app-layout>
+        <view class="box">
+            <view class="item">
+                <view class='order-info' v-if="detail.name">
+                    <view class='dir-left-nowrap'>
+                        <view class='info-label'>收货人:</view>
+                        <view>
+                            <view>{{detail.name}}</view>
+                        </view>
+                    </view>
+                    <view class='dir-left-nowrap'>
+                        <view class='info-label'>联系方式:</view>
+                        <view>
+                            <view>{{detail.mobile}}</view>
+                        </view>
+                    </view>
+                </view>
+                <view class="card-info">
+                    <image class="card-img" :src='detail.pic_url'></image>
+                    <view class="card-name t-omit-two">{{detail.card_name}}</view>
+                    <view class='card-other'>
+                        <view class='other-label'>有效时间</view>
+                        <view>{{detail.start_time}} - {{detail.end_time}}</view>
+                        <view class='other-label'>发放时间</view>
+                        <view>{{detail.created_at}}</view>
+                        <view class='other-label'>使用说明</view>
+                        <text>{{detail.content}}</text>
+                    </view>
+                </view>
+                <view class='order-info'>
+                    <view style="margin-bottom: 24rpx;">核销信息</view>
+                    <view class='dir-left-nowrap'>
+                        <view class='info-label'>剩余次数:</view>
+                        <view>
+                            <view>{{detail.number - detail.use_number}}次</view>
+                        </view>
+                    </view>
+                    <view class='dir-left-nowrap'>
+                        <view class='info-label'>已核销次数:</view>
+                        <view>
+                            <view>{{detail.use_number}}次</view>
+                        </view>
+                    </view>
+                    <view class='dir-left-nowrap'>
+                        <view class='info-label'>总次数:</view>
+                        <view>
+                            <view>{{detail.number}}次</view>
+                        </view>
+                    </view>
+                </view>
+            </view>
+            <view v-if="detail.is_use == 0 && detail.receive_id == 0" class='bottom cross-center'>
+                <view @click='submit=true'>
+                    <button class="submit-btn">核销碎屏险</button>
+                </view>
+            </view>
+        </view>
+        <view v-if="msg || submit" class='bg cross-center main-center' @touchmove.stop.prevent="">
+            <view class='dialog'>
+                <view class="title">{{submit ? '输入本次核销次数' : '提示'}}</view>
+                <view v-if="msg" class='dialog-content'>{{msg}}</view>
+                <view v-if="submit" class='dialog-content'>
+                    <input v-model="useNumber" class="input-number" type="number"/>次
+                </view>
+                <view v-if="msg" @click='closeDialog' class='dialog-btn'>确认</view>
+                <view v-if="submit" class='dialog-btn main-center cross-center'>
+                    <view @click='submit=false' style='color:#666666;width: 50%'>取消</view>
+                    <view class="line"></view>
+                    <view style='width: 50%' @click='clerk'>确定</view>
+                </view>
+            </view>
+        </view>
+    </app-layout>
+</template>
+
+<script>
+    export default {
+        data() {
+            return {
+                detail: {
+                    start_time: '',
+                    end_time: ''
+                },
+                msg: null,
+                is_clerk: 0,
+                submit: false,
+                cardId: null,
+                surplus_number: 0,
+                useNumber: '',
+                qrCodeId: -1,
+            }
+        },
+        name: "clerk",
+        methods: {
+            getList(id) {
+                let that = this;
+                that.$showLoading({
+                    text: '加载中...'
+                });
+                that.$request({
+                    url: that.$api.card.detailsp,
+                    data: {
+                        cardId: id,
+                        qr_code_id: that.qrCodeId,
+                    },
+                }).then(response=>{
+                    that.$hideLoading();
+                    if(response.code === 0) {
+                        that.detail = response.data.card;
+                        that.cardId = id;
+                    } else {
+                        uni.showToast({
+                            title: response.msg,
+                            icon: 'none',
+                            duration: 1000,
+                        });
+                    }
+
+                    if (that.detail.clerk_number && that.detail.clerk_number >= 1) {
+                        uni.showModal({
+                            title: '提示',
+                            content: '核销码已失效',
+                            showCancel: false,
+                            complete: function(res) {
+                                uni.navigateBack();
+                            }
+                        });
+                    };
+                }).catch(() => {
+                    that.$hideLoading();
+                });
+            },
+            clerk() {
+                let that = this;
+                uni.showLoading({
+                    title: '核销中...'
+                });
+
+                if (!that.useNumber) {
+                    uni.showToast({
+                        title: '请输入核销次数',
+                        icon: 'none',
+                        duration: 2000,
+                    });
+                    return false;
+                }
+
+                that.$request({
+                    url: that.$api.card.clerksp,
+                    data: {
+                        cardId: that.cardId,
+                        use_number: that.useNumber,
+                        qr_code_id: that.qrCodeId,
+                    },
+                }).then(response=>{
+                    uni.hideLoading();
+                    if(response.code === 0) {
+                        that.is_clerk = response.data.is_clerk;
+                        that.msg = response.msg;
+                        that.submit = false;
+                        that.surplus_number = response.data.surplus_number;
+                    } else {
+                        uni.showToast({
+                            title: response.msg,
+                            icon: 'none',
+                            duration: 2000,
+                        });
+                    }
+                }).catch(() => {
+                    uni.hideLoading();
+                });
+            },
+            closeDialog() {
+                if (this.msg) {
+                    this.msg = ''
+                    if (this.is_clerk) {
+                        let url = '';
+                        if (this.surplus_number > 0) {
+                            url = '/plugins/clerk/order/order?status=2&type=0';
+                        } else {
+                            url = '/plugins/clerk/order/order?status=2&type=1';
+                        }
+                        uni.navigateBack({});
+//                        uni.redirectTo({
+//                            url: url
+//                        })
+                    }
+                } else {
+                    this.msg = ''
+                }
+            },
+        },
+        onLoad(options) {
+            if(options.qr_code_id) {
+                this.qrCodeId = options.qr_code_id;
+            }
+            this.getList(options.cardId);
+        }
+    }
+</script>
+
+<style scoped lang="scss">
+
+    .box {
+        display: flex;
+        flex-direction: column;
+
+        .item {
+            margin-bottom: 140#{rpx};
+        }
+    }
+    .card-info {
+        margin: 0 24#{rpx};
+        border-radius: #{15rpx};
+        background-color: #fff;
+        position: relative;
+        margin-top: #{70rpx};
+        text-align: center;
+        padding: #{80rpx} #{24rpx} #{36rpx};
+        margin-bottom: #{20rpx};
+    }
+
+    .card-img {
+        height: #{88rpx};
+        width: #{88rpx};
+        position: absolute;
+        left: 0;
+        right: 0;
+        margin: 0 auto;
+        top: #{-44rpx};
+        border-radius: #{44rpx};
+    }
+
+    .card-name {
+        font-size: #{46rpx};
+        max-width: 70%;
+        color: #353535;
+        margin: 0 auto #{38rpx};
+    }
+
+    .card-status {
+        width: #{160rpx};
+        height: #{60rpx};
+        position: absolute;
+        bottom: #{30rpx};
+        left: 0;
+        right: 0;
+        margin: 0 auto;
+        line-height: #{60rpx};
+        font-size: 15px;
+        border-radius: #{30rpx};
+        background-color: #FEEEEE;
+        color: #FF4544;
+    }
+
+    .card-about {
+        padding: #{40rpx};
+        width: 90%;
+        margin: 0 auto #{50rpx};
+        border-radius: #{15rpx};
+        background-color: #fff;
+        font-size: 15px;
+    }
+
+    .about-title {
+        color: #999999;
+        margin-bottom: #{40rpx};
+    }
+
+    .submit-btn {
+        width: #{702rpx};
+        height: #{88rpx};
+        margin: 0 auto;
+        padding: 0;
+        text-align: center;
+        line-height: #{88rpx};
+        border-radius: #{44rpx};
+        background-color: #ff4544;
+        color: #fff;
+        font-size: #{32rpx};
+    }
+
+    .bottom {
+        position: fixed;
+        bottom: 0;
+        height: #{140rpx};
+        width: 100%;
+        padding: 0 #{24rpx};
+        border-top: #{1rpx} solid #e2e2e2;
+        background: #ffffff;
+    }
+
+    .order-info {
+        width: #{702rpx};
+        margin: #{24rpx};
+        background-color: #fff;
+        border-radius: #{16rpx};
+        padding: #{28rpx} #{24rpx};
+        font-size: #{28rpx};
+        color: #353535;
+    }
+
+    .info-label {
+        color: #999999;
+    }
+
+    .card-other {
+        text-align: left;
+        font-size: #{28rpx};
+        color: #353535;
+        border-top: #{1rpx} solid #e2e2e2;
+    }
+
+    .other-label {
+        color: #999999;
+        margin: #{30rpx} 0 #{22rpx};
+    }
+
+    .bg {
+        position: fixed;
+        top: 0;
+        left: 0;
+        width: 100%;
+        height: 100%;
+        background-color: rgba(0, 0, 0, .3);
+        z-index: 1000;
+    }
+
+    .dialog {
+        width: #{630rpx};
+        background-color: #fff;
+        padding-top: #{40rpx};
+        border-radius: #{16rpx};
+        font-size: #{32rpx};
+        color: #353535;
+        text-align: center;
+
+        .title {
+            font-size: 32#{rpx};
+            color: #353535;
+            margin-bottom:40#{rpx};
+        }
+    }
+
+    .dialog-content {
+        margin: #{40rpx};
+        display: flex;
+        justify-content:center;
+        align-items: center;
+
+        .input-number {
+            width: 288#{rpx};
+            background: #f7f7f7;
+            border-radius: 16#{rpx};
+            height: 80#{rpx};
+            margin-right: 16#{rpx};
+            line-height: 80#{rpx};
+        }
+    }
+
+    .dialog-btn {
+        color: #ff4544;
+        height: #{88rpx};
+        line-height: #{88rpx};
+        border-top: #{1rpx} solid #e2e2e2;
+    }
+
+    .line {
+        height: #{45rpx};
+        width:#{1rpx};
+        background-color:#e2e2e2;
+    }
+</style>

+ 290 - 0
pages/sp/components/app-card-detail.vue

xqd
@@ -0,0 +1,290 @@
+<template>
+    <view class="page">
+        <view class="view" v-if="list">
+            <view class='card'>
+                <image class='card-img' :src='list.pic_url'></image>
+                <view class='card-name'>{{list.card_name}}</view>
+                <view class="dir-left-nowrap main-center" v-if="list.status == 0">
+                    <view class="over over-lg dir-left-nowrap cross-top box-grow-0">
+                        <image src="/static/image/icon/icon_ok.png" class="icon_ok box-grow-0"></image>
+                        <view class="box-grow-1" style="height: 100%;">
+                            <view>已转赠给:{{list.receive_user_name}}</view>
+                        </view>
+                        <image src="/static/image/card/img_seal.png" class="img_seal"></image>
+                    </view>
+                </view>
+                <view class="qr" v-else-if="list.status == 1">
+                    <view class="give-btn" :class="theme + ' ' + theme + '-m-text ' + theme + '-m-border'"
+                        v-if="list.is_allow_send == 1"
+                          @click="shareShow = true">转赠
+                    </view>
+                    <image :src='file_path' v-if="list.is_use === 0"></image>
+                    <view>
+                        <app-share-qr-code v-model="shareShow" title="生成碎屏险海报"
+                                           :poster-url="`/pages/poster/poster?card_id=` + list.id"
+                                           :has-poster-nav="true" :is-show-friend="list.is_allow_send == 1"
+                        ></app-share-qr-code>
+                    </view>
+                </view>
+                <view class="over" v-else-if="list.status == 2">已使用</view>
+                <view class="over" v-else>已过期</view>
+            </view>
+            <view class='line'>
+                <image src='/static/image/icon/line.png'></image>
+            </view>
+            <view class='explain use-time' v-if="list.is_show_history">
+                <view class='explain-title'>核销时间</view>
+                <view class="clerk-history">
+                    <view>{{list.clerked_at}}</view>
+                    <view @click="isShow = true" class="history-button">查看历史</view>
+                </view>
+            </view>
+            <view class='explain use-time'>
+                <view class='explain-title'>有效时间</view>
+                <view>{{list.start_time}} - {{list.end_time}}</view>
+            </view>
+            <view class='explain card-info'>
+                <view class='explain-title'>使用说明</view>
+                <view>
+                    <text style="word-break: break-all;">{{list.content}}</text>
+                </view>
+            </view>
+            <view class='explain card-info-2'>
+                <view class='explain-title'>核销信息</view>
+                <view class="clerk-info">
+                    <view class="clerk-item">
+                        <view>剩余次数:</view>
+                        <view>{{list.number - list.use_number}}次</view>
+                    </view>
+                    <view class="clerk-item">
+                        <view>已核销次数:</view>
+                        <view>{{list.use_number}}次</view>
+                    </view>
+                    <view class="clerk-item">
+                        <view>总次数:</view>
+                        <view>{{list.number}}次</view>
+                    </view>
+                </view>
+            </view>
+        </view>
+        <app-clerk-historys :user-card-id="list.id" :is-show.sync="isShow"></app-clerk-historys>
+    </view>
+</template>
+
+<script>
+    import {mapState} from "vuex";
+    import {mapGetters} from "vuex";
+    import appClerkHistorys from '../../../components/page-component/app-clerk-historys/app-clerk-historys.vue';
+    import appShareQrCode
+        from '../../../components/page-component/app-share-qr-code-poster/app-share-qr-code-poster.vue';
+
+    export default {
+        name: "app-card-detail",
+        components: {appClerkHistorys, appShareQrCode},
+        props: {
+            list: {
+                type: Object | null,
+                default() {
+                    return null
+                }
+            },
+        },
+        data() {
+            return {
+                isShow: false,
+                shareShow: false,
+                file_path: '',
+            }
+        },
+        computed: {
+            ...mapGetters('mallConfig', {
+                theme: 'getTheme',
+            }),
+        },
+        watch: {
+            list() {
+                if (this.list.status == 1) {
+                    this.$request({
+                        url: this.$api.card.sqrcode,
+                        data: {
+                            cardId: this.list.id,
+                        },
+                    }).then(response=>{
+                        if(response.code === 0) {
+                            this.file_path = response.data.file_path;
+                        }else {
+                            uni.showToast({
+                                title: response.msg,
+                                icon: 'none',
+                                duration: 1000,
+                            });
+                        }
+                    }).catch(() => {
+                    });
+                }
+            }
+        }
+    }
+</script>
+
+<style scoped lang="scss">
+    .page {
+        min-height: 100vh;
+        background-color: #ff7b33;
+        width: 100%;
+    }
+
+    .view {
+        background-color: #ff7b33;
+        padding: #{72rpx} #{24rpx};
+        position: relative;
+    }
+
+    .card {
+        background-color: #fff;
+        border-top-left-radius: #{16rpx};
+        border-top-right-radius: #{16rpx};
+        padding: #{90rpx} #{40rpx} #{24rpx};
+    }
+
+    .card-info {
+        background-color: #fff;
+    }
+
+    .card-img {
+        position: absolute;
+        top: #{32rpx};
+        left: 50%;
+        margin-left: #{-44rpx};
+        height: #{88rpx};
+        width: #{88rpx};
+        border-radius: 50%;
+    }
+
+    .card-name {
+        text-align: center;
+        font-size: #{50rpx};
+        margin-bottom: #{31rpx};
+        color: #353535;
+    }
+
+    .over {
+        width: #{240rpx};
+        height: #{64rpx};
+        text-align: center;
+        color: #999;
+        font-size: #{30rpx};
+        line-height: #{64rpx};
+        border-radius: #{32rpx};
+        background-color: #f7f7f7;
+        margin: 0 auto;
+    }
+
+    .line {
+        height: #{48rpx};
+        width: 100%;
+    }
+
+    .line image {
+        height: 100%;
+        width: 100%;
+    }
+
+    .explain {
+        background-color: #fff;
+        padding: #{20rpx} #{40rpx};
+        font-size: #{28rpx};
+        color: #353535;
+    }
+
+    .explain.use-time {
+        padding-bottom: #{20rpx};
+    }
+
+    .explain-title {
+        font-size: #{26rpx};
+        color: #999;
+        margin-bottom: #{15rpx};
+    }
+
+    .qr {
+        width: #{400rpx};
+        display: block;
+        margin: 0 auto;
+    }
+
+    .qr image {
+        height: #{400rpx};
+        width: 100%
+    }
+
+    .clerk-info {
+        display: flex;
+        flex-direction: column;
+
+        .clerk-item {
+            display: flex;
+        }
+    }
+
+    .card-info-2 {
+        background-color: #fff;
+        border-bottom-left-radius: #{16rpx};
+        border-bottom-right-radius: #{16rpx};
+        padding-bottom: 60#{rpx};
+    }
+
+    .clerk-history {
+        display: flex;
+        align-items: center;
+
+        .history-button {
+            width: 125#{rpx};
+            height: 48#{rpx};
+            border-radius: 30#{rpx};
+            margin-left: 10#{rpx};
+            font-size: #{22rpx};
+            color: #ac450d;
+            background: #ffeda9;
+            display: flex;
+            justify-content: center;
+            align-items: center;
+        }
+    }
+
+    .over.over-lg {
+        width: auto;
+        padding: #{0 34rpx};
+        height: auto;
+        margin: 0;
+        max-width: 100%;
+    }
+
+    .over .icon_ok {
+        width: #{32rpx};
+        height: #{32rpx};
+        margin-right: #{15rpx};
+        margin-top: #{15rpx};
+    }
+
+    .give-btn {
+        width: #{240rpx};
+        height: #{64rpx};
+        line-height: #{64rpx};
+        border-radius: #{32rpx};
+        border: #{1rpx solid};
+        text-align: center;
+        transform: rotateZ(360deg);
+        margin: #{0 auto 46rpx auto};
+    }
+
+    .img_seal {
+        position: absolute;
+        bottom: #{132rpx};
+        right: #{84rpx};
+        width: #{150rpx};
+        height: #{117rpx};
+        display: block;
+    }
+</style>
+

+ 272 - 0
pages/sp/components/app-card-give.vue

xqd
@@ -0,0 +1,272 @@
+<template>
+    <view class="give" v-if="card">
+        <view class="content" :style="contentStyle">
+            <view class="avatar dir-left-nowrap main-center cross-center">
+                <image :src="card.avatar"></image>
+            </view>
+            <view class="nickname">{{card.nickname}}</view>
+            <view class="title">送你一张碎屏险</view>
+            <template v-if="card.status == 2">
+                <view class="pic dir-left-nowrap main-between cross-center">
+                    <view class="card-title box-grow-0">
+                        <image :src="card.pic_url"></image>
+                    </view>
+                    <view class="name t-omit-two box-grow-0">{{card.name}}</view>
+                    <view class="box-grow-1"></view>
+                </view>
+                <view class="reset-time">剩余次数:{{card.reset_number}}次</view>
+                <view class="time">有效期:{{card.start_time}} - {{card.end_time}}</view>
+                <view class="card-btn-group dir-left-nowrap main-center">
+                    <view class="card-btn btn-0 box-grow-0" @click="back">
+                        <app-image :img-src="card.img_back" width="100%" height="100%"></app-image>
+                    </view>
+                    <view class="card-btn btn-0 box-grow-0" @click="shareShow = true">
+                        <app-image :img-src="card.img_share" width="100%" height="100%"></app-image>
+                    </view>
+                </view>
+                <view>
+                    <app-share-qr-code v-model="shareShow" title="生成碎屏险海报"
+                                       :poster-url="`/pages/poster/poster?card_id=` + card.id"
+                                       :has-poster-nav="true"
+                    ></app-share-qr-code>
+                </view>
+            </template>
+            <view class="card-btn btn-1" v-else @click="receive">
+                <app-image :img-src="card.img_receive" width="100%" height="100%"></app-image>
+            </view>
+            <view class="card-modal dir-top-nowrap cross-center main-center" v-if="modal.show">
+                <view class="modal-content" :style="{backgroundImage: `url(`+card.img_finish_receiving+`)`}">
+                    <view class="error">{{modal.msg}}</view>
+                    <view class="modal-btn" @click="modal.show = false"></view>
+                </view>
+            </view>
+        </view>
+        <view>
+            <app-related-suggestion-product v-if="recommendGoodsList && recommendGoodsList.length"
+                                            :list="recommendGoodsList"
+                                            text="您或许会喜欢"
+                                            :theme="getTheme"
+            ></app-related-suggestion-product>
+        </view>
+    </view>
+</template>
+
+<script>
+    import {mapGetters, mapState} from 'vuex';
+    import AppRelatedSuggestionProduct
+        from '../../../components/page-component/app-related-suggestion-product/app-related-suggestion-product';
+    import appShareQrCode
+        from '../../../components/page-component/app-share-qr-code-poster/app-share-qr-code-poster.vue';
+    import jump from '../../../core/jump.js';
+
+    export default {
+        name: "app-card-give",
+        components: {
+            AppRelatedSuggestionProduct, appShareQrCode
+        },
+        props: {
+            card: {
+                type: Object | null,
+                default() {
+                    return null;
+                }
+            }
+        },
+        data() {
+            return {
+                recommendGoodsList: null,
+                shareShow: false,
+                modal: {
+                    show: false,
+                    msg: ''
+                },
+            };
+        },
+        computed: {
+            ...mapState({
+                appImg: state => state.mallConfig.__wxapp_img,
+            }),
+            ...mapGetters('mallConfig', {
+                getTheme: 'getTheme',
+            }),
+            contentStyle() {
+                let style = '';
+                if (this.card.status === 2) {
+                    style = `background-image: url('${this.card.receive_card_bg}')`;
+                } else {
+                    style = `background-image: url('${this.card.card_bg}')`;
+                }
+                return style;
+            }
+        },
+        created() {
+            this.loadRecommendGoodsList();
+        },
+        methods: {
+            loadRecommendGoodsList() {
+                this.$request({
+                    url: this.$api.goods.new_recommend,
+                    method: 'get',
+                    data: {
+                        type: 'order_pay',
+                    },
+                }).then(response => {
+                    if (response.code === 0) {
+                        this.recommendGoodsList = response.data.list;
+                    }
+                }).catch(e => {
+                });
+            },
+            back() {
+                jump({
+                    open_type: 'redirect',
+                    url: '/pages/index/index'
+                })
+            },
+            receive() {
+                this.$showLoading();
+                this.$request({
+                    url: this.$api.card.receivesp,
+                    method: 'get',
+                    data: {
+                        cardId: this.card.id
+                    }
+                }).then(response => {
+                    this.$hideLoading();
+                    if (response.code === 0) {
+                        this.$emit('receive')
+                    } else {
+                        this.modal = {
+                            show: true,
+                            msg: response.msg
+                        }
+                    }
+                })
+            }
+        }
+    }
+</script>
+
+<style scoped lang="scss">
+    .give {
+        background-color: #ffffff;
+    }
+
+    .content {
+        width: #{750rpx};
+        height: #{880rpx};
+        background-size: contain;
+        background-repeat: no-repeat;
+        background-position: center;
+        padding-top: #{46rpx};
+        text-align: center;
+        background-color: #ffffff;
+        line-height: 1;
+
+        .avatar {
+            width: #{130rpx};
+            height: #{130rpx};
+            margin: #{0 auto 30rpx auto};
+            border-radius: #{130rpx};
+            overflow: hidden;
+
+            image {
+                width: 100%;
+                height: 100%;
+                display: block;
+            }
+        }
+
+        .nickname {
+            font-size: $uni-font-size-general-one;
+        }
+
+        .title {
+            margin-top: #{40rpx};
+            font-size: $uni-font-size-import-two;
+        }
+
+        .pic {
+            margin: #{76rpx auto 0 auto};
+            width: #{636rpx};
+            height: #{200rpx};
+
+            .card-title {
+                margin-left: #{40rpx};
+                border-radius: #{120rpx};
+                overflow: hidden;
+            }
+
+            image {
+                width: #{120rpx};
+                height: #{120rpx};
+                display: block;
+            }
+
+            .name {
+                margin-left: #{21rpx};
+                width: #{300rpx};
+            }
+        }
+
+        .reset-time {
+            height: #{52rpx};
+            font-size: $uni-font-size-weak-two;
+            line-height: #{50rpx};
+            margin: #{40rpx auto 0 auto};
+        }
+
+        .time {
+            margin-top: #{6rpx};
+            font-size: $uni-font-size-weak-two;
+        }
+
+        .card-btn-group {
+            margin-top: #{34rpx};
+        }
+
+        .card-btn {
+            width: #{284rpx};
+            height: #{76rpx};
+            &.btn-1 {
+                margin: #{410rpx auto 0 auto};
+            }
+
+            &.btn-0 {
+                &:first-child {
+                    margin-right: #{38rpx};
+                }
+            }
+        }
+
+        .card-modal {
+            background-color: rgba(0, 0, 0, 0.5);
+            width: 100%;
+            height: 100%;
+            position: fixed;
+            top: 0;
+            left: 0;
+            z-index: 1000;
+
+            .modal-content {
+                width: #{600rpx};
+                height: #{528rpx};
+                background-size: contain;
+                background-repeat: no-repeat;
+                background-position: center;
+
+                .error {
+                    margin: #{290rpx auto 0 auto};
+                    font-size: $uni-font-size-import-one;
+                }
+
+                .modal-btn {
+                    margin: #{62rpx auto 0 auto};
+                    width: #{520rpx};
+                    height: #{90rpx};
+                    border-radius: #{90rpx};
+                }
+            }
+        }
+    }
+</style>

+ 50 - 0
pages/sp/details/details-no-share.vue

xqd
@@ -0,0 +1,50 @@
+<template>
+    <app-layout>
+        <view>
+            <app-card-detail :list="list"></app-card-detail>
+        </view>
+    </app-layout>
+</template>
+
+<script>
+    import appCardDetail from '../components/app-card-detail.vue';
+
+    export default {
+        components: {appCardDetail},
+        data() {
+            return {
+                list: null,
+            }
+        },
+        methods: {
+            getList(id) {
+                let that = this;
+                that.$showLoading({
+                    text: '加载中...'
+                });
+                that.$request({
+                    url: that.$api.card.detailsp,
+                    data: {
+                        cardId: id,
+                    },
+                }).then(response=>{
+                    that.$hideLoading();
+                    if(response.code === 0) {
+                        that.list = response.data.card;
+                    } else {
+                        uni.showToast({
+                            title: response.msg,
+                            icon: 'none',
+                            duration: 1000,
+                        });
+                    }
+                }).catch(() => {
+                    that.$hideLoading();
+                });
+            },
+        },
+        onLoad(options) {
+            this.getList(options.id);
+        }
+    }
+</script>

+ 66 - 0
pages/sp/details/details.vue

xqd
@@ -0,0 +1,66 @@
+<template>
+    <app-layout>
+        <view>
+            <app-card-detail :list="list"></app-card-detail>
+        </view>
+    </app-layout>
+</template>
+
+<script>
+    import appCardDetail from '../components/app-card-detail.vue';
+    import {mapState} from "vuex";
+
+    export default {
+        components: {appCardDetail},
+        data() {
+            return {
+                list: null,
+            }
+        },
+        computed: {
+            ...mapState({
+                cardImg: state => state.mallConfig.__wxapp_img.card,
+            })
+        },
+        methods: {
+            getList(id) {
+                let that = this;
+                that.$showLoading({
+                    text: '加载中...'
+                });
+                that.$request({
+                    url: that.$api.card.detailsp,
+                    data: {
+                        cardId: id,
+                    },
+                }).then(response=>{
+                    that.$hideLoading();
+                    if(response.code === 0) {
+                        that.list = response.data.card;
+                    } else {
+                        uni.showToast({
+                            title: response.msg,
+                            icon: 'none',
+                            duration: 1000,
+                        });
+                    }
+                }).catch(() => {
+                    that.$hideLoading();
+                });
+            },
+        },
+        onLoad(options) {
+            this.getList(options.id);
+        },
+        onShareAppMessage(object) {
+            return this.$shareAppMessage({
+                title: this.list.app_share_title ? this.list.app_share_title : '送你一张碎屏险,赶快来领取吧',
+                imageUrl: this.list.app_share_pic ? this.list.app_share_pic : this.cardImg.img_card_2,
+                path: '/pages/card/give/give',
+                params: {
+                    card_id: this.list.id
+                }
+            });
+        },
+    }
+</script>

+ 82 - 0
pages/sp/give/give.vue

xqd
@@ -0,0 +1,82 @@
+<template>
+    <app-layout>
+        <view v-if="type === 'give'">
+            <app-card-give :card="card" @receive="receive"></app-card-give>
+        </view>
+        <view v-if="type === 'detail'">
+            <app-card-detail :list="card"></app-card-detail>
+        </view>
+    </app-layout>
+</template>
+
+<script>
+    import {mapState} from "vuex";
+    import appCardGive from '../components/app-card-give.vue';
+    import appCardDetail from '../components/app-card-detail.vue';
+
+    export default {
+        name: "give",
+        components: {
+            appCardGive,
+            appCardDetail
+        },
+        data() {
+            return {
+                card: null,
+                type: null,
+            };
+        },
+        computed: {
+            ...mapState({
+                cardImg: state => state.mallConfig.__wxapp_img.card,
+            })
+        },
+        onLoad(options) {
+            this.loadData(options);
+        },
+        methods: {
+            loadData(options) {
+                this.$showLoading();
+                this.$request({
+                    url: this.$api.card.givesp,
+                    method: 'get',
+                    data: {
+                        cardId: options.card_id
+                    }
+                }).then(response => {
+                    this.$hideLoading();
+                    if (response.code === 0) {
+                        let data = response.data;
+                        this.type = data.type;
+                        this.card = response.data;
+                        let title = '';
+                        if (data.type === 'give') {
+                            title = '领取碎屏险'
+                        } else {
+                            title = '碎屏险详情'
+                        }
+                        uni.setNavigationBarTitle({
+                            title: title,
+                        });
+                    }
+                })
+            },
+            receive() {
+                this.loadData({card_id: this.card.id})
+            }
+        },
+        onShareAppMessage(object) {
+            return this.$shareAppMessage({
+                title: this.card.app_share_title ? this.card.app_share_title : '送你一张碎屏险,赶快来领取吧',
+                imageUrl: this.card.app_share_pic ? this.card.app_share_pic : this.cardImg.img_card_2,
+                path: '/pages/card/give/give',
+                params: {
+                    card_id: this.card.id
+                }
+            });
+        },
+    }
+</script>
+
+<style scoped lang="scss">
+</style>

BIN
pages/sp/image/icon-card-qrcode.png


+ 388 - 0
pages/sp/index/index.vue

xqd
@@ -0,0 +1,388 @@
+f<template>
+    <app-layout>
+        <app-tab-nav :tabList="tabList" :activeItem="activeTab" @click="tabStatus" :theme="getTheme"></app-tab-nav>
+        <view class="card-list">
+            <view @click="toDetail(item)" v-for="item in list" :key="item.id">
+                <view class="card-item dir-left-nowrap main-center cross-center">
+                    <image class="card-img" :src="item.pic_url"></image>
+                    <view class="name dir-top-nowrap" style="height: 100%;" v-if="item.receive_id !== 0">
+                        <view class="box-grow-1 dir-left-nowrap cross-bottom">
+                            <view class="t-omit-two">{{item.name}}</view>
+                        </view>
+                        <view class="box-grow-0">
+                            <view class="is_send">已转赠</view>
+                        </view>
+                    </view>
+                    <view class="name t-omit-two" v-else>{{item.name}}</view>
+                    <view class="right-box dir-top-nowrap main-center cross-center">
+                        <image v-if="item.is_may_use === 1"
+                               class="card-qr"
+                               @click.stop="showModal(item.id)"
+                               src="./../image/icon-card-qrcode.png"
+                        ></image>
+                        <span>{{activeTab == 3 ? '未核销' : '剩余'}}{{item.surplus_number}}次</span>
+                    </view>
+                </view>
+            </view>
+        </view>
+        <view class="no-list" v-if="list.length === 0">
+            <app-no-goods background="#f7f7f7" :title="title"></app-no-goods>
+        </view>
+        <view class="qr-modal" @click="show=false" v-if="show">
+            <view class="look-qr" @click.stop="showModal(0)">
+                <view>碎屏险二维码</view>
+                <view>
+                    <image :src="img"></image>
+                </view>
+                <view style="height: 60rpx">
+                    <view @click="saveImg">
+                        <button>保存图片</button>
+                    </view>
+                </view>
+            </view>
+        </view>
+    </app-layout>
+</template>
+
+<script>
+    import appTabNav from "../../../components/basic-component/app-tab-nav/app-tab-nav.vue";
+    import appNoGoods from '../../../components/page-component/app-no-goods/app-no-goods.vue';
+
+    import {mapGetters, mapState} from "vuex";
+
+    export default {
+        data() {
+            return {
+                tabList: [
+                    {id:1, name: '未使用'},
+                    {id:2, name: '已使用'},
+                    {id:3, name: '已过期'}
+                ],
+                show: false,
+                img: '/images/share/img-share-order.png',
+                activeTab: 1,
+                list: [],
+                more: false,
+                page: 2,
+                title: '暂无未使用碎屏险~'
+            }
+        },
+        components: {
+            'app-tab-nav': appTabNav,
+            'app-no-goods': appNoGoods,
+        },
+        computed: {
+            ...mapState({
+                userInfo: state => state.user.info,
+            }),
+            ...mapGetters('mallConfig', {
+                getTheme: 'getTheme',
+            })
+        },
+        methods: {
+            saveImg() {
+                let that = this;
+                // #ifndef MP-ALIPAY
+                uni.authorize({
+                    scope: 'scope.writePhotosAlbum',
+                    success(res) {
+                        if (res.errMsg == "authorize:ok") {
+                            uni.downloadFile({
+                                url: that.img,
+                                success(res) {
+                                    uni.saveImageToPhotosAlbum({
+                                        filePath: res.tempFilePath,
+                                        success() {
+                                            uni.showToast({
+                                                title: '保存成功',
+                                                icon: 'success',
+                                                duration: 1000
+                                            })
+                                        },
+                                        fail() {
+                                            uni.showToast({
+                                                title: '保存失败',
+                                                icon: 'none',
+                                                duration: 1000
+                                            })
+                                        }
+                                    })
+                                }
+                            })
+                        }
+                    },
+                    fail(res) {
+                        uni.showModal({
+                            title: '提示',
+                            content: '保存失败,需要授权保存到相册权限',
+                            showCancel: false,
+                            confirmText: '打开授权',
+                            success(e) {
+                                if (e.confirm) {
+                                    uni.openSetting({});
+                                }
+                            }
+                        });
+                    }
+                })
+                // #endif
+                 // #ifdef MP-ALIPAY
+                my.showLoading({
+                    content: '图片保存中'
+                });
+                my.saveImage({
+                    url: that.img,
+                    showActionSheet: true,
+                    success: (res) => {
+                        uni.showToast({
+                            title: '保存成功',
+                            icon: 'success',
+                            duration: 1000
+                        })
+                    },
+                    fail() {
+                        uni.showToast({
+                            title: '保存失败',
+                            icon: 'none',
+                            duration: 1000
+                        })
+                    },
+                    complete() {
+                        my.hideLoading();
+                    }
+                });
+                // #endif
+            },
+
+            showModal(id) {
+                let that = this;
+                if(id > 0) {
+                    uni.showLoading({
+                        text: '生成中...'
+                    });
+                    that.$request({
+                        url: that.$api.card.sqrcode,
+                        data: {
+                            cardId: id,
+                        },
+                        method: 'get'
+                    }).then(response => {
+                        uni.hideLoading();
+                        if (response.code === 0) {
+                            that.show = true;
+                            that.img = response.data.file_path;
+                        } else {
+                            uni.showToast({
+                                title: response.msg,
+                                icon: 'none',
+                                duration: 1000,
+                            });
+                        }
+                    }).catch(response => {
+                        uni.hideLoading();
+                        uni.showToast({
+                            title: response,
+                            icon: 'none',
+                            duration: 1000,
+                        });
+                    });
+                }
+            },
+
+            tabStatus(e) {
+                this.list = [];
+                let id = e.currentTarget.dataset.id;
+                if (id === 1) {
+                    this.title = `暂无未使用优惠券~`;
+                } else if (id === 2) {
+                    this.title = `暂无已使用优惠券~`;
+                } else if (id === 3) {
+                    this.title = `暂无已过期优惠券~`;
+                }
+                this.page = 2;
+                this.activeTab = id;
+                this.getList();
+            },
+            getList() {
+                let that = this;
+                that.$showLoading({
+                    text: '加载中...'
+                });
+                that.$request({
+                    url: that.$api.card.indexsp,
+                    data: {
+                        status: that.activeTab
+                    },
+                }).then(response=>{
+                    that.$hideLoading();
+                    if(response.code === 0) {
+						console.log(219)
+						console.log(response.data.list)
+                        that.list = response.data.list;
+                    }else {
+                        uni.showToast({
+                            title: response.msg,
+                            icon: 'none',
+                            duration: 1000
+                        });
+                    }
+                }).catch(() => {
+                    that.$hideLoading();
+                    that.$event.on(that.$const.EVENT_USER_LOGIN).then(()=>{
+                        that.getList();
+                    });
+                });
+            },
+            getMore() {
+                let that = this;
+                uni.showLoading({
+                    title: '加载中...',
+                });
+                that.$request({
+                    url: that.$api.card.indexsp,
+                    data: {
+                        page: that.page,
+                        status: that.activeTab
+                    },
+                }).then(response=>{
+                    uni.hideLoading();
+                    if(response.code === 0) {
+                        if(response.data.list.length > 0) {
+                            that.loading = null;
+                            that.list = that.list.concat(response.data.list);
+                            that.page++;
+                        }
+                    }else {
+                        uni.showToast({
+                            title: response.msg,
+                            icon: 'none',
+                            duration: 1000,
+                        });
+                    }
+                }).catch(() => {
+                    that.$hideLoading();
+                });
+            },
+            toDetail(card) {
+                if (card.is_allow_send == 1) {
+                    uni.navigateTo({
+                        url: `/pages/sp/details/details?id=${card.id}`
+                    });
+                } else {
+                    uni.navigateTo({
+                        url: `/pages/sp/details/details-no-share?id=${card.id}`
+                    });
+                }
+            },
+        },
+        onLoad() {
+            this.getList();
+        },
+        onReachBottom() {
+            this.getMore();
+        },
+		onShow: function(){
+		  wx.hideHomeButton() 
+		}
+    }
+</script>
+
+<style scoped lang="scss">
+    .no-list {
+        margin-top: #{150upx};
+    }
+    .card-list {
+        width: 100%;
+        padding-top: #{10rpx};
+        background-color: #f7f7f7;
+    }
+
+    .card-item {
+        height: #{180rpx};
+        margin: #{20rpx};
+        background-color: #fff;
+        color: #353535;
+        font-size: #{30rpx};
+        border-radius: 16#{rpx};
+
+        .name {
+            width: 402#{rpx};
+            margin-left:35#{rpx};
+
+            .is_send {
+                width: #{80rpx};
+                height: #{40rpx};
+                color: #ff4544;
+                font-size: #{20rpx};
+                background-color: #ffecec;
+                text-align: center;
+                line-height: #{40rpx};
+                margin: #{16rpx 0 20rpx 0};
+            }
+        }
+
+        .card-img {
+            height: #{88rpx};
+            width: #{88rpx};
+            border-radius: 50%;
+            margin-left:24#{rpx};
+        }
+
+        .right-box {
+            margin: #{65rpx} #{35rpx};
+
+            .card-qr {
+                height: #{50rpx};
+                width: #{50rpx};
+            }
+
+            span {
+                font-size:20#{rpx};
+                color: #353535;
+                margin-top:10#{rpx};
+            }
+        }
+    }
+
+    .qr-modal {
+        position: fixed;
+        left: 0;
+        right: 0;
+        top: 0;
+        background-color: rgba(0, 0, 0, 0.5);
+        height: 100%;
+        width: 100%;
+        z-index: 2;
+    }
+
+    .look-qr {
+        position: absolute;
+        background-color: #fff;
+        width: #{550rpx};
+        height: #{700rpx};
+        left: 50%;
+        margin-left: #{-275rpx};
+        top: 20%;
+        border-radius: #{10rpx};
+        text-align: center;
+        padding: #{50rpx};
+        font-size: #{34rpx};
+        color: #353535;
+    }
+
+    .look-qr image {
+        margin-top: #{25rpx};
+        height: #{450rpx};
+        width: #{450rpx};
+    }
+
+    .look-qr button {
+        margin: #{15rpx} auto 0;
+        height: #{60rpx};
+        line-height: #{60rpx};
+        color: #fff;
+        font-size: #{28rpx};
+        width: #{200rpx};
+        background-color: #ff4544;
+    }
+</style>

+ 33 - 0
pages/test/test.vue

xqd
@@ -0,0 +1,33 @@
+<template>
+	<view>
+		<view  @click="click">hello wold</view>
+		<uOpenPic :newValue="showOpenPic" @closeOpenPic="closeOpenPic"></uOpenPic>
+	</view>
+</template>
+
+<script>
+	 import uOpenPic from '@/components/page-component/goods/u-open-pic.vue';
+	export default {
+		components: {
+			uOpenPic
+		},
+		data() {
+			return {
+				showOpenPic:false
+			};
+		},
+		
+		methods:{
+			click(){
+				this.showOpenPic=true;
+			},
+			closeOpenPic(e){
+				this.showOpenPic=e;
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+
+</style>

+ 29 - 1
pages/user-center/user-center.vue

xqd xqd xqd
@@ -41,6 +41,7 @@
             <view class="title" v-if="userCenter.menu_title">{{userCenter.menu_title}}</view>
             <view class="list" :class="[listStyle]">
                 <view class="item" v-for="(item, index) in userCenter.menus" :key="index" >
+					
                     <app-jump-button form
                                      :url="item.link_url"
                                      :open_type="item.open_type"
@@ -66,7 +67,29 @@
                 </view>
             </view>
         </view>
-
+		<view class="app-my-service" v-if="userCenter.is_menu_status == 1"> 
+		    <view class="list" :class="[listStyle]">
+		        <view class="item" @click="goUrl">
+		            <app-jump-button form 
+		                             url="pages/sp/index/index"
+		                             open_type="item.open_type"
+		                             item="item"
+		                             arrangement="`${userCenter.menu_style === '1' ? 'row' : userCenter.menu_style === '2' ? 'column' : ''}`">
+		                <view style="width: 100%" class="item-container dir-left-nowrap cross-center">
+		                    <view class="box-grow-0">
+		                        <image src="https://t12.9026.com/web/statics/img/mall/pick-link/icon-user-card.png" class="icon"></image>
+		                    </view>
+		                    <view class="box-grow-1" style="max-width: 100%">
+		                        <view class="name">碎屏险中心</view>
+		                    </view>
+		                    <view class="box-grow-0">
+		                        <image src="/static/image/icon/arrow-right.png" class="arrow"></image>
+		                    </view>
+		                </view>
+		            </app-jump-button>
+		        </view>
+		    </view>
+		</view>
         <app-copyright
             v-if="copyright && copyright.status == '1'"
             background-color="transparent"
@@ -138,6 +161,11 @@
             });
         },
         methods: {
+			goUrl(){
+				uni.redirectTo({
+				    url: '/pages/sp/index/index'
+				})
+			},
             router(name) {
                 let url = '';
                 if (name === '我的收藏') {

+ 22 - 0
plugins/advance/components/detail-bottom-button.vue

xqd xqd
@@ -71,6 +71,17 @@
 	    },
 	    methods: {
             set_active() {
+				if (this.$user.isLogin() && this.$store.state.user.info) {
+				    let  member_level =this.$store.state.user.info.identity.member_level;
+					if(member_level<this.detail.member_level){
+						uni.showToast({
+						    title: '您的会员等级未达到'+this.detail.member_name+',继续加油哟。。。',
+						    icon: 'none'
+						});
+						return;
+					}
+					
+				}
                 if (this.$user.isLogin() && !this.once_pay) {
                     this.$emit('close_attr', false);
                 } else if (!this.$user.isLogin()) {
@@ -132,6 +143,17 @@
 			},
             pay() {
             	if (this.buttonDisabled) return;
+				if (this.$user.isLogin() && this.$store.state.user.info) {
+				    let  member_level =this.$store.state.user.info.identity.member_level;
+					if(member_level<this.detail.member_level){
+						uni.showToast({
+						    title: '您的会员等级未达到'+this.detail.member_name+',继续加油哟。。。',
+						    icon: 'none'
+						});
+						return;
+					}
+					
+				}
 				let body = {
 					goods_id: this.detail.id,
 					goods_attr_id: 0,

+ 1 - 1
plugins/advance/components/detail-price-share.vue

xqd
@@ -129,7 +129,7 @@
             end_prepayment_at: String,
             pay_limit: Number,
             cats: Array,
-            id: Number,
+            ids: Number,
             discount: {
                 type: String
             },

+ 1 - 1
plugins/advance/detail/detail.vue

xqd
@@ -41,7 +41,7 @@
                 v-bind:pay_limit="detail.advanceGoods.pay_limit"
                 v-bind:level_show="detail.level_show"
                 v-bind:cats="detail.goodsWarehouse.cats"
-                v-bind:id="detail.id"
+                v-bind:ids="detail.id"
                 v-bind:is_vip_card_user="detail.vip_card_appoint.is_vip_card_user"
                 v-bind:discount="detail.vip_card_appoint.discount"
                 v-bind:theme="getTheme"

+ 22 - 0
plugins/bargain/activity/activity.vue

xqd xqd
@@ -471,6 +471,17 @@
                 })
             },
             toBuy() {
+				if (this.$user.isLogin() && this.$store.state.user.info) {
+				    let  member_level =this.$store.state.user.info.identity.member_level;
+					if(member_level<this.goods.member_level){
+						uni.showToast({
+						    title: '您的会员等级未达到'+this.goods.member_name+',继续加油哟。。。',
+						    icon: 'none'
+						});
+						return;
+					}
+					
+				}
                 const bargain = this.detail;
                 const mchList = [{
                     "mch_id": 0,
@@ -492,6 +503,17 @@
             },
             
             toJoin() {
+				if (this.$user.isLogin() && this.$store.state.user.info) {
+				    let  member_level =this.$store.state.user.info.identity.member_level;
+					if(member_level<this.goods.member_level){
+						uni.showToast({
+						    title: '您的会员等级未达到'+this.goods.member_name+',继续加油哟。。。',
+						    icon: 'none'
+						});
+						return;
+					}
+					
+				}
                 if (this.detail.goods_id) {
                     uni.navigateTo({
                         url: '/plugins/bargain/goods/goods?goods_id=' + this.detail.goods_id,

+ 11 - 0
plugins/miaosha/goods/goods.vue

xqd
@@ -312,6 +312,17 @@ export default {
             this.selectAttr = data;
         },
         takeCart() {
+			if (this.$user.isLogin() && this.$store.state.user.info) {
+			    let  member_level =this.$store.state.user.info.identity.member_level;
+				if(member_level<this.detail.member_level){
+					uni.showToast({
+					    title: '您的会员等级未达到'+this.detail.member_name+',继续加油哟。。。',
+					    icon: 'none'
+					});
+					return;
+				}
+				
+			}
             this.show  = true;
         },
         leftFunc(number) {

+ 2 - 2
siteinfo.js

xqd
@@ -1,7 +1,7 @@
 var siteinfo = {
     'acid': -1,
     'version': '4.3.57',
-    'siteroot': 'https://shop.9026.com/app/index.php',
-    'apiroot': 'https://shop.9026.com/web/index.php?_mall_id=21987',
+    'siteroot': 'https://t12.9026.com/app/index.php',
+    'apiroot': 'https://t12.9026.com/web/index.php?_mall_id=21989',
 };
 module.exports = siteinfo;

BIN
static/image/icon/icon-contrast.png


Plik diff jest za duży
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/common/main.js.map


Plik diff jest za duży
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/common/runtime.js.map


Plik diff jest za duży
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/common/vendor.js.map


Plik diff jest za duży
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/app-button/app-button.js.map


Plik diff jest za duży
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/app-cart-image/app-cart-image.js.map


Plik diff jest za duży
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/app-check-box/app-check-box.js.map


Plik diff jest za duży
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/app-close/app-close.js.map


Plik diff jest za duży
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/app-composition/app-composition.js.map


Plik diff jest za duży
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/app-css-icon/app-css-icon.js.map


Plik diff jest za duży
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/app-datetime-picker/app-datetime-picker.js.map


Plik diff jest za duży
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/app-empty-bottom/app-empty-bottom.js.map


Plik diff jest za duży
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/app-empty/app-empty.js.map


Plik diff jest za duży
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/app-form-id/app-form-id.js.map


Plik diff jest za duży
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/app-hotspot/app-hotspot.js.map


Plik diff jest za duży
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/app-image/app-image.js.map


Plik diff jest za duży
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/app-input/app-input.js.map


Plik diff jest za duży
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/app-iphone-x/app-iphone-x.js.map


Plik diff jest za duży
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/app-jump-button/app-jump-button.js.map


Plik diff jest za duży
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/app-layout/app-coupon-modal/app-coupon-modal.js.map


Plik diff jest za duży
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/app-layout/app-layout.js.map


Plik diff jest za duży
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/app-layout/app-payment/app-payment.js.map


Plik diff jest za duży
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/app-layout/app-permissions-auth/app-permissions-auth.js.map


Plik diff jest za duży
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/app-layout/app-user-login/app-user-login.js.map


Plik diff jest za duży
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/app-layout/u-authorized-iphone/u-authorized-iphone.js.map


Plik diff jest za duży
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/app-load-text/app-load-text.js.map


Plik diff jest za duży
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/app-loading/app-loading.js.map


Plik diff jest za duży
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/app-model/app-model.js.map


Plik diff jest za duży
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/app-order/app-form-data.js.map


Plik diff jest za duży
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/app-prompt-box/app-prompt-box.js.map


Plik diff jest za duży
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/app-radio/app-radio-group.js.map


Plik diff jest za duży
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/app-radio/app-radio.js.map


Plik diff jest za duży
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/app-report-error/app-report-error.js.map


Plik diff jest za duży
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/app-rich/components/wxParseAudio.js.map


Plik diff jest za duży
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/app-rich/components/wxParseImg.js.map


Plik diff jest za duży
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/app-rich/components/wxParseTable.js.map


Plik diff jest za duży
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/app-rich/components/wxParseTemplate0.js.map


Plik diff jest za duży
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/app-rich/components/wxParseTemplate1.js.map


Plik diff jest za duży
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/app-rich/components/wxParseVideo.js.map


Plik diff jest za duży
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/app-rich/parse.js.map


Plik diff jest za duży
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/app-tab-bar/app-tab-bar.js.map


Plik diff jest za duży
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/app-tab-nav/app-tab-nav.js.map


Plik diff jest za duży
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/app-textarea/app-textarea.js.map


Plik diff jest za duży
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/app-timer/app-timer.js.map


Plik diff jest za duży
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/app-upload-image/app-upload-image.js.map


Plik diff jest za duży
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/u-count-to/u-count-to.js.map


Plik diff jest za duży
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/u-mask/u-mask.js.map


Plik diff jest za duży
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/u-popup/u-popup.js.map


Plik diff jest za duży
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/components/basic-component/uni-swiper-dot/uni-swiper-dot.js.map


Plik diff jest za duży
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/components/page-component/app-account-balance/app-account-balance.js.map


Plik diff jest za duży
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/components/page-component/app-account-balance/app-account-style.js.map


Plik diff jest za duży
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/components/page-component/app-ad/app-ad.js.map


Plik diff jest za duży
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/components/page-component/app-area-picker/app-area-picker.js.map


Plik diff jest za duży
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/components/page-component/app-associated-link/app-associated-link.js.map


Plik diff jest za duży
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/components/page-component/app-attr/app-attr.js.map


Plik diff jest za duży
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/components/page-component/app-buy-prompt/app-buy-prompt.js.map


Plik diff jest za duży
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/components/page-component/app-cash-model/app-cash-model.js.map


Plik diff jest za duży
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/components/page-component/app-category-list/app-category-list.js.map


Plik diff jest za duży
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/components/page-component/app-check-in/app-check-in.js.map


Niektóre pliki nie zostały wyświetlone z powodu dużej ilości zmienionych plików