Browse Source

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

Conflicts:
	components/brandCenter/RecommendBrand.vue
gaoxm 7 years ago
parent
commit
3193f58218

+ 1 - 1
components/default/Header.vue

@@ -116,7 +116,7 @@
       onRegisterClick () {
         this.$http.get('/register/page').then(response => {
           if (response.data) {
-            window.location.href = response.data.content
+            window.location.href = response.data.content + '&baseUrl=' + encodeURIComponent(window.location.protocol + '//' + window.location.host + '/newLogin/other')
           }
         })
       },

+ 24 - 20
components/home/Carousel.vue

@@ -23,13 +23,33 @@
   </div>
 </template>
 <script>
+  import { carousel } from '~utils/mixin'
   export default {
     name: 'carousel',
+    mixins: [carousel],
     data () {
-      let _this = this
       return {
-        activeSlide: 0,
-        swiperOption: {
+        activeSlide: 0
+      }
+    },
+    computed: {
+      banners () {
+        if (this.$store.state.carousel.banners) {
+          let banner = this.$store.state.carousel.banners.data.slice()
+           banner.sort(function (a, b) {
+             return a.orderNumber - b.orderNumber
+           })
+          return banner
+        } else {
+          return ''
+        }
+      },
+      activeColor () {
+        return this.banners.length ? this.banners[this.activeSlide].metadata['background-color'] : null
+      },
+      swiperOption () {
+        let _this = this
+        return {
           autoplay: 6000,
           initialSlide: 0,
           pagination: '.swiper-pagination',
@@ -37,7 +57,7 @@
           autoplayDisableOnInteraction: false,
           paginationClickable: true,
           mousewheelControl: false,
-          effect: 'fade',
+          effect: _this.effect,
           lazyLoading: true,
           loop: true,
           prevButton: '.swiper-button-prev',
@@ -58,22 +78,6 @@
           }
         }
       }
-    },
-    computed: {
-      banners () {
-        if (this.$store.state.carousel.banners) {
-          let banner = this.$store.state.carousel.banners.data.slice()
-           banner.sort(function (a, b) {
-             return a.orderNumber - b.orderNumber
-           })
-          return banner
-        } else {
-          return ''
-        }
-      },
-      activeColor () {
-        return this.banners.length ? this.banners[this.activeSlide].metadata['background-color'] : null
-      }
     }
   }
 </script>

+ 20 - 10
components/home/floor/FloorBar.vue

