Forráskód Böngészése

Merge remote-tracking branch 'origin/feature-201823-wangcz' into feature-201823-wangcz

# Conflicts:
#	components/mobile/staffManagement/StaffList.vue
yangc 7 éve
szülő
commit
0c5c2b756a

+ 50 - 31
components/home/displayCard.vue

@@ -10,7 +10,7 @@
          </ul>
          <ul class="list-unstyled">
            <li ref="pingdanListWrapper" v-for="(c, index) in counts"  :style="'top: -' + 30 * timerIndex + 'px'" :class="{'top': isTop}">
-             <span v-html="formatScrollNumber(c.count, c.logo)"></span>
+             <span v-for="(item, index) in formatScrollNumber(c.count, c.logo)" class="count-distance" :class="'count' + index">{{item}}</span>
            </li>
          </ul>
        </div>
@@ -20,9 +20,6 @@
            <span style="color: #333" v-if="item.type === 2">条</span>
          </p>
        </div>
-       <a class="enter" @click="goStoreApply()">
-         <img src="/images/all/enter2.png">
-       </a>
      </div>
   </div>
 </template>
@@ -85,7 +82,7 @@
             let length = String(num).length
             this.len = length > 3 ? length + 1 : length
             num = (Array(7 - length).join(0) + num)
-            num += '&nbsp;<span style="color: #376ef3;font-size: 16px;position:relative;top: -3px;">亿</span>'
+            num = num.toString() + '亿'
           } else if (num > 9999) {
             let str = num.toString()
             num = Math.floor(num / 10000)
@@ -95,15 +92,15 @@
             let length = String(num).length
             this.len = length > 3 ? length + 1 : length
             num = (Array(7 - length).join(0) + num)
-            num += '&nbsp;<span style="color: #376ef3;font-size: 16px;position:relative;top: -3px;">万</span>'
+            num = num.toString() + '万'
           } else {
             let length = String(num).length
             this.len = length > 3 ? length + 1 : length
             num = (Array(7 - length).join(0) + num)
             if (logo === 0) {
-              num += '&nbsp;<span style="color: #376ef3;font-size: 16px;position:relative;top: -3px;">家</span>'
+              num = num.toString() + '家'
             } else {
-              num += '&nbsp;<span style="color: #376ef3;font-size: 16px;position:relative;top: -3px;">个</span>'
+              num = num.toString() + '个'
             }
           }
         }
@@ -112,7 +109,11 @@
 //        }
 //        num = num.split('')
 //        console.log(num)
-        return num
+        let _arr = []
+        for (let i = 0; i < num.length; i++) {
+          _arr.push(num[i])
+        }
+        return _arr
       },
       formatNumber (num, type) {
         if (num) {
@@ -159,7 +160,7 @@
           }
         }
         return num
-      }
+      },
     },
     computed: {
       allCount () {
@@ -213,15 +214,15 @@
 <style lang="scss" scoped>
   .display-card{
     position: fixed;
-    right: 100px;
-    top: 100px;
-    width: 180px;
-    height: 540px;
+    right: 116px;
+    top: 235px;
+    /*width: 180px;*/
+    /*height: 540px;*/
     z-index: 100;
     .cardClose{
       position: absolute;
-      right: 3px;
-      top: 1px;
+      right: -5px;
+      top: 12px;
       opacity: 0.8;
       &:hover{
         cursor: pointer;
@@ -229,14 +230,14 @@
     }
     .content{
       margin-top: 10px;
-      width: 178px;
-      height: 536px;
-      background: url('/images/all/countBackground1.png') no-repeat;
+      /*width: 178px;*/
+      /*height: 536px;*/
+      background: url('/images/all/countBg.png') no-repeat;
       div{
-        height: 72px;
+        height: 56px;
         width: 158px;
-        padding-top: 30px;
-        margin-left: 6px;
+        padding-top: 19px;
+        margin-left: 16px;
         &:first-child{
           height: 109px;
           padding-top: 1px;
@@ -254,7 +255,7 @@
                   font-weight: bold;
                   font-size: 21px;
                   letter-spacing: 0px;
-                  color: #fff000;
+                  color: #ff3600;
                   position: relative;
                   top: 0;
                   transition: top 1s;
@@ -277,24 +278,42 @@
               top: 21px;
               text-align: right;
               li{
+                position: relative;
+                top: 0;
+                left: 0;
+                margin: 0 auto;
+                width: 141px;
                 height: 30px;
-                line-height: 30px;
+                line-height: 28px;
                 font-weight: bold;
                 font-size: 21px;
-                color: #fff;
-                position: relative;
-                top: 0;
-                left: -28px;
+                text-align: left;
+                color: #bc1b1c;
                 transition: top 1s;
-                -moz-transition: top 1s; /* Firefox 4 */
-                -webkit-transition: top 1s; /* Safari and Chrome */
-                -o-transition: top 1s; /* Opera */
+                -moz-transition: top 1s;
+                -webkit-transition: top 1s;
+                -o-transition: top 1s;
                 &.top {
                   transition: top 0s;
                   -moz-transition: top 0s; /* Firefox 4 */
                   -webkit-transition: top 0s; /* Safari and Chrome */
                   -o-transition: top 0s; /* Opera */
                 }
+                span.count-distance{
+                  display: inline-block;
+                  padding-left: 3.3px;
+                  margin-left: 2px;
+                  font-size: 18px;
+                  color: #bc1b1c;
+                  width: 17px;
+                }
+                span.count-distance.count6{
+                  position:relative;
+                  top: -2px;
+                  padding-left: 0;
+                  font-weight: bold;
+                  color: #fff;
+                }
               }
             }
           }

+ 11 - 0
components/main/Header.vue

@@ -19,6 +19,17 @@
         <!-- <div class="header-count pull-right">
            <count-box></count-box>
          </div>-->
+        <!--立即入驻 新手指南-->
+        <div class="header-count pull-right">
+          <!--新手指南-->
+          <a class="enter" href="/help/home" target="_blank">
+            <img src="/images/all/newPointer.jpg"/>
+          </a>
+          <!--立即入驻-->
+          <a class="enter" @click="goStoreApply()">
+            <img src="/images/all/goInto.jpg"/>
+          </a>
+        </div>
       </div>
     </div>
   </div>

+ 1 - 1
components/main/Nav.vue

@@ -41,7 +41,7 @@
       <nuxt-link to="/product/brand/brandList/A" class="item">
         <span>品牌墙</span>
       </nuxt-link>
-      <nuxt-link :to="'/store/' + pcbId" class="item">
+      <nuxt-link to="/pcb" class="item">
         <span>PCB专区</span>
       </nuxt-link>
       <nuxt-link to="/news" class="item">

+ 4 - 4
components/mobile/staffManagement/StaffList.vue

@@ -16,7 +16,7 @@
         <div class="staff-record" v-if="switchType === 'info'">
           <div class="search-content clearfix">
             <div class="search">
-              <input type="text" placeholder="人员姓名、电话号码、邮箱或UU" v-model="staffSearch" class="staff-search" @keyup.13="staffRecord()">
+              <input type="text" placeholder="人员姓名、电话号码、邮箱" v-model="staffSearch" class="staff-search" @keyup.13="staffRecord()">
               <span @click="staffRecord()"><i class="iconfont icon-sousuo"></i></span>
             </div>
             <div class="search-filter">
@@ -30,7 +30,7 @@
           <div class="list-content" v-if="staffDataList && staffDataList.length">
             <div class="bg" v-for="item in staffDataList">
               <div class="staff-list">
-                <div class="list-item"><span>UU账号:</span><span v-text="item.userUU">100000721</span></div>
+                <!--<div class="list-item"><span>UU账号:</span><span v-text="item.userUU">100000721</span></div>-->
                 <div class="list-item"><span>姓名:</span><span v-text="item.userName">张洪别</span></div>
                 <div class="list-item"><span>性别:</span><span v-text="item.userSex === 'F' ? '女' : item.userSex === 'M' ? '男' : '-'">男</span></div>
                 <div class="list-item"><span>手机号:</span><span v-text="item.userTel">12345678901</span></div>
@@ -49,14 +49,14 @@
         </div>
         <div class="staff-record" v-if="switchType === 'Audit'">
           <div class="search-content">
-            <input type="text" placeholder="人员姓名、电话号码、邮箱或UU" v-model="auditSearch" @keyup.13="searchAudit()">
+            <input type="text" placeholder="人员姓名、电话号码、邮箱" v-model="auditSearch" @keyup.13="searchAudit()">
             <span @click="searchAudit()"><i class="iconfont icon-sousuo"></i></span>
           </div>
           <div class="list-content" v-if="AuditList && AuditList.length">
             <div class="bg" v-for="item in AuditList">
               <div class="staff-list">
                 <div class="list-item"><span>用户名:</span><span v-text="item.user.vipName"></span></div>
-                <div class="list-item"><span>UU账号:</span><span v-text="item.user.userUU">100000721</span></div>
+                <!--<div class="list-item"><span>UU账号:</span><span v-text="item.user.userUU">100000721</span></div>-->
                 <div class="list-item"><span>手机号:</span><span v-text="item.user.mobile">12345678901</span></div>
                 <div class="list-item"><span>邮箱:</span><span v-text="item.user.email">12345678901</span></div>
               </div>

+ 815 - 0
components/pcb/home/CommodityList.vue

@@ -0,0 +1,815 @@
+<template>
+  <div id="goods-list-fragment">
+    <div class="container">
+      <div class="content-adv">
+        <div class="title-adv"><span>全球共享交易平台</span><span>全球共享询价平台</span></div>
+        <div class="input-group">
+          <input type="search" class="form-control" id="search_input" title="code" placeholder="型号/品牌"
+                 v-model="searchCode" @search="goodsSearch(searchCode)"/>
+          <span class="input-group-btn">
+            <button type="button" class="btn" id="search_btn" @click="goodsSearch(searchCode)">&nbsp;搜&nbsp;索&nbsp;</button>
+          </span>
+          <span class="input-group-btn">
+            <button type="button" class="btn sendprove" @click="sendprove()">我要发布产品</button>
+          </span>
+        </div>
+      </div>
+      <!-- 产品列表 -->
+      <div class="goods-area">
+        <!-- 列表展示 -->
+        <table class="goodslist" style="width: 955px;background:#fff;" >
+          <thead>
+          <tr>
+            <th width="165"><div>品牌/物料名称</div></th>
+            <th width="148"><div>型号/规格</div></th>
+            <th width="114"><div>包装/生产日期</div></th>
+            <th width="125"><div>库存</div></th>
+            <th width="149"><div>价格梯度(PCS)</div></th>
+            <th width="67"><div>交期(天)</div></th>
+            <th width="66"><div>规格书</div></th>
+            <th width="95"><div>操作</div></th>
+          </tr>
+          </thead>
+          <tbody id="goodslist-content">
+          <tr v-for="commodity in commodities.content" @click="goBatchDetail(commodity)">
+            <td class="brand-code">
+              <img class="sellout-store-commodity" v-if="commodity.status === 602" src="/images/search/sellout-search.png" alt="">
+              <img class="specific-price-tag" v-if="isSpecificPriceTag(commodity.tag) && isConsignment" src="/images/floor/specificPrice-store.png" alt="">
+              <div class="brand" v-if="commodity.brandNameEn || commodity.brandEn">
+                <a v-if="commodity.brandNameEn && commodity.branduuid" @click="goBrandDetail('/product/brand/' + commodity.branduuid, $event)" v-text="commodity.brandNameEn" :title="commodity.brandNameEn"></a>
+                <span v-if="commodity.brandNameEn && !commodity.branduuid" v-text="commodity.brandNameEn" :title="commodity.brandNameEn"></span>
+                <span v-if="commodity.brandEn && !commodity.branduuid" :title="commodity.brandEn">{{commodity.brandEn}}</span>
+              </div>
+              <div class="brand" v-if="!commodity.brandNameEn && !commodity.brandEn && commodity.kindNameCn">—</div>
+              <a v-if="commodity.kindNameCn && commodity.kindUuid" @click="goBrandDetail('/product/kind/' + commodity.kindUuid, $event)" v-text="commodity.kindNameCn" :title="commodity.kindNameCn"></a>
+              <span v-if="commodity.kindNameCn && !commodity.kindUuid" v-text="commodity.kindNameCn" :title="commodity.kindNameCn"></span>
+              <div class="brand" v-if="!commodity.kindNameCn && (commodity.brandNameEn || commodity.brandEn)">—</div>
+              <div class="brand" v-if="!commodity.brandNameEn && !commodity.brandEn && !commodity.kindNameCn">—</div>
+            </td>
+            <td class="brand-code">
+              <div class="code" v-if="commodity.code" v-text="commodity.code" :title="commodity.code"></div>
+              <div class="code" v-if="!commodity.code">—</div>
+              <div class="brand spec" v-text="commodity.spec || '—'" :title="commodity.spec"></div>
+            </td>
+            <td>
+              <div class="package" v-if="commodity.packaging" v-text="commodity.packaging" :title="commodity.packaging"></div>
+              <div class="package" v-if="!commodity.packaging && !commodity.produceDate">—</div>
+              <div class="date" v-if='commodity.produceDate' v-text="commodity.produceDate" :title="commodity.produceDate">2016-12-01</div>
+            </td>
+            <td style="text-align: left;vertical-align: middle;">
+              <div class="goods" v-if="commodity.reserve">
+                库存:<span v-text="commodity.reserve" :title="commodity.reserve">31500</span>
+              </div>
+              <div v-if="!commodity.reserve" style="text-align: center;margin-left: 0;"><span>—</span></div>
+              <div class="from" v-if="commodity.reserve && commodity.reserve>0">
+                起拍:<span v-if="commodity.minBuyQty" v-text="commodity.minBuyQty" :title="commodity.minBuyQty">300</span>
+              </div>
+              <div class="can-div-sell" v-if="commodity.reserve" v-text="commodity.breakUp?'可拆卖':'不可拆卖'"></div>
+            </td>
+            <td>
+              <div class="amount">
+                <div  v-for="price in commodity.prices" v-text="price.start + '+'" :title="price.start + '+'"></div>
+              </div>
+              <div class="price">
+                <div v-show="!commodity.prices || !commodity.prices.length">
+                  <span>—</span>
+                </div>
+                <template v-if="commodity.currencyName === 'RMB'">
+                  <div v-for="price in commodity.prices" :title="'¥' + price.rMBPrice">¥{{price.rMBPrice | currency}}</div>
+                </template>
+                <template v-else>
+                  <div v-for="price in commodity.prices" :title="'$' + price.uSDPrice">${{price.uSDPrice | currency}}</div>
+                </template>
+              </div>
+            </td>
+            <td>
+              <div v-if="commodity.b2cMinDelivery">
+                <span v-if="commodity.b2cMinDelivery != commodity.b2cMaxDelivery" v-text="commodity.b2cMinDelivery + '-' + commodity.b2cMaxDelivery" :title="commodity.b2cMinDelivery + '-' + commodity.b2cMaxDelivery"></span>
+                <span v-if="commodity.b2cMinDelivery == commodity.b2cMaxDelivery" v-text="commodity.b2cMinDelivery" :title="commodity.b2cMinDelivery"></span>
+              </div>
+              <div v-if="!commodity.b2cMinDelivery"><span>—</span></div>
+            </td>
+            <td>
+              <div v-if="commodity.attach">
+                <a @click="goAttach(commodity.attach, $event)" target="_blank"><img src="/images/store/common/pdf.png" alt=""/></a>
+              </div>
+              <div v-if="!commodity.attach">—</div>
+            </td>
+            <td>
+              <buy :item="commodity"></buy>
+            </td>
+          </tr>
+          <tr class="active-empty" v-if="!commodities.content || commodities.content.length == 0">
+            <td colspan="10" style="height: 880px;">
+              <div class="text-center">
+                <div class="col-xs-offset-3 col-xs-2">
+                  <img src="/images/brandList/empty-cart.jpg">
+                </div>
+                <div class="col-xs-4 txt-info">
+                  <p class="grey f16"> 暂无产品信息</p>
+                  <i class="iconfont" v-if="emptyShow === false">&#xe610;</i>&nbsp;<a v-if="emptyShow === false" href="/">返回首页</a>
+                  <img v-if="emptyShow === true" src="/images/brandList/upload.png">&nbsp;<a v-if="emptyShow === true" href="/vendor#/vendor_upload?type=company" target="_blank">马上去上传</a>
+                </div>
+              </div>
+            </td>
+          </tr>
+          </tbody>
+        </table>
+        <div style="float: right;margin-right: 12px;">
+          <page :total="commodities.totalElements" :page-size="pageParams.count"
+                :current="pageParams.page" @childEvent="handleCurrentChange"></page>
+        </div>
+        <link-saler-box
+          :tel="tel"
+          v-if="showLinkBox"
+          @cancelAction="showLinkBox = false">
+        </link-saler-box>
+      </div>
+    </div>
+  </div>
+</template>
+<script>
+  function getAllLeafIds (kind) {
+    if (!kind) {
+      return null
+    }
+    if (kind.isLeaf === 1) {
+      return kind.id
+    } else {
+      if (!kind.children || kind.children.length === 0) {
+        return null
+      }
+      let ids = []
+      for (let i = 0; i < kind.children.length; i++) {
+        ids.push(getAllLeafIds(kind.children[i]))
+      }
+      return ids.join(',')
+    }
+  }
+  import Buy from '~components/common/buyOrCar/buyComponent.vue'
+  import Page from '~components/common/page/pageComponent.vue'
+  import LinkSalerBox from '~components/common/LinkSalerBox.vue'
+  export default {
+    name: 'commodity-list',
+    props: ['kinds'],
+    components: {
+      Buy,
+      Page,
+      LinkSalerBox
+    },
+    data () {
+      return {
+        defaultProps: {
+          children: 'children',
+          label: 'nameCn'
+        },
+        pageParams: {
+          page: 1,
+          count: 10
+        },
+        searchCode: '',
+        parentKindId: 0,
+        ids: null,
+        showLinkBox: false,
+        tel: ''
+      }
+    },
+    filters: {
+      currency: function (num) {
+        if (typeof num === 'number') {
+          if (num <= 0.000001) {
+            num = 0.000001
+          } else {
+            if (num.toString().indexOf('.') === -1) {
+              num += '.00'
+            } else {
+              let inputStr = num.toString()
+              let arr = inputStr.split('.')
+              let floatNum = arr[1]
+              if (floatNum.length > 6) {
+                num = inputStr.substring(0, arr[0].length + 7)
+                if (Number(floatNum.charAt(6)) > 4) {
+                  num = (Number(num) * 1000000 + 1) / 1000000
+                }
+              } else if (floatNum.length === 1) {
+                num = num + '0'
+              }
+            }
+          }
+        }
+        return num
+      }
+    },
+    computed: {
+      commodities () {
+        return this.$store.state.shop.storeInfo.storeCommodity.data
+      },
+      storeInfo () {
+        return this.$store.state.shop.storeInfo.store.data
+      },
+      user () {
+        return this.$store.state.option.user
+      },
+      tab () {
+        return this.$store.state.chat.tab.tab.data
+      },
+      isConsignment () {
+        return this.storeInfo.type === 'CONSIGNMENT'
+      },
+      storeStatus () {
+        return this.$store.state.option.storeStatus.data
+      },
+      emptyShow () {
+        let loggedStatus = false
+        if (this.user.logged && this.user.data.enterprise.uu) {
+          if (this.storeStatus.uuid === this.storeInfo.uuid) {
+            loggedStatus = true
+          } else {
+            loggedStatus = false
+          }
+        } else {
+          loggedStatus = false
+        }
+        return loggedStatus
+      },
+      enterprise () {
+        let ens = this.user.data.enterprises
+        if (ens && ens.length) {
+          return ens.find(item => item.current) || {enName: '个人账户'}
+        } else {
+          return {enName: '个人账户'}
+        }
+      }
+    },
+    watch: {
+       kinds: {
+         handler: function (val) {
+           if (val) {
+             val.forEach((item) => {
+               this.KindsNameChange(item)
+             })
+           }
+         },
+         immediate: true
+       }
+  },
+    methods: {
+      sendprove: function () {
+        if (this.user.logged) {
+          if (this.enterprise && this.enterprise.isVendor === 313) {
+            window.open('/vendor#/vendor_upload')
+          } else {
+            this.$router.push('/register-saler')
+          }
+        } else {
+          this.$router.push('/auth/login?returnUrl=' + window.location.href)
+        }
+      },
+      goLink: function () {
+        this.baseUtils.goLinkUser(this, this.storeInfo.enUU)
+      },
+      KindsNameChange: function (obj) {
+          obj.nameCn += (obj.count ? `  (${obj.count})` : '')
+          if (obj.children && obj.children.length) {
+            obj.children.forEach((item) => {
+              this.KindsNameChange(item)
+            })
+          }
+      },
+      goAttach: function (url, event) {
+        event.stopPropagation()
+        if (this.user.logged) {
+          if (url && url !== '1') {
+            window.open(url)
+          } else {
+            this.$message.error('规格书地址错误')
+          }
+        } else {
+          this.$http.get('/login/page', {params: {returnUrl: window.location.href}}).then(response => {
+            if (response.data) {
+              window.location.href = response.data.content + '&baseUrl=' + encodeURIComponent(window.location.protocol + '//' + window.location.host + response.data.baseUrl)
+            }
+          })
+        }
+      },
+      handlerCurrentNode (data, node) {
+        this.searchCode = ''
+        if (this.parentKindId === data.id) {
+          this.parentKindId = 0
+          this.ids = null
+        } else {
+          if (data.level === 1) {
+            this.parentKindId = data.id
+          }
+          this.ids = getAllLeafIds(data)
+        }
+        this.pageParams.page = 1
+
+        this.pageCommodity(this.pageParams, this.ids)
+      },
+      onNodeCollapse () {
+        this.parentKindId = ''
+      },
+      goodsSearch (keyword) {
+        this.pageParams.page = 1
+        this.pageCommodity(this.pageParams, this.ids, keyword)
+      },
+      async pageCommodity (pageParams, kindId, keyword) {
+//    pageCommodity (pageParams, kindId, keyword) {
+        let params = { storeid: process.env.pcbId, origin: 'store', kindUuid: kindId, code: keyword }
+        params.page = pageParams.page
+        params.count = pageParams.count
+        try {
+          let { data } = await this.$http.get('/api/commodity/commodities', { params })
+          this.$store.commit('shop/storeInfo/GET_STORE_COMMODITY_SUCCESS', data)
+        } catch (err) {
+          this.$store.commit('shop/storeInfo/GET_STORE_COMMODITY_FAILURE', err)
+        }
+      },
+      handleCurrentChange (page) {
+        this.pageParams.page = page
+        this.pageCommodity(this.pageParams, this.ids, this.searchCode)
+      },
+      isSpecificPriceTag: function (tag) {
+        return tag && tag.indexOf('特价') !== -1
+      },
+      goBatchDetail (type) {
+        window.open('/pcb/product/'+ type.productid +'/'+ type.batchCode)
+      },
+      goBrandDetail (url, event) {
+        event.stopPropagation()
+        window.open(url)
+      }
+    }
+  }
+</script>
+<style>
+  #goods-list-fragment{
+    width: 100%;
+    background: #ece9ec;
+    /*padding-top: 20px;*/
+  }
+  #goods-list-fragment .container{
+    width: 965px;
+    padding: 0;
+    /*height: 738px;*/
+    background: #ece9ec;
+  }
+
+  /*  产品分类调整*/
+  #goods-list-fragment .category-content{
+    max-height: 496px;
+    min-height: 224px;
+    overflow-y: scroll;
+    overflow-x: hidden;
+    position: relative;
+  }
+  #goods-list-fragment .category-content .empty{
+    display: block;
+    width: 56px;
+    height: 16px;
+    position: absolute;
+    top: 50%;
+    left: 50%;
+    transform: translate(-28px, -8px);
+    color: #5e7382;
+  }
+
+  .category-content el-tree{
+    /*border: none;*/
+  }
+  .el-tree--highlight-current .el-tree-node.is-current>.el-tree-node__content,.el-tree-node:hover{
+    background: none !important;
+  }
+  .el-tree-node__content:hover{
+    background: none !important;
+  }
+  .el-tree-node__content:hover span{
+    color: #3c7df3;
+  }
+  .el-tree-node__content:hover span:last-child {
+    /*text-decoration: underline;*/
+  }
+  .el-pagination .el-pager li.active{
+    background-color: #5078cb;
+    border-color: #337ab7;
+  }
+  .el-tree-node__expand-icon{
+    margin-left: 3px;
+    font-family: "iconfont" !important;
+    font-size: 14px;
+    font-style: normal;
+    -webkit-font-smoothing: antialiased;
+    width: inherit;
+    height: inherit;
+    border: inherit;
+    font-weight: bold;
+    text-shadow: -1px 0px 0 #333;
+    margin-right: 3px !important;
+  }
+  .el-tree-node__content{
+    line-height: 30px;
+    height: 30px;
+  }
+  .el-tree-node__expand-icon.is-leaf{
+    visibility: hidden;
+  }
+  .el-tree-node__expand-icon:before{
+    content: "\E621";
+  }
+  #goods-list-fragment .category-title {
+    height: 34px;
+    background-color: #3c7df5;
+    font-size: 16px;
+    color: rgb(255,255,255);
+    text-align: center;
+    border-radius: 5px;
+  }
+
+  #goods-list-fragment .category-content li {
+    line-height: 33px;
+    font-size: 14px;
+    color: #333;
+    float: left;
+    width: 100%;
+    padding-left: 10px;
+  }
+
+  #goods-list-fragment .category-content li a {
+    display: block;
+    padding-left: 15px;
+    text-decoration: none;
+    color: #333;
+    /* background:url("static/img/store/default/openblackR.png") no-repeat left; */
+  }
+
+  #goods-list-fragment .category-content li a:hover{
+    color: #5078cb;
+    cursor: pointer;
+  }
+
+  #goods-list-fragment .category-content ul.list-body {
+    display: none;
+    color: #666;
+  }
+
+  #goods-list-fragment .category-content ul.list-body.active {
+    display: block;
+  }
+
+  #goods-list-fragment .category-content ul.list-body li {
+    float: none;
+    background-image: none;
+    min-height: 26px;
+    line-height: 26px;
+    font-size: 12px;
+  }
+
+  #goods-list-fragment .category-content ul.list-body li a {
+    padding-left: 15px;
+    display: block;
+    color: rgb(50,50,50);
+    background: none;
+  }
+
+  #goods-list-fragment .category-content ul.list-body li a:hover {
+    color: #5078cb;
+    cursor: pointer;
+  }
+
+  #goods-list-fragment .category-content ul.list-body li a.cur {
+    text-decoration: none;
+    font-size: 14px;
+    /* background:url("static/img/store/default/openblackR.png") no-repeat left; */
+  }
+
+  #goods-list-fragment .title-area {
+    margin-bottom: 30px;
+    width: 250px;
+    float: left;
+    background: #fff;
+  }
+  #goods-list-fragment .category-content{
+    border: 1px solid #e8e8e8;
+  }
+  /* goods-area */
+  #goods-list-fragment .goods-area {
+    /*margin-left: 3px;*/
+    float: left;
+    /*margin-bottom: 30px;*/
+    background: #fff;
+    margin: 0 auto 24px;
+    height: 914px;
+  }
+
+  #goods-list-fragment .goods-area .btn-line {
+    border-radius: 0;
+  }
+
+
+  #goods-list-fragment .btn-info.btn-line {
+    background-color: #5078CB;
+    color: #fff;
+    font-weight: 600;
+  }
+
+  #goods-list-fragment .btn-line {
+    height: 34px;
+    width: 150px;
+    border: 1px solid #5078cb;
+    background-color: #fff;
+    color: rgb(80,120,203);
+    font-weight: 600;
+  }
+
+  #goods-list-fragment .btn-line:hover {
+    background-color: #5078CB;
+    color: #fff;
+  }
+
+  /* 物品列表 */
+  #goods-list-fragment .goodslist .brand-code {
+    font-size: 12px;
+    text-align: center;
+    position: relative;
+  }
+  #goods-list-fragment #search_btn {
+    background: #2496f1;
+    color: #FFF;
+    border-bottom-right-radius: 3px;
+    border-top-right-radius: 3px;
+    border-bottom-left-radius: 0px;
+    border-top-left-radius: 0px;
+    height: 28px;
+    width: 69px;
+    padding-right: 50px;
+  }
+  #goods-list-fragment .sendprove {
+    width: 110px;
+    height: 28px;
+    color: #2496f1;
+    font-size: 14px;
+    background-color: #fff;
+    border-radius: 3px;
+    float: right;
+    margin-left: 10px;
+    border: 1px solid #2496f1;
+  }
+  #goods-list-fragment .sendprove:hover{
+    background-color: #2496f1;
+    border-color: #2496f1;
+    color: #fff;
+  }
+  .btn:focus,.btn:active:focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn.active.focus {
+    outline: none;
+    border-color: transparent;
+  }
+  #goods-list-fragment #search_input {
+    font-size: 14px;
+    height: 28px;
+    line-height: 28px;
+    width: 189px;
+    float: right;
+    border-bottom-left-radius: 3px;
+    border-top-left-radius: 3px;
+    border: 1px solid #2496f1;
+  }
+
+  #goods-list-fragment .brand-code .code {
+    font-weight: 600;
+    word-break: break-all;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    display: -webkit-box;
+    -webkit-line-clamp: 2;
+    -webkit-box-orient: vertical;
+  }
+  #goods-list-fragment .brand-code .spec {
+    word-break: break-all;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    display: -webkit-box;
+    -webkit-line-clamp: 2;
+    -webkit-box-orient: vertical;
+  }
+  #goods-list-fragment .brand-code .brand a {
+    color: #2496f1;
+  }
+  #goods-list-fragment .brand-code .brand span{
+    color: #2496f1;
+    word-break: break-all;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    display: -webkit-box;
+    -webkit-line-clamp: 2;
+    -webkit-box-orient: vertical;
+  }
+  #goods-list-fragment .goodslist thead tr{
+    background-color: #2496f1;
+    height: 34px;
+  }
+  #goods-list-fragment .goodslist tr th {
+    color: #fefefe;
+    font-size: 13px;
+  }
+  #goods-list-fragment .goodslist tr th:first-child{
+    border-top-left-radius: 5px;
+    border-bottom-left-radius: 5px;
+  }
+  #goods-list-fragment .goodslist tr th:last-child{
+    border-top-right-radius: 5px;
+    border-bottom-right-radius: 5px;
+  }
+  #goods-list-fragment .goodslist tr th div{
+    text-align: center;
+    border-right: 1px solid #fff;
+  }
+  #goods-list-fragment .goodslist tr th:last-child div{
+    border-right: none;
+  }
+  #goodslist-content .goods,#goodslist-content .from, #goodslist-content .can-div-sell {
+    padding-left: 20px;
+  }
+  #goodslist-content .goods span{
+    /*color: #f01010;*/
+  }
+  #goodslist-content .amount {
+    width: 50%;
+    float: left;
+    padding-left: 30px;
+    text-align:left;
+  }
+  #goodslist-content .amount div{
+    overflow: hidden;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+  }
+  #goodslist-content .amount div:last-child{
+    /*color: #f01010;*/
+  }
+  #goodslist-content .price {
+    width: 50%;
+    float:right;
+    text-align:left;
+  }
+  #goodslist-content .price div {
+    overflow: hidden;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+  }
+  #goodslist-content .price div:last-child{
+    color: #f01010;
+  }
+  #goods-list-fragment .category-content a.selected-node,
+  #goods-list-fragment .category-content ul.list-body li a.selected-node {
+    color: #5078cb;
+  }
+
+  #goods-list-fragment .category-content a.selected-parent-node,
+  #goods-list-fragment .category-content ul.list-body li a.selected-parent-node {
+    /* background:url("static/img/store/default/openblack.png") no-repeat left; */
+  }
+  #goods-list-fragment .goodslist tbody>tr:hover{
+    background: #ecf2fd;
+  }
+  #goods-list-fragment .goodslist tbody>tr {
+    border: 1px solid #e8e8e8;
+  }
+  #goods-list-fragment .goodslist tbody>tr td.commodity-icon .img{
+    border: 1px solid #e8e8e8;
+    margin: 10px;
+    width: 80px;
+    height: 80px;
+    overflow: hidden;
+    line-height: 75px;
+  }
+  #goods-list-fragment .goodslist tbody>tr td.commodity-icon .img>img {
+    width: 80px;
+    height: 80px;
+  }
+  #goods-list-fragment .goodslist tbody>tr td.brand-code .sellout-store-commodity {
+    position: absolute;
+    right: 0;
+    bottom: 0;
+  }
+  #goods-list-fragment .goodslist tbody>tr td.brand-code .specific-price-tag {
+    position: absolute;
+    top: 0;
+    left: 0;
+  }
+  #goods-list-fragment .goodslist td {
+    font-size: 12px;
+    color: #333;
+    text-align: center;
+    line-height: 20px;
+    height: 88px;
+  }
+  #goods-list-fragment .goodslist tbody>tr td .can-div-sell {
+    color: #333;
+  }
+
+  /* 物品列表按钮 */
+  #goods-list-fragment .btn-buy-now {
+    background-color: #2496f1;
+    color: #fff;
+    width: 80px;
+    height: 24px;
+    font-size: 12px;
+    border: 1px solid #2496f1;
+    border-radius: 2px;
+  }
+
+  #goods-list-fragment .btn-add-cart {
+    margin-top: 10px;
+    color: #2496f1;
+    width: 80px;
+    height: 24px;
+    font-size: 12px;
+    background-color: #fff;
+    border-radius: 2px;
+    border: 1px solid #2496f1;
+  }
+  #goods-list-fragment .btn-buy-now:hover{
+    background: #1278c7;
+    border: 1px solid #1278c7;
+  }
+  #goods-list-fragment .btn-add-cart:hover{
+    background-color: #1278c7;
+    color: #fff;
+  }
+  .no-record{
+    font-size: 14px;
+    color: #999;
+    text-align: center;
+    line-height: 200px;
+  }
+  .no-record i{
+    margin-right: 5px;
+  }
+  .active-empty:hover{
+    background-color: #fff!important;
+  }
+  .text-center{
+    text-align: center;
+    margin-top: 30px;
+  }
+  .text-center  .col-xs-2  img{
+    margin: 55px 0 85px 135px;
+    vertical-align: middle;
+  }
+  .text-center .txt-info{
+    font-size: 14px;
+    margin: 50px 0px 0px -50px;
+  }
+  .text-center  .col-xs-4  p{
+    color: #999;
+    margin: 11px 0px 4px -6px;
+  }
+  .text-center  .txt-info i{
+    color: #5078cb;
+  }
+  .text-center  .txt-info a{
+    font-size: 14px;
+    color: #5078cb;
+  }
+  .text-center  .col-xs-5 img{
+    margin-left: -235px;
+  }
+  .goodslist{
+    margin-bottom: 24px;
+  }
+  .remind-area {
+    position: absolute;
+    top: 1005px;
+  }
+  .remind-area img {
+    margin-right: 12px;
+  }
+  .remind-area .link-seller {
+    font-size: 12px;
+    color: #fff;
+    line-height: 20px;
+    height: 20px;
+    padding: 0 7px;
+    background: #2496f1;
+    border-radius: 2px;
+  }
+  @font-face {
+    font-family: 'iconfont';  /* project id 357960 */
+    src: url('//at.alicdn.com/t/font_27kjyd082ezpk3xr.eot');
+    src: url('//at.alicdn.com/t/font_27kjyd082ezpk3xr.eot?#iefix') format('embedded-opentype'),
+    url('//at.alicdn.com/t/font_27kjyd082ezpk3xr.woff') format('woff'),
+    url('//at.alicdn.com/t/font_27kjyd082ezpk3xr.ttf') format('truetype'),
+    url('//at.alicdn.com/t/font_27kjyd082ezpk3xr.svg#iconfont') format('svg');
+  }
+
+  <!-- 分页 -->
+  #goods-list-fragment .el-pagination .el-pager li.active {
+    border-color: #5078cb !important;
+    background-color: #5078cb !important;
+  }
+  #goods-list-fragment .goods-area div>.page-wrap{
+    margin: 0;
+  }
+</style>
+

+ 387 - 0
components/pcb/home/EnterpriseInfo.vue

@@ -0,0 +1,387 @@
+<template>
+  <div id="recommend-fragment-self">
+    <div class="recommend-product">
+      <ul class="main-list clearfix">
+        <li>
+          <div>
+            <div class="introduce">
+              <div><h4>企业简介</h4></div>
+              <p class="intro-content" v-if="storeInfo.enterprise.description">
+                <span class="info" v-text="getIntro(storeInfo.enterprise.description)"></span>
+                <span class="look" @click="dialogVisible = true" v-if="showMore">查看更多 <img src="/images/store/home/angle-right.png" style="margin-top:-2px;"></span>
+              </p>
+              <p v-else class="empty-introduce">暂无简介</p>
+            </div>
+            <div class="introduce qualification">
+              <div><h4 class="prof">资质证明</h4><span @click="dialogCertificate = true">查看 <img src="/images/store/home/angle-right.png"></span></div>
+            </div>
+            <div class="product-show">
+              <recommend-pcb></recommend-pcb>
+            </div>
+          </div>
+        </li>
+        <li>
+          <div style="width: 962px; margin-left: 3px;">
+            <commodity-list></commodity-list>
+          </div>
+        </li>
+      </ul>
+      <div class="remind-area">
+        <img src="/images/store/store-remind.png" alt="">
+        所有报价、库存信息的真实性及准确性均由店铺负责,如有疑问请点击
+        <a @click="goLink" class="link-seller">联系卖家</a>
+      </div>
+    </div>
+    <!--企业简介-->
+    <el-dialog class="dialog-description"
+               :visible.sync="dialogVisible"
+               size="tiny">
+      <div>
+        <div class="header">
+          <span><img src="/images/store/home/blue.png">企业简介</span>
+          <span class="close" @click="dialogVisible = false">&times;</span>
+        </div>
+        <div class='content'>
+          <p v-if="storeInfo.enterprise.description">{{storeInfo.enterprise.description}}</p>
+          <p v-else class="empty-introduce">暂无简介</p>
+        </div>
+      </div>
+    </el-dialog>
+    <!--资质证明-->
+    <el-dialog class="dialog-description certificate"
+               :visible.sync="dialogCertificate"
+               size="tiny">
+      <div>
+        <div class="header">
+          <span><img src="/images/store/home/blue.png">资质证明</span>
+          <span class="close" @click="dialogCertificate = false">&times;</span></div>
+        <div class="content" style="height: 270px; width: 1070px; padding: 0 50px;"><qualification-certificate></qualification-certificate></div>
+      </div>
+    </el-dialog>
+    <!--联系卖家-->
+    <link-saler-box
+      :tel="tel"
+      v-if="showLinkBox"
+      @cancelAction="showLinkBox = false">
+    </link-saler-box>
+  </div>
+</template>
+<script>
+  import Buy from '~components/common/buyOrCar/buyComponent.vue'
+  import RecommendPcb from './RecommendPcb.vue'
+  import CommodityList from './CommodityList.vue'
+  import QualificationCertificate from './QualificationCertificate.vue'
+  import LinkSalerBox from '~components/common/LinkSalerBox.vue'
+  export default {
+    name: 'product-recommend-self',
+    data () {
+      return {
+        dialogVisible: false,
+        dialogCertificate: false,
+        showMore: false,
+        showLinkBox: false
+      }
+    },
+    components: {
+      Buy,
+      CommodityList,
+      QualificationCertificate,
+      LinkSalerBox,
+      RecommendPcb
+    },
+    computed: {
+      storeInfo () {
+        return this.$store.state.shop.storeInfo.store.data
+      }
+    },
+    methods: {
+      // 店铺简介
+      getIntro (text) {
+        let realLength = this.baseUtils.getRealLen(text)
+        if (realLength > 494) {
+          this.showMore = true
+          text = this.baseUtils.cutOutString(text, 494) + '...'
+        } else {
+          this.showMore = false
+        }
+        return text
+      },
+      // 联系卖家
+      goLink: function () {
+        this.baseUtils.goLinkUser(this, this.storeInfo.enUU)
+      },
+      buyNow: function (isBuy, item) {
+        if (!this.$store.state.option.user.logged) {
+          this.$http.get('/login/page', {params: {returnUrl: window.location.href}}).then(response => {
+            if (response.data) {
+              this.$router.push('/auth/login')
+            }
+          })
+        } else {
+          if (item) {
+            if (isBuy) {
+              this.$http.post('trade/order/buyNow', [{
+                uuid: item.comUuid,
+                batchCode: item.batchCode,
+                number: item.minBuyQty,
+                storeid: item.storeId,
+                storeUuid: item.storeUuid,
+                currencyName: item.currency,
+                minPackQty: item.minPackQty ? item.minPackQty : item.minBuyQty
+              }])
+                .then(response => {
+                  //        window.location.href = '/user#/order/pay/' + this.enidfilter(response.data.orderid)
+                  if (response.data.success) {
+                    if (response.data.message) {
+                      this.$message({
+                        message: response.data.message,
+                        type: 'success'
+                      })
+                      let _self = this
+                      window.setTimeout(function () {
+                        window.location.href = '/user#/order/pay/' + _self.enidfilter(response.data.data.orderid)
+                      }, 1000)
+                    } else {
+                      window.location.href = '/user#/order/pay/' + this.enidfilter(response.data.data.orderid)
+                    }
+                  } else {
+                    if (response.data.data && response.data.data.unvailable === 1) {
+                      this.$message.error('产品信息已失效,请刷新界面')
+                    } else {
+                      this.$message.error(response.data.message)
+                    }
+                  }
+                }, err => {
+                  console.log(err)
+                  if (item.minBuyQty > item.reserve) {
+                    this.$message.error('商品' + item.code + '的库存已经不满足起订量')
+                  }
+                })
+            } else {
+              // this.$store.dispatch('user/addCar', {uuid: item.uuid, batchCode: item.batchCode, number: item.minBuyQty})
+              this.$http.post('trade/cart/add', {
+                uuid: item.comUuid,
+                batchCode: item.batchCode,
+                number: item.minBuyQty,
+                storeid: item.storeId,
+                storeUuid: item.storeUuid,
+                currencyName: item.currency,
+                minPackQty: item.minPackQty ? item.minPackQty : item.minBuyQty
+              })
+                .then(response => {
+                  if (response.data.success) {
+                    if (response.data.message) {
+                      this.$message({
+                        message: '添加购物车成功,但商品信息有更新',
+                        type: 'success'
+                      })
+                    } else {
+                      this.$message({
+                        message: '添加购物车成功',
+                        type: 'success'
+                      })
+                    }
+                  } else {
+                    this.$message.error(response.data.message)
+                  }
+                })
+            }
+          }
+        }
+      },
+      enidfilter: function (str) {
+        if (str) {
+          let encryptStr = '' // 最终返回的加密后的字符串
+          // 产生三位随机数
+          let num = ''
+          for (let i = 0; i < 3; i++) {
+            num += Math.floor(Math.random() * 10)
+          }
+          encryptStr += num // 产生3位随机数
+
+          // 16位加密
+          let tempspit = ''
+          let strspit = str.toString().toLowerCase()
+          if (strspit.match(/^[-+]?\d*$/) === null) { // 非整数字符,对每一个字符都转换成16进制,然后拼接
+            /**
+             * Unicode汉字、英文字母、数字的unicode范围
+             *汉字:[0x4e00,0x9fa5](或十进制[19968,40869])
+             *数字:[0x30,0x39](或十进制[48, 57])
+             *小写字母:[0x61,0x7a](或十进制[97, 122])
+             *大写字母:[0x41,0x5a](或十进制[65, 90]
+             * 'a'的Unicode编码:'&#97;',charCodeAt()的值是97
+             * '码'的Unicode编码:'\u7801', new String('码').charCodeAt()的值是30721,30721的16进制表示是7801
+             */
+            let s = strspit.split('')
+            for (let i = 0; i < s.length; i++) {
+              s[i] = s[i].charCodeAt() // 先转换成Unicode编码
+              s[i] = s[i].toString(16)
+              // 因为在服务器是每两位当做一个字符进行解析的,所以这里每个字符的Unicode编码范围必须在0——255之间。数字和大小写满足该要求,特殊字符则不一定,如果后续有特殊字符的要求,需要重写编码器和解码器
+              if (s[i].length === 1) {
+                s[i] = '0' + s[i]
+              }
+              tempspit = tempspit + s[i]
+            }
+            tempspit = tempspit + '{' + 1 // 1代表字符
+          } else { // 数字直接转换成16进制
+            strspit = parseInt(strspit)
+              .toString(16)
+            tempspit = strspit + '{' + 0 // 0代表纯数字
+          }
+
+          let temp = tempspit.split('{') // 对要加密的字符转换成16进制
+          let numLength = temp[0].length // 转换后的字符长度
+          numLength = numLength.toString(16) // 字符长度换算成16进制
+          if (numLength.length === 1) { // 如果是1,补一个0
+            numLength = '0' + numLength
+          } else if (numLength.length > 3) { // 转换后的16进制字符长度如果大于2位数,则返回,不支持
+            return ''
+          }
+          encryptStr += numLength
+          if (temp[1] === '0') {
+            encryptStr += 0
+          } else if (temp[1] === '1') {
+            encryptStr += 1
+          }
+          encryptStr += temp[0]
+          if (encryptStr.length < 20) { // 如果小于20位,补上随机数
+            // 产生三位随机数
+            let numtwo = ''
+            for (let i = 0; i < 20 - encryptStr.length; i++) {
+              numtwo += Math.floor(Math.random() * 10)
+            }
+            let ran = numtwo // 产生3位随机数
+            encryptStr += ran
+          }
+          return encryptStr
+        }
+      }
+    }
+  }
+</script>
+<style lang="scss" scoped>
+  #recommend-fragment-self {
+    min-width: 1190px;
+    background: #ece9ec;
+    margin:-18px 0px 0 0px;
+    .recommend-product {
+      position: relative;
+      width: 1190px;
+      margin: 0 auto;
+      padding-bottom: 50px;
+      .main-list {
+        width: 100%;
+        /*overflow: hidden;*/
+        > li {
+          position: relative;
+          float: left;
+          width: 962px;
+          margin-left: 9px;
+          &:first-child {
+            width: 218px;
+            /*height: 356px;*/
+            /*background: #fff;*/
+            margin: -5px 0 0 1px;
+            border-radius: 5px;
+           .list{
+             margin-top: -20px;
+             height: 170px;
+             border-radius: 5px;
+             background: #fff;
+            .information-list {
+              font-size: 12px;
+              color: #333;
+              margin-bottom: 2px;
+              /*background: #fff;*/
+            &:first-child{
+               /*padding-top: 10px;*/
+             }
+            div:first-child {
+              width: 72px;
+              text-align: right;
+              line-height: 20px;
+            }
+            div:last-child {
+              width: 158px;
+              line-height: 20px;
+              padding: 0px 0px 0px 6px;
+            }
+            }
+            .information-list > div {
+              display: table-cell;
+            }
+           }
+            .introduce {
+              margin-top: 15px;
+              width: 100%;
+              height: 336px;
+              font-size: 12px;
+              line-height: 15px;
+              color: #333;
+              background: #fff;
+              border-radius: 5px;
+              p{
+                span.info{
+                  font-size: 12px;
+                  color: #333;
+                  word-break: break-all;
+                  word-wrap:break-word;
+                }
+                span.look {
+                  color: #2496f1;
+                  cursor: pointer;
+                }
+              }
+              div{
+                overflow: hidden;
+                height: 35px;
+                h4 {
+                  float: left;
+                  background: url(/images/store/home/detail1.png) no-repeat 15% 10%;
+                  font-size: 14px;
+                  padding: 0 0 5px 30px;
+                  margin:10px 0;
+                }
+                h4.prof {
+                  background: url("/images/store/home/prof.png") no-repeat 15% 10%;
+                }
+                span{
+                  float: right;
+                  margin-top: 10px;
+                  padding-right: 10px;
+                  font-size: 12px;
+                  color: #2496f1;
+                  cursor: pointer;
+                  img{
+                    margin-top: -3px;
+                  }
+                }
+              }
+              p {
+                margin: -7px 0px 0px 9px;
+                text-indent: 2em;
+                width: 200px;
+                line-height: 19px;
+                height: 308px;
+                overflow: hidden;
+              }
+              .empty-introduce{
+                text-align: center;
+                line-height: 153px;
+                color: #666;
+              }
+            }
+            .qualification {
+              height: 35px;
+              min-height: 35px;
+            }
+            .product-show{
+              margin-top: 8px;
+            }
+          }
+        }
+      }
+    }
+  }
+
+</style>

+ 318 - 0
components/pcb/home/QualificationCertificate.vue

@@ -0,0 +1,318 @@
+<template>
+  <div>
+    <div class="brand-content-list">
+      <ul class="list-unstyled list-inline">
+        <li class="store-box"  v-if="storeInfo.qualifications || storeInfo.qualifications.length !== 0" v-for="(store, index) in storeInfo.qualifications.slice(0,5)">
+          <div><img :src="store.resourceUrl.indexOf('.pdf')>0?'/images/store/common/pdf.jpg':store.resourceUrl"/></div>
+          <a @click="showImg(store.resourceUrl)"><div class="Open"><i class="fa fa-search"></i>&nbsp;&nbsp;查看</div></a>
+        </li>
+        <li class="active-empty" v-if="!storeInfo.qualifications || storeInfo.qualifications.length == 0">
+          <div class="text-center">
+            <div class="show-img">
+              <img src="/images/brandList/empty-cart.jpg">
+            </div>
+            <div class="txt-info">
+              <p class="grey f16"> 暂无资质证明</p>
+               <i class="iconfont" v-if="emptyShow === false">&#xe610;</i>&nbsp;<a href="/" v-if="emptyShow === false">返回首页</a>
+               <img v-if="emptyShow === true" src="/images/brandList/upload.png">&nbsp;<a v-if="emptyShow === true" href="/vendor#/store/maintain" target="_blank">马上去上传</a>
+            </div>
+          </div>
+        </li>
+      </ul>
+    </div>
+    <!--<div class="shadow"><img src="/images/store/common/shadow.png"></div>-->
+    <!--查看大图 begin-->
+    <div id="image-box" v-if="isShow">
+      <div class="x-floating-wrap"></div>
+      <div class="x-floating">
+        <div id="item-content">
+          <div class="x-close-wrap" @click="isShow = false"><a href="javascript:void(0);">&times;</a></div>
+          <div class="img"><img :src="qualifications.url"/></div>
+        </div>
+      </div>
+    </div>
+    <!--查看大图 end-->
+  </div>
+</template>
+<script>
+  export default {
+    name: 'qualification-certificate',
+    data () {
+      return {
+        qualifications: {
+          url: '',
+          type: ''
+        },
+        type: 0,
+        isShow: false
+      }
+    },
+    computed: {
+      storeInfo () {
+        let storeInfo = this.baseUtils.deepCopy(this.$store.state.shop.storeInfo.store.data)
+        if (storeInfo.qualifications && storeInfo.qualifications.length) {
+          let tempQua = []
+          storeInfo.qualifications.map(item => {
+            if (item.type === 'APTITUDE') {
+              tempQua.push(item)
+            }
+          })
+          storeInfo.qualifications = tempQua
+        }
+        return storeInfo
+      },
+      user() {
+        return this.$store.state.option.user
+      },
+      storeStatus () {
+        return this.$store.state.option.storeStatus.data
+      },
+      emptyShow () {
+        let loggedStatus = false
+        if (this.user.logged && this.user.data.enterprise.uu) {
+          if (this.storeStatus.uuid === this.storeInfo.uuid) {
+            loggedStatus = true
+            // this.storeInfo = this.storeStatus
+          } else {
+            loggedStatus = false
+          }
+        } else {
+          loggedStatus = false
+        }
+        return loggedStatus
+      }
+    },
+    methods: {
+      showImg (imgUrl) {
+        if (imgUrl.indexOf('.pdf') === -1) {
+          this.qualifications.url = imgUrl
+          this.isShow = true
+        } else {
+          window.open(imgUrl)
+        }
+      }
+    },
+    filters: {
+      introduceFilter: function (title) {
+        if (title === '') {
+          return title
+        }
+        let len = 0
+        let index = 0
+        for (let i = 0; i < title.length; i++) {
+          if (index === 0 && title.charAt(i).charCodeAt(0) > 255) {
+            len = len + 2
+          } else {
+            len++
+          }
+          if (len > 240) {
+            index = i
+            break
+          }
+        }
+        if (index > 0) {
+          return title.substring(0, index) + '...'
+        } else {
+          return title
+        }
+      }
+    }
+  }
+</script>
+<style  lang="scss" scoped>
+  /*查看大图*/
+  #image-box .x-floating-wrap,.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,.image-box{
+    display:table; overflow:hidden; margin-left:50px; _position:relative;  width: 1200px;height: 700px;
+    position: fixed;
+    top: 50%;
+    margin-top: -350px;
+    left: 50%;
+    margin-left: -600px;
+    z-index: 2000;
+  }
+  #image-box .x-floating,.image-box .x-floating {
+    vertical-align:middle !important;
+    display:table-cell;
+    text-align:center;
+    _position:absolute;
+    _top:50%; _left:50%;
+    top: inherit !important;
+    left: inherit !important;
+  }
+  #image-box .x-floating img ,.image-box .x-floating img {
+    margin: auto auto;
+    max-width: 970px !important;
+    max-height: 600px !important;
+    -webkit-user-select: none;
+    -moz-user-select: none;
+    -ms-user-select: none;
+    user-select: none;
+  }
+  #image-box .x-floating-wrap,.image-box .x-floating-wrap{
+    z-index: 1000000 !important;
+  }
+  #item-content{
+    color:#fff; display:inline-block; _position:relative; _top:-50%; _left:-50%;
+    position: relative;
+    z-index: 10000000;
+  }
+  #item-content div.x-close-wrap{
+    position: absolute;
+    right: -15px;
+    line-height: 30px;
+    top: -13px;
+    color: #fff;
+    width: 35px;
+    height: 35px;
+    background: rgba(0, 0, 0, 0.5);
+    border-radius: 100%;
+    opacity: 1;
+    margin: 0;
+    z-index: 100000;
+    min-height: initial;
+    text-align: center;
+  }
+  #item-content div.x-close-wrap a{
+    position: relative;
+    left: 0;
+    bottom: 0;
+    font-size: 34px;
+    color: #fff;
+  }
+  #item-content div.x-close-wrap a:hover{
+    color: #fff !important;
+  }
+  #item-content div.x-close-wrap:hover{
+    cursor: pointer;
+    opacity: .9;
+  }
+  #item-content div.x-close-wrap img{
+    width: 30px !important;
+    height: 30px !important;
+  }
+  #item-content .img{
+    position: relative;
+    z-index: 10;
+  }
+  /*查看大图结束*/
+  .brand-content-list{
+    /*width: 1190px;*/
+    background: #fff;
+ /*   margin: 0 auto;
+    margin-top: -50px;
+    padding-left: 18px;*/
+    width: 100%;
+    .list-inline {
+      width: 100%;
+      margin: 0;
+      overflow: hidden;
+      .store-box {
+        width: 154px;
+        height: 217px;
+        text-align: center;
+        vertical-align: middle;
+        margin: 35px auto 0;
+        display: block;
+        position: relative;
+        float: left;
+        margin-right: 48px;
+        &:hover{
+          div:last-child {
+            display: block;
+          }
+        }
+        /*&:first-child {
+          margin-left:112px;
+        }*/
+        div:first-child {
+          img {
+            margin-left: -3px;
+            width: 156px;
+            height: 200px;
+            border: 1px solid #edf0f4;
+          }
+        }
+        div:last-child {
+          width: 176px;
+          height: 218px;
+          line-height: 218px;
+          background: #6b6b6b;
+          opacity: 0.5;
+          position: absolute;
+          top: -9px;
+          left: -9px;
+          display: none;
+          color: #fff;
+          span{
+            color: #fff;
+            &:first-child{
+              margin-top: 30px;
+            }
+          }
+        }
+      &:last-child{
+        margin-right: 0;
+       }
+      }
+      .active-empty{
+        width: 100%;
+          .text-center {
+            overflow: hidden;
+            text-align: center;
+            margin: 85px auto;
+          div{
+             float: left;
+           }
+          div.show-img{
+            margin-left: 350px;
+          }
+          div.txt-info {
+            position: absolute;
+            left: 470px;
+            top: 108px;
+          }
+        }
+        .text-center  .col-xs-2  img{
+          margin: 65px 0 85px 205px;
+          vertical-align: middle;
+        }
+        .text-center .txt-info{
+          font-size: 14px;
+          margin: 30px 0 0 0;
+        }
+        .text-center  .col-xs-4  p{
+          color: #999;
+          margin: 13px 0px 10px -6px;
+        }
+        .text-center  .txt-info i{
+          color: #5078cb;
+        }
+        .text-center  .txt-info a{
+          font-size: 14px;
+          color: #5078cb;
+        }
+        .text-center  .col-xs-5 img{
+          margin-left: -235px;
+        }
+      }
+    }
+  }
+  .shadow{
+    width: 1190px;
+    margin: 0 auto;
+    img{
+      position: relative;
+      top: -10px;
+    }
+  }
+</style>

+ 520 - 0
components/pcb/home/RecommendPcb.vue

@@ -0,0 +1,520 @@
+<template>
+  <div class="wrap">
+    <div class="reco-title">产品展示</div>
+    <div class="recommend-fragment clearfix">
+      <div v-if="!commodities || commodities.length === 0" class="empty-show">
+        <div class="empty">
+          <div class="empty-img">
+            <img src="/images/brandList/empty-cart.jpg">
+          </div>
+          <div class="empty-info">
+            <p class="grey f16"> 暂无展示产品</p>
+            <i class="iconfont" v-if="emptyShow === false">&#xe610;</i>&nbsp;<a v-if="emptyShow === false" href="/">返回首页</a>
+            <img v-if="emptyShow === true" src="/images/brandList/upload.png">&nbsp;<a v-if="emptyShow === true" href="/vendor#/store/maintain" target="_blank">马上去上传</a>
+          </div>
+        </div>
+      </div>
+      <div  v-if="commodities.length>0">
+        <div  v-if="commodities.length<=4">
+          <ul class="recommend-list clearfix">
+            <li v-for="commodity in commodities.slice(0,3)" class="big">
+              <a :href="commodity.batchCode ? '/pcb/product/'+ commodity.productid +'/'+ commodity.batchCode : '#'" class="href">
+                <div class="img">
+                  <img :src="commodity.comImg.startsWith('static')?'/'+commodity.comImg:commodity.comImg"/>
+                </div>
+                <div class="content">
+                  <p>{{commodity.comCode | comCodeFilter}}</p>
+                  <!-- <p class="color666" v-text="commodity.brandNameCn">PANFAEFQ</p>-->
+                  <p class="price" v-if="commodity.minPriceRMB">¥ {{commodity.minPriceRMB | currency}}</p>
+                  <!-- <p class="price" v-if="!commodity.minPriceRMB">$ {{commodity.minPriceUSD || 0}}</p>-->
+                </div>
+              </a>
+            </li>
+          </ul>
+        </div>
+      </div>
+      <div v-swiper:mySwiper="swiperOption" v-if="commodities && commodities.length>3">
+        <div class="swiper-wrapper">
+          <div class="swiper-slide" v-if="commodities.length>0">
+            <ul class="recommend-list clearfix">
+              <li v-for="commodity in commodities.slice(0,4)" class="big">
+                <a :href="commodity.batchCode ? '/pcb/product/'+ commodity.productid +'/'+ commodity.batchCode : '#'" class="href">
+                  <div class="img">
+                    <img :src="commodity.comImg.startsWith('static')?'/'+commodity.comImg:commodity.comImg"/>
+                  </div>
+                  <div class="content">
+                    <p>{{commodity.comCode | comCodeFilter}}</p>
+                    <!-- <p class="color666" v-text="commodity.brandNameCn">PANFAEFQ</p>-->
+                    <p class="price" v-if="commodity.minPriceRMB">¥ {{commodity.minPriceRMB | currency}}</p>
+                    <!-- <p class="price" v-if="!commodity.minPriceRMB">$ {{commodity.minPriceUSD || 0}}</p>-->
+                  </div>
+                </a>
+              </li>
+            </ul>
+          </div>
+          <div class="swiper-slide" v-if="commodities.length>4">
+            <ul class="recommend-list clearfix">
+              <li v-for="commodity in commodities.slice(4,8)" class="big">
+                <a :href="commodity.batchCode ? '/pcb/product/'+ commodity.productid +'/'+ commodity.batchCode : '#'" class="href">
+                  <div class="img">
+                    <img :src="commodity.comImg.startsWith('static')?'/'+commodity.comImg:commodity.comImg"/>
+                  </div>
+                  <div class="content">
+                    <p>{{commodity.comCode | comCodeFilter}}</p>
+                    <!-- <p class="color666" v-text="commodity.brandNameCn">PANFAEFQ</p>-->
+                    <p class="price" v-if="commodity.minPriceRMB">¥ {{commodity.minPriceRMB | currency}}</p>
+                    <!-- <p class="price" v-if="!commodity.minPriceRMB">$ {{commodity.minPriceUSD || 0}}</p>-->
+                  </div>
+                </a>
+              </li>
+            </ul>
+          </div>
+          <div class="swiper-slide" v-if="commodities.length>8">
+            <ul class="recommend-list clearfix">
+              <li v-for="commodity in commodities.slice(8,12)" class="big">
+                <a :href="commodity.batchCode ? '/pcb/product/'+ commodity.productid +'/'+ commodity.batchCode : '#'" class="href">
+                  <div class="img">
+                    <img :src="commodity.comImg.startsWith('static')?'/'+commodity.comImg:commodity.comImg"/>
+                  </div>
+                  <div class="content">
+                    <p>{{commodity.comCode | comCodeFilter}}</p>
+                    <!-- <p class="color666" v-text="commodity.brandNameCn">PANFAEFQ</p>-->
+                    <p class="price" v-if="commodity.minPriceRMB">¥ {{commodity.minPriceRMB | currency}}</p>
+                    <!-- <p class="price" v-if="!commodity.minPriceRMB">$ {{commodity.minPriceUSD || 0}}</p>-->
+                  </div>
+                </a>
+              </li>
+            </ul>
+          </div>
+          <div class="swiper-slide" v-if="commodities.length>12">
+            <ul class="recommend-list clearfix">
+              <li v-for="commodity in commodities.slice(12,16)" class="big">
+                <a :href="commodity.batchCode ? '/pcb/product/'+ commodity.productid +'/'+ commodity.batchCode : '#'" class="href">
+                  <div class="img">
+                    <img :src="commodity.comImg.startsWith('static')?'/'+commodity.comImg:commodity.comImg"/>
+                  </div>
+                  <div class="content">
+                    <p>{{commodity.comCode | comCodeFilter}}</p>
+                    <!-- <p class="color666" v-text="commodity.brandNameCn">PANFAEFQ</p>-->
+                    <p class="price" v-if="commodity.minPriceRMB">¥ {{commodity.minPriceRMB | currency}}</p>
+                    <!-- <p class="price" v-if="!commodity.minPriceRMB">$ {{commodity.minPriceUSD || 0}}</p>-->
+                  </div>
+                </a>
+              </li>
+            </ul>
+          </div>
+        </div>
+        <div class="swiper-pagination swiper-pagination-bullets"></div>
+      </div>
+    </div>
+  </div>
+</template>
+<script>
+  import Buy from '~components/common/buyOrCar/buyComponent.vue'
+  import NuxtLink from '../../../.nuxt/components/nuxt-link'
+  export default {
+    name: 'recommend-product',
+    components: {
+      NuxtLink,
+      Buy
+    },
+    computed: {
+      commodities () {
+        return this.$store.state.shop.recommend.products.data
+      },
+      storeInfo () {
+        return this.$store.state.shop.storeInfo.store.data
+      },
+      isConsignment () {
+        return this.storeInfo.type === 'CONSIGNMENT'
+      },
+      user() {
+        return this.$store.state.option.user
+      },
+      storeStatus () {
+        return this.$store.state.option.storeStatus.data
+      },
+      emptyShow () {
+        let loggedStatus = false
+        if (this.user.logged && this.user.data.enterprise.uu) {
+          if (this.storeStatus.uuid === this.storeInfo.uuid) {
+            loggedStatus = true
+          } else {
+            loggedStatus = false
+          }
+        } else {
+          loggedStatus = false
+        }
+        return loggedStatus
+      },
+      // 产品推荐轮播
+      swiperOption () {
+        return {
+          autoplay: 5000,
+          initialSlide: 0,
+          loop: true,
+          effect: this.effect,
+          lazyLoading: true,
+          // 解决点击分页器后图片就不能轮播的问题
+          autoplayDisableOnInteraction: false,
+          pagination: '.swiper-pagination',
+          paginationClickable: true,
+          paginationElement: 'li'
+        }
+      }
+    },
+    filters: {
+      comCodeFilter: function (title) {
+        if (title === '') {
+          return title
+        }
+        let len = 0
+        let index = 0
+        for (let i = 0; i < title.length; i++) {
+          if (index === 0 && title.charAt(i).charCodeAt(0) > 255) {
+            len = len + 2
+          } else {
+            len++
+          }
+          if (len > 18) {
+            index = i
+            break
+          }
+        }
+        if (index > 0) {
+          return title.substring(0, index) + '...'
+        } else {
+          return title
+        }
+      },
+      currency: function (num) {
+        if (typeof num === 'number') {
+          if (num <= 0.000001) {
+            num = 0.000001
+          } else {
+            if (num.toString().indexOf('.') === -1) {
+              num += '.00'
+            } else {
+              let inputStr = num.toString()
+              let arr = inputStr.split('.')
+              let floatNum = arr[1]
+              if (floatNum.length > 6) {
+                num = inputStr.substring(0, arr[0].length + 7)
+                if (Number(floatNum.charAt(6)) > 4) {
+                  num = (Number(num) * 1000000 + 1) / 1000000
+                }
+              } else if (floatNum.length === 1) {
+                num = num + '0'
+              }
+            }
+          }
+        }
+        return num
+      }
+    },
+    methods: {
+      enidfilter: function (str) {
+        if (str) {
+          let encryptStr = '' // 最终返回的加密后的字符串
+          // 产生三位随机数
+          let num = ''
+          for (let i = 0; i < 3; i++) {
+            num += Math.floor(Math.random() * 10)
+          }
+          encryptStr += num // 产生3位随机数
+
+          // 16位加密
+          let tempspit = ''
+          let strspit = str.toString().toLowerCase()
+          if (strspit.match(/^[-+]?\d*$/) === null) { // 非整数字符,对每一个字符都转换成16进制,然后拼接
+            /**
+             * Unicode汉字、英文字母、数字的unicode范围
+             *汉字:[0x4e00,0x9fa5](或十进制[19968,40869])
+             *数字:[0x30,0x39](或十进制[48, 57])
+             *小写字母:[0x61,0x7a](或十进制[97, 122])
+             *大写字母:[0x41,0x5a](或十进制[65, 90]
+             * 'a'的Unicode编码:'&#97;',charCodeAt()的值是97
+             * '码'的Unicode编码:'\u7801', new String('码').charCodeAt()的值是30721,30721的16进制表示是7801
+             */
+            let s = strspit.split('')
+            for (let i = 0; i < s.length; i++) {
+              s[i] = s[i].charCodeAt() // 先转换成Unicode编码
+              s[i] = s[i].toString(16)
+              // 因为在服务器是每两位当做一个字符进行解析的,所以这里每个字符的Unicode编码范围必须在0——255之间。数字和大小写满足该要求,特殊字符则不一定,如果后续有特殊字符的要求,需要重写编码器和解码器
+              if (s[i].length === 1) {
+                s[i] = '0' + s[i]
+              }
+              tempspit = tempspit + s[i]
+            }
+            tempspit = tempspit + '{' + 1 // 1代表字符
+          } else { // 数字直接转换成16进制
+            strspit = parseInt(strspit)
+              .toString(16)
+            tempspit = strspit + '{' + 0 // 0代表纯数字
+          }
+
+          let temp = tempspit.split('{') // 对要加密的字符转换成16进制
+          let numLength = temp[0].length // 转换后的字符长度
+          numLength = numLength.toString(16) // 字符长度换算成16进制
+          if (numLength.length === 1) { // 如果是1,补一个0
+            numLength = '0' + numLength
+          } else if (numLength.length > 3) { // 转换后的16进制字符长度如果大于2位数,则返回,不支持
+            return ''
+          }
+          encryptStr += numLength
+          if (temp[1] === '0') {
+            encryptStr += 0
+          } else if (temp[1] === '1') {
+            encryptStr += 1
+          }
+          encryptStr += temp[0]
+          if (encryptStr.length < 20) { // 如果小于20位,补上随机数
+            // 产生三位随机数
+            let numtwo = ''
+            for (let i = 0; i < 20 - encryptStr.length; i++) {
+              numtwo += Math.floor(Math.random() * 10)
+            }
+            let ran = numtwo // 产生3位随机数
+            encryptStr += ran
+          }
+          return encryptStr
+        }
+      }
+    }
+  }
+</script>
+<style lang="scss" scoped>
+  .wrap {
+    background: #ece9ec;
+    padding-top: 7px;
+    width: 100%;
+    .reco-title {
+      border-bottom: 1px solid #2496f1;
+      width: 218px;
+      height: 34px;
+      line-height: 34px;
+      color: #fff;
+      background: #2496f1;
+      font-size: 18px;
+      text-align: center;
+      border-top-left-radius: 3px;
+      border-top-right-radius: 3px;
+      margin: 0;
+    }
+  }
+  .recommend-fragment {
+    background: #fff;
+    .empty-show{
+      height: 530px;
+      padding-top: 140px;
+      &:hover{
+         box-shadow: 0px 0px 0px transparent;
+       }
+        .empty{
+          margin: 0 auto;
+          width: 181px;
+          .empty-img{
+            float: left;
+          }
+          .empty-info{
+            float: left;
+            margin: 5px 0px 0px 20px;
+          .grey{
+            color: #999;
+            font-size: 14px;
+          }
+          i{
+            color: #5078cb;
+          }
+          a{
+            font-size: 14px;
+            color: #5078cb;
+          }
+         }
+        }
+    }
+  }
+  .recommend-fragment ul{
+    width: 100%;
+    background: #fff;
+   /* display: inline-block;*/
+    -webkit-padding-start: 0;
+    border-radius: 5px;
+    /*padding-left: 2px;*/
+    margin: 10px 0;
+    padding: 0 15px;
+  }
+  .recommend-fragment ul li
+    .img{
+      height: 42px;
+      text-align: center;
+      line-height: 42px;
+      img{
+        max-width: 63px;
+        max-height: 42px;
+      }
+  }
+  .recommend-fragment ul li .content{
+    width: 100%;
+    margin: 0 auto;
+    font-size: 12px;
+    p{
+      width: 100%;
+      text-align: center;
+      display: inline-block;
+      line-height: 22px;
+      overflow: hidden;
+      text-overflow: ellipsis;
+      white-space: nowrap;
+      margin: 5px 0;
+      padding-left: 10px;
+      color: #666;
+      &.price{
+        color: #ff002e;
+        margin-top: -3px;
+      }
+    }
+  }
+ .recommend-fragment ul li .enter-store {
+    position: absolute;
+    top: 178px;
+    width: 100%;
+    height: 30px;
+    line-height: 30px;
+    text-align: left;
+  }
+  .recommend-fragment ul li.big .enter-store a {
+    width: 74px;
+    height: 24px;
+    display: inline-block;
+    line-height: 24px;
+    text-align: center;
+    font-size: 13px;
+    margin-left: 14px;
+    border-radius: 3px;
+    &:first-child {
+      background-color: #fff;
+      border: 1px solid #3b7cf4;
+      color: #3b7cf4;
+    }
+    &:last-child {
+      background-color: #ffa422;
+      border: 1px solid #ffa422;
+      color: #fff;
+    }
+    /*&:visited{
+      .enter-store {
+        top: 140px;
+        left: 0px;
+      }
+    }*/
+  }
+  .recommend-fragment ul li.big {
+    float: left;
+    width: 190px;
+    height: 125px;
+    position: relative;
+    overflow: hidden;
+    margin: 2px 3px 0px 0px;
+    &:nth-child(5n){
+      margin: 2px 0px 0px 0px;
+    }
+    &:hover{
+      /*box-shadow: 2px 0px 1px #d9d9d9, -2px 0px 1px #d9d9d9, 0px 2px 1px #d9d9d9, 0px -2px 1px #d9d9d9;*/
+      .enter-store {
+        top: 132px;
+        left: 0px;
+        transition: all .3s linear;
+      }
+      .img, .content{
+        transform:translate(0px,-10px);
+        -ms-transform:translate(0px,-10px); /* IE 9 */
+        -webkit-transform:translate(0px,-10px); /* Safari and Chrome */
+      }
+    }
+  }
+  /*.recommend-fragment ul li.small .enter-store a {
+    width: 74px;
+    height: 24px;
+    display: inline-block;
+    line-height: 22px;
+    text-align: center;
+    font-size: 12px;
+    margin-left: 11px;
+    border-radius: 3px;
+    &:first-child {
+      background-color: #fff;
+      border: solid 1px #3b7cf4;
+      color: #3c7df5;
+    }
+    &:last-child {
+      background-color: #ffa422;
+      border: 1px solid #ffa422;
+      color: #fff;
+    }
+  }
+  .recommend-fragment ul li.small {
+    float: left;
+    width: 180px;
+    height: 174px;
+    position: relative;
+    overflow: hidden;
+    margin: 2px 8px 0px 0px;
+    &:nth-child(5n){
+      margin: 2px 0px 0px 0px;
+    }
+    &:hover, &:focus, &:active &:visited{
+      box-shadow: 2px 0px 1px #d9d9d9, -2px 0px 1px #d9d9d9, 0px 2px 1px #d9d9d9, 0px -2px 1px #d9d9d9;
+      .enter-store {
+        top: 140px;
+        left: 0px;
+        transition: all .5s;
+      }
+      .img, .content{
+        transform:translate(0px,-10px);
+        -ms-transform:translate(0px,-10px); !* IE 9 *!
+        -webkit-transform:translate(0px,-10px); !* Safari and Chrome *!
+      }
+    }
+  }*/
+  .recommend-fragment ul li.empty-show {
+    width: 100%;
+    height: 356px;
+    padding-top: 150px;
+    &:hover{
+      box-shadow: 0px 0px 0px transparent;
+    }
+    .empty{
+      margin: 0 auto;
+      width: 181px;
+      .empty-img{
+        float: left;
+      }
+      .empty-info{
+        float: left;
+        margin: 5px 0px 0px 20px;
+        .grey{
+          color: #999;
+          font-size: 14px;
+        }
+        i{
+          color: #5078cb;
+        }
+        a{
+          font-size: 14px;
+          color: #5078cb;
+        }
+
+      }
+    }
+  }
+  .shadow {
+    width: 1190px;
+    margin: 0 auto;
+    position: relative;
+    img {
+      position: absolute;
+      top: -12px;
+    }
+  }
+</style>

+ 96 - 0
components/pcb/home/StoreBanner.vue

@@ -0,0 +1,96 @@
+<template>
+  <div class="container" id="title-fragment">
+    <div class="container">
+      <div class="shop-pcb">
+        <ul class="pk-list">
+          <nuxt-link :to="`/pcb/search/?w=${encodeURIComponent(kind.nameCn)}`" tag="li" class="pk-item" v-for="kind in kinds" :key="kind.id">{{kind.nameCn}}<i class="icon-arrow-right iconfont"></i></nuxt-link>
+        </ul>
+      </div>
+      <div class="pcb-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>
+</template>
+<script>
+export default {
+  name: 'store-banner',
+  computed: {
+    kinds () {
+      return this.$store.state.pcb.kindsData.kinds.data
+    },
+    storeInfo () {
+      return this.$store.state.shop.storeInfo.store.data
+    }
+  }
+}
+</script>
+<style lang="scss" scoped>
+  #title-fragment {
+		padding: 0;
+	}
+	#title-fragment .container {
+		width: 1190px;
+		padding-left: 0px;
+		padding-right: 0px;
+	}
+  #title-fragment .shop-pcb{
+    margin-right: 10px;
+    width: 220px;
+    border: 1px solid #e8e8e8;
+    float: left;
+    text-align: center;
+    line-height: 210px;
+    position: relative;
+    background: #fff;
+    overflow: hidden;
+    .pk-list {
+      height:300px;
+      .pk-item{
+        height:50px;
+        line-height: 50px;
+        border-bottom:1px solid #e7e7e7;
+        cursor:pointer;
+        text-align: left;
+        color: #666;
+        padding-left:20px;
+        &:hover{
+          background: #e7e7e7;
+        }
+        &:last-child{
+          border:none;
+        }
+        .iconfont {
+          float: right;
+          margin-right: 18px;
+        }
+      }
+    }
+  }
+  #title-fragment .pcb-banner {
+    float: left;
+    position: relative;
+    width: 955px;
+    height: 320px;
+    border: 1px solid #e8e8e8;
+    border-left: none;
+    overflow: hidden;
+    border-radius: 5px;
+    img{
+      width: 955px;
+      height: 300px;
+    }
+    #shop-title{
+      position: absolute;
+      top: 50px;
+      left: 60px;
+      font-size: 30px;
+      color: rgb(255,255,255);
+    }
+  }
+	.container{
+		width: 1190px;
+		padding: 0;
+	}
+</style>

+ 0 - 12
components/pcb/home/floors/Floors.vue

@@ -6,18 +6,6 @@
       </p>
       <floor :data="value"></floor>
     </div>
-   <!-- <div class="floor-line line2">
-      <p>PCB耗材<span>PCB common consumables</span>
-        <nuxt-link :to="`/pcb/search/?w=${encodeURIComponent('PCB常用耗材')}`">查看更多</nuxt-link>
-      </p>
-      <floor></floor>
-    </div>
-    <div class="floor-line line3">
-      <p>PCB设备<span>PCB equipment</span>
-        <nuxt-link :to="`/pcb/search/?w=${encodeURIComponent('PCB设备')}`">查看更多</nuxt-link>
-      </p>
-      <floor></floor>
-    </div>-->
   </div>
 </template>
 <script>

+ 3 - 1
components/pcb/index.js

@@ -1,5 +1,7 @@
 import Kinds from './home/Kinds.vue'
 import Intro from './home/Intro.vue'
+import EnterpriseInfo from './home/EnterpriseInfo'
+import StoreBanner from './home/StoreBanner'
 import RecommendBrand from './home/RecommendBrand.vue'
 import Floors from './home/floors/Floors.vue'
 import Nav from './Nav.vue'
@@ -10,4 +12,4 @@ import DetailBrand from './search/DetailBrand.vue'
 import GoodList from './search/GoodList.vue'
 import Kind from './search/Kind.vue'
 import ResultTitle from './search/ResultTitle.vue'
-export { Kinds, Intro, RecommendBrand, Floors, Nav, Detail, BrandList, PcbNavSearch, DetailBrand, GoodList, Kind, ResultTitle }
+export { Kinds, Intro, EnterpriseInfo, StoreBanner, RecommendBrand, Floors, Nav, Detail, BrandList, PcbNavSearch, DetailBrand, GoodList, Kind, ResultTitle }

+ 26 - 12
pages/pcb/index.vue

@@ -1,26 +1,40 @@
 <template>
   <div>
-    <kinds></kinds>
-    <intro></intro>
-    <!--<recommend-brand></recommend-brand>-->
-    <floors></floors>
+    <div class="store-banner">
+      <store-banner></store-banner>
+    </div>
+    <enterprise-info></enterprise-info>
   </div>
 </template>
 <script>
-  import { Kinds, Intro, RecommendBrand, Floors } from '~components/pcb'
+  import { EnterpriseInfo, StoreBanner } from '~components/pcb'
   export default {
     layout: 'pcb',
-    components: {
-      Kinds,
-      Intro,
-      RecommendBrand,
-      Floors
-    },
     fetch ({ store }) {
       return Promise.all([
         store.dispatch('pcb/getPcbKinds', {parentId: 3825}),
-        store.dispatch('pcb/getPcbRecoProduct')
+        store.dispatch('shop/findStoreInfoFromUuid', {uuid: process.env.pcbId}),
+        store.dispatch('shop/findRecommendProducts', {uuid: process.env.pcbId}),
+        store.dispatch('shop/pageCommoditiesOfStore', process.env.pcbId, { page: 1, count: 10 }),
+        store.dispatch('loadStoreStatus', { op: 'check' })
       ])
+    },
+    components: {
+      EnterpriseInfo,
+      StoreBanner
     }
   }
 </script>
+<style>
+  #nav_fragment .el-dialog__wrapper .el-dialog--tiny{
+    width: 320px !important;
+  }
+  #nav_fragment .el-dialog__wrapper .el-dialog__body{
+    padding: 14px !important;
+  }
+  .store-banner{
+    min-width: 1190px;
+    background: #ece9ec;
+    padding-top: 20px;
+  }
+</style>

BIN
static/images/all/countBg.png


BIN
static/images/all/goInto.jpg


BIN
static/images/all/newPointer.jpg