Переглянути джерело

【器件选型】-- 新增器件选型页

wangyc 8 роки тому
батько
коміт
4924dd2496

+ 1 - 1
components/main/Nav.vue

@@ -1,7 +1,7 @@
 <template>
   <nav class="nav-list">
     <div class="container">
-      <nuxt-link to="/product/kind" class="item item-first">
+      <nuxt-link to="/product/kind/home" class="item item-first">
         <div>器件选型</div>
       </nuxt-link>
       <nuxt-link :to="'/'" class="item" exact>

+ 0 - 5
components/product/BrandList.vue

@@ -33,11 +33,6 @@
         return this.$store.state.product.brand.brandList.data
       }
     }
-//    methods: {
-//      showList (keyword) {
-//        this.$store.dispatch('product/loadBrands', {'keyword': keyword})
-//      }
-//    }
   }
 </script>
 

+ 328 - 0
components/product/CategoryNav.vue

@@ -0,0 +1,328 @@
+<template>
+  <div class="breadcrumbs container">
+    <ul class="list-unstyled list-inline">
+      <li class="crumb-item">
+        <nuxt-link :to="`/product/kind/home`">电子元器件</nuxt-link>
+      </li>
+      <li class="crumb-item crumb-item-angle" v-for="k in actives">
+        <i class="angle"></i>
+        <nuxt-link :to="`/product/kind/${k.id}`">
+          <span :title="k.nameCn">{{k.nameCn}}</span> <i class="fa fa-angle-down"></i>
+        </nuxt-link>
+        <div class="crumb-drop" v-if="k.bothers">
+          <ul class="list-unstyled list-inline" role="menu">
+            <li v-for="b in k.bothers"><nuxt-link :to="`/product/kind/${b.id}`">{{b.nameCn}}</nuxt-link></li>
+          </ul>
+        </div>
+        <i class="icon-glass"></i>
+      </li>
+    </ul>
+  </div>
+</template>
+
+<script>
+  export default {
+    computed: {
+      actives () {
+        return this.$store.state.product.kind.kindsParentWithBother.data
+      }
+    }
+  }
+</script>
+
+<style>
+  /* breadcrumbs */
+  .breadcrumbs {
+    margin-top: 20px;
+  }
+  .breadcrumbs ul.list-unstyled.list-inline {
+    margin-left: 0px;
+    margin-bottom: 10px;
+  }
+  .breadcrumbs ul.list-inline.list-unstyled li.crumb-item {
+    position: relative;
+    padding-left: 0px;
+    padding-right: 0px;
+    padding-bottom: 1px;
+    height: 32px;
+    line-height: 30px;
+    background: #fff;
+    border: solid 1px #6493ff;
+  }
+  .breadcrumbs ul li.crumb-item-angle {
+    margin-left: -5px;
+  }
+  .breadcrumbs ul li.crumb-item>a {
+    display: inline-block;
+    width: 100%;
+    height: 100%;
+    padding-left: 15px;
+    padding-right: 15px;
+    cursor: pointer;
+    text-decoration: none;
+    color: #323232;
+    font-size: 16px;
+  }
+  .breadcrumbs ul li.crumb-item:hover>a span,.breadcrumbs ul li.crumb-item:hover>a i{
+    color: #5078cb;
+  }
+  .breadcrumbs ul li.crumb-item>a i{
+    margin-right: 10px;
+  }
+  .breadcrumbs ul li.crumb-item:hover>a i{
+    transform: rotate(-180deg);
+  }
+  .breadcrumbs ul li.crumb-item .angle {
+    position: absolute;
+    left: -6px;
+    top: 50%;
+    margin-top: -5px;
+    height: 10px;
+    width: 10px;
+    border-bottom: 1px solid #6493ff;
+    border-left: 1px solid #6493ff;
+    background: white;
+    transform: rotate(45deg);
+    -ms-transform: rotate(45deg); 	/* IE 9 */
+    -moz-transform: rotate(45deg); 	/* Firefox */
+    -webkit-transform: rotate(45deg); /* Safari 和 Chrome */
+    -o-transform: rotate(45deg); 	/* Opera */
+    z-index: 14;
+  }
+  .breadcrumbs ul li.crumb-item .crumb-drop {
+    position: absolute;
+    display: none;
+    left: -1px;
+    top: 30px;
+    border: #6493ff 1px solid;
+    background: #fff;
+    z-index: 100;
+    width: 200px;
+  }
+  .breadcrumbs ul li.crumb-item .crumb-drop li {
+    line-height: 20px;
+  }
+  .breadcrumbs ul li.crumb-item .crumb-drop li a{
+    font-size: 12px;
+  }
+  li{
+    list-style: none;
+  }
+  .breadcrumbs ul li.crumb-item:hover .crumb-drop {
+    display: block;
+  }
+
+  .breadcrumbs ul li.crumb-item:hover>a {
+    border-color: #f50;
+    background: #ffffff;
+    z-index: 101;
+  }
+  .breadcrumbs ul li.crumb-item a{
+    color: #323232;
+  }
+  .breadcrumbs ul li.crumb-item a:hover{
+    color: #5078cb;
+  }
+  /* sl_warp */
+  .main-content .sl-wrap .sl-key>span {
+    color: #323232;
+    font-size: 14px;
+  }
+  .main-content .sl-wrap .sl-value ul li a{
+    color: #323232;
+    font-size: 14px;
+  }
+  .main-content .sl-wrap .sl-value ul li a:hover{
+    color: #5078cb;
+  }
+  .main-content .sl-wrap .sl-value .sl-selected a {
+    color: #666;
+    text-decoration: none;
+  }
+  .main-content .sl-wrap .sl-value .sl-selected:HOVER a {
+    color: #f50;
+  }
+  .main-content .sl-wrap .sl-value .sl-selected span {
+    display: inline-block;
+    position: absolute;
+    right: 0px;
+    top: 0px;
+    height: 100%;
+    width: 20px;
+    text-align: center;
+    background: #ccc;
+    color: #fff;
+  }
+  .main-content .sl-wrap .sl-value .sl-selected:HOVER span {
+    background: #f50;
+  }
+  .main-content .sl-wrap .sl-value ul {
+    margin-bottom: 0;
+  }
+  .main-content .sl-wrap .sl-value ul.list-inline li {
+    width: 16.6666%;
+    white-space:nowrap;
+    overflow:hidden;
+    text-overflow:ellipsis;
+  }
+  .main-content .sl-wrap .sl-value ul, .main-content .sl-set .sl-value ul{
+    min-height: 25px;
+  }
+  .main-content .sl-more a {
+    position: relative;
+    display: inline-block;
+    margin-top: -1px;
+    height: 30px;
+    line-height: 30px;
+    padding: 0 10px 0 10px;
+    border-width: 1px;
+    border-style: solid;
+    border-color: #FFF #DDD #DDD;
+    background: #fff;
+    cursor: pointer;
+    -webkit-transition: border-color .15s ease-in-out;
+    -moz-transition: border-color .15s ease-in-out;
+    transition: border-color .15s ease-in-out;
+  }
+  .main-content .sl-more:hover a {
+    color: #f39800;
+    border-color: #FFF #f39800 #f39800;
+    text-decoration: none;
+  }
+  .main-content .sl-more a:focus {
+    text-decoration: none;
+    color: #f39800;
+  }
+  .table>tbody>tr>td, .table>tbody>tr>th, .table>tfoot>tr>td, .table>tfoot>tr>th,
+  .table>thead>tr>td, .table>thead>tr>th {
+    padding: 10px 5px;
+  }
+  .pagging .pagging-count a {
+    color: white !important;
+    text-decoration: none !important;
+  }
+  .parameter-selection > div:first-child {
+    display: inline-block;
+    position: absolute;
+    top: 50%;
+    left: 8px;
+    transform: translateY(-50%);
+  }
+  .parameter-selection div:last-child {
+    display: inline-block;
+    position: absolute;
+    top: 50%;
+    left: 40px;
+    transform: translateY(-50%);
+  }
+  .div-table-right table thead tr td{
+    width: 140px;
+    text-align: center;
+    vertical-align: middle;
+    padding: 0;
+  }
+  thead tr {
+    /*background-image: url("static/img/product/th-tr-bg.png");
+        background-repeat: repeat-x;*/
+    background: linear-gradient(rgb(93, 134, 220), rgb(12, 53, 136));
+    color: #fff;
+    height: 48px;
+  }
+  .table>thead>tr>th{
+    padding:5px 5px;
+  }
+  /* scroll */
+  ::-webkit-scrollbar {
+    width: 10px;
+    height: 10px;
+    background: #ededed;
+  }
+  ::-webkit-scrollbar-thumb {
+    background-color: #c1c1c1;
+    border-radius: 5px;
+  }
+  ::-webkit-scrollbar-thumb:hover {
+    background-color: #959595;
+  }
+  .container {
+    position: relative;
+    width: 1190px;
+  }
+  [split-dropdown] {
+    position: relative;
+  }
+  [split-dropdown-toggle] {
+    position: absolute;
+    display: none;
+    border: 1px solid #ccc;
+    background: #fff;
+    z-index: 100;
+    top: 40px !important;
+  }
+  .drop-down-list a{
+    padding: 0 10px;
+  }
+  .drop-down-list li:hover,.dropdown-menu li:hover a{
+    background: #5078cb;
+  }
+  .drop-down-list li:hover a,.dropdown-menu li:hover a{
+    color: #fff;
+  }
+  tr.properties-hint-tr > td.properties-hint-td > div {
+    /*position: relative;
+        left: -25em;*/
+    text-align: left;
+    margin-left: 38em;
+  }
+  /*修改样式*/
+  .main-content .table-bordered thead tr{
+    background: none;
+    line-height: 40px;
+    height: 40px;
+    color: #323232;
+  }
+  .div-table-left table thead tr td,.div-table-right table thead tr td{
+    border-bottom: none;
+  }
+  .div-table-left table tbody tr td,.div-table-right table tbody tr td{
+    font-size: 12px;
+  }
+  .div-table-left table tr td{
+    border-right: none;
+  }
+  .div-table-right table thead tr td:first-child{
+    border-left: none;
+  }
+  .table-bordered{
+    border: none;
+  }
+  .div-table-right table thead tr td:hover span{
+    color: #5078cb;
+  }
+  .div-table-right table thead tr td:hover span.fa-angle-down{
+    transform: rotate(-180deg);
+  }
+  .div-table-right table .td-properties{
+    text-align: center;
+  }
+  .div-table-right table .td-properties i,.div-table-left table i{
+    color: #5078cb;
+  }
+  .div-table-right table .td-properties{
+    border-bottom: none;
+  }
+  .div-table-left .table{
+    margin-bottom: 0;
+  }
+  .div-table-right tbody tr td:first-child{
+    border-left: none;
+  }
+  .text-length-more{
+    width: 100px;
+    display: block;
+    white-space: nowrap;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    float: left;
+  }
+</style>