@@ -28,15 +28,25 @@
     },
     methods: {
       _calcaulateHeight() {
-        let _heis0 = document.querySelectorAll('header')[0].clientHeight
-        let _heis1 = document.querySelectorAll('.header.clearfix')[0].clientHeight
-        let _heis2 = document.querySelectorAll('.nav-list')[0].clientHeight
-        let _heis3 = document.querySelectorAll('.carousel')[0].clientHeight
-        let _heis4 = document.querySelectorAll('.advert-slide')[0].clientHeight
-        let _heis5 = document.querySelectorAll('.banner')[0].clientHeight
-        let _heis6 = document.querySelectorAll('.floor.price-floor')[0].clientHeight
-        let _heis7 = document.querySelectorAll('.floor.price-floor')[1].clientHeight
-        this.bannerHeight = _heis0 + _heis1 + _heis2 + _heis3 + _heis4 + _heis5 + _heis6 + _heis7
+        let nullObj = {clientHeight: 0}
+        let obj0 = document.querySelectorAll('header')[0] || nullObj
+        let obj1 = document.querySelectorAll('.header.clearfix')[0] || nullObj
+        let obj2 = document.querySelectorAll('.nav-list')[0] || nullObj
+        let obj3 = document.querySelectorAll('.carousel')[0] || nullObj
+        // let obj4 = document.querySelectorAll('.advert-slide')[0] || nullObj
+        let obj5 = document.querySelectorAll('.banner')[0] || nullObj
+        let obj6 = document.querySelectorAll('.floor.price-floor')[0] || nullObj
+        let obj7 = document.querySelectorAll('.floor.price-floor')[1] || nullObj
+        let _heis0 = obj0.clientHeight
+        let _heis1 = obj1.clientHeight
+        let _heis2 = obj2.clientHeight
+        let _heis3 = obj3.clientHeight
+        // let _heis4 = obj4.clientHeight
+        let _heis5 = obj5.clientHeight
+        let _heis6 = obj6.clientHeight
+        let _heis7 = obj7.clientHeight
+        // this.bannerHeight = _heis0 + _heis1 + _heis2 + _heis3 + _heis4 + _heis5 + _heis6 + _heis7
+        this.bannerHeight = _heis0 + _heis1 + _heis2 + _heis3 + _heis5 + _heis6 + _heis7
         this.listHeight = []
         this.list = document.querySelectorAll('.normal-floor')
         let height = 0
@@ -101,7 +111,7 @@
       }
     },
     mounted: function () {
-      this.$nextTick(function () {
+      this.$nextTick(() => {
         this._calcaulateHeight()
         window.addEventListener('scroll', this.onScroll)
       })

+ 36 - 2
components/mobile/center/Seek.vue

@@ -10,6 +10,10 @@
         <span class="mobile-switch-btn" :class="{'active': activeType=='all'}" @click="switchActiveType('all')">公司商机</span>
         <span class="mobile-switch-btn" :class="{'active': activeType=='self'}" @click="switchActiveType('self')">我的商机</span>
       </div>
+      <div class="product-switch-item" v-if="userType == 'buyer'">
+        <span :class="overdue==='attention'?'mobile-switch-btn active':'mobile-switch-btn'" @click="ChangeTab('attention')">未截止</span>
+        <span :class="overdue==='isattention'?'mobile-switch-btn active':'mobile-switch-btn'" @click="ChangeTab('isattention')">已截止</span>
+      </div>
       <div class="search-content">
         <input type="text" v-model="seekKeyword" :placeholder="userType == 'buyer' ? '品牌/型号' : '品牌/类目/型号/规格/公司'" @keyup.13="onSearch">
         <span @click="onSearch"><i class="iconfont icon-sousuo"></i></span>
@@ -34,7 +38,8 @@
         isChange: false,
         isSearch: false,
         remindKeyword: '',
-        activeType: 'all'
+        activeType: 'all',
+        overdue: 'attention'
       }
     },
     props: ['userType'],
@@ -100,6 +105,13 @@
       })
     },
     methods: {
+      ChangeTab(a) {
+        this.overdue = a
+        this.page = 1
+        this.remindKeyword = this.seekKeyword = ''
+        this.isChange = true
+        this.reloadData()
+      },
       onSearch: function () {
         this.isSearch = true
         this.remindKeyword = this.seekKeyword
@@ -108,7 +120,8 @@
         this.reloadData()
       },
       reloadData: function () {
-        this.$emit('reloadAction', this.page, this.count, this.seekKeyword, this.seekType, this.activeType)
+        let overdue = this.overdue === 'attention' ? '0' : '1'
+        this.$emit('reloadAction', this.page, this.count, this.seekKeyword, this.seekType, this.activeType, overdue)
       },
       onPullUpAction: function () {
         this.page++
@@ -147,6 +160,27 @@
     }
   }
   $seekTitleLine: .72rem;
+  .product-switch-item {
+    text-align: center;
+    background: #fff;
+    border-bottom: 1px solid #d8d8d8;
+    box-shadow: 0 1px 3px #ddd;
+    .mobile-switch-btn {
+      color: #333;
+      display: inline-block;
+      height: .72rem;
+      line-height: .72rem;
+      font-size: .28rem;
+      width: 1.4rem;
+      &:first-child {
+        margin-right: 1.78rem;
+      }
+      &.active {
+        color: #3f84f6;
+        border-bottom: .04rem solid #3f84f6;
+      }
+    }
+  }
   .seek-title {
     height: $seekTitleLine;
     line-height: $seekTitleLine;

+ 18 - 3
components/mobile/user/Info.vue

@@ -15,11 +15,11 @@
         <span><i class="iconfont icon-yonghuming"></i>用户名:</span>
         <span class="describe">{{info.userName}}</span>
       </div>
-      <div class="line">
+      <div class="line" @click="jumpSet('email')">
         <span><i class="iconfont icon-youxiang"></i>邮箱:</span>
         <span class="describe">{{info.userEmail}}</span>
       </div>
-      <div class="line">
+      <div class="line" @click="jumpSet('mobile')">
         <span><i class="iconfont icon-shouji"></i>手机:</span>
         <span class="describe">{{info.userTel}}</span>
       </div>
@@ -39,6 +39,14 @@
         imageUploadUrl: ''
       }
     },
+    computed: {
+      getEmail () {
+        return this.$store.state.user.updateUser.email.data.content
+      },
+      getMobile () {
+        return this.$store.state.user.updateUser.mobile.data.content
+      }
+    },
     methods: {
       uploadImg (e) {
         let file = e.target.files[0]
@@ -62,6 +70,13 @@
               }
             })
         }
+      },
+      jumpSet (info) {
+        if (info === 'email') {
+          window.open(this.getEmail, '_blank')
+        } else if (info === 'mobile') {
+          window.open(this.getMobile, '_blank')
+        }
       }
     }
   }
@@ -121,7 +136,7 @@
         img{
           width: .58rem;
           height: .58rem;
-          border: 1px solid #bebebe;
+          /*border: 1px solid #bebebe;*/
         }
       }
     }

+ 19 - 15
components/provider/Carousel.vue

@@ -15,28 +15,16 @@
   </div>
 </template>
 <script>
+  import { carousel } from '~utils/mixin'
   export default {
     name: 'carousel',
     data () {
       return {
-        activeSlide: 0,
-        swiperOption: {
-          autoplay: 5000,
-          initialSlide: 0,
-          loop: true,
-          effect: 'fade',
-          lazyLoading: true,
-          // 解决点击分页器后图片就不能轮播的问题
-          autoplayDisableOnInteraction: false,
-          pagination: '.swiper-pagination',
-          paginationClickable: true,
-          paginationElement: 'li',
-          prevButton: '.swiper-button-prev',
-          nextButton: '.swiper-button-next'
-        }
+        activeSlide: 0
     //    banners: {}
       }
     },
+    mixins: [carousel],
 //    mounted () {
 //      this.$http.get('/api/carousel/home%20page%20banner')
 //      .then(response => {
@@ -58,6 +46,22 @@
         } else {
           return ''
         }
+      },
+      swiperOption () {
+        return {
+          autoplay: 5000,
+          initialSlide: 0,
+          loop: true,
+          effect: this.effect,
+          lazyLoading: true,
+          // 解决点击分页器后图片就不能轮播的问题
+          autoplayDisableOnInteraction: false,
+          pagination: '.swiper-pagination',
+          paginationClickable: true,
+          paginationElement: 'li',
+          prevButton: '.swiper-button-prev',
+          nextButton: '.swiper-button-next'
+        }
       }
     }
   }

+ 3 - 1
nuxt.config.js

@@ -188,6 +188,8 @@ module.exports = {
     '/wx/**': baseUrl,
     '/messages**': messageUrl,
     '/messages/**': messageUrl,
-    '/cmsApi**': cmsUrl
+    '/cmsApi**': cmsUrl,
+    '/mEmail/**': baseUrl,
+    '/mPhone/**': baseUrl
   }
 }

+ 3 - 3
pages/index.vue

@@ -10,7 +10,7 @@
         <kind-category @loadchild="loadProductKinds"></kind-category>
         <display-card></display-card>
       </carousel>
-      <advert></advert>
+      <!--<advert></advert>-->
       <floor-list></floor-list>
       <img class="banner-img" src="/images/all/banner-home2.jpg" style="margin: 44px auto 24px;" alt="">
       <news></news>
@@ -19,7 +19,7 @@
   </div>
 </template>
 <script>
-  import { KindCategory, displayCard, Carousel, Advert, FloorList, Partner, News } from '~components/home'
+  import { KindCategory, displayCard, Carousel, FloorList, Partner, News } from '~components/home'
 //  import { Christmas, NewYear } from '~components/default'
   import { Home } from '~components/mobile'
   export default {
@@ -65,7 +65,7 @@
       KindCategory,
       displayCard,
       Carousel,
-      Advert,
+      // Advert,
       FloorList,
       Partner,
       News,

+ 6 - 2
pages/mobile/center/user/collect/store.vue

@@ -14,9 +14,13 @@
             <img :src="item.storeInfo.logoUrl || '/images/component/default.png'">
           </div>
           <div class="list-item-phone">
-            <p>电话:<span>{{item.storeInfo.enterprise.enTel || '-'}}</span></p>
+            <!--电话:<a :href="'tel:' + item.enterprise.enTel" >{{item.enterprise.enTel}}</a>-->
+            <p @click.stop="" v-if="item.storeInfo.enterprise.enTel">电话:<a :href="'tel:' + item.storeInfo.enterprise.enTel" >{{item.storeInfo.enterprise.enTel}}</a></p>
+            <p v-else>电话:<span>{{item.storeInfo.enterprise.enTel || '-'}}</span></p>
+            <p @click.stop="" v-if="item.storeInfo.enterprise.enPhone">手机:<a :href="'tel:' + item.storeInfo.enterprise.enPhone" >{{item.storeInfo.enterprise.enPhone}}</a></p>
+            <p v-else>手机:<span>{{item.storeInfo.enterprise.enPhone || '-'}}</span></p>
             <p>传真:<span>{{item.storeInfo.enterprise.enFax || '-'}}</span></p>
-            <p>联系商家:<a @click="selectStoreInfo(item, $event)">点击查看</a></p>
+            <!--<p>联系商家:<a @click="selectStoreInfo(item, $event)">点击查看</a></p>-->
             <i class="iconfont icon-shoucang" @click="cancelFocus(item, $event)"></i>
           </div>
         </div>

+ 5 - 3
pages/mobile/center/user/seek.vue

@@ -10,7 +10,8 @@
       let user = store.state.option.user.data
       let params = {
         pageNumber: 1,
-        pageSize: 10
+        pageSize: 10,
+        overdue: '0'
       }
       if (user.enterprise.uu) {
         params.enUU = user.enterprise.uu
@@ -38,11 +39,12 @@
       }
     },
     methods: {
-      reloadData: function (page = 1, count = 10, keyword) {
+      reloadData: function (page = 1, count = 10, keyword, ...otherParamas) {
         let params = {
           pageNumber: page,
           pageSize: count,
-          keyword: keyword
+          keyword: keyword,
+          overdue: otherParamas[2]
         }
         if (this.user.data.enterprise.uu) {
           params.enUU = this.user.data.enterprise.uu

+ 2 - 1
pages/mobile/center/vendor/attentionBus.vue

@@ -26,7 +26,7 @@
           </li>
         </ul>
       </div>
-      <div class="none-state" v-if="isSearchSearchingMore && attentionList.length === 0">
+      <div class="none-state" v-if="!isSearchSearchingMore && attentionList.length === 0">
         <img src="/images/mobile/@2x/search-empty.png">
         <p>暂无数据</p>
         <nuxt-link to="/">返回首页</nuxt-link>
@@ -89,6 +89,7 @@
           this.activeType = a
           this.attentionList = []
           this.page = 1
+          this.keyword = ''
           this.getAttentionListArray(this.page)
         },
         searchSeek() {

+ 5 - 5
pages/mobile/center/vendor/index.vue

@@ -43,18 +43,18 @@
           </nuxt-link>
         </ul>
       </div>
-      <div class="block-wrap collect-block">
-        <div class="content-line" @click="goStore">
+      <!--<div class="block-wrap collect-block">
+       <div class="content-line" @click="goStore">
           <img src="/images/mobile/center/vendor/shop.png" alt="">
           <span>我的店铺</span>
           <i class="iconfont icon-xiangyou"></i>
         </div>
-       <!-- <nuxt-link tag="div" to="/mobile/center/vendor/message"  class="content-line" v-if="user.data.enterprise.uu">
+        <nuxt-link tag="div" to="/mobile/center/vendor/message"  class="content-line" v-if="user.data.enterprise.uu">
           <img src="/images/mobile/center/user/message.png" alt="">
           <span>消息<span class="text">({{messageCount.count || 0}})</span></span>
           <i class="iconfont icon-xiangyou"></i>
-        </nuxt-link>-->
-      </div>
+        </nuxt-link>
+      </div>-->
     </div>
     <remind-box :title="remindText" :timeoutCount="timeoutCount"></remind-box>
   </div>

+ 5 - 4
pages/mobile/center/vendor/productdetails.vue

@@ -30,10 +30,11 @@
       <div class="list clearfix">
         <div class="pull-left">
           <span class="name">规格:</span>
-          <div class="specInput input">
-            <input type="text" placeholder="请输入规格" v-model="chooseItem.spec" maxlength="50" />
-            <img src="/images/mobile/product/close_icon.png" @click="deleteText('spec')"/>
-          </div>
+          <span>{{chooseItem.spec}}</span>
+          <!--<div class="specInput input">-->
+            <!--<input type="text" placeholder="请输入规格" v-model="chooseItem.spec" maxlength="50" />-->
+            <!--<img src="/images/mobile/product/close_icon.png" @click="deleteText('spec')"/>-->
+          <!--</div>-->
         </div>
         <div class="pull-right">
           <span class="name">库存:</span>

+ 3 - 2
pages/mobile/product/_batchCode.vue

@@ -91,8 +91,8 @@
             <p>联系卖家</p>
           </li>
           <li class="text-ellipse inline-block price-level" @click="goAttach(component.attach)">
-            <i class="iconfont icon-pdf" :class="{'active': component.attach !== '' && component.attach !== '1'}" ></i>
-            <p class="lastOne" :class="{'active': component.attach !== '' && component.attach !== '1'}">数据手册</p>
+            <i class="iconfont icon-pdf" :class="{'active': component.attach && component.attach !== '' && component.attach !== '1'}" ></i>
+            <p class="lastOne" :class="{'active': component.attach && component.attach !== '' && component.attach !== '1'}">数据手册</p>
           </li>
         </ul>
       </div>
@@ -192,6 +192,7 @@
       },
       goAttach: function (url) {
         if (this.user.logged) {
+          console.log(this.component)
           if (url && url !== '1') {
              // console.log(url)
             window.open(url)

+ 4 - 2
pages/mobile/search/_keycode.vue

@@ -199,11 +199,13 @@
 //            this.collectResult = '卖家上传的产品暂无参数,请联系卖家了解具体详情。'
 //            this.timeoutCount++
 //          }
+          console.log(item)
           if (item.batchCode) {
             this.$router.push('/mobile/product/' + item.batchCode)
           } else {
-            this.collectResult = '产品参数错误'
-            this.timeoutCount ++
+            this.$router.push('/mobile/brand/componentDetail/' + item.uuid)
+            // this.collectResult = '暂无参数信息'
+            // this.timeoutCount ++
           }
         } else {
           this.isClickCollect = false

+ 6 - 0
pages/mobile/user/info/personal.vue

@@ -7,6 +7,12 @@
     layout: 'mobile',
     components: {
       Info
+    },
+    mounted () {
+      this.$nextTick(() => {
+        this.$store.dispatch('user/updateUserEmail', { params: {returnUrl: window.location.href} })
+        this.$store.dispatch('user/updateUserMobile', { params: {returnUrl: window.location.href} })
+      })
     }
   }
 </script>

+ 74 - 5
pages/mobile/user/storeinfo.vue

@@ -13,6 +13,22 @@
           <div class="scroll">
             <div class="si-wrap">
               <ul class="infoul" :class="{'no-edit': !isAdmin}">
+                <li class="clearfix" :class="{border:  storeState !== 'look'}">
+                  <div class="name pull-left" :class="{update: storeState !== 'look'}">店铺LOGO:</div>
+                  <div class="file_logo pull-left">
+                    <div class="file_img">
+                      <img :src="imageUploadUrl ? imageUploadUrl : storeInfo.logoUrl ? storeInfo.logoUrl : '/images/logo/default.png'">
+                    </div>
+                    <div class="file_input" v-if="storeState !== 'look'">
+                      <input type="file"
+                             class="file-input"
+                             name="name"
+                             accept="image/jpeg,image/jpg,image/gif,image/bmp,image/png"
+                             @change="uploadImg"/>
+                      <span>仅支持JPG、PNG、GIF格式,大小不超过500kb,建议使用220*220的图片</span>
+                    </div>
+                  </div>
+                </li>
                 <li class="clearfix" :class="{border:  storeState !== 'look'}">
                   <div class="name pull-left" :class="{update: storeState !== 'look'}">店铺名称:</div>
                   <div class="text pull-left" v-if="storeState === 'look'">
@@ -145,13 +161,14 @@
   export default {
     layout: 'mobileNoHeader',
     middleware: 'authenticated',
-    fetch ({ store, route }) {
+    fetch ({ store }) {
       return Promise.all([
         store.dispatch('loadStoreStatus', { op: 'check' })
       ])
     },
     data() {
       return {
+        imageUploadUrl: '',
         storeState: 'look',
         storeInfo: {},
         splitText: '', // 省略号文本
@@ -188,6 +205,27 @@
 //      }
     },
     methods: {
+      uploadImg (e) {
+        let file = e.target.files[0]
+        if (file && file.size >= 500 * 1025) {
+          this.collectResult = '选择图片过大,请重新选择!'
+          this.timeoutCount++
+          return
+        }
+        if (file) {
+          let param = new FormData()
+          param.append('image', file, file.name)
+          let config = {
+            headers: {'Content-Type': 'multipart/form-data'}
+          }
+          this.$http.post('/api/images', param, config)
+            .then(response => {
+              if (response.data) {
+                this.imageUploadUrl = response.data[0].path
+              }
+            })
+        }
+      },
       setRemindText (str) {
         this.collectResult = str
         this.timeoutCount++
@@ -315,7 +353,8 @@
           enterprise: this.storeInfo.enterprise,
           storeName: this.storeInfo.storeName,
           storeShortName: this.storeInfo.storeShortName,
-          storeApplication: this.storeInfo.storeApplication
+          storeApplication: this.storeInfo.storeApplication,
+          logoUrl: this.imageUploadUrl
         }
         this.$http.put(`/store-service/stores/${this.storeInfo.uuid}?kind=BASIC_INFO`, kay).then(res => {
           this.collectResult = '保存成功'
@@ -449,6 +488,36 @@
     color: #666;
     font-size: 0.28rem;
     padding: 0 .24rem;
+    .file_logo{
+      position:relative;
+      width:4.4rem;
+      .file_img{
+        width:1rem;
+        display:inline-block;
+        img{
+          width:100%;
+          height: 1rem;
+        }
+      }
+      .file_input{
+        position:absolute;
+        top:0;
+        left:0;
+        display:inline-block;
+        vertical-align: top;
+        width:4.4rem;
+        input[type=file] {
+          opacity: 0;
+          width: 1rem;
+          height: 1rem;
+          float: left;
+          margin-right:.15rem;
+        }
+        span{
+          font-size: .14rem;
+        }
+      }
+    }
     .upload {
       img {
         transform: rotate(180deg);
@@ -458,7 +527,7 @@
       border-bottom: .01rem solid #d9d9d9;
       min-height: 1.16rem;
       line-height: normal;
-      padding: .4rem .28rem;
+      padding: .4rem .2rem;
       &.border {
         border-bottom: .01rem solid #d9d9d9;
       }
@@ -468,14 +537,14 @@
       }
     }
     .name {
-      width: 1.6rem;
+      width: 1.8rem;
       text-align: right;
       color: #226ce7;
     }
     &.no-edit {
       color: #999;
       .name {
-        color: #999;
+        color: #226ce7;
       }
     }
     .text {

+ 0 - 1
plugins/axios.js

@@ -26,7 +26,6 @@ service.interceptors.request.use(config => {
     } else {
       config.url = process.env.baseUrl + config.url
     }
-    console.log(config.url)
   //   let paramStr = ''
   //   if (config.params) {
   //     paramStr += '?'

BIN
static/images/logo/default.png


+ 20 - 0
store/user.js

@@ -50,5 +50,25 @@ export const actions = {
       }, err => {
         commit('car/GET_CAR_FAILURE', err)
       })
+  },
+  // 获取修改邮箱地址
+  updateUserEmail ({ commit }, params = {}) {
+    commit('updateUser/REQUEST_USER_EMAIL')
+    return axios.get(`/mEmail/page`, params)
+      .then(response => {
+        commit('updateUser/GET_USER_EMAIL_SUCCESS', response.data)
+      }, err => {
+        commit('updateUser/GET_USER_EMAIL_FAILURE', err)
+      })
+  },
+  // 获取修改手机号地址
+  updateUserMobile ({ commit }, params = {}) {
+    commit('updateUser/REQUEST_USER_MOBILE')
+    return axios.get(`/mPhone/page`, params)
+      .then(response => {
+        commit('updateUser/GET_USER_MOBILE_SUCCESS', response.data)
+      }, err => {
+        commit('updateUser/GET_USER_MOBILE_FAILURE', err)
+      })
   }
 }

+ 33 - 0
store/user/updateUser.js

@@ -0,0 +1,33 @@
+export const state = () => ({
+  email: {
+    fetching: false,
+    data: []
+  },
+  mobile: {
+    fetching: false,
+    data: []
+  }
+})
+
+export const mutations = {
+  REQUEST_USER_EMAIL (state) {
+    state.email.fetching = true
+  },
+  GET_USER_EMAIL_FAILURE (state) {
+    state.email.fetching = false
+  },
+  GET_USER_EMAIL_SUCCESS (state, result) {
+    state.email.fetching = false
+    state.email.data = result
+  },
+  REQUEST_USER_MOBILE (state) {
+    state.mobile.fetching = true
+  },
+  GET_USER_MOBILE_FAILURE (state) {
+    state.mobile.fetching = false
+  },
+  GET_USER_MOBILE_SUCCESS (state, result) {
+    state.mobile.fetching = false
+    state.mobile.data = result
+  }
+}

+ 11 - 0
utils/mixin.js

@@ -0,0 +1,11 @@
+export const carousel = {
+  computed: {
+    isIE () {
+      return /(MSIE)|(Trident)/.test(this.$store.state.option.userAgent)
+    },
+    effect () {
+      return this.isIE ? 'slide' : 'fade'
+    }
+  }
+}
+