Преглед изворни кода

fix:修复一堆bug,移动端提测

xzh пре 4 година
родитељ
комит
77d7700680
100 измењених фајлова са 2140 додато и 753 уклоњено
  1. BIN
      common/data/images/3-7.png
  2. 20 21
      common/data/newsData.js
  3. 1 0
      mobile/.eslintignore
  4. 1 1
      mobile/index.html
  5. BIN
      mobile/src/assets/images/refactor/about/4d-logo.png
  6. BIN
      mobile/src/assets/images/refactor/about/zd-logo.png
  7. BIN
      mobile/src/assets/images/refactor/coreProduct/banner.jpg
  8. BIN
      mobile/src/assets/images/refactor/coreProduct/banner.png
  9. 5 5
      mobile/src/assets/style/public.scss
  10. 46 3
      mobile/src/components/Paging/index.vue
  11. 1 1
      mobile/src/components/browse/index.vue
  12. 8 3
      mobile/src/components/citySelect/index.vue
  13. 1 1
      mobile/src/components/citySelect/style.scss
  14. 84 0
      mobile/src/components/common/phoneSelect.vue
  15. 2 2
      mobile/src/components/spinner/index.vue
  16. 30 0
      mobile/src/components/toast/index.vue
  17. 44 0
      mobile/src/components/toast/style.scss
  18. 1 0
      mobile/src/components/toast/toast.js
  19. 0 0
      mobile/src/lang/_en.js
  20. 9 0
      mobile/src/lang/en/index.js
  21. 47 0
      mobile/src/lang/en/modules/agent.js
  22. 11 0
      mobile/src/lang/en/modules/common.js
  23. 67 0
      mobile/src/lang/en/modules/conduct.js
  24. 36 0
      mobile/src/lang/en/modules/header.js
  25. 50 0
      mobile/src/lang/en/modules/home.js
  26. 19 0
      mobile/src/lang/en/modules/introtow.js
  27. 14 0
      mobile/src/lang/en/modules/kankanSpace.js
  28. 28 0
      mobile/src/lang/en/modules/login.js
  29. 64 0
      mobile/src/lang/en/modules/mall.js
  30. 74 0
      mobile/src/lang/en/modules/news.js
  31. 10 0
      mobile/src/lang/en/modules/service.js
  32. 13 3
      mobile/src/lang/index.js
  33. 9 0
      mobile/src/lang/zh/index.js
  34. 47 0
      mobile/src/lang/zh/modules/agent.js
  35. 11 0
      mobile/src/lang/zh/modules/common.js
  36. 70 0
      mobile/src/lang/zh/modules/conduct.js
  37. 36 0
      mobile/src/lang/zh/modules/header.js
  38. 50 0
      mobile/src/lang/zh/modules/home.js
  39. 19 0
      mobile/src/lang/zh/modules/introtow.js
  40. 14 0
      mobile/src/lang/zh/modules/kankanSpace.js
  41. 28 0
      mobile/src/lang/zh/modules/login.js
  42. 64 0
      mobile/src/lang/zh/modules/mall.js
  43. 98 0
      mobile/src/lang/zh/modules/news.js
  44. 10 0
      mobile/src/lang/zh/modules/service.js
  45. 10 12
      mobile/src/pages/account/codeLogin/index.vue
  46. 5 4
      mobile/src/pages/account/codeLogin/style.scss
  47. 2 2
      mobile/src/pages/account/forget/components/emailForget.vue
  48. 26 15
      mobile/src/pages/account/forget/components/phoneForget.vue
  49. 1 1
      mobile/src/pages/account/forget/components/style.scss
  50. 8 4
      mobile/src/pages/account/forget/index.vue
  51. 4 4
      mobile/src/pages/account/login/index.vue
  52. 5 5
      mobile/src/pages/account/mailRegister/index.vue
  53. 1 1
      mobile/src/pages/account/manage/change/index.vue
  54. 38 26
      mobile/src/pages/account/register/index.vue
  55. 1 1
      mobile/src/pages/account/register/style.scss
  56. 13 13
      mobile/src/pages/agent/index.vue
  57. 2 3
      mobile/src/pages/agent/style.scss
  58. 40 27
      mobile/src/pages/cases/index.vue
  59. 37 105
      mobile/src/pages/cases/style.scss
  60. 10 6
      mobile/src/pages/conduct/exhibition/index.vue
  61. 10 6
      mobile/src/pages/conduct/house/index.vue
  62. 8 4
      mobile/src/pages/conduct/secury/index.vue
  63. 10 6
      mobile/src/pages/conduct/shop/index.vue
  64. 16 12
      mobile/src/pages/conduct/subject/index.vue
  65. 10 16
      mobile/src/pages/coreProduct/index.vue
  66. 56 31
      mobile/src/pages/home/components/plate2.vue
  67. 5 7
      mobile/src/pages/home/components/plate3.vue
  68. 13 18
      mobile/src/pages/home/components/plate4.vue
  69. 8 6
      mobile/src/pages/home/components/plate5.vue
  70. 1 1
      mobile/src/pages/home/components/plate6.vue
  71. 12 3
      mobile/src/pages/home/index.vue
  72. 44 21
      mobile/src/pages/layout/footer.vue
  73. 64 44
      mobile/src/pages/layout/header.vue
  74. 20 9
      mobile/src/pages/layout/style.scss
  75. 24 19
      mobile/src/pages/location/index.vue
  76. 263 64
      mobile/src/pages/purchase/index.vue
  77. 8 65
      mobile/src/pages/purchase/style.scss
  78. 14 14
      mobile/src/pages/purchasezhijia/index.vue
  79. 85 37
      mobile/src/pages/purchasezhijia/style.scss
  80. 4 4
      mobile/src/pages/service/temp/app.vue
  81. 1 1
      mobile/src/pages/service/temp/config.js
  82. 7 8
      mobile/src/pages/userCenter/addressForm/index.vue
  83. 15 13
      mobile/src/pages/userCenter/confirm/index.vue
  84. 4 1
      mobile/src/router/index.js
  85. 22 22
      mobile/src/store/language/cn/about.js
  86. 15 18
      mobile/src/store/language/cn/purchase.js
  87. 1 1
      mobile/src/store/language/cn/purchasezhijia.js
  88. 1 1
      mobile/src/store/language/cn/toast.js
  89. 21 21
      mobile/src/store/language/en/about.js
  90. 1 1
      mobile/src/store/language/en/toast.js
  91. 31 5
      mobile/src/store/language/index.js
  92. 1 0
      mobile/src/store/user.js
  93. BIN
      pc/src/assets/images/refactor/mall/zhijia-left (1)@2x.png
  94. BIN
      pc/src/assets/images/refactor/mall/zhijia-left.png
  95. BIN
      pc/src/assets/images/refactor/news/banner.jpg
  96. BIN
      pc/src/assets/images/refactor/news/banner@2x.jpg
  97. 0 1
      pc/src/components/Paging/index.vue
  98. 0 3
      pc/src/components/citySelect/index.vue
  99. 0 1
      pc/src/components/paramstable/index.vue
  100. 0 0
      pc/src/components/sequence/index.vue

BIN
common/data/images/3-7.png


+ 20 - 21
common/data/newsData.js

@@ -6,7 +6,7 @@ export const News = [
     title: i18n.t('news.newsItem1.title'),
     text: i18n.t('news.newsItem1.text'),
     sub: i18n.t('news.newsItem1.sub'),
-    link: 'http://www.cnepaper.com/zhtqb/h5/html5/2020-07/15/node_1213.htm'
+    link: 'http://www.oushinet.com/ouzhong/ouzhongnews/20170602/263859.html'
   },
   {
     img: require('@/../../common/data/images/3-2.png'),
@@ -14,7 +14,7 @@ export const News = [
     title: i18n.t('news.newsItem2.title'),
     text: i18n.t('news.newsItem2.text'),
     sub: i18n.t('news.newsItem2.sub'),
-    link: 'https://pub-zhtb.hizh.cn/s/202007/14/AP5f0dcd64e4b02ae7a2c80d08.html'
+    link: 'https://36kr.com/p/782262201344647?from=groupmessage&isappinstalled=0'
   },
   {
     img: require('@/../../common/data/images/3-3.jpg'),
@@ -22,7 +22,7 @@ export const News = [
     title: i18n.t('news.newsItem3.title'),
     text: i18n.t('news.newsItem3.text'),
     sub: i18n.t('news.newsItem3.sub'),
-    link: 'http://ck.xinhuanet.com/info/2020-07-10/1281446776674586624'
+    link: 'http://ck.xinhuanet.com/tech/2020-09-28/1310510738745462784'
   },
   {
     img: require('@/../../common/data/images/3-4.png'),
@@ -30,7 +30,7 @@ export const News = [
     title: i18n.t('news.newsItem4.title'),
     text: i18n.t('news.newsItem4.text'),
     sub: i18n.t('news.newsItem4.sub'),
-    link: 'https://mp.weixin.qq.com/s/bEAUkZ68uztqU3kFqEbp8g'
+    link: 'http://www.cpolicee.com/newssz.asp?id=5412&from=groupmessage&isappinstalled=0'
   },
   {
     img: require('@/../../common/data/images/3-5.png'),
@@ -38,7 +38,7 @@ export const News = [
     title: i18n.t('news.newsItem5.title'),
     text: i18n.t('news.newsItem5.text'),
     sub: i18n.t('news.newsItem5.sub'),
-    link: 'https://mp.weixin.qq.com/s/zO0y-v8HcAlUsWDrmxzfOQ'
+    link: 'https://mp.weixin.qq.com/s/v4iR_ExNgj7D6mypsgpPVg'
   },
   {
     img: require('@/../../common/data/images/3-6.png'),
@@ -46,7 +46,7 @@ export const News = [
     title: i18n.t('news.newsItem6.title'),
     text: i18n.t('news.newsItem6.text'),
     sub: i18n.t('news.newsItem6.sub'),
-    link: 'http://www.cnepaper.com/gdzjwb/h5/html5/2020-03/16/node_1296.htm?from=groupmessage&isappinstalled=0'
+    link: 'http://www.cnr.cn/rdzx/cxxhl/zxxx/20200907/t20200907_525244333.shtml?from=timeline&isappinstalled=0'
   },
   {
     img: require('@/../../common/data/images/3-7.png'),
@@ -54,15 +54,15 @@ export const News = [
     title: i18n.t('news.newsItem7.title'),
     text: i18n.t('news.newsItem7.text'),
     sub: i18n.t('news.newsItem7.sub'),
-    link: 'http://www.cpolicee.com/newssz.asp?id=5412&from=groupmessage&isappinstalled=0'
+    link: 'https://mp.weixin.qq.com/s/YpCZox1TylogxsG8o1qj5A'
   },
   {
     img: require('@/../../common/data/images/3-8.png'),
-    time: i18n.t('news.newsItem8.time'),
-    title: i18n.t('news.newsItem8.title'),
-    text: i18n.t('news.newsItem8.text'),
-    sub: i18n.t('news.newsItem8.sub'),
-    link: 'https://mp.weixin.qq.com/s/FU1YHG8LTI0gsWBwvi4uPA'
+    time: '2020-03-20',
+    title: '四维时代独家为全球最顶级艺术博览会TEFAF提供3D技术支持',
+    text: '全球最顶级的艺术品大多数长什么样子?到荷兰的TEFAF现场(欧洲艺术和古董博览会)逛一圈就知道了。EFAF是全球规模最大、规格最顶级、欧洲资格最老的艺术博览会之一,一直被公认为全球艺术市场的“风向标”。每年TEFAF开幕,都会吸引欧洲乃至世界各地的顶级藏家、艺术投资大佬、明星名人都会齐聚此地。',
+    sub: '四维时代',
+    link: 'https://mp.weixin.qq.com/s/zO0y-v8HcAlUsWDrmxzfOQ'
   },
   {
     img: require('@/../../common/data/images/3-9.png'),
@@ -70,7 +70,7 @@ export const News = [
     title: i18n.t('news.newsItem9.title'),
     text: i18n.t('news.newsItem9.text'),
     sub: i18n.t('news.newsItem9.sub'),
-    link: 'https://mp.weixin.qq.com/s/E98JyaHjGOu6Gfzidvtqwg'
+    link: 'https://pub-zhtb.hizh.cn/s/202003/15/AP5e6e3538e4b02ebde0aae213.html?from=singlemessage&isappinstalled=0'
   },
   {
     img: require('@/../../common/data/images/3-10.png'),
@@ -78,7 +78,7 @@ export const News = [
     title: i18n.t('news.newsItem10.title'),
     text: i18n.t('news.newsItem10.text'),
     sub: i18n.t('news.newsItem10.sub'),
-    link: 'https://mp.weixin.qq.com/s/DctqPBXlbXS9FHA7tAibzQ'
+    link: 'https://mp.weixin.qq.com/s/EHxLGCGvznqijxOLPLTXkQ'
   },
   {
     img: require('@/../../common/data/images/3-11.png'),
@@ -86,7 +86,7 @@ export const News = [
     title: i18n.t('news.newsItem11.title'),
     text: i18n.t('news.newsItem11.text'),
     sub: i18n.t('news.newsItem11.sub'),
-    link: 'https://www.chinaz.com/news/mt/2019/0509/1015191.shtml?qq-pf-to=pcqq.c2c'
+    link: 'https://mp.weixin.qq.com/s/DctqPBXlbXS9FHA7tAibzQ'
   },
   {
     img: require('@/../../common/data/images/3-12.png'),
@@ -94,16 +94,15 @@ export const News = [
     title: i18n.t('news.newsItem12.title'),
     text: i18n.t('news.newsItem12.text'),
     sub: i18n.t('news.newsItem12.sub'),
-    link: 'https://baijiahao.baidu.com/s?id=1631864683811023774&wfr=spider&for=pc'
-  }
-  ,
+    link: 'http://bj.news.163.com/18/1029/14/DV9U6QN8043897TC.html'
+  },
   {
     img: require('@/../../common/data/images/3-13.png'),
     time: i18n.t('news.newsItem13.time'),
     title: i18n.t('news.newsItem13.title'),
     text: i18n.t('news.newsItem13.text'),
     sub: i18n.t('news.newsItem13.sub'),
-    link: 'https://baijiahao.baidu.com/s?id=1631864683811023774&wfr=spider&for=pc'
+    link: 'http://txw.eastday.com/a/190904152250648.html'
   },
   {
     img: require('@/../../common/data/images/3-14.png'),
@@ -111,7 +110,7 @@ export const News = [
     title: i18n.t('news.newsItem14.title'),
     text: i18n.t('news.newsItem14.text'),
     sub: i18n.t('news.newsItem14.sub'),
-    link: 'https://baijiahao.baidu.com/s?id=1631864683811023774&wfr=spider&for=pc'
+    link: 'https://proapi.jingjiribao.cn/detail.html?id=177829'
   }
   ,
   {
@@ -120,7 +119,7 @@ export const News = [
     title: i18n.t('news.newsItem15.title'),
     text: i18n.t('news.newsItem15.text'),
     sub: i18n.t('news.newsItem15.sub'),
-    link: 'https://baijiahao.baidu.com/s?id=1631864683811023774&wfr=spider&for=pc'
+    link: 'https://www.chinaz.com/news/mt/2019/0509/1015191.shtml?qq-pf-to=pcqq.c2c'
   }
   ,
   {

+ 1 - 0
mobile/.eslintignore

@@ -3,3 +3,4 @@
 /dist/
 /*.js
 /test/unit/coverage/
+/src/lang/

+ 1 - 1
mobile/index.html

@@ -10,7 +10,7 @@
     <link rel="shortcut icon" href="//4dkk.4dage.com/FDKKIMG/icon/kankan_icon.ico">
     <link rel="icon" type="image/png" href="//4dkk.4dage.com/FDKKIMG/icon/kankan_icon192.png" sizes="192x192">
     <link rel="apple-touch-icon" sizes="180x180" href="//4dkk.4dage.com/FDKKIMG/icon/kankan_icon180.png">
-    <link rel="stylesheet" href="//at.alicdn.com/t/font_941679_aolcaumsli5.css">
+    <link rel="stylesheet" href="//at.alicdn.com/t/font_941679_6htxkis28k4.css">
     <title>四维看看</title>
   </head>
   <body>

BIN
mobile/src/assets/images/refactor/about/4d-logo.png


BIN
mobile/src/assets/images/refactor/about/zd-logo.png


BIN
mobile/src/assets/images/refactor/coreProduct/banner.jpg


BIN
mobile/src/assets/images/refactor/coreProduct/banner.png


+ 5 - 5
mobile/src/assets/style/public.scss

@@ -253,12 +253,12 @@ body{
       }
     }
     .checkbox-inner-checked {
-      background-color: #202020;
-      border-color:#202020;
+      background-color: #1FE4DC;
+      border-color:#1FE4DC;
       &::after {
         position: absolute;
         display: table;
-        border: 3px solid #fff;
+        border: 2px solid #202020;
         border-top: 0;
         border-left: 0;
         transform: rotate(45deg) scale(0.8) translate(-50%, -50%);
@@ -281,9 +281,9 @@ body{
   float: right;
 }
 .common-title {
-  font-size: 22px;
+  font-size: 16px;
   font-weight: bold;
-  line-height: 33px;
+  line-height: 26px;
   color: #202020;
   text-align: left !important;
   &::after {

+ 46 - 3
mobile/src/components/Paging/index.vue

@@ -1,6 +1,6 @@
 <template>
   <div class="layout">
-    <a @click="clickHandle(index - 1)" ></a>
+    <i class="iconfont icon-youjiantou left-arrow" @click="clickHandle(index - 1)" v-show="index != 1" ></i>
     <a @click="clickHandle(1)" :class="{active: index === 1}" >1</a><a class="more" @click="clickHandle(current - 3)" v-if="current>5" >...</a><a
       v-if="page!==maxPage && page!==1"
       v-for="page in pages"
@@ -8,7 +8,7 @@
       @click="clickHandle(page)"
       :class="{active: index === page}"
       >{{page}}</a><a class="more" @click="clickHandle(pages[pages.length-1] + 2)" v-if="pages[pages.length-1]+2<=maxPage" >...</a><a @click="clickHandle(maxPage)" v-if="maxPage!==1" :class="{active: index === maxPage}" >{{maxPage}}</a>
-      <i class="iconfont icon-youjiantou" @click="clickHandle(index + 1)" ></i>
+      <i class="iconfont icon-youjiantou" @click="clickHandle(index + 1)" v-show="index != maxPage" ></i>
   </div>
 </template>
 
@@ -109,7 +109,7 @@ export default {
 }
 </script>
 
-<style scoped>
+<style scoped lang="scss">
     .layout .more:hover::after{
        transform: scaleX(0)!important;
     }
@@ -136,6 +136,49 @@ export default {
     .icon-youjiantou{
       color: #2d2d2d;
     }
+    .left-arrow {
+      &::before {
+        transform: rotate(180deg);
+        display: inline-block;
+      }
+    }
+ .layout {
+      text-align: center;
+      margin-top: 20px;
+    }
+     .layout a:not(:last-child) {
+      margin: 10px 8px;
+      font-size: 16px;
+      display: inline-block;
+      font-weight: 500;
+      cursor: pointer;
+      user-select: none;
+      color: #999;
+      position: relative;
+      transition: color 0.3s;
+    }
+
+     .layout a:not(:last-child).active::after,
+     .layout a:not(:last-child).active,
+     .layout a:not(:last-child):hover,
+     .layout a:not(:last-child):hover::after {
+      color: #111111;
+      transform: scaleX(1);
+    }
+
+     .layout a:not(:last-child)::after {
+      content: "";
+      height: 3px;
+      width: 140%;
+      background-color: #111;
+      display: block;
+      margin-left: -20%;
+      margin-top: 3px;
+      transform-origin: 50% 50%;
+      transform: scaleX(0);
+      will-change: transform;
+      transition: transform 0.3s;
+    }
 
 /* .layout {
   text-align: center;

+ 1 - 1
mobile/src/components/browse/index.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="swiper-container">
+  <div class="swiper-container" ref="swiper-container">
     <swiper class="swiper-wrapper swiper-wrapper-n" :options="swiperOption">
       <swiper-slide class="swiper-slide" v-for="(item,index) in idata" :key="index">
         <div class="s-item" :style="{height:wh.width+'px'}" >

+ 8 - 3
mobile/src/components/citySelect/index.vue

@@ -11,7 +11,7 @@
       </div>
       <div class="address-input-item">
         <div class="address-sub address-phone">
-          <div class="top-title">{{ $t('mall.receiverPlaceholder') }}</div>
+          <div class="top-title">{{ $t('mall.phone') }}</div>
           <div class="ant-input">
             <input v-model="tempAddress.shipMobile" oninput="value=value.replace(/[^\d]/g,'')" maxlength='11' type="text" :placeholder="langAccount.placeholder.phone" />
           </div>
@@ -54,6 +54,9 @@
           </div>
         </div>
       </div>
+      <div class="address-input-item">
+        <p class="p-dec">{{ langAccount.recaddress }}</p>
+      </div>
       <div class="actions-w">
         <button type="submit" class="ant-btn ant-btn-primary cancel" @click="$emit('cancle', true)">
           <span>{{langAccount.cancel}}</span>
@@ -156,7 +159,8 @@ export default {
         province,
         city,
         shipMobile,
-        shipName
+        shipName,
+        id
       } = this.tempAddress
 
       let isObject = function (obj) {
@@ -169,7 +173,8 @@ export default {
         province,
         city,
         shipMobile,
-        shipName
+        shipName,
+        id
       }
       let test = Object.keys(params)
       for (let i = 0; i < test.length; i++) {

+ 1 - 1
mobile/src/components/citySelect/style.scss

@@ -87,7 +87,7 @@
     }
   }
   .p-dec {
-    line-height: 32px;
+    // line-height: 32px;
     margin-bottom: 8px;
   }
 }

+ 84 - 0
mobile/src/components/common/phoneSelect.vue

@@ -0,0 +1,84 @@
+<template>
+  <div class="phoneSelect">
+    <div class="search-w">
+      <input type="text" v-model="inputValue">
+      <h-icon class="icon" type="sousuo" />
+    </div>
+    <ul>
+      <li
+        @click="selectItem(item)"
+        v-for="(item,i) in list"
+        :key="i"
+      >{{language==='en'?item[2]:item[0]}}{{item[1]}}</li>
+    </ul>
+  </div>
+</template>
+
+<script>
+import selectCall from '@/pages/account/country.js'
+import { mapState } from 'vuex'
+export default {
+  data () {
+    return {
+      selectCall,
+      inputValue: ''
+    }
+  },
+  computed: {
+    ...mapState({
+      language: state => state.language.current
+    }),
+    list () {
+      return selectCall.filter(item => item.join().indexOf(this.inputValue) > -1)
+    }
+  },
+  methods: {
+    selectItem (item) {
+      this.$emit('selectItem', item)
+    }
+  }
+}
+</script>
+
+<style lang="less" scoped>
+.phoneSelect{
+    position: absolute;
+    top: 0;
+    left: 0;
+    background: #fff;
+    min-width: 200px;
+    height: 230px;
+    padding: 20px 10px;
+    overflow: auto;
+    transition: ease 0.3s all;
+    z-index: 888;
+    box-shadow: 0px 1px 8px #ddd;
+    .search-w {
+      border: 1px solid #EBEBEB;
+      height: 28px;
+      line-height: 26px;
+      width: 100%;
+      padding: 0 10px;
+      display: flex;
+      input {
+        border: none;
+        flex: 1;
+      }
+    }
+    .icon {
+      color: #909090;
+      font-size: 15px;
+    }
+    li{
+      height: 40px;
+      line-height: 50px;
+      color: #999;
+      word-break: break-all;
+      font-size: 14px;
+      cursor: pointer;
+      &:hover{
+        color: #000;
+      }
+    }
+  }
+</style>

+ 2 - 2
mobile/src/components/spinner/index.vue

@@ -46,8 +46,8 @@ export default {
 input {
   width: 33%;
   text-align: center;
-  color: #787a7a;
-  font-size: 18px;
+  color: #202020;
+  font-size: 14px;
   height: 100%;
   background: #fff;
   border: none;

+ 30 - 0
mobile/src/components/toast/index.vue

@@ -18,9 +18,31 @@
       </div>
     </div>
     <div
+      class="toast-layout toast-show"
+      :style="{background:isLoaing?'none':'rgba(0, 0, 0, 0.3)'}"
+      :class="{'toast-active':visible}"
+      v-if="toastType === 'show'"
+    >
+      <div class="toast-con">
+        <div class="toast-icon">
+          <h-icon :type="iconType" />
+        </div>
+        <div class="detail">
+          <div>
+            <p class="main-msg" v-html="message"></p>
+            <p class="sub-msg">{{submsg}}</p>
+          </div>
+        </div>
+        <div class="toast-show-bottom">
+          <span class="" @click="emitCallback">{{diycomfirm||comfirmtxt}}</span>
+        </div>
+      </div>
+    </div>
+    <div
       class="toast-layout"
       :style="{background:isLoaing?'none':'rgba(0, 0, 0, 0.3)'}"
       :class="{'toast-active':visible}"
+      v-else
     >
       <div class="toast-con">
         <div class="detail">
@@ -53,6 +75,11 @@ let types = {
   success: '成功'
 }
 
+let iconType = {
+  warn: 'tanhao',
+  error: 'tanhao',
+  success: 'duihao'
+}
 let typesEn = {
   warn: 'Message',
   error: 'Error',
@@ -86,6 +113,9 @@ export default {
   computed: {
     typeTxt () {
       return this.lang === 'en' ? typesEn[this.type] : types[this.type]
+    },
+    iconType () {
+      return iconType[this.type] || 'tanhao'
     }
   },
   created () {},

+ 44 - 0
mobile/src/components/toast/style.scss

@@ -123,6 +123,50 @@ $anima-delay:0.15s;
       }
     }
   }
+  &.toast-show {
+    .toast-con {
+      width: 282px;
+      padding: 20px;
+      border-radius: 0;
+      .detail {
+        min-height: auto;
+        &>div {
+          position: relative;
+          top: 0;
+          left: 0;
+          text-align: center;
+          transform: translate(0,0);
+          margin: 17px 0 27px;
+        }
+        .main-msg {
+          color: #909090;
+          font-weight: normal;
+          font-size: 14px;
+        }
+      }
+      .toast-show-bottom {
+        background: #1fe4dc;
+        width: 100%;
+        height: 40px;
+        line-height: 40px;
+        text-align: center;
+        span {
+          display: block;
+        }
+      }
+    }
+    .toast-icon {
+      background: #202020;
+      color: #1FE4DC;
+      font-size: 50px;
+      height: 60px;
+      width: 60px;
+      border-radius: 50%;
+      text-align: center;
+      line-height: 60px;
+      margin: 10px auto 0;
+    }
+  }
 }
 .toast-active{
   display: block!important;

+ 1 - 0
mobile/src/components/toast/toast.js

@@ -58,6 +58,7 @@ Toast.install = function (Vue) {
       }
     },
     show: (type, msg, callback, submsg = '') => {
+      console.log(type)
       instance.img = imgs[type] || (cdn + 'images/icon/success.png')
       instance.submsg = submsg
       instance.message = msg

+ 0 - 0
mobile/src/lang/_en.js


+ 9 - 0
mobile/src/lang/en/index.js

@@ -0,0 +1,9 @@
+const requireModules = require.context('./modules', true, /[a-z0-9]+\.js$/i)
+
+let en = {}
+requireModules.keys().forEach(fileName => {
+  let name = fileName.substr(fileName.lastIndexOf('/') + 1).replace(/\.\w+$/, '')
+  en[name] = requireModules(fileName)
+})
+
+module.exports = en

+ 47 - 0
mobile/src/lang/en/modules/agent.js

@@ -0,0 +1,47 @@
+module.exports = {
+    "bannerTitle": "Become a distributor of 4DKanKan",
+    "planTitle": "Outline of 4DKanKan Distributor Program",
+    "planDesc1": "The Patented AI Space Reconstruction Algorithm Technology from 4Dage Has Won Numerous Awards and Has Reconstructed More than 300,000 Space Models Worldwide.",
+    "planDesc2": "This Innovative Approach of Space Reconstruction Is Gradually Changing the Business Model of Various Industries (Real-estate, Architecture, Museum, Tourism, Jounalist, Insurance Claims, Criminal Investigation, Etc.).",
+    "planDesc3": "Our 4DKanKan Distributor Program Invites Professionals From All Industries to Participate in Our “Digital Everything” Scheme, Open up New Market Together and Share Profits.",
+    "planDesc4": "If You Are Interested in the Idea of ​​3D Capturing the World and Would Like to Incorporate It into Your Career Plan, This Is An Excellent Opportunity For Cooperation.",
+    "advanTitle": "Benefits of Being our Valued Distributor",
+    "advan": {
+        "item1Title": "Share the Profit",
+        "item1Sub": "Large Profit to Share",
+        "item2Title": "Exclusive Customer Service",
+        "item2Sub": "Support from Exclusive and Professional Sales and Technicians",
+        "item3Title": "Promotional Material",
+        "item3Sub": "Regularly Updated Promotional Videos and Cases",
+        "item4Title": "Shop Decoration",
+        "item4Sub": "Offer Necessary Promotional Material for the Shop",
+        "item5Title": "Growth Opportunity",
+        "item5Sub": "Opportunities to Join Exhibitions and Professional Conferences"
+    },
+    "jinxiaoTitle": "Become A Distributor of 4DKanKan",
+    "jinxiaoForm": {
+        "companytitle": "Company Information",
+        "companyNameLabel": "Registered Company Name",
+        "companyNamePlaceholder": "Please Input the Registered Company Name",
+        "addressLabel": "Company Address",
+        "addressPlaceholder1": "Country",
+        "addressPlaceholder2": "Region",
+        "addressPlaceholder3": "Please Input the Detailed Address of Your Company",
+        "storeLabel": "Do You Have A Retail Shop or A Company Website?",
+        "storeType1": "Mainly Offline Sales",
+        "storeType2": "Mainly Online Sales",
+        "storePlaceholder": "Please Input the Detailed Address of Your Retail Shop",
+        "applytitle": "Applicant Information",
+        "applyNameXing": "Last Name",
+        "applyNameMing": "First Name",
+        "applyNamePlaceholder": "Please Input the Last Name",
+        "applyNamePlaceholder1": "Please Input the First Name",
+        "positionLabel": "Title",
+        "positionPlaceholder": "Please Input the Title",
+        "phoneLabel": "Phone",
+        "phonePlaceholder": "Please Input the Phone",
+        "emailLabel": "Email",
+        "emailPlaceholder": "Please Input the Email",
+        "submit": "Submit"
+    }
+}

+ 11 - 0
mobile/src/lang/en/modules/common.js

@@ -0,0 +1,11 @@
+module.exports = {
+    "kankan": "4DKanKan Pro",
+    "more": "More",
+    "submit": "Submit",
+    "edit": "Edit",
+    "formTip": "Please Complete the Form",
+    "cancle": "Cancel",
+    "save": "Save",
+    "saveAndUse": "Save and Use",
+    search: "Search"
+}

+ 67 - 0
mobile/src/lang/en/modules/conduct.js

@@ -0,0 +1,67 @@
+module.exports = {
+    "__name": "核心产品",
+    "coreProduct": {
+        "bannerTitle": "Product",
+        "itemTitle1": "Autonomous & Accurate Modeling,Automatic Distance Measurement",
+        "itemTitle2": "720° Immersive Roaming with 8K Picture Quality",
+        "itemTitle3": "HDR Mode Balances Light and Dark Area Exposure",
+        "itemTitle4": "Real-time Panoramic Video to Create an Immersive Experience",
+        "itemTitle5": "10 Minutes to Start, Easy to Operation",
+        "itemTitle6": "Autonomous Space Modeling in 10 Minutes. (About 100㎡)",
+        "itemTitle7": "Multifunctional Editing Tool, Let Space Tell the Story"
+    },
+    "coreTech": {
+        "bannerTitle": "Technology",
+        "itemTitle1": "Space Digitization",
+        "itemText1": "Record and calculate the spatial position of the camera when shooting, and extract the corresponding 3D point cloud, so as to obtain the real situation of 3D space",
+        "itemTitle2": "Space Interaction",
+        "itemText2": "Automatic tour with preset route, panoramic and box videos enhance the interaction, different forms of dynamic hot-spot, let the space tell the story",
+        "item2Name1": "Dynamic Hot-spot",
+        "item2Name2": "Interactive Video",
+        "item2Name3": "Automatic Tour",
+        "itemTitle3": "Space Display",
+        "itemText3": "Offers a 720° Immersive Roaming Experience on Mobile Phone, Tablet, PC and VR Glasses without Plug-ins",
+        "item3Name1": "VR",
+        "item3Name2": "PC",
+        "item3Name3": "Mobile"
+    },
+    "conductHouse": {
+        "bannerTitle": "Realestate",
+        bannerSubTitle: "Mass Reconstruction<br />of the Real Houses",
+        "itemTitle1": "AI Automatic Modeling, Efficient Reconstruct the Real Houses",
+        "itemTitle2": "Display All the Details, More Efficient for Sales and Rental Decisions",
+        "itemTitle3": "Multidimensional Display the Information of Real-estate with Higher Efficiency",
+        "itemTitle4": "Multifunctional Editing Tool, Let Houses Display Better"
+    },
+    "conductExhibition": {
+        "bannerTitle": "Exhibition",
+        bannerSubTitle: 'Participate in Exhibitions<br/>without Any Limitations',
+        "itemTitle1": "Online Visiting and Negotiation, Exchange Business Cards Freely",
+        "itemTitle2": "No Barries to Communication, Easy to Get All the Information",
+        "itemTitle3": "Reduce the Cost of Exhibitions, Promote Transactions Effectively",
+        "itemTitle4": "Statistic Data Flow, Analyze User Persona"
+    },
+    "conductSubject": {
+        "bannerTitle": "4DKanKan",
+        bannerSubTitle: 'Culture & Relics, Help to Create<br/>Never-ending Museums',
+        "itemTitle1": "Digital Twin of Treasure Relics,Break the Time Limitation",
+        "itemTitle2": "Various Forms of Spatial Interaction, Carrying Rich Historical Heritage",
+        "itemTitle3": "Simultaneous Operation by Multi-user, Listening to Historical Stories",
+        "itemTitle4": "Promote Social Science Education and Help Cultural Communication",
+        caseTitle: 'Showcases'
+    },
+    "conductShop": {
+        "bannerTitle": "E-commerce",
+        bannerSubTitle: 'Free Shopping<br/>without Any Limitations',
+        "itemTitle1": "New Immersive Shopping Experience in 3D Digital Business District",
+        "itemTitle2": "Shopping in the Real 3D Models through Mobile Phones",
+        "itemTitle3": "Gather Online Passenger Flow and Boost Offline Economy",
+        "itemTitle4": "Personal Customer Service,Real-time Communications"
+    },
+    "conductSecury": {
+        "bannerTitle": "Security Survey",
+        "itemTitle1": "Reconstruct Disaster Scenes Efficiently,Create Comprehensive 3D Files",
+        "itemTitle2": "Multifunctional Editing Tool,Improve the Communication Quality",
+        "itemTitle3": "Pre-collection is Available,Reduce the Claims Disputes"
+    }
+}

+ 36 - 0
mobile/src/lang/en/modules/header.js

@@ -0,0 +1,36 @@
+module.exports = {
+    "core_product": "Product",
+    "solutions": "Solutions",
+    "kankan_space": "KanKan-Space",
+    "core_tech": "Technology",
+    "service": "Services",
+    "about": "About Us",
+    "online_shop": "Shopping Mall",
+    "solutionsHouse": "Real-estate Marketing",
+    "solutionsExi": "Online Exhibition",
+    "solutionsSubject": "Smart Culture & Relics",
+    "solutionsShop": "VR Shopping",
+    "solutionsSec": "Security Survey",
+    "serviceApp": "APP Download",
+    "serviceUse": "User Tutorial",
+    "serviceBaoxiu": "Warranty Information",
+    "serviceVideo": "Video Tutorial",
+    "aboutNews": "News Report",
+    "aboutAgent": "Be Our Distributor",
+    "aboutCompany": "Company Profile",
+    "mallPro": "4DKanKan Pro",
+    "mallPeijian": "Tripod Set",
+    "addService": "Cloud Capacity",
+    myAccount: 'Account',
+    "footer": {
+        "bannerTitle": "4DKanKan-Let the space tell the story",
+        "find": "Findings",
+        "saleEmail": "Business Collaboration",
+        "meitiEmail": "Media Inquiries",
+        "phone": "Tel",
+        "find4D": "Explore 4Dage",
+        "kankan": "4Dage",
+        "zhongde": "CGAII",
+        "moku": "4DMODEL"
+    }
+}

+ 50 - 0
mobile/src/lang/en/modules/home.js

@@ -0,0 +1,50 @@
+module.exports = {
+    "bannerText": "Real-time Accurate Reconstruction<br/>Pass the Value of Space",
+    "bannerBuyBtnText": "Buy Now",
+    "bannerMoreBtn": "Learn More",
+    "bannerIntroVideo": "Introduction Video",
+    "bannerAgent": "Be A Distributor",
+    "plate1Title": "Solutions",
+    "plate2Title": "KanKan-Space",
+    "plate3Title": "Technology",
+    "plate4Title": "News",
+    "plate5Title": "Partners",
+    "plate1Item1": "Real-estate Marketing",
+    "plate1Item2": "Online Exhibition",
+    "plate1Item3": "Smart Culture & Relics",
+    "plate1Item4": "VR Shopping",
+    "plate1Item5": "Security Survey",
+    "plate1Item1SubTitle": "Mass Reconstruction of the Real Houses",
+    "plate1Item1Desc1": "AI Automatic Modeling, Efficient Reconstruct the Real Houses",
+    "plate1Item1Desc2": "VR Guidance/ VR Explanation,Display All the Details",
+    "plate1Item1Desc3": "Easy to Operation, Everyone Can Be A Master",
+    "plate1Item1Desc4": "Professional Real-estate Marketing System, More Efficient for Sales and Rental Decisions",
+    "plate1Item2SubTitle": "All-round Reconstruction of Exhibition Information, Without Any Limitations",
+    "plate1Item2Desc1": "AI Image Reconstruction Technology, Create the Digital Twin of Offline Exhibition",
+    "plate1Item2Desc2": "Interactive 3D Exhibits, 720° Immersive Roaming",
+    "plate1Item2Desc3": "Online Negotiation on the Same Screen, Directly Connect Supply and Acquisition Information",
+    "plate1Item2Desc4": "Automatically Collect and Analyze Exhibition Data, Reduce Customer Acquisition Costs",
+    "plate1Item3SubTitle": "Assistant to Build A Museum that Never Ends",
+    "plate1Item3Desc1": "3D HD Recording, Easy to Retention and Protection",
+    "plate1Item3Desc2": "Space Interaction, Let the Space to Express More Historical Connotations",
+    "plate1Item3Desc3": "Under the Master’s Explanation, Multi-user Can Participate on the Same Screen",
+    "plate1Item3Desc4": "Promote Social Science Education and Promote Everyone to Participate",
+    "plate1Item4SubTitle": "Mass Reconstruction of the Real Houses",
+    "plate1Item4Desc1": "AI Automatic Modeling, Efficient Reconstruct the Real Houses",
+    "plate1Item4Desc2": "VR Guidance/ VR Explanation,Display All the Details",
+    "plate1Item4Desc3": "Easy to Operation, Everyone Can Be A Master",
+    "plate1Item4Desc4": "Professional Real-estate Marketing System, More Efficient for Sales and Rental Decisions",
+    "plate1Item5SubTitle": "Efficient Reconstruct Disaster Scenes,Create Comprehensive 3D Files",
+    "plate1Item5Desc1": "Efficient Reconstruct Disaster Scenes,Create Comprehensive 3D Files",
+    "plate1Item5Desc2": "Pre-collection is Available,Reduce the Claims Disputes",
+    "plate2Item1": "Yongzheng Palace",
+    "plate2Item2": "Xiaomi",
+    "plate2Item3": "Huafa Mountain Mansion",
+    "plate2Item4": "Marriott Hotel",
+    "plate3Item1Title": "Space Digitization",
+    "plate3Item1Text": "Automatically 3D Digital Reconstruction<br/>Restore Spatial Layout and Structure",
+    "plate3Item2Title": "Space Interaction",
+    "plate3Item2Text": "Automatic Tour<br/>Interactive Videos, Different Forms of Dynamic Hot-spot",
+    "plate3Item3Title": "Space Display",
+    "plate3Item3Text": "Offers A 720° Immersive Roaming Experience on Different Devices without Plug-ins"
+}

+ 19 - 0
mobile/src/lang/en/modules/introtow.js

@@ -0,0 +1,19 @@
+module.exports = {
+    "deviceId": "Camera ID",
+    "exDot": "Available Points Amount",
+    dot: 'Points',
+    "title": "Expand the Points Number, Capture Your Colorful Life",
+    "titleTip": "Your Purchase Will Take Effect Immediately, Please Feel Free to Use",
+    "question1": "Why do I need to expand the points number?",
+    "answer1": "Answer: When your basic points are less than 99 points, the latest shots will not be generated. By purchasing points, you can calculate and store more scenes.",
+    "question2": "Can I get a refund after I expand the points number?",
+    "answer2": "Answer: No, because after the points are expanded, the corresponding points will be credited to the account immediately and take effect, so midway refunds are not accepted. Thanks for you understanding.",
+    "question3": "Can I get the points back after I delet my scenes?",
+    "answer3": "Answer: There is no expiration date for expanding the points number, so after consumption, it means that your beautiful space will be recorded permanently, and it will not be returned after you delete the scene.",
+    "question4": "Can I continue shooting and uploading if I don’t have enough points?",
+    "answer4": "Answer: When the number of points is insufficient, it will not affect the normal shooting of the device, but it will not be able to upload and calculate. At this time, you can only delete it; After you expand, you can view, edit and share scenes.",
+    "openDevice": "Activate Device",
+    "selectVoice": "Select Capacity",
+    "payType": "Payment Method",
+    "payMoney": "Total Price"
+}

+ 14 - 0
mobile/src/lang/en/modules/kankanSpace.js

@@ -0,0 +1,14 @@
+module.exports = {
+    "title": "KanKan-Space",
+    "typeAll": "All",
+    "typeHouse": "Real-estate",
+    "typeExihibition": "Exhibition",
+    "typeSubject": "Museum",
+    "typeShop": "E-commerce",
+    "typeFoot": "Catering",
+    "typeOther": "Others",
+    "recommend": "Recommend",
+    "hot": "Hot",
+    "new": "Newest",
+    "placeholder": "Please Enter the Keywords to Search"
+}

+ 28 - 0
mobile/src/lang/en/modules/login.js

@@ -0,0 +1,28 @@
+module.exports = {
+    "login": "Log in",
+    "register": "Register",
+    "userLogin": "User Login",
+    "cameraLogin": "Camera Login",
+    "codeLogin": "Verification Code Login",
+    "passwordLogin": "Password Login",
+    "phonePlaceholder": "Phone Number",
+    "passwordPlaceholder": "Enter Password",
+    "codePlaceholder": "Verification Code",
+    "sendCodeBtnText": "Request Verification Code",
+    "rememberPassword": "Remember Password",
+    "forgetPassword": "Forgot Password",
+    "registerAccount": "Sign Up",
+    "cameraLoginTip": "Scan the QR-Code to log in with the 4DKanKan App",
+    "kankanAccountRegister": "Sign in",
+    "setPassword": "Set Your Password",
+    "rePassword": "Enter password again",
+    "cluse": "I have read 《4DKanKan User Agreement》",
+    "findPassword": "Password Reset",
+    "emailPlaceholder": "E-mail",
+    "hasAccount": "Already Have An Account, ",
+    "zhijieLogin": "Log in Now",
+    "resendTime": "{time}s resend",
+    "passwordTip": "Password must contain English case and numbers no less than 8-16 characters",
+    "currentEmailTip": "Please enter a correct Email address",
+    "agreeXieyi": "Please read and agree to the user agreement"
+}

+ 64 - 0
mobile/src/lang/en/modules/mall.js

@@ -0,0 +1,64 @@
+module.exports = {
+    "postage": "Freight: SF Express",
+    "baseVolume": "Basic Storage Capacity",
+    "knowMore": "Learn More",
+    "standard": "Standard Package",
+    "addCou": "Value-added Package (including tripod)",
+    "count": "Amount",
+    "couTip": "Whether Need to Add Feature Kit (Standard Package Does Not Include the Feature Kit",
+    "jiaojia": "4DKanKan Pro Tripod Set",
+    "jiaojiaDetail": "Tripod + Pulley + Ball Head",
+    "cart": "Add to the Shop Cart",
+    "fahuo": "Expected to Ship within Three Days",
+    "product": "Product Manual",
+    "techDetail": "Technical Parameters",
+    "widthDetail": "Size Parameters",
+    "cartTitle": "Cart",
+    "cartTitleTip": "Free SF Express Shipping on This Order",
+    "goods": "Products",
+    "price": "Price",
+    "mini": "Total",
+    "continueBuy": "Continue Shopping",
+    "nowJieSuan": "Pay Now",
+    "nowBuy": "Order Now",
+    "countNum": "{num}Product(s) In Total",
+    "addBuy": "Add to Cart",
+    "confirmOrder": "Confirm Order",
+    "submitOrder": "Submit Order",
+    "receiveAddress": "Shipping Address",
+    "invoiceIntro": "Invoice Information",
+    "normalInvoice": "Electronic Invoice",
+    "zengzhiInvoice": "Special Invoice",
+    "people": "Personal",
+    "enterprise": "Enterprises",
+    "wenxinTip": "Notice",
+    "wenxinTipContent": "Special invoice will be sent together with the merchandise by SF Express within 10 days due to special circumstances (if there is a slight delay during holidays). Please pay attention to check; after receiving the special value-added tax invoice, please keep it properly. If you return the goods, please send it back together. If the return special invoice cannot be sent back, the corresponding tax point will be deducted.",
+    "goodsInfo": "Product Information",
+    "kankanPro": "4DKanKan Pro",
+    "zhijiaName": "4DKanKan Pro Feature Kit",
+    "goodsTotalPrice": "Total Price",
+    "otherPrice": "Taxes and Other Expenses",
+    "yunfei": "Freight",
+    "total": "Total",
+    "blackColor": "Night Sky Black",
+    "voice": "Storage Capacity Plan (10GB)",
+    "zhijiaColor": "Standard Colour",
+    "payOrder": "Pay Now",
+    "addAddressTip": "Please Add Address",
+    "payCenter": "Payment Center",
+    "nowAccount": "Current Account",
+    "payType": "Payment Method",
+    "aliPay": "Alipay",
+    "wechatPay": "WeChat Pay",
+    "payNum": "Total Price",
+    "wechat": "WeChat",
+    "payTip": "Please Select {type} App Scan the QR Code to Complete the Payment",
+    "noGoodsConfirm": "Please Select The Product",
+    "yunVoice": "About Cloud Capacity",
+    "editAddress": "Edit Shipping Address",
+    "receiver": "Receiver",
+    "phone": "Tel",
+    "area": "Area",
+    "addressDetail": "Address",
+    "nashui": "Taxpayer ID"
+}

Разлика између датотеке није приказан због своје велике величине
+ 74 - 0
mobile/src/lang/en/modules/news.js


+ 10 - 0
mobile/src/lang/en/modules/service.js

@@ -0,0 +1,10 @@
+module.exports = {
+    "title": "Service Support",
+    "mVideo": "Video Tutorial",
+    "use": "User Tutorial",
+    "app": "APP Download",
+    "clause": "Warranty Information",
+    "appDownload": {
+        "downloadTip": "Please Scan The QR Code to Install The App."
+    }
+}

+ 13 - 3
mobile/src/lang/index.js

@@ -1,12 +1,22 @@
 import Vue from 'vue'
 import VueI18n from 'vue-i18n'
-import zh from './_zh'
-import en from './_en'
+import zh from './zh'
+import en from './en'
 
 Vue.use(VueI18n)
 
+let current = (localStorage && localStorage.getItem('language')) || '中'
+// if (!lang) {
+//     lang = window.navigator.language || window.navigator.userLanguage || null
+//     if (lang && !/^zh/.test(lang)) {
+//         console.log('自动获取浏览器语言:' + lang)
+//         lang = 'en'
+//     }else{
+//         lang = 'zh'
+//     }
+// }
 const i18n = new VueI18n({
-  locale: 'zh',
+  locale: current,
   messages: {
     zh,
     en

+ 9 - 0
mobile/src/lang/zh/index.js

@@ -0,0 +1,9 @@
+const requireModules = require.context('./modules', true, /[a-z0-9]+\.js$/i)
+
+let zh = {}
+requireModules.keys().forEach(fileName => {  
+  let name = fileName.substr(fileName.lastIndexOf('/') + 1).replace(/\.\w+$/, '')
+  zh[name] = requireModules(fileName)
+})
+
+module.exports = zh

+ 47 - 0
mobile/src/lang/zh/modules/agent.js

@@ -0,0 +1,47 @@
+module.exports = {
+    "bannerTitle": "成为四维看看经销商",
+    "planTitle": "四维看看经销商计划概述",
+    "planDesc1": "四维时代独创的AI空间重构算法技术已屡获殊荣,并累计在全球范围采集超过30万个空间模型。",
+    "planDesc2": "这种全新的空间记录方式正在逐步改变各行各业的业务模式(房地产、建筑、文博、旅游、新闻、保险理赔、刑侦记录等等)。",
+    "planDesc3": "四维看看经销商计划诚邀各业界专业人士,参与到未来的“数字万物”的进程中,共同开拓市场,分享利润。",
+    "planDesc4": "如果您对3D捕捉世界的想法很感兴趣,并愿将其纳入到您的事业规划中,这是一个绝佳的合作机会。",
+    "advanTitle": "成为增值经销商的好处",
+    "advan": {
+        "item1Title": "利润分成",
+        "item1Sub": "丰厚的利润分成",
+        "item2Title": "专属客服",
+        "item2Sub": "提供专属的专业的销售与技术人员",
+        "item3Title": "宣传资料",
+        "item3Sub": "定期更新的宣传视频及宣传案例",
+        "item4Title": "店面布置",
+        "item4Sub": "支持店面必要的广告物料",
+        "item5Title": "发展机会",
+        "item5Sub": "参与营销与科技大会的机会"
+    },
+    "jinxiaoTitle": "成为四维看看经销商",
+    "jinxiaoForm": {
+        "companytitle": "公司信息",
+        "companyNameLabel": "公司注册名称",
+        "companyNamePlaceholder": "请输入公司注册名称",
+        "addressLabel": "公司地址",
+        "addressPlaceholder1": "国家",
+        "addressPlaceholder2": "地区",
+        "addressPlaceholder3": "请输入公司地址",
+        "storeLabel": "是否有门店或企业网站",
+        "storeType1": "线下销售为主",
+        "storeType2": "线上销售为主",
+        "storePlaceholder": "请输入门店详细地址",
+        "applytitle": "申请人信息",
+        "applyNameXing": "姓",
+        "applyNameMing": "名",
+        "applyNamePlaceholder": "请输入姓",
+        "applyNamePlaceholder1": "请输入名",
+        "positionLabel": "职位",
+        "positionPlaceholder": "请输入职位",
+        "phoneLabel": "电话",
+        "phonePlaceholder": "请输入电话",
+        "emailLabel": "电子邮箱",
+        "emailPlaceholder": "请输入电子邮箱",
+        "submit": "提交"
+    }
+}

+ 11 - 0
mobile/src/lang/zh/modules/common.js

@@ -0,0 +1,11 @@
+module.exports = {
+    "kankan": "四维看看Pro",
+    "more": "更多",
+    submit: '提交',
+    edit: '编辑',
+    formTip: '请完善表单',
+    cancle: '取消',
+    save: '保存',
+    saveAndUse: '保存并使用',
+    search: '搜索'
+}

+ 70 - 0
mobile/src/lang/zh/modules/conduct.js

@@ -0,0 +1,70 @@
+module.exports = {
+    "__name": "核心产品",
+    "coreProduct": {
+        "bannerTitle": "核心产品",
+        "itemTitle1": "AI全自动精准建模,智能测距",
+        "itemTitle2": "720度8K画质,身临其境",
+        "itemTitle3": "HDR模式平衡明暗区域曝光",
+        "itemTitle4": "球幕视频真人解说 打造沉浸视听体验",
+        "itemTitle5": "10分钟入门,快速掌握拍摄流程",
+        "itemTitle6": "10分钟全自动出结果,高效快速(约100㎡)",
+        "itemTitle7": "强大编辑后台,让空间延伸表达"
+    },
+    "coreTech": {
+        "bannerTitle": "核心技术",
+        "itemTitle1": "空间数字化",
+        "itemText1": "记录与计算相机在拍摄时的空间位置,并提取对应的3D点云,从而获取三维空间的真实情况。",
+        "itemTitle2": "空间互动",
+        "itemText2": "自动导览 预先设定路线,球幕视频 BOX视频 增强体验的互动效果,多形式动态热点 赋以空间说话的艺术。",
+        "item2Name1": "动态热点",
+        "item2Name2": "互动视频",
+        "item2Name3": "自动导览",
+        "itemTitle3": "空间展示",
+        "itemText3": "无需插件,可在手机、 平板、PC端、VR眼镜,实现720°沉浸式漫游体验。",
+        "item3Name1": "VR端",
+        "item3Name2": "网页端",
+        "item3Name3": "移动端"
+    },
+    "conductHouse": {
+        "bannerTitle": "看房",
+        bannerSubTitle: '海量复刻真房源',
+        "itemTitle1": "AI自动建模,高效复刻真实房源",
+        "itemTitle2": "房源资讯全方位展示<br/>有效提高客户粘性",
+        "itemTitle3": "地产资讯多维展示<br/>提高租售决策效率",
+        "itemTitle4": "强大功能编辑后台<br/>传递更多房源价值"
+    },
+    "conductExhibition": {
+        "bannerTitle": "看展",
+        bannerSubTitle: '随时随地参展办展',
+        "itemTitle1": "在线逛展洽谈,名片即刻获取",
+        "itemTitle2": "沟通畅通无阻,资讯一览无遗",
+        "itemTitle3": "降低搭展成本,高效促进交易",
+        "itemTitle4": "数据流量统计,用户画像分析"
+    },
+    "conductSubject": {
+        "bannerTitle": "文博",
+        bannerSubTitle: '助力打造永不落幕的博物馆',
+        "itemTitle1": "珍贵陈展线上复刻<br/>打破线下时空限制",
+        "itemTitle2": "空间交互形式多样<br/>承载丰富历史底蕴",
+        "itemTitle3": "多人实时同屏互动<br/>听专家讲述文化故事",
+        "itemTitle4": "推动社科教育宣传<br/>助力历史文化传播",
+        caseTitle: '精选案例',
+        case1: '德国国立陶瓷博物馆',
+        case2: '梁家河数字博物馆',
+        case3: '南昌汉代海昏侯国考古成果展'
+    },
+    "conductShop": {
+        "bannerTitle": "四维看店",
+        bannerSubTitle: '宅家中 云逛街 轻松买',
+        "itemTitle1": "3D数字化商圈沉浸式购物新体验",
+        "itemTitle2": "真实复刻空间手机一点就逛",
+        "itemTitle3": "汇聚线上客流拉动线下经济",
+        "itemTitle4": "私人专属客服 同屏带看实时沟通"
+    },
+    "conductSecury": {
+        "bannerTitle": "安防勘查",
+        "itemTitle1": "高效复刻灾害现场<br/>记录全面三维档案",
+        "itemTitle2": "可将现场说明直接添加至三维空间中,提高沟通质量与工作效率",
+        "itemTitle3": "支持预先采集存档<br/>减少理赔纠纷"
+    }
+}

+ 36 - 0
mobile/src/lang/zh/modules/header.js

@@ -0,0 +1,36 @@
+module.exports = {
+    "core_product": "核心产品",
+    "solutions": "行业解决方案",
+    "kankan_space": "看看空间",
+    "core_tech": "核心技术",
+    "service": "服务支持",
+    "about": "关于我们",
+    "online_shop": "在线商城",
+    "solutionsHouse": "房产营销",
+    "solutionsExi": "线上展会",
+    "solutionsSubject": "数字文博",
+    "solutionsShop": "VR购物",
+    "solutionsSec": "安防勘察",
+    "serviceApp": "APP下载",
+    "serviceUse": "使用教程",
+    "serviceBaoxiu": "保修条款",
+    "serviceVideo": "视频教程",
+    "aboutNews": "新闻资讯",
+    "aboutAgent": "成为经销商",
+    "aboutCompany": "公司介绍",
+    mallPro: '四维看看Pro',
+    mallPeijian: '精选配件',
+    addService: '增值服务',
+    myAccount: '我的账号',
+    "footer": {
+        "bannerTitle": "四维看看,让空间讲故事",
+        "find": "发现精彩",
+        "saleEmail": "销售合作",
+        "meitiEmail": "媒体采访",
+        "phone": "联系电话",
+        "find4D": "探索四维",
+        "kankan": "四维时代",
+        "zhongde": "中德人工智能研究院",
+        "moku": "四维模库"
+    }
+}

+ 50 - 0
mobile/src/lang/zh/modules/home.js

@@ -0,0 +1,50 @@
+module.exports = {
+    "bannerText": "精准实景复刻<br/>传递空间价值",
+    "bannerBuyBtnText": "立即购买",
+    "bannerMoreBtn": "了解更多",
+    "bannerIntroVideo": "介绍视频",
+    "bannerAgent": "成为经销商",
+    "plate1Title": "行业解决方案",
+    "plate2Title": "看看空间",
+    "plate3Title": "核心技术",
+    "plate4Title": "新闻资讯",
+    "plate5Title": "合作伙伴",
+    "plate1Item1": "房产营销",
+    "plate1Item2": "线上展会",
+    "plate1Item3": "数字文博",
+    "plate1Item4": "VR购物",
+    "plate1Item5": "安防勘察",
+    "plate1Item1SubTitle": "海量复刻真房源",
+    "plate1Item1Desc1": "AI自动建模,高效复刻真实房源",
+    "plate1Item1Desc2": "云带看/云讲房,全方位介绍房源信息",
+    "plate1Item1Desc3": "易上手操作,人人都能掌握拍摄流程",
+    "plate1Item1Desc4": "专业地产营销系统,高效管理租售信息",
+    "plate1Item2SubTitle": "全方位复现展会信息,全球买家在线看展",
+    "plate1Item2Desc1": "AI图像重构技术,真实还原线下布展效果",
+    "plate1Item2Desc2": "3D展品互动,720°无死角展示",
+    "plate1Item2Desc3": "同屏在线洽谈,系统可对接供采信息",
+    "plate1Item2Desc4": "自动收集展会数据,数据分析挖掘,降低获客成本",
+    "plate1Item3SubTitle": "助力打造永不落幕的博物馆",
+    "plate1Item3Desc1": "珍贵陈展3D高清记录,方便留存与保护",
+    "plate1Item3Desc2": "空间交互,让空间表达更多历史内涵",
+    "plate1Item3Desc3": "大师讲解,一带多同屏讲述文化故事",
+    "plate1Item3Desc4": "推动社科教育,促进社会参与",
+    "plate1Item4SubTitle": "海量复刻真房源",
+    "plate1Item4Desc1": "AI自动建模,高效复刻真实房源",
+    "plate1Item4Desc2": "云带看/云讲房,全方位介绍房源信息",
+    "plate1Item4Desc3": "易上手操作,人人都能掌握拍摄流程",
+    "plate1Item4Desc4": "专业地产营销系统,高效管理租售信息",
+    "plate1Item5SubTitle": "高效复刻灾害现场,记录全面三维档案",
+    "plate1Item5Desc1": "高效复刻灾害现场,记录全面三维档案",
+    "plate1Item5Desc2": "支持预先采集存档,减少理赔纠纷",
+    "plate2Item1": "雍正故宫",
+    "plate2Item2": "小米有品",
+    "plate2Item3": "华发依山郡",
+    "plate2Item4": "万豪酒店",
+    "plate3Item1Title": "空间数字化",
+    "plate3Item1Text": "自动化三维数字重建<br/>还原空间布局与结构",
+    "plate3Item2Title": "空间互动",
+    "plate3Item2Text": "自动导览<br/>互动视频多形态动态热点",
+    "plate3Item3Title": "空间展示",
+    "plate3Item3Text": "无需插件<br/>多端展示实现720°沉浸体验"
+}

+ 19 - 0
mobile/src/lang/zh/modules/introtow.js

@@ -0,0 +1,19 @@
+module.exports = {
+  deviceId: '设备ID',
+  exDot: '剩余点数',
+  dot: '点',
+  title: '点数充值,记录您的美好空间',
+  titleTip: '购买立即生效,拍摄安心存放',
+  question1: '为什么需要点数充值?',
+  answer1: '答:当您的基础点数不足99点时,最新拍摄的场景将无法生成,通过购买点数则可以计算存储更多场景。',
+  question2: '点数充值之后还可以退款吗?',
+  answer2: '答:不可以,因为点数充值之后,相应点数会立即到账生效,所以不接受中途退款,敬请谅解。',
+  question3: '删除场景后会返还点数吗?',
+  answer3: '答:点数充值没有有效期,所以消费后代表永久记录您的美好空间,删除场景后不会返还。',
+  question4: '点数不足还可继续拍摄上传吗?',
+  answer4: '答:点数不足时,不影响设备正常的拍摄,但会无法上传计算,这时只能进行删除操作;直到您的点数满足消费,此时您才可以将拍摄的场景上传计算,随之可查看、编辑和分享。',
+  openDevice: '开通设备',
+  selectVoice: '选择容量',
+  payType: '支付方式',
+  payMoney: '应付金额'
+}

+ 14 - 0
mobile/src/lang/zh/modules/kankanSpace.js

@@ -0,0 +1,14 @@
+module.exports = {
+    "title": "看看空间",
+    "typeAll": "全部",
+    "typeHouse": "地产",
+    "typeExihibition": "会展",
+    "typeSubject": "文博",
+    "typeShop": "商圈",
+    "typeFoot": "餐饮",
+    "typeOther": "其它",
+    "recommend": "精品推荐",
+    "hot": "热门浏览",
+    "new": "最新发布",
+    "placeholder": "输入搜索关键字"
+}

+ 28 - 0
mobile/src/lang/zh/modules/login.js

@@ -0,0 +1,28 @@
+module.exports = {
+  login: '登录',
+  register: '注册',
+  userLogin: '用户登录',
+  cameraLogin: '相机登录',
+  codeLogin: '验证码登录',
+  passwordLogin: '密码登录',
+  phonePlaceholder: '请输入手机号码',
+  passwordPlaceholder: '请输入密码',
+  codePlaceholder: '请输入验证码',
+  sendCodeBtnText: '获取验证码',
+  rememberPassword: '记住密码',
+  forgetPassword: '忘记密码',
+  registerAccount: '账号注册',
+  cameraLoginTip: '打开四维看看app扫一扫登录',
+  kankanAccountRegister: '四维账号注册',
+  setPassword: '设置密码',
+  rePassword: '重复密码',
+  cluse: '我已阅读并同意《四维看看用户协议》',
+  findPassword: '找回密码',
+  emailPlaceholder: '请输入邮箱地址',
+  hasAccount: '已有账号,',
+  zhijieLogin: '直接登录',
+  resendTime: '{time}s后重新发送',
+  passwordTip: '密码必须包含英文大小写、数字、长度8-16个字符',
+  currentEmailTip: '请填写正确的邮箱',
+  agreeXieyi: '请阅读并同意四维看看用户协议',
+}

+ 64 - 0
mobile/src/lang/zh/modules/mall.js

@@ -0,0 +1,64 @@
+module.exports = {
+    "postage": "运费:顺丰包邮",
+    "baseVolume": "包含基础云容量",
+    "knowMore": "了解详情",
+    "standard": "标准套餐",
+    "addCou": "增值套餐(包含三脚架)",
+    "count": "数量",
+    "couTip": "是否需要添加推荐的配件(标准套餐不含以下配件)",
+    "jiaojia": "四维看看Pro三脚架套装",
+    "jiaojiaDetail": "三脚架 + 滑轮 + 云台",
+    "cart": "加入购物车",
+    "fahuo": "预计3日内发货",
+    "product": "产品说明",
+    "techDetail": "技术参数",
+    "widthDetail": "尺寸参数",
+    cartTitle: '购物车',
+    cartTitleTip: '本订单顺丰包邮',
+    goods: '商品',
+    price: '价格',
+    mini: '小计',
+    continueBuy: '继续选购',
+    nowJieSuan: '立即结算',
+    nowBuy: '立即购买',
+    countNum: '共计{num}件商品',
+    addBuy: '加入购物',
+    confirmOrder: '确认订单',
+    submitOrder: '下单',
+    receiveAddress: '收货地址',
+    invoiceIntro: '发票信息',
+    normalInvoice: '电子普通发票',
+    zengzhiInvoice: '专用发票',
+    people: '个人',
+    enterprise: '企业',
+    wenxinTip: '温馨提示',
+    wenxinTipContent: '专票随商品一并寄出,若因特殊情况会于10天内顺丰寄送给您(如遇节假日稍有延迟)。请注意查收;增值税专用发票收到后请妥善保存,如退货请一同寄回,如退货专票未能寄回,则需扣除相应的税点。',
+    goodsInfo: '商品信息',
+    kankanPro: '四维看看Pro八目相机',
+    zhijiaName: '四维看看Pro三脚架套装',
+    goodsTotalPrice: '商品总价',
+    otherPrice: '税费及其它费用',
+    yunfei: '运费',
+    total: '合计',
+    blackColor: '静谧黑',
+    voice: '容量套餐(10G)',
+    zhijiaColor: '标准色',
+    payOrder: '付款',
+    addAddressTip: '请添加地址',
+    payCenter: '支付中心',
+    nowAccount: '当前帐号',
+    payType: '支付方式',
+    aliPay: '支付宝',
+    wechatPay: '微信支付',
+    payNum: '应付金额',
+    wechat: '微信',
+    payTip: '使用{type}app扫码完成支付',
+    noGoodsConfirm: '请选择需要购买的商品',
+    yunVoice: '关于云容量',
+    editAddress: '编辑收货地址',
+    receiver: '收货人',
+    phone: '手机号码',
+    area: '所在地区',
+    addressDetail: '详细地址',
+    nashui: '纳税人识别号'
+}

Разлика између датотеке није приказан због своје велике величине
+ 98 - 0
mobile/src/lang/zh/modules/news.js


+ 10 - 0
mobile/src/lang/zh/modules/service.js

@@ -0,0 +1,10 @@
+module.exports = {
+    "title": "服务支持",
+    "mVideo": "视频教程",
+    "use": "使用教程",
+    "app": "APP下载",
+    "clause": "保修条款",
+    appDownload: {
+      downloadTip: '使用四维看看Pro的过程中,需要下载APP控制相机。请在手机软件商店搜索“四维看看Pro”或使用手机扫描二维码安装。'
+    }
+}

+ 10 - 12
mobile/src/pages/account/codeLogin/index.vue

@@ -1,19 +1,15 @@
 <template>
   <div class="register-layout">
     <div class="login-con">
-      <h1 class="common-title">{{ $t('account.loginTitle') }}</h1>
+      <h1 class="common-title">{{ $t('login.codeLogin') }}</h1>
       <div class="input-con" :class="{inputActive:inputActive==='phone'}">
         <div class="phone-select" ref="quhaoMenu">
-          <div @click="showSelect=!showSelect">
+          <div class="phone-select-div" @click="showSelect=!showSelect">
             <span>{{codeActive[1]}}</span>
-            (<span>{{codeActive[0]}}</span>)
+            <!-- (<span>{{codeActive[0]}}</span>) -->
             <div class="sanjiao"></div>
           </div>
-          <ul v-show="showSelect" >
-            <li @click="selectItem(item)" v-for="(item,i) in selectCall" :key="i">
-              {{language==='en'?item[2]:item[0]}}{{item[1]}}
-            </li>
-          </ul>
+          <phoneSelect v-show="showSelect" @selectItem="selectItem" />
         </div>
         <input class="guding" oninput="value=value.replace(/[^\d]/g,'')" v-model="phone" @focus="inputActive='phone'" @blur="inputActive=''" type="text" :placeholder="langLogin.phone.placeholder">
       </div>
@@ -30,7 +26,7 @@
       <div class="btns" @click="submit">{{langLogin.login}}</div>
       <div class="to-login">
         <div class="lo-con">
-          <router-link :to="{path:'/forget'}">{{ $t('account.forgetPassword') }}</router-link><router-link :to="{path:'/register'}">{{langLogin.loginsub2}}</router-link>
+          <router-link :to="{path:'/forget'}">{{ $t('login.forgetPassword') }}</router-link><router-link :to="{path:'/register'}">{{langLogin.loginsub2}}</router-link>
         </div>
       </div>
     </div>
@@ -38,7 +34,7 @@
 </template>
 
 <script>
-import selectCall from '../country.js'
+import phoneSelect from '@/components/common/phoneSelect'
 import {mapState} from 'vuex'
 
 export default {
@@ -52,8 +48,7 @@ export default {
       inputActive: '',
       interTime: 60,
       jishi: false,
-      interl: null,
-      selectCall
+      interl: null
     }
   },
   computed: {
@@ -64,6 +59,9 @@ export default {
       token: state => state.user.token
     })
   },
+  components: {
+    phoneSelect
+  },
   mounted () {
     document.addEventListener('click', (e) => {
       if (this.$refs.quhaoMenu) {

+ 5 - 4
mobile/src/pages/account/codeLogin/style.scss

@@ -26,10 +26,10 @@ input[type='password']{
   color: rgba(0, 0, 0, 0.7);
 }
 .phone-select{
-  width: 104px;
+  // width: 104px;
   padding-left: 10px;
   font-size: 14px;
-  &>div{
+  &-div{
     height: 18px;
     border-right: 1px solid #909090;
     display: flex;
@@ -45,8 +45,9 @@ input[type='password']{
       border-left-color: transparent;
       border-right-color: transparent;
       border-bottom: none;
-      position: absolute;
-      right: 10px;
+      margin: 0 5px;
+      // position: absolute;
+      // right: 10px;
     }
   }
   

+ 2 - 2
mobile/src/pages/account/forget/components/emailForget.vue

@@ -8,7 +8,7 @@
           @focus="inputActive='phone'"
           @blur="inputActive=''"
           type="text"
-          :placeholder="$t('account.accountMailPlaceholder')"
+          :placeholder="$t('login.emailPlaceholder')"
         />
       </div>
       <div class="code-con">
@@ -181,7 +181,7 @@ export default {
       if (response.code !== 0) {
         return this.$toast.show('warn', this.langToast[response.code])
       }
-      this.$toast.show('warn', this.langToast['32'], () => {
+      this.$toast.show('success', this.langToast['32'], () => {
         this.$router.push({path: '/login'})
       })
     }

+ 26 - 15
mobile/src/pages/account/forget/components/phoneForget.vue

@@ -3,18 +3,12 @@
     <div class="login-con">
       <div class="input-con" :class="{inputActive:inputActive==='phone'}">
         <div class="phone-select" ref="quhaoMenu">
-          <div @click="showSelect=!showSelect">
+          <div class="phone-select-div" @click="showSelect=!showSelect">
             <span>{{codeActive[1]}}</span>
-            (<span>{{codeActive[0]}}</span>)
+            <!-- (<span>{{codeActive[0]}}</span>) -->
             <div class="sanjiao"></div>
           </div>
-          <ul v-show="showSelect">
-            <li
-              @click="selectItem(item)"
-              v-for="(item,i) in selectCall"
-              :key="i"
-            >{{language==='en'?item[2]:item[0]}}{{item[1]}}</li>
-          </ul>
+          <phoneSelect v-show="showSelect" @selectItem="selectItem" />
         </div>
         <input
           class="guding"
@@ -79,7 +73,7 @@
 
 <script>
 import {mapState} from 'vuex'
-import selectCall from '../../country.js'
+import phoneSelect from '@/components/common/phoneSelect'
 import { encodeStr } from '@/util'
 import { Base64 } from 'js-base64'
 export default {
@@ -94,7 +88,6 @@ export default {
   data () {
     return {
       showSelect: false,
-      selectCall,
       codeActive: ['中国', '+86', 'China'],
       phone: '',
       authCode: '',
@@ -105,6 +98,9 @@ export default {
       inputActive: ''
     }
   },
+  components: {
+    phoneSelect
+  },
   mounted () {
     document.addEventListener('click', (e) => {
       if (this.$refs.quhaoMenu) {
@@ -121,9 +117,24 @@ export default {
     },
 
     async getAuthCode () {
-      // if (!reg.phone.test(this.phone)) {
-      //   return
-      // }
+      let check = value => {
+        for (let i = 0, len = value.length; i < len; i++) {
+          if (!value[i].val) {
+            return this.$toast.show('warn', (this.language === 'en' ? value[i].En : value[i].name) + this.langToast['7'])
+          }
+        }
+        return true
+      }
+      let checkStr = [
+        {
+          name: '手机',
+          En: 'Phone number',
+          val: this.phone
+        }
+      ]
+      if (!check(checkStr)) {
+        return
+      }
       let res = await this.$store.dispatch('getAuthCode', {
         phone: this.phone,
         code: Number(this.codeActive[1].substr(1))
@@ -200,7 +211,7 @@ export default {
       if (response.code !== 0) {
         return this.$toast.show('warn', this.langToast[response.code])
       }
-      this.$toast.show('warn', this.langToast['32'], () => {
+      this.$toast.show('success', this.langToast['32'], () => {
         this.$router.push({path: '/login'})
       })
     }

+ 1 - 1
mobile/src/pages/account/forget/components/style.scss

@@ -30,7 +30,7 @@ input[type='password']{
   background-color: #e2e2e2;
 }
 .phone-select{
-  &>div{
+  .phone-select-div {
     height: 18px;
     border-right: 1px solid #909090;
     display: flex;

+ 8 - 4
mobile/src/pages/account/forget/index.vue

@@ -1,7 +1,7 @@
 <template>
   <div class="forget-layout">
-    <h1 class="common-title">{{ $t('account.forgetTitle') }}</h1>
-    <div v-if="!forgetComponent">
+    <h1 class="common-title">{{ $t('login.forgetPassword') }}</h1>
+    <!-- <div v-if="!forgetComponent">
       <div class="forget-home-header">
         <div class="bg"></div>
         <p>为确认您是本人操作,</p>
@@ -11,7 +11,7 @@
         <router-link to="/forget?type=phoneForget">使用手机短信验证码</router-link>
         <router-link to="/forget?type=emailForget">使用E-mail验证码</router-link>
       </div>
-    </div>
+    </div> -->
     <phoneForget v-if="forgetComponent === 'phoneForget'" />
     <emailForget v-else-if="forgetComponent === 'emailForget'" />
   </div>
@@ -20,14 +20,18 @@
 <script>
 import phoneForget from './components/phoneForget'
 import emailForget from './components/emailForget'
+import { mapState } from 'vuex'
 export default {
   components: {
     phoneForget,
     emailForget
   },
   computed: {
+    ...mapState({
+      isInternational: state => state.user.isInternational
+    }),
     forgetComponent () {
-      return this.$route.query.type
+      return this.isInternational ? 'emailForget' : 'phoneForget'
     }
   }
 }

+ 4 - 4
mobile/src/pages/account/login/index.vue

@@ -1,14 +1,14 @@
 <template>
   <div class="account-layout">
-    <h1 class="common-title">{{ $t('account.loginTitle') }}</h1>
+    <h1 class="common-title">{{ $t('login.userLogin') }}</h1>
     <div class="login-con">
       <div class="input-con" :class="{inputActive:inputActive==='text'}">
         <!-- <img :src="`${$cdn}images/icon/icon-phone@2x.png`" alt=""> -->
-        <input v-model="phone" oninput="value=value" @blur="inputActive=''" @focus="inputActive='text'" type="text" :placeholder="$t('account.accountPlaceholder')">
+        <input v-model="phone" oninput="value=value" @blur="inputActive=''" @focus="inputActive='text'" type="text" :placeholder="$t('login.phonePlaceholder')">
       </div>
       <div class="input-con"  :class="{inputActive:inputActive==='password'}">
         <!-- <img :src="`${$cdn}images/icon/icon-password@2x.png`" alt=""> -->
-        <input v-model="password" @focus="inputActive='password'" @blur="inputActive=''" maxlength='16' type="password" :placeholder="$t('account.passwordPlaceholder')">
+        <input v-model="password" @focus="inputActive='password'" @blur="inputActive=''" maxlength='16' type="password" :placeholder="$t('login.passwordPlaceholder')">
       </div>
       <div class="forget">
         <!-- <router-link :to="{path:'/forget'}">{{langLogin.forget}}</router-link> -->
@@ -18,7 +18,7 @@
       <div class="btns" @click="login">{{langLogin.login}}</div>
       <div class="to-register">
         <div class="re-con">
-          <router-link :to="{path:'/forget'}">{{$t('account.forgetPassword')}}</router-link><router-link :to="{path:'/register'}">{{$t('account.registerAccount')}}</router-link>
+          <router-link :to="{path:'/forget'}">{{$t('login.forgetPassword')}}</router-link><router-link :to="{path:'/register'}">{{$t('login.registerAccount')}}</router-link>
         </div>
       </div>
     </div>

+ 5 - 5
mobile/src/pages/account/mailRegister/index.vue

@@ -1,13 +1,13 @@
 <template>
   <div class="register-layout">
-    <h1 class="common-title">{{ $t('account.registerTitle') }}</h1>
+    <h1 class="common-title">{{ $t('login.registerTitle') }}</h1>
     <div class="login-con">
       <div class="input-con" :class="{inputActive:inputActive==='phone'}">
-        <input class="guding" oninput="value=value" v-model="phone" @focus="inputActive='phone'" @blur="inputActive=''" type="text" :placeholder="$t('account.accountMailPlaceholder')">
+        <input class="guding" oninput="value=value" v-model="phone" @focus="inputActive='phone'" @blur="inputActive=''" type="text" :placeholder="$t('login.accountMailPlaceholder')">
       </div>
       <div class="code-con">
         <div class="input-con" :class="{inputActive:inputActive==='code'}">
-          <input v-model="authCode" @focus="inputActive='code'" @blur="inputActive=''" oninput="value=value.replace(/[^\d]/g,'')" maxlength='6' style="padding-left:6px;" type="text" :placeholder="$t('account.mailCodePlaceholder')">
+          <input v-model="authCode" @focus="inputActive='code'" @blur="inputActive=''" oninput="value=value.replace(/[^\d]/g,'')" maxlength='6' style="padding-left:6px;" type="text" :placeholder="$t('login.mailCodePlaceholder')">
           <div v-if="!jishi" class="send-btn" @click="getAuthCode">{{langLogin.code.txt}}</div>
           <span class="send-btn" v-else>{{language==='en'?`Resend after ${interTime}s`:`${interTime}s后重新发送`}}</span>
         </div>
@@ -29,7 +29,7 @@
           <span v-html='langLogin.agree'></span><span style="color:#1fe4dc;text-decoration: underline;" @click="$router.push({name:'useimg',params:{id:2,type:0,name: 'agreement'}})" v-html='langLogin.cluse'></span>
         </label>
       </div>
-      <div class="btns" :class="{disAgree:!isAgree}" @click="submit">{{ $t('account.register') }}</div>
+      <div class="btns" :class="{disAgree:!isAgree}" @click="submit">{{ $t('login.register') }}</div>
       <div class="to-login">
         <div class="lo-con">
           {{langLogin.resigter1}}<router-link :to="{path:'/login'}">{{langLogin.resigter2}}</router-link>
@@ -177,7 +177,7 @@ export default {
       if (response.code !== 0) {
         return this.$toast.show('warn', this.langToast[response.code])
       }
-      this.$toast.show('warn', this.langToast['23'], () => {
+      this.$toast.show('success', this.langToast['23'], () => {
         this.$router.push({path: '/login'})
       })
     }

+ 1 - 1
mobile/src/pages/account/manage/change/index.vue

@@ -149,7 +149,7 @@ export default {
       if (response.code !== 0) {
         return this.$toast.show('warn', this.langToast[response.code])
       }
-      this.$toast.show('warn', this.langToast['32'], () => {
+      this.$toast.show('success', this.langToast['32'], () => {
         this.$store.commit('logout')
         this.$router.push({path: '/login'})
       })

+ 38 - 26
mobile/src/pages/account/register/index.vue

@@ -1,22 +1,18 @@
 <template>
   <div class="register-layout">
-    <h1 class="common-title">{{ $t('account.registerTitle') }}</h1>
+    <h1 class="common-title">{{ $t('login.kankanAccountRegister') }}</h1>
     <div class="login-con">
-      <div class="input-con" :class="{inputActive:inputActive==='nickname'}">
+      <!-- <div class="input-con" :class="{inputActive:inputActive==='nickname'}">
         <input v-model="nickname" @focus="inputActive='nickname'" @blur="inputActive=''" type="text" :placeholder="langLogin.userName.placeholder">
-      </div>
+      </div> -->
       <div class="input-con" :class="{inputActive:inputActive==='phone'}">
         <div class="phone-select" ref="quhaoMenu">
-          <div @click="showSelect=!showSelect">
+          <div class="phone-select-w" @click="showSelect=!showSelect">
             <span>{{codeActive[1]}}</span>
-            (<span>{{codeActive[0]}}</span>)
+            <!-- (<span>{{codeActive[0]}}</span>) -->
             <div class="sanjiao"></div>
           </div>
-          <ul v-show="showSelect" >
-            <li @click="selectItem(item)" v-for="(item,i) in selectCall" :key="i">
-              {{language==='en'?item[2]:item[0]}}{{item[1]}}
-            </li>
-          </ul>
+          <phoneSelect v-show="showSelect" @selectItem="selectItem" />
         </div>
         <input class="guding" oninput="value=value.replace(/[^\d]/g,'')" v-model="phone" @focus="inputActive='phone'" @blur="inputActive=''" type="text" :placeholder="langLogin.phone.placeholder">
       </div>
@@ -33,9 +29,9 @@
       <div class="input-con"  :class="{inputActive:inputActive==='confirm'}">
         <input v-model="confirmPass" @focus="inputActive='confirm'" @blur="inputActive=''" maxlength="16" type="password" :placeholder="langLogin.comfirmpass.placeholder">
       </div>
-      <div class="toMail">
+      <!-- <div class="toMail">
         <router-link to="/mailRegister">邮箱注册</router-link>
-      </div>
+      </div> -->
       <div class="agree">
         <label class="check-con" @click="isAgree=!isAgree">
           <span class="check-box">
@@ -44,7 +40,7 @@
           <span v-html='langLogin.agree'></span><span style="color:#1fe4dc;text-decoration: underline;" @click="$router.push({name:'useimg',params:{id:2,type:0,name: 'agreement'}})" v-html='langLogin.cluse'></span>
         </label>
       </div>
-      <div class="btns" :class="{disAgree:!isAgree}" @click="submit">{{ $t('account.register') }}</div>
+      <div class="btns" :class="{disAgree:!isAgree}" @click="submit">{{ $t('login.register') }}</div>
       <div class="to-login">
         <div class="lo-con">
           {{langLogin.resigter1}}<router-link :to="{path:'/login'}">{{langLogin.resigter2}}</router-link>
@@ -55,7 +51,7 @@
 </template>
 
 <script>
-import selectCall from '../country.js'
+import phoneSelect from '@/components/common/phoneSelect'
 import {mapState} from 'vuex'
 import { encodeStr } from '@/util'
 import { Base64 } from 'js-base64'
@@ -80,10 +76,12 @@ export default {
       interTime: 60,
       jishi: false,
       interl: null,
-      selectCall,
       isAgree: true
     }
   },
+  components: {
+    phoneSelect
+  },
   mounted () {
     document.addEventListener('click', (e) => {
       if (this.$refs.quhaoMenu) {
@@ -100,10 +98,24 @@ export default {
       this.codeActive = item
     },
     async getAuthCode () {
-      // if (!reg.phone.test(this.phone)) {
-      //   return
-      // }
-
+      let check = value => {
+        for (let i = 0, len = value.length; i < len; i++) {
+          if (!value[i].val) {
+            return this.$toast.show('warn', (this.language === 'en' ? value[i].En : value[i].name) + this.langToast['7'])
+          }
+        }
+        return true
+      }
+      let checkStr = [
+        {
+          name: '手机',
+          En: 'Phone number',
+          val: this.phone
+        }
+      ]
+      if (!check(checkStr)) {
+        return
+      }
       let res = await this.$store.dispatch('getAuthCode', {
         phone: this.phone,
         code: Number(this.codeActive[1].substr(1)),
@@ -138,11 +150,11 @@ export default {
         return true
       }
       let checkStr = [
-        {
-          name: '昵称',
-          En: 'User name',
-          val: this.nickname
-        },
+        // {
+        //   name: '昵称',
+        //   En: 'User name',
+        //   val: this.nickname
+        // },
         {
           name: '手机',
           En: 'Phone number',
@@ -179,7 +191,7 @@ export default {
         password: temp[0],
         phoneNum: this.phone,
         msgAuthCode: this.authCode,
-        nickName: this.nickname,
+        nickName: this.phone,
         country,
         confirmPwd: temp[1]
       }
@@ -192,7 +204,7 @@ export default {
       if (response.code !== 0) {
         return this.$toast.show('warn', this.langToast[response.code])
       }
-      this.$toast.show('warn', this.langToast['23'], () => {
+      this.$toast.show('success', this.langToast['23'], () => {
         this.$router.push({path: '/login'})
       })
     }

+ 1 - 1
mobile/src/pages/account/register/style.scss

@@ -30,7 +30,7 @@ input[type='password']{
   background-color: #e2e2e2;
 }
 .phone-select{
-  &>div{
+  &-w{
     height: 18px;
     border-right: 1px solid #909090;
     display: flex;

+ 13 - 13
mobile/src/pages/agent/index.vue

@@ -13,7 +13,7 @@
       <p>{{ $t('agent.planDesc4') }}</p>
     </div>
     <div class="mobile3">
-      <h1 class="common-title">{{ $t('agent.benefitTitle') }}</h1>
+      <h1 class="common-title">{{ $t('agent.advanTitle') }}</h1>
       <ul class="benefits">
         <li v-for="(item, index) in benefitGroup" :key="index">
           <div class="icon-bg" :style="{'background-image': `url(${item.img})`}"></div>
@@ -23,7 +23,7 @@
       </ul>
     </div>
     <div class="mobile4">
-      <p class="common-title">{{ $t('agent.title') }}</p>
+      <p class="common-title">{{ $t('agent.jinxiaoTitle') }}</p>
       <div class="info">
         <div class="input-con">
           <div class="f-title">{{langAgent.jingxiaoshang.companytitle}}</div>
@@ -107,7 +107,7 @@
       </div>
 
       <div class="btns-con">
-        <div class="btns" @click="submit">{{ $t('agent.submitText') }}</div>
+        <div class="btns" @click="submit">{{ $t('agent.jinxiaoForm.submit') }}</div>
       </div>
     </div>
   </div>
@@ -131,28 +131,28 @@ export default {
     let benefitGroup = [
       {
         img: require('@/assets/images/refactor/agent/ad1.png'),
-        title: i18n.t('agent.benefitName1'),
-        sub: i18n.t('agent.benefitDesc1')
+        title: i18n.t('agent.advan.item1Title'),
+        sub: i18n.t('agent.advan.item1Sub')
       },
       {
         img: require('@/assets/images/refactor/agent/ad2.png'),
-        title: i18n.t('agent.benefitName2'),
-        sub: i18n.t('agent.benefitDesc2')
+        title: i18n.t('agent.advan.item2Title'),
+        sub: i18n.t('agent.advan.item2Sub')
       },
       {
         img: require('@/assets/images/refactor/agent/ad3.png'),
-        title: i18n.t('agent.benefitName3'),
-        sub: i18n.t('agent.benefitDesc3')
+        title: i18n.t('agent.advan.item3Title'),
+        sub: i18n.t('agent.advan.item3Sub')
       },
       {
         img: require('@/assets/images/refactor/agent/ad4.png'),
-        title: i18n.t('agent.benefitName4'),
-        sub: i18n.t('agent.benefitDesc4')
+        title: i18n.t('agent.advan.item4Title'),
+        sub: i18n.t('agent.advan.item4Sub')
       },
       {
         img: require('@/assets/images/refactor/agent/ad5.png'),
-        title: i18n.t('agent.benefitName5'),
-        sub: i18n.t('agent.benefitDesc5')
+        title: i18n.t('agent.advan.item5Title'),
+        sub: i18n.t('agent.advan.item5Sub')
       }
     ]
 

+ 2 - 3
mobile/src/pages/agent/style.scss

@@ -16,12 +16,11 @@
   input{
     border: 0;
     width: 100%;
-    height: 40px;
-    line-height: 38px;
+    // height: 40px;
+    line-height: 36px;
     padding: 0;
     font-size: 12px;
     color: #909090;
-    
   }
 }
 

+ 40 - 27
mobile/src/pages/cases/index.vue

@@ -2,19 +2,27 @@
   <div class="cases-con">
     <div class="nav-hot">
       <div class="nav-type">
-        <div class="type-name" @click="showSelectType=true">{{ activeType.name }}</div>
-        <div class="search">
+        <!-- <div class="type-name" @click.stop="showSelectType=true">{{ activeType.name }}</div> -->
+        <!-- <div class="search">
           <h-icon class="search-icon" type="sousuo" @click="showInput=true"></h-icon>
           <div class="search-w" v-show="showInput">
             <input type="text" placeholder="请输入关键字查找" v-model="searchKey">
             <h-icon type="guanbi" @click="searchKey='';showInput=false"></h-icon>
           </div>
-        </div>
-        <ul class="type-ul" v-show="showSelectType">
-          <li :class="{active:typesActive===item.value}"  v-for="(item,index) in types" :key="index"  @click="changeType(item)">
+        </div> -->
+        <swiper class="swiper-wrapper type-ul" :options="swiperOption">
+          <swiper-slide
+            class="type-li"
+            :class="{'is-active':typesActive===item.value}"  v-for="(item,index) in types" :key="index"
+          >
+            <span @click="changeType(item)">{{item.name}}</span>
+          </swiper-slide>
+        </swiper>
+        <!-- <ul class="type-ul">
+          <li :class="{'is-active':typesActive===item.value}"  v-for="(item,index) in types" :key="index"  @click="changeType(item)">
            <span>{{item.name}}</span>
           </li>
-        </ul>
+        </ul> -->
       </div>
       <div class="list-navs">
         <ul>
@@ -35,7 +43,7 @@
                 <span>{{item.viewCount}}</span>
               </div>
           </div>
-          <p class="b-text3">{{langCases.create}}:{{item.nickName}}</p>
+          <!-- <p class="b-text3">{{langCases.create}}:{{item.nickName}}</p> -->
           <!-- <p class="b-text3">{{langCases.view}}:{{item.viewCount}}</p> -->
         </div>
       </template>
@@ -107,50 +115,56 @@ export default {
       activeName: '全部',
       scene: [],
       showSelectType: false,
+      swiperOption: {
+        slidesPerView: 'auto',
+        autoplay: false,
+        freeMode: true,
+        normalizeSlideIndex: false
+      },
       sortArr: [
         {
           id: 1,
-          name: '精品推荐',
+          name: this.$t('kankanSpace.recommend'),
           icon: 'case_recommend'
         },
         {
           id: 3,
-          name: '热门浏览',
+          name: this.$t('kankanSpace.hot'),
           icon: 'case_hot'
         },
         {
           id: 2,
-          name: '最新发布',
+          name: this.$t('kankanSpace.new'),
           icon: 'case_new'
         }
       ],
       types: [
         {
-          name: '全部',
+          name: this.$t('kankanSpace.typeAll'),
           value: ''
         },
         {
-          name: '房地产',
+          name: this.$t('kankanSpace.typeHouse'),
           value: 2
         },
         {
-          name: '博物馆',
+          name: this.$t('kankanSpace.typeSubject'),
           value: 1
         },
         {
-          name: '电商',
+          name: this.$t('kankanSpace.typeShop'),
           value: 3
         },
+        // {
+        //   name: '家居',
+        //   value: 5
+        // },
         {
-          name: '家居',
-          value: 5
-        },
-        {
-          name: '餐饮',
+          name: this.$t('kankanSpace.typeFoot'),
           value: 4
         },
         {
-          name: '其他',
+          name: this.$t('kankanSpace.typeOther'),
           value: 0
         }
       ]
@@ -218,13 +232,6 @@ export default {
     }
   },
   mounted () {
-    document.addEventListener('click', (e) => {
-      if (this.$refs.mbMenu) {
-        if (!this.$refs.mbMenu.contains(e.target)) {
-          this.selectedActive = false
-        }
-      }
-    })
     this.getData()
   }
 }
@@ -232,4 +239,10 @@ export default {
 
 <style lang="scss" scoped>
 @import './style.scss';
+.search-icon {
+  font-size: 20px;
+}
+.type-ul {
+  display: flex;
+}
 </style>

+ 37 - 105
mobile/src/pages/cases/style.scss

@@ -17,16 +17,16 @@
       display: flex;
       justify-content: space-between;
       align-items: center;
-      ul{
+      ul {
         display: flex;
         justify-content: space-between;
         li{
           display: inline-block;
           padding: 10px 0;
-          color: #777777;
+          color: #909090;
         }
         .active{
-          color: #1fe4dc;
+          color: #202020;
         }
         span {
           margin-right: 29px;
@@ -94,74 +94,43 @@
       }
     }
     .nav-type{
-      height: 50px;
-      display: flex;
-      align-items: center;
+      
       border-bottom: 1px solid #EBEBEB;
       position: relative;
-      .type-name {
-        padding-left: 20px;
-        font-size: 14px;
-        &::after {
-          content: '';
-          display: inline-block;
-          border: 5px solid #909090;
-          border-bottom: none;
-          border-top-width: 8px;
-          border-left-color: transparent;
-          border-right-color: transparent;
-          margin-left: 7px;
-        }
-      }
-      .search {
-        flex: 1;
-        text-align: right;
-        padding-right: 22px;
-        background: #fff;
-      }
-      .search-w {
-        position: absolute;
-        left: 0;
-        top: 0;
+      .type-ul {
+        height: 50px;
         line-height: 50px;
-        display: flex;
-        width: 100%;
-        padding-right: 24px;
-        background: #fff;
-        z-index: 100;
-        input {
-          border: none;
-          padding-left: 20px;
-          flex: 1;
-        }
-      }
-      .type-ul{
-        position: absolute;
-        background: #fff;
-        left: 0;
-        width: 100px;
-        bottom: 0;
-        transform: translate(0, 100%);
-        border-bottom: 1px solid #ebebeb;
-        border-right: 1px solid #ebebeb;
-        &::-webkit-scrollbar{
-          display: none;
-        }
-        li{
-          text-align: left;
-          padding-left: 20px;
-          span{
-            font-size: 14px;
-            line-height: 40px;
-          } 
-          
-        }
-        .active{
-          span{
-            border-bottom: 2px solid #1fe4dc;
-            font-weight: 700;
-            color: #1fe4dc;
-            padding-bottom: 5px;
+        color: #909090;
+        .type-li {
+          font-size: 14px;
+          color: #909090;
+          padding: 0 15px;
+          position: relative;
+          line-height: 20px;
+          font-weight: bold;
+          line-height: 50px;
+          width: auto;
+          &:first-child {
+            padding-left: 20px;
+          }
+          &:last-child {
+            padding-right: 20px;
+            &::after {
+              display: none;
+            }
+          }
+          &.is-active {
+            color: #202020;
+          }
+          &::after {
+            content: '';
+            display: block;
+            height: 14px;
+            width: 1px;
+            background: #909090;
+            position: absolute;
+            right: 0;
+            top: 18px;
           }
         }
       }
@@ -206,42 +175,5 @@
     // border-left: #e5e5e5 1px solid;
     height: 100%;
     margin-bottom: 20px;
-    & /deep/ .layout {
-      text-align: center;
-      margin-top: 20px;
-    }
-    & /deep/ .layout a:not(:last-child) {
-      margin: 10px 8px;
-      font-size: 16px;
-      display: inline-block;
-      font-weight: 500;
-      cursor: pointer;
-      user-select: none;
-      color: #999;
-      position: relative;
-      transition: color 0.3s;
-    }
-
-    & /deep/ .layout a:not(:last-child).active::after,
-    & /deep/ .layout a:not(:last-child).active,
-    & /deep/ .layout a:not(:last-child):hover,
-    & /deep/ .layout a:not(:last-child):hover::after {
-      color: #111111;
-      transform: scaleX(1);
-    }
-
-    & /deep/ .layout a:not(:last-child)::after {
-      content: "";
-      height: 3px;
-      width: 140%;
-      background-color: #111;
-      display: block;
-      margin-left: -20%;
-      margin-top: 3px;
-      transform-origin: 50% 50%;
-      transform: scaleX(0);
-      will-change: transform;
-      transition: transform 0.3s;
-    }
   }
 }

+ 10 - 6
mobile/src/pages/conduct/exhibition/index.vue

@@ -1,8 +1,8 @@
 <template>
   <div class="conduct-exhibition">
     <div class="banner">
-      <h1>{{ $t('conduct.exhibition.bannerTitle') }}</h1>
-      <h4>{{ $t('conduct.exhibition.bannerSubTitle') }}</h4>
+      <h1 v-html="$t('conduct.conductExhibition.bannerTitle')"></h1>
+      <h4 v-html="$t('conduct.conductExhibition.bannerSubTitle')"></h4>
     </div>
     <ul class="desc-video">
       <li v-for="item in list" :key="item.name">
@@ -20,19 +20,19 @@ export default {
     return {
       list: [
         {
-          name: i18n.t('conduct.exhibition.title1'),
+          name: i18n.t('conduct.conductExhibition.itemTitle1'),
           img: require('@/assets/images/refactor/conduct/exhibition/item1.png')
         },
         {
-          name: i18n.t('conduct.exhibition.title2'),
+          name: i18n.t('conduct.conductExhibition.itemTitle2'),
           img: require('@/assets/images/refactor/conduct/exhibition/item2.png')
         },
         {
-          name: i18n.t('conduct.exhibition.title3'),
+          name: i18n.t('conduct.conductExhibition.itemTitle3'),
           img: require('@/assets/images/refactor/conduct/exhibition/item3.png')
         },
         {
-          name: i18n.t('conduct.exhibition.title4'),
+          name: i18n.t('conduct.conductExhibition.itemTitle4'),
           img: require('@/assets/images/refactor/conduct/exhibition/item4.png')
         }
       ]
@@ -57,6 +57,10 @@ export default {
     background: url(~@/assets/images/refactor/conduct/exhibition/banner.png) no-repeat center center;
     background-size: cover;
   }
+  h4 {
+    font-size: 16px;
+    margin-top: 20px;
+  }
   ul {
     padding: 27px 20px 0;
   }

+ 10 - 6
mobile/src/pages/conduct/house/index.vue

@@ -1,8 +1,8 @@
 <template>
   <div class="conduct-houst">
     <div class="banner">
-      <h1>{{ $t('conduct.house.bannerTitle') }}</h1>
-      <h4>{{ $t('conduct.house.bannerSubTitle') }}</h4>
+      <h1 v-html="$t('conduct.conductHouse.bannerTitle')"></h1>
+      <h4 v-html="$t('conduct.conductHouse.bannerSubTitle')"></h4>
     </div>
     <ul class="desc-video">
       <li v-for="item in list" :key="item.name">
@@ -20,19 +20,19 @@ export default {
     return {
       list: [
         {
-          name: i18n.t('conduct.house.title1'),
+          name: i18n.t('conduct.conductHouse.itemTitle1'),
           img: require('@/assets/images/refactor/conduct/house/item1.png')
         },
         {
-          name: i18n.t('conduct.house.title2'),
+          name: i18n.t('conduct.conductHouse.itemTitle2'),
           img: require('@/assets/images/refactor/conduct/house/item2.png')
         },
         {
-          name: i18n.t('conduct.house.title3'),
+          name: i18n.t('conduct.conductHouse.itemTitle3'),
           img: require('@/assets/images/refactor/conduct/house/item3.png')
         },
         {
-          name: i18n.t('conduct.house.title4'),
+          name: i18n.t('conduct.conductHouse.itemTitle4'),
           img: require('@/assets/images/refactor/conduct/house/item4.png')
         }
       ]
@@ -57,6 +57,10 @@ export default {
     background: url(~@/assets/images/refactor/conduct/house/banner.png) no-repeat center center;
     background-size: cover;
   }
+  h4 {
+    font-size: 16px;
+    margin-top: 20px;
+  }
   ul {
     padding: 27px 20px 0;
   }

+ 8 - 4
mobile/src/pages/conduct/secury/index.vue

@@ -1,7 +1,7 @@
 <template>
   <div class="conduct-secury">
     <div class="banner">
-      <h1>{{ $t('conduct.secury.bannerTitle') }}</h1>
+      <h1>{{ $t('conduct.conductSecury.bannerTitle') }}</h1>
     </div>
     <ul class="desc-video">
       <li v-for="item in list" :key="item.name">
@@ -19,15 +19,15 @@ export default {
     return {
       list: [
         {
-          name: i18n.t('conduct.secury.title1'),
+          name: i18n.t('conduct.conductSecury.itemTitle1'),
           img: require('@/assets/images/refactor/conduct/secury/item1.png')
         },
         {
-          name: i18n.t('conduct.secury.title2'),
+          name: i18n.t('conduct.conductSecury.itemTitle2'),
           img: require('@/assets/images/refactor/conduct/secury/item2.png')
         },
         {
-          name: i18n.t('conduct.secury.title3'),
+          name: i18n.t('conduct.conductSecury.itemTitle3'),
           img: require('@/assets/images/refactor/conduct/secury/item3.png')
         }
       ]
@@ -52,6 +52,10 @@ export default {
     background: url(~@/assets/images/refactor/conduct/secury/banner.png) no-repeat center center;
     background-size: cover;
   }
+  h4 {
+    font-size: 16px;
+    margin-top: 20px;
+  }
   ul {
     padding: 27px 20px 0;
   }

+ 10 - 6
mobile/src/pages/conduct/shop/index.vue

@@ -1,8 +1,8 @@
 <template>
   <div class="conduct-shop">
     <div class="banner">
-      <h1>{{ $t('conduct.shop.bannerTitle') }}</h1>
-      <h4>{{ $t('conduct.shop.bannerSubTitle') }}</h4>
+      <h1 v-html="$t('conduct.conductShop.bannerTitle')"></h1>
+      <h4 v-html="$t('conduct.conductShop.bannerSubTitle')"></h4>
     </div>
     <ul class="desc-video">
       <li v-for="item in list" :key="item.name">
@@ -20,19 +20,19 @@ export default {
     return {
       list: [
         {
-          name: i18n.t('conduct.shop.title1'),
+          name: i18n.t('conduct.conductShop.itemTitle1'),
           img: require('@/assets/images/refactor/conduct/shop/item1.png')
         },
         {
-          name: i18n.t('conduct.shop.title2'),
+          name: i18n.t('conduct.conductShop.itemTitle2'),
           img: require('@/assets/images/refactor/conduct/shop/item2.png')
         },
         {
-          name: i18n.t('conduct.shop.title3'),
+          name: i18n.t('conduct.conductShop.itemTitle3'),
           img: require('@/assets/images/refactor/conduct/shop/item3.png')
         },
         {
-          name: i18n.t('conduct.shop.title4'),
+          name: i18n.t('conduct.conductShop.itemTitle4'),
           img: require('@/assets/images/refactor/conduct/shop/item4.png')
         }
       ]
@@ -57,6 +57,10 @@ export default {
     background: url(~@/assets/images/refactor/conduct/shop/banner.png) no-repeat center center;
     background-size: cover;
   }
+  h4 {
+    font-size: 16px;
+    margin-top: 20px;
+  }
   ul {
     padding: 27px 20px 0;
   }

+ 16 - 12
mobile/src/pages/conduct/subject/index.vue

@@ -1,8 +1,8 @@
 <template>
   <div class="conduct-subject">
     <div class="banner">
-      <h1>{{ $t('conduct.subject.bannerTitle') }}</h1>
-      <h4>{{ $t('conduct.subject.bannerSubTitle') }}</h4>
+      <h1 v-html="$t('conduct.conductSubject.bannerTitle')"></h1>
+      <h4 v-html="$t('conduct.conductSubject.bannerSubTitle')"></h4>
     </div>
     <ul class="list">
       <li v-for="item in list" :key="item.name">
@@ -11,7 +11,7 @@
       </li>
     </ul>
     <div class="case-list">
-      <h1 class="common-title">{{ $t('conduct.subject.caseTitle') }}
+      <h1 class="common-title">{{ $t('conduct.conductSubject.caseTitle') }}
         <span class="more" @click="$router.push('/cases/博物馆')">{{ $t('common.more') }}></span>
       </h1>
       <ul>
@@ -31,37 +31,37 @@ export default {
     return {
       list: [
         {
-          name: i18n.t('conduct.subject.title1'),
+          name: i18n.t('conduct.conductSubject.itemTitle1'),
           img: require('@/assets/images/refactor/conduct/subject/item1.png')
         },
         {
-          name: i18n.t('conduct.subject.title2'),
+          name: i18n.t('conduct.conductSubject.itemTitle2'),
           img: require('@/assets/images/refactor/conduct/subject/item2.png')
         },
         {
-          name: i18n.t('conduct.subject.title3'),
+          name: i18n.t('conduct.conductSubject.itemTitle3'),
           img: require('@/assets/images/refactor/conduct/subject/item3.png')
         },
         {
-          name: i18n.t('conduct.subject.title4'),
+          name: i18n.t('conduct.conductSubject.itemTitle4'),
           img: require('@/assets/images/refactor/conduct/subject/item4.png')
         }
       ],
       cases: [
         {
-          name: i18n.t('conduct.subject.case1'),
+          name: i18n.t('conduct.conductSubject.case1'),
           img: require('@/assets/images/refactor/conduct/subject/case1.png'),
           link: 'https://www.4dkankan.com/showPC.html?m=X99yIvTq'
         },
         {
-          name: i18n.t('conduct.subject.case2'),
+          name: i18n.t('conduct.conductSubject.case2'),
           img: require('@/assets/images/refactor/conduct/subject/case2.png'),
-          link: ''
+          link: 'https://4dkanzhan.4dkankan.com/LiangJiaHe/index.html'
         },
         {
-          name: i18n.t('conduct.subject.case3'),
+          name: i18n.t('conduct.conductSubject.case3'),
           img: require('@/assets/images/refactor/conduct/subject/case3.png'),
-          link: 'https://www.4dkankan.com/showPC.html?m=laaVIiT7'
+          link: 'https://admin.4dmuseum.cn/showPC.html?m=55&bigScene=&novr='
         }
       ]
     }
@@ -91,6 +91,10 @@ export default {
     background: url(~@/assets/images/refactor/conduct/subject/banner.png) no-repeat center center;
     background-size: cover;
   }
+  h4 {
+    font-size: 16px;
+    margin-top: 20px;
+  }
   &>ul {
     padding: 27px 20px 0;
     li {

+ 10 - 16
mobile/src/pages/coreProduct/index.vue

@@ -1,7 +1,7 @@
 <template>
   <div class="coreProduct">
     <div class="banner">
-      <!-- {{ $t('coreProduct.bannerTitle') }} -->
+      {{ $t('conduct.coreProduct.bannerTitle') }}
     </div>
     <ul class="desc-video">
       <li v-for="item in videoArr" :key="item.name">
@@ -24,43 +24,37 @@ export default {
     return {
       videoArr: [
         {
-          name: i18n.t('coreProduct.title1'),
+          name: i18n.t('conduct.coreProduct.itemTitle1'),
           img: 1,
           post: 1,
           runAnimation: true
         },
         {
-          name: i18n.t('coreProduct.title2'),
+          name: i18n.t('conduct.coreProduct.itemTitle2'),
           img: 2,
           post: 2,
           runAnimation: true
         },
         {
-          name: i18n.t('coreProduct.title3'),
-          img: 2,
-          post: 2,
-          runAnimation: true
-        },
-        {
-          name: i18n.t('coreProduct.title4'),
-          img: 2,
-          post: 2,
+          name: i18n.t('conduct.coreProduct.itemTitle4'),
+          img: 6,
+          post: 6,
           runAnimation: true
         },
         {
-          name: i18n.t('coreProduct.title5'),
+          name: i18n.t('conduct.coreProduct.itemTitle5'),
           img: 3,
           post: 3,
           runAnimation: true
         },
         {
-          name: i18n.t('coreProduct.title6'),
+          name: i18n.t('conduct.coreProduct.itemTitle6'),
           img: 4,
           post: 4,
           runAnimation: true
         },
         {
-          name: i18n.t('coreProduct.title7'),
+          name: i18n.t('conduct.coreProduct.itemTitle7'),
           img: 5,
           post: 5,
           runAnimation: true
@@ -83,7 +77,7 @@ export default {
     color: #202020;
     font-weight: bold;
     background: #D4D4D4;
-    background: url(~@/assets/images/refactor/coreProduct/banner.png);
+    background: url(~@/assets/images/refactor/coreProduct/banner.jpg);
     background-size: cover;
   }
   .desc-video {

+ 56 - 31
mobile/src/pages/home/components/plate2.vue

@@ -1,19 +1,21 @@
 <template>
   <div class="plate02">
-    <h1 class="common-title">行业解决方案</h1>
+    <h1 class="common-title">{{$t('home.plate1Title')}}</h1>
     <swiper class="swiper-wrapper" :options="swiperOption">
       <swiper-slide
         class="swiper-slide"
         v-for="(item,i) in items"
         :key="i"
       >
-        <img :src="item.img" alt="">
-        <div class="plate02-desc">
-          <h3 >{{ item.title }}</h3>
-          <p>{{ item.desc }}</p>
-          <ul>
-            <li v-for="text in item.list" :key="text">{{ text }}</li>
-          </ul>
+        <div @click="handleClick(item)">
+          <img :src="item.img" alt="">
+          <div class="plate02-desc" :class="decsHeight">
+            <h3 >{{ item.title }}</h3>
+            <p>{{ item.desc }}</p>
+            <ul>
+              <li v-for="text in item.list" :key="text">{{ text }}</li>
+            </ul>
+          </div>
         </div>
       </swiper-slide>
     </swiper>
@@ -21,46 +23,49 @@
 </template>
 
 <script>
+import { mapState } from 'vuex'
 export default {
   data () {
     return {
       items: [
         {
-          title: '房产营销',
-          title_sub: '房产营销',
-          desc: '海量复刻真房源',
+          title: this.$t('home.plate1Item1'),
+          title_sub: this.$t('home.plate1Item1'),
+          desc: this.$t('home.plate1Item1SubTitle'),
           img: require('@/assets/images/refactor/home/plate02-1.png'),
-          list: ['AI自动建模,高效复刻真实房源', '云带看/云讲房,全方位介绍房源信息', '易上手操作,人人都能掌握拍摄流程', '专业地产营销系统,高效管理租售信息'],
-          link: '/conductHouse'
+          list: [this.$t('home.plate1Item1Desc1'), this.$t('home.plate1Item1Desc2'), this.$t('home.plate1Item1Desc3'), this.$t('home.plate1Item1Desc4')],
+          link: '/conduct/house'
         }, {
-          title: '线上展会',
-          title_sub: '线上展会',
-          desc: '全方位复现展会信息,全球买家在线看展',
+          title: this.$t('home.plate1Item2'),
+          title_sub: this.$t('home.plate1Item2'),
+          desc: this.$t('home.plate1Item2SubTitle'),
           img: require('@/assets/images/refactor/home/plate02-2.png'),
-          list: ['AI图像重构技术,真实还原线下布展效果', '3D展品互动,720°无死角展示', '同屏在线洽谈,系统可对接供采信息', '自动收集展会数据,数据分析挖掘,降低获客成本'],
-          link: '/conductExhibition'
+          list: [this.$t('home.plate1Item2Desc1'), this.$t('home.plate1Item2Desc2'), this.$t('home.plate1Item2Desc3'), this.$t('home.plate1Item2Desc4')],
+          link: '/conduct/exhibition'
         },
         {
-          title: '数字文博',
-          title_sub: '数字文博',
-          desc: '助力打造永不落幕的博物馆',
+          title: this.$t('home.plate1Item3'),
+          title_sub: this.$t('home.plate1Item3'),
+          desc: this.$t('home.plate1Item3SubTitle'),
           img: require('@/assets/images/refactor/home/plate02-1.png'),
-          list: ['珍贵陈展3D高清记录,方便留存与保护', '空间交互,让空间表达更多历史内涵', '大师讲解,一带多同屏讲述文化故事', '推动社科教育,促进社会参与'],
-          link: '/conductSubject'
+          list: [this.$t('home.plate1Item3Desc1'), this.$t('home.plate1Item3Desc2'), this.$t('home.plate1Item3Desc3'), this.$t('home.plate1Item3Desc4')],
+          link: '/conduct/subject'
         },
         {
-          title: 'VR购物',
-          title_sub: 'VR购物',
-          desc: '海量复刻真房源',
+          title: this.$t('home.plate1Item4'),
+          title_sub: this.$t('home.plate1Item4'),
+          desc: this.$t('home.plate1Item4SubTitle'),
           img: require('@/assets/images/refactor/home/plate02-1.png'),
-          list: ['AI自动建模,高效复刻真实房源', '云带看/云讲房,全方位介绍房源信息', '易上手操作,人人都能掌握拍摄流程', '专业地产营销系统,高效管理租售信息']
+          list: [this.$t('home.plate1Item4Desc1'), this.$t('home.plate1Item4Desc2'), this.$t('home.plate1Item4Desc3'), this.$t('home.plate1Item4Desc4')],
+          link: '/conduct/shop'
         },
         {
-          title: '安防勘查',
-          title_sub: '安防勘查',
-          desc: '高效复刻灾害现场,记录全面三维档案',
+          title: this.$t('home.plate1Item5'),
+          title_sub: this.$t('home.plate1Item5'),
+          desc: this.$t('home.plate1Item5SubTitle'),
           img: require('@/assets/images/refactor/home/plate02-1.png'),
-          list: ['高效复刻灾害现场,记录全面三维档案', '支持预先采集存档,减少理赔纠纷']
+          list: [this.$t('home.plate1Item5Desc1'), this.$t('home.plate1Item5Desc2')],
+          link: '/conduct/secury'
         }
       ],
       swiperOption: {
@@ -69,6 +74,23 @@ export default {
         spaceBetween: 20
       }
     }
+  },
+  computed: {
+    ...mapState({
+      language: state => state.language.current
+    }),
+    decsHeight () {
+      const heightMap = {
+        'zh': '',
+        'en': 'en-class'
+      }
+      return heightMap[this.language]
+    }
+  },
+  methods: {
+    handleClick (item) {
+      this.$router.push(item.link)
+    }
   }
 }
 </script>
@@ -92,6 +114,9 @@ export default {
       background: #F7F7F7;
       height: 205px;
       padding: 32px 10px 0 10px;
+      &.en-class {
+        height: 302px;
+      }
       h3 {
         font-size: 16px;
         font-weight: bold;

+ 5 - 7
mobile/src/pages/home/components/plate3.vue

@@ -1,6 +1,6 @@
 <template>
   <div class="plate03">
-    <h1 class="common-title">看看空间<span class="more">更多></span></h1>
+    <h1 class="common-title">{{ $t('home.plate2Title') }}<span class="more" @click="$router.push('/cases/全部')">{{$t('common.more')}}></span></h1>
     <swiper class="swiper-wrapper" :options="swiperOption">
       <swiper-slide
         class="swiper-slide"
@@ -63,12 +63,6 @@ export default {
   padding: 0 0 0 20px;
   .common-title {
     margin-bottom: 30px;
-    .more {
-      font-size: 12px;
-      font-weight: normal;
-      float: right;
-      margin-right: 20px;
-    }
   }
   .swiper-slide {
     width: 286px;
@@ -83,6 +77,10 @@ export default {
       transform: translateX(-50%);
       font-size: 22px;
       line-height: 33px;
+      white-space: nowrap;
+    }
+    &:last-child {
+      margin-right: 20px;
     }
   }
 }

+ 13 - 18
mobile/src/pages/home/components/plate4.vue

@@ -1,6 +1,6 @@
 <template>
   <div class="plate04">
-    <h1 class="common-title">核心技术</h1>
+    <h1 class="common-title">{{$t('home.plate3Title')}}</h1>
     <ul class="plate04-list">
       <li v-for="(item, index) in list" :key="index" @click="toLink(item)">
         <div class="item-left">
@@ -9,7 +9,7 @@
         <div class="item-right">
           <h3>{{ item.title }}</h3>
           <div>
-            <p v-for="text in item.desc" :key="text">{{ text }}</p>
+            <p v-html="item.desc"></p>
           </div>
         </div>
       </li>
@@ -24,34 +24,28 @@ export default {
       list: [
         {
           img: require('@/assets/images/refactor/home/plate04-1.png'),
-          title: '空间重建',
-          desc: [
-            '自动化三维数字重建',
-            '还原空间布局与结构'
-          ]
+          title: this.$t('home.plate3Item1Title'),
+          desc: this.$t('home.plate3Item1Text'),
+          id: 'plate1'
         },
         {
           img: require('@/assets/images/refactor/home/plate04-2.png'),
-          title: '空间互动',
-          desc: [
-            '无需插件,多端展示',
-            '实现720°沉浸体验'
-          ]
+          title: this.$t('home.plate3Item2Title'),
+          desc: this.$t('home.plate3Item2Text'),
+          id: 'plate2'
         },
         {
           img: require('@/assets/images/refactor/home/plate04-3.png'),
-          title: '空间展示',
-          desc: [
-            '自动导览 互动视频',
-            '多形态动态热点'
-          ]
+          title: this.$t('home.plate3Item3Title'),
+          desc: this.$t('home.plate3Item3Text'),
+          id: 'plate3'
         }
       ]
     }
   },
   methods: {
     toLink ({id}) {
-      window.open(`/location?id=${id}`)
+      this.$router.push({ path: '/location', query: { id } })
     }
   }
 }
@@ -78,6 +72,7 @@ export default {
         }
       }
       .item-right {
+        flex: 1;
         h3 {
           font-size: 16px;
           line-height: 24px;

+ 8 - 6
mobile/src/pages/home/components/plate5.vue

@@ -1,7 +1,7 @@
 <template>
   <div class="plate05">
-    <h1 class="common-title">新闻动态
-      <span class="more">更多</span>
+    <h1 class="common-title">{{$t('home.plate4Title')}}
+      <span class="more" @click="$router.push('/news')">{{$t('common.more')}}></span>
     </h1>
     <swiper class="swiper-wrapper" :options="swiperOption">
       <swiper-slide
@@ -69,7 +69,7 @@ export default {
   }
   .news-info {
     font-size: 14px;
-    padding: 12px 14px 25px;
+    padding: 12px 14px 37px;
     background: #FFFFFF;
     h3 {
       padding-right: 70px;
@@ -79,6 +79,7 @@ export default {
       overflow: hidden;
       text-overflow: ellipsis;
       -webkit-box-orient: vertical;
+      height: 30px;
     }
   }
   .news-content {
@@ -99,9 +100,10 @@ export default {
     background-size: 100% 100%;
   }
   .publish-time {
-    font-size: 12px;
-    color: #E60222;
-    margin: 0 0 12px;
+    color: #909090;
+    position: absolute;
+    right: 20px;
+    bottom: 37px;
   }
   .publisher {
     color: #909090;

+ 1 - 1
mobile/src/pages/home/components/plate6.vue

@@ -1,6 +1,6 @@
 <template>
   <div class="plate06">
-    <h1 class="common-title">合作伙伴</h1>
+    <h1 class="common-title">{{$t('home.plate5Title')}}</h1>
     <img src="@/assets/images/refactor/home/partners_list.png" />
   </div>
 </template>

+ 12 - 3
mobile/src/pages/home/index.vue

@@ -5,12 +5,12 @@
       <video autoplay controls :src="currenVideo" class="video-fr"></video>
     </div>
     <div class="plate01">
-      <p class="plate01-title">精准实景复刻传递<br />空间价值</p>
+      <p class="plate01-title" v-html="$t('home.bannerText')"></p>
       <img class="p1_bg" src="@/assets/images/refactor/home/plate01-img@2x.png" alt="">
       <div class="bottom">
-        <div @click="broadcast(language==='en'?`${$cdn}video/banner1.mp4`:`${$cdn}video/4dkkPRO_zh.mp4`)" class="btn-player">
+        <div @click="broadcast('https://4d-tjw.oss-cn-shenzhen.aliyuncs.com/4dHouse/%E5%9B%9B%E7%BB%B4%E7%9C%8B%E7%9C%8BPro-%202020-7-22%E7%89%88%E6%9C%AC%288K%29.mp4')" class="btn-player">
           <img src="@/assets/images/refactor/home/playBtn.png" alt="">
-          <span >介绍视频</span>
+          <span >{{$t('home.bannerIntroVideo')}}</span>
           <div class="play-btn"></div>
         </div>
       </div>
@@ -123,3 +123,12 @@ export default {
   left: 49%;
 }
 </style>
+
+<style lang="scss">
+.home-layout .more {
+  font-size: 12px;
+  font-weight: normal;
+  float: right;
+  margin-right: 20px;
+}
+</style>

+ 44 - 21
mobile/src/pages/layout/footer.vue

@@ -1,12 +1,12 @@
 <template>
   <div>
     <div class="footer-find" v-if="!$route.meta.hideFooterBanner">
-      <p>四维看看,让空间讲故事</p>
-      <div class="find-btn" @click="$router.push('/cases/全部')">发现精彩</div>
+      <p>{{ $t('header.footer.bannerTitle') }}</p>
+      <div class="find-btn" @click="$router.push('/cases/全部')">{{ $t('header.footer.find') }}</div>
     </div>
     <div class="footer">
       <div class="footer-header">
-        <h-icon type="logo" class="logo-size" />
+        <h-icon :type="language === 'zh' ? 'logo' : 'hengbiaoEN'" class="logo-size" />
         <img @click="gotoLink('https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=MzA3NjI1MTE5MA==&scene=110#wechat_redirect','weixin')" src="@/assets/images/refactor/home/wechat.png" alt>
         <img @click="gotoLink('https://qr.weibo.cn/g/574xnj')" src="@/assets/images/refactor/home/weibo.png" alt>
         <img @click="gotoLink('https://v.douyin.com/RBu3JQ/','douyin')" src="@/assets/images/refactor/home/douyin.png" alt>
@@ -19,6 +19,13 @@
             <li class="types-child" v-for="(child, index) in item.childs" :key="index" @click="toLink(child)">{{ child.name }}</li>
           </ul>
         </li>
+        <!-- <li :class="{'is-active': openType === 'lang'}" @click="changeOpenType('lang')">
+          {{ languageName }}
+          <h-icon type="shang" class="arrow" />
+          <ul class="types-child-list">
+            <li class="types-child" v-for="item in languageList" :key="item.value" @click="changeLanguage(item)">{{ item.name }}</li>
+          </ul>
+        </li> -->
       </ul>
       <ul class="footer-infos">
         <li class="infos-item" v-for="(item,i) in langFooter.items" :key="i">
@@ -69,8 +76,14 @@ export default {
     ...mapState({
       language: state => state.language.current,
       langToast: state => state.language.home.toast,
-      langFooter: state => state.language.home.footer
-    })
+      langFooter: state => state.language.home.footer,
+      languageList: state => state.language.languageList
+    }),
+    languageName () {
+      let language = this.languageList.filter(item => item.value === this.language)
+
+      return language[0] ? language[0].name : '简体中文'
+    }
   },
   data () {
     return {
@@ -78,60 +91,62 @@ export default {
       openType: '',
       types: [
         {
-          name: '行业应用',
+          name: this.$t('header.solutions'),
           childs: [
             {
-              name: '房产营销',
+              name: this.$t('header.solutionsHouse'),
               url: '/conduct/house'
             },
             {
-              name: '线上展会',
+              name: this.$t('header.solutionsExi'),
               url: '/conduct/exhibition'
             },
             {
-              name: '数字文博',
+              name: this.$t('header.solutionsSubject'),
               url: '/conduct/subject'
             },
             {
-              name: 'VR购物',
+              name: this.$t('header.solutionsShop'),
               url: '/conduct/shop'
             },
             {
-              name: '安防勘察',
+              name: this.$t('header.solutionsSec'),
               url: '/conduct/secury'
             }
           ]
         },
         {
-          name: '关于我们',
+          name: this.$t('header.about'),
           childs: [
             {
-              name: '公司简介',
+              name: this.$t('header.aboutCompany'),
               url: '/about'
             },
             {
-              name: '新闻资讯',
+              name: this.$t('header.aboutNews'),
               url: '/news'
             },
             {
-              name: '成为经销商',
+              name: this.$t('header.aboutAgent'),
               url: '/agent'
             }
           ]
         },
         {
-          name: '探索四维',
+          name: this.$t('header.footer.find4D'),
           childs: [
             {
-              name: '四维时代',
-              url: 'http://www.4dage.com/cn/#/'
+              name: this.$t('header.footer.kankan'),
+              url: 'http://www.4dage.com/cn/#/',
+              enLink: 'http://www.4dage.com/en'
             },
             {
-              name: '中德人工智能研究院',
-              url: 'https://www.cgaii.com/#/'
+              name: this.$t('header.footer.zhongde'),
+              url: 'https://www.cgaii.com/#/',
+              enLink: 'https://www.cgaii.com/en'
             },
             {
-              name: '四维模库',
+              name: this.$t('header.footer.moku'),
               url: 'http://www.4dmodel.com/'
             }
           ]
@@ -140,6 +155,10 @@ export default {
     }
   },
   methods: {
+    changeLanguage (item) {
+      this.$store.commit('change_language', item.value)
+      location.reload()
+    },
     gotoLink (link, check = false) {
       if (check) {
         if (this.isWeixin) {
@@ -163,6 +182,10 @@ export default {
     },
     toLink (item) {
       if (item.url.indexOf('http') > -1) {
+        if (this.language !== 'zh' && item.enLink) {
+          window.open(item.enLink)
+          return
+        }
         window.open(item.url)
       } else {
         this.$router.push(item.url)

+ 64 - 44
mobile/src/pages/layout/header.vue

@@ -10,9 +10,9 @@
     <div @click="backHome?$router.push({name:'home'}):$router.back()" class="h-left back" v-else>
       <i class="iconfont icon-jiantou"></i>
     </div>
-    <div class="h-center">
+    <div class="h-center" @click="$router.push({name: 'home'})">
       <vcenter>
-        <h-icon type="logo" class="logo-icon" @click="$router.push('/')"></h-icon>
+        <h-icon :type="language === 'zh' ? 'logo' : 'hengbiaoEN'" class="logo-icon"></h-icon>
         <!-- <img v-if="!isBack||$route.name==='useimg'" :src="language==='en'?`${$cdn}images/logo-en.png`:`${$cdn}images/logo.png`"  @click="()=>{goto({name:'home'})} " alt> -->
         <!-- <div v-else>{{$route.name==='consumpdetail'?titleName[$route.name][$route.params.id]:titleName[$route.name]}}</div> -->
       </vcenter>
@@ -25,31 +25,40 @@
             <li v-for="(item,i) in langHeader.manage" :key="i" @click="handleClick(item)">{{item.name}}</li>
           </ul>
       </div>
-      <div class="btn-buy" v-else-if="$route.name!=='purchase'&&$route.name!=='purchasetwo'&&$route.name!=='purchasezhijia'" @click="buy" >{{langHeader.buy}}</div>
+      <div class="btn-buy" v-else-if="$route.name!=='purchase'&&$route.name!=='purchasetwo'&&$route.name!=='purchasezhijia'" @click="buy" >{{$t('header.online_shop')}}</div>
     </div>
     <div class="nav-active" :style="{maxHeight:active?'100vh':'0'}">
-      <div class="nav-mask"></div>
+      <div class="nav-mask" :style="{position: active? 'fixed' : 'absolute'}"></div>
       <div class="nav-content">
         <ul v-for="(item, index) in navs" :key="index">
+          <li>
+            <div class="n-name" @click="clickItem(item, index)">
+              <span>{{item.name}}</span>
+              <h-icon type="shang" class="icon" :class="{active: activeIdx===index}"></h-icon>
+            </div>
+            <div class="n-child" :class="{'open':activeIdx === index}">
+              <div  v-for="(sub,i) in item.childs" :key="i" @click="goto(sub.url)">
+                <i class="iconfont" :class="sub.icon"></i>
+                <span :style="{minWidth:index==='cpgm'?'120px':'60px'}"  v-html="sub.name"></span>
+                <img v-if="sub.isNew" class="new-icon" :src="`${$cdn}images/new.png`" alt="">
+              </div>
+            </div>
+          </li>
+        </ul>
+      <ul  v-if="!noEnglish">
         <li>
-          <div class="n-name" @click="clickItem(item, index)">
-            <span>{{item.name}}</span>
-            <h-icon type="shang" class="icon" :class="{active: activeIdx===index}"></h-icon>
+          <div class="n-name" @click="activeIdx = 'language'">
+            <span>{{ languageName }}</span>
+            <h-icon type="shang" class="icon" :class="{active: activeIdx==='language'}"></h-icon>
           </div>
-          <div class="n-child" :class="{'open':activeIdx === index}">
-            <div  v-for="(sub,i) in item.childs" :key="i" @click="goto(sub.url)">
-              <i class="iconfont" :class="sub.icon"></i>
-              <span :style="{minWidth:index==='cpgm'?'120px':'60px'}"  v-html="sub.name"></span>
-              <img v-if="sub.isNew" class="new-icon" :src="`${$cdn}images/new.png`" alt="">
+          <div class="n-child" :class="{'open':activeIdx === 'language'}">
+            <div  v-for="(sub,i) in languageList" :key="i" @click="changLang(sub.value)">
+              <span :style="{minWidth:i==='cpgm'?'120px':'60px'}"  v-html="sub.name"></span>
             </div>
           </div>
         </li>
       </ul>
       </div>
-      <!-- <div class="language" v-if="!noEnglish">
-        <span :class="{active:language === '中'}" @click="changLang('中')">中</span>
-        <span :class="{active:language === 'en'}" @click="changLang('en')">En</span>
-      </div> -->
     </div>
   </div>
 </template>
@@ -130,9 +139,14 @@ export default {
     ...mapState({
       token: state => state.user.token,
       langHeader: state => state.language.home.headers,
-      language: state => state.language.current
+      language: state => state.language.current,
+      languageList: state => state.language.languageList,
+      info: state => state.user.info
     }),
-
+    languageName () {
+      let language = this.languageList.filter(item => item.value === this.language)
+      return language[0] ? language[0].name : '简体中文'
+    },
     typeArr: function () {
       return this.language === 'en' ? typeArrEn : typeArr
     },
@@ -191,83 +205,84 @@ export default {
       browserLang: browser.language,
       navs: [
         {
-          name: '核心产品',
+          name: this.$t('header.core_product'),
           url: '/coreProduct'
         },
         {
-          name: '行业解决方案',
+          name: this.$t('header.solutions'),
           childs: [
             {
-              name: '房产营销',
+              name: this.$t('header.solutionsHouse'),
               url: '/conduct/house'
             },
             {
-              name: '线上展会',
+              name: this.$t('header.solutionsExi'),
               url: '/conduct/exhibition'
             },
             {
-              name: '数字文博',
+              name: this.$t('header.solutionsSubject'),
               url: '/conduct/subject'
             },
             {
-              name: 'VR购物',
+              name: this.$t('header.solutionsShop'),
               url: '/conduct/shop'
             },
             {
-              name: '保险勘察',
+              name: this.$t('header.solutionsSec'),
               url: '/conduct/secury'
             }
           ]
         },
         {
-          name: '看看空间',
+          name: this.$t('header.kankan_space'),
           url: '/cases/全部'
         },
         {
-          name: '核心技术',
+          name: this.$t('header.core_tech'),
           url: '/location'
         },
         {
-          name: '服务支持',
+          name: this.$t('header.service'),
           childs: [
             {
-              name: 'APP下载',
+              name: this.$t('header.serviceApp'),
               url: '/service/app'
             },
             {
-              name: '使用教程',
+              name: this.$t('header.serviceUse'),
               url: '/service/use'
             },
             {
-              name: '保修条款',
+              name: this.$t('header.serviceBaoxiu'),
               url: '/service/clause'
             },
             {
-              name: '视频教程',
+              name: this.$t('header.serviceVideo'),
               url: '/video-course'
             }
           ]
         },
         {
-          name: '关于我们',
+          name: this.$t('header.about'),
           childs: [
             {
-              name: '新闻资讯',
-              url: '/news'
+              name: this.$t('header.aboutCompany'),
+              url: '/about'
             },
             {
-              name: '成为经销商',
-              url: '/agent'
+              name: this.$t('header.aboutNews'),
+              url: '/news'
             },
             {
-              name: '关于我们',
-              url: '/about'
+              name: this.$t('header.aboutAgent'),
+              url: '/agent'
             }
           ]
         },
         {
-          name: '我的账号',
-          url: '/information'
+          name: this.$t('header.myAccount'),
+          url: '/login',
+          needLogin: true
         }
       ]
     }
@@ -296,8 +311,8 @@ export default {
     }
   },
   mounted () {
-    let lang = ~this.browserLang.indexOf('zh') ? '中' : 'en'
-    this.$store.commit('change_language', lang)
+    // let lang = ~this.browserLang.indexOf('zh') ? 'zh' : 'en'
+    // this.$store.commit('change_language', lang)
     document.addEventListener('click', (e) => {
       if (this.$refs.userList) {
         if (!this.$refs.userList.contains(e.target)) {
@@ -336,7 +351,6 @@ export default {
       this.userList = false
     },
     clickItem (item, index) {
-      this.activeIdx = this.activeIdx === index ? '' : index
       if (item.url) {
         this.active = false
         if (item.url === '/login' && this.token) {
@@ -351,10 +365,16 @@ export default {
             }
           })
         }
+        this.activeIdx = ''
+      } else if (this.activeIdx !== index) {
+        this.activeIdx = index
+      } else {
+        this.activeIdx = ''
       }
     },
     changLang (lang) {
       this.$store.commit('change_language', lang)
+      window.location.reload()
       this.active = false
     },
     linkto (url) {

+ 20 - 9
mobile/src/pages/layout/style.scss

@@ -5,9 +5,8 @@ $bannerHeight:50px;
   background: transparent;
   border-radius: 3px;
   color: #2d2d2d;
-  width: 76px;
-  height: 28px;
-  line-height: 28px;
+  // width: 76px;
+  padding: 7px 13px 6px;
   font-size: 12px;
   font-weight: bold;
   background-color: #1fe4dc;
@@ -25,6 +24,7 @@ $bannerHeight:50px;
   display: flex;
   align-items: center;
   justify-content: space-between;
+  
   .h-left {
     width: 40px;
     height: $bannerHeight;
@@ -78,12 +78,19 @@ $bannerHeight:50px;
 
   .h-center {
     position: absolute;
-    top: 50%;
+    bottom: 0;
     left: 50%;
-    transform: translateX(-50%) translateY(-50%);
+    transform: translateX(-50%);
     font-size: 16px;
+    z-index: -1;
+    height: 100px;
+    width: 114px;
+    overflow: hidden;
     .logo-icon {
-      font-size: 80px;
+      font-size: 100px;
+      position: absolute;
+      top: 50px;
+      transform: translateY(-25%);
     }
     img {
       width: 100px;
@@ -308,8 +315,8 @@ $bannerHeight:50px;
       top: 0;
       left: 0;
       background: rgba(0, 0, 0, 0.2);
-      width: 100%;
-      height: 100%;
+      width: 100vw;
+      height: 100vh;
       z-index: 9999;
     }
     &::-webkit-scrollbar{
@@ -327,7 +334,7 @@ $bannerHeight:50px;
     }
     .nav-content {
       width: 264px;
-      padding: 20px 0 0 20px;
+      padding: 20px 0 54px 20px;
       background-color: #fff;
       // height: calc(100vh - 50px);
       min-height: calc(100vh - 50px);
@@ -352,6 +359,10 @@ $bannerHeight:50px;
             color: #909090;
             margin-right: 20px;
             transform: rotate(90deg);
+            transition: 0.3s ease all;
+            &.active {
+              transform: rotate(0);
+            }
           }
         }
         .n-child {

+ 24 - 19
mobile/src/pages/location/index.vue

@@ -1,28 +1,28 @@
 <template>
   <div class="home-layout">
     <div class="banner">
-      核心技术
+      {{ $t('conduct.coreTech.bannerTitle') }}
     </div>
-    <div class="plate1">
-      <h1 class="common-title">空间数字化</h1>
-      <p class="desc">记录与计算相机在拍摄时的空间位置,并提取对应的3D点云,从而获取三维空间的真实情况。</p>
+    <div class="plate1" id="plate1">
+      <h1 class="common-title">{{ $t('conduct.coreTech.itemTitle1') }}</h1>
+      <p class="desc">{{ $t('conduct.coreTech.itemText1') }}</p>
       <div class="video">
         <video autoplay controls src="@/assets/images/refactor/location/AI AR SLAM 01(剪辑版2).mp4"></video>
       </div>
     </div>
-    <div class="plate2">
-      <h1 class="common-title">空间互动</h1>
-      <p class="desc">自动导览 预先设定路线,球幕视频 BOX视频 增强体验的互动效果,多形式动态热点 赋以空间说话的艺术。</p>
+    <div class="plate2" id="plate2">
+      <h1 class="common-title">{{ $t('conduct.coreTech.itemTitle2') }}</h1>
+      <p class="desc">{{ $t('conduct.coreTech.itemText2') }}</p>
       <ul>
         <li v-for="(item, index) in plate2List" :key="item.name" :class="{'is-active': plate2ActiveIndex === index}" @click="plate2ActiveIndex=index">
           {{ item.name }}
         </li>
       </ul>
-      <video autoplay controls :src="plate2List[plate2ActiveIndex].video"></video>
+      <iframe allowfullscreen :src="plate2List[plate2ActiveIndex].iframeLink" />
     </div>
-    <div class="plate3">
-      <h1 class="common-title">空间展示</h1>
-      <p class="desc">无需插件,可在手机、 平板、PC端、VR眼镜,实现720°沉浸式漫游体验。</p>
+    <div class="plate3"  id="plate3">
+      <h1 class="common-title">{{ $t('conduct.coreTech.itemTitle3') }}</h1>
+      <p class="desc">{{ $t('conduct.coreTech.itemText3') }}</p>
       <ul>
         <li v-for="item in plate3List" :key="item.name">
           <div class="item-img" :style="{'background-image': `url(${item.img})`}"></div>
@@ -51,26 +51,29 @@ export default {
       plate2ActiveIndex: 0,
       plate2List: [
         {
-          name: '动态热点'
+          name: this.$t('conduct.coreTech.item2Name1'),
+          iframeLink: 'https://www.4dkankan.com/showProPC.html?m=nSjwSohIY'
         },
         {
-          name: '互动视频'
+          name: this.$t('conduct.coreTech.item2Name2'),
+          iframeLink: 'https://www.4dkankan.com/spc.html?m=B4T8r0kk6'
         },
         {
-          name: '自动导览'
+          name: this.$t('conduct.coreTech.item2Name3'),
+          iframeLink: 'https://www.4dkankan.com/showProPC.html?m=t-0Q99SHE'
         }
       ],
       plate3List: [
         {
-          name: 'VR端',
+          name: this.$t('conduct.coreTech.item3Name1'),
           img: require('@/assets/images/refactor/location/show-1.png')
         },
         {
-          name: '网页端',
+          name: this.$t('conduct.coreTech.item3Name2'),
           img: require('@/assets/images/refactor/location/show-2.png')
         },
         {
-          name: '移动端',
+          name: this.$t('conduct.coreTech.item3Name3'),
           img: require('@/assets/images/refactor/location/show-3.png')
         }
       ]
@@ -138,8 +141,9 @@ export default {
         height: 14px;
         background: #909090;
         position: absolute;
-        top: 3px;
+        top: 50%;
         right: 0;
+        margin-top: -7px;
       }
       &:last-child {
         &::after {
@@ -148,8 +152,9 @@ export default {
       }
     }
   }
-  video {
+  iframe {
     width: 100%;
+    height: 500px;
   }
 }
 .plate3 {

+ 263 - 64
mobile/src/pages/purchase/index.vue

@@ -10,45 +10,50 @@
         <div class="txt-con">
           <img class="p-logo" :src="language==='en'?`${$cdn}images/pro-logo-m-en.png`:`${$cdn}images/pro-logo-m.png`" alt="">
           <div class="p-price">{{langPurchase.price}}<span class="zdj">{{langPurchase.yushou}}</span></div>
-          <p>运费:顺丰包邮</p>
         </div>
-        <div class="select-w">
-          <div class="capacity">包含基础容量:10G<a :href="`${pathname}#/mall/cloudCapacity`" target="_blank">了解详情</a></div>
-          <h-row class="package-w" :gutter="28">
-            <h-col :span="12">
-              <div :class="`package-item ${buyPackage === 'normal' ? 'active' : ''}`" @click="buyPackage='normal'">标准套餐</div>
-            </h-col>
-            <h-col :span="12">
-              <div :class="`package-item ${buyPackage === 'lot' ? 'active' : ''}`" @click="buyPackage='lot';selectParts=true">增值套餐(包含三脚架)</div>
-            </h-col>
-          </h-row>
-          <div class="clear">
-            <spinner class="fr" v-if="language!=='en'" @count='handleNum' />
+        <div class="attr-con">
+          <div class="attr">{{langPurchase.color.key}}</div>
+          <div class="box color">
+            <i class="iconfont icon-yuandian"><span>{{langPurchase.color.val}}</span></i>
           </div>
-          <p class="title ">是否需要添加推荐的配件(标准套餐不含以下配件)</p>
-          <div class="detail-box zhijia" :class="{'no-active':!selectParts}" @click="changeSelectParts">
-            <!-- <img :src="`${$cdn}images/tag-icon.png`" class="t-click" alt> -->
+          <div class="attr">{{langPurchase.service.key}}</div>
+          <div class="box service">
+            <i class="iconfont icon-yuandian">
+              <span>{{langPurchase.service.type}}</span>
+              <a class="title peijian" @click="$router.push({name:'pricedetail'})">
+                <img :src="`${$cdn}images/perjian-warn.png`" alt="">
+                {{$t('mall.knowMore')}}
+              </a>
+            </i>
+            <!-- <span @click="scrollTo('rlgz')">{{langPurchase.why}}</span> -->
+            <ul>
+              <li v-for="(item,i) in langPurchase.service.val" :key="i" v-html="item"></li>
+            </ul>
+          </div>
+          <div class="attr">{{langPurchase.gift.key}}</div>
+          <div class="box zhijia" :class="{'no-active':!selectParts}" @click="selectParts=!selectParts">
+            <img :src="`${$cdn}images/tag-icon.png`" class="t-click"  alt>
             <img :src="`${$cdn}images/zhijia.png`" alt>
-            <div class="zhijia-info">
-              <h6>四维看看Pro三脚架套装</h6>
-              <p>三脚架 + 滑轮 + 云台</p>
-              <a :href="`${pathname}#/mall/zhijia`" target="_blank">了解详情</a>
-            </div>
-            <div class="zhijia-actions">
-              <p>¥{{ mallConfig.zhijiaPrice }}</p>
+            <div>
+              <p class="title1">{{langPurchase.gift.val}}</p>
+              <p>{{langPurchase.gift.price}}</p>
             </div>
           </div>
-          <div class="zhijia-desc">
-            <p><h-icon type="gouwuche" class="icon" size="16"></h-icon>预计3日内发货</p>
-            <spinner v-if="language!=='en'" class="count" @count='handleZhijiaCount' />
-          </div>
+          <p class="title peijian" @click="$router.push({name:'purchasezhijia'})">
+            <img :src="`${$cdn}images/perjian-warn.png`" alt="">
+            <span>{{$t('mall.knowMore')}}</span>
+          </p>
+          <div v-if="language!=='en'" class="attr">{{langPurchase.count.key}}</div>
+          <spinner v-if="language!=='en'" class="count" @count='handleNum' />
+          <div class="dec" v-if="language === 'zh'"><h-icon class="gouwuche" type="gouwuche" />{{langPurchase.tiaokuan}}</div>
         </div>
+
       </div>
     </div>
     <div class="plate02" ref="jsgg">
       <ul class="plate02-type-list">
-        <li :class="{'is-active': plate02ShowType === 'product'}" @click="plate02ShowType='product'">产品说明</li>
-        <li :class="{'is-active': plate02ShowType === 'tech'}" @click="plate02ShowType='tech'">技术参数</li>
+        <li :class="{'is-active': plate02ShowType === 'product'}" @click="plate02ShowType='product'">{{$t('mall.product')}}</li>
+        <li :class="{'is-active': plate02ShowType === 'tech'}" @click="plate02ShowType='tech'">{{$t('mall.techDetail')}}</li>
       </ul>
       <div v-show="plate02ShowType === 'product'">
         <ul class="desc-video">
@@ -63,15 +68,14 @@
         </ul>
       </div>
       <div v-show="plate02ShowType === 'tech'">
-        <div class="common-title">{{langPurchase.parmas.name}}</div>
+        <div class="common-title">{{langPurchase.guige.name}}</div>
         <div class="p2-pramas">
-          <div v-for="(item,i) in techData" :key="i">
-            <p class="title">{{item.label}}</p>
+          <div v-for="(item,i) in langPurchase.guige.arr" :key="i">
+            <p class="title">{{item.name}}</p>
             <div class="detail" >
-              <span v-for="(sub,idx) in item.desc" :key="idx">
-                {{sub}}
+              <div v-for="(sub,idx) in item.val" v-html="sub" :key="idx">
                 <!-- <span v-html="sub">* 付款成功后5个工作日内发货,默认顺丰快递包邮</span> -->
-              </span>
+              </div>
             </div>
           </div>
         </div>
@@ -131,7 +135,7 @@ export default {
       langPurchase: state => state.language.home.purchase
     }),
     totalPrice () {
-      return mallConfig.price * this.count + (this.selectParts ? mallConfig.zhijiaPrice * this.zhijiaCount : 0)
+      return mallConfig.price * this.count + (this.selectParts ? mallConfig.zhijiaPrice * this.count : 0)
     }
   },
   data () {
@@ -158,9 +162,6 @@ export default {
       count: 1,
       browdata,
       selectParts: true,
-      pathname: window.location.pathname,
-      buyPackage: 'normal',
-      zhijiaCount: 1,
       techData: [
         {
           label: '机身尺寸',
@@ -197,43 +198,37 @@ export default {
       ],
       videoArr: [
         {
-          name: i18n.t('coreProduct.title1'),
+          name: i18n.t('conduct.coreProduct.itemTitle1'),
           img: 1,
           post: 1,
           runAnimation: true
         },
         {
-          name: i18n.t('coreProduct.title2'),
-          img: 2,
-          post: 2,
-          runAnimation: true
-        },
-        {
-          name: i18n.t('coreProduct.title3'),
+          name: i18n.t('conduct.coreProduct.itemTitle2'),
           img: 2,
           post: 2,
           runAnimation: true
         },
         {
-          name: i18n.t('coreProduct.title4'),
-          img: 2,
-          post: 2,
+          name: i18n.t('conduct.coreProduct.itemTitle4'),
+          img: 6,
+          post: 6,
           runAnimation: true
         },
         {
-          name: i18n.t('coreProduct.title5'),
+          name: i18n.t('conduct.coreProduct.itemTitle5'),
           img: 3,
           post: 3,
           runAnimation: true
         },
         {
-          name: i18n.t('coreProduct.title6'),
+          name: i18n.t('conduct.coreProduct.itemTitle6'),
           img: 4,
           post: 4,
           runAnimation: true
         },
         {
-          name: i18n.t('coreProduct.title7'),
+          name: i18n.t('conduct.coreProduct.itemTitle7'),
           img: 5,
           post: 5,
           runAnimation: true
@@ -245,9 +240,6 @@ export default {
     handleNum (data) {
       this.count = data
     },
-    handleZhijiaCount (data) {
-      this.zhijiaCount = data
-    },
     async addcart () {
       if (!this.token) {
         return this.$router.push({path: '/login'})
@@ -259,7 +251,7 @@ export default {
       }
       let zhijia = {
         goodsId: 7,
-        goodsCount: this.zhijiaCount,
+        goodsCount: this.count,
         skuSn: mallConfig.goodsMap[7].skuSn
       }
       await this.$store.dispatch('addCart', params)
@@ -285,7 +277,7 @@ export default {
       }
       let zhijia = {
         goodsId: 7,
-        goodsCount: this.zhijiaCount,
+        goodsCount: this.count,
         price: mallConfig.zhijiaPrice,
         skuSn: mallConfig.goodsMap[7].skuSn
       }
@@ -311,12 +303,6 @@ export default {
           clearInterval(this.interval)
         }
       })
-    },
-    changeSelectParts () {
-      if (this.buyPackage === 'lot') {
-        return
-      }
-      this.selectParts = !this.selectParts
     }
   }
 }
@@ -324,4 +310,217 @@ export default {
 
 <style lang="scss" scoped>
 @import './style.scss';
+.plate01{
+    .top{
+      height: 60px;
+      padding-top: 20px;
+      text-align: right;
+      span{
+        padding-right: 5%;
+        font-size: 14px;
+        color: rgba(0, 0, 0, 0.7);
+        line-height: 18px;
+        font-weight: 600;
+      }
+    }
+    .main-layout{
+      width: 100%;
+      text-align: center;
+      .pro{
+        width: 20%;
+        margin: 40px auto;
+      }
+      .txt-con{
+        width: 90%;
+        margin: 0 auto;
+        text-align: left;
+        padding: 16px 0 !important;
+        .p-title{
+          font-size: 20px;
+          color: #202020;
+          line-height: 24px;
+          font-weight: 700;
+        }
+        .p-logo{
+          width: 165px;
+          margin-bottom: 8px;
+        }
+        .p-label{
+          font-size: 12px;
+          color: #202020;
+          line-height: 16px;
+        }
+        .p-price{
+          margin-top: 10px;
+          font-size: 20px;
+          line-height: 1;
+          color: #202020;
+          font-weight: 700;
+          .zdj{
+            font-size: 16px;
+            color: #1fe4dc;
+          }
+        }
+      }
+      .attr-con{
+        text-align: left;
+        width: 90%;
+        margin: 0 auto;
+        padding: 0 0 40px;
+        .icon-yuandian{
+          font-size: 12px !important;
+          span {
+            margin-left: 8px;
+            color: #202020 !important;
+          }
+        }
+        .attr{
+          font-size: 12px;
+          color: #202020;
+          line-height: 18px;
+          font-weight: 600;
+          margin: 12px 0 8px;
+        }
+        .box{
+          display: inline-block;
+          color: rgba(0,0,0,.45);
+          padding: 0 63px;
+          box-sizing: border-box;
+          position: relative;
+          text-align: left;
+          .t-click{
+            position: absolute;
+            right: 0;
+            bottom: 0;
+            margin: 0;
+            width: 16px;
+            height: 16px;
+            padding: 0;
+          }
+        }
+        .color{
+          width: 100%;
+          padding: 0;
+          font-size: 14px;
+          color: #202020;
+          font-weight: 600;
+        }
+        .service{
+          width: 100%;
+          display: inline-block;
+          padding: 0;
+          .icon-yuandian{
+            font-size: 14px;
+            color: rgba(0, 0, 0, 0.7);
+            font-weight: 600;
+            a {
+              color: #486ACE !important;
+              margin-left: 78px;
+              line-height: 18px;
+              img {
+                vertical-align: middle;
+                margin-top: -2px;
+              }
+            }
+          }
+          ul{
+            padding: 6px 10px 0 15px;
+            display: inline-block;
+            width: 100%;
+            vertical-align: top;
+            li{
+              font-size: 12px;
+              line-height: 18px;
+              position: relative;
+              color: #909090;
+              &::before{
+                content: '';
+                width: 3px;
+                height: 3px;
+                border-radius: 50%;
+                display: inline-block;
+                position: absolute;
+                left: -10px;
+                top: 8px;
+                background-color: rgba(0,0,0,.45);
+              }
+            }
+          }
+          span{
+            color: #1fe4dc;
+            font-weight: bold;
+            cursor: pointer;
+            margin-left: 2%;
+          }
+        }
+        .zhijia{
+          padding: 0;
+          text-align: left;
+          width: 100%;
+          border: 1px solid #70eee9;
+          padding-left: 22px;
+          >div{
+            display: inline-block;
+            vertical-align: middle;
+          }
+          p{
+            line-height: 18px;
+            text-align: left;
+            color: #202020;
+          }
+        }
+        .peijian{
+          vertical-align: middle;
+          margin-top: 10px;
+          color: #486ace;
+          font-size: 12px;
+          cursor: pointer;
+          font-weight: normal;
+          img{
+            vertical-align: middle;
+            width: 14px;
+            height: 14px;
+          }
+          span{
+            display: inline-block;
+            vertical-align: middle;
+          }
+        }
+        .count{
+          margin: 0;
+        }
+        .no-active{
+          border: 1px solid #e3e3e3;
+          background-color: #fff;
+          .t-click{
+            display: none;
+          }
+        }
+        .btn{
+          cursor: pointer;
+          width: 100%;
+          height: 50px;
+          margin-top: 35px;
+          line-height: 50px;
+          color: #414141;
+          font-size: 14px;
+          background-color: #1fe4dc;
+          display: inline-block;
+          text-align: center;
+        }
+        .dec{
+          color: #909090;
+          font-size: 12px;
+          display: flex;
+          align-items: center;
+          text-align: left;
+          margin-top: 12px;
+          .gouwuche {
+            font-size: 18px;
+            margin-right: 5px;
+          }
+        }
+      }
+    }
+  }
 </style>

+ 8 - 65
mobile/src/pages/purchase/style.scss

@@ -24,40 +24,7 @@
       }
       .txt-con{
         margin-top: 30px;
-        padding: 0 20px;
         text-align: left;
-        .p-title{
-          font-size: 20px;
-          color: #202020;
-          line-height: 24px;
-          font-weight: 700;
-        }
-        .p-logo{
-          width: 165px;
-          margin-bottom: 8px;
-        }
-        .p-label{
-          font-size: 12px;
-          color: #202020;
-          line-height: 16px;
-        }
-        .p-price{
-          margin-top: 10px;
-          font-size: 20px;
-          line-height: 1;
-          color: #202020;
-          font-weight: 700;
-          .zdj{
-            font-size: 16px;
-            color: #1fe4dc;
-          }
-        }
-        p {
-          color: #909090;
-          margin-top: 3px;
-          line-height: 18px;
-          font-size: 12px;
-        }
       }
       .postage {
         color: #909090;
@@ -100,7 +67,6 @@
         border: 1px solid #70eee9;
         display: flex;
         align-items: center;
-        margin: 18px 0 10px;
         display: flex;
         width: 100%;
         &.no-active {
@@ -108,39 +74,17 @@
         }
         img{
           vertical-align: middle;
-          margin-right: 20px;
+          margin-right: 27px;
           height: 78px;
         }
         p{
           text-align: left;
           vertical-align: middle;
-        }
-        .zhijia-info {
-          text-align: left;
           font-size: 12px;
-          color: #202020;
-          line-height: 18px;
-          padding: 12px 0;
-          p {
-            margin: 1px 0 19px;
-            font-size: 12px;
-          }
-          a {
-            display: block;
-            color: #909090;
-            font-size: 12px;
-            text-decoration: underline;
-          }
         }
-        .zhijia-actions {
-          flex: 1;
-          text-align: right;
-          p {
-            text-align: right;
-            color: #202020;
-            margin-bottom: 11px;
-            font-weight: bold;
-          }
+        .title1 {
+          margin-bottom: 4px;
+          font-weight: bold;
         }
       }
       .title{
@@ -273,7 +217,7 @@
   .hover-btns{
     position: fixed;
     bottom: 0;
-    height: 56px;
+    height: 58px;
     background: #fff;
     width: 100%;
     border-top: 1px solid rgba(0,0,0,0.1);
@@ -282,6 +226,7 @@
     display: flex;
     justify-content: space-between;
     align-items: center;
+    align-content: center;
     font-size: 14px;
     .h-price{
       font-weight: bold;
@@ -297,9 +242,7 @@
         text-align: center;
         display: inline-block;
         background: #e7e7e7;
-        height: 32px;
-        line-height: 32px;
-        padding: 0 10px;
+        padding: 7px 10px 6px;
       }
       .primary{
         background: #1fe4dc;
@@ -320,4 +263,4 @@
 }
 .select-w {
   padding: 0 20px;
-}
+}

+ 14 - 14
mobile/src/pages/purchasezhijia/index.vue

@@ -7,24 +7,24 @@
           :floder="'zhijiabrowse'"
          />
         <div class="txt-con">
-          <!-- <img class="p-logo" :src="this.language==='en'?`${$cdn}images/zhijia-logo-en.png`:`${$cdn}images/zhijia-logo-black.png`" alt=""> -->
-          <h2>四维看看Pro三脚架套装</h2>
-          <div class="p-price">¥899</div>
-          <p>运费:顺丰包邮</p>
+          <img class="p-logo" :src="this.language==='en'?`${$cdn}images/zhijia-logo-en.png`:`${$cdn}images/zhijia-logo-black.png`" alt="">
+          <div class="p-label" v-html="langzhijia.dec"></div>
+          <div class="p-price">{{langzhijia.price}}</div>
         </div>
         <div class="attr-con">
-          <div class="detail-box">
-            <div class="attr">套餐内容</div>
-            <div class="box service">
-              <ul>
-                <li v-for="(item,i) in langzhijia.peijian.val" :key="i" v-html="item"></li>
-              </ul>
-            </div>
+          <div class="attr">{{langzhijia.color.key}}</div>
+          <div class="box color">
+            <i class="iconfont icon-yuandian">{{langzhijia.color.val}}</i>
           </div>
-          <div class="zhijia-desc">
-            <p><h-icon type="gouwuche" class="icon" size="16"></h-icon>预计3日内发货</p>
-            <spinner v-if="language!=='en'" class="count" @count='handleNum' />
+          <div class="attr">{{langzhijia.peijian.key}}</div>
+          <div class="box service">
+            <ul>
+              <li v-for="(item,i) in langzhijia.peijian.val" :key="i" v-html="item"></li>
+            </ul>
           </div>
+          <div v-if="language!=='en'" class="attr">{{langzhijia.count.key}}</div>
+          <spinner v-if="language!=='en'" class="count" @count='handleNum' />
+          <div class="dec" v-if="language === 'zh'"><h-icon class="gouwuche" type="gouwuche" />{{langzhijia.tiaokuan}}</div>
         </div>
       </div>
     </div>

+ 85 - 37
mobile/src/pages/purchasezhijia/style.scss

@@ -1,6 +1,7 @@
 .purchase-layout{
   overflow: hidden;
   .plate01{
+    background-size: 100% auto;
     .top{
       height: 60px;
       padding-top: 20px;
@@ -8,52 +9,91 @@
       span{
         padding-right: 5%;
         font-size: 14px;
-        color: #202020;
+        color: rgba(0, 0, 0, 0.7);
         line-height: 18px;
         font-weight: 600;
       }
     }
     .main-layout{
       width: 100%;
+      text-align: center;
       .pro{
-        padding: 0 20px;
+        width: 90%;
         border-radius: 4px;
         margin: 40px auto;
       }
       .txt-con{
-        padding: 30px 20px 0;
+        width: 90%;
         margin: 0 auto;
-        color:  #202020;
-        h2 {
-          font-size: 22px;
-          line-height: 33px;
-          letter-spacing: 2px;
+        text-align: left;
+        padding: 16px 0;
+        // border-top: 1px solid rgba(0, 0, 0, 0.1);
+        // border-bottom: 1px solid rgba(0, 0, 0, 0.1);
+        .p-title{
+          font-size: 20px;
+          color: rgba(0,0,0,.7);
+          line-height: 24px;
+          font-weight: 700;
+        }
+        .p-logo{
+          width: 100%;
+          margin-bottom: 8px;
+        }
+        .p-label{
+          font-size: 12px;
+          color: rgba(0,0,0,.7);
+          line-height: 16px;
         }
         .p-price{
-          margin-top: 12px;
-          margin-bottom: 3px;
+          margin-top: 10px;
+          font-size: 20px;
           line-height: 1;
-          color:  #202020;
+          color: rgba(0,0,0,.7);
           font-weight: 700;
-          font-size: 16px;
-          line-height: 24px;
-        }
-        p {
-          color: #909090;
-          font-size: 12px;
         }
       }
       .attr-con{
-        padding: 0 20px;
-        .detail-box {
-          display: flex;
-          border: 1px solid #1FE4DC;
-          margin-top: 19px;
-          padding: 12px 10px;
-          .attr {
-            margin-right: 27px;
-            white-space: nowrap;
-            line-height: 18px;
+        text-align: left;
+        width: 90%;
+        margin: 0 auto;
+        .icon-yuandian{
+          font-size: 14px;
+        }
+        .attr{
+          font-size: 14px;
+          color: rgba(0,0,0,.7);
+          line-height: 18px;
+          font-weight: 600;
+          margin: 12px 0 10px;
+        }
+        .box{
+          display: inline-block;
+          color: rgba(0,0,0,.45);
+          padding: 0 63px;
+          box-sizing: border-box;
+          position: relative;
+          text-align: left;
+          .t-click{
+            position: absolute;
+            right: 0;
+            bottom: 0;
+            margin: 0;
+            width: 16px;
+            height: 16px;
+            padding: 0;
+          }
+        }
+        .color{
+          width: 100%;
+          padding: 0;
+          font-size: 14px;
+          color: rgba(0,0,0,.7);
+          font-weight: 600;
+          span{
+            color: #1fe4dc;
+            font-weight: bold;
+            cursor: pointer;
+            margin-left: 5%;
           }
         }
         .service{
@@ -62,16 +102,19 @@
           padding: 0;
           .icon-yuandian{
             font-size: 14px;
-            color: #909090;
+            color: rgba(0, 0, 0, 0.7);
             font-weight: 600;
           }
-          
           ul{
+            padding: 0 10px 0 15px;
+            display: inline-block;
+            width: 100%;
+            vertical-align: top;
             li{
               font-size: 12px;
-              line-height: 18px;
+              line-height: 1.5;
               position: relative;
-              color:  #909090;
+              color: rgba(0,0,0,.7);
               &::before{
                 content: '';
                 width: 3px;
@@ -82,7 +125,7 @@
                 left: -10px;
                 top: 50%;
                 transform: translateY(-50%);
-                background-color: #909090;
+                background-color: rgba(0,0,0,.45);
               }
               // &:last-of-type{
               //   &::before{
@@ -97,6 +140,7 @@
           text-align: left;
           width: 100%;
           border: 1px solid #70eee9;
+          background: #f8fefe;
           padding-left: 5%;
           img{
             vertical-align: middle;
@@ -112,7 +156,7 @@
             font-size: 12px;
             line-height: 1.2;
             text-align: left;
-            color:  #202020;
+            color: rgba(0,0,0,.7);
           }
         }
         .peijian{
@@ -155,10 +199,16 @@
           text-align: center;
         }
         .dec{
-          color: #202020;
+          color: #909090;
           font-size: 12px;
+          display: flex;
+          align-items: center;
           text-align: left;
           margin-top: 12px;
+          .gouwuche {
+            font-size: 18px;
+            margin-right: 5px;
+          }
         }
       }
     }
@@ -360,9 +410,7 @@
         text-align: center;
         display: inline-block;
         background: #e7e7e7;
-        height: 32px;
-        padding: 0 10px;
-        line-height: 32px;
+        padding: 6px 10px;
       }
       .primary{
         background: #1fe4dc;

+ 4 - 4
mobile/src/pages/service/temp/app.vue

@@ -10,15 +10,15 @@
         <div class="app-content">
           <img :src="language === 'en'?`${$cdn}images/pro-logo-m-en.png`: require('@/assets/images/refactor/service/logo.png')" alt>
           <div class="app-version">
-            <div class="app-note">
+            <!-- <div class="app-note">
               <p>{{sub}}</p>
-            </div>
+            </div> -->
             <a class="app-btn"
               :href="language==='en'?'https://eur.4dkankan.com/app-download.html':'https://www.4dkankan.com/app-download.html'"
             >{{language==='en'?'Download':'点击下载'}}</a>
           </div>
         </div>
-        <p class="app-tips">使用四维看看Pro的过程中,需要下载APP控制相机。请在手机软件商店搜索“四维看看Pro”或使用手机扫描二维码安装。</p>
+        <p class="app-tips">{{$t('service.appDownload.downloadTip')}}</p>
       </div>
     </div>
   </div>
@@ -79,7 +79,7 @@ export default {
           font-weight: bold;
         }
         .app-version{
-          margin-top: 3px;
+          margin-top: 23px;
           .app-meta{
             color: #c7c7c7;
             font-size: 12px;

+ 1 - 1
mobile/src/pages/service/temp/config.js

@@ -276,7 +276,7 @@ const use = {
 const app = {
   cp: 'iapp',
   titleEn: 'Download',
-  title: '软件下载'
+  title: 'App下载'
 }
 
 const agreement = {

+ 7 - 8
mobile/src/pages/userCenter/addressForm/index.vue

@@ -2,7 +2,7 @@
   <div class="address">
     <div class="address-header">
       <h-icon type="jiantou" class="back" @click="$router.back()"  />
-      添加收货地址
+      编辑收货地址
     </div>
     <citySelect class="citySelect-w" :address='address' :token="token" @cancle="$router.back()" @submit="createAddress"  />
   </div>
@@ -29,13 +29,14 @@ var cloneObj = function (obj) {
 export default {
   data () {
     return {
-      address: cloneObj({})
+      // address: cloneObj({})
     }
   },
   computed: {
     ...mapState({
-      token: state => state.user.token
-      // address: state => cloneObj(state.user.address) || {}
+      token: state => state.user.token,
+      address: state => cloneObj(state.user.address) || {},
+      langToast: state => state.language.home.toast
     })
   },
   components: {
@@ -43,12 +44,10 @@ export default {
   },
   methods: {
     createAddress (form) {
-      API.insertAddress(form).then(async res => {
+      API.updateAddress(form).then(async res => {
         if (res.data.code === 0) {
           await this.getAddressList()
-          this.$alert('添加成功', {
-            icon: 'success'
-          }).then(() => {
+          this.$toast.show('success', this.langToast['47'], () => {
             this.$router.back()
           })
         }

+ 15 - 13
mobile/src/pages/userCenter/confirm/index.vue

@@ -3,20 +3,20 @@
     <div class="confirm-title">确认订单</div>
     <div class="box-con">
       <div class="bc-title">收货地址</div>
-      <div class="bc-item address-item" :class="{'is-active': item.id === address.id}"  v-for="item in addressList" :key="item.id" @click="address = item">
+      <div class="bc-item address-item is-active">
         <div class="bc-ct">
           <div class="bc-contact">
-            {{item.shipName}}
-            <div>{{item.shipMobile}}</div>
+            {{address.shipName}}
+            <div>{{address.shipMobile}}</div>
           </div>
           <div class="bc-locotion">
-            {{`${item.shipAreaPath}${item.shipAddress}`}}
+            {{`${address.shipAreaPath}${address.shipAddress}`}}
           </div>
         </div>
-      </div>
-      <div class="noaddress"  v-if="addressList.length < 3">
-          <p @click="$router.push({name: 'addressCreate'})"><h-icon type="jiahao" />新增收货地址</p>
+        <div class="actions-w">
+          <span @click="$router.push('/addressCreate')"><h-icon type="edit" />编辑</span>
         </div>
+      </div>
     </div>
     <div class="box-con">
       <div class="bc-title">发票信息</div>
@@ -130,8 +130,8 @@ export default {
         let condition = state.user.payinfo && state.user.payinfo !== 'null' && type !== '[object Array]'
         return condition ? JSON.parse(state.user.payinfo) : {}
       },
-      // address: state => cloneObj(state.user.address) || {},
-      addressList: state => state.user.addressList
+      address: state => cloneObj(state.user.address) || {}
+      // addressList: state => state.user.addressList
     })
   },
   data () {
@@ -173,8 +173,7 @@ export default {
       selectedTxt: '不需要发票',
       selectedId: 1,
       isShowAddress: true,
-      showinvoice: true,
-      address: cloneObj({})
+      showinvoice: true
     }
   },
   methods: {
@@ -221,8 +220,8 @@ export default {
       url: '/user/getReceiverInfo',
       name: 'address'
     })
-    await this.$store.dispatch('updateAddressList')
-    this.address = this.addressList[0]
+    // await this.$store.dispatch('updateAddressList')
+    // this.address = this.addressList[0]
   }
 }
 </script>
@@ -283,5 +282,8 @@ export default {
     line-height: 20px;
   }
 }
+.actions-w {
+  margin-top: 7px;
+}
 
 </style>

+ 4 - 1
mobile/src/router/index.js

@@ -43,7 +43,10 @@ let router = new Router({
     {
       path: '/cases/:id',
       name: 'cases',
-      component: resolve => require(['@/pages/cases'], resolve)
+      component: resolve => require(['@/pages/cases'], resolve),
+      meta: {
+        hideFooterBanner: true
+      }
     },
     {
       path: '/service/:id',

+ 22 - 22
mobile/src/store/language/cn/about.js

@@ -7,7 +7,7 @@ export default{
         '四维看看Pro是这一中德合作项目的阶段性硬件成果,于2019年5月在德国柏林首次亮相,该产品运用最新技术打破了美国品牌在该领域的技术垄断,大大降低了三维建模的硬件和时间成本。',
         '在四维看看Pro之前,中德人工智能研究院于2018年5月率先推出全球首款消费级3D相机四维看看Lite。'
       ],
-      img: require('@/assets/images/refactor/about/zd-logo.png')
+      img: 'https://4dscene.4dage.com/new4dkk/mobile/images/cgaii-logo.png'
     },
     {
       name: '',
@@ -22,24 +22,27 @@ export default{
     title: '大事记',
     nodes: [
       {
-        year: '2014年',
+        year: '2020年',
         txt: [
-          '10月 四维时代创立,成员在人工智能三维数字化重建及数字化虚拟展示技术方面具有世界领先的科研实力。',
-          '12月 建模精度达微米级的一种基于光栅扫描的物体数字化三维重建装置,获专利授权。'
+          '1月 荣获工业和信息化科技司的新一代人工智能产业创新重点任务之“四维看看”项目技术揭榜书。',
+          '2月 为抗击疫情,主动联合国内100+家博物馆发起“足不出户逛3D博物馆”活动,为广大民众免费公开3D博物馆资源,线上观展人数达到1.5亿。',
+          '3月 新一代3D空间相机四维看看Pro荣登中国警用装备网,作为人工智能警用装备产品助力智慧警务升级。',
+          '为全球最顶级艺术博览会提供3D技术支持,因数字化博物馆为人们提供了极大的帮助,被美国商业杂志Bloomberg Businessweek报道。'
         ]
       },
       {
-        year: '2015年',
+        year: '2019年',
         txt: [
-          '8月 “高精度一键式三维数字化重建及其展示”获“中国创翼”青年创业创新大赛三等奖。',
-          '10月 四维时代CEO作为全国双创代表获得李克强总理接见,并向总理汇报工作。',
-          '相继成为故宫博物院、广东省博物馆等文物保护机构的合作伙伴。'
+          '4月 为黑提恩斯-德国国立陶瓷博物馆展馆及馆藏进行三维数字化重建,并开发数字博物馆App,该案例作为一带一路文化输出的杰出代表入选第二届一带一路峰会案例集。',
+          '5月 四维看看Pro在德国柏林人工智能大会上亮相。'
         ]
       },
       {
-        year: '2016年',
+        year: '2018年',
         txt: [
-          '5月 为中国十大考古发现之一—南昌汉代海昏侯国遗址博物馆打造的线上数字博物馆上线。'
+          '5月 推出全球首款消费级3D相机四维看看,10分钟即可复刻100平米空间。',
+          '11月 中国高科技产业化研究会授予四维看看“科学技术成果”称号。',
+          '中国国际高新技术成果交易会授予四维看看“优秀产品奖”。'
         ]
       },
       {
@@ -50,27 +53,24 @@ export default{
         ]
       },
       {
-        year: '2018年',
+        year: '2016年',
         txt: [
-          '5月 推出全球首款消费级3D相机四维看看,10分钟即可复刻100平米空间。',
-          '11月 中国高科技产业化研究会授予四维看看“科学技术成果”称号。',
-          '中国国际高新技术成果交易会授予四维看看“优秀产品奖”。'
+          '5月 为中国十大考古发现之一—南昌汉代海昏侯国遗址博物馆打造的线上数字博物馆上线。'
         ]
       },
       {
-        year: '2019年',
+        year: '2015年',
         txt: [
-          '4月 为黑提恩斯-德国国立陶瓷博物馆展馆及馆藏进行三维数字化重建,并开发数字博物馆App,该案例作为一带一路文化输出的杰出代表入选第二届一带一路峰会案例集。',
-          '5月 四维看看Pro在德国柏林人工智能大会上亮相。'
+          '8月 “高精度一键式三维数字化重建及其展示”获“中国创翼”青年创业创新大赛三等奖。',
+          '10月 四维时代CEO作为全国双创代表获得李克强总理接见,并向总理汇报工作。',
+          '相继成为故宫博物院、广东省博物馆等文物保护机构的合作伙伴。'
         ]
       },
       {
-        year: '2020年',
+        year: '2014年',
         txt: [
-          '1月 荣获工业和信息化科技司的新一代人工智能产业创新重点任务之“四维看看”项目技术揭榜书。',
-          '2月 为抗击疫情,主动联合国内100+家博物馆发起“足不出户逛3D博物馆”活动,为广大民众免费公开3D博物馆资源,线上观展人数达到1.5亿。',
-          '3月 新一代3D空间相机四维看看Pro荣登中国警用装备网,作为人工智能警用装备产品助力智慧警务升级。',
-          '为全球最顶级艺术博览会提供3D技术支持,因数字化博物馆为人们提供了极大的帮助,被美国商业杂志Bloomberg Businessweek报道。'
+          '10月 四维时代创立,成员在人工智能三维数字化重建及数字化虚拟展示技术方面具有世界领先的科研实力。',
+          '12月 建模精度达微米级的一种基于光栅扫描的物体数字化三维重建装置,获专利授权。'
         ]
       }
     ]

+ 15 - 18
mobile/src/store/language/cn/purchase.js

@@ -1,3 +1,4 @@
+let space = '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'
 export default{
   top1: '概览',
   top2: '技术规格',
@@ -7,45 +8,41 @@ export default{
   why: '为什么要购买容量?',
   addzhijia: 'RMB 13,395',
   buy: '立即购买',
-  tiaokuan: '* 付款成功后5个工作日内发货,默认顺丰快递包邮',
+  tiaokuan: '付款成功后5个工作日内发货,默认顺丰快递包邮',
   guige: {
     name: '技术规格',
     dec: '注:本页面所列配置及参数均以实际上市产品为准,如有变更,恕不另行通知。',
     arr: [
       {
         name: '机身尺寸',
-        val: [`高度:220.7mm 宽度:78.2mm 厚度:78.2mm`]
+        val: [`高度:220.7mm${space}宽度:78.2mm${space}厚度:78.2mm`]
       },
       {
-        name: '分辨率',
-        val: `分辨率:4608*3456像素(每个);8192*4096像素(合计)`
-      },
-      {
-        name: '存储内存',
+        name: '镜头',
         val: [
-          '16GB'
+          `类型:200°鱼眼镜头${space}孔径:f/2.0${space}数量:8个${space}<br/>分辨率:4608*3456像素(每个);8192*4096像素(合计)`
         ]
       },
       {
-        name: 'WiFi',
-        val: [
-          `802.11a/b/g/n网络协议 支持2.4/5GHz通信`
-        ]
+        name: '传感器',
+        val: [`范围:1/2.3英寸${space}数量:8个`]
       },
       {
-        name: '镜头',
+        name: '存储内存',
         val: [
-          `类型:200°鱼眼镜头 孔径:f/2.0 数量:8个 `
+          '16GB'
         ]
       },
       {
-        name: '传感器',
-        val: [`范围:1/2.3英寸 数量:8个`]
+        name: '电池',
+        val: [
+          `7.4V 4200mAh${space}可通过USB快速充电`
+        ]
       },
       {
-        name: '电池',
+        name: 'WiFi',
         val: [
-          `7.4V 4200mAh 可通过USB快速充电`
+          `802.11a/b/g/n网络协议${space}支持2.4/5GHz通信`
         ]
       },
       {

+ 1 - 1
mobile/src/store/language/cn/purchasezhijia.js

@@ -12,7 +12,7 @@ export default{
   why: '为什么要购买容量?',
   addzhijia: 'RMB 10,395',
   buy: '立即购买',
-  tiaokuan: '* 付款成功后5个工作日内发货,默认顺丰快递包邮',
+  tiaokuan: '付款成功后5个工作日内发货,默认顺丰快递包邮',
   guige: {
     name: '技术规格',
     dec: '注:本页面所列配置及参数均以实际上市产品为准,如有变更,恕不另行通知;',

+ 1 - 1
mobile/src/store/language/cn/toast.js

@@ -75,7 +75,7 @@ export default{
   '3007': '昵称已存在',
   '3008': '该手机已被注册',
   '3009': '两次输入的密码不一致',
-  '3010': '昵称长度错误',
+  '3010': '手机号码格式错误',
   '3011': '密码必须包含英文大小写、数字,长度8-16个字符',
   '3012': '昵称包含敏感词',
   '3013': '手机号码格式错误',

+ 21 - 21
mobile/src/store/language/en/about.js

@@ -29,24 +29,27 @@ export default{
     title: 'Chronicle',
     nodes: [
       {
-        year: '2014',
+        year: '2020',
         txt: [
-          '2014.10 4DAGE was founded in October 2014. The founder and senior management are returnees with European doctor\'s or master\'s degrees. They are world leaders in scientific research on AI digital 3D reconstruction and digital virtual display technology.',
-          '2014.12 4DAGE was granted a patent for a raster scanning digital 3D object reconstruction device with micron-level modeling accuracy.'
+          '2020.01 In January, 4DKanKan won the new generation of artificial intelligence industry innovation key tasks of the Ministry of Industry and Information Technology.',
+          '2020.02 In February, in order to combat COVID-19, 4Dage united more than 100 local museums to initiated the “Stay at home with online 3D museums” activity voluntarily to to freely expose the resources of 3D museums to the general public, and the number of online visitors has reached 150 million.',
+          '2020.03 In March, a new generation of 3D space camera 4DKanKan Pro was listed on the China Police Equipment Network, 4DKanKan Pro, as an artificial intelligence police equipment product help upgrade smart police.',
+          'In March, 4Dage Exclusively Provides 3D Technical Support for the World\'s Top Art Fair. It was reported by the American business magazine Bloomberg Businessweek because its digital museum has provided great help to people.'
         ]
       },
       {
-        year: '2015',
+        year: '2019',
         txt: [
-          '2015.08 4DAGE, in competition with over 27,000 enterprises, won the China Innovation and Entrepreneurship Competition\'s Outstanding Enterprise Award.',
-          '2015.10 Dr. Cui Yan, founder of 4DAGE, was received by Premier Li Keqiang and commended to him for his work as a representative of the national "Mass Entrepreneurship and Innovation" initiative.',
-          'Became partner of organizations that preserves cultural heritage, including the Palace Museum and Guangdong Provincial Museum.'
+          '2019.04 4DAGE cooperated with Hetjens German Museum of Ceramics in 3D digitization, and developed a digital museum application. As an outstanding case of the Belt and Road Initiative\'s cultural output, the project was included in the case collection of the 2019 Belt and Road Forum.',
+          '2019.05 4DKanKan Pro was unveiled at Rise of AI Conference in Berlin, Germany.'
         ]
       },
       {
-        year: '2016',
+        year: '2018',
         txt: [
-          '2016.05 Nanchang Han Dynasty Haihunhou Historic Site Museum\'s online digital museum was officially launched. The Han Dynasty Haihunhou Historic Site is one of the top ten national archaeological discoveries.'
+          '2018.05 4DKanKan, the world\'s first consumer 3D camera was launched, capable of reconstructing 100㎡ of space in five minutes – one twentieth of the time required for image acquisition by existing machines – and costing one-tenth the price of traditional 3D modeling equipment.',
+          '2018.11 4DKanKan was recognized as “Scientific and Technological Achievement” by China High-tech Industrialization Association',
+          '4DKanKan was evaluated as “Excellent Product” by China Hi-Tech Fair.'
         ]
       },
       {
@@ -57,27 +60,24 @@ export default{
         ]
       },
       {
-        year: '2018',
+        year: '2016',
         txt: [
-          '2018.05 4DKanKan, the world\'s first consumer 3D camera was launched, capable of reconstructing 100㎡ of space in five minutes – one twentieth of the time required for image acquisition by existing machines – and costing one-tenth the price of traditional 3D modeling equipment.',
-          '2018.11 4DKanKan was recognized as “Scientific and Technological Achievement” by China High-tech Industrialization Association',
-          '4DKanKan was evaluated as “Excellent Product” by China Hi-Tech Fair.'
+          '2016.05 Nanchang Han Dynasty Haihunhou Historic Site Museum\'s online digital museum was officially launched. The Han Dynasty Haihunhou Historic Site is one of the top ten national archaeological discoveries.'
         ]
       },
       {
-        year: '2019',
+        year: '2015',
         txt: [
-          '2019.04 4DAGE cooperated with Hetjens German Museum of Ceramics in 3D digitization, and developed a digital museum application. As an outstanding case of the Belt and Road Initiative\'s cultural output, the project was included in the case collection of the 2019 Belt and Road Forum.',
-          '2019.05 4DKanKan Pro was unveiled at Rise of AI Conference in Berlin, Germany.'
+          '2015.08 4DAGE, in competition with over 27,000 enterprises, won the China Innovation and Entrepreneurship Competition\'s Outstanding Enterprise Award.',
+          '2015.10 Dr. Cui Yan, founder of 4DAGE, was received by Premier Li Keqiang and commended to him for his work as a representative of the national "Mass Entrepreneurship and Innovation" initiative.',
+          'Became partner of organizations that preserves cultural heritage, including the Palace Museum and Guangdong Provincial Museum.'
         ]
       },
       {
-        year: '2020',
+        year: '2014',
         txt: [
-          '2020.01 In January, 4DKanKan won the new generation of artificial intelligence industry innovation key tasks of the Ministry of Industry and Information Technology.',
-          '2020.02 In February, in order to combat COVID-19, 4Dage united more than 100 local museums to initiated the “Stay at home with online 3D museums” activity voluntarily to to freely expose the resources of 3D museums to the general public, and the number of online visitors has reached 150 million.',
-          '2020.03 In March, a new generation of 3D space camera 4DKanKan Pro was listed on the China Police Equipment Network, 4DKanKan Pro, as an artificial intelligence police equipment product help upgrade smart police.',
-          'In March, 4Dage Exclusively Provides 3D Technical Support for the World\'s Top Art Fair. It was reported by the American business magazine Bloomberg Businessweek because its digital museum has provided great help to people.'
+          '2014.10 4DAGE was founded in October 2014. The founder and senior management are returnees with European doctor\'s or master\'s degrees. They are world leaders in scientific research on AI digital 3D reconstruction and digital virtual display technology.',
+          '2014.12 4DAGE was granted a patent for a raster scanning digital 3D object reconstruction device with micron-level modeling accuracy.'
         ]
       }
     ]

+ 1 - 1
mobile/src/store/language/en/toast.js

@@ -74,7 +74,7 @@ export default{
   '3007': 'User name already exists.',
   '3008': 'The mobile number is already registered.',
   '3009': 'The password you typed don\'t match.',
-  '3010': 'Incorrect user name length.',
+  '3010': 'Incorrect format of mobile number.',
   '3011': 'Password must contain English case and numbers, 8-16 characters. ',
   '3012': 'User name contains sensitive words.',
   '3013': 'Incorrect format of mobile number.',

+ 31 - 5
mobile/src/store/language/index.js

@@ -9,22 +9,48 @@ const en = {
   home: enLang
 }
 
-let current = (localStorage && localStorage.getItem('language')) || '中'
+let current = (localStorage && localStorage.getItem('language')) || 'zh'
+if (current === '中') {
+  current = 'zh'
+}
 document.title = current === 'en' ? '4DKanKan' : '四维看看'
-
-let languageObj = current === '中' ? cn : en
+let languageMap = {
+  zh: cn,
+  en: en,
+  france: en
+}
+let languageObj = languageMap[current]
 
 export default {
   state: {
     ...languageObj,
-    current: current
+    current: current,
+    languageList: [
+      {
+        name: '简体中文',
+        // img: require('@/assets/images/home/China@2x.png'),
+        value: 'zh'
+      },
+      {
+        name: 'English',
+        // img: require('@/assets/images/home/USA@2x.jpg'),
+        value: 'en'
+      }
+      // {
+      //   name: 'Français',
+      //   img: require('@/assets/images/home/France@2x.jpg'),
+      //   value: 'france'
+      // }
+    ]
   },
   mutations: {
     change_language (state, language) {
-      let languageObj = language === '中' ? cn : en
+      let languageObj = languageMap[language]
+      console.log(languageObj)
       Object.keys(languageObj).forEach(key => {
         state[key] = languageObj[key]
       })
+      console.log(language)
       state.current = language
       localStorage.setItem('language', language)
     }

+ 1 - 0
mobile/src/store/user.js

@@ -39,6 +39,7 @@ try {
 
 export default {
   state: {
+    isInternational: process.env.IS_INTERNATIONAL,
     token: token,
     name: null,
     cart: cart,

BIN
pc/src/assets/images/refactor/mall/zhijia-left (1)@2x.png


BIN
pc/src/assets/images/refactor/mall/zhijia-left.png


BIN
pc/src/assets/images/refactor/news/banner.jpg


BIN
pc/src/assets/images/refactor/news/banner@2x.jpg


+ 0 - 1
pc/src/components/Paging/index.vue

@@ -101,7 +101,6 @@ export default {
       if (index > 0 && index <= this.maxPage) {
         this.index = index
       }
-      console.log(this.index, 's')
       this.$emit('clickHandle', this.index)
     }
   },

+ 0 - 3
pc/src/components/citySelect/index.vue

@@ -72,9 +72,6 @@ export default {
         let prov = this.citylist[this.currentPID]
         let city = prov.c[this.currentCID]
         let dist = city.a[this.currentSID]
-        console.log([
-          prov.p, city.n, dist.s
-        ])
         this.$emit('currentVal', [
           prov.p, city.n, dist.s
         ])

+ 0 - 1
pc/src/components/paramstable/index.vue

@@ -19,7 +19,6 @@ export default {
 
   watch: {
     data (val) {
-      console.log(val)
     }
   },
   data () {

+ 0 - 0
pc/src/components/sequence/index.vue


Неке датотеке нису приказане због велике количине промена