+ 720 - 0
components/product/CategoryProperty.vue

@@ -0,0 +1,720 @@
+<template>
+  <div class="main-content container">
+    <div class="selector" v-if="!kind.leaf">
+      <div class="sl-wrap" >
+        <div class="sl-key">
+          <span>分类:</span>
+        </div>
+        <div class="sl-value">
+          <ul class="list-inline">
+            <li v-for="c in children" :title="c.nameCn">
+              <nuxt-link :to="`/product/kind/${c.id}`">{{c.nameCn}}</nuxt-link>
+            </li>
+          </ul>
+        </div>
+      </div>
+    </div>
+    <div class="div-table" split-dropdown v-if="kind.leaf">
+      <div class="div-table-left">
+        <table class="table table-bordered">
+          <thead >
+          <tr>
+            <td class="td-width dropdown">
+              <span  class="dropdown-toggle dropdown-back" data-toggle="dropdown">品牌<span class="fa fa-angle-down td-icon"></span></span>
+              <ul class="dropdown-menu parameter-selection-ul" role="menu" aria-labelledby="dropdownMenu1">
+                <!--orderBy:'nameCn'-->
+                <li v-for="b in brands"><a @click="selectBrand(b)"><span>{{b.nameCn}}</span></a></li>
+              </ul>
+            </td>
+          </tr>
+          </thead>
+          <tbody>
+          <tr class="tr-brand">
+            <td class="td-brand" style="vertical-align: middle;">
+              <div class="sl-selected" v-if="selectedBrand.nameCn" @click="selectBrand()">
+                <nuxt-link class="text-num">{{selectedBrand.nameCn}}</nuxt-link>
+                <span><i class="fa fa-close"></i></span>
+              </div>
+              <div v-if="!selectedBrand.nameCn">
+                请选择品牌
+              </div>
+            </td>
+          </tr>
+          </tbody>
+      </table>
+    </div>
+    <div class="div-table-right" dropdown-scroll>
+        <table class="table table-bordered" style="table-layout:fixed;">
+          <thead>
+          <tr>
+            <td v-for="pro in properties" class="td-width word-break" split-dropdown-trigger="pro.id">
+              <span class="dropdown-toggle dropdown-back" data-toggle="dropdown"><span>{{pro.property.labelCn}}</span><span class="fa fa-angle-down td-icon"></span></span>
+            </td>
+          </tr>
+          </thead>
+          <tbody>
+          <tr v-if="hasProperties" class="tr-properties">
+            <td v-for="pro in properties" class="td-properties" style="vertical-align:middle;">
+ 								<span class="sl-selected" v-if="pro.selected" @click="selectProperty(pro)">
+ 									<a class="text-num">{{pro.selected.value}}</a>
+									<span><i class="fa fa-close"></i></span>
+ 								</span>
+            </td>
+          </tr>
+          <tr class="properties-hint-tr" v-if="!hasProperties">
+            <td :colspan="properties.length" class="properties-hint-td">
+              <div>请选择筛选属性</div>
+            </td>
+          </tr>
+          </tbody>
+        </table>
+      </div>
+      <div>
+        <div v-for="pro in properties" split-dropdown-toggle="pro.id" style="top: 40px !important">
+          <ul class="parameter-selection-ul drop-down-list" role="menu" aria-labelledby="dropdownMenu1">
+            <!--|orderBy:'value'-->
+            <li v-for="v in pro.values"><a @click="selectPropertyValue(pro, value)" class="a-color"><span>{{v.value}}</span></a></li>
+          </ul>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+  export default {
+    layout: 'main',
+    data () {
+      return {
+        hasProperties: false,
+        selectedBrand: {
+          nameCn: null
+        }
+      }
+    },
+    computed: {
+      kind () {
+        return this.$store.state.product.kind.kindsParentWithBother.data[this.$store.state.product.kind.kindsParentWithBother.data.length - 1]
+      },
+      children () {
+        return this.$store.state.product.kind.children.data
+      },
+      properties () {
+        return this.$store.state.product.kind.kindProperty.data
+      },
+      brands () {
+        return this.$store.state.product.kind.brands.data
+      }
+    },
+    methods: {
+      selectBrand (item) {
+        return null
+      },
+      selectProperty (item) {
+        return null
+      },
+      selectPropertyValue (item, value) {
+        return null
+      }
+    }
+  }
+</script>
+
+<style>
+  .clear, .clr {
+    clear: both;
+  }
+
+  /* breadcrumbs */
+  .breadcrumbs {
+    margin-top: 20px;
+  }
+
+  .breadcrumbs ul.list-unstyled.list-inline {
+    margin-left: 0px;
+  }
+
+  .breadcrumbs ul.list-inline.list-unstyled li.crumb-item {
+    position: relative;
+    padding-left: 0px;
+    padding-right: 0px;
+    padding-bottom: 1px;
+    height: 32px;
+    line-height: 30px;
+    background: #fff;
+    border: solid 1px #6493ff;
+  }
+
+  .breadcrumbs ul li.crumb-item-angle {
+    margin-left: -5px;
+  }
+
+  .breadcrumbs ul li.crumb-item>a {
+    display: inline-block;
+    width: 100%;
+    height: 100%;
+    padding-left: 15px;
+    padding-right: 15px;
+    cursor: pointer;
+    text-decoration: none;
+    color: #323232;
+    font-size: 16px;
+  }
+  .breadcrumbs ul li.crumb-item:hover>a span,.breadcrumbs ul li.crumb-item:hover>a i{
+    color: #5078cb;
+  }
+  .breadcrumbs ul li.crumb-item>a i{
+    margin-right: 10px;
+  }
+  .breadcrumbs ul li.crumb-item:hover>a i{
+    transform: rotate(-180deg);
+  }
+  .breadcrumbs ul li.crumb-item .angle {
+    position: absolute;
+    left: -6px;
+    top: 50%;
+    margin-top: -5px;
+    height: 10px;
+    width: 10px;
+    border-bottom: 1px solid #6493ff;
+    border-left: 1px solid #6493ff;
+    background: white;
+    transform: rotate(45deg);
+    -ms-transform: rotate(45deg); 	/* IE 9 */
+    -moz-transform: rotate(45deg); 	/* Firefox */
+    -webkit-transform: rotate(45deg); /* Safari 和 Chrome */
+    -o-transform: rotate(45deg); 	/* Opera */
+    z-index: 14;
+  }
+
+  .breadcrumbs ul li.crumb-item .crumb-drop {
+    position: absolute;
+    display: none;
+    left: -1px;
+    top: 30px;
+    border: #6493ff 1px solid;
+    background: #fff;
+    z-index: 100;
+    width: 200px;
+  }
+
+  .breadcrumbs ul li.crumb-item .crumb-drop li {
+    line-height: 20px;
+  }
+  .breadcrumbs ul li.crumb-item .crumb-drop li a{
+    font-size: 12px;
+  }
+  li{
+    list-style: none;
+  }
+  .breadcrumbs ul li.crumb-item:hover .crumb-drop {
+    display: block;
+  }
+
+  .breadcrumbs ul li.crumb-item:hover>a {
+    border-color: #f50;
+    background: #ffffff;
+    z-index: 101;
+  }
+  .breadcrumbs ul li.crumb-item a{
+    color: #323232;
+  }
+  .breadcrumbs ul li.crumb-item a:hover{
+    color: #5078cb;
+  }
+  .kind-count-line {
+    line-height: 25px;
+    height: 25px;
+    color: #fff;
+    font-weight: 600;
+    background: #7bb4e1;
+  }
+
+  .kind-count-line .kind-count {
+    display: inline-block;
+    padding: 0 15px;
+    background-color: #f39800;
+  }
+
+  /* sl_warp */
+  .main-content .selector {
+    color: #666;
+    border: 1px solid #ddd;
+    border-top: #6493ff 2px solid;
+    margin-bottom: 30px;
+    padding: 10px 0;
+  }
+
+  .main-content .sl-wrap {
+    position: relative;
+    line-height: 22px;
+    padding: 5px 0;
+  }
+
+  .main-content .sl-wrap .sl-key {
+    float: left;
+    width: 100px;
+    padding: 0 8px;
+  }
+
+  .main-content .sl-wrap .sl-key>span {
+    color: #323232;
+    font-size: 14px;
+  }
+
+  .main-content .sl-wrap .sl-value {
+    margin-left: 110px;
+    overflow-y: auto;
+  }
+
+  .main-content .sl-wrap .sl-value ul li a{
+    color: #323232;
+    font-size: 14px;
+  }
+  .main-content .sl-wrap .sl-value ul li a:hover{
+    color: #5078cb;
+  }
+  .main-content .sl-wrap .sl-value .sl-selected {
+    display: inline-block;
+    position: relative;
+    padding-left: 10px;
+    padding-right: 30px;
+    border: 1px solid #ccc;
+    cursor: pointer;
+  }
+
+  .main-content .sl-wrap .sl-value .sl-selected a {
+    color: #666;
+    text-decoration: none;
+  }
+
+  .main-content .sl-wrap .sl-value .sl-selected:HOVER {
+    border: 1px solid #f50;
+  }
+
+  .main-content .sl-wrap .sl-value .sl-selected:HOVER a {
+    color: #f50;
+  }
+
+  .main-content .sl-wrap .sl-value .sl-selected span {
+    display: inline-block;
+    position: absolute;
+    right: 0px;
+    top: 0px;
+    height: 100%;
+    width: 20px;
+    text-align: center;
+    background: #ccc;
+    color: #fff;
+  }
+
+  .main-content .sl-wrap .sl-value .sl-selected:HOVER span {
+    background: #f50;
+  }
+
+  .main-content .sl-wrap .sl-value ul {
+    margin-bottom: 0;
+  }
+
+  .main-content .sl-wrap .sl-value ul.list-inline li {
+    width: 16.6666%;
+    white-space:nowrap;
+    overflow:hidden;
+    text-overflow:ellipsis;
+  }
+
+  .main-content .sl-wrap .sl-value ul, .main-content .sl-set .sl-value ul{
+    min-height: 25px;
+  }
+
+  .main-content .sl-wrap .sl-ext {
+    position: absolute;
+    top: 0px;
+    right: 0px;
+    width: 80px;
+  }
+
+  .main-content .sl-more {
+    position: relative;
+    top: -1px;
+    line-height: 30px;
+    text-align: center;
+    border-top: 1px solid #DDD;
+  }
+
+  .main-content .sl-more a {
+    position: relative;
+    display: inline-block;
+    margin-top: -1px;
+    height: 30px;
+    line-height: 30px;
+    padding: 0 10px 0 10px;
+    border-width: 1px;
+    border-style: solid;
+    border-color: #FFF #DDD #DDD;
+    background: #fff;
+    cursor: pointer;
+    -webkit-transition: border-color .15s ease-in-out;
+    -moz-transition: border-color .15s ease-in-out;
+    transition: border-color .15s ease-in-out;
+  }
+
+  .main-content .sl-more:hover {
+    border-top-color: #f39800;
+  }
+
+  .main-content .sl-more:hover a {
+    color: #f39800;
+    border-color: #FFF #f39800 #f39800;
+    text-decoration: none;
+  }
+
+  .main-content .sl-more a:focus {
+    text-decoration: none;
+    color: #f39800;
+  }
+
+  .main-content .sl-set {
+    position: relative;
+    line-height: 30px;
+    font-size: 14px;
+  }
+
+  .main-content .sl-set .sl-key {
+    float: left;
+    width: 100px;
+  }
+
+  .main-content .sl-set .sl-value {
+    margin-left: 110px;
+  }
+
+  .main-content .content {
+    position: relative;
+  }
+
+  .main-content .content .total {
+    position: relative;
+    margin-bottom: 10px;
+    line-height: 30px;
+    height: 30px;
+    background: #7bb4e1;
+    color: white;
+    font-weight: 700;
+  }
+
+  .main-content .info {
+    line-height: 24px;
+  }
+
+  .main-content .info .title {
+    display: inline-block;
+    width: 100px;
+    font-family: 'microsoft yahei';
+    font-weight: 600;
+  }
+
+  .main-content .info .content {
+    font-size: 14px;
+  }
+
+  .main-content .operate {
+    margin-bottom: 5px;
+  }
+
+  .main-content .operate .btn {
+    width: 100px;
+    text-align: left;
+  }
+
+  .main-content .content .view_all:hover {
+    text-decoration: none;
+    color: #f50;
+    background: #f5f5f5
+  }
+
+  .table>tbody>tr>td, .table>tbody>tr>th, .table>tfoot>tr>td, .table>tfoot>tr>th,
+  .table>thead>tr>td, .table>thead>tr>th {
+    padding: 10px 5px;
+  }
+
+  .total-content {
+    background-color: #f39800;
+    padding-left: 10px;
+  }
+
+  .btnactive {
+    background-color: #f39800;
+  }
+
+  .reserve {
+    color: white;
+    font-weight: 500;
+  }
+
+  .pagging .pagging-count {
+    padding-left: 10px;
+    padding-right: 10px;
+  }
+
+  .pagging .pagging-count:HOVER {
+    background: #4D7BA5;
+    cursor: pointer;
+  }
+
+  .pagging .pagging-count a {
+    color: white !important;
+    text-decoration: none !important;
+  }
+  .parameter-selection > div:first-child {
+    display: inline-block;
+    position: absolute;
+    top: 50%;
+    left: 8px;
+    transform: translateY(-50%);
+  }
+  .parameter-selection div:last-child {
+    display: inline-block;
+    position: absolute;
+    top: 50%;
+    left: 40px;
+    transform: translateY(-50%);
+  }
+  .div-table{
+    width:1190px;
+    height:120px;
+    border-top: #6493ff 2px solid;
+  }
+  .div-table-left{
+    width:135px;
+    float:left;
+    text-align: center;
+  }
+  .parameter-selection-ul{
+    min-height: 80px;
+    max-height: 176px;
+    overflow: scroll;
+    overflow-x:hidden;
+  }
+  .div-table-right{
+    float:left;
+    height:120px;
+    width:1055px;
+    overflow-x:auto;
+    overflow-y:hidden;
+    border:1px solid #DBDBDB;
+  }
+  .div-table-right .table{
+    margin-bottom: 0;
+  }
+  .div-table-right table thead tr td{
+    width: 140px;
+    text-align: center;
+    vertical-align: middle;
+    padding: 0;
+  }
+  .text-hidden {
+    text-overflow:ellipsis;
+    overflow:hidden;
+    white-space: nowrap;
+  }
+  .text-hidden:hover{
+    overflow: visible;
+  }
+  .td-width{
+    color: #323232;
+    font-size: 14px;
+  }
+  .td-icon{
+    font-size:18px;
+  }
+  .tr-brand{
+    height:80px;
+    vertical-align: middle;
+  }
+  .tr-properties{
+    height:65px;
+  }
+  .td-brand,.td-properties{
+    line-height: 20px;
+    word-wrap : break-word;
+    word-break : break-all;
+  }
+  thead tr {
+    background: linear-gradient(rgb(93, 134, 220), rgb(12, 53, 136));
+    color: #fff;
+    height: 48px;
+  }
+  .table>thead>tr>th{
+    padding:5px 5px;
+  }
+
+  .dropdown:hover>.dropdown-back {
+    border-color: transparent;
+    background-color: transparent;
+  }
+  /* scroll */
+  ::-webkit-scrollbar {
+    width: 10px;
+    height: 10px;
+    background: #ededed;
+  }
+
+  ::-webkit-scrollbar-thumb {
+    background-color: #c1c1c1;
+    border-radius: 5px;
+  }
+
+  ::-webkit-scrollbar-thumb:hover {
+    background-color: #959595;
+  }
+
+  .container {
+    position: relative;
+    width: 1190px;
+  }
+  .wrap {
+    position: relative;
+    width: 500px;
+    border: 1px solid #ccc;
+    overflow-x: auto;
+  }
+  .table {
+    display: table;
+    table-layout: fixed;
+    width: 100%;
+    border-collapse: collapse;
+    position: relative;
+    left: 0px;
+  }
+  .tr, .th {
+    display: table-row;
+
+  }
+  .th {
+    font-weight: 600;
+  }
+  .td {
+    display: table-cell;
+    padding: 5px;
+    width: 100px;
+    text-align: center;
+    border: 1px solid #ddd;
+  }
+  .dropdown-menu {
+    display: none;
+    position: absolute;
+    top: 100%;
+    background: #fff;
+    text-align: center;
+    cursor: pointer;
+  }
+  [split-dropdown] {
+    position: relative;
+  }
+
+  [split-dropdown-toggle] {
+    position: absolute;
+    display: none;
+    border: 1px solid #ccc;
+    background: #fff;
+    z-index: 100;
+    top: 40px !important;
+  }
+  .drop-down-list{
+    font-size: 14px;
+    min-width: 100px;
+    line-height: 1.75;
+    background: #fff;
+    text-align:center;
+    padding: 5px 0;
+    margin: 1px 0 0;
+  }
+  .drop-down-list a{
+    padding: 0 10px;
+  }
+  .drop-down-list li:hover,.dropdown-menu li:hover a{
+    background: #5078cb;
+  }
+  .drop-down-list li:hover a,.dropdown-menu li:hover a{
+    color: #fff;
+  }
+  .a-color {
+    color:black;
+    cursor: pointer;
+  }
+  tr.properties-hint-tr {
+    height: 65px;
+  }
+  tr.properties-hint-tr > td.properties-hint-td {
+    vertical-align: middle;
+    line-height: 20px;
+    border-bottom: none;
+  }
+  tr.properties-hint-tr > td.properties-hint-td > div {
+    /*position: relative;
+        left: -25em;*/
+    text-align: left;
+    margin-left: 38em;
+  }
+  .word-break {
+    word-break: break-word;
+  }
+  /*修改样式*/
+  .breadcrumbs,.main-content{
+    padding: 0;
+  }
+  .main-content .table-bordered{
+    border-top: none;
+  }
+  .main-content .table-bordered thead tr{
+    background: none;
+    line-height: 40px;
+    height: 40px;
+    color: #323232;
+  }
+  .div-table-left table thead tr td,.div-table-right table thead tr td{
+    border-bottom: none;
+  }
+  .div-table-left table tbody tr td,.div-table-right table tbody tr td{
+    font-size: 12px;
+  }
+  .div-table-left table tr td{
+    border-right: none;
+  }
+  .div-table-right table thead tr td:first-child{
+    border-left: none;
+  }
+  .table-bordered{
+    border: none;
+  }
+  .div-table-right table thead tr td:hover span{
+    color: #5078cb;
+  }
+  .div-table-right table thead tr td:hover span.fa-angle-down{
+    transform: rotate(-180deg);
+  }
+  .div-table-right table .td-properties{
+    text-align: center;
+  }
+  .div-table-right table .td-properties i,.div-table-left table i{
+    color: #5078cb;
+  }
+  .div-table-right table .td-properties{
+    border-bottom: none;
+  }
+  .div-table-left .table{
+    margin-bottom: 0;
+  }
+  .div-table-right tbody tr td:first-child{
+    border-left: none;
+  }
+  .text-length-more{
+    width: 100px;
+    display: block;
+    white-space: nowrap;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    float: left;
+  }
+</style>

+ 273 - 0
components/product/ComponentGoods.vue

@@ -0,0 +1,273 @@
+<template>
+  <div class="component-table">
+    <!-- 筛选结果展示 -->
+    <div class="search-record">
+      筛选后现为您找到以下<span class="red">{{componentGoods.totalElements}}</span>个结果
+    </div>
+    <!-- 列表展示 -->
+    <table class="product-list">
+      <thead>
+      <tr style="height: 40px;">
+        <th width="80"></th>
+        <th width="160">品牌/型号</th>
+        <th width="100">包装/生产日期</th>
+        <th width="110">库存</th>
+        <th width="90">数量</th>
+        <th width="90">香港交货<span style="font-size: 12px;">($)</span></th>
+        <th width="100">大陆交货<span style="font-size: 12px;">(¥)</span></th>
+        <th width="100">交期(天)</th>
+        <th width="100">操作</th>
+      </tr>
+      </thead>
+      <tbody id="productList-content">
+      <!--| orderBy : dir + orderType  ng-class="{'tr-even' : !compGoods.isOdd}"-->
+      <tr v-for="compGoods in componentGoods.content">
+        <td>
+          <!--store/{{compGoods.storeId}}#/batchInfo/{{compGoods.batchCode}}-->
+          <a v-if="compGoods.batchCode" href="#">
+            <img :src="compGoods.img || '/images/all/default.png'"/>
+          </a>
+          <img v-if="!compGoods.batchCode" :src="compGoods.img || '/images/all/default.png'"/>
+          <!--store/{{compGoods.storeId}}#/home-->
+          <a href="#" class="contact" :title="compGoods.storeName">{{compGoods.storeName}}</a>
+        </td>
+        <td class="brand-code">
+          <div class="brand"><nuxt-link :to="`/product/brand/${compGoods.brand.uuid}/`" title="compGoods.brand.nameEn">{{compGoods.brand.nameEn}}</nuxt-link></div>
+          <div class="code"><nuxt-link :to="`/product/component/${compGoods.uuid}/`" :title="compGoods.code">{{compGoods.code}}</nuxt-link></div>
+        </td>
+        <td>
+          <div class="package">{{compGoods.packaging || '暂无包装方式信息'}}</div>
+          <div class="date">{{compGoods.produceDate || '-'}}</div>
+        </td>
+        <td class="text-left">
+          <div class="goods">
+            库存:<span>{{compGoods.reserve || '暂无库存'}}</span>
+          </div>
+          <div class="from" v-if="compGoods.reserve > 0">
+            起拍:<span>{{compGoods.minBuyQty}}</span>
+          </div>
+          <div class="multiple" v-if="compGoods.reserve > 0">
+            倍数:<span>{{compGoods.minPackQty}}</span>
+          </div>
+        </td>
+        <td>
+          <div v-if="!compGoods.prices">
+            <span>—</span>
+          </div>
+          <div v-for="price in compGoods.prices">
+            <!--| number-->
+            <span>{{price.start}}</span> +
+          </div>
+        </td>
+        <td>
+          <div v-if="(compGoods.currencyName && compGoods.currencyName.indexOf('USD')==-1) || !compGoods.prices">
+            <span>—</span>
+          </div>
+          <div v-for="price in compGoods.prices">
+            <!--| formateNumber : 6-->
+            <span>{{price.uSDPrice}}</span>
+          </div>
+        </td>
+        <td>
+          <div v-if="(compGoods.currencyName && compGoods.currencyName.indexOf('RMB')==-1) || !compGoods.prices">
+            <span>—</span>
+          </div>
+          <div v-for="price in compGoods.prices">
+            <!--formateNumber : 6-->
+            <span>{{price.rMBPrice}}</span>
+          </div>
+        </td>
+        <td>
+          <div v-if="!compGoods.b2cMinDelivery">
+            <span>—</span>
+          </div>
+          <div v-if="compGoods.b2cMinDelivery">交期:<span v-if="compGoods.b2cMinDelivery != compGoods.b2cMaxDelivery">{{compGoods.b2cMinDelivery + '-' + compGoods.b2cMaxDelivery}}</span>
+            <span v-if="compGoods.b2cMinDelivery == compGoods.b2cMaxDelivery">{{compGoods.b2cMinDelivery}}</span>
+          </div>
+        </td>
+        <td>
+          <div v-if="!compGoods.reserve">
+            <span>—</span>
+          </div>
+          <div v-if="compGoods.reserve > 0">
+            <button class="btn btn-primary btn-buy-now" @click="addToCart(compGoods, true)"><span class="watch">立即购买</span></button>
+          </div>
+          <div v-if="compGoods.reserve > 0">
+            <button class="btn btn-add-cart" @click="addToCart(compGoods, false)"><span class="watch">加入购物车</span></button>
+          </div>
+        </td>
+      </tr>
+      <tr v-if="componentGoods.totalElements == 0">
+        <td colspan="10" class="text-center" style="line-height: 40px; font-size: 20px;">
+          <i class="fa fa-smile-o fa-lg"></i> 暂无产品信息
+        </td>
+      </tr>
+      </tbody>
+    </table>
+    <div style="float: right;">
+      <el-pagination
+        :current-page.sync="pageParams.page"
+        :page-size="pageParams.count"
+        layout="prev, pager, next, jumper"
+        :total="componentGoods.totalElements"
+        @current-change="handleCurrentChange">
+      </el-pagination>
+    </div>
+  </div>
+</template>
+
+<script>
+  export default {
+    layout: 'mian',
+    data () {
+      return {
+        pageParams: {
+          page: 1,
+          count: 10,
+          filter: {
+            kindid: this.$route.params.id
+          }
+        }
+      }
+    },
+    computed: {
+      componentGoods () {
+        return this.$store.state.product.component.componentGoods.data
+      }
+    },
+    methods: {
+      addToCart: function (goods, buyNow) {
+        return null
+      },
+      handlerCurrentNode (data, node) {
+        this.pageParams.page = 1
+        this.pageCmpGoods(this.pageParams)
+      },
+      async pageCmpGoods (pageParams) {
+        let params = {}
+        params.filter = pageParams.filter
+        params.page = pageParams.page
+        params.count = pageParams.count
+        let { data } = await this.$http.get('/api/product/product/getCompGoodsByKindid', { params })
+        this.$store.commit('product/component/GET_CMPGOODS_SUCCESS', data)
+      },
+      handleCurrentChange (page) {
+        this.pageParams.page = page
+        this.pageCmpGoods(this.pageParams)
+      }
+    }
+  }
+</script>
+
+<style>
+  .product-list{
+    width: 1190px;
+    margin-bottom: 20px;
+  }
+  .product-list thead tr{
+    border-top: #6493ff 2px solid;
+    color: #323232;
+    background: none;
+  }
+  /* 物品列表 */
+  .product-list .brand-code {
+    font-size: 14px;
+    text-align: center;
+  }
+
+  .product-list .brand-code .code {
+    font-weight: 600;
+  }
+
+  .product-list th {
+    color: rgb(50,50,50);
+    font-size: 14px;
+    font-weight: 600;
+    background-color: #f7f7f7;
+    text-align: center;
+  }
+
+  .product-list tbody>tr {
+    border: 1px solid #e8e8e8;
+  }
+
+  .product-list tbody>tr img {
+    border: 1px solid #e8e8e8;
+    margin: 10px 0 5px 0;
+    width: 36px;
+    height: 36px;
+  }
+  .product-list tbody>tr .contact{
+    font-size: 14px;
+    color: #5078cb;
+    width: 90%;
+    margin: 0 auto;
+    display: inline-block;
+  }
+  .product-list tbody>tr .contact:hover{
+    color: #d32526;
+  }
+
+  .product-list td {
+    font-size: 12px;
+    color: #333;
+    text-align: center;
+    line-height: 20px;
+  }
+
+  /* 物品列表按钮 */
+  .product-list .btn-buy-now {
+    background-color: #5078CB;
+    color: #fff;
+    width: 80px;
+    height: 30px;
+    font-size: 12px;
+    border: 1px solid #5078cb;
+  }
+
+  .product-list .btn-add-cart {
+    margin-top: 10px;
+    color: #214797;
+    width: 80px;
+    height: 30px;
+    font-size: 12px;
+    background-color: #fff;
+    border: 1px solid #e8e8e8;
+  }
+  .product-list .btn-buy-now:hover{
+    background: #214797;
+  }
+  .product-list .btn-add-cart:hover{
+    background-color: #5078CB;
+    color: #fff;
+  }
+  .product-list .text-left{
+    text-align: left;
+  }
+  .product-list .text-left div{
+    margin-left: 30px;
+  }
+  .product-list tbody tr td{
+    padding: 10px 0;
+  }
+  .search-record{
+    width: 100%;
+    margin: 0 auto;
+    height: 40px;
+    font-size: 16px;
+    line-height: 40px;
+    margin-top: 20px;
+  }
+  .search-record span.red{
+    color: #ff0909;
+  }
+  .el-pagination .el-pager li.active{
+    background-color: #5078cb;
+    border-color: #337ab7;
+  }
+  <!-- 分页 -->
+  .el-pagination .el-pager li.active {
+    border-color: #5078cb !important;
+    background-color: #5078cb !important;
+  }
+</style>

+ 4 - 1
components/product/index.js

@@ -8,5 +8,8 @@ import OriginalDetail from './original/OriginalDetail.vue'
 import Recommends from './Recommends.vue'
 import BrandList from './BrandList.vue'
 import KindBox from './KindBox.vue'
-export { ComponentDetail, ComponentMenu, StoreInfo, BrandDetail, CategoriesList, BrandComponent, OriginalDetail, Recommends, BrandList, KindBox }
+import CategroyNav from './CategoryNav.vue'
+import CategoryProperty from './CategoryProperty.vue'
+import ComponentGoods from './ComponentGoods.vue'
 
+export { ComponentDetail, ComponentMenu, StoreInfo, BrandDetail, CategoriesList, BrandComponent, OriginalDetail, Recommends, BrandList, KindBox, CategroyNav, CategoryProperty, ComponentGoods }

+ 3 - 13
pages/product/kind.vue

@@ -1,21 +1,11 @@
 <template>
   <div>
-    <kind-box></kind-box>
+    <nuxt-child></nuxt-child>
   </div>
 </template>
 
 <script>
-import { KindBox } from '~components/product'
-
-export default {
-  layout: 'main',
-  fetch ({store}) {
-    return Promise.all([
-      store.dispatch('product/loadAllProductKinds', { id: 0 })
-    ])
-  },
-  components: {
-    KindBox
+  export default {
+    layout: 'main'
   }
-}
 </script>

+ 36 - 0
pages/product/kind/_id.vue

@@ -0,0 +1,36 @@
+<template>
+  <div class="container">
+    <categroy-nav></categroy-nav>
+    <category-property></category-property>
+    <component-goods></component-goods>
+  </div>
+</template>
+
+<script>
+  import { CategroyNav, CategoryProperty, ComponentGoods } from '~components/product'
+
+  export default {
+    layout: 'main',
+    fetch ({store, route}) {
+      return Promise.all([
+        store.dispatch('product/loadKindParentsWithBothers', {id: route.params.id}),
+        store.dispatch('product/loadKindBrands', {id: route.params.id}),
+        store.dispatch('product/pageComGoods', {kindid: route.params.id})
+      ])
+    },
+    components: {
+      CategroyNav,
+      CategoryProperty,
+      ComponentGoods
+    }
+  }
+</script>
+
+<style>
+  .container {
+    position: relative;
+    width: 1190px;
+    margin-right: auto;
+    margin-left: auto;
+  }
+</style>

+ 21 - 0
pages/product/kind/home.vue

@@ -0,0 +1,21 @@
+<template>
+  <div>
+    <kind-box></kind-box>
+  </div>
+</template>
+
+<script>
+  import { KindBox } from '~components/product'
+
+  export default {
+    layout: 'main',
+    fetch ({store}) {
+      return Promise.all([
+        store.dispatch('product/loadAllProductKinds', { id: 0 })
+      ])
+    },
+    components: {
+      KindBox
+    }
+  }
+</script>

+ 53 - 0
store/product.js

@@ -44,5 +44,58 @@ export const actions = {
       }, err => {
         commit('kind/GET_KIND_FAILURE', {id, err})
       })
+  },
+  loadKindParentsWithBothers ({ commit }, params = {}) {
+    let id = params.id
+    commit('kind/REQUEST_KINDPARENTSWITHBOTHERS', params)
+    return axios.get(`/api/product/kind/${id}/parentsWithBothers`)
+      .then(response => {
+        commit('kind/GET_KINDPARENTSWITHBOTHERS_SUCCESS', response.data)
+        if (response.data) {
+          if (!response.data[response.data.length - 1].leaf) {
+            commit('kind/REQUEST_CHILDREN')
+            return axios.get(`/api/product/kind/${id}/children`)
+              .then(response => {
+                commit('kind/GET_CHILDREN_SUCCESS', response.data)
+              }, err => {
+                commit('kind/GET_CHILDREN_FAILURE', err)
+              })
+          } else {
+            commit('kind/REQUEST_KINDPROPERTY')
+            return axios.get(`/api/product/kind/${id}/properties/values`)
+              .then(response => {
+                commit('kind/GET_KINDPROPERTY_SUCCESS', response.data)
+              }, err => {
+                commit('kind/GET_KINDPROPERTY_FAILURE', err)
+              })
+          }
+        }
+      }, err => {
+        commit('kind/GET_KINDPARENTSWITHBOTHERS_FAILURE', err)
+      })
+  },
+  loadKindBrands ({ commit }, params = {}) {
+    let id = params.id
+    commit('kind/REQUEST_KINDBRANDS')
+    return axios.get(`/api/product/kind/${id}/brands`)
+      .then(response => {
+        commit('kind/GET_KINDBRANDS_SUCCESS', response.data)
+      }, err => {
+        commit('kind/GET_KINDBRANDS_FAILURE', err)
+      })
+  },
+  pageComGoods ({ commit }, kindid = '', pageParams = { page: 1, count: 10 }) {
+    let params = {}
+    let filter = {kindid: kindid.kindid}
+    params.filter = filter
+    params.page = pageParams.page
+    params.count = pageParams.count
+    commit('component/REQUEST_CMPGOODS')
+    return axios.get('/api/product/product/getCompGoodsByKindid', { params })
+      .then(response => {
+        commit('component/GET_CMPGOODS_SUCCESS', response.data)
+      }, err => {
+        commit('component/GET_CMPGOODS_FAILURE', err)
+      })
   }
 }

+ 19 - 0
store/product/component.js

@@ -0,0 +1,19 @@
+export const state = () => ({
+  componentGoods: {
+    fetching: false,
+    data: []
+  }
+})
+
+export const mutations = {
+  REQUEST_CMPGOODS (state) {
+    state.componentGoods.fetching = true
+  },
+  GET_CMPGOODS_SUCCESS (state, result) {
+    state.componentGoods.fetching = false
+    state.componentGoods.data = result
+  },
+  GET_CMPGOODS_FAILURE (state) {
+    state.fetching = false
+  }
+}

+ 56 - 0
store/product/kind.js

@@ -2,6 +2,22 @@ export const state = () => ({
   kinds: {
     fetching: false,
     data: []
+  },
+  kindsParentWithBother: {
+    fetching: false,
+    data: []
+  },
+  children: {
+    fetching: false,
+    data: []
+  },
+  kindProperty: {
+    fetching: false,
+    data: []
+  },
+  brands: {
+    fetching: false,
+    data: []
   }
 })
 
@@ -40,5 +56,45 @@ export const mutations = {
         kind.children = action.result
       }
     }
+  },
+  REQUEST_KINDPARENTSWITHBOTHERS (state) {
+    state.kindsParentWithBother.fetching = true
+  },
+  GET_KINDPARENTSWITHBOTHERS_SUCCESS (state, result) {
+    state.kindsParentWithBother.fetching = false
+    state.kindsParentWithBother.data = result
+  },
+  GET_KINDPARENTSWITHBOTHERS_FAILURE (state) {
+    state.kindsParentWithBother.fetching = false
+  },
+  REQUEST_CHILDREN (state) {
+    state.children.fetching = true
+  },
+  GET_CHILDREN_SUCCESS (state, result) {
+    state.children.fetching = false
+    state.children.data = result
+  },
+  GET_CHILDREN_FAILURE (state) {
+    state.children.fetching = false
+  },
+  REQUEST_KINDPROPERTY (state) {
+    state.kindProperty.fetching = true
+  },
+  GET_KINDPROPERTY_SUCCESS (state, result) {
+    state.kindProperty.fetching = false
+    state.kindProperty.data = result
+  },
+  GET_KINDPROPERTY_FAILURE (state) {
+    state.kindProperty.fetching = false
+  },
+  REQUEST_KINDBRANDS (state) {
+    state.brands.fetching = true
+  },
+  GET_KINDBRANDS_SUCCESS (state, result) {
+    state.brands.fetching = false
+    state.brands.data = result
+  },
+  GET_KINDBRANDS_FAILURE (state) {
+    state.brands.fetching = false
   }
 }