Authored by 李奇

Merge remote-tracking branch 'origin/feature/product-detail' into feature/product-detail

@@ -246,7 +246,7 @@ const component = { @@ -246,7 +246,7 @@ const component = {
246 page: req.query.page || 1, 246 page: req.query.page || 1,
247 limit: 20, 247 limit: 20,
248 gender: GENDER[CHANNEL_MAP[channel]], 248 gender: GENDER[CHANNEL_MAP[channel]],
249 - udid: req.sessionID , 249 + udid: req.sessionID,
250 rec_pos: req.query.rec_pos || 100001, 250 rec_pos: req.query.rec_pos || 100001,
251 yh_channel: CHANNEL_MAP[channel] || 1, 251 yh_channel: CHANNEL_MAP[channel] || 1,
252 client_id: req.cookies._yasvd || '1' 252 client_id: req.cookies._yasvd || '1'
@@ -97,6 +97,7 @@ @@ -97,6 +97,7 @@
97 "postcss-sprites": "^4.2.1", 97 "postcss-sprites": "^4.2.1",
98 "postcss-use": "^2.2.0", 98 "postcss-use": "^2.2.0",
99 "precss": "^1.4.0", 99 "precss": "^1.4.0",
  100 + "sass-loader": "^6.0.6",
100 "shelljs": "^0.7.3", 101 "shelljs": "^0.7.3",
101 "style-loader": "^0.17.0", 102 "style-loader": "^0.17.0",
102 "stylelint": "^7.1.0", 103 "stylelint": "^7.1.0",
  1 +const postImport = require('postcss-import');
  2 +const precss = require('precss');
  3 +const autoprefixer = require('autoprefixer');
  4 +const cssnano = require('cssnano');
  5 +
  6 +module.exports = () => {
  7 + return [
  8 + postImport({}),
  9 + precss(),
  10 + autoprefixer(),
  11 + cssnano()
  12 + ];
  13 +};
@@ -2,12 +2,14 @@ const Vue = require('vue'); @@ -2,12 +2,14 @@ const Vue = require('vue');
2 const lazyload = require('vue-lazyload'); 2 const lazyload = require('vue-lazyload');
3 const directive = require('common/vue-directive'); 3 const directive = require('common/vue-directive');
4 const app = require('product/detail/index.vue'); 4 const app = require('product/detail/index.vue');
  5 +const VueTouch = require('vue-touch');
5 const yoho = require('yoho'); 6 const yoho = require('yoho');
6 7
7 require('common/vue-filter')(Vue); 8 require('common/vue-filter')(Vue);
8 Vue.use(lazyload, { 9 Vue.use(lazyload, {
9 preLoad: 3 10 preLoad: 3
10 }); 11 });
  12 +Vue.use(VueTouch);
11 Vue.use(directive); 13 Vue.use(directive);
12 14
13 yoho.ready(() => { 15 yoho.ready(() => {
  1 +<template>
  2 +<div class="add-cart" :class="cartClass">
  3 + <ul class="cart-detail">
  4 + <li v-touch:tap="pickColor">
  5 + <span class="color">{{colorName || '颜色'}}</span>
  6 + <i class="icon color" :class="sortClass('color')"></i>
  7 + </li>
  8 + <li v-touch:tap="pickSize">
  9 + <span class="size">{{sizeName || '尺码'}}</span>
  10 + <i class="icon size" :class="sortClass('size')"></i
  11 + </li>
  12 + </ul>
  13 + <a class="add-btn" v-touch:tap="toCart">{{buttonText}}</a>
  14 + <slide-select v-ref:slideSelect
  15 + :slides="slideList"
  16 + :model="slideId"
  17 + :title="slideTitle"
  18 + :tag="slideTag"
  19 + @selected="slideSelect"
  20 + @hide="slideHide"></slide-select>
  21 +</div>
  22 +</template>
  23 +
  24 +<script>
  25 +const slideSelect = require('./slide-select.vue');
  26 +const tip = require('common/tip');
  27 +
  28 +module.exports = {
  29 + name: 'add-to-cart',
  30 + props: {
  31 + value: {
  32 + type: Object,
  33 + default() {
  34 + return {};
  35 + }
  36 + }
  37 + },
  38 + data() {
  39 + return {
  40 + skuList: [],
  41 + slideList: [],
  42 + slideTitle: '',
  43 + slideId: 0,
  44 + slideTag: '',
  45 + colorName: '',
  46 + sizeName: '',
  47 + colorId: 0,
  48 + sizeId: 0,
  49 + sku: 0,
  50 + };
  51 + },
  52 + computed: {
  53 + cartClass() {
  54 + if (this.value.storage_sum <= 0) {
  55 + return {'no-storage': true};
  56 + }
  57 + return {};
  58 + },
  59 + buttonText() {
  60 + if (this.value.storage_sum <= 0) {
  61 + return '已售罄';
  62 + }
  63 + return '加入购物车';
  64 + }
  65 + },
  66 + methods: {
  67 + sortClass(tag) {
  68 + if (this.slideTag === tag) {
  69 + return {'icon-sort-up': true};
  70 + }
  71 + if (this.slideTag === tag) {
  72 + return {'icon-sort-up': true};
  73 + }
  74 + return {'icon-sort-down': true};
  75 + },
  76 + pickColor() {
  77 + if (this.skuList.length && this.value.storage_sum > 0) {
  78 + let slides = [];
  79 +
  80 + this.skuList.filter(sku => sku.storage).forEach(sku => {
  81 + if (!slides.some(slide => slide.id === sku.colorId)) {
  82 + slides.push({
  83 + text: sku.colorName,
  84 + id: sku.colorId
  85 + });
  86 + }
  87 + });
  88 + this.slideList = slides;
  89 + this.slideId = this.colorId;
  90 + this.slideTitle = '颜色';
  91 + this.slideTag = 'color';
  92 + this.$refs.slideselect.show();
  93 + }
  94 + },
  95 + pickSize() {
  96 + if (this.skuList.length && this.value.storage_sum > 0) {
  97 + let slides = [];
  98 +
  99 + this.skuList.filter(sku => sku.storage).forEach(sku => {
  100 + if (!slides.some(slide => slide.id === sku.sizeId) &&
  101 + (!this.colorId || sku.colorId === this.colorId)) {
  102 + slides.push({
  103 + text: sku.sizeName,
  104 + id: sku.sizeId
  105 + });
  106 + }
  107 + });
  108 + this.slideList = slides;
  109 + this.slideId = this.sizeId;
  110 + this.slideTitle = '尺码';
  111 + this.slideTag = 'size';
  112 + this.$refs.slideselect.show();
  113 + }
  114 + },
  115 + slideSelect(params) {
  116 + if (params.tag === 'color') {
  117 + this.colorId = params.slide.id;
  118 + this.colorName = params.slide.text;
  119 + this.sizeId = 0;
  120 + this.sizeName = '';
  121 + } else {
  122 + this.sizeId = params.slide.id;
  123 + this.sizeName = params.slide.text;
  124 + }
  125 + },
  126 + processSku(goodsList) {
  127 + let skus = [];
  128 +
  129 + goodsList.filter(color => color.status).forEach(color => {
  130 + color.size_list.filter(size => size.status).forEach(size => {
  131 + if (!skus.some(sku => sku.colorId === color.color_id && sku.sizeId === size.size_id)) {
  132 + skus.push({
  133 + colorId: color.color_id,
  134 + colorName: color.factory_goods_name,
  135 + sizeId: size.size_id,
  136 + sizeName: size.size_name,
  137 + sku: size.product_sku,
  138 + storage: size.storage_number,
  139 + });
  140 + }
  141 + });
  142 + });
  143 + return skus;
  144 + },
  145 + toCart() {
  146 + if (this.value.storage_sum <= 0) {
  147 + return;
  148 + }
  149 + if (!this.colorId) {
  150 + return tip('请选择颜色');
  151 + }
  152 + if (!this.sizeId) {
  153 + return tip('请选择尺码');
  154 + }
  155 + let sku = this.skuList.find(s => s.colorId === this.colorId && s.sizeId === this.sizeId);
  156 +
  157 + if (sku) {
  158 + this.reset();
  159 + this.$emit('add-cart', sku);
  160 + }
  161 + },
  162 + slideHide() {
  163 + this.slideTag = '';
  164 + },
  165 + reset() {
  166 + this.colorName = '';
  167 + this.sizeName = '';
  168 + this.colorId = 0;
  169 + this.sizeId = 0;
  170 + },
  171 + },
  172 + watch: {
  173 + value(val) {
  174 + if (val) {
  175 + this.skuList = this.processSku(val.goods_list);
  176 + }
  177 + }
  178 + },
  179 + components: {slideSelect}
  180 +};
  181 +</script>
  182 +
  183 +<style>
  184 +.add-cart {
  185 + &.no-storage {
  186 + .cart-detail {
  187 + color: #b0b0b0;
  188 +
  189 + .icon {
  190 + display: none;
  191 + }
  192 + }
  193 +
  194 + .add-btn {
  195 + background-color: #b0b0b0;
  196 + border-color: #b0b0b0;
  197 + }
  198 + }
  199 +
  200 + .cart-detail {
  201 + font-size: 0;
  202 + height: 100px;
  203 + margin-bottom: 40px;
  204 + border-top: 1px solid #eee;
  205 + border-bottom: 1px solid #eee;
  206 + display: flex;
  207 +
  208 + li {
  209 + position: relative;
  210 + display: flex;
  211 + line-height: 100px;
  212 + height: 100px;
  213 + overflow: hidden;
  214 + font-size: 32px;
  215 + flex: 1 1 100%;
  216 + align-items: center;
  217 + justify-content: space-between;
  218 +
  219 + .icon {
  220 + float: right;
  221 + font-weight: bold;
  222 + font-size: 40px;
  223 +
  224 + &.icon-sort-down {
  225 + margin-top: -15px;
  226 + }
  227 + }
  228 +
  229 + span {
  230 + display: block;
  231 + height: 40px;
  232 + line-height: 40px;
  233 + }
  234 +
  235 + &:first-child {
  236 + padding-right: 30px;
  237 + }
  238 +
  239 + &:last-child {
  240 + span {
  241 + padding-left: 30px;
  242 + border-left: solid 1px #e0e0e0;
  243 + }
  244 + }
  245 + }
  246 + }
  247 +
  248 + .add-btn {
  249 + display: inline-block;
  250 + width: 100%;
  251 + height: 85px;
  252 + color: #fff;
  253 + font-size: 32px;
  254 + text-align: center;
  255 + line-height: 82px;
  256 + background-color: #000;
  257 + border: 1px solid #7a7a7a;
  258 + }
  259 +}
  260 +</style>
  1 +<template>
  2 + <div class="select-header">
  3 + <div class="title">{{title}}</div>
  4 + <a href="javascript:;" class="btn-sure" @click="selected">确定</a>
  5 + </div>
  6 +</template>
  7 +
  8 +<script>
  9 +module.exports = {
  10 + name: 'slide-select-header',
  11 + props: ['title'],
  12 + methods: {
  13 + selected() {
  14 + this.$emit('selected');
  15 + }
  16 + }
  17 +};
  18 +</script>
  19 +
  20 +<style>
  21 +.select-header {
  22 + width: 100%;
  23 + height: 80px;
  24 + line-height: 80px;
  25 + border-bottom: 1px solid #e0e0e0;
  26 + font-size: 32px;
  27 + background-color: #000;
  28 +
  29 + .title {
  30 + float: left;
  31 + padding-left: 25px;
  32 + color: #fff;
  33 + }
  34 +
  35 + .btn-sure {
  36 + float: right;
  37 + display: block;
  38 + width: 100px;
  39 + color: #4a90e2;
  40 + text-align: center;
  41 + }
  42 +}
  43 +</style>
  1 +<template>
  2 + <div class="select-swipe"
  3 + v-touch:panmove="panmove"
  4 + v-touch:panstart="panstart"
  5 + v-touch:panend="panend">
  6 + <div class="select-foucs"></div>
  7 + <ul class="select-ul"
  8 + :style="selectStyle">
  9 + <li class="item" :class="itemClass(size)" v-for="size in slides" :key="size.id">
  10 + <p>{{size.text}}</p>
  11 + </li>
  12 + </ul>
  13 +</div>
  14 +</template>
  15 +
  16 +<script>
  17 +module.exports = {
  18 + name: 'slide-select-swipe',
  19 + props: {
  20 + slides: {
  21 + type: Array,
  22 + default() {
  23 + return [];
  24 + }
  25 + },
  26 + model: {
  27 + type: Number,
  28 + default: 0
  29 + }
  30 + },
  31 + data() {
  32 + return {
  33 + selectStyle: {
  34 + transform: 'translate(0, 0)',
  35 + },
  36 + transitionStyle: '',
  37 + translateY: 0,
  38 + currentIndex: 2,
  39 + itemHeight: 0,
  40 + };
  41 + },
  42 + methods: {
  43 + renderModel() {
  44 + if (this.model > 0) {
  45 + this.currentIndex = this.slides.findIndex(slide => slide.id === this.model);
  46 + } else {
  47 + if (this.slides.length > 3) {
  48 + this.currentIndex = 2;
  49 + } else {
  50 + this.currentIndex = 0;
  51 + }
  52 + }
  53 + this.$emit('change', this.slides[this.currentIndex].id);
  54 + this.$nextTick(() => {
  55 + this.itemHeight = document.querySelector('.select-ul .item').clientHeight;
  56 + this.translateY = 0 - this.currentIndex * this.itemHeight;
  57 + this.transform();
  58 + });
  59 + },
  60 + transform() {
  61 + this.selectStyle.transform = `translate(0px, ${this.translateY + this.itemHeight * 2}px)`;
  62 + this.selectStyle.transition = this.transitionStyle;
  63 + },
  64 + itemClass(slide) {
  65 + let cls = {};
  66 + let slideIndex = this.slides.findIndex(s => s === slide);
  67 +
  68 + if (this.currentIndex === slideIndex) {
  69 + cls.current = true;
  70 + } else if (this.currentIndex - slideIndex === 1) {
  71 + cls['current-prev'] = true;
  72 + } else if (this.currentIndex - slideIndex === -1) {
  73 + cls['current-next'] = true;
  74 + } else if (this.currentIndex > slideIndex) {
  75 + cls.prev = true;
  76 + } else {
  77 + cls.next = true;
  78 + }
  79 + return cls;
  80 + },
  81 + panstart() {
  82 + this.originY = 0 - this.currentIndex * this.itemHeight;
  83 + this.transitionStyle = '';
  84 + this.selectStyle['will-change'] = 'transform';
  85 + this.transform();
  86 + },
  87 + panmove(e) {
  88 + this.translateY = e.deltaY / 1.5 + this.originY;
  89 + if (this.translateY > 0) {
  90 + this.currentIndex = 0;
  91 + } else {
  92 + this.currentIndex = Math.abs(Math.round(this.translateY / this.itemHeight));
  93 + if (this.currentIndex >= this.slides.length) {
  94 + this.currentIndex = this.slides.length - 1;
  95 + }
  96 + }
  97 + this.transform();
  98 + },
  99 + panend() {
  100 + this.translateY = 0 - this.currentIndex * this.itemHeight;
  101 + this.transitionStyle = 'transform 0.5s cubic-bezier(0.4, 0, 0.2, 1)';
  102 + delete this.selectStyle['will-change'];
  103 + this.$emit('change', this.slides[this.currentIndex].id);
  104 + this.transform();
  105 + },
  106 + },
  107 + watch: {
  108 + slides(val) {
  109 + this.slides = val;
  110 + this.renderModel();
  111 + }
  112 + },
  113 +};
  114 +</script>
  115 +
  116 +<style>
  117 +$item-height: 68px;
  118 +
  119 +.select-swipe {
  120 + width: 100%;
  121 + height: 340px;
  122 + margin-top: 46px;
  123 + position: relative;
  124 + overflow: hidden;
  125 +
  126 + .select-foucs {
  127 + width: 100%;
  128 + height: $item-height;
  129 + margin-top: calc(2 * $item-height);
  130 + border-top: 1px solid #e0e0e0;
  131 + border-bottom: 1px solid #e0e0e0;
  132 + }
  133 +
  134 + .select-ul {
  135 + position: absolute;
  136 + top: 0;
  137 + left: 0;
  138 + right: 0;
  139 + bottom: 0;
  140 +
  141 + .item {
  142 + width: 100%;
  143 + float: left;
  144 + height: $item-height;
  145 + text-align: center;
  146 +
  147 + p {
  148 + transition: transform 0.1s linear;
  149 + line-height: $item-height;
  150 + font-size: 32px;
  151 + }
  152 +
  153 + &.current p {
  154 + transform: rotateX(0deg);
  155 + color: #000;
  156 + }
  157 +
  158 + &.current-prev p {
  159 + transform: rotateX(10deg) translate(0, -5px);
  160 + color: #b0b0b0;
  161 + }
  162 +
  163 + &.current-next p {
  164 + transform: rotateX(-10deg) translate(0, 5px);
  165 + color: #b0b0b0;
  166 + }
  167 +
  168 + &.prev p {
  169 + transform: rotateX(25deg);
  170 + color: #d9d9d9;
  171 + }
  172 +
  173 + &.next p {
  174 + transform: rotateX(-25deg);
  175 + color: #d9d9d9;
  176 + }
  177 + }
  178 + }
  179 +}
  180 +</style>
  1 +<template>
  2 +<div class="slide-select" :class="{active: active, 'slide-in': slideIn}">
  3 + <div class="shadow" v-touch:tap="hide"></div>
  4 + <div class="select-box">
  5 + <slide-select-header :title="title" @selected="selected"></slide-select-header>
  6 + <slide-select-swipe v-if="active"
  7 + :model="model"
  8 + :slides="currentSlides"
  9 + @change="slideChange"></slide-select-swipe>
  10 + </div>
  11 +</div>
  12 +</template>
  13 +
  14 +<script>
  15 +const slideSelectHeader = require('./slide-select-header.vue');
  16 +const slideSelectSwipe = require('./slide-select-swipe.vue');
  17 +
  18 +module.exports = {
  19 + name: 'slide-select',
  20 + props: {
  21 + slides: {
  22 + type: Array,
  23 + default() {
  24 + return [];
  25 + }
  26 + },
  27 + model: {
  28 + type: Number,
  29 + default: 0
  30 + },
  31 + title: {
  32 + type: String,
  33 + },
  34 + tag: {
  35 + type: String,
  36 + }
  37 + },
  38 + data() {
  39 + return {
  40 + active: false,
  41 + slideIn: false,
  42 + currentSlides: this.slides,
  43 + currentModel: this.model
  44 + };
  45 + },
  46 + methods: {
  47 + show() {
  48 + this.active = true;
  49 + setTimeout(() => {
  50 + this.slideIn = true;
  51 + }, 0);
  52 + this.bodyElStyle = document.querySelector('body').style;
  53 + this.bodyElStyle.position = 'absolute';
  54 + this.bodyElStyle.top = 0;
  55 + this.bodyElStyle.left = 0;
  56 + this.bodyElStyle.right = 0;
  57 + this.bodyElStyle.bottom = 0;
  58 + this.bodyElStyle.overflow = 'hidden';
  59 + this.$emit('show', this.tag);
  60 + },
  61 + hide() {
  62 + this.slideIn = false;
  63 + setTimeout(() => {
  64 + this.active = false;
  65 + }, 200);
  66 + this.bodyElStyle.position = 'static';
  67 + this.bodyElStyle.overflow = 'auto';
  68 + this.$emit('hide', this.tag);
  69 + },
  70 + slideChange(model) {
  71 + this.currentModel = model;
  72 + },
  73 + selected() {
  74 + let currentSlide = this.currentSlides.find(slide => slide.id === this.currentModel);
  75 +
  76 + this.hide();
  77 + this.$emit('selected', {slide: currentSlide, tag: this.tag });
  78 + }
  79 + },
  80 + beforeDestroy() {
  81 + this.bodyElStyle.position = 'static';
  82 + this.bodyElStyle.overflow = 'auto';
  83 + },
  84 + watch: {
  85 + slides(val) {
  86 + this.currentSlides = val;
  87 + },
  88 + model(val) {
  89 + this.model = val;
  90 + }
  91 + },
  92 + components: {
  93 + slideSelectHeader,
  94 + slideSelectSwipe,
  95 + }
  96 +};
  97 +
  98 +</script>
  99 +
  100 +<style>
  101 +$show-speed: 0.2s;
  102 +
  103 +.slide-select {
  104 + position: fixed;
  105 + top: 0;
  106 + left: 0;
  107 + right: 0;
  108 + bottom: 0;
  109 + z-index: 211;
  110 + display: none;
  111 +
  112 + &.active {
  113 + display: block;
  114 + }
  115 +
  116 + &.slide-in {
  117 + .shadow {
  118 + background-color: rgba(0, 0, 0, 0.2);
  119 + }
  120 +
  121 + .select-box {
  122 + transform: translate(0, 0);
  123 + }
  124 + }
  125 +}
  126 +
  127 +.shadow {
  128 + position: absolute;
  129 + top: 0;
  130 + left: 0;
  131 + right: 0;
  132 + bottom: 0;
  133 + z-index: 1;
  134 + background-color: rgba(0, 0, 0, 0);
  135 + transition: background-color $show-speed ease-in-out;
  136 +}
  137 +
  138 +.select-box {
  139 + position: absolute;
  140 + left: 0;
  141 + right: 0;
  142 + bottom: 0;
  143 + height: 511px;
  144 + background-color: #fff;
  145 + z-index: 2;
  146 + transform: translate(0, 100%);
  147 + transition: transform $show-speed ease-in-out;
  148 +}
  149 +
  150 +</style>
1 <template> 1 <template>
  2 +<div>
2 <top-nav v-if="isApp"></top-nav> 3 <top-nav v-if="isApp"></top-nav>
3 <show-box :is-first="true"> 4 <show-box :is-first="true">
4 <image-swiper :goods="entity.goods_list"></image-swiper> 5 <image-swiper :goods="entity.goods_list"></image-swiper>
@@ -23,29 +24,16 @@ @@ -23,29 +24,16 @@
23 </li> 24 </li>
24 </ul> 25 </ul>
25 </div> 26 </div>
26 - <hr>  
27 - <div>  
28 - <ul class="service"> 27 + <div class="service">
  28 + <ul>
29 <li><i class="icon icon-real"></i>100%品牌正品</li> 29 <li><i class="icon icon-real"></i>100%品牌正品</li>
30 <li class="return" v-if="intro.supportRefundExchange === 'N'"> 30 <li class="return" v-if="intro.supportRefundExchange === 'N'">
31 <i class="icon icon-unsupport-seven"></i>不支持7天无理由退换货</li> 31 <i class="icon icon-unsupport-seven"></i>不支持7天无理由退换货</li>
32 - <li class="return" v-else><i class="icon icon-seven"></i>支持7天无理由退换货</li> 32 + <li class="return" v-else><i class="icon icon-seven"></i>7天无理由退换货</li>
33 <li><i class="icon icon-onlineservice"></i>便捷在线客服</li> 33 <li><i class="icon icon-onlineservice"></i>便捷在线客服</li>
34 </ul> 34 </ul>
35 </div> 35 </div>
36 - <hr>  
37 - <div class="add-cart">  
38 - <ul class="cart-detail">  
39 - <li>  
40 - <span class="color">颜色 <i class="icon icon-sort-up color" @click="pickColor"></i></span>  
41 - </li>  
42 - <li>  
43 - <span class="size">尺码 <i class="icon icon-sort-down size"></i></span>  
44 - </li>  
45 - </ul>  
46 - <hr>  
47 - <a class="add-btn">加入购物车</a>  
48 - </div> 36 + <add-to-cart :value="entity" @add-cart="addCart"></add-to-cart>
49 </show-box> 37 </show-box>
50 <show-box :is-last="preferList.length <= 0"> 38 <show-box :is-last="preferList.length <= 0">
51 <div v-if="intro.productDescBo"> 39 <div v-if="intro.productDescBo">
@@ -269,9 +257,7 @@ @@ -269,9 +257,7 @@
269 <div v-if="!isApp"> 257 <div v-if="!isApp">
270 <share-bottom></share-bottom> 258 <share-bottom></share-bottom>
271 </div> 259 </div>
272 -  
273 - <feature-selector :is-visible="showFeatureSelector" :entity="entity"  
274 - :on-add-to-cart="onAddToCart"></feature-selector> 260 +</div>
275 </template> 261 </template>
276 <script> 262 <script>
277 /** 263 /**
@@ -300,36 +286,7 @@ @@ -300,36 +286,7 @@
300 entity: {}, 286 entity: {},
301 showFeatureSelector: false, 287 showFeatureSelector: false,
302 cartCount: 0, 288 cartCount: 0,
303 -  
304 - /**  
305 - * 加入购物车回调  
306 - *  
307 - * @param result  
308 - */  
309 - onAddToCart: (selection, selector)=> {  
310 - $.post('/product/cart.json', {  
311 - productSku: selection.size.value,  
312 - buyNumber: 1  
313 - }).then((result)=> {  
314 - if (yoho.goShopingKey && result.data && result.data.shopping_key) {  
315 - yoho.goShopingKey({shoppingKey: result.data.shopping_key});  
316 - }  
317 -  
318 - // TODO: 库存不足 后台暂未实现  
319 - // TODO: 商品已下架 后台暂未实现  
320 - if (result.code === 200) {  
321 - this.cartCount = result.data.goods_count;  
322 -  
323 - selector.playAnimation();  
324 - } else {  
325 - result.message = '添加购物车失败 >_<';  
326 - }  
327 -  
328 - this.showFeatureSelector = false;  
329 - tip(result.message);  
330 - });  
331 - },  
332 - isApp: yoho.isApp, 289 + isApp: true, // TODO yoho.isApp,
333 isSoldOut: false, 290 isSoldOut: false,
334 isReady: false, 291 isReady: false,
335 preferTitle: 'You Might Also Like', 292 preferTitle: 'You Might Also Like',
@@ -348,6 +305,7 @@ @@ -348,6 +305,7 @@
348 components: { 305 components: {
349 imageSwiper: require('./image-swiper.vue'), 306 imageSwiper: require('./image-swiper.vue'),
350 featureSelector: require('component/product/feature-selector.vue'), 307 featureSelector: require('component/product/feature-selector.vue'),
  308 + addToCart: require('component/product/cart/add-to-cart.vue'),
351 showBox: require('./show-box.vue'), 309 showBox: require('./show-box.vue'),
352 topNav: require('./top-nav.vue'), 310 topNav: require('./top-nav.vue'),
353 shareBottom: require('component/tool/share-bottom.vue'), 311 shareBottom: require('component/tool/share-bottom.vue'),
@@ -356,9 +314,30 @@ @@ -356,9 +314,30 @@
356 operationBar: require('./operation-bar.vue') 314 operationBar: require('./operation-bar.vue')
357 }, 315 },
358 methods: { 316 methods: {
359 - extendSwitch: function (module) { 317 + extendSwitch: function(module) {
360 this.extSwitch[module] = !this.extSwitch[module]; 318 this.extSwitch[module] = !this.extSwitch[module];
361 }, 319 },
  320 + addCart(sku) {
  321 + $.post('/product/cart.json', {
  322 + productSku: sku.sku,
  323 + buyNumber: 1
  324 + }).then((result)=> {
  325 + if (yoho.goShopingKey && result.data && result.data.shopping_key) {
  326 + yoho.goShopingKey({shoppingKey: result.data.shopping_key});
  327 + }
  328 +
  329 + // TODO: 库存不足 后台暂未实现
  330 + // TODO: 商品已下架 后台暂未实现
  331 + if (result.code === 200) {
  332 + this.cartCount = result.data.goods_count;
  333 + } else {
  334 + result.message = '添加购物车失败 >_<';
  335 + }
  336 +
  337 + this.showFeatureSelector = false;
  338 + tip(result.message);
  339 + });
  340 + },
362 341
363 /** 342 /**
364 * 添加到购物车 343 * 添加到购物车
@@ -392,10 +371,6 @@ @@ -392,10 +371,6 @@
392 }); 371 });
393 }, 372 },
394 373
395 - pickColor(){  
396 - this.$refs.picker.show();  
397 - },  
398 -  
399 share() { 374 share() {
400 yoho.goShare({ 375 yoho.goShare({
401 title: this.title || '', 376 title: this.title || '',
@@ -469,7 +444,7 @@ @@ -469,7 +444,7 @@
469 444
470 // 是否支持7天无理由退换货 445 // 是否支持7天无理由退换货
471 $.get(`/product/refundExchange/${data.product_skn}`).then(sd => { 446 $.get(`/product/refundExchange/${data.product_skn}`).then(sd => {
472 - let support = sd.data[data.product_skn] === "N" ? "Y" : "N"; 447 + let support = sd.data[data.product_skn] === 'N' ? 'Y' : 'N';
473 448
474 this.$set('intro.supportRefundExchange', support); 449 this.$set('intro.supportRefundExchange', support);
475 }); 450 });
@@ -536,81 +511,42 @@ @@ -536,81 +511,42 @@
536 } 511 }
537 } 512 }
538 513
539 - ul.service {  
540 - font-size: 0; 514 + .service {
  515 + border-top: 1px solid #eee;
  516 +
  517 + ul {
  518 + font-size: 0;
  519 + height: 108px;
  520 + width: 700px;
  521 + transform-origin: left;
  522 + transform: scale(0.985);
  523 + }
541 524
542 li { 525 li {
543 - font-size: 24px;  
544 - width: 195px;  
545 - line-height: 22px; 526 + font-size: 20px;
  527 + width: 200px;
546 text-align: center; 528 text-align: center;
  529 + line-height: 108px;
  530 + height: 108px;
  531 + overflow: hidden;
547 display: inline-block; 532 display: inline-block;
  533 + color: #b0b0b0;
548 534
549 i.icon { 535 i.icon {
550 margin-right: 6px; 536 margin-right: 6px;
551 } 537 }
552 538
553 - &.return {  
554 - width: 300px;  
555 - border-left: 1px solid #eee;  
556 - border-right: 1px solid #eee; 539 + &:first-child {
  540 + text-align: left;
557 } 541 }
558 - }  
559 - }  
560 -  
561 - .add-cart {  
562 - .cart-detail {  
563 - font-size: 0;  
564 -  
565 - li {  
566 - position: relative;  
567 - display: inline-block;  
568 - width: 50%;  
569 - font-size: 32px;  
570 -  
571 - .icon {  
572 - position: absolute;  
573 - font-size: 40px;  
574 -  
575 - &.color {  
576 - right: 25px;  
577 - }  
578 -  
579 - &.size {  
580 - right: 0;  
581 - }  
582 - }  
583 -  
584 - .icon-sort-up {  
585 - top: 14px;  
586 - }  
587 -  
588 - .icon-sort-down {  
589 - top: -10px;  
590 - }  
591 -  
592 - &:first-child {  
593 - padding-right: 25px;  
594 - border-right: 1px solid #e0e0e0;  
595 - }  
596 -  
597 - &:last-child {  
598 - padding-left: 30px;  
599 - }  
600 542
  543 + &:last-child {
  544 + text-align: right;
601 } 545 }
602 - }  
603 546
604 - .add-btn {  
605 - display: inline-block;  
606 - width: 100%;  
607 - height: 85px;  
608 - color: #fff;  
609 - font-size: 32px;  
610 - text-align: center;  
611 - line-height: 82px;  
612 - background-color: #000;  
613 - border: 1px solid #7a7a7a; 547 + &.return {
  548 + width: 300px;
  549 + }
614 } 550 }
615 } 551 }
616 552
@@ -152,7 +152,7 @@ array-differ@^1.0.0: @@ -152,7 +152,7 @@ array-differ@^1.0.0:
152 version "1.0.0" 152 version "1.0.0"
153 resolved "http://npm.yoho.cn/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031" 153 resolved "http://npm.yoho.cn/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031"
154 154
155 -array-find-index@^1.0.1: 155 +array-find-index@^1.0.1, array-find-index@^1.0.2:
156 version "1.0.2" 156 version "1.0.2"
157 resolved "http://npm.yoho.cn/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" 157 resolved "http://npm.yoho.cn/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1"
158 158
@@ -263,7 +263,7 @@ async@^1.5.2: @@ -263,7 +263,7 @@ async@^1.5.2:
263 version "1.5.2" 263 version "1.5.2"
264 resolved "http://npm.yoho.cn/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" 264 resolved "http://npm.yoho.cn/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
265 265
266 -async@^2.1.2, async@^2.4.1: 266 +async@^2.1.2, async@^2.1.5, async@^2.4.1:
267 version "2.5.0" 267 version "2.5.0"
268 resolved "http://npm.yoho.cn/async/-/async-2.5.0.tgz#843190fd6b7357a0b9e1c956edddd5ec8462b54d" 268 resolved "http://npm.yoho.cn/async/-/async-2.5.0.tgz#843190fd6b7357a0b9e1c956edddd5ec8462b54d"
269 dependencies: 269 dependencies:
@@ -1310,6 +1310,15 @@ clone-buffer@^1.0.0: @@ -1310,6 +1310,15 @@ clone-buffer@^1.0.0:
1310 version "1.0.0" 1310 version "1.0.0"
1311 resolved "http://npm.yoho.cn/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58" 1311 resolved "http://npm.yoho.cn/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58"
1312 1312
  1313 +clone-deep@^0.3.0:
  1314 + version "0.3.0"
  1315 + resolved "http://npm.yoho.cn/clone-deep/-/clone-deep-0.3.0.tgz#348c61ae9cdbe0edfe053d91ff4cc521d790ede8"
  1316 + dependencies:
  1317 + for-own "^1.0.0"
  1318 + is-plain-object "^2.0.1"
  1319 + kind-of "^3.2.2"
  1320 + shallow-clone "^0.1.2"
  1321 +
1313 clone-function@>=1.0.1: 1322 clone-function@>=1.0.1:
1314 version "1.0.6" 1323 version "1.0.6"
1315 resolved "http://npm.yoho.cn/clone-function/-/clone-function-1.0.6.tgz#428471937750bca9c48ecbfbc16f6e232f74a03d" 1324 resolved "http://npm.yoho.cn/clone-function/-/clone-function-1.0.6.tgz#428471937750bca9c48ecbfbc16f6e232f74a03d"
@@ -2806,6 +2815,10 @@ flatten@^1.0.2: @@ -2806,6 +2815,10 @@ flatten@^1.0.2:
2806 version "1.0.2" 2815 version "1.0.2"
2807 resolved "http://npm.yoho.cn/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782" 2816 resolved "http://npm.yoho.cn/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782"
2808 2817
  2818 +for-in@^0.1.3:
  2819 + version "0.1.8"
  2820 + resolved "http://npm.yoho.cn/for-in/-/for-in-0.1.8.tgz#d8773908e31256109952b1fdb9b3fa867d2775e1"
  2821 +
2809 for-in@^1.0.1: 2822 for-in@^1.0.1:
2810 version "1.0.2" 2823 version "1.0.2"
2811 resolved "http://npm.yoho.cn/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" 2824 resolved "http://npm.yoho.cn/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
@@ -2816,6 +2829,12 @@ for-own@^0.1.4: @@ -2816,6 +2829,12 @@ for-own@^0.1.4:
2816 dependencies: 2829 dependencies:
2817 for-in "^1.0.1" 2830 for-in "^1.0.1"
2818 2831
  2832 +for-own@^1.0.0:
  2833 + version "1.0.0"
  2834 + resolved "http://npm.yoho.cn/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b"
  2835 + dependencies:
  2836 + for-in "^1.0.1"
  2837 +
2819 foreach@^2.0.5: 2838 foreach@^2.0.5:
2820 version "2.0.5" 2839 version "2.0.5"
2821 resolved "http://npm.yoho.cn/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" 2840 resolved "http://npm.yoho.cn/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99"
@@ -3686,6 +3705,12 @@ is-plain-obj@^1.0.0: @@ -3686,6 +3705,12 @@ is-plain-obj@^1.0.0:
3686 version "1.1.0" 3705 version "1.1.0"
3687 resolved "http://npm.yoho.cn/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" 3706 resolved "http://npm.yoho.cn/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e"
3688 3707
  3708 +is-plain-object@^2.0.1:
  3709 + version "2.0.4"
  3710 + resolved "http://npm.yoho.cn/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
  3711 + dependencies:
  3712 + isobject "^3.0.1"
  3713 +
3689 is-posix-bracket@^0.1.0: 3714 is-posix-bracket@^0.1.0:
3690 version "0.1.1" 3715 version "0.1.1"
3691 resolved "http://npm.yoho.cn/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" 3716 resolved "http://npm.yoho.cn/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4"
@@ -3758,6 +3783,10 @@ isobject@^2.0.0: @@ -3758,6 +3783,10 @@ isobject@^2.0.0:
3758 dependencies: 3783 dependencies:
3759 isarray "1.0.0" 3784 isarray "1.0.0"
3760 3785
  3786 +isobject@^3.0.1:
  3787 + version "3.0.1"
  3788 + resolved "http://npm.yoho.cn/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
  3789 +
3761 isstream@0.1.x, isstream@~0.1.2: 3790 isstream@0.1.x, isstream@~0.1.2:
3762 version "0.1.2" 3791 version "0.1.2"
3763 resolved "http://npm.yoho.cn/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" 3792 resolved "http://npm.yoho.cn/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
@@ -3894,7 +3923,13 @@ kew@~0.7.0: @@ -3894,7 +3923,13 @@ kew@~0.7.0:
3894 version "0.7.0" 3923 version "0.7.0"
3895 resolved "http://npm.yoho.cn/kew/-/kew-0.7.0.tgz#79d93d2d33363d6fdd2970b335d9141ad591d79b" 3924 resolved "http://npm.yoho.cn/kew/-/kew-0.7.0.tgz#79d93d2d33363d6fdd2970b335d9141ad591d79b"
3896 3925
3897 -kind-of@^3.0.2: 3926 +kind-of@^2.0.1:
  3927 + version "2.0.1"
  3928 + resolved "http://npm.yoho.cn/kind-of/-/kind-of-2.0.1.tgz#018ec7a4ce7e3a86cb9141be519d24c8faa981b5"
  3929 + dependencies:
  3930 + is-buffer "^1.0.2"
  3931 +
  3932 +kind-of@^3.0.2, kind-of@^3.2.2:
3898 version "3.2.2" 3933 version "3.2.2"
3899 resolved "http://npm.yoho.cn/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" 3934 resolved "http://npm.yoho.cn/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
3900 dependencies: 3935 dependencies:
@@ -3928,6 +3963,10 @@ layout@~2.2.0: @@ -3928,6 +3963,10 @@ layout@~2.2.0:
3928 dependencies: 3963 dependencies:
3929 bin-pack "~1.0.1" 3964 bin-pack "~1.0.1"
3930 3965
  3966 +lazy-cache@^0.2.3:
  3967 + version "0.2.7"
  3968 + resolved "http://npm.yoho.cn/lazy-cache/-/lazy-cache-0.2.7.tgz#7feddf2dcb6edb77d11ef1d117ab5ffdf0ab1b65"
  3969 +
3931 lazy-cache@^1.0.3: 3970 lazy-cache@^1.0.3:
3932 version "1.0.4" 3971 version "1.0.4"
3933 resolved "http://npm.yoho.cn/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" 3972 resolved "http://npm.yoho.cn/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e"
@@ -3992,7 +4031,7 @@ loader-utils@1.0.x, loader-utils@^1.0.2: @@ -3992,7 +4031,7 @@ loader-utils@1.0.x, loader-utils@^1.0.2:
3992 emojis-list "^2.0.0" 4031 emojis-list "^2.0.0"
3993 json5 "^0.5.0" 4032 json5 "^0.5.0"
3994 4033
3995 -loader-utils@^1.1.0: 4034 +loader-utils@^1.0.1, loader-utils@^1.1.0:
3996 version "1.1.0" 4035 version "1.1.0"
3997 resolved "http://npm.yoho.cn/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd" 4036 resolved "http://npm.yoho.cn/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd"
3998 dependencies: 4037 dependencies:
@@ -4201,6 +4240,10 @@ lodash.some@^4.2.2: @@ -4201,6 +4240,10 @@ lodash.some@^4.2.2:
4201 version "4.6.0" 4240 version "4.6.0"
4202 resolved "http://npm.yoho.cn/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb68e4d" 4241 resolved "http://npm.yoho.cn/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb68e4d"
4203 4242
  4243 +lodash.tail@^4.1.1:
  4244 + version "4.1.1"
  4245 + resolved "http://npm.yoho.cn/lodash.tail/-/lodash.tail-4.1.1.tgz#d2333a36d9e7717c8ad2f7cacafec7c32b444664"
  4246 +
4204 lodash.template@^3.0.0: 4247 lodash.template@^3.0.0:
4205 version "3.6.2" 4248 version "3.6.2"
4206 resolved "http://npm.yoho.cn/lodash.template/-/lodash.template-3.6.2.tgz#f8cdecc6169a255be9098ae8b0c53d378931d14f" 4249 resolved "http://npm.yoho.cn/lodash.template/-/lodash.template-3.6.2.tgz#f8cdecc6169a255be9098ae8b0c53d378931d14f"
@@ -4443,6 +4486,28 @@ minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0: @@ -4443,6 +4486,28 @@ minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0:
4443 version "1.2.0" 4486 version "1.2.0"
4444 resolved "http://npm.yoho.cn/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" 4487 resolved "http://npm.yoho.cn/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
4445 4488
  4489 +mint-ui@^1.0.2:
  4490 + version "1.0.2"
  4491 + resolved "http://npm.yoho.cn/mint-ui/-/mint-ui-1.0.2.tgz#168318925c59a7da4c3f8ec6d9960e138e55fefc"
  4492 + dependencies:
  4493 + array-find-index "^1.0.2"
  4494 + raf.js "0.0.4"
  4495 + vue-clickoutside "^0.2.0"
  4496 + vue-infinite-scroll "^0.2.3"
  4497 + vue-lazyload "^0.7.1"
  4498 + vue-msgbox "^0.2.14"
  4499 + vue-popup "0.1.13"
  4500 + vue-swipe "^0.2.7"
  4501 + vue-toast-mobile "^0.1.3"
  4502 + wind-dom "0.0.3"
  4503 +
  4504 +mixin-object@^2.0.1:
  4505 + version "2.0.1"
  4506 + resolved "http://npm.yoho.cn/mixin-object/-/mixin-object-2.0.1.tgz#4fb949441dab182540f1fe035ba60e1947a5e57e"
  4507 + dependencies:
  4508 + for-in "^0.1.3"
  4509 + is-extendable "^0.1.1"
  4510 +
4446 mkdirp@0.5.0: 4511 mkdirp@0.5.0:
4447 version "0.5.0" 4512 version "0.5.0"
4448 resolved "http://npm.yoho.cn/mkdirp/-/mkdirp-0.5.0.tgz#1d73076a6df986cd9344e15e71fcc05a4c9abf12" 4513 resolved "http://npm.yoho.cn/mkdirp/-/mkdirp-0.5.0.tgz#1d73076a6df986cd9344e15e71fcc05a4c9abf12"
@@ -6469,6 +6534,16 @@ sass-graph@^2.1.1: @@ -6469,6 +6534,16 @@ sass-graph@^2.1.1:
6469 scss-tokenizer "^0.2.3" 6534 scss-tokenizer "^0.2.3"
6470 yargs "^7.0.0" 6535 yargs "^7.0.0"
6471 6536
  6537 +sass-loader@^6.0.6:
  6538 + version "6.0.6"
  6539 + resolved "http://npm.yoho.cn/sass-loader/-/sass-loader-6.0.6.tgz#e9d5e6c1f155faa32a4b26d7a9b7107c225e40f9"
  6540 + dependencies:
  6541 + async "^2.1.5"
  6542 + clone-deep "^0.3.0"
  6543 + loader-utils "^1.0.1"
  6544 + lodash.tail "^4.1.1"
  6545 + pify "^3.0.0"
  6546 +
6472 save-pixels@~2.3.0: 6547 save-pixels@~2.3.0:
6473 version "2.3.4" 6548 version "2.3.4"
6474 resolved "http://npm.yoho.cn/save-pixels/-/save-pixels-2.3.4.tgz#49d349c06b8d7c0127dbf0da24b44aca5afb59fe" 6549 resolved "http://npm.yoho.cn/save-pixels/-/save-pixels-2.3.4.tgz#49d349c06b8d7c0127dbf0da24b44aca5afb59fe"
@@ -6616,6 +6691,15 @@ sha.js@^2.4.0, sha.js@^2.4.8: @@ -6616,6 +6691,15 @@ sha.js@^2.4.0, sha.js@^2.4.8:
6616 dependencies: 6691 dependencies:
6617 inherits "^2.0.1" 6692 inherits "^2.0.1"
6618 6693
  6694 +shallow-clone@^0.1.2:
  6695 + version "0.1.2"
  6696 + resolved "http://npm.yoho.cn/shallow-clone/-/shallow-clone-0.1.2.tgz#5909e874ba77106d73ac414cfec1ffca87d97060"
  6697 + dependencies:
  6698 + is-extendable "^0.1.1"
  6699 + kind-of "^2.0.1"
  6700 + lazy-cache "^0.2.3"
  6701 + mixin-object "^2.0.1"
  6702 +
6619 shallow-copy@~0.0.1: 6703 shallow-copy@~0.0.1:
6620 version "0.0.1" 6704 version "0.0.1"
6621 resolved "http://npm.yoho.cn/shallow-copy/-/shallow-copy-0.0.1.tgz#415f42702d73d810330292cc5ee86eae1a11a170" 6705 resolved "http://npm.yoho.cn/shallow-copy/-/shallow-copy-0.0.1.tgz#415f42702d73d810330292cc5ee86eae1a11a170"
@@ -7163,6 +7247,10 @@ swap-case@^1.1.0: @@ -7163,6 +7247,10 @@ swap-case@^1.1.0:
7163 lower-case "^1.1.1" 7247 lower-case "^1.1.1"
7164 upper-case "^1.1.1" 7248 upper-case "^1.1.1"
7165 7249
  7250 +swiper@^3.4.2:
  7251 + version "3.4.2"
  7252 + resolved "http://npm.yoho.cn/swiper/-/swiper-3.4.2.tgz#39d6b410b1a39833e1f72d3b72999df5f5e38392"
  7253 +
7166 synesthesia@^1.0.1: 7254 synesthesia@^1.0.1:
7167 version "1.0.1" 7255 version "1.0.1"
7168 resolved "http://npm.yoho.cn/synesthesia/-/synesthesia-1.0.1.tgz#5ef95ea548c0d5c6e6f9bb4b0d0731dff864a777" 7256 resolved "http://npm.yoho.cn/synesthesia/-/synesthesia-1.0.1.tgz#5ef95ea548c0d5c6e6f9bb4b0d0731dff864a777"
@@ -7562,6 +7650,16 @@ vm-browserify@0.0.4: @@ -7562,6 +7650,16 @@ vm-browserify@0.0.4:
7562 dependencies: 7650 dependencies:
7563 indexof "0.0.1" 7651 indexof "0.0.1"
7564 7652
  7653 +vue-awesome-swiper@^2.5.4:
  7654 + version "2.5.4"
  7655 + resolved "http://npm.yoho.cn/vue-awesome-swiper/-/vue-awesome-swiper-2.5.4.tgz#265a2a3ec2f9830d6b0175ea06784c36a261c54a"
  7656 + dependencies:
  7657 + swiper "^3.4.2"
  7658 +
  7659 +vue-clickoutside@^0.2.0:
  7660 + version "0.2.0"
  7661 + resolved "http://npm.yoho.cn/vue-clickoutside/-/vue-clickoutside-0.2.0.tgz#a0f16840dd4f29f019bd09d07247c99a581e48e3"
  7662 +
7565 vue-hot-reload-api@^1.2.0: 7663 vue-hot-reload-api@^1.2.0:
7566 version "1.3.3" 7664 version "1.3.3"
7567 resolved "http://npm.yoho.cn/vue-hot-reload-api/-/vue-hot-reload-api-1.3.3.tgz#54d22d83786a878493f639cc76bca7992a23be46" 7665 resolved "http://npm.yoho.cn/vue-hot-reload-api/-/vue-hot-reload-api-1.3.3.tgz#54d22d83786a878493f639cc76bca7992a23be46"
@@ -7576,11 +7674,11 @@ vue-html-loader@^1.0.0: @@ -7576,11 +7674,11 @@ vue-html-loader@^1.0.0:
7576 loader-utils "^1.0.2" 7674 loader-utils "^1.0.2"
7577 object-assign "^4.1.0" 7675 object-assign "^4.1.0"
7578 7676
7579 -vue-infinite-scroll@0.2.3: 7677 +vue-infinite-scroll@0.2.3, vue-infinite-scroll@^0.2.3:
7580 version "0.2.3" 7678 version "0.2.3"
7581 resolved "http://npm.yoho.cn/vue-infinite-scroll/-/vue-infinite-scroll-0.2.3.tgz#9eb9fa1972e363e69a572edb66a7a06f5ff8dc42" 7679 resolved "http://npm.yoho.cn/vue-infinite-scroll/-/vue-infinite-scroll-0.2.3.tgz#9eb9fa1972e363e69a572edb66a7a06f5ff8dc42"
7582 7680
7583 -vue-lazyload@^0.7.0: 7681 +vue-lazyload@^0.7.0, vue-lazyload@^0.7.1:
7584 version "0.7.5" 7682 version "0.7.5"
7585 resolved "http://npm.yoho.cn/vue-lazyload/-/vue-lazyload-0.7.5.tgz#585787eeaf256e764620ad47d2a3eac4301d2da3" 7683 resolved "http://npm.yoho.cn/vue-lazyload/-/vue-lazyload-0.7.5.tgz#585787eeaf256e764620ad47d2a3eac4301d2da3"
7586 dependencies: 7684 dependencies:
@@ -7603,12 +7701,22 @@ vue-loader@^8.3.0: @@ -7603,12 +7701,22 @@ vue-loader@^8.3.0:
7603 source-map "^0.5.3" 7701 source-map "^0.5.3"
7604 vue-template-validator "^1.0.0" 7702 vue-template-validator "^1.0.0"
7605 7703
  7704 +vue-msgbox@^0.2.14:
  7705 + version "0.2.14"
  7706 + resolved "http://npm.yoho.cn/vue-msgbox/-/vue-msgbox-0.2.14.tgz#daf027faf2eeca798de3248e85ae802c87c38540"
  7707 + dependencies:
  7708 + vue-popup "^0.1.13"
  7709 +
7606 vue-picker@0.0.4: 7710 vue-picker@0.0.4:
7607 version "0.0.4" 7711 version "0.0.4"
7608 resolved "http://npm.yoho.cn/vue-picker/-/vue-picker-0.0.4.tgz#cd4c4b824cdb3bd9060964b73391b9eb4f7eaa2e" 7712 resolved "http://npm.yoho.cn/vue-picker/-/vue-picker-0.0.4.tgz#cd4c4b824cdb3bd9060964b73391b9eb4f7eaa2e"
7609 dependencies: 7713 dependencies:
7610 raf.js "0.0.4" 7714 raf.js "0.0.4"
7611 7715
  7716 +vue-popup@0.1.13, vue-popup@^0.1.13:
  7717 + version "0.1.13"
  7718 + resolved "http://npm.yoho.cn/vue-popup/-/vue-popup-0.1.13.tgz#fc03251ec17751b520c79c41ad4c69f8889833db"
  7719 +
7612 vue-style-loader@^1.0.0: 7720 vue-style-loader@^1.0.0:
7613 version "1.0.0" 7721 version "1.0.0"
7614 resolved "http://npm.yoho.cn/vue-style-loader/-/vue-style-loader-1.0.0.tgz#abeb7bd0f46313083741244d3079d4f14449e049" 7722 resolved "http://npm.yoho.cn/vue-style-loader/-/vue-style-loader-1.0.0.tgz#abeb7bd0f46313083741244d3079d4f14449e049"
@@ -7621,6 +7729,12 @@ vue-swipe@0.2.6: @@ -7621,6 +7729,12 @@ vue-swipe@0.2.6:
7621 dependencies: 7729 dependencies:
7622 wind-dom "0.0.3" 7730 wind-dom "0.0.3"
7623 7731
  7732 +vue-swipe@^0.2.7:
  7733 + version "0.2.7"
  7734 + resolved "http://npm.yoho.cn/vue-swipe/-/vue-swipe-0.2.7.tgz#4c23ee982953a2c7e96dace55b1fafde518ab719"
  7735 + dependencies:
  7736 + wind-dom "0.0.3"
  7737 +
7624 vue-template-compiler@^2.3.3: 7738 vue-template-compiler@^2.3.3:
7625 version "2.4.1" 7739 version "2.4.1"
7626 resolved "http://npm.yoho.cn/vue-template-compiler/-/vue-template-compiler-2.4.1.tgz#20115cf8714f222f9be4111ec75b079a1c9b8197" 7740 resolved "http://npm.yoho.cn/vue-template-compiler/-/vue-template-compiler-2.4.1.tgz#20115cf8714f222f9be4111ec75b079a1c9b8197"
@@ -7634,6 +7748,10 @@ vue-template-validator@^1.0.0: @@ -7634,6 +7748,10 @@ vue-template-validator@^1.0.0:
7634 dependencies: 7748 dependencies:
7635 chalk "^1.1.1" 7749 chalk "^1.1.1"
7636 7750
  7751 +vue-toast-mobile@^0.1.3:
  7752 + version "0.1.3"
  7753 + resolved "http://npm.yoho.cn/vue-toast-mobile/-/vue-toast-mobile-0.1.3.tgz#ab683c3ac5af69da8f399b048f692a0f78b03a6f"
  7754 +
7637 vue-touch@1.1.0: 7755 vue-touch@1.1.0:
7638 version "1.1.0" 7756 version "1.1.0"
7639 resolved "http://npm.yoho.cn/vue-touch/-/vue-touch-1.1.0.tgz#f69da3b4bf033f3f7bcf5864011a6b4d4bb596b9" 7757 resolved "http://npm.yoho.cn/vue-touch/-/vue-touch-1.1.0.tgz#f69da3b4bf033f3f7bcf5864011a6b4d4bb596b9"