Browse Source

添加店铺详情和批次详情页面

huxz 7 years ago
parent
commit
5acdc666d0

+ 1 - 1
components/main/Nav.vue

@@ -19,7 +19,7 @@
       <nuxt-link to="/product" class="item">
         <span>热卖推荐</span>
       </nuxt-link>
-      <nuxt-link to="/product" class="item">
+      <nuxt-link :to="{ name: 'store-uuid', params: { uuid: '33069557578d44e69bd91ad12d28a8d4' } }" class="item">
         <span>库存寄售</span>
       </nuxt-link>
       <nuxt-link to="/news" class="item">

+ 271 - 0
components/store/BaseInfo.vue

@@ -0,0 +1,271 @@
+<template>
+  <div style="margin-bottom: 30px;">
+    <div id="introduction-fragment">
+      <div class="container">
+        <div class="menu-com row">
+          <div class="menu-title col-md-12">
+            <a href="/">商城首页</a> >
+            <a href="provider/home" v-if="storeInfo.type == 'AGENCY' || storeInfo.type == 'DISTRIBUTION'" title="代理经销">代理经销</a>
+            <a href="provider/factories" v-if="storeInfo.type == 'ORIGINAL_FACTORY'" title="原厂专区">原厂专区</a>
+            <a :href="'/store/' + storeInfo.uuid" v-if="storeInfo.type == 'CONSIGNMENT'" title="库存寄售">库存寄售</a>
+            >
+            <span v-if="storeInfo.type != 'CONSIGNMENT'"><a :href="'/store/' + storeInfo.uuid" :title="storeInfo.storeName" v-text="storeInfo.storeName">店铺名称</a>> </span>
+            <span>了解更多</span>
+          </div>
+        </div>
+        <div class="intro-title row">
+          <h3 class="col-xs-2">
+            商家介绍
+          </h3>
+          <a class="col-xs-10" :href="'/store/' + storeInfo.uuid">返回店铺</a>
+        </div>
+        <div class="intro-text" v-text="storeInfo.description">店铺简介</div>
+      </div>
+    </div>
+    <div id="contact-fragment">
+      <div class="container" style="margin-top: 30px;">
+        <div class="contact-title">
+          <h3>
+            联系我们
+          </h3>
+        </div>
+        <div ng-if="storeInfo.enterprise">
+          <div class="contact-text">
+            <div v-text="storeInfo.enterprise.enName">深圳市华商龙商务互联科技有限公司</div>
+            <div v-if="storeInfo.enterprise.enAddress.length >0">地址:<span v-text="storeInfo.enterprise.enAddress">深圳市南山区科技园科技南五路英唐大厦一楼</span></div>
+            <div v-if="storeInfo.enterprise.enTel.length >0">电话:<span v-text="storeInfo.enterprise.enTel">0755-26038000/26038047/26038008/86140880</span></div>
+            <div v-if="storeInfo.enterprise.enFax.length > 0">传真:<span v-text="storeInfo.enterprise.enFax">0755-26038111</span></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div id="proof-fragment" v-show="qualifications.length > 0">
+      <div class="container" style="margin-top: 30px; margin-bottom: 20px;">
+        <div class="proof-title">
+          <h3>
+            资质证明
+          </h3>
+        </div>
+        <div>
+          <div class="div-proof" style="position:relative;" v-for="qualification in qualifications">
+            <div v-if="qualification.isPdf">
+              <img src="/images/store/common/timg.png" alt="" style="max-width: 124px; max-height: 147px;">
+              <div class="hover-show hover-shows">
+                <a :href="qualification.resourceUrl" target="_blank"><i class="fa fa-search" style="margin-right: 5px;"></i>查看</a>
+              </div>
+            </div>
+            <div v-if="!qualification.isPdf">
+              <a class="img-show">
+                <img :src="qualification.resourceUrl"/>
+              </a>
+              <div class="hover-show" @click="showImg(qualification.resourceUrl)"><i class="fa fa-search" style="margin-right: 5px;"></i>查看</div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+<script>
+
+function isPdf (path) {
+  // 根据path文件名来判断文件是否是PDF文件
+  if (path) {
+    let str = path.slice(path.lastIndexOf('.')).toLowerCase()
+    if (str === '.pdf') {
+      return true
+    } else {
+      return false
+    }
+  } else {
+    return false
+  }
+}
+
+export default {
+  name: 'base-info',
+  computed: {
+    storeInfo () {
+      return this.$store.state.shop.storeInfo.store.data
+    },
+    qualifications () {
+      let storeInfo = this.$store.state.shop.storeInfo.store.data
+      let qualifications = JSON.parse(JSON.stringify(storeInfo.qualifications))
+      qualifications = qualifications.filter(qualification => {
+        return qualification && qualification.type === 'APTITUDE'
+      })
+      for (let i = 0; i < qualifications.length; i++) {
+        qualifications[i].isPdf = isPdf(qualifications[i].resourceUrl)
+      }
+      console.log(qualifications)
+      return qualifications || []
+    }
+  },
+  methods: {
+    showImg (path) {
+      window.open(path)
+    }
+  }
+}
+</script>
+<style scoped>
+  #introduction-fragment .intro-title h3 {
+		font-size: 24px;
+		color: rgb(50,50,50);
+	}
+
+	#introduction-fragment .intro-title a {
+		font-size: 14px;
+		color: rgb(33,71,151);
+		margin-top: 25px;
+		margin-left: -50px;
+	}
+
+	#introduction-fragment .intro-text {
+		font-size: 14px;
+		color: rgb(50,50,50);
+		margin-top: 10px;
+		line-height: 30px;
+	}
+
+	#introduction-fragment .intro-text{
+		text-indent:2em;
+	}
+
+  #contact-fragment .contact-title h3 {
+		font-size: 24px;
+		color: rgb(50,50,50);
+
+	}
+
+	#contact-fragment .contact-text {
+		font-size: 14px;
+		color: rgb(50,50,50);
+		margin-top: 10px;
+		line-height: 28px;
+	}
+
+  #proof-fragment .proof-title {
+		margin-bottom: 10px;
+	}
+
+	#proof-fragment .proof-title h3 {
+		font-size: 24px;
+		color: rgb(50,50,50);
+	}
+
+	#proof-fragment .div-proof {
+		float: left;
+		border: 1px solid #eee;
+		margin-right: 47px;
+	}
+	#proof-fragment .div-proof:last-child{
+		margin-right: 0;
+	}
+
+	#proof-fragment .div-proof a :HOVER {
+		border: 1px solid #5078cb;
+	}
+	#proof-fragment .div-proof a.img-show :HOVER{
+		border: none;
+	}
+	#proof-fragment .div-proof img {
+		max-width: 200px;
+		max-height: 200px;
+	}
+	.div-proof{
+		width: 200px;
+		height: 200px;
+		overflow: hidden;
+		line-height: 200px;
+		text-align: center;
+	}
+	.div-proof a{
+		display: inline-block;
+		width: 100%;
+		height: 100%;
+	}
+	.hover-show{
+		position: absolute;
+		width: 100%;
+		height: 100%;
+		top: 100%;
+		left: 0;
+		background: rgba(0,0,0,.5);
+		z-index: 10;
+		line-height: 200px;
+		text-align: center;
+		color: #fff;
+		font-size: 14px;
+	}
+	.div-proof:hover .hover-show{
+		top: 0;
+		transition: top .3s ease-in;
+	}
+	.hover-show:hover{
+		cursor: pointer;
+	}
+	/* 预览框 end */
+	#image-box .x-floating-wrap {
+		position: fixed;
+		z-index: 99998;
+		background: #000;
+		top: 0;
+		left: 0;
+		width: 100%;
+		height: 100%;
+		opacity: 0.5;
+	}
+	#image-box .x-floating {
+		position: fixed;
+		z-index: 99999;
+		top: 60px;
+		left: 0;
+		width: 100%;
+		height: 100%;
+		text-align: center;
+		vertical-align: middle;
+	}
+	#image-box .x-floating img {
+		margin: auto auto;
+		max-width: 100%;
+		max-height: 80%;
+		-webkit-user-select: none;
+		-moz-user-select: none;
+		-ms-user-select: none;
+		user-select: none
+	}
+
+	#image-box .x-close-wrap {
+		position: fixed;
+		top: 0;
+		right: 0;
+		z-index: 100000;
+		width: 120px;
+		height: 120px;
+		margin: -60px -60px 0 0;
+		border-radius: 100%;
+		background: #000;
+		opacity: .3
+	}
+
+	#image-box .x-close-wrap a {
+		position: absolute;
+		left: 25px;
+		bottom: 25px;
+		font-size: 42px;
+		color: #fff
+	}
+
+	#image-box .x-close-wrap:hover {
+		opacity: .7
+	}
+	.hover-shows a{
+		text-decoration: none;
+		color: #fff;
+	}
+	.hover-shows a:hover, .hover-shows a:focus, .hover-shows a:active{
+		text-decoration: none;
+		color: #fff;
+	}
+</style>

+ 25 - 0
components/store/Breadcrumb.vue

@@ -0,0 +1,25 @@
+<template>
+  <div>
+    <el-breadcrumb separator=">">
+      <el-breadcrumb-item v-for="(breadcrumb, index) in breadcrumbs" :key="index" :to="breadcrumb.to || {}" v-text="breadcrumb.name">首页</el-breadcrumb-item>
+      <!--<el-breadcrumb-item :to="{ path: '/' }">首页</el-breadcrumb-item>
+      <el-breadcrumb-item>活动管理</el-breadcrumb-item>
+      <el-breadcrumb-item>活动列表</el-breadcrumb-item>
+      <el-breadcrumb-item>活动详情</el-breadcrumb-item>-->
+    </el-breadcrumb>
+  </div>
+</template>
+<script>
+
+export default {
+  name: 'breadcrumb',
+  props: ['breadcrumbs']
+}
+</script>
+<style lang="scss" scoped>
+  @import '~assets/scss/variables';
+
+  el-breadcrumb {
+    font-size: 14px;
+  }
+</style>

+ 391 - 0
components/store/CommodityInfo.vue

@@ -0,0 +1,391 @@
+<template>
+  <div>
+    <div class="menu-com row">
+      <div class="menu-title col-md-12">
+        <a href=".">商城首页</a> >
+        <a href="provider/home" v-if="storeInfo.type == 'AGENCY' || storeInfo.type == 'DISTRIBUTION'" title="代理经销">代理经销</a>
+        <a href="provider/factories" v-if="storeInfo.type == 'ORIGINAL_FACTORY'" title="原厂专区">原厂专区</a>
+        <a :href="'/store/' + storeInfo.uuid" v-if="storeInfo.type == 'CONSIGNMENT'" title="库存寄售">库存寄售</a>
+        >
+        <span v-if="storeInfo.type != 'CONSIGNMENT'"><a :href="'/store/' + storeInfo.uuid" :title="storeInfo.storeName" v-text="storeInfo.storeName">storeInfo.storeName</a>> </span>
+        <span>产品详情</span>
+      </div>
+    </div>
+    <div id="commodity-info-fragment">
+      <div class="commodity-detail">
+        <div class="img">
+          <img :src="commodity.img || '/images/store/common/default.png'" style="width: 256px;height: 256px;"/>
+          <div class="box"></div>
+        </div>
+        <div class="content">
+          <div class="code">
+            <span v-text="commodity.code"></span>
+          </div>
+          <div class="commodity-info-detail">
+            <div class="com-info">
+              <span class="name">价&nbsp;格</span>:
+              <span class="money">
+                <span v-if="fragment.currency == 'RMB'">¥</span>
+                <span v-if="fragment.currency == 'USD'">$</span>
+                <span v-text="fragment.price"></span>
+              </span>
+            </div>
+            <div class="com-info">
+              <span class="name">品&nbsp;牌</span>:<span v-text="commodity.brandNameEn"></span>
+            </div>
+            <div class="com-info">
+              <span class="name">类&nbsp;目</span>:<span v-text="commodity.kindNameCn"></span>
+            </div>
+            <div class="com-info">
+              <span class="name">下&nbsp;载</span>:<a target="_blank" :href="component.attach">{{component.attach ? '规格书' : '暂无信息'}}</a>
+            </div>
+            <div class="com-info">
+              <span class="name">包&nbsp;装</span>:<span v-text="commodity.packaging || '无包装信息'"></span>
+            </div>
+            <div class="com-info">
+              <span class="name">封&nbsp;装</span>:<span v-text="commodity.encapsulation || '无封装信息'"></span>
+            </div>
+            <div class="com-info">
+              <span class="name">库&nbsp;存</span>:<span v-text="commodity.reserve || 0"></span>
+              (<span v-text="commodity.minBuyQty || 1"></span>个起订)
+            </div>
+            <div class="com-info">
+              <span class="name">货&nbsp;期</span>:
+              <div class="delivery">
+                <span v-text="commodity.b2cMinDelivery || 0"></span>-
+                <span v-text="commodity.b2cMaxDelivery || 0"></span>
+                <span>(天)</span>
+              </div>
+            </div>
+            <div class="com-info form-inline">
+              <span class="name">数&nbsp;量</span>:
+              <div class="input-group" style="width: 120px">
+                <div class="input-group-addon operate" @click="subNum()" :disabled="!fragment.canAdd">-</div>
+                <input type="text" class="form-control text-center" placeholder="数量" v-model="fragment.num" @change="inputNum()"/>
+                <div class="input-group-addon operate" @click="addNum()" :disabled="!fragment.canSub">+</div>
+              </div>
+              ×
+              <div class="select">
+                <select class="form-control"  :disabled="commodity.currencyName != 'RMB-USD'" v-model="fragment.currency" @change="changeCurrency()">
+                  <option value="RMB">RMB</option>
+                  <option value="USD">USD</option>
+                </select>
+              </div>
+              =
+              <span class="money">
+                 <span v-if="fragment.currency == 'RMB'">¥</span>
+                 <span v-if="fragment.currency == 'USD'">$</span>
+                 <span v-text="calculate || 0"></span>
+              </span>
+            </div>
+            <div class="button" ng-controller="GoodsPickUpCtrl">
+              <button class="btn btn-default btn-primary" ng-click="addToCart(commodity, false, fragment.num, fragment.currency)">加入购物车</button>
+              <button class="btn btn-default btn-now" ng-click="addToCart(commodity, true, fragment.num, fragment.currency)">立即购买</button>
+            </div>
+          </div>
+          <div class="price-block">
+            <div class="commodity-price">
+              <div class="title">价格梯度</div>
+              <div class="table">
+                <div class="head">
+                  <div class="fragment">数量</div>
+                  <div class="price">单价¥(含税)</div>
+                  <div class="price">单价$</div>
+                </div>
+                <ul class="list-unstyled list-inline">
+                  <li v-for="price in commodity.prices">
+                    <div class="fragment">
+                      <span v-text="price.start"></span>+
+                    </div>
+                    <div class="price">
+                      <span v-if="price.rMBPrice" v-text="price.rMBPrice ||0"></span>
+                    </div>
+                    <div class="price">
+                      <span v-if="price.uSDPrice" v-text="price.uSDPrice || 0"></span>
+                    </div>
+                  </li>
+                </ul>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+<script>
+
+function initFragment (commodity) {
+  let fragment = {}
+  let prices = commodity.prices[0]
+  fragment.num = commodity.minBuyQty
+  fragment.prices = prices
+
+  if (commodity.currencyName !== 'USD') {
+    fragment.currency = 'RMB'
+  } else {
+    fragment.currency = 'USD'
+  }
+
+  if (fragment.currency !== 'USD') {
+    fragment.price = prices.rMBPrice
+  } else {
+    fragment.price = prices.uSDPrice
+  }
+  console.log(fragment)
+  return fragment
+}
+
+function getFragment (commodity, fragment) {
+  // 判断是否小于第一分段的起订量
+  if (commodity.prices[0].start > fragment.num) {
+    fragment.num = commodity.prices[0].start
+  }
+  // 获取分段的信息
+  let prices = commodity.prices
+  for (let i = 0; i < prices.length; i++) {
+    if (fragment.num <= prices[i].end) {
+      fragment.prices = prices[i]
+      break
+    }
+  }
+}
+
+export default {
+  name: 'commodity-info',
+  data () {
+    return {
+      fragment: { currency: 'RMB', num: 0, price: 0, canAdd: true }
+    }
+  },
+  computed: {
+    storeInfo () {
+      return this.$store.state.shop.storeInfo.store.data
+    },
+    commodity () {
+      let commodity = this.$store.state.shop.storeInfo.commodity.data
+      this.fragment = initFragment(commodity)
+      return commodity
+    },
+    component () {
+      return this.$store.state.shop.storeInfo.component.data
+    },
+    calculate () {
+      this.fragment.total = this.fragment.price * this.fragment.num
+      return this.fragment.total
+    }
+  },
+  methods: {
+    changeCurrency () {
+      if (this.fragment.currency === 'RMB') {
+        this.fragment.price = this.fragment.prices.rMBPrice
+      } else if (this.fragment.currency === 'USD') {
+        this.fragment.price = this.fragment.prices.uSDPrice
+      }
+    },
+    subNum () {
+      let newNum = this.fragment.num - this.commodity.minPackQty
+      if (newNum >= this.commodity.minBuyQty) {
+        this.fragment.num = newNum
+      } else {
+        this.fragment.canSub = false
+      }
+      this.fragment.canAdd = true
+      getFragment(this.commodity, this.fragment)
+    },
+    addNum () {
+      let newNum = this.fragment.num + this.commodity.minPackQty
+      if (newNum <= this.commodity.reserve) {
+        this.fragment.num = newNum
+      } else {
+        this.fragment.canAdd = false
+      }
+      this.fragment.canSub = true
+      getFragment(this.commodity, this.fragment)
+    },
+    inputNum () {
+      if (this.fragment.num < this.commodity.minBuyQty) {
+        this.fragment.num = this.commodity.minBuyQty
+      } else if (this.fragment.num > this.commodity.reserve) {
+        this.fragment.num = this.commodity.reserve
+      }
+      getFragment(this.commodity, this.fragment)
+    }
+  }
+}
+</script>
+<style scoped>
+  .container.commodity {
+		width: 1190px;
+		padding-left: 0px;
+		padding-right: 0px;
+		font-family: "Microsoft Yahei", "微软雅黑";
+	}
+
+	.commodity .commodity-detail {
+		width: 100%;
+		display: inline-block;
+		font-size: 0px;
+	}
+
+	.commodity-detail .img{
+		float: left;
+		width: 258px;
+		height: 320px;
+	}
+
+	.commodity-detail .img img {
+		border: 1px solid #D6D3CE;
+	}
+
+	.commodity-detail .img  .box {
+		height: 62px;
+	}
+
+	.commodity-detail .content {
+		width: 932px;
+		float: left;
+		font-size: 14px;
+	}
+
+	.commodity-detail .content {
+		padding-left: 20px;
+	}
+
+	.commodity-detail .content .code {
+		font-size: 24px;
+		color: rgb(50, 50, 50);
+		font-weight: 600;
+		border-bottom: 1px solid #D6D3CE;
+		line-height: 40px;
+	}
+
+	.commodity-detail .content .com-info {
+		font-size: 14px;
+		font-family: "Microsoft Yahei", "微软雅黑";
+		line-height: 26px;
+	}
+
+	.input-group .input-group-operate {
+		padding: 6px 12px;
+		font-size: 14px;
+		font-weight: 400;
+		line-height: 1;
+		color: #555;
+		text-align: center;
+		background-color: #eee;
+		border: 1px solid #ccc;
+		border-radius: 4px;
+	}
+
+	.input-group .input-group-operate:last-child {
+		border-bottom-left-radius: 0px;
+		border-top-left-radius: 0px;
+	}
+
+	.input-group .input-group-operate:first-child {
+		border-bottom-right-radius: 0px;
+		border-top-right-radius: 0px;
+	}
+
+	.content .com-info .name {
+		letter-spacing: 15px;
+	}
+
+	.commodity-info-detail {
+		float: left;
+		padding-top: 10px;
+		width: 582px;
+	}
+
+	.price-block {
+		float: right;
+		width: 330px;
+		margin-top: 10px;
+		height: 220px;
+	}
+
+	.commodity-price {
+		line-height: 30px;
+		text-align: center;
+		border: 1px solid #D6D3CE;
+	}
+
+	.commodity-price .title {
+		background-color: #f7f7f7;
+		border-bottom: 1px solid #D6D3CE;
+	}
+
+	.commodity-price .head {
+		border-bottom: 1px solid #D6D3CE;
+	}
+
+	.commodity-price .fragment {
+		display: inline-block;
+		width: 70px;
+	}
+
+	.commodity-price .price {
+		width: 123px;
+		display: inline-block;
+	}
+
+	.com-info div.select {
+		display: inline-block;
+	}
+
+	.com-info .operate {
+		cursor: pointer;
+	}
+
+	.com-info .operate:hover, .com-info .operate:link {
+		background-color: #00B83F;
+		color: white;
+	}
+
+	.com-info .money {
+		font-weight: 600;
+		color: red;
+	}
+
+	.com-info select {
+		border-radius: 4px;
+		width: 120px!important;
+	}
+
+	ul.list-inline {
+		margin: 0px;
+	}
+
+	.commodity-price ul.list-inline li {
+		padding-left: 0px;
+		padding-right: 0px;
+		border-bottom: 1px dashed #D6D3CE;
+	}
+
+	.commodity-price .table {
+		margin-bottom: 0px;
+	}
+
+	.commodity-price ul>li:last-child {
+		border-bottom: none;
+	}
+
+	div.button {
+		padding-top: 20px;
+		float: left;
+	}
+
+	button.btn-now {
+		border: 1px solid #3D76C6;
+		color: #3D76C6;
+		margin-left: 30px;
+	}
+
+	.com-info .delivery {
+		display: inline;
+	}
+	#commodity-info-fragment{
+		margin-bottom: 20px;
+	}
+</style>

+ 98 - 0
components/store/ComponentInfo.vue

@@ -0,0 +1,98 @@
+<template>
+  <div id="component-info-fragment">
+    <div class="component-info">
+      <div class="head">
+        <span class="tab">产品参数<b class="tip">(仅供参考,以实际产品为准)</b></span>
+      </div>
+      <ul class="list-unstyled list-inline" v-if="component.properties">
+        <li v-for="property in component.properties" v-if="property.value">
+          <div class="property-name">
+            <span v-text="property.property.labelCn"></span>:
+          </div>
+          <div class="property-value" v-text="property.value"></div>
+        </li>
+        <li v-if="!component.properties || component.properties.length === 0" class="text-center">
+          <i class="fa fa-smile-o fa-lg"></i> 暂无参数信息
+        </li>
+      </ul>
+    </div>
+  </div>
+</template>
+<script>
+
+export default {
+  name: 'component-info',
+  computed: {
+    component () {
+      return this.$store.state.shop.storeInfo.component.data
+    }
+  }
+}
+</script>
+<style scoped>
+  .component-info {
+		width: 906px;
+		margin-bottom: 16px;
+	}
+
+	.component-info .head {
+		background-color: rgb(236, 242, 253);
+		height: 40px;
+	}
+
+	.component-info ul .tab {
+		width: 130px;
+	}
+	.component-info ul{
+		padding-top: 15px;
+		padding-bottom: 15px;
+	}
+
+	.component-info ul li {
+		line-height: 30px;
+	}
+
+	.component-info .head {
+		font-size: 14px;
+		font-weight: 600;
+	}
+
+	.component-info .head .tab {
+		line-height: 40px;
+		margin-left: 10px;
+		text-align: center;
+		display: inline-block;
+	}
+
+	.component-info ul {
+		border: 1px solid #D6D3CE;;
+	}
+
+	.component-info ul li {
+		line-height: 30px;
+		font-size: 12px;
+		padding-left: 20px;
+	}
+
+	.component-info .property-name {
+		width: 130px;
+		float: left;
+		overflow: hidden;
+		text-overflow: ellipsis;
+		white-space: nowrap;
+	}
+
+	.component-info .property-value {
+		float: left;
+		width: 740px;
+	}
+
+	.tip {
+		font-size: 12px;
+		color: rgba(168, 181, 181, 0.79);
+		margin-left: 5px;
+	}
+	.ng-hide{
+		display: block !important;
+	}
+</style>

+ 343 - 0
components/store/StoreHeader.vue

@@ -0,0 +1,343 @@
+<template>
+  <div id="nav_fragment">
+    <div class="container">
+      <div class="row" style="height: 120px; padding-top: 30px; margin: 0;">
+        <!-- 店铺信息以及下拉菜单 -->
+        <div id = "shop" :class="{ 'drop-down-active' : isOpen }" @mouseleave="closeDropDown()">
+          <div class="dropdown">
+            <div style="width: 440px;">
+              <div class="dropdown-btn" style="margin-top: 0;">
+                <div style="margin-bottom: 15px;">
+                  <a role="button" class="dropdown-toggle" @mouseover="openDropDown()">
+                    <span class="shop-name" v-text="storeInfo.storeName || '店铺名称'"></span>
+                    <span><i class="fa fa-angle-down fa-fw" style="font-size: 20px;"></i></span>
+                  </a>
+                </div>
+                <div class="icon-style">
+                  <button class="btn btn-xs btn-danger btn-nav" v-if="!isFocus"><span class="watch">关注</span></button>
+                  <button class="btn btn-xs btn-default btn-nav" v-if="isFocus" style="width:50px"><span>已关注</span></button>
+                  <span v-if="storeInfo.type == 'ORIGINAL_FACTORY'">&nbsp;<img src="/images/store/icon/icon-factory.png"/></span>
+                  <span v-else-if="storeInfo.type == 'AGENCY'">&nbsp;<img src="/images/store/icon/icon-agent.png"/></span>
+                  <span v-else-if="storeInfo.type == 'DISTRIBUTION'">&nbsp;<img src="/images/store/icon/icon-distribution.png"/></span>
+                  <span v-else-if="storeInfo.type == 'CONSIGNMENT'">&nbsp;<img src="/images/store/icon/consignment.png"/></span>
+                </div>
+              </div>
+              <div class="clearfix"></div>
+            </div>
+            <div style="background: #FFFFFF;" v-if="isOpen">
+              <ul class = "shop-contact list-unstyled" style="padding: 15px 0; margin-bottom: 0; border-top: #e8e8e8 1px solid; margin-top: 20px;">
+                <li ng-if="storeInfo.enterprise.enTel.length > 0">
+                  <span>电话:</span><span v-text="storeInfo.enterprise.enTel"></span>
+                </li>
+                <li ng-if="storeInfo.enterprise.enFax.length > 0">
+                  <span>传真:</span><span v-text="storeInfo.enterprise.enFax"></span>
+                </li>
+                <li ng-if="storeInfo.enterprise.enAddress.length > 0">
+                  <span>地址:</span><span v-text="storeInfo.enterprise.enAddress"></span>
+                </li>
+                <li class="text-right">
+                  <nuxt-link :to="{ name: 'store-uuid-description', params: { uuid: storeInfo.uuid } }">了解更多&gt;</nuxt-link>
+                </li>
+              </ul>
+            </div>
+          </div>
+        </div>
+
+        <!-- 搜索框 -->
+        <div id="search-group" style="margin-left: 450px;">
+          <search-box/>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+<script>
+import SearchBox from '~components/home/Search.vue'
+
+export default {
+  name: 'store-header',
+  data () {
+    return {
+      isFocus: false,
+      isOpen: false
+    }
+  },
+  computed: {
+    storeInfo () {
+      return this.$store.state.shop.storeInfo.store.data
+    }
+  },
+  components: {
+    SearchBox
+  },
+  methods: {
+    closeDropDown () {
+      this.isOpen = false
+    },
+    openDropDown () {
+      this.isOpen = true
+    }
+  }
+}
+</script>
+<style scoped>
+  body{
+		font-family: "Microsoft Yahei", "微软雅黑";
+	}
+	#nav_fragment {
+		margin-bottom: 20px;
+	}
+
+	#nav_fragment .shop-name {
+		font-size: 24px;
+		color: RGB(50,50,50);
+	}
+
+	#nav_fragment div#shop {
+		width: 440px;
+		padding: 5px;
+	}
+
+	#nav_fragment .shop-info {
+		font-size: 12px;
+		color: rgb(50,50,50);
+	}
+
+	#nav_fragment .shop-data {
+		font-size: 12px;
+		line-height: 25px;
+		font-weight: 600;
+		color: RGB(255,0,0);
+	}
+
+	#nav_fragment .btn-nav{
+		width: 40px;
+		height: 20px;
+		line-height: 14px;
+	}
+
+	#nav_fragment .btn-nav .watch {
+		font-size: 12px;
+		color: white;
+	}
+
+	#nav_fragment .btn-nav .message {
+		font-size: 12px;
+		color: rgb(50,50,50);
+	}
+
+	#nav_fragment div.dropdown {
+		margin-top: -5px;
+		padding: 5px;
+	}
+
+	#nav_fragment .shop-contact {
+		font-size: 14px;
+		color: rgb(120,120,120);
+		line-height: 25px;
+	}
+
+	#nav_fragment .shop-contact a{
+		color: rgb(33,71,151);
+	}
+
+	#nav_fragment #search_input {
+		height: 40px;
+		font-size: 16px;
+		font-family: '微软雅黑';
+		border: 2px solid #5078cb;
+		border-top-left-radius: 0px;
+		border-bottom-left-radius: 0px;
+		line-height: 40px;
+	}
+
+	#nav_fragment #search_input:focus {
+		border-color: #5078cb;
+		outline: 0;
+		-webkit-box-shadow: none;
+		box-shadow: none;
+	}
+
+	#nav_fragment #search_btn {
+		background-color: #5078cb;
+		color: rgb(255, 255, 255);
+		font-size: 16px;
+		width: 78px;
+		height: 40px;
+		border: 2px solid #5078cb;
+		border-radius: 0;
+	}
+
+	#nav_fragment #search_btn_this {
+		height: 36px;
+		line-height: 36px;
+		padding-top: 0px;
+		padding-bottom: 0px;
+		font-size: 16px;
+		font-weight: 600;
+		color: #5078cb;
+		background: #fff;
+		border-radius: 0;
+		border: 1px #5078cb solid;
+	}
+
+	#nav_fragment .my-cart {
+		margin-top: 20px;
+		margin-left: 20px;
+	}
+
+	#nav_fragment .my-cart #my-cart{
+		font-size: 14px;
+		color: #5078cb;
+	}
+
+	#nav_fragment .my-cart .badge {
+		background-color: #ff0000;
+		position: absolute;
+		top: -10px;
+	}
+
+	#nav_fragment .list-unstyled {
+		list-style: none;
+	}
+
+	#nav_fragment a:hover,a:focus {
+		text-decoration: none;
+	}
+
+	#nav_fragment .row>div {
+		float: left;
+	}
+
+	#nav_fragment #shop {
+		width: 100%;
+		position: absolute;
+		float: left;
+	}
+
+	#nav_fragment #search-group {
+		padding-top: 20px;
+		margin-left: 10px;
+		padding-left: 20px;
+		top: -12px;
+		position: relative;
+	}
+
+	#nav_fragment #search-group .input-group {
+		margin-right: 10px;
+		float: left;
+		width: 480px;
+	}
+
+	#nav_fragment .dropdown .dropdown-menu .dropdown-btn {
+		float: left;
+		margin-top: 30px;
+	}
+
+	#nav_fragment .dropdown .dropdown-score .description {
+		padding-top: 10px;
+		color: #323232;
+		font-size: 12px;
+	}
+
+	#nav_fragment .dropdown .dropdown-score .score {
+		display: inline-block;
+		padding-top: 5px;
+		color: #FF6868;
+		font-size: 12px;
+	}
+
+	#nav_fragment .dropdown .dropdown-menu .dropdown-score>div>div {
+		margin-top: 0px;
+		width: 25px;
+		margin-right: 10px;
+	}
+
+	#nav_fragment .shop-score {
+		margin-top: 20px;
+		margin-left: 70px;
+	}
+
+	#nav_fragment .shop-score>div>div {
+		margin-right: 10px;
+		width: 25px;
+	}
+
+	#nav_fragment .hot-search .active-search-item {
+		color: #ff0101;
+		font-size: 13px;
+		display: inline-block;
+		margin-right: 1em;
+	}
+
+	#nav_fragment .hot-search .resources {
+		font-size: 12px;
+		font-family: "Microsoft Yahei", "微软雅黑";
+		color: rgb(250,50,50);
+	}
+
+	#nav_fragment .hot-search .hot-word {
+		font-size: 12px;
+		color: rgb(50,50,50);
+		margin-left: 20px;
+	}
+	#nav_fragment .drop-down-active {
+		z-index: 20;
+		-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 2px rgba(210,209,209,.9);
+		box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 2px rgba(210,209,209,.9);
+		border: #f5f5f5 1px solid;
+		background-color: white;
+		transition: dispaly .5s ease;
+	}
+	.hot-search{
+		margin-top: 5px;
+	}
+	.hot-search .static{
+		color: #f00;
+	}
+	.hot-search a{
+		color: #838383;
+	}
+	.hot-search a:hover{
+		color: #f00;
+	}
+	.my-cart .btn{
+		top: -8px;
+		position: relative;
+	}
+	#search-group .association {
+		position: absolute;
+		left: 0;
+		top: 100%;
+		right: 61px;
+		list-style: none;
+		-webkit-padding-start: 0;
+		background: #ffffff;
+		border: 1px solid #dddddd;
+		z-index: 21;
+	}
+
+	#search-group .association li {
+		padding: 0 15px;
+		line-height: 30px;
+		text-align: left;
+		font-family: "Microsoft Yahei";
+	}
+
+	#search-group .association li:hover {
+		background: #EEEEEE;
+		cursor: pointer;
+	}
+	.text-right{
+		text-align: right;
+	}
+	.text-right a:hover{
+		color: #d32526 !important;
+		text-decoration: underline;
+	}
+	.icon-style img{
+		vertical-align: top;
+		position: relative;
+		top: -9px;
+	}
+</style>

+ 84 - 0
components/store/StoreTitle.vue

@@ -0,0 +1,84 @@
+<template>
+  <div class="container" id="title-fragment">
+    <div class="container">
+      <div class="row" style="margin-bottom: 20px;">
+        <!-- 商标展示 -->
+        <div class="shop-logo">
+          <img :src="storeInfo.logoUrl || '/images/store/common/default.png'" />
+        </div>
+        <!-- 店名展示 -->
+        <div class="shop-banner">
+          <img :src="storeInfo.bannerUrl || '/images/store/default/shop_banner.png'">
+          <div id="shop-title" v-if="storeInfo.storeShortName" v-text="storeInfo.storeShortName">店铺名称</div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+<script>
+
+export default {
+  name: 'store-title',
+  computed: {
+    storeInfo () {
+      return this.$store.state.shop.storeInfo.store.data
+    }
+  }
+}
+</script>
+<style scoped>
+  #title-fragment {
+		padding: 0;
+	}
+	#title-fragment .container {
+		width: 1190px;
+		padding-left: 0px;
+		padding-right: 0px;
+	}
+	#title-fragment .container >.row {
+		margin-left: 0px;
+		margin-right: 0px;
+	}
+	#title-fragment .shop-logo {
+		width: 220px;
+		height: 220px;
+		border: 1px solid #e8e8e8;
+		float: left;
+		text-align: center;
+		line-height: 210px;
+		overflow: hidden;
+	}
+
+	#title-fragment .shop-logo img {
+		max-width: 220px;
+		max-height: 220px;
+		vertical-align: middle;
+	}
+
+	#title-fragment .shop-banner {
+		float: left;
+		position: relative;
+		width: 970px;
+		height: 220px;
+		border: 1px solid #e8e8e8;
+		border-left: none;
+		overflow: hidden;
+	}
+
+	#title-fragment .shop-banner img {
+		width: 970px;
+		height: 220px;
+	}
+
+	#title-fragment .shop-banner #shop-title {
+		position: absolute;
+		top: 50px;
+		left: 60px;
+		font-size: 30px;
+		color: rgb(255,255,255);
+	}
+	.container{
+		width: 1190px;
+		padding: 0;
+	}
+</style>

+ 7 - 0
components/store/index.js

@@ -0,0 +1,7 @@
+import StoreHeader from './StoreHeader.vue'
+import StoreTitle from './StoreTitle.vue'
+import BaseInfo from './BaseInfo.vue'
+import ComponentInfo from './ComponentInfo.vue'
+import CommodityInfo from './CommodityInfo.vue'
+
+export { StoreHeader, StoreTitle, BaseInfo, ComponentInfo, CommodityInfo }

+ 28 - 0
layouts/shop.vue

@@ -0,0 +1,28 @@
+<template>
+  <div id="main">
+    <header-view></header-view>
+    <store-header/>
+    <store-title/>
+    <nuxt/>
+    <footer-view></footer-view>
+    <right-bar></right-bar>
+  </div>
+</template>
+<script>
+  import { Header, Footer, RightBar } from '~components/default'
+  import { StoreHeader, StoreTitle } from '~components/store'
+
+  export default {
+    name: 'shop',
+    components: {
+      HeaderView: Header,
+      FooterView: Footer,
+      RightBar,
+      StoreHeader,
+      StoreTitle
+    }
+  }
+</script>
+<style>
+
+</style>

+ 7 - 1
nuxt.config.js

@@ -49,7 +49,8 @@ module.exports = {
     },
     vendor: [
       'axios',
-      'swiper'
+      'swiper',
+      'element-ui'
     ],
     babel: {
       presets: ['es2015', 'stage-2'],
@@ -74,6 +75,8 @@ module.exports = {
     lang: 'scss'
   }, {
     src: 'swiper/dist/css/swiper.css'
+  }, {
+    src: 'element-ui/lib/theme-default/index.css'
   }],
   dev: !isProdMode,
   env: {
@@ -90,6 +93,9 @@ module.exports = {
   }, {
     src: '~plugins/vue-empty.js',
     ssr: false
+  }, {
+    src: '~plugins/element-ui.js',
+    ssr: false
   }],
   proxyTable: ['/api/**', '/search/**', '/user/**', '/login/**', '/logout/**']
 }

+ 1 - 1
package.json

@@ -9,10 +9,10 @@
     "bezier-easing": "^2.0.3",
     "bootstrap": "^3.3.7",
     "cross-env": "^3.1.4",
+    "element-ui": "^1.3.7",
     "express": "^4.14.1",
     "font-awesome": "^4.7.0",
     "http-proxy-middleware": "^0.17.4",
-    "jquery": "^3.2.1",
     "nuxt": "0.10.6",
     "iview": "^2.0.0-rc.19",
     "vue-awesome-swiper": "^2.5.4"

+ 42 - 0
pages/store/_uuid/_batchCode.vue

@@ -0,0 +1,42 @@
+<template>
+  <div class="container commodity">
+    <commodity-info />
+    <component-info />
+  </div>
+</template>
+<script>
+import { ComponentInfo, CommodityInfo } from '~components/store'
+
+export default {
+  layout: 'shop',
+  data () {
+    return {
+      uuid: this.$route.params.uuid,
+      batchCode: this.$route.params.batchCode,
+      breadcrumbs: [
+        { name: '商城首页', to: {} },
+        { name: '商城首页', to: {} },
+        { name: '商城首页', to: {} }
+      ]
+    }
+  },
+  fetch ({ store, route }) {
+    return Promise.all([
+      store.dispatch('shop/findStoreInfoFromUuid', route.params),
+      store.dispatch('shop/findCommodityOnBatchInfo', route.params)
+    ])
+  },
+  components: {
+    ComponentInfo,
+    CommodityInfo
+  }
+}
+</script>
+<style scoped>
+  .container.commodity {
+		width: 1190px;
+		padding-left: 0px;
+		padding-right: 0px;
+		font-family: "Microsoft Yahei", "微软雅黑";
+	}
+</style>

+ 23 - 0
pages/store/_uuid/description.vue

@@ -0,0 +1,23 @@
+<template>
+  <div class="container">
+    <base-info/>
+  </div>
+</template>
+<script>
+import { BaseInfo } from '~components/store'
+
+export default {
+  layout: 'shop',
+  fetch ({ store, route }) {
+    return Promise.all([
+      store.dispatch('shop/findStoreInfoFromUuid', route.params)
+    ])
+  },
+  components: {
+    BaseInfo
+  }
+}
+</script>
+<style>
+
+</style>

+ 6 - 1
pages/store/_uuid.vue → pages/store/_uuid/index.vue

@@ -6,11 +6,16 @@
 <script>
 
 export default {
-  layout: 'main',
+  layout: 'shop',
   data () {
     return {
       uuid: this.$route.params.uuid
     }
+  },
+  fetch ({ store, route }) {
+    return Promise.all([
+      store.dispatch('shop/findStoreInfoFromUuid', route.params)
+    ])
   }
 }
 </script>

+ 5 - 0
plugins/element-ui.js

@@ -0,0 +1,5 @@
+import Vue from 'vue'
+import { Breadcrumb, BreadcrumbItem } from 'element-ui'
+
+Vue.use(Breadcrumb)
+Vue.use(BreadcrumbItem)

BIN
static/images/store/common/timg.png


BIN
static/images/store/icon/consignment.png


BIN
static/images/store/icon/icon-agent.png


BIN
static/images/store/icon/icon-distribution.png


BIN
static/images/store/icon/icon-factory.png


+ 31 - 0
store/shop.js

@@ -0,0 +1,31 @@
+import axios from '~plugins/axios'
+
+export const actions = {
+  // 根据UUID获取某店铺信息
+  findStoreInfoFromUuid ({ commit }, params = {}) {
+    commit('storeInfo/REQUEST_STORE_INFO')
+    return axios.get('/api/store-service/stores', { params })
+      .then(response => {
+        commit('storeInfo/GET_STORE_INFO_SUCCESS', response.data)
+      }, err => {
+        commit('storeInfo/GET_STORE_INFO_FAILURE', err)
+      })
+  },
+  findCommodityOnBatchInfo ({ commit }, params = {}) {
+    commit('storeInfo/REQUEST_COMMODITY')
+    return axios.get(`/api/commodity/${params.batchCode || ''}/detail`)
+      .then(response => {
+        commit('storeInfo/GET_COMMODITY_SUCCESS', response.data)
+        let commodity = response.data || {}
+        commit('storeInfo/REQUEST_COMPONENT')
+        return axios.get(`/api/commodity/component/${commodity.uuid}`)
+          .then(response => {
+            commit('storeInfo/GET_COMPONENT_SUCCESS', response.data)
+          }, err => {
+            commit('storeInfo/GET_COMPONENT_FAILURE', err)
+          })
+      }, err => {
+        commit('storeInfo/GET_COMMODITY_FAILURE', err)
+      })
+  }
+}

+ 50 - 0
store/shop/storeInfo.js

@@ -0,0 +1,50 @@
+/**
+ * 店铺状态信息
+ */
+export const state = () => ({
+  store: {
+    fetching: false,
+    data: {}
+  },
+  commodity: {
+    fetching: false,
+    data: {}
+  },
+  component: {
+    fetching: false,
+    data: {}
+  }
+})
+
+export const mutations = {
+  REQUEST_STORE_INFO (state) {
+    state.store.fetching = true
+  },
+  GET_STORE_INFO_FAILURE (state) {
+    state.store.fetching = false
+  },
+  GET_STORE_INFO_SUCCESS (state, result = {}) {
+    state.store.fetching = false
+    state.store.data = result
+  },
+  REQUEST_COMMODITY (state) {
+    state.commodity.fetching = true
+  },
+  GET_COMMODITY_FAILURE (state) {
+    state.commodity.fetching = false
+  },
+  GET_COMMODITY_SUCCESS (state, result = {}) {
+    state.commodity.fetching = false
+    state.commodity.data = result
+  },
+  REQUEST_COMPONENT (state) {
+    state.component.fetching = true
+  },
+  GET_COMPONENT_FAILURE (state) {
+    state.component.fetching = false
+  },
+  GET_COMPONENT_SUCCESS (state, result = {}) {
+    state.component.fetching = false
+    state.component.data = result
+  }
+}

+ 39 - 7
yarn.lock

@@ -184,6 +184,16 @@ async-foreach@^0.1.3:
   version "0.1.3"
   resolved "http://registry.npm.taobao.org/async-foreach/download/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542"
 
+async-validator@1.6.9:
+  version "1.6.9"
+  resolved "http://registry.npm.taobao.org/async-validator/download/async-validator-1.6.9.tgz#a8309daa8b83421cdbd4628e026d6abb25192d34"
+
+async-validator@^1.7.1:
+  version "1.7.1"
+  resolved "http://registry.npm.taobao.org/async-validator/download/async-validator-1.7.1.tgz#89d3d7a384ca5d05e0f07bf51754d591e2cfec61"
+  dependencies:
+    babel-runtime "6.x"
+
 async@^2.1.2, async@^2.1.5:
   version "2.5.0"
   resolved "http://registry.npm.taobao.org/async/download/async-2.5.0.tgz#843190fd6b7357a0b9e1c956edddd5ec8462b54d"
@@ -384,7 +394,7 @@ babel-helper-replace-supers@^6.24.1:
     babel-traverse "^6.24.1"
     babel-types "^6.24.1"
 
-babel-helper-vue-jsx-merge-props@^2.0.2:
+babel-helper-vue-jsx-merge-props@^2.0.0, babel-helper-vue-jsx-merge-props@^2.0.2:
   version "2.0.2"
   resolved "http://registry.npm.taobao.org/babel-helper-vue-jsx-merge-props/download/babel-helper-vue-jsx-merge-props-2.0.2.tgz#aceb1c373588279e2755ea1cfd35c22394fd33f8"
 
@@ -809,7 +819,7 @@ babel-register@^6.24.1:
     mkdirp "^0.5.1"
     source-map-support "^0.4.2"
 
-babel-runtime@^6.18.0, babel-runtime@^6.20.0, babel-runtime@^6.22.0:
+babel-runtime@6.x, babel-runtime@^6.18.0, babel-runtime@^6.20.0, babel-runtime@^6.22.0:
   version "6.23.0"
   resolved "http://registry.npm.taobao.org/babel-runtime/download/babel-runtime-6.23.0.tgz#0a9489f144de70efb3ce4300accdb329e2fc543b"
   dependencies:
@@ -1325,7 +1335,7 @@ cookie@0.3.1:
   version "0.3.1"
   resolved "http://registry.npm.taobao.org/cookie/download/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb"
 
-core-js@^2.4.0:
+core-js@^2.4.0, core-js@^2.4.1:
   version "2.4.1"
   resolved "http://registry.npm.taobao.org/core-js/download/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e"
 
@@ -1557,7 +1567,7 @@ deep-is@~0.1.3:
   version "0.1.3"
   resolved "http://registry.npm.taobao.org/deep-is/download/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
 
-deepmerge@^1.2.0:
+deepmerge@^1.2.0, deepmerge@^1.5.0:
   version "1.5.0"
   resolved "http://registry.npm.taobao.org/deepmerge/download/deepmerge-1.5.0.tgz#00bc5b88fd23b8130f9f5049071c3420e07a5465"
 
@@ -1716,6 +1726,15 @@ electron-to-chromium@^1.2.7, electron-to-chromium@^1.3.14:
   version "1.3.15"
   resolved "http://registry.npm.taobao.org/electron-to-chromium/download/electron-to-chromium-1.3.15.tgz#08397934891cbcfaebbd18b82a95b5a481138369"
 
+element-ui@^1.3.7:
+  version "1.3.7"
+  resolved "http://registry.npm.taobao.org/element-ui/download/element-ui-1.3.7.tgz#ed6e2e371b767fd7b8a8015dc284e4af5e940026"
+  dependencies:
+    async-validator "1.6.9"
+    babel-helper-vue-jsx-merge-props "^2.0.0"
+    deepmerge "^1.2.0"
+    throttle-debounce "^1.0.1"
+
 elliptic@^6.0.0:
   version "6.4.0"
   resolved "http://registry.npm.taobao.org/elliptic/download/elliptic-6.4.0.tgz#cac9af8762c85836187003c8dfe193e5e2eae5df"
@@ -2778,9 +2797,14 @@ isstream@~0.1.2:
   version "0.1.2"
   resolved "http://registry.npm.taobao.org/isstream/download/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
 
-jquery@^3.2.1:
-  version "3.2.1"
-  resolved "http://registry.npm.taobao.org/jquery/download/jquery-3.2.1.tgz#5c4d9de652af6cd0a770154a631bba12b015c787"
+iview@^2.0.0-rc.19:
+  version "2.0.0-rc.19"
+  resolved "http://registry.npm.taobao.org/iview/download/iview-2.0.0-rc.19.tgz#48e9517e58099cc5f253746cd047dcbaf526dc1e"
+  dependencies:
+    async-validator "^1.7.1"
+    core-js "^2.4.1"
+    deepmerge "^1.5.0"
+    popper.js "^0.6.4"
 
 js-base64@^2.1.8, js-base64@^2.1.9:
   version "2.1.9"
@@ -3605,6 +3629,10 @@ pluralize@^1.2.1:
   version "1.2.1"
   resolved "http://registry.npm.taobao.org/pluralize/download/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45"
 
+popper.js@^0.6.4:
+  version "0.6.4"
+  resolved "http://registry.npm.taobao.org/popper.js/download/popper.js-0.6.4.tgz#1837c4760af54d2bb20b66f9c09b92993d84c629"
+
 post-compile-webpack-plugin@^0.1.1:
   version "0.1.1"
   resolved "http://registry.npm.taobao.org/post-compile-webpack-plugin/download/post-compile-webpack-plugin-0.1.1.tgz#1b1a0eea890ce748556ca49e066a48c900e0b370"
@@ -4656,6 +4684,10 @@ text-table@~0.2.0:
   version "0.2.0"
   resolved "http://registry.npm.taobao.org/text-table/download/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
 
+throttle-debounce@^1.0.1:
+  version "1.0.1"
+  resolved "http://registry.npm.taobao.org/throttle-debounce/download/throttle-debounce-1.0.1.tgz#dad0fe130f9daf3719fdea33dc36a8e6ba7f30b5"
+
 through@^2.3.6:
   version "2.3.8"
   resolved "http://registry.npm.taobao.org/through/download/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"