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

PC版本功能,英语翻译等基本无问题

xzh 4 роки тому
батько
коміт
f1888b3633
82 змінених файлів з 930 додано та 432 видалено
  1. BIN
      common/data/images/3-1.png
  2. BIN
      common/data/images/3-10.png
  3. BIN
      common/data/images/3-11.png
  4. BIN
      common/data/images/3-12.png
  5. BIN
      common/data/images/3-13.png
  6. BIN
      common/data/images/3-14.png
  7. BIN
      common/data/images/3-15.png
  8. BIN
      common/data/images/3-16.png
  9. BIN
      common/data/images/3-2.png
  10. BIN
      common/data/images/3-3.jpg
  11. BIN
      common/data/images/3-4.png
  12. BIN
      common/data/images/3-5.png
  13. BIN
      common/data/images/3-6.png
  14. BIN
      common/data/images/3-7.png
  15. BIN
      common/data/images/3-8.png
  16. BIN
      common/data/images/3-9.png
  17. 47 12
      common/data/newsData.js
  18. BIN
      pc/src/assets/images/home/chat-logo.png
  19. BIN
      pc/src/assets/images/home/logo-white-en.png
  20. BIN
      pc/src/assets/images/refactor/news/banner3.png
  21. BIN
      pc/src/assets/images/refactor/news/banner3@2x.png
  22. 19 4
      pc/src/components/common/phoneAddressSelect.vue
  23. 5 4
      pc/src/config/mall.js
  24. 16 16
      pc/src/lang/en/modules/agent.js
  25. 8 1
      pc/src/lang/en/modules/common.js
  26. 10 10
      pc/src/lang/en/modules/conduct.js
  27. 12 9
      pc/src/lang/en/modules/header.js
  28. 7 7
      pc/src/lang/en/modules/home.js
  29. 19 0
      pc/src/lang/en/modules/introtow.js
  30. 1 1
      pc/src/lang/en/modules/kankanSpace.js
  31. 28 0
      pc/src/lang/en/modules/login.js
  32. 50 2
      pc/src/lang/en/modules/mall.js
  33. 8 8
      pc/src/lang/en/modules/news.js
  34. 4 1
      pc/src/lang/en/modules/service.js
  35. 8 1
      pc/src/lang/zh/modules/common.js
  36. 19 0
      pc/src/lang/zh/modules/introtow.js
  37. 3 3
      pc/src/lang/zh/modules/kankanSpace.js
  38. 8 3
      pc/src/lang/zh/modules/login.js
  39. 49 1
      pc/src/lang/zh/modules/mall.js
  40. 67 43
      pc/src/lang/zh/modules/news.js
  41. 4 1
      pc/src/lang/zh/modules/service.js
  42. 6 6
      pc/src/page/cases/index.vue
  43. 3 2
      pc/src/page/chat/index.vue
  44. 7 2
      pc/src/page/conduct/conductExhibition/index.vue
  45. 7 2
      pc/src/page/conduct/conductHouse/index.vue
  46. 7 2
      pc/src/page/conduct/conductSecury/index.vue
  47. 7 2
      pc/src/page/conduct/conductShop/index.vue
  48. 21 9
      pc/src/page/conduct/conductSubject/index.vue
  49. 109 25
      pc/src/page/distributor/index.vue
  50. 2 3
      pc/src/page/home2/index.vue
  51. 7 1
      pc/src/page/home2/style.scss
  52. 17 17
      pc/src/page/introtow/index.vue
  53. 11 4
      pc/src/page/layout/footer.vue
  54. 16 5
      pc/src/page/layout/header/index.vue
  55. 2 2
      pc/src/page/layout/header/istyle.scss
  56. 22 22
      pc/src/page/layout/shopHeader/index.vue
  57. 32 7
      pc/src/page/location/index.vue
  58. 1 3
      pc/src/page/login/components/cameraLogin.vue
  59. 14 9
      pc/src/page/login/components/codeLogin.vue
  60. 25 13
      pc/src/page/login/components/forget/emailForm.vue
  61. 2 2
      pc/src/page/login/components/forget/index.vue
  62. 9 8
      pc/src/page/login/components/login.vue
  63. 44 32
      pc/src/page/login/components/register/index.vue
  64. 15 15
      pc/src/page/mall/cart/index.vue
  65. 1 1
      pc/src/page/mall/cloudCapacity/index.vue
  66. 11 11
      pc/src/page/mall/confirm/components/addressModule.vue
  67. 12 11
      pc/src/page/mall/confirm/components/invoiceModule.vue
  68. 18 16
      pc/src/page/mall/confirm/index.vue
  69. 10 4
      pc/src/page/mall/kankanPro/index.vue
  70. 3 1
      pc/src/page/mall/kankanPro/style.scss
  71. 8 8
      pc/src/page/mall/pay/index.vue
  72. 29 9
      pc/src/page/mall/zhijia/index.vue
  73. 3 0
      pc/src/page/mall/zhijia/style.scss
  74. 4 0
      pc/src/page/manage/index.vue
  75. 1 1
      pc/src/page/manage/temp/information.vue
  76. 1 1
      pc/src/page/manage/temp/order.vue
  77. 3 3
      pc/src/page/news/index.vue
  78. 21 21
      pc/src/store/language/cn/about.js
  79. 23 22
      pc/src/store/language/en/about.js
  80. 1 1
      pc/src/store/language/en/purchase.js
  81. 1 1
      pc/src/store/language/index.js
  82. 2 1
      pc/src/util/http.js

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


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


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


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


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


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


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


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


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


BIN
common/data/images/3-3.jpg


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


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


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


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


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


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


+ 47 - 12
common/data/newsData.js

@@ -1,7 +1,7 @@
 import { i18n } from '@/lang'
 import { i18n } from '@/lang'
 export const News = [
 export const News = [
   {
   {
-    img: require('@/../../common/data/images/new-1@2x.png'),
+    img: require('@/../../common/data/images/3-1.png'),
     time: i18n.t('news.newsItem1.time'),
     time: i18n.t('news.newsItem1.time'),
     title: i18n.t('news.newsItem1.title'),
     title: i18n.t('news.newsItem1.title'),
     text: i18n.t('news.newsItem1.text'),
     text: i18n.t('news.newsItem1.text'),
@@ -9,7 +9,7 @@ export const News = [
     link: 'http://www.cnepaper.com/zhtqb/h5/html5/2020-07/15/node_1213.htm'
     link: 'http://www.cnepaper.com/zhtqb/h5/html5/2020-07/15/node_1213.htm'
   },
   },
   {
   {
-    img: require('@/../../common/data/images/new-2@2x.png'),
+    img: require('@/../../common/data/images/3-2.png'),
     time: i18n.t('news.newsItem2.time'),
     time: i18n.t('news.newsItem2.time'),
     title: i18n.t('news.newsItem2.title'),
     title: i18n.t('news.newsItem2.title'),
     text: i18n.t('news.newsItem2.text'),
     text: i18n.t('news.newsItem2.text'),
@@ -17,7 +17,7 @@ export const News = [
     link: 'https://pub-zhtb.hizh.cn/s/202007/14/AP5f0dcd64e4b02ae7a2c80d08.html'
     link: 'https://pub-zhtb.hizh.cn/s/202007/14/AP5f0dcd64e4b02ae7a2c80d08.html'
   },
   },
   {
   {
-    img: require('@/../../common/data/images/new-3@2x.png'),
+    img: require('@/../../common/data/images/3-3.jpg'),
     time: i18n.t('news.newsItem3.time'),
     time: i18n.t('news.newsItem3.time'),
     title: i18n.t('news.newsItem3.title'),
     title: i18n.t('news.newsItem3.title'),
     text: i18n.t('news.newsItem3.text'),
     text: i18n.t('news.newsItem3.text'),
@@ -25,7 +25,7 @@ export const News = [
     link: 'http://ck.xinhuanet.com/info/2020-07-10/1281446776674586624'
     link: 'http://ck.xinhuanet.com/info/2020-07-10/1281446776674586624'
   },
   },
   {
   {
-    img: require('@/../../common/data/images/new-4@2x.png'),
+    img: require('@/../../common/data/images/3-4.png'),
     time: i18n.t('news.newsItem4.time'),
     time: i18n.t('news.newsItem4.time'),
     title: i18n.t('news.newsItem4.title'),
     title: i18n.t('news.newsItem4.title'),
     text: i18n.t('news.newsItem4.text'),
     text: i18n.t('news.newsItem4.text'),
@@ -33,7 +33,7 @@ export const News = [
     link: 'https://mp.weixin.qq.com/s/bEAUkZ68uztqU3kFqEbp8g'
     link: 'https://mp.weixin.qq.com/s/bEAUkZ68uztqU3kFqEbp8g'
   },
   },
   {
   {
-    img: require('@/../../common/data/images/new-5@2x.png'),
+    img: require('@/../../common/data/images/3-5.png'),
     time: i18n.t('news.newsItem5.time'),
     time: i18n.t('news.newsItem5.time'),
     title: i18n.t('news.newsItem5.title'),
     title: i18n.t('news.newsItem5.title'),
     text: i18n.t('news.newsItem5.text'),
     text: i18n.t('news.newsItem5.text'),
@@ -41,7 +41,7 @@ export const News = [
     link: 'https://mp.weixin.qq.com/s/zO0y-v8HcAlUsWDrmxzfOQ'
     link: 'https://mp.weixin.qq.com/s/zO0y-v8HcAlUsWDrmxzfOQ'
   },
   },
   {
   {
-    img: require('@/../../common/data/images/new-6@2x.png'),
+    img: require('@/../../common/data/images/3-6.png'),
     time: i18n.t('news.newsItem6.time'),
     time: i18n.t('news.newsItem6.time'),
     title: i18n.t('news.newsItem6.title'),
     title: i18n.t('news.newsItem6.title'),
     text: i18n.t('news.newsItem6.text'),
     text: i18n.t('news.newsItem6.text'),
@@ -49,7 +49,7 @@ export const News = [
     link: 'http://www.cnepaper.com/gdzjwb/h5/html5/2020-03/16/node_1296.htm?from=groupmessage&isappinstalled=0'
     link: 'http://www.cnepaper.com/gdzjwb/h5/html5/2020-03/16/node_1296.htm?from=groupmessage&isappinstalled=0'
   },
   },
   {
   {
-    img: require('@/../../common/data/images/new-7@2x.png'),
+    img: require('@/../../common/data/images/3-7.png'),
     time: i18n.t('news.newsItem7.time'),
     time: i18n.t('news.newsItem7.time'),
     title: i18n.t('news.newsItem7.title'),
     title: i18n.t('news.newsItem7.title'),
     text: i18n.t('news.newsItem7.text'),
     text: i18n.t('news.newsItem7.text'),
@@ -57,7 +57,7 @@ export const News = [
     link: 'http://www.cpolicee.com/newssz.asp?id=5412&from=groupmessage&isappinstalled=0'
     link: 'http://www.cpolicee.com/newssz.asp?id=5412&from=groupmessage&isappinstalled=0'
   },
   },
   {
   {
-    img: require('@/../../common/data/images/new-8@2x.png'),
+    img: require('@/../../common/data/images/3-8.png'),
     time: i18n.t('news.newsItem8.time'),
     time: i18n.t('news.newsItem8.time'),
     title: i18n.t('news.newsItem8.title'),
     title: i18n.t('news.newsItem8.title'),
     text: i18n.t('news.newsItem8.text'),
     text: i18n.t('news.newsItem8.text'),
@@ -65,7 +65,7 @@ export const News = [
     link: 'https://mp.weixin.qq.com/s/FU1YHG8LTI0gsWBwvi4uPA'
     link: 'https://mp.weixin.qq.com/s/FU1YHG8LTI0gsWBwvi4uPA'
   },
   },
   {
   {
-    img: require('@/../../common/data/images/new-9@2x.png'),
+    img: require('@/../../common/data/images/3-9.png'),
     time: i18n.t('news.newsItem9.time'),
     time: i18n.t('news.newsItem9.time'),
     title: i18n.t('news.newsItem9.title'),
     title: i18n.t('news.newsItem9.title'),
     text: i18n.t('news.newsItem9.text'),
     text: i18n.t('news.newsItem9.text'),
@@ -73,7 +73,7 @@ export const News = [
     link: 'https://mp.weixin.qq.com/s/E98JyaHjGOu6Gfzidvtqwg'
     link: 'https://mp.weixin.qq.com/s/E98JyaHjGOu6Gfzidvtqwg'
   },
   },
   {
   {
-    img: require('@/../../common/data/images/new-10@2x.png'),
+    img: require('@/../../common/data/images/3-10.png'),
     time: i18n.t('news.newsItem10.time'),
     time: i18n.t('news.newsItem10.time'),
     title: i18n.t('news.newsItem10.title'),
     title: i18n.t('news.newsItem10.title'),
     text: i18n.t('news.newsItem10.text'),
     text: i18n.t('news.newsItem10.text'),
@@ -81,7 +81,7 @@ export const News = [
     link: 'https://mp.weixin.qq.com/s/DctqPBXlbXS9FHA7tAibzQ'
     link: 'https://mp.weixin.qq.com/s/DctqPBXlbXS9FHA7tAibzQ'
   },
   },
   {
   {
-    img: require('@/../../common/data/images/new-11@2x.png'),
+    img: require('@/../../common/data/images/3-11.png'),
     time: i18n.t('news.newsItem11.time'),
     time: i18n.t('news.newsItem11.time'),
     title: i18n.t('news.newsItem11.title'),
     title: i18n.t('news.newsItem11.title'),
     text: i18n.t('news.newsItem11.text'),
     text: i18n.t('news.newsItem11.text'),
@@ -89,11 +89,46 @@ export const News = [
     link: 'https://www.chinaz.com/news/mt/2019/0509/1015191.shtml?qq-pf-to=pcqq.c2c'
     link: 'https://www.chinaz.com/news/mt/2019/0509/1015191.shtml?qq-pf-to=pcqq.c2c'
   },
   },
   {
   {
-    img: require('@/../../common/data/images/new-12@2x.png'),
+    img: require('@/../../common/data/images/3-12.png'),
     time: i18n.t('news.newsItem12.time'),
     time: i18n.t('news.newsItem12.time'),
     title: i18n.t('news.newsItem12.title'),
     title: i18n.t('news.newsItem12.title'),
     text: i18n.t('news.newsItem12.text'),
     text: i18n.t('news.newsItem12.text'),
     sub: i18n.t('news.newsItem12.sub'),
     sub: i18n.t('news.newsItem12.sub'),
     link: 'https://baijiahao.baidu.com/s?id=1631864683811023774&wfr=spider&for=pc'
     link: 'https://baijiahao.baidu.com/s?id=1631864683811023774&wfr=spider&for=pc'
   }
   }
+  ,
+  {
+    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'
+  },
+  {
+    img: require('@/../../common/data/images/3-14.png'),
+    time: i18n.t('news.newsItem14.time'),
+    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'
+  }
+  ,
+  {
+    img: require('@/../../common/data/images/3-15.png'),
+    time: i18n.t('news.newsItem15.time'),
+    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'
+  }
+  ,
+  {
+    img: require('@/../../common/data/images/3-16.png'),
+    time: i18n.t('news.newsItem16.time'),
+    title: i18n.t('news.newsItem16.title'),
+    text: i18n.t('news.newsItem16.text'),
+    sub: i18n.t('news.newsItem16.sub'),
+    link: 'https://baijiahao.baidu.com/s?id=1631864683811023774&wfr=spider&for=pc'
+  }
 ]
 ]

BIN
pc/src/assets/images/home/chat-logo.png


BIN
pc/src/assets/images/home/logo-white-en.png


BIN
pc/src/assets/images/refactor/news/banner3.png


BIN
pc/src/assets/images/refactor/news/banner3@2x.png


+ 19 - 4
pc/src/components/common/phoneAddressSelect.vue

@@ -1,17 +1,20 @@
 <template>
 <template>
-  <div class="phone-address">
-    <div class="search-w" @click.stop="">
-      <input class="search-input" placeholder="搜索" type="text" v-model="keyword">
+  <div class="phone-address" @click.stop="">
+    <div class="search-w" >
+      <input class="search-input" :placeholder="$t('common.search')" type="text" v-model="keyword">
       <h-icon type="sousuo" class="sousuo-icon" />
       <h-icon type="sousuo" class="sousuo-icon" />
     </div>
     </div>
     <ul class="num-list">
     <ul class="num-list">
-      <li class="num-item" v-for="(item, index) in selectCall" :key="index" @click="selectPhone(item)">{{`${item[1]}(${item[0]})`}}</li>
+      <li class="num-item" v-for="(item, index) in selectCall" :key="index" @click="selectPhone(item)">{{`${item[1]}(${item[language === 'en' ? 2 : 0]})`}}</li>
     </ul>
     </ul>
   </div>
   </div>
 </template>
 </template>
 
 
 <script>
 <script>
 import selectCall from '@/util/country.js'
 import selectCall from '@/util/country.js'
+import { mapState } from 'vuex'
+
+let fn = {}
 export default {
 export default {
   data () {
   data () {
     return {
     return {
@@ -19,10 +22,22 @@ export default {
     }
     }
   },
   },
   computed: {
   computed: {
+    ...mapState({
+      language: state => state.language.current
+    }),
     selectCall () {
     selectCall () {
       return selectCall.filter(item => `${item[1]}(${item[0]})`.indexOf(this.keyword) > -1)
       return selectCall.filter(item => `${item[1]}(${item[0]})`.indexOf(this.keyword) > -1)
     }
     }
   },
   },
+  mounted () {
+    fn = () => {
+      this.selectPhone()
+    }
+    document.addEventListener('click', fn)
+  },
+  beforeDestroy () {
+    document.removeEventListener('click', fn)
+  },
   methods: {
   methods: {
     selectPhone (item) {
     selectPhone (item) {
       this.$emit('select', item)
       this.$emit('select', item)

+ 5 - 4
pc/src/config/mall.js

@@ -1,3 +1,4 @@
+import { i18n } from '@/lang'
 function formatNum(num){
 function formatNum(num){
   return (num.toFixed(0) + '').replace(/\d{1,3}(?=(\d{3})+(\.\d*)?$)/g, '$&,');
   return (num.toFixed(0) + '').replace(/\d{1,3}(?=(\d{3})+(\.\d*)?$)/g, '$&,');
 }
 }
@@ -36,16 +37,16 @@ const zhijiaPrice = 899
 
 
 const goodsMap = {
 const goodsMap = {
   4: {
   4: {
-    name: '四维看看Pro八目相机',
+    name: i18n.t('mall.kankanPro'),
     img: `${window.$app.$cdn}images/banner_pro.png`,
     img: `${window.$app.$cdn}images/banner_pro.png`,
-    detail: ['四维看看Pro八目相机(静谧黑)', '容量套餐(10G)'],
+    detail: [`${i18n.t('mall.kankanPro')}(${i18n.t('mall.blackColor')})`, i18n.t('mall.voice')],
     price: price,
     price: price,
     skuSn: 'U15609161635760015'
     skuSn: 'U15609161635760015'
   },
   },
   7: {
   7: {
-    name: '四维看看Pro精选三脚架套装',
+    name: i18n.t('mall.jiaojia'),
     img: `${window.$app.$cdn}images/zhijia.png`,
     img: `${window.$app.$cdn}images/zhijia.png`,
-    detail:  ['四维看看Pro精选三脚架套装(标准色)'],
+    detail:  [`${i18n.t('mall.jiaojia')}(${i18n.t('mall.zhijiaColor')})`],
     price: zhijiaPrice,
     price: zhijiaPrice,
     skuSn: 'U15604134406280073'
     skuSn: 'U15604134406280073'
   }
   }

+ 16 - 16
pc/src/lang/en/modules/agent.js

@@ -1,10 +1,10 @@
 module.exports = {
 module.exports = {
-    "bannerTitle": "Become a distributor of 4D KanKan",
-    "planTitle": "Outline of 4D KanKan 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 4D KanKan 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.",
+    "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",
     "advanTitle": "Benefits of Being our Valued Distributor",
     "advan": {
     "advan": {
         "item1Title": "Share the Profit",
         "item1Title": "Share the Profit",
@@ -18,30 +18,30 @@ module.exports = {
         "item5Title": "Growth Opportunity",
         "item5Title": "Growth Opportunity",
         "item5Sub": "Opportunities to Join Exhibitions and Professional Conferences"
         "item5Sub": "Opportunities to Join Exhibitions and Professional Conferences"
     },
     },
-    "jinxiaoTitle": "Become a distributor of 4D KanKan",
+    "jinxiaoTitle": "Become A Distributor of 4DKanKan",
     "jinxiaoForm": {
     "jinxiaoForm": {
         "companytitle": "Company Information",
         "companytitle": "Company Information",
         "companyNameLabel": "Registered Company Name",
         "companyNameLabel": "Registered Company Name",
-        "companyNamePlaceholder": "Please input the registered company name",
+        "companyNamePlaceholder": "Please Input the Registered Company Name",
         "addressLabel": "Company Address",
         "addressLabel": "Company Address",
         "addressPlaceholder1": "Country",
         "addressPlaceholder1": "Country",
         "addressPlaceholder2": "Region",
         "addressPlaceholder2": "Region",
-        "addressPlaceholder3": "Please input the detailed address of your company",
-        "storeLabel": "Do you have a retail shop or a company website?",
+        "addressPlaceholder3": "Please Input the Detailed Address of Your Company",
+        "storeLabel": "Do You Have A Retail Shop or A Company Website?",
         "storeType1": "Mainly Offline Sales",
         "storeType1": "Mainly Offline Sales",
         "storeType2": "Mainly Online Sales",
         "storeType2": "Mainly Online Sales",
-        "storePlaceholder": "Please input the detailed address of your retail shop",
+        "storePlaceholder": "Please Input the Detailed Address of Your Retail Shop",
         "applytitle": "Applicant Information",
         "applytitle": "Applicant Information",
         "applyNameXing": "Last Name",
         "applyNameXing": "Last Name",
         "applyNameMing": "First Name",
         "applyNameMing": "First Name",
-        "applyNamePlaceholder": "Please input the last name",
-        "applyNamePlaceholder1": "Please input the first name",
+        "applyNamePlaceholder": "Please Input the Last Name",
+        "applyNamePlaceholder1": "Please Input the First Name",
         "positionLabel": "Title",
         "positionLabel": "Title",
-        "positionPlaceholder": "Please input the title",
+        "positionPlaceholder": "Please Input the Title",
         "phoneLabel": "Phone",
         "phoneLabel": "Phone",
-        "phonePlaceholder": "Please input the phone",
+        "phonePlaceholder": "Please Input the Phone",
         "emailLabel": "Email",
         "emailLabel": "Email",
-        "emailPlaceholder": "Please input the email",
+        "emailPlaceholder": "Please Input the Email",
         "submit": "Submit"
         "submit": "Submit"
     }
     }
 }
 }

+ 8 - 1
pc/src/lang/en/modules/common.js

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

+ 10 - 10
pc/src/lang/en/modules/conduct.js

@@ -1,17 +1,17 @@
 module.exports = {
 module.exports = {
     "__name": "核心产品",
     "__name": "核心产品",
     "coreProduct": {
     "coreProduct": {
-        "bannerTitle": "Core Product",
-        "itemTitle1": "Autonomous& Accurate Modeling,Automatic Distance Measurement",
+        "bannerTitle": "Product",
+        "itemTitle1": "Autonomous & Accurate Modeling,Automatic Distance Measurement",
         "itemTitle2": "720° Immersive Roaming with 8K Picture Quality",
         "itemTitle2": "720° Immersive Roaming with 8K Picture Quality",
         "itemTitle3": "HDR Mode Balances Light and Dark Area Exposure",
         "itemTitle3": "HDR Mode Balances Light and Dark Area Exposure",
         "itemTitle4": "Real-time Panoramic Video to Create an Immersive Experience",
         "itemTitle4": "Real-time Panoramic Video to Create an Immersive Experience",
         "itemTitle5": "10 Minutes to Start, Easy to Operation",
         "itemTitle5": "10 Minutes to Start, Easy to Operation",
-        "itemTitle6": "Autonomous Space Modeling in 10 Minutes, Efficient and Fast(About 100㎡)",
+        "itemTitle6": "Autonomous Space Modeling in 10 Minutes. (About 100㎡)",
         "itemTitle7": "Multifunctional Editing Tool, Let Space Tell the Story"
         "itemTitle7": "Multifunctional Editing Tool, Let Space Tell the Story"
     },
     },
     "coreTech": {
     "coreTech": {
-        "bannerTitle": "Core Technology",
+        "bannerTitle": "Technology",
         "itemTitle1": "Space Digitization",
         "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",
         "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",
         "itemTitle2": "Space Interaction",
@@ -20,41 +20,41 @@ module.exports = {
         "item2Name2": "Interactive Video",
         "item2Name2": "Interactive Video",
         "item2Name3": "Automatic Tour",
         "item2Name3": "Automatic Tour",
         "itemTitle3": "Space Display",
         "itemTitle3": "Space Display",
-        "itemText3": "Offers a 720° immersive roaming experience on mobile phone, tablet, PC and VR glasses device without plug-ins.",
+        "itemText3": "Offers a 720° Immersive Roaming Experience on Mobile Phone, Tablet, PC and VR Glasses without Plug-ins",
         "item3Name1": "VR",
         "item3Name1": "VR",
         "item3Name2": "PC",
         "item3Name2": "PC",
         "item3Name3": "Mobile"
         "item3Name3": "Mobile"
     },
     },
     "conductHouse": {
     "conductHouse": {
-        "bannerTitle": "4DKanKan—Realestate, Mass Reconstruction of the Real Houses",
+        "bannerTitle": "4DKanKan<br/>Realestate, Mass Reconstruction<br/>of the Real Houses",
         "itemTitle1": "AI Automatic Modeling, Efficient Reconstruct the Real Houses",
         "itemTitle1": "AI Automatic Modeling, Efficient Reconstruct the Real Houses",
         "itemTitle2": "Display All the Details, More Efficient for Sales and Rental Decisions",
         "itemTitle2": "Display All the Details, More Efficient for Sales and Rental Decisions",
         "itemTitle3": "Multidimensional Display the Information of Real-estate with Higher Efficiency",
         "itemTitle3": "Multidimensional Display the Information of Real-estate with Higher Efficiency",
         "itemTitle4": "Multifunctional Editing Tool, Let Houses Display Better"
         "itemTitle4": "Multifunctional Editing Tool, Let Houses Display Better"
     },
     },
     "conductExhibition": {
     "conductExhibition": {
-        "bannerTitle": "4DKanKan—Exhibition, Participate in Exhibitions without Any Limitations",
+        "bannerTitle": "4DKanKan<br/>Exhibition, Participate in Exhibitions<br/>without Any Limitations",
         "itemTitle1": "Online Visiting and Negotiation, Exchange Business Cards Freely",
         "itemTitle1": "Online Visiting and Negotiation, Exchange Business Cards Freely",
         "itemTitle2": "No Barries to Communication, Easy to Get All the Information",
         "itemTitle2": "No Barries to Communication, Easy to Get All the Information",
         "itemTitle3": "Reduce the Cost of Exhibitions, Promote Transactions Effectively",
         "itemTitle3": "Reduce the Cost of Exhibitions, Promote Transactions Effectively",
         "itemTitle4": "Statistic Data Flow, Analyze User Persona"
         "itemTitle4": "Statistic Data Flow, Analyze User Persona"
     },
     },
     "conductSubject": {
     "conductSubject": {
-        "bannerTitle": "4DKanKan--Culture& Relics, Help to Create Never-ending Museums",
+        "bannerTitle": "4DKanKan<br/>Culture & Relics, Help to Create<br/>Never-ending Museums",
         "itemTitle1": "Digital Twin of Treasure Relics,Break the Time Limitation",
         "itemTitle1": "Digital Twin of Treasure Relics,Break the Time Limitation",
         "itemTitle2": "Various Forms of Spatial Interaction, Carrying Rich Historical Heritage",
         "itemTitle2": "Various Forms of Spatial Interaction, Carrying Rich Historical Heritage",
         "itemTitle3": "Simultaneous Operation by Multi-user, Listening to Historical Stories",
         "itemTitle3": "Simultaneous Operation by Multi-user, Listening to Historical Stories",
         "itemTitle4": "Promote Social Science Education and Help Cultural Communication"
         "itemTitle4": "Promote Social Science Education and Help Cultural Communication"
     },
     },
     "conductShop": {
     "conductShop": {
-        "bannerTitle": "4DKanKan—E-commerce,Free Shopping without Any Limitations",
+        "bannerTitle": "4DKanKan<br/>E-commerce,Free Shopping<br/>without Any Limitations",
         "itemTitle1": "New Immersive Shopping Experience in 3D Digital Business District",
         "itemTitle1": "New Immersive Shopping Experience in 3D Digital Business District",
         "itemTitle2": "Shopping in the Real 3D Models through Mobile Phones",
         "itemTitle2": "Shopping in the Real 3D Models through Mobile Phones",
         "itemTitle3": "Gather Online Passenger Flow and Boost Offline Economy",
         "itemTitle3": "Gather Online Passenger Flow and Boost Offline Economy",
         "itemTitle4": "Personal Customer Service,Real-time Communications"
         "itemTitle4": "Personal Customer Service,Real-time Communications"
     },
     },
     "conductSecury": {
     "conductSecury": {
-        "bannerTitle": "Security Survey",
+        "bannerTitle": "4DKanKan<br/>Security Survey",
         "itemTitle1": "Reconstruct Disaster Scenes Efficiently,Create Comprehensive 3D Files",
         "itemTitle1": "Reconstruct Disaster Scenes Efficiently,Create Comprehensive 3D Files",
         "itemTitle2": "Multifunctional Editing Tool,Improve the Communication Quality",
         "itemTitle2": "Multifunctional Editing Tool,Improve the Communication Quality",
         "itemTitle3": "Pre-collection is Available,Reduce the Claims Disputes"
         "itemTitle3": "Pre-collection is Available,Reduce the Claims Disputes"

+ 12 - 9
pc/src/lang/en/modules/header.js

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

+ 7 - 7
pc/src/lang/en/modules/home.js

@@ -1,24 +1,24 @@
 module.exports = {
 module.exports = {
-    "bannerText": "Real-time Accurate Reconstruction, Pass the Valve of Space",
+    "bannerText": "Real-time Accurate Reconstruction, Pass the Value of Space",
     "bannerBuyBtnText": "Buy Now",
     "bannerBuyBtnText": "Buy Now",
     "bannerMoreBtn": "Learn More",
     "bannerMoreBtn": "Learn More",
     "bannerIntroVideo": "Introduction Video",
     "bannerIntroVideo": "Introduction Video",
     "bannerAgent": "Be A Distributor",
     "bannerAgent": "Be A Distributor",
     "plate1Title": "Solutions",
     "plate1Title": "Solutions",
-    "plate2Title": "4DKanKan--Space",
-    "plate3Title": "Core Technology",
+    "plate2Title": "KanKan-Space",
+    "plate3Title": "Technology",
     "plate4Title": "News",
     "plate4Title": "News",
     "plate5Title": "Partners",
     "plate5Title": "Partners",
     "plate1Item1": "Real-estate Marketing",
     "plate1Item1": "Real-estate Marketing",
     "plate1Item2": "Online Exhibition",
     "plate1Item2": "Online Exhibition",
-    "plate1Item3": "Smart Culture& Relics",
+    "plate1Item3": "Smart Culture & Relics",
     "plate1Item4": "VR Shopping",
     "plate1Item4": "VR Shopping",
     "plate1Item5": "Security Survey",
     "plate1Item5": "Security Survey",
     "plate1Item1SubTitle": "Mass Reconstruction of the Real Houses",
     "plate1Item1SubTitle": "Mass Reconstruction of the Real Houses",
     "plate1Item1Desc1": "AI Automatic Modeling, Efficient Reconstruct the Real Houses",
     "plate1Item1Desc1": "AI Automatic Modeling, Efficient Reconstruct the Real Houses",
     "plate1Item1Desc2": "VR Guidance/ VR Explanation,Display All the Details",
     "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",
+    "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",
     "plate1Item2SubTitle": "All-round Reconstruction of Exhibition Information, Without Any Limitations",
     "plate1Item2Desc1": "AI Image Reconstruction Technology, Create the Digital Twin of Offline Exhibition",
     "plate1Item2Desc1": "AI Image Reconstruction Technology, Create the Digital Twin of Offline Exhibition",
     "plate1Item2Desc2": "Interactive 3D Exhibits, 720° Immersive Roaming",
     "plate1Item2Desc2": "Interactive 3D Exhibits, 720° Immersive Roaming",
@@ -40,7 +40,7 @@ module.exports = {
     "plate2Item1": "Yongzheng Palace",
     "plate2Item1": "Yongzheng Palace",
     "plate2Item2": "Xiaomi",
     "plate2Item2": "Xiaomi",
     "plate2Item3": "Huafa Mountain Mansion",
     "plate2Item3": "Huafa Mountain Mansion",
-    "plate2Item4": "Marriott",
+    "plate2Item4": "Marriott Hotel",
     "plate3Item1Title": "Space Digitization",
     "plate3Item1Title": "Space Digitization",
     "plate3Item1Text": "Automatically 3D Digital Reconstruction, Restore Spatial Layout and Structure",
     "plate3Item1Text": "Automatically 3D Digital Reconstruction, Restore Spatial Layout and Structure",
     "plate3Item2Title": "Space Interaction",
     "plate3Item2Title": "Space Interaction",

+ 19 - 0
pc/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"
+}

+ 1 - 1
pc/src/lang/en/modules/kankanSpace.js

@@ -1,5 +1,5 @@
 module.exports = {
 module.exports = {
-    "title": "4DKanKan--Space",
+    "title": "KanKan-Space",
     "typeAll": "All",
     "typeAll": "All",
     "typeHouse": "Real-estate",
     "typeHouse": "Real-estate",
     "typeExihibition": "Exhibition",
     "typeExihibition": "Exhibition",

+ 28 - 0
pc/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"
+}

+ 50 - 2
pc/src/lang/en/modules/mall.js

@@ -5,12 +5,60 @@ module.exports = {
     "standard": "Standard Package",
     "standard": "Standard Package",
     "addCou": "Value-added Package (including tripod)",
     "addCou": "Value-added Package (including tripod)",
     "count": "Amount",
     "count": "Amount",
-    "couTip": "Whether Need to Add Recommended Accessories (Standard Package Does Not Include the Following Accessories)",
+    "couTip": "Whether Need to Add Feature Kit (Standard Package Does Not Include the Feature Kit",
     "jiaojia": "4DKanKan Pro Tripod Set",
     "jiaojia": "4DKanKan Pro Tripod Set",
     "jiaojiaDetail": "Tripod + Pulley + Ball Head",
     "jiaojiaDetail": "Tripod + Pulley + Ball Head",
     "cart": "Add to the Shop Cart",
     "cart": "Add to the Shop Cart",
     "fahuo": "Expected to Ship within Three Days",
     "fahuo": "Expected to Ship within Three Days",
     "product": "Product Manual",
     "product": "Product Manual",
     "techDetail": "Technical Parameters",
     "techDetail": "Technical Parameters",
-    "widthDetail": "Size 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"
 }
 }

+ 8 - 8
pc/src/lang/en/modules/news.js

@@ -1,15 +1,15 @@
 module.exports = {
 module.exports = {
     "newsItem1": {
     "newsItem1": {
-        "time": "2020年7月15日",
-        "title": "四维时代发布3D空间相机,珠海助力高科技后疫情时代",
-        "text": "疫情挡不住珠海高科技企业的研发步伐。7约14日,记者在珠海市四维时代网络科技有限公司采访获悉,四维时代在疫情期加紧研发,构建出一套稳定、精确且低成本的数字化解决方案 - 四维看看Pro,并在行业内首次实现低成本、快速复制和规模化,为助力",
-        "sub": "珠海特区报"
+        "time": "2017-06-02",
+        "title": "两国总理见证中德智能新合作,欧时专访四维时代董事长崔岩",
+        "text": "【欧洲时报记者张乔楠柏林报道】6月1日上午,在中德两国总理的见证下,双方签署多项合作备忘录。签约现场,一家年轻的企业引起了记者注意,其所涉及的人工智能合作也是两国创新合作最火热的议题之一。签约仪式后,本报记者对这家企业进行了专访。",
+        "sub": "欧洲时报"
     },
     },
     "newsItem2": {
     "newsItem2": {
-        "time": "2020年7月14日",
-        "title": "“四维看看Pro”来了!珠海高科技企业助力经济发展",
-        "text": "疫情阻挡不了珠海高科技企业的研发步伐。7月14日,记者在珠海市四维时代网络科技有限公司采访获悉,四维时代在疫情期间加紧研发,构建出了一套稳定、精确且低成本的数字化解决方案——四维看看Pro,并在行业内首次实现低成本、快速复制和规模化,为助力后疫情时代经济发展贡献珠海高科技力量。",
-        "sub": "观海融媒"
+        "time": "2020-07-08",
+        "title": "「四维时代」发布新品3D相机四维看看Pro,售价不到一万元的VR信息采集设备",
+        "text": "2020年上半年的疫情防疫措施,使国内房地产企业纷纷通过VR看房形式进行带看。四维时代近期发布了3D空间相机四维看看Pro,为相关领域提供稳定、精确且低成本的数字化解决方案,并在行业内首次实现低成本、快速复制和规模化。该产品售价9800元,可以帮助使用者通过简单操作录入大量VR信息。",
+        "sub": "36Kr"
     },
     },
     "newsItem3": {
     "newsItem3": {
         "time": "2020年7月10日",
         "time": "2020年7月10日",

+ 4 - 1
pc/src/lang/en/modules/service.js

@@ -3,5 +3,8 @@ module.exports = {
     "mVideo": "Video Tutorial",
     "mVideo": "Video Tutorial",
     "use": "User Tutorial",
     "use": "User Tutorial",
     "app": "APP Download",
     "app": "APP Download",
-    "clause": "Warranty Policy"
+    "clause": "Warranty Information",
+    "appDownload": {
+        "downloadTip": "Please Scan The QR Code to Install The App."
+    }
 }
 }

+ 8 - 1
pc/src/lang/zh/modules/common.js

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

+ 19 - 0
pc/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: '应付金额'
+}

+ 3 - 3
pc/src/lang/zh/modules/kankanSpace.js

@@ -1,10 +1,10 @@
 module.exports = {
 module.exports = {
     "title": "看看空间",
     "title": "看看空间",
     "typeAll": "全部",
     "typeAll": "全部",
-    "typeHouse": "地产",
+    "typeHouse": "地产",
     "typeExihibition": "会展",
     "typeExihibition": "会展",
-    "typeSubject": "博物馆",
-    "typeShop": "商",
+    "typeSubject": "博",
+    "typeShop": "商",
     "typeFoot": "餐饮",
     "typeFoot": "餐饮",
     "typeOther": "其它",
     "typeOther": "其它",
     "recommend": "精品推荐",
     "recommend": "精品推荐",

+ 8 - 3
pc/src/lang/zh/modules/login.js

@@ -4,6 +4,7 @@ module.exports = {
   userLogin: '用户登录',
   userLogin: '用户登录',
   cameraLogin: '相机登录',
   cameraLogin: '相机登录',
   codeLogin: '验证码登录',
   codeLogin: '验证码登录',
+  passwordLogin: '密码登录',
   phonePlaceholder: '请输入手机号码',
   phonePlaceholder: '请输入手机号码',
   passwordPlaceholder: '请输入密码',
   passwordPlaceholder: '请输入密码',
   codePlaceholder: '请输入验证码',
   codePlaceholder: '请输入验证码',
@@ -15,9 +16,13 @@ module.exports = {
   kankanAccountRegister: '四维账号注册',
   kankanAccountRegister: '四维账号注册',
   setPassword: '设置密码',
   setPassword: '设置密码',
   rePassword: '重复密码',
   rePassword: '重复密码',
-  cluse: '我已阅读并同意四维看看用户协议',
+  cluse: '我已阅读并同意四维看看用户协议',
   findPassword: '找回密码',
   findPassword: '找回密码',
-  emailPlaceholder: '邮箱地址',
+  emailPlaceholder: '请输入邮箱地址',
   hasAccount: '已有账号,',
   hasAccount: '已有账号,',
-  zhijieLogin: '直接登录'
+  zhijieLogin: '直接登录',
+  resendTime: '{time}s后重新发送',
+  passwordTip: '密码必须包含英文大小写、数字、长度8-16个字符',
+  currentEmailTip: '请填写正确的邮箱',
+  agreeXieyi: '请阅读并同意四维看看用户协议',
 }
 }

+ 49 - 1
pc/src/lang/zh/modules/mall.js

@@ -12,5 +12,53 @@ module.exports = {
     "fahuo": "预计3日内发货",
     "fahuo": "预计3日内发货",
     "product": "产品说明",
     "product": "产品说明",
     "techDetail": "技术参数",
     "techDetail": "技术参数",
-    "widthDetail": "尺寸参数"
+    "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: '纳税人识别号'
 }
 }

Різницю між файлами не показано, бо вона завелика
+ 67 - 43
pc/src/lang/zh/modules/news.js


+ 4 - 1
pc/src/lang/zh/modules/service.js

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

+ 6 - 6
pc/src/page/cases/index.vue

@@ -57,20 +57,20 @@ const types = [
     id: 2,
     id: 2,
     name: i18n.t('kankanSpace.typeHouse')
     name: i18n.t('kankanSpace.typeHouse')
   },
   },
+  // {
+  //   id: 1,
+  //   name: i18n.t('kankanSpace.typeExihibition')
+  // },
   {
   {
     id: 1,
     id: 1,
-    name: i18n.t('kankanSpace.typeExihibition')
-  },
-  {
-    id: 4,
     name: i18n.t('kankanSpace.typeSubject')
     name: i18n.t('kankanSpace.typeSubject')
   },
   },
   {
   {
-    id: null,
+    id: 3,
     name: i18n.t('kankanSpace.typeShop')
     name: i18n.t('kankanSpace.typeShop')
   },
   },
   {
   {
-    id: null,
+    id: 4,
     name: i18n.t('kankanSpace.typeFoot')
     name: i18n.t('kankanSpace.typeFoot')
   },
   },
   {
   {

+ 3 - 2
pc/src/page/chat/index.vue

@@ -2,7 +2,7 @@
   <div class="chat-layout">
   <div class="chat-layout">
     <div class="hover-btn" @click="showAside=!showAside">
     <div class="hover-btn" @click="showAside=!showAside">
       <vcenter>
       <vcenter>
-        <img :class="{'img-active':!showAside}" :src="`${$cdn}images/chat-btn.png`" alt="">
+        <img :class="{'img-active':!showAside}" src="@/assets/images/home/chat-logo.png" alt="">
         <img :class="{'img-active':showAside}" :src="`${$cdn}images/chat-close.png`" alt="">
         <img :class="{'img-active':showAside}" :src="`${$cdn}images/chat-close.png`" alt="">
       </vcenter>
       </vcenter>
     </div>
     </div>
@@ -58,6 +58,7 @@ export default {
     async send () {
     async send () {
       let {content, email} = this
       let {content, email} = this
       if (!content || !email) {
       if (!content || !email) {
+        this.$alert(this.$t('common.formTip'))
         return
         return
       }
       }
       if (!reg.email.test(email) && !reg.guhua.test(email)) {
       if (!reg.email.test(email) && !reg.guhua.test(email)) {
@@ -146,7 +147,7 @@ $lincolor:#d0d0d1;
 }
 }
 
 
 .chat-layout {
 .chat-layout {
-  $wh: 60px;
+  $wh: 72px;
   position: fixed;
   position: fixed;
   bottom: 0;
   bottom: 0;
   right: 0;
   right: 0;

+ 7 - 2
pc/src/page/conduct/conductExhibition/index.vue

@@ -1,7 +1,7 @@
 <template>
 <template>
   <div class="conduct-display">
   <div class="conduct-display">
     <div class="banner">
     <div class="banner">
-      <div class="container">{{$t('conduct.conductExhibition.bannerTitle')}}</div>
+      <div class="container" v-html="$t('conduct.conductExhibition.bannerTitle')"></div>
     </div>
     </div>
     <div class="plate-w" ref="homeLayout">
     <div class="plate-w" ref="homeLayout">
       <div class="plate item" v-for="(item,i) in sequenceArr" :key="i">
       <div class="plate item" v-for="(item,i) in sequenceArr" :key="i">
@@ -61,9 +61,13 @@ export default {
     width: 100%;
     width: 100%;
     height: 420px;
     height: 420px;
     background: url(~@/assets/images/refactor/conductExhibition/banner.png) no-repeat center center;
     background: url(~@/assets/images/refactor/conductExhibition/banner.png) no-repeat center center;
-    line-height: 420px;
     font-size: 40px;
     font-size: 40px;
     margin-bottom: 0;
     margin-bottom: 0;
+    line-height: 56px;
+    .container {
+      display: flex;
+      align-items: center;
+    }
   }
   }
   .item {
   .item {
     padding: 110px 0 0;
     padding: 110px 0 0;
@@ -77,6 +81,7 @@ export default {
   .common-title {
   .common-title {
     margin-top: 0;
     margin-top: 0;
     margin-bottom: 50px;
     margin-bottom: 50px;
+    font-size: 30px;
   }
   }
   .sub-list {
   .sub-list {
     li {
     li {

+ 7 - 2
pc/src/page/conduct/conductHouse/index.vue

@@ -1,7 +1,7 @@
 <template>
 <template>
   <div class="conduct-house">
   <div class="conduct-house">
     <div class="banner">
     <div class="banner">
-      <div class="container">{{ $t('conduct.conductHouse.bannerTitle') }}</div>
+      <div class="container" v-html="$t('conduct.conductHouse.bannerTitle')"></div>
     </div>
     </div>
     <div class="plate-w" ref="homeLayout">
     <div class="plate-w" ref="homeLayout">
       <div class="plate item" v-for="(item,i) in sequenceArr" :key="i">
       <div class="plate item" v-for="(item,i) in sequenceArr" :key="i">
@@ -74,9 +74,13 @@ export default {
     width: 100%;
     width: 100%;
     height: 420px;
     height: 420px;
     background: url(~@/assets/images/online/house/banner.jpg) no-repeat center center;
     background: url(~@/assets/images/online/house/banner.jpg) no-repeat center center;
-    line-height: 420px;
     font-size: 40px;
     font-size: 40px;
     margin-bottom: 0;
     margin-bottom: 0;
+    line-height: 56px;
+    .container {
+      display: flex;
+      align-items: center;
+    }
   }
   }
   .item {
   .item {
     padding: 110px 0 0;
     padding: 110px 0 0;
@@ -90,6 +94,7 @@ export default {
   .common-title {
   .common-title {
     margin-top: 0;
     margin-top: 0;
     margin-bottom: 50px;
     margin-bottom: 50px;
+    font-size: 30px;
   }
   }
   .sub-list {
   .sub-list {
     li {
     li {

+ 7 - 2
pc/src/page/conduct/conductSecury/index.vue

@@ -1,7 +1,7 @@
 <template>
 <template>
   <div class="conduct-secury">
   <div class="conduct-secury">
     <div class="banner">
     <div class="banner">
-      <div class="container">{{ $t('conduct.conductSecury.bannerTitle') }}</div>
+      <div class="container" v-html="$t('conduct.conductSecury.bannerTitle')"></div>
     </div>
     </div>
     <div class="plate-w" ref="homeLayout">
     <div class="plate-w" ref="homeLayout">
       <div class="plate item" v-for="(item,i) in sequenceArr" :key="i">
       <div class="plate item" v-for="(item,i) in sequenceArr" :key="i">
@@ -56,9 +56,13 @@ export default {
     width: 100%;
     width: 100%;
     height: 420px;
     height: 420px;
     background: url(~@/assets/images/refactor/conductSecury/banner.png) no-repeat center center;
     background: url(~@/assets/images/refactor/conductSecury/banner.png) no-repeat center center;
-    line-height: 420px;
     font-size: 40px;
     font-size: 40px;
     margin-bottom: 0;
     margin-bottom: 0;
+    line-height: 56px;
+    .container {
+      display: flex;
+      align-items: center;
+    }
   }
   }
   .item {
   .item {
     padding: 110px 0 0;
     padding: 110px 0 0;
@@ -72,6 +76,7 @@ export default {
   .common-title {
   .common-title {
     margin-top: 0;
     margin-top: 0;
     margin-bottom: 50px;
     margin-bottom: 50px;
+    font-size: 30px;
   }
   }
   .sub-list {
   .sub-list {
     li {
     li {

+ 7 - 2
pc/src/page/conduct/conductShop/index.vue

@@ -1,7 +1,7 @@
 <template>
 <template>
   <div class="conduct-shop">
   <div class="conduct-shop">
     <div class="banner">
     <div class="banner">
-      <div class="container">{{ $t('conduct.conductShop.bannerTitle') }}</div>
+      <div class="container" v-html="$t('conduct.conductShop.bannerTitle')"></div>
     </div>
     </div>
     <div class="plate-w" ref="homeLayout">
     <div class="plate-w" ref="homeLayout">
       <div class="plate item" v-for="(item,i) in sequenceArr" :key="i">
       <div class="plate item" v-for="(item,i) in sequenceArr" :key="i">
@@ -61,9 +61,13 @@ export default {
     width: 100%;
     width: 100%;
     height: 420px;
     height: 420px;
     background: url(~@/assets/images/refactor/conductShop/banner.png) no-repeat center center;
     background: url(~@/assets/images/refactor/conductShop/banner.png) no-repeat center center;
-    line-height: 420px;
     font-size: 40px;
     font-size: 40px;
     margin-bottom: 0;
     margin-bottom: 0;
+    line-height: 56px;
+    .container {
+      display: flex;
+      align-items: center;
+    }
   }
   }
   .item {
   .item {
     padding: 110px 0 0;
     padding: 110px 0 0;
@@ -77,6 +81,7 @@ export default {
   .common-title {
   .common-title {
     margin-top: 0;
     margin-top: 0;
     margin-bottom: 50px;
     margin-bottom: 50px;
+    font-size: 30px;
   }
   }
   .sub-list {
   .sub-list {
     li {
     li {

+ 21 - 9
pc/src/page/conduct/conductSubject/index.vue

@@ -1,7 +1,7 @@
 <template>
 <template>
   <div class="conduct-subject">
   <div class="conduct-subject">
     <div class="banner">
     <div class="banner">
-      <div class="container">{{$t('conduct.conductSubject.bannerTitle')}}</div>
+      <div class="container" v-html="$t('conduct.conductSubject.bannerTitle')"></div>
     </div>
     </div>
     <div class="plate-w" ref="homeLayout">
     <div class="plate-w" ref="homeLayout">
       <div class="plate item" v-for="(item,i) in sequenceArr" :key="i">
       <div class="plate item" v-for="(item,i) in sequenceArr" :key="i">
@@ -11,9 +11,9 @@
         </div>
         </div>
       </div>
       </div>
       <div class="container item">
       <div class="container item">
-        <h1 class="common-title">精选案例</h1>
+        <h1 class="common-title">{{ $t('conduct.conductSubject.itemTitle4') }}</h1>
         <ul class="sub-list">
         <ul class="sub-list">
-          <li v-for="(item, index) in sub_arr" :key="index">
+          <li v-for="(item, index) in sub_arr" :key="index" @click="toLink(item)">
             <img :src="item.img" alt="">
             <img :src="item.img" alt="">
             <p>{{ item.text }}</p>
             <p>{{ item.text }}</p>
           </li>
           </li>
@@ -56,15 +56,18 @@ export default {
       sub_arr: [
       sub_arr: [
         {
         {
           text: '德国国立陶瓷博物馆',
           text: '德国国立陶瓷博物馆',
-          img: require('@/assets/images/online/subjects/sub_item-1.png')
+          img: require('@/assets/images/online/subjects/sub_item-1.png'),
+          link: 'https://www.4dkankan.com/showPC.html?m=X99yIvTq'
         },
         },
         {
         {
           text: '梁家河数字博物馆',
           text: '梁家河数字博物馆',
-          img: require('@/assets/images/online/subjects/sub_item-2.png')
+          img: require('@/assets/images/online/subjects/sub_item-2.png'),
+          link: 'https://4dkanzhan.4dkankan.com/LiangJiaHe/index.html'
         },
         },
         {
         {
           text: '南昌汉代海昏侯国考古成果展',
           text: '南昌汉代海昏侯国考古成果展',
-          img: require('@/assets/images/online/subjects/sub_item-3.png')
+          img: require('@/assets/images/online/subjects/sub_item-3.png'),
+          link: 'https://admin.4dmuseum.cn/showPC.html?m=55&bigScene=&novr='
         },
         },
       ]
       ]
     }
     }
@@ -74,8 +77,11 @@ export default {
   },
   },
   mounted () {
   mounted () {
   },
   },
-  destroyed () {
-  },
+  methods: {
+    toLink (item) {
+      window.open(item.link)
+    }
+  }
 }
 }
 </script>
 </script>
 <style lang="scss">
 <style lang="scss">
@@ -84,9 +90,13 @@ export default {
     width: 100%;
     width: 100%;
     height: 420px;
     height: 420px;
     background: url(~@/assets/images/online/subjects/banner.png) no-repeat center center;
     background: url(~@/assets/images/online/subjects/banner.png) no-repeat center center;
-    line-height: 420px;
     font-size: 40px;
     font-size: 40px;
     margin-bottom: 0;
     margin-bottom: 0;
+    line-height: 56px;
+    .container {
+      display: flex;
+      align-items: center;
+    }
   }
   }
   .item {
   .item {
     padding: 110px 0 0;
     padding: 110px 0 0;
@@ -100,6 +110,7 @@ export default {
   .common-title {
   .common-title {
     margin-top: 0;
     margin-top: 0;
     margin-bottom: 50px;
     margin-bottom: 50px;
+    font-size: 30px;
   }
   }
   .sub-list {
   .sub-list {
     li {
     li {
@@ -109,6 +120,7 @@ export default {
       width: 412px;
       width: 412px;
       margin-right: 20px;
       margin-right: 20px;
       padding-bottom: 70px;
       padding-bottom: 70px;
+      cursor: pointer;
       img {
       img {
         width: 100%;
         width: 100%;
         height: 255px;
         height: 255px;

+ 109 - 25
pc/src/page/distributor/index.vue

@@ -34,16 +34,16 @@
               <p class="form-title">{{ $t('agent.jinxiaoForm.companytitle') }}</p>
               <p class="form-title">{{ $t('agent.jinxiaoForm.companytitle') }}</p>
               <div class="form-item">
               <div class="form-item">
                 <p class="label">*{{ $t('agent.jinxiaoForm.companyNameLabel') }}</p>
                 <p class="label">*{{ $t('agent.jinxiaoForm.companyNameLabel') }}</p>
-                <input type="text" v-model="form.name" :placeholder="$t('agent.jinxiaoForm.companyNamePlaceholder')">
+                <input maxLength="20" type="text" v-model="form.name" :placeholder="$t('agent.jinxiaoForm.companyNamePlaceholder')">
               </div>
               </div>
               <div class="form-item">
               <div class="form-item">
                 <p class="label">*{{ $t('agent.jinxiaoForm.addressLabel') }}</p>
                 <p class="label">*{{ $t('agent.jinxiaoForm.addressLabel') }}</p>
                 <h-row :gutter="10">
                 <h-row :gutter="10">
                   <h-col :span="12">
                   <h-col :span="12">
-                    <input type="text" v-model="form.country" :placeholder="$t('agent.jinxiaoForm.addressPlaceholder1')">
+                    <input maxLength="10" type="text" v-model="form.country" :placeholder="$t('agent.jinxiaoForm.addressPlaceholder1')">
                   </h-col>
                   </h-col>
                   <h-col :span="12">
                   <h-col :span="12">
-                    <input type="text" v-model="form.region" :placeholder="$t('agent.jinxiaoForm.addressPlaceholder2')">
+                    <input maxLength="10" type="text" v-model="form.region" :placeholder="$t('agent.jinxiaoForm.addressPlaceholder2')">
                   </h-col>
                   </h-col>
                 </h-row>
                 </h-row>
                 <input type="text"  v-model="form.address" :placeholder="$t('agent.jinxiaoForm.addressPlaceholder3')">
                 <input type="text"  v-model="form.address" :placeholder="$t('agent.jinxiaoForm.addressPlaceholder3')">
@@ -78,7 +78,7 @@
               </div>
               </div>
               <div class="form-item" style="margin-bottom: 26px">
               <div class="form-item" style="margin-bottom: 26px">
                 <p class="label">*{{ $t('agent.jinxiaoForm.positionLabel') }}</p>
                 <p class="label">*{{ $t('agent.jinxiaoForm.positionLabel') }}</p>
-                <input type="text"  v-model="form.post" :placeholder="$t('agent.jinxiaoForm.positionPlaceholder')">
+                <input maxLength="15" type="text"  v-model="form.post" :placeholder="$t('agent.jinxiaoForm.positionPlaceholder')">
               </div>
               </div>
               <div class="form-item">
               <div class="form-item">
                 <p class="label">*{{ $t('agent.jinxiaoForm.phoneLabel') }}</p>
                 <p class="label">*{{ $t('agent.jinxiaoForm.phoneLabel') }}</p>
@@ -87,13 +87,13 @@
                     <input type="text"  v-model="form.areaCode" placeholder="+86" value="+86">
                     <input type="text"  v-model="form.areaCode" placeholder="+86" value="+86">
                   </h-col>
                   </h-col>
                   <h-col :span="16">
                   <h-col :span="16">
-                    <input type="text"  v-model="form.phone" :placeholder="$t('agent.jinxiaoForm.phonePlaceholder')">
+                    <input maxLength="11" oninput="value=value.replace(/[^\d]/g,'')" type="text"  v-model="form.phone" :placeholder="$t('agent.jinxiaoForm.phonePlaceholder')">
                   </h-col>
                   </h-col>
                 </h-row>
                 </h-row>
               </div>
               </div>
               <div class="form-item">
               <div class="form-item">
                 <p class="label">*{{ $t('agent.jinxiaoForm.emailLabel') }}</p>
                 <p class="label">*{{ $t('agent.jinxiaoForm.emailLabel') }}</p>
-                <input type="text"  v-model="form.email" :placeholder="$t('agent.jinxiaoForm.emailPlaceholder')">
+                <input maxLength="20" type="text"  v-model="form.email" :placeholder="$t('agent.jinxiaoForm.emailPlaceholder')">
               </div>
               </div>
             </div></h-col>
             </div></h-col>
         </h-row>
         </h-row>
@@ -108,12 +108,13 @@
 import { getPosition } from '@/util'
 import { getPosition } from '@/util'
 import { mapState } from 'vuex'
 import { mapState } from 'vuex'
 import Api from '@/apis'
 import Api from '@/apis'
+import {reg} from '@/util'
 export default {
 export default {
   data () {
   data () {
     return {
     return {
       form: {
       form: {
         address: '',
         address: '',
-        areaCode: '',
+        areaCode: '+86',
         email: '',
         email: '',
         name: '',
         name: '',
         country: '',
         country: '',
@@ -166,6 +167,13 @@ export default {
       ]
       ]
     }
     }
   },
   },
+  computed: {
+    ...mapState({
+      langAgent: state => state.language.home.agent,
+      language: state => state.language.current,
+      langToast: state => state.language.home.toast
+    })
+  },
   components: {
   components: {
   },
   },
   mounted () {
   mounted () {
@@ -173,30 +181,106 @@ export default {
   destroyed () {
   destroyed () {
   },
   },
   methods: {
   methods: {
-    saveAduit () {
+    async saveAduit () {
       if (this.validator()) {
       if (this.validator()) {
-        return Api.saveAduit(this.form).then(res => {
-          if (res.data.code === 0) {
-            this.$alert('提交成功', {
-              icon: 'success',
-            })
-          } else {
-            this.$alert(res.msg)
-          }
-        })
+        let res = await this.$http({
+        method: 'post',
+        data: this.form,
+        url: '/agentAduit/save'
+      })
+      let response = res.data
+      if (response.code !== 0) {
+        return this.$toast.show('warn', this.langToast[response.code])
+      }
+      this.$toast.show('warn', this.langToast['9'], () => {
+        this.form = {
+          name: '',
+          country: '',
+          region: '',
+          address: '',
+          type: 1,
+          storeAddress: '',
+          surName: '',
+          userName: '',
+          post: '',
+          areaCode: '',
+          phone: '',
+          email: ''
+        }
+      })
       }
       }
       
       
     },
     },
     validator () {
     validator () {
-      let pass = true
-      Object.keys(this.rules).forEach(key => {
-        if (this.rules[key][0].required && !this.form[key]) {
-          pass = false
-          this.$alert(this.rules[key][0].message)
-          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 pass
+        return true
+      }
+
+      let {name, country, region, address, type, storeAddress, surName, userName, post, phone, email} = this.form
+      let checkStr = [
+        {
+          name: '公司注册名称',
+          En: 'Registered Company Name',
+          val: name
+        },
+        {
+          name: '国家',
+          En: 'Country',
+          val: country
+        },
+        {
+          name: '地区',
+          En: 'Region',
+          val: region
+        },
+        {
+          name: '公司地址',
+          En: 'Address',
+          val: address
+        },
+        // {
+        //   name: '门店地址',
+        //   En:'',
+        //   val: storeAddress
+        // },
+        {
+          name: '姓',
+          En: 'Last Name',
+          val: surName
+        },
+        {
+          name: '名',
+          En: 'First Name',
+          val: userName
+        },
+        {
+          name: '职位',
+          En: 'Title',
+          val: post
+        },
+        {
+          name: '电话',
+          En: 'Phone',
+          val: phone
+        },
+        {
+          name: '电子邮箱',
+          En: 'Email',
+          val: email
+        }
+      ]
+      if (!check(checkStr)) {
+        return
+      }
+      if (!reg.email.test(email)) {
+        return this.$toast.show('warn', this.langToast['8'])
+      }
+      return true
     }
     }
   }
   }
 }
 }

+ 2 - 3
pc/src/page/home2/index.vue

@@ -2,7 +2,7 @@
   <div class="home-layout">
   <div class="home-layout">
     <div class="plate01">
     <div class="plate01">
       <div class="my-video">
       <div class="my-video">
-        <video :src="language==='en'?`${$cdn}video/banner1.mp4`: 'https://4dscene.oss-cn-shenzhen.aliyuncs.com/new4dkk/v2/video/2020%E5%AE%98%E7%BD%91Version2%20%E4%B8%8D%E5%B8%A6%E5%AD%97_3%281%29.mp4'" autoplay muted loop></video>
+        <video src="https://4dscene.oss-cn-shenzhen.aliyuncs.com/new4dkk/v2/video/2020%E5%AE%98%E7%BD%91Version2%20%E4%B8%8D%E5%B8%A6%E5%AD%97_3%281%29.mp4" autoplay muted loop></video>
         <div class="container">
         <div class="container">
           <div class="video-info">
           <div class="video-info">
           <h1>{{ $t('common.kankan') }}</h1>
           <h1>{{ $t('common.kankan') }}</h1>
@@ -49,9 +49,8 @@
         <router-link to="/cases/全部" class="more">{{ $t('common.more') }}</router-link>
         <router-link to="/cases/全部" class="more">{{ $t('common.more') }}</router-link>
       </h1>
       </h1>
       <h-row class="space-list" :gutter="20">
       <h-row class="space-list" :gutter="20">
-        
         <h-col :span="6" class="space-item" v-for="(item,index) in space" :key="index">
         <h-col :span="6" class="space-item" v-for="(item,index) in space" :key="index">
-          <a :href="item.link" target="_blank">
+          <a :href="`${item.link}${language==='zh' ? '' : `&lang=en`}`" target="_blank">
             <img :src="item.bgImg">
             <img :src="item.bgImg">
             <p>{{item.text}}</p>
             <p>{{item.text}}</p>
           </a>
           </a>

+ 7 - 1
pc/src/page/home2/style.scss

@@ -311,7 +311,13 @@
     margin: 8px 0;
     margin: 8px 0;
     font-size: 16px;
     font-size: 16px;
     color: #202020;
     color: #202020;
-
+    line-height: 24px;
+    height: 48px;
+    overflow: hidden;
+    display: -webkit-box;
+    -webkit-line-clamp: 2;
+    line-clamp: 2;
+    -webkit-box-orient: vertical;
   }
   }
   .news-img {
   .news-img {
     width: 100%;
     width: 100%;

+ 17 - 17
pc/src/page/introtow/index.vue

@@ -4,13 +4,13 @@
       <div class="container">
       <div class="container">
         <div class="introduce-con" :style="{marginLeft:(split + 37)+'px'}">
         <div class="introduce-con" :style="{marginLeft:(split + 37)+'px'}">
         <div class="info">
         <div class="info">
-          <p>设备ID:{{detail.childName}}</p>
+          <p>{{$t('introtow.deviceId')}}:{{detail.childName}}</p>
         </div>
         </div>
         <div class="c-dec">
         <div class="c-dec">
-          剩余点数:<span>{{detail.balance}}</span>
+          {{$t('introtow.exDot')}}:<span>{{detail.balance}}</span>
         </div>
         </div>
         <div class="c-detail">
         <div class="c-detail">
-          <span>点数构成:{{detail.spaceContent}}</span>
+          <!-- <span>点数构成:{{detail.spaceContent}}</span> -->
         </div>
         </div>
       </div>
       </div>
       </div>
       </div>
@@ -19,15 +19,15 @@
       <div>
       <div>
         <div class="intro-title">
         <div class="intro-title">
           <img :src="`${$cdn}images/introduce-line.png`" alt="">
           <img :src="`${$cdn}images/introduce-line.png`" alt="">
-          <p>点数充值,记录您的美好空间</p>
+          <p>{{$t('introtow.title')}}</p>
           <img :src="`${$cdn}images/introduce-line1.png`" alt="">
           <img :src="`${$cdn}images/introduce-line1.png`" alt="">
         </div>
         </div>
-        <p class="intro-sub">购买立即生效,拍摄安心存放</p>
+        <p class="intro-sub">{{$t('introtow.titleTip')}}</p>
         <ul class="intro-type">
         <ul class="intro-type">
           <li v-for="(item,i) in type" :key="i">
           <li v-for="(item,i) in type" :key="i">
             <p class="point">{{item.capacity}}</p>
             <p class="point">{{item.capacity}}</p>
             <p class="price"><i>¥</i><span>{{item.price}}</span></p>
             <p class="price"><i>¥</i><span>{{item.price}}</span></p>
-            <div class="btn" @click="buy(item)">立即购买</div>
+            <div class="btn" @click="buy(item)">{{$t('mall.nowBuy')}}</div>
           </li>
           </li>
         </ul>
         </ul>
         <ul class="qa-con">
         <ul class="qa-con">
@@ -48,32 +48,32 @@ export default {
   data () {
   data () {
     let type = [
     let type = [
       {
       {
-        capacity: '600点',
+        capacity: '600' + this.$t('introtow.dot'),
         price: '600'
         price: '600'
       },
       },
       {
       {
-        capacity: '800点',
+        capacity: '800' + this.$t('introtow.dot'),
         price: '800'
         price: '800'
       },
       },
       {
       {
-        capacity: '1000点',
+        capacity: '1000' + this.$t('introtow.dot'),
         price: '1000'
         price: '1000'
       }
       }
     ]
     ]
 
 
     let qa = [
     let qa = [
       {
       {
-        q: '为什么需要点数充值?',
-        a: '答:当您的基础点数不足99点时,最新拍摄的场景将无法生成,通过购买点数则可以计算存储更多场景。'
+        q: this.$t('introtow.question1'),
+        a: this.$t('introtow.answer1')
       }, {
       }, {
-        q: '点数充值之后还可以退款吗?',
-        a: '答:不可以,因为点数充值之后,相应点数会立即到账生效,所以不接受中途退款,敬请谅解。'
+        q: this.$t('introtow.question2'),
+        a: this.$t('introtow.answer2')
       }, {
       }, {
-        q: '删除场景后会返还点数吗?',
-        a: '答:点数充值没有有效期,所以消费后代表永久记录您的美好空间,删除场景后不会返还。'
+        q: this.$t('introtow.question3'),
+        a: this.$t('introtow.answer3')
       }, {
       }, {
-        q: '点数不足还可继续拍摄上传吗?',
-        a: '答:点数不足时,不影响设备正常的拍摄,但会无法上传计算,这时只能进行删除操作;直到您的点数满足消费,此时您才可以将拍摄的场景上传计算,随之可查看、编辑和分享。'
+        q: this.$t('introtow.question4'),
+        a: this.$t('introtow.answer4')
       }
       }
     ]
     ]
     return {
     return {

+ 11 - 4
pc/src/page/layout/footer.vue

@@ -8,7 +8,7 @@
       <div class="layout container">
       <div class="layout container">
         <div class="infos clear">
         <div class="infos clear">
             <div class="infos-contact">
             <div class="infos-contact">
-              <img src="@/assets/images/home/grey-logo.png" alt="logo" class="logo">
+              <img :src="language === 'zh' ? require(`@/assets/images/home/grey-logo.png`) : require('@/assets/images/home/logo-white-en.png')" alt="logo" class="logo">
               <ul>
               <ul>
                 <li>{{ $t('header.footer.saleEmail') }}:sales@4dage.com</li>
                 <li>{{ $t('header.footer.saleEmail') }}:sales@4dage.com</li>
                 <li>{{ $t('header.footer.meitiEmail') }}:pr@4dage.com</li>
                 <li>{{ $t('header.footer.meitiEmail') }}:pr@4dage.com</li>
@@ -18,7 +18,7 @@
             <div class="infos-list">
             <div class="infos-list">
               <div class="infos-item" v-for="item in infosList" :key="item.title">
               <div class="infos-item" v-for="item in infosList" :key="item.title">
                 <h6>{{ item.title }}</h6>
                 <h6>{{ item.title }}</h6>
-                <a v-for="i in item.list" :key="i.text"  target="_blank" :href="`${i.link.indexOf('http') > -1 ? i.link : `${pathname}#/${i.link}`}`">{{ i.text }}</a>
+                <a v-for="i in item.list" :key="i.text"  target="_blank" @click="toLink(i)">{{ i.text }}</a>
               </div>
               </div>
             </div>
             </div>
             <ul class="contacts-w">
             <ul class="contacts-w">
@@ -110,11 +110,13 @@ export default {
           list: [
           list: [
             {
             {
               text: this.$t('header.footer.kankan'),
               text: this.$t('header.footer.kankan'),
-              link: 'http://www.4dage.com/cn'
+              link: `http://www.4dage.com/cn`,
+              enLink: 'http://www.4dage.com/en'
             },
             },
             {
             {
               text: this.$t('header.footer.zhongde'),
               text: this.$t('header.footer.zhongde'),
-              link: 'https://www.cgaii.com'
+              link: `https://www.cgaii.com/`,
+              enLink: 'https://www.cgaii.com/en'
             },
             },
             {
             {
               text: this.$t('header.footer.moku'),
               text: this.$t('header.footer.moku'),
@@ -137,6 +139,10 @@ export default {
     toCase () {
     toCase () {
       this.$router.push('/cases/全部')
       this.$router.push('/cases/全部')
       window.scrollTo({top: 0})
       window.scrollTo({top: 0})
+    },
+    toLink (i) {
+      let link = this.language === 'zh' ? i.link : (i.enLink || i.link)
+      window.open(link.indexOf('http') > -1 ? link : `${this.pathname}#/${link}`)
     }
     }
   }
   }
 }
 }
@@ -224,6 +230,7 @@ export default {
     float: left;
     float: left;
     color: #909090;
     color: #909090;
     min-width: 138px;
     min-width: 138px;
+    margin-right: 30px;
     h6 {
     h6 {
       margin-bottom: 27px;
       margin-bottom: 27px;
       color: #fff;
       color: #fff;

+ 16 - 5
pc/src/page/layout/header/index.vue

@@ -45,7 +45,7 @@
         </div>
         </div>
         <div class="user" @click="$router.push('/login/login')" v-if="!isLogin"></div>
         <div class="user" @click="$router.push('/login/login')" v-if="!isLogin"></div>
         <div class="user avatar" v-else :style="{'background-image': `url(${info.head})`}" @click="$router.push('/information')"></div>
         <div class="user avatar" v-else :style="{'background-image': `url(${info.head})`}" @click="$router.push('/information')"></div>
-        <div class="cart" @click="$router.push('/mall/cart')">
+        <div class="cart" @click="$router.push('/mall/cart')" v-if="isLogin">
           <h-icon type="xingouwuche" class="icon" />
           <h-icon type="xingouwuche" class="icon" />
           <span v-if="cartCount">{{cartCount}}</span>
           <span v-if="cartCount">{{cartCount}}</span>
         </div>
         </div>
@@ -234,12 +234,21 @@ export default {
   }
   }
 }
 }
 
 
-.header-item:hover {
-  position: relative;
-  .child-list {
-    display: block;
+.list {
+  &:hover {
+    .header-item {
+      color: #909090;
+    }
+  }
+  .header-item:hover {
+    position: relative;
+    color: #202020;
+    .child-list {
+      display: block;
+    }
   }
   }
 }
 }
+
 .child-list {
 .child-list {
   position: absolute;
   position: absolute;
   // width: 112px;
   // width: 112px;
@@ -278,8 +287,10 @@ export default {
     z-index: 2;
     z-index: 2;
     padding: 0 25px;
     padding: 0 25px;
     white-space: nowrap;
     white-space: nowrap;
+    color: #909090;
     &:hover {
     &:hover {
       background-color: #EBEBEB;
       background-color: #EBEBEB;
+      color: #202020;
     }
     }
   }
   }
 }
 }

+ 2 - 2
pc/src/page/layout/header/istyle.scss

@@ -47,7 +47,7 @@
   }
   }
   &.isInternational {
   &.isInternational {
     .menu {
     .menu {
-      min-width: 740px;
+      // min-width: 700px;
     }
     }
   }
   }
   .menu {
   .menu {
@@ -88,7 +88,7 @@
       text-decoration: none;
       text-decoration: none;
       font-weight: bold;
       font-weight: bold;
       position: relative;
       position: relative;
-      transition: color $mc;
+      transition: color 0.2s linear;
 
 
       &::before {
       &::before {
         z-index: 2;
         z-index: 2;

+ 22 - 22
pc/src/page/layout/shopHeader/index.vue

@@ -74,28 +74,28 @@ export default {
         { text: this.$t('header.mallPro'), link: '/mall/kankanPro' },
         { text: this.$t('header.mallPro'), link: '/mall/kankanPro' },
         { text: this.$t('header.mallPeijian'), link: '/mall/zhijia' },
         { text: this.$t('header.mallPeijian'), link: '/mall/zhijia' },
         { text: this.$t('header.addService'), link: '/mall/cloudCapacity' },
         { text: this.$t('header.addService'), link: '/mall/cloudCapacity' },
-        { text: this.$t('header.solutions'), items: [
-          {
-            text: this.$t('header.solutionsHouse'),
-            link: '/conductHouse'
-          },
-          {
-            text: this.$t('header.solutionsExi'),
-            link: '/conductExhibition'
-          },
-          {
-            text: this.$t('header.solutionsSubject'),
-            link: '/conductSubject'
-          },
-          {
-            text: this.$t('header.solutionsShop'),
-            link: '/conductShop'
-          },
-          {
-            text: this.$t('header.solutionsSec'),
-            link: '/conductSecury'
-          },
-        ]},
+        // { text: this.$t('header.solutions'), items: [
+        //   {
+        //     text: this.$t('header.solutionsHouse'),
+        //     link: '/conductHouse'
+        //   },
+        //   {
+        //     text: this.$t('header.solutionsExi'),
+        //     link: '/conductExhibition'
+        //   },
+        //   {
+        //     text: this.$t('header.solutionsSubject'),
+        //     link: '/conductSubject'
+        //   },
+        //   {
+        //     text: this.$t('header.solutionsShop'),
+        //     link: '/conductShop'
+        //   },
+        //   {
+        //     text: this.$t('header.solutionsSec'),
+        //     link: '/conductSecury'
+        //   },
+        // ]},
       ]
       ]
     }
     }
   },
   },

+ 32 - 7
pc/src/page/location/index.vue

@@ -19,13 +19,18 @@
           <div class="plate-content clear">
           <div class="plate-content clear">
             <div class="content-left fl">
             <div class="content-left fl">
               <ul>
               <ul>
-                <li v-for="item in items_2" :key="item.name">{{ item.name }}</li>
+                <li v-for="(item, index) in items_2" :class="{'is-active': activeIndex===index}" :key="item.name" @click="activeIndex=index">
+                  <span>{{ item.name }}</span>
+                </li>
               </ul>
               </ul>
             </div>
             </div>
             <div class="content-right fr">
             <div class="content-right fr">
-              <ul>
-                <li v-for="(item, index) in items_2" :key="item.name" v-show="activeIndex === index"><img :src="item.img" alt=""></li>
-              </ul>
+              <iframe allowfullscreen :src="items_2[activeIndex].iframeLink" />
+              <!-- <ul>
+                <li v-for="(item, index) in items_2" :key="item.name" v-show="activeIndex === index">
+                  
+                </li>
+              </ul> -->
             </div>
             </div>
           </div>
           </div>
         </div>
         </div>
@@ -71,15 +76,15 @@ export default {
       items_2: [
       items_2: [
         {
         {
           name: this.$t('conduct.coreTech.item2Name1'),
           name: this.$t('conduct.coreTech.item2Name1'),
-          img: require('@/assets/images/refactor/coreTech/item-2_1.png')
+          iframeLink: 'https://www.4dkankan.com/showProPC.html?m=nSjwSohIY'
         },
         },
         {
         {
           name: this.$t('conduct.coreTech.item2Name2'),
           name: this.$t('conduct.coreTech.item2Name2'),
-          img: ''
+          iframeLink: 'https://www.4dkankan.com/spc.html?m=B4T8r0kk6'
         },
         },
         {
         {
           name: this.$t('conduct.coreTech.item2Name3'),
           name: this.$t('conduct.coreTech.item2Name3'),
-          img: ''
+          iframeLink: 'https://www.4dkankan.com/showProPC.html?m=t-0Q99SHE'
         },
         },
       ],
       ],
       items_3: [
       items_3: [
@@ -175,13 +180,33 @@ export default {
       margin-bottom: 47px;
       margin-bottom: 47px;
       cursor: pointer;
       cursor: pointer;
       font-weight: bold;
       font-weight: bold;
+      text-align: center;
       &:hover {
       &:hover {
         color: #202020;
         color: #202020;
       }
       }
+      &.is-active {
+        span {
+          color: #202020;
+          position: relative;
+          display: inline-block;
+          &::after {
+            content: '';
+            display: block;
+            height: 2px;
+            width :100%;
+            background: #202020;
+          }
+        }
+      }
     }
     }
   }
   }
   .content-right {
   .content-right {
     flex: 1;
     flex: 1;
+    height: 530px;
+    iframe {
+        width: 100%;
+        height: 530px;
+      }
   }
   }
   .text-center {
   .text-center {
     text-align: center;
     text-align: center;

+ 1 - 3
pc/src/page/login/components/cameraLogin.vue

@@ -5,7 +5,7 @@
     </div>
     </div>
     <div class="camera-qr">
     <div class="camera-qr">
       <img :src="codeImg?`${$serverName}${codeImg}`:''" alt="">
       <img :src="codeImg?`${$serverName}${codeImg}`:''" alt="">
-      <p>打开四维看看app扫一扫登录</p>
+      <p>{{ $t('login.cameraLoginTip')}}</p>
     </div>
     </div>
   </div>
   </div>
 </template>
 </template>
@@ -87,8 +87,6 @@ export default {
     padding: 6 10px;
     padding: 6 10px;
     font-weight: bold;
     font-weight: bold;
     line-height: 20px;
     line-height: 20px;
-    
-    letter-spacing: 2px;
   }
   }
 }
 }
 </style>
 </style>

+ 14 - 9
pc/src/page/login/components/codeLogin.vue

@@ -2,23 +2,23 @@
   <div class="account-login code-login">
   <div class="account-login code-login">
     <div class="phone-w">
     <div class="phone-w">
       <div class="phone-input-w">
       <div class="phone-input-w">
-        <div class="phone-area" @click.stop="showPhoneArea=!showPhoneArea">{{ `${selectArea[1]}(${selectArea[0]})` }}</div>
-        <input type="text" v-model="loginForm.phone" placeholder="请输入手机号" >
+        <div class="phone-area" @click.stop="showPhoneArea=!showPhoneArea">{{ `${selectArea[1]}(${selectArea[language === 'zh' ? 0:2]})` }}</div>
+        <input type="text" v-model="loginForm.phone" :placeholder="$t('login.phonePlaceholder')" >
       </div>
       </div>
       <phoneAddressSelect v-show="showPhoneArea" @select="changeArea" />
       <phoneAddressSelect v-show="showPhoneArea" @select="changeArea" />
     </div>
     </div>
     <div class="code-w">
     <div class="code-w">
-      <input v-model="loginForm.authCode" class="input password" placeholder="请输入验证码" @keyup.enter="login">
-      <div class="code-btn" :class="{'is-disabled': sendCodeExTime}" @click="sendCode">{{ sendCodeExTime ? `${sendCodeExTime}s后重新发送` : '获取验证码' }}</div>
+      <input maxLength="6" oninput="value=value.replace(/[^\d]/g,'')" v-model="loginForm.authCode" class="input password" :placeholder="$t('login.codePlaceholder')" @keyup.enter="login">
+      <div class="code-btn" :class="{'is-disabled': sendCodeExTime}" @click="sendCode">{{ sendCodeExTime ? $t('login.resendTime', {time: sendCodeExTime}) : $t('login.sendCodeBtnText') }}</div>
     </div>
     </div>
     
     
     <div class="toCodeLogin tips-tap" >
     <div class="toCodeLogin tips-tap" >
-      <a @click="$router.push({name: 'login'})">密码登录</a>
+      <a @click="$router.push({name: 'login'})">{{ $t('login.passwordLogin')}}</a>
     </div>
     </div>
-    <div class="login-btn" @click="login">登录</div>
+    <div class="login-btn" @click="login">{{$t('login.login')}}</div>
     <div class="others">
     <div class="others">
-      <a class="other-actions" @click="$router.push('/login/forget')">忘记密码</a>
-      <a class="other-actions" @click="$router.push('/login/register')">账号注册</a>
+      <a class="other-actions" @click="$router.push('/login/forget')">{{$t('login.forgetPassword')}}</a>
+      <a class="other-actions" @click="$router.push('/login/register')">{{$t('login.registerAccount')}}</a>
     </div>
     </div>
   </div>
   </div>
 </template>
 </template>
@@ -41,13 +41,17 @@ export default {
   },
   },
   computed: {
   computed: {
     ...mapState({
     ...mapState({
+      language: state => state.language.current,
       langToast: state => state.language.home.toast
       langToast: state => state.language.home.toast
     }),
     }),
   },
   },
   methods: {
   methods: {
     changeArea (item) {
     changeArea (item) {
-      this.selectArea = item
       this.showPhoneArea = false
       this.showPhoneArea = false
+      if (!item) {
+        return
+      }
+      this.selectArea = item
     },
     },
     async sendCode () {
     async sendCode () {
       if (this.sendCodeExTime) return;
       if (this.sendCodeExTime) return;
@@ -175,6 +179,7 @@ export default {
     position: absolute;
     position: absolute;
     right: 0;
     right: 0;
     top: 0;
     top: 0;
+    text-align: right;
     cursor: pointer;
     cursor: pointer;
     &.is-disabled {
     &.is-disabled {
       color: #909090;
       color: #909090;

+ 25 - 13
pc/src/page/login/components/forget/emailForm.vue

@@ -1,30 +1,30 @@
 <template>
 <template>
   <div class="email-form">
   <div class="email-form">
     <div class="border-box" v-if="type === 'phone'">
     <div class="border-box" v-if="type === 'phone'">
-      <div class="phone-area" @click="showPhoneArea = !showPhoneArea">
-        <p>{{selectArea[1]}}({{selectArea[0]}})</p>
+      <div class="phone-area" @click.stop="showPhoneArea = !showPhoneArea">
+        <p>{{selectArea[1]}}({{selectArea[language === 'en' ? 2 : 0]}})</p>
         <span class="sanjiao"></span>
         <span class="sanjiao"></span>
         <phoneAddressSelect  v-show="showPhoneArea" @select="changeArea" />
         <phoneAddressSelect  v-show="showPhoneArea" @select="changeArea" />
       </div>
       </div>
-      <input type="text" placeholder="请输入手机号码" v-model="form.phone">
+      <input type="text" :placeholder="$t('login.phonePlaceholder')" v-model="form.phone">
     </div>
     </div>
-    <input class="border-box"  v-model="form.phone" placeholder="邮箱地址" type="text" v-else>
+    <input class="border-box"  v-model="form.phone" :placeholder="$t('login.emailPlaceholder')" type="text" v-else>
     <div class="send-code-w border-box">
     <div class="send-code-w border-box">
-      <input type="text" placeholder="请输入验证码"  v-model="form.authCode">
-      <div class="send-btn" @click="sendCode">{{ time? `${time}s后重试` : '获取验证码'}}</div>
+      <input type="text" maxLength="6" oninput="value=value.replace(/[^\d]/g,'')" :placeholder="$t('login.codePlaceholder')"  v-model="form.authCode">
+      <div class="send-btn" @click="sendCode">{{ time? $t('login.resendTime', { time }) : $t('login.sendCodeBtnText')}}</div>
     </div>
     </div>
     <div class="password-w border-box" :class="{'show-tip': !form.password && passwordTip}" @mouseleave="passwordTip=false" @click="focusInput('emialInput')" >
     <div class="password-w border-box" :class="{'show-tip': !form.password && passwordTip}" @mouseleave="passwordTip=false" @click="focusInput('emialInput')" >
-        <input class="" ref="emialInput" :placeholder="passwordTip ? '' : '设置密码'" autocomplete="new-password "  v-model="form.password" type="password" @mouseover="passwordTip=true" >
-        <p>密码必须包含英文大小写、数字、长度8-16个字符</p>
+        <input maxLength="16" class="" ref="emialInput" :placeholder="passwordTip ? '' : $t('login.setPassword')" autocomplete="new-password "  v-model="form.password" type="password" @mouseover="passwordTip=true" >
+        <p>{{ $t('login.passwordTip') }}</p>
       </div>
       </div>
       <div class="password-w border-box" :class="{'show-tip': !form.confirmPass && confirmPassWordTip}" @click="focusInput('emialConfirmInput')" @mouseleave="confirmPassWordTip=false">
       <div class="password-w border-box" :class="{'show-tip': !form.confirmPass && confirmPassWordTip}" @click="focusInput('emialConfirmInput')" @mouseleave="confirmPassWordTip=false">
-        <input class="" :placeholder="confirmPassWordTip ? '' : '重复密码'" ref="emialConfirmInput" autocomplete="new-password" v-model="form.confirmPass" type="password"  @mouseenter="confirmPassWordTip=true" >
-        <p>密码必须包含英文大小写、数字、长度8-16个字符</p>
+        <input maxLength="16" class="" :placeholder="confirmPassWordTip ? '' : $t('login.rePassword')" ref="emialConfirmInput" autocomplete="new-password" v-model="form.confirmPass" type="password"  @mouseenter="confirmPassWordTip=true" >
+        <p>{{ $t('login.passwordTip') }}</p>
       </div>
       </div>
     <!-- <input class="border-box" placeholder="设置密码" type="password"  v-model="form.password">
     <!-- <input class="border-box" placeholder="设置密码" type="password"  v-model="form.password">
     <input class="border-box" placeholder="重复密码" type="password"  v-model="form.confirmPass"> -->
     <input class="border-box" placeholder="重复密码" type="password"  v-model="form.confirmPass"> -->
-    <p class="login-entry">已有账号,<span @click="$router.push('/login/login')">直接登录</span></p>
-    <div class="submit-btn" @click="submit">提交</div>
+    <p class="login-entry">{{$t('login.hasAccount')}}<span @click="$router.push('/login/login')">{{$t('login.zhijieLogin')}}</span></p>
+    <div class="submit-btn" @click="submit">{{$t('common.submit')}}</div>
   </div>
   </div>
 </template>
 </template>
 
 
@@ -47,13 +47,14 @@ export default {
       interEmailTime: 0,
       interEmailTime: 0,
       interTime: 0,
       interTime: 0,
       showPhoneArea: false,
       showPhoneArea: false,
-      selectArea: ['中国', '+86'],
+      selectArea: ['中国', '+86', 'China'],
       confirmPassWordTip: false,
       confirmPassWordTip: false,
       passwordTip: false
       passwordTip: false
     }
     }
   },
   },
   computed: {
   computed: {
     ...mapState({
     ...mapState({
+      language: state => state.language.current,
       langToast: state => state.language.home.toast
       langToast: state => state.language.home.toast
     }),
     }),
     time () {
     time () {
@@ -68,6 +69,10 @@ export default {
       this.type === 'phone' ? this.getAuthCode() : this.getEmailAuthCode()
       this.type === 'phone' ? this.getAuthCode() : this.getEmailAuthCode()
     },
     },
     changeArea (item) {
     changeArea (item) {
+      this.showPhoneArea = false
+      if (!item) {
+        return
+      }
       this.selectArea = item
       this.selectArea = item
     },
     },
     focusInput (input = 'emialInput') {
     focusInput (input = 'emialInput') {
@@ -200,10 +205,15 @@ export default {
     border: none;
     border: none;
     padding-left: 10px;
     padding-left: 10px;
     flex: 1;
     flex: 1;
+    min-width: 100px;
+    font-size: 16px;
   }
   }
   .send-btn {
   .send-btn {
     padding: 0 10px;
     padding: 0 10px;
     cursor: pointer;
     cursor: pointer;
+    flex: 1;
+    white-space: nowrap;
+    text-align: right;
   }
   }
   .login-entry {
   .login-entry {
     margin: 80px 0 30px 0;
     margin: 80px 0 30px 0;
@@ -248,6 +258,8 @@ export default {
       width: 100%;
       width: 100%;
       text-align: center;
       text-align: center;
       display: none;
       display: none;
+      white-space: nowrap;
+      overflow: hidden;
     }
     }
     &.show-tip {
     &.show-tip {
       p {
       p {

+ 2 - 2
pc/src/page/login/components/forget/index.vue

@@ -25,10 +25,10 @@ export default {
       isInternational: state => state.user.isInternational
       isInternational: state => state.user.isInternational
     }),
     }),
     title () {
     title () {
-      return '找回密码'
+      return this.$t('login.findPassword')
     },
     },
     page () {
     page () {
-      return this.isInternational === 'zh' ? 'phone' : 'emali'
+      return this.isInternational ? 'email' : 'phone'
     }
     }
   },
   },
   methods: {
   methods: {

+ 9 - 8
pc/src/page/login/components/login.vue

@@ -1,23 +1,23 @@
 <template>
 <template>
   <div class="login-box">
   <div class="login-box">
     <div class="login-tabs">
     <div class="login-tabs">
-      <div class="login-tab" :class="{'is-active': !type || type === 'codeLogin'}" @click="toOtherLogin('')">用户登录</div><div class="login-tab" :class="{'is-active': type==='camera'}" @click="toOtherLogin('camera')">相机登录</div>
+      <div class="login-tab" :class="{'is-active': !type || type === 'codeLogin'}" @click="toOtherLogin('')">{{$t('login.userLogin')}}</div><div class="login-tab" :class="{'is-active': type==='camera'}" @click="toOtherLogin('camera')">{{$t('login.cameraLogin')}}</div>
     </div>
     </div>
     <div class="account-login" v-if="!type">
     <div class="account-login" v-if="!type">
-      <input type="text" class="input" :placeholder="`请输入手机号码${isInternational ? '/邮箱' : ''}`" v-model="form.phone">
+      <input type="text" class="input" :placeholder="isInternational? $t('login.emailPlaceholder') : $t('login.phonePlaceholder')" v-model="form.phone">
       <div class="password-w">
       <div class="password-w">
-        <input :type="showPassword ? 'test' : 'password'" class="input password" placeholder="请输入密码" v-model="form.password" @keyup.enter="login">
+        <input maxLength="16" :type="showPassword ? 'test' : 'password'" class="input password" :placeholder="$t('login.passwordPlaceholder')" v-model="form.password" @keyup.enter="login">
         <h-icon :type="showPassword ? 'mimabukejian' : 'mimakejian'" class="password-visible" @click="showPassword=!showPassword" />
         <h-icon :type="showPassword ? 'mimabukejian' : 'mimakejian'" class="password-visible" @click="showPassword=!showPassword" />
       </div>
       </div>
       
       
       <div class="toCodeLogin tips-tap" >
       <div class="toCodeLogin tips-tap" >
-        <a @click="$router.push({name: 'login', query: {type: 'codeLogin'}})">验证码登录</a>
+        <a @click="$router.push({name: 'login', query: {type: 'codeLogin'}})">{{$t('login.codeLogin')}}</a>
       </div>
       </div>
-      <div class="checkbox"><input type="checkbox" v-model="rememberMe" id="rember" /><label for="rember">记住密码</label></div>
-      <div class="login-btn"  @click="login" >登录</div>
+      <div class="checkbox"><input type="checkbox" v-model="rememberMe" id="rember" /><label for="rember">{{$t('login.rememberPassword')}}</label></div>
+      <div class="login-btn"  @click="login" >{{$t('login.login')}}</div>
       <div class="others">
       <div class="others">
-        <a class="other-actions" @click="$router.push('/login/forget')">忘记密码</a>
-        <a class="other-actions" @click="$router.push('/login/register')">账号注册</a>
+        <a class="other-actions" @click="$router.push('/login/forget')">{{ $t('login.forgetPassword') }}</a>
+        <a class="other-actions" @click="$router.push('/login/register')">{{ $t('login.registerAccount') }}</a>
       </div>
       </div>
     </div>
     </div>
     <cameraLogin v-if="type === 'camera'" />
     <cameraLogin v-if="type === 'camera'" />
@@ -44,6 +44,7 @@ export default {
   },
   },
   computed: {
   computed: {
     ...mapState({
     ...mapState({
+      language: state => state.language.current,
       langToast: state => state.language.home.toast,
       langToast: state => state.language.home.toast,
       isInternational: state => state.user.isInternational
       isInternational: state => state.user.isInternational
     }),
     }),

+ 44 - 32
pc/src/page/login/components/register/index.vue

@@ -1,57 +1,57 @@
 <template>
 <template>
   <div class="register">
   <div class="register">
-    <h3>四维账号注册</h3>
-    <p class="tologin">已有账号,<span @click="$router.push('/login/login')">直接登录</span></p>
+    <h3>{{$t('login.kankanAccountRegister')}}</h3>
+    <p class="tologin">{{$t('login.hasAccount')}}<span @click="$router.push('/login/login')">{{$t('login.zhijieLogin')}}</span></p>
     <!-- 手机注册 -->
     <!-- 手机注册 -->
     <div class="phone-register" v-if="type === 'phone'">
     <div class="phone-register" v-if="type === 'phone'">
       <!-- <input placeholder="请输入昵称" type="text" v-model="form.nickname" maxlength="10"> -->
       <!-- <input placeholder="请输入昵称" type="text" v-model="form.nickname" maxlength="10"> -->
       <div class="phone-w">
       <div class="phone-w">
-        <div class="phone-area" @click="showPhoneArea = !showPhoneArea">
-          <p>{{selectArea[1]}}({{selectArea[0]}})</p>
+        <div class="phone-area" @click.stop="showPhoneArea = !showPhoneArea">
+          <p>{{selectArea[language === 'en' ? 2 : 0]}}({{selectArea[1]}})</p>
           <span class="sanjiao"></span>
           <span class="sanjiao"></span>
           <phoneAddressSelect  v-show="showPhoneArea" @select="changeArea" />
           <phoneAddressSelect  v-show="showPhoneArea" @select="changeArea" />
         </div>
         </div>
         
         
-        <input placeholder="请输入手机号码" class="phone" type="text" v-model="form.phone">
+        <input :placeholder="$t('login.phonePlaceholder')" class="phone" type="text" v-model="form.phone">
       </div>
       </div>
       <div class="code-w">
       <div class="code-w">
-        <input placeholder="请输入验证码" class="phone" type="text" v-model="form.authCode">
-        <div class="send-code-btn" :class="{'is-disabled': interTime}" @click="getAuthCode">{{ interTime ? `${interTime}s后重试` : '获取验证码'}}</div>
+        <input maxLength="6" oninput="value=value.replace(/[^\d]/g,'')" :placeholder="$t('login.codePlaceholder')" class="phone" type="text" v-model="form.authCode">
+        <div class="send-code-btn" :class="{'is-disabled': interTime}" @click="getAuthCode">{{ interTime ? $t('login.resendTime', { time: interTime }) : $t('login.sendCodeBtnText')}}</div>
       </div>
       </div>
       <div class="password-w" :class="{'show-tip': !form.password && passwordTip}" @mouseleave="passwordTip=false" @click="focusInput('emialInput')" >
       <div class="password-w" :class="{'show-tip': !form.password && passwordTip}" @mouseleave="passwordTip=false" @click="focusInput('emialInput')" >
-        <input ref="emialInput" :placeholder="passwordTip ? '' : '设置密码'" autocomplete="new-password "  v-model="form.password" type="password" @mouseover="passwordTip=true" >
-        <p>密码必须包含英文大小写、数字、长度8-16个字符</p>
+        <input ref="emialInput" maxLength="16" :placeholder="passwordTip ? '' : $t('login.setPassword')" autocomplete="new-password "  v-model="form.password" type="password" @mouseover="passwordTip=true" >
+        <p>{{$t('login.passwordTip')}}</p>
       </div>
       </div>
       <div class="password-w" :class="{'show-tip': !form.confirmPass && confirmPassWordTip}" @click="focusInput('emialConfirmInput')" @mouseleave="confirmPassWordTip=false">
       <div class="password-w" :class="{'show-tip': !form.confirmPass && confirmPassWordTip}" @click="focusInput('emialConfirmInput')" @mouseleave="confirmPassWordTip=false">
-        <input :placeholder="confirmPassWordTip ? '' : '重复密码'" ref="emialConfirmInput" autocomplete="new-password" v-model="form.confirmPass" type="password"  @mouseenter="confirmPassWordTip=true" >
-        <p>密码必须包含英文大小写、数字、长度8-16个字符</p>
+        <input maxLength="16" :placeholder="confirmPassWordTip ? '' : $t('login.rePassword')" ref="emialConfirmInput" autocomplete="new-password" v-model="form.confirmPass" type="password"  @mouseenter="confirmPassWordTip=true" >
+        <p>{{$t('login.passwordTip')}}</p>
       </div>
       </div>
-      <div class="right-tips" v-if="isInternational"><span @click="type = 'email'">邮箱注册</span></div>
+      <!-- <div class="right-tips" v-if="isInternational"><span @click="type = 'email'">邮箱注册</span></div> -->
     </div>
     </div>
     <!-- 邮箱注册 -->
     <!-- 邮箱注册 -->
     <div class="email-register" v-if="type === 'email'">
     <div class="email-register" v-if="type === 'email'">
       <!-- <input placeholder="请输入昵称" type="text" v-model="emailForm.nickname"> -->
       <!-- <input placeholder="请输入昵称" type="text" v-model="emailForm.nickname"> -->
       <div class="code-w">
       <div class="code-w">
-        <input placeholder="邮箱地址" class="phone" type="text" v-model="emailForm.phone">
+        <input :placeholder="$t('login.emailPlaceholder')" class="phone" type="text" v-model="emailForm.phone">
         <div class="send-code-btn" :class="{'is-disabled': interEmailTime}" @click="getEmailAuthCode">{{ interEmailTime ? `${interEmailTime}s后重试` : '获取验证码'}}</div>
         <div class="send-code-btn" :class="{'is-disabled': interEmailTime}" @click="getEmailAuthCode">{{ interEmailTime ? `${interEmailTime}s后重试` : '获取验证码'}}</div>
       </div>
       </div>
-      <input placeholder="请输入验证码"  type="text" v-model="emailForm.authCode">
+      <input :placeholder="$t('login.codePlaceholder')"  type="text" v-model="emailForm.authCode">
       <div class="password-w" :class="{'show-tip': !emailForm.password && passwordTip}" @mouseleave="passwordTip=false" @click="focusInput('emialInput')" >
       <div class="password-w" :class="{'show-tip': !emailForm.password && passwordTip}" @mouseleave="passwordTip=false" @click="focusInput('emialInput')" >
-        <input ref="emialInput" :placeholder="passwordTip ? '' : '设置密码'" autocomplete="new-password "  v-model="emailForm.password" type="password" @mouseover="passwordTip=true" >
-        <p>密码必须包含英文大小写、数字、长度8-16个字符</p>
+        <input maxLength="16" ref="emialInput" :placeholder="passwordTip ? '' : $t('login.setPassword')" autocomplete="new-password "  v-model="emailForm.password" type="password" @mouseover="passwordTip=true" >
+        <p>{{$t('login.passwordTip')}}</p>
       </div>
       </div>
       <div class="password-w" :class="{'show-tip': !emailForm.confirmPass && confirmPassWordTip}" @click="focusInput('emialConfirmInput')" @mouseleave="confirmPassWordTip=false">
       <div class="password-w" :class="{'show-tip': !emailForm.confirmPass && confirmPassWordTip}" @click="focusInput('emialConfirmInput')" @mouseleave="confirmPassWordTip=false">
-        <input :placeholder="confirmPassWordTip ? '' : '重复密码'" ref="emialConfirmInput" autocomplete="new-password" v-model="emailForm.confirmPass" type="password"  @mouseenter="confirmPassWordTip=true" >
-        <p>密码必须包含英文大小写、数字、长度8-16个字符</p>
+        <input maxLength="16" :placeholder="confirmPassWordTip ? '' : $t('login.rePassword')" ref="emialConfirmInput" autocomplete="new-password" v-model="emailForm.confirmPass" type="password"  @mouseenter="confirmPassWordTip=true" >
+        <p>{{$t('login.passwordTip')}}</p>
       </div>
       </div>
       
       
-      <div class="right-tips"><span @click="type = 'phone'">手机号码注册</span></div>
+      <!-- <div class="right-tips"><span @click="type = 'phone'">手机号码注册</span></div> -->
     </div>
     </div>
     <div class="xieyi-w">
     <div class="xieyi-w">
       <input id="xieyi" type="checkbox" v-model="showCluse">
       <input id="xieyi" type="checkbox" v-model="showCluse">
-      <label  for="xieyi">我已阅读并同意四维看看用户协议</label>
+      <label  for="xieyi">{{$t('login.cluse')}}</label>
     </div>
     </div>
-    <div class="register-btn" @click="submit">注册</div>
+    <div class="register-btn" @click="submit">{{$t('login.register')}}</div>
   </div>
   </div>
 </template>
 </template>
 
 
@@ -66,7 +66,7 @@ export default {
     return {
     return {
       type: 'phone',
       type: 'phone',
       showPhoneArea: false,
       showPhoneArea: false,
-      selectArea: ['+86', '中国'],
+      selectArea: ['中国', '+86', 'China'],
       interTime: 0,
       interTime: 0,
       interEmailTime: 0,
       interEmailTime: 0,
       showCluse: true,
       showCluse: true,
@@ -91,7 +91,8 @@ export default {
     ...mapState({
     ...mapState({
       langToast: state => state.language.home.toast,
       langToast: state => state.language.home.toast,
       isInternational: state => state.user.isInternational,
       isInternational: state => state.user.isInternational,
-      token: state => state.user.token
+      token: state => state.user.token,
+      language: state => state.language.current
     })
     })
   },
   },
   watch: {
   watch: {
@@ -126,6 +127,10 @@ export default {
   },
   },
   methods: {
   methods: {
     changeArea (item) {
     changeArea (item) {
+      this.showPhoneArea = false
+      if (!item) {
+        return
+      }
       this.selectArea = item
       this.selectArea = item
     },
     },
     async getAuthCode () {
     async getAuthCode () {
@@ -133,15 +138,14 @@ export default {
         return
         return
       }
       }
       if (!this.form.phone) {
       if (!this.form.phone) {
-        this.$alert('请填写手机号码')
+        this.$alert(this.$t('login.phonePlaceholder'))
         return
         return
       }
       }
       let res = await this.$store.dispatch('getAuthCode', {
       let res = await this.$store.dispatch('getAuthCode', {
         phone: this.form.phone,
         phone: this.form.phone,
-        code: Number(this.selectArea[0].substr(1)),
-        type: '',
+        code: Number(this.selectArea[1].substr(1)),
+        type: 'resigter',
       })
       })
-      console.log(res, 'res')
       if (res) {
       if (res) {
         this.interl && clearInterval(this.interl)
         this.interl && clearInterval(this.interl)
         this.interl = null
         this.interl = null
@@ -162,12 +166,12 @@ export default {
         return
         return
       }
       }
       if (!this.emailForm.phone) {
       if (!this.emailForm.phone) {
-        this.$alert('请填写邮箱')
+        this.$alert(this.$t('login.emailPlaceholder'))
         return
         return
       }
       }
       let patt = /^[A-Za-z0-9\u4e00-\u9fa5]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/
       let patt = /^[A-Za-z0-9\u4e00-\u9fa5]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/
       if (!patt.test(this.emailForm.phone)) {
       if (!patt.test(this.emailForm.phone)) {
-        this.$alert('请填写正确的邮箱')
+        this.$alert(this.$t('login.currentEmailTip'))
         return
         return
       }
       }
       let res = await this.$store.dispatch('getAuthCode', {
       let res = await this.$store.dispatch('getAuthCode', {
@@ -190,7 +194,7 @@ export default {
     },
     },
     async submit () {
     async submit () {
       if (!this.showCluse) {
       if (!this.showCluse) {
-        this.$alert('请阅读并同意四维看看用户协议')
+        this.$alert(this.$t('login.agreeXieyi'))
         return
         return
       }
       }
       let check = value => {
       let check = value => {
@@ -242,8 +246,8 @@ export default {
       if (form.password.length < 8 || form.confirmPass.length < 8) {
       if (form.password.length < 8 || form.confirmPass.length < 8) {
         return this.$toast.show('warn', this.langToast['31'])
         return this.$toast.show('warn', this.langToast['31'])
       }
       }
-
-      let country = Number(this.selectArea[0].substr(1))
+      console.log(this.selectArea)
+      let country = Number(this.selectArea[1].substr(1))
       let temp = encodeStr(Base64.encode(form.password), Base64.encode(form.confirmPass))
       let temp = encodeStr(Base64.encode(form.password), Base64.encode(form.confirmPass))
 
 
       let params = {
       let params = {
@@ -325,6 +329,11 @@ export default {
     border-radius: 3px;
     border-radius: 3px;
     position: relative;
     position: relative;
   }
   }
+  .code-w {
+    input {
+      min-width: 100px;
+    }
+  }
   .phone-w, .code-w {
   .phone-w, .code-w {
     display: flex;
     display: flex;
     border: 1px solid #909090;
     border: 1px solid #909090;
@@ -363,6 +372,7 @@ export default {
     .send-code-btn {
     .send-code-btn {
       padding: 0 10px;
       padding: 0 10px;
       cursor: pointer;
       cursor: pointer;
+      text-align: right;
       &.is-disabled {
       &.is-disabled {
         color: #909090;
         color: #909090;
         cursor: default;
         cursor: default;
@@ -419,6 +429,8 @@ export default {
       width: 100%;
       width: 100%;
       text-align: center;
       text-align: center;
       display: none;
       display: none;
+      white-space: nowrap;
+      overflow: hidden;
     }
     }
     &.show-tip {
     &.show-tip {
       p {
       p {

+ 15 - 15
pc/src/page/mall/cart/index.vue

@@ -3,23 +3,23 @@
     <div class="container" v-if="cart.length > 0">
     <div class="container" v-if="cart.length > 0">
       <div class="cart-header clear">
       <div class="cart-header clear">
         <div class="fl cart-header-left">
         <div class="fl cart-header-left">
-          <h3>购物车</h3>
-          <p>本订单顺丰包邮</p>
+          <h3>{{ $t('mall.cartTitle') }}</h3>
+          <p>{{ $t('mall.cartTitleTip') }}</p>
         </div>
         </div>
         <ul class="step fr">
         <ul class="step fr">
           <li>
           <li>
             <span class="step-num is-active">1</span>
             <span class="step-num is-active">1</span>
-            <span>加入购物</span>
+            <span>{{ $t('mall.addBuy') }}</span>
             <span class="line"></span>
             <span class="line"></span>
           </li>
           </li>
           <li>
           <li>
             <span class="step-num">2</span>
             <span class="step-num">2</span>
-            <span>确认订单</span>
+            <span>{{ $t('mall.confirmOrder') }}</span>
             <span class="line"></span>
             <span class="line"></span>
           </li>
           </li>
           <li>
           <li>
             <span class="step-num">3</span>
             <span class="step-num">3</span>
-            <span>下单</span>
+            <span>{{ $t('mall.submitOrder') }}</span>
             <span class="line"></span>
             <span class="line"></span>
           </li>
           </li>
         </ul>
         </ul>
@@ -31,10 +31,10 @@
               <h-icon type="duihao" class="icon" />
               <h-icon type="duihao" class="icon" />
             </div>
             </div>
           </div>
           </div>
-          <div class="th2">商品</div>
-          <div class="th3">价格</div>
-          <div class="th4">数量 </div>
-          <div class="th5">小计</div>
+          <div class="th2">{{ $t('mall.goods') }}</div>
+          <div class="th3">{{ $t('mall.price') }}</div>
+          <div class="th4">{{ $t('mall.count') }}</div>
+          <div class="th5">{{ $t('mall.mini') }}</div>
           <div class="th6"></div>
           <div class="th6"></div>
         </div>
         </div>
         <div class="table-body">
         <div class="table-body">
@@ -62,14 +62,14 @@
           </div>
           </div>
           <div class="cart-footer">
           <div class="cart-footer">
             <p class="count">
             <p class="count">
-              <span>总计{{goodsTotalCount}}件商品</span>
+              <span>{{ $t('mall.countNum', { num: goodsTotalCount}) }}</span>
               <span class="price">{{ formatNum(totalPrice) }}</span>
               <span class="price">{{ formatNum(totalPrice) }}</span>
             </p>
             </p>
             <div class="cart-actions clear">
             <div class="cart-actions clear">
               <img src="@/assets/images/refactor/mall/pay-channel.png" alt="" class="pay-channel">
               <img src="@/assets/images/refactor/mall/pay-channel.png" alt="" class="pay-channel">
               <div class="actions-w fr">
               <div class="actions-w fr">
-                <div class="btn" @click="$router.push('/mall/kankanPro')">继续选购</div>
-                <div class="btn submit-btn" @click="toConfirm">立即结算</div>
+                <div class="btn" @click="$router.push('/mall/kankanPro')">{{ $t('mall.continueBuy') }}</div>
+                <div class="btn submit-btn" @click="toConfirm">{{ $t('mall.nowJieSuan') }}</div>
               </div>
               </div>
             </div>
             </div>
           </div>
           </div>
@@ -79,14 +79,14 @@
     <div class="container" v-else>
     <div class="container" v-else>
       <div class="cart-header">
       <div class="cart-header">
         <div class=" cart-header-left">
         <div class=" cart-header-left">
-          <h3>购物车</h3>
+          <h3>{{ $t('mall.cartTitle') }}</h3>
         </div>
         </div>
         <div class="fr close-btn" @click="$router.push('/')">
         <div class="fr close-btn" @click="$router.push('/')">
           <h-icon type="vip_false" size="20" />
           <h-icon type="vip_false" size="20" />
         </div>
         </div>
       </div>
       </div>
       <div class="cart-section noGoods">
       <div class="cart-section noGoods">
-        <div class="btn" @click="$router.push('/mall/kankanPro')">立即购买</div>
+        <div class="btn" @click="$router.push('/mall/kankanPro')">{{ $t('mall.nowBuy') }}</div>
       </div>
       </div>
     </div>
     </div>
   </div>
   </div>
@@ -204,7 +204,7 @@ export default {
     toConfirm () {
     toConfirm () {
       console.log(this.selectedGoods)
       console.log(this.selectedGoods)
       if (this.selectedGoods.length === 0) {
       if (this.selectedGoods.length === 0) {
-        this.$toast.show('warn', '请选择需要购买的商品')
+        this.$toast.show('warn', this.$t('mall.noGoodsConfirm'))
         return
         return
       }
       }
       let goods = []
       let goods = []

+ 1 - 1
pc/src/page/mall/cloudCapacity/index.vue

@@ -10,7 +10,7 @@
     </div>
     </div>
     <div class="qa-con">
     <div class="qa-con">
       <ul class="container">
       <ul class="container">
-         <h1 class="common-title">关于云容量</h1>
+         <h1 class="common-title">{{ $t('mall.yunVoice') }}</h1>
         <li v-for="(item,i) in langPurchase.qa" :key="i">
         <li v-for="(item,i) in langPurchase.qa" :key="i">
           <p style="text-align:left;">{{item.q}}</p>
           <p style="text-align:left;">{{item.q}}</p>
           <p v-html="item.a"></p>
           <p v-html="item.a"></p>

+ 11 - 11
pc/src/page/mall/confirm/components/addressModule.vue

@@ -1,6 +1,6 @@
 <template>
 <template>
   <div class="address-module">
   <div class="address-module">
-    <h3 class="module-label">收货地址</h3>
+    <h3 class="module-label">{{$t('mall.receiveAddress')}}</h3>
     <ul class="address-list">
     <ul class="address-list">
       <li class="address-item is-active" >
       <li class="address-item is-active" >
         <!-- <div class="default-tag" v-if="address.setDefault === 1">默认地址</div> -->
         <!-- <div class="default-tag" v-if="address.setDefault === 1">默认地址</div> -->
@@ -13,7 +13,7 @@
           <p class="address-p2">{{ address.shipAddress }}</p>
           <p class="address-p2">{{ address.shipAddress }}</p>
         </div>
         </div>
         <div class="action-w" >
         <div class="action-w" >
-          <div class="edit"  @click.stop="showEdit(address)"><span class="icon edit-icon"></span><span>编辑</span></div>
+          <div class="edit"  @click.stop="showEdit(address)"><span class="icon edit-icon"></span><span>{{$t('common.edit')}}</span></div>
           <!-- <div class="delete" @click.stop="showDeleteId = address.id"><span class="icon delete-icon"></span><span>删除</span></div>
           <!-- <div class="delete" @click.stop="showDeleteId = address.id"><span class="icon delete-icon"></span><span>删除</span></div>
           <div class="delete-confirm-box" v-if="showDeleteId === address.id">
           <div class="delete-confirm-box" v-if="showDeleteId === address.id">
             <h4>您确认要删除该地址吗?</h4>
             <h4>您确认要删除该地址吗?</h4>
@@ -30,32 +30,32 @@
     </ul>
     </ul>
     <h-modal :visible="addressShow" :showClose="false">
     <h-modal :visible="addressShow" :showClose="false">
       <div class="address-form">
       <div class="address-form">
-        <div class="form-header">添加收货地址</div>
+        <div class="form-header">{{$t('mall.editAddress')}}</div>
         <div class="form">
         <div class="form">
           <div class="form-item">
           <div class="form-item">
-            <div class="form-label">*收货人</div>
+            <div class="form-label">*{{$t('mall.receiver')}}</div>
             <input type="text" maxlength="10" v-model="addressForm.shipName">
             <input type="text" maxlength="10" v-model="addressForm.shipName">
           </div>
           </div>
           <div class="form-item">
           <div class="form-item">
-            <div class="form-label">*手机号码</div>
+            <div class="form-label">*{{$t('mall.phone')}}</div>
             <input type="text" oninput="value=value.replace(/[^\d\-]/g,'')" maxlength='11' v-model="addressForm.shipMobile">
             <input type="text" oninput="value=value.replace(/[^\d\-]/g,'')" maxlength='11' v-model="addressForm.shipMobile">
           </div>
           </div>
           <div class="form-item">
           <div class="form-item">
-            <div class="form-label">*所在地区</div>
+            <div class="form-label">*{{$t('mall.area')}}</div>
             <div class="form-content">
             <div class="form-content">
               <citySelect :areaPath="addressForm.shipAreaPath" @currentVal="getCurrentSelect" />
               <citySelect :areaPath="addressForm.shipAreaPath" @currentVal="getCurrentSelect" />
             </div>
             </div>
           </div>
           </div>
           <div class="form-item">
           <div class="form-item">
-            <div class="form-label">*详细地址</div>
+            <div class="form-label">*{{$t('mall.addressDetail')}}</div>
             <div class="form-content">
             <div class="form-content">
               <textarea  v-model="addressForm.shipAddress" maxlength="50" />
               <textarea  v-model="addressForm.shipAddress" maxlength="50" />
             </div>
             </div>
           </div>
           </div>
         </div>
         </div>
         <div class="actions-w">
         <div class="actions-w">
-          <div class="cancel-btn" @click="addressShow=false">取消</div>
-          <div class="submit-btn" @click="uAddress">保存并使用</div>
+          <div class="cancel-btn" @click="addressShow=false">{{$t('common.cancle')}}</div>
+          <div class="submit-btn" @click="uAddress">{{$t('common.save')}}</div>
         </div>
         </div>
       </div>
       </div>
     </h-modal>
     </h-modal>
@@ -224,12 +224,12 @@ export default {
   }
   }
   .address-item {
   .address-item {
     width: 448px;
     width: 448px;
-    height: 91px;
+    min-height: 91px;
     border:  1px solid #ebebeb;
     border:  1px solid #ebebeb;
     cursor: pointer;
     cursor: pointer;
     position: relative;
     position: relative;
     margin-right: 20px;
     margin-right: 20px;
-    padding: 10px 73px 0 32px;
+    padding: 10px 73px 8px 32px;
     margin-bottom: 10px;
     margin-bottom: 10px;
     &.is-active {
     &.is-active {
       border-color: #1FE4DC;
       border-color: #1FE4DC;

+ 12 - 11
pc/src/page/mall/confirm/components/invoiceModule.vue

@@ -1,6 +1,6 @@
 <template>
 <template>
   <div class="invoice-modules">
   <div class="invoice-modules">
-    <h4 class="module-label">发票信息</h4>
+    <h4 class="module-label">{{$t('mall.invoiceIntro')}}</h4>
     <ul class="invoice-list">
     <ul class="invoice-list">
       <li class="invoice-select-w" :class="{'is-active': invoiceStatus === 0}" @click="visible = false;invoiceStatus=0;">
       <li class="invoice-select-w" :class="{'is-active': invoiceStatus === 0}" @click="visible = false;invoiceStatus=0;">
         {{langOrders.type1}}
         {{langOrders.type1}}
@@ -14,7 +14,7 @@
     </ul>
     </ul>
     <h-modal :visible="visible" :showClose="false">
     <h-modal :visible="visible" :showClose="false">
       <div class="invoice-modal">
       <div class="invoice-modal">
-        <h2 class="modal-title">发票信息</h2>
+        <h2 class="modal-title">{{$t('mall.invoiceIntro')}}</h2>
         <div class="modal-content">
         <div class="modal-content">
           <div class="form-tabs">
           <div class="form-tabs">
             <div class="tab" :class="{'is-active': invoiceType === item.type}" v-for="item in tabs" :key="item.type" @click="invoiceType=item.type">{{item.name}}</div>
             <div class="tab" :class="{'is-active': invoiceType === item.type}" v-for="item in tabs" :key="item.type" @click="invoiceType=item.type">{{item.name}}</div>
@@ -30,8 +30,8 @@
             <div class="form-item">
             <div class="form-item">
               <div class="form-label"></div>
               <div class="form-label"></div>
               <div class="form-input">
               <div class="form-input">
-                <span class="select-label " :class="{'is-active': invoiceSubType === 1}" @click="invoiceSubType = 1">个人</span>
-                <span class="select-label" :class="{'is-active': invoiceSubType === 2}" @click="invoiceSubType = 2">单位</span>
+                <span class="select-label " :class="{'is-active': invoiceSubType === 1}" @click="invoiceSubType = 1">{{$t('mall.people')}}</span>
+                <span class="select-label" :class="{'is-active': invoiceSubType === 2}" @click="invoiceSubType = 2">{{$t('mall.enterprise')}}</span>
               </div>
               </div>
             </div>
             </div>
             <div class="form-item" v-show="invoiceSubType === 1">
             <div class="form-item" v-show="invoiceSubType === 1">
@@ -47,7 +47,7 @@
               </div>
               </div>
             </div>
             </div>
             <div class="form-item" v-show="invoiceSubType === 2">
             <div class="form-item" v-show="invoiceSubType === 2">
-              <div class="form-label">*纳税人识别号</div>
+              <div class="form-label">*{{$t('mall.nashui')}}</div>
               <div class="form-input">
               <div class="form-input">
                 <input type="text" :placeholder="langOrders.code"  v-model="invoiceForm.code">
                 <input type="text" :placeholder="langOrders.code"  v-model="invoiceForm.code">
               </div>
               </div>
@@ -62,7 +62,7 @@
               </div>
               </div>
             </div>
             </div>
             <div class="form-item">
             <div class="form-item">
-              <div class="form-label">*纳税人识别号</div>
+              <div class="form-label">*{{$t('mall.nashui')}}</div>
               <div class="form-input">
               <div class="form-input">
                 <input type="text" :placeholder="langOrders.code" v-model="invoiceForm3.code">
                 <input type="text" :placeholder="langOrders.code" v-model="invoiceForm3.code">
               </div>
               </div>
@@ -94,12 +94,12 @@
           </div>
           </div>
         </div>
         </div>
         <div class="modal-tips">
         <div class="modal-tips">
-          <div class="tips-left">温馨提示:</div>
-          <div class="tips-content">专票随商品一并寄出,若因特殊情况会于10天内顺丰寄送给您(如遇节假日稍有延迟)。请注意查收;增值税专用发票收到后请妥善保存,如退货请一同寄回,如退货专票未能寄回,则需扣除相应的税点。</div>
+          <div class="tips-left">{{$t('mall.wenxinTip')}}:</div>
+          <div class="tips-content">{{ $t('mall.wenxinTipContent') }}</div>
         </div>
         </div>
         <div class="actions-w">
         <div class="actions-w">
           <div class="cancel-btn" @click="visible=false">{{langOrders.cancal1}}</div>
           <div class="cancel-btn" @click="visible=false">{{langOrders.cancal1}}</div>
-          <div class="submit-btn" @click="saveInvoice">保存并使用</div>
+          <div class="submit-btn" @click="saveInvoice">{{ $t('common.saveAndUse')}}</div>
         </div>
         </div>
       </div>
       </div>
     </h-modal>
     </h-modal>
@@ -127,10 +127,10 @@ export default {
     return {
     return {
       visible: false,
       visible: false,
       tabs: [{
       tabs: [{
-        name: '电子普通发票',
+        name: this.$t('mall.normalInvoice'),
         type: 2
         type: 2
       }, {
       }, {
-        name: '专用发票',
+        name: this.$t('mall.zengzhiInvoice'),
         type: 3
         type: 3
       }],
       }],
       invoiceForm: {
       invoiceForm: {
@@ -347,6 +347,7 @@ export default {
   width: 533px;
   width: 533px;
   text-align: center;
   text-align: center;
   padding: 38px;
   padding: 38px;
+  background: #fff;
   .modal-title {
   .modal-title {
     font-size: 20px;
     font-size: 20px;
     line-height: 25px;
     line-height: 25px;

+ 18 - 16
pc/src/page/mall/confirm/index.vue

@@ -3,22 +3,22 @@
     <div class="container clear">
     <div class="container clear">
       <div class="confirm-header clear">
       <div class="confirm-header clear">
         <div class="fl confirm-header-left">
         <div class="fl confirm-header-left">
-          <h3>确认订单</h3>
+          <h3>{{$t('mall.confirmOrder')}}</h3>
         </div>
         </div>
         <ul class="step fr">
         <ul class="step fr">
           <li>
           <li>
             <span class="step-num ">1</span>
             <span class="step-num ">1</span>
-            <span>加入购物</span>
+            <span>{{$t('mall.addBuy')}}</span>
             <span class="line"></span>
             <span class="line"></span>
           </li>
           </li>
           <li>
           <li>
             <span class="step-num is-active">2</span>
             <span class="step-num is-active">2</span>
-            <span>确认订单</span>
+            <span>{{$t('mall.confirmOrder')}}</span>
             <span class="line"></span>
             <span class="line"></span>
           </li>
           </li>
           <li>
           <li>
             <span class="step-num">3</span>
             <span class="step-num">3</span>
-            <span>下单</span>
+            <span>{{$t('mall.submitOrder')}}</span>
             <span class="line"></span>
             <span class="line"></span>
           </li>
           </li>
         </ul>
         </ul>
@@ -30,7 +30,7 @@
         <invoiceModule @change="changeInvoice" />
         <invoiceModule @change="changeInvoice" />
       </div>
       </div>
       <div class="order-detail-items">
       <div class="order-detail-items">
-        <h4 class="module-label">商品信息</h4>
+        <h4 class="module-label">{{$t('mall.goodsInfo')}}</h4>
         <div class="order-detail">
         <div class="order-detail">
           <div class="detail-left">
           <div class="detail-left">
             <div class="goods-item" v-for="item in goods" :key="item.goodsId">
             <div class="goods-item" v-for="item in goods" :key="item.goodsId">
@@ -45,28 +45,28 @@
           </div>
           </div>
           <div class="detail-right">
           <div class="detail-right">
             <div class="right-item">
             <div class="right-item">
-              <span>商品总价</span>
+              <span>{{$t('mall.goodsTotalPrice')}}</span>
               <span>¥{{totalGoodsPrice}}</span>
               <span>¥{{totalGoodsPrice}}</span>
             </div>
             </div>
             <div class="right-item">
             <div class="right-item">
-              <span>税费及其它费用</span>
+              <span>{{$t('mall.otherPrice')}}</span>
               <span>¥0</span>
               <span>¥0</span>
             </div>
             </div>
             <div class="right-item">
             <div class="right-item">
-              <span>运费</span>
+              <span>{{$t('mall.yunfei')}}</span>
               <span>¥0</span>
               <span>¥0</span>
             </div>
             </div>
             <div class="total-price">
             <div class="total-price">
-              合计:<span>¥{{ totalGoodsPrice }}</span>
+              {{$t('mall.total')}}:<span>¥{{ totalGoodsPrice }}</span>
             </div>
             </div>
           </div>
           </div>
         </div>
         </div>
       </div>
       </div>
       <div class="xieyi">
       <div class="xieyi">
         <input type="checkbox" v-model="checked">
         <input type="checkbox" v-model="checked">
-        <span @click="showAgreement">我已阅读并同意四维看看用户协议</span>
+        <span @click="showAgreement">{{$t('login.cluse')}}</span>
       </div>
       </div>
-      <div class="submit-btn fr" @click="pay">付款</div>
+      <div class="submit-btn fr" @click="pay">{{$t('mall.payOrder')}}</div>
     </div>
     </div>
     <h-modal :visible.sync="openClause" >
     <h-modal :visible.sync="openClause" >
       <div  class="user-clause cart-clause">
       <div  class="user-clause cart-clause">
@@ -125,8 +125,10 @@ export default {
     }
     }
   },
   },
   mounted () {
   mounted () {
-    // this.sizeHandle()
-    console.log(getConfirmGoods())
+    if (!this.token) {
+      this.$router.push('/login/login')
+      return
+    }
     this.$bus.$on('hasLogin', () => {
     this.$bus.$on('hasLogin', () => {
       this.notEmit = false
       this.notEmit = false
       setTimeout(() => {
       setTimeout(() => {
@@ -137,11 +139,11 @@ export default {
   methods: {
   methods: {
     async pay () {
     async pay () {
       if (!this.checked) {
       if (!this.checked) {
-        this.$alert('请同意四维看看用户协议')
+        this.$alert(this.$t('login.agreeXieyi'))
         return
         return
       }
       }
       if (!this.address) {
       if (!this.address) {
-        this.$alert('请添加地址')
+        this.$alert(this.$t('mall.addAddressTip'))
         return
         return
       }
       }
       let params = {
       let params = {
@@ -149,7 +151,7 @@ export default {
         receiver: this.address,
         receiver: this.address,
         invoice: this.invoice,
         invoice: this.invoice,
         payType: 0,
         payType: 0,
-        abroad: this.language === 'en' ? 1 : 0
+        abroad: 0
       }
       }
       let res = await this.$http
       let res = await this.$http
         .post('user/order/placeOrder', params, {
         .post('user/order/placeOrder', params, {

+ 10 - 4
pc/src/page/mall/kankanPro/index.vue

@@ -15,6 +15,12 @@
           </p>
           </p>
           <template>
           <template>
             <div class="intro-item">
             <div class="intro-item">
+              <h4 class="intro-title">{{langPurchase.color.key}}</h4>
+              <ul>
+                <li>{{langPurchase.color.val}}</li>
+              </ul>
+            </div>
+            <div class="intro-item">
               <h4 class="intro-title">{{langPurchase.service.key}}</h4>
               <h4 class="intro-title">{{langPurchase.service.key}}</h4>
               <ul>
               <ul>
                 <li>{{langPurchase.service.type}} <a :href="`${pathname}#/mall/cloudCapacity`" target="_blank">{{ $t('mall.knowMore') }}</a></li>
                 <li>{{langPurchase.service.type}} <a :href="`${pathname}#/mall/cloudCapacity`" target="_blank">{{ $t('mall.knowMore') }}</a></li>
@@ -38,14 +44,14 @@
               </div>
               </div>
             </div>
             </div>
             
             
-            <div class="number-w">{{ $t('mall.count') }} <number v-model="count" :max="99" style="margin-left:12px;" /></div>
+            <div class="number-w" v-if="language==='zh'">{{ $t('mall.count') }} <number v-model="count" :max="99" style="margin-left:12px;" /></div>
           </template>
           </template>
-          <template v-if="language!=='en'">
+          <template v-if="language==='zh'">
             <div class="totalPrice">¥{{ totalPrice }}</div>
             <div class="totalPrice">¥{{ totalPrice }}</div>
           </template>
           </template>
           <div>
           <div>
             <div class="btns">
             <div class="btns">
-              <div v-if="language!=='en'" class="button add-cart" @click="addcart" style="margin-right:28px;">
+              <div v-if="language==='zh'" class="button add-cart" @click="addcart" style="margin-right:28px;">
                 <vcenter>
                 <vcenter>
                   <span>{{ $t('mall.cart') }}</span>
                   <span>{{ $t('mall.cart') }}</span>
                 </vcenter>
                 </vcenter>
@@ -56,7 +62,7 @@
                 </vcenter>
                 </vcenter>
               </div>
               </div>
             </div>
             </div>
-            <div class="btn-dec" ><h-icon type="gouwuche" class="shop-cart-icon" />{{ $t('mall.fahuo')}}</div>
+            <div class="btn-dec" v-if="language==='zh'"><h-icon type="gouwuche" class="shop-cart-icon" />{{ langPurchase.tiaokuan }}</div>
           </div>
           </div>
         </div>
         </div>
       </div>
       </div>

+ 3 - 1
pc/src/page/mall/kankanPro/style.scss

@@ -62,11 +62,13 @@
       max-width: 100%;
       max-width: 100%;
     }
     }
     .price{
     .price{
-      margin: 20px 0 25px;
+      margin: 20px 0 20px;
       font-size: 40px;
       font-size: 40px;
       line-height: 50px;
       line-height: 50px;
       color: rgba(0,0,0,.7);
       color: rgba(0,0,0,.7);
       font-weight: 700;
       font-weight: 700;
+      border-bottom: 1px solid #e2e2e2;
+      padding-bottom: 20px;
       span{
       span{
         font-size: 14px;
         font-size: 14px;
         color: #1fe4dc;
         color: #1fe4dc;

+ 8 - 8
pc/src/page/mall/pay/index.vue

@@ -3,30 +3,30 @@
     <div class="container">
     <div class="container">
       <div class="pay-header">
       <div class="pay-header">
         <div class="logo">
         <div class="logo">
-          <img src="@/assets/images/home/logo-cn.png" alt="">
+          <img :src="language === 'en' ? `https://4dscene.oss-cn-shenzhen.aliyuncs.com/new4dkk/v2/img/%E7%BB%84%203802.png` : require('@/assets/images/home/logo-cn.png')" alt="">
         </div>
         </div>
-        <p>支付中心</p>
+        <p>{{ $t('mall.payCenter') }}</p>
       </div>
       </div>
       <div class="pay-content">
       <div class="pay-content">
-        <div class="account"><span class="label">当前账号:</span><span>{{ info.userName }}</span></div>
+        <div class="account"><span class="label">{{ $t('mall.nowAccount') }}:</span><span>{{ info.userName }}</span></div>
         <div class="pay-types">
         <div class="pay-types">
-          <p class="label">支付方式:</p>
+          <p class="label">{{ $t('mall.payType') }}:</p>
           <div class="pay-type ali-pay" @click="selectedPayType = 'alipay'" :class="{'is-active': selectedPayType === 'alipay'}">
           <div class="pay-type ali-pay" @click="selectedPayType = 'alipay'" :class="{'is-active': selectedPayType === 'alipay'}">
             <span class="pay-icon ali-icon"></span>
             <span class="pay-icon ali-icon"></span>
             <h-icon type="vip_true" class="select-icon"></h-icon>
             <h-icon type="vip_true" class="select-icon"></h-icon>
-            支付宝
+            {{ $t('mall.aliPay') }}
           </div>
           </div>
           <div class="pay-type wechat-pay " @click="selectedPayType = 'wechatPay'" :class="{'is-active': selectedPayType === 'wechatPay'}">
           <div class="pay-type wechat-pay " @click="selectedPayType = 'wechatPay'" :class="{'is-active': selectedPayType === 'wechatPay'}">
             <span class="pay-icon wechat-icon"></span>
             <span class="pay-icon wechat-icon"></span>
             <h-icon type="vip_true" class="select-icon"></h-icon>
             <h-icon type="vip_true" class="select-icon"></h-icon>
-            微信支付</div>
+            {{ $t('mall.wechatPay') }}</div>
         </div>
         </div>
         <div class="pay-info">
         <div class="pay-info">
-          <p class="label">应付金额:</p>
+          <p class="label">{{ $t('mall.payNum') }}:</p>
           <p class="price">¥{{response.price}}</p>
           <p class="price">¥{{response.price}}</p>
           <div class="pay-qrcode">
           <div class="pay-qrcode">
             <img :src="`${$serverName}${response.src}`" alt="">
             <img :src="`${$serverName}${response.src}`" alt="">
-            <p>使用{{ selectedPayType === 'alipay' ? '支付宝' : '微信'}}app扫码完成支付</p>
+            <p>{{ $t('mall.payTip', {type: selectedPayType === 'alipay' ? $t('mall.aliPay') : $t('mall.wechat')}) }}</p>
           </div>
           </div>
           <div class="pay-scan-tip"></div>
           <div class="pay-scan-tip"></div>
         </div>
         </div>

+ 29 - 9
pc/src/page/mall/zhijia/index.vue

@@ -11,21 +11,25 @@
         <!-- <video class="product-img" :style="{marginLeft:(split - 500)+ 'px'}" :src="`${$cdn}video/zhijia-video.mp4`" autoplay muted loop></video> -->
         <!-- <video class="product-img" :style="{marginLeft:(split - 500)+ 'px'}" :src="`${$cdn}video/zhijia-video.mp4`" autoplay muted loop></video> -->
         <div class="layout">
         <div class="layout">
           <!-- <img class="pro-logo" :src="this.language==='en'?`${$cdn}images/zhijia-logo-en.png`:`${$cdn}images/zhijia-logo-black.png`" alt=""> -->
           <!-- <img class="pro-logo" :src="this.language==='en'?`${$cdn}images/zhijia-logo-en.png`:`${$cdn}images/zhijia-logo-black.png`" alt=""> -->
-          <h1 class="pro-title">四维看看Pro三脚架套装</h1>
+          <h1 class="pro-title">{{mallConfig.goodsMap[7].name}}</h1>
           <p class="sub b-label" v-html="langPurchase.dec"></p>
           <p class="sub b-label" v-html="langPurchase.dec"></p>
           <p class="price">
           <p class="price">
-             ¥{{mallConfig.zhijiaPrice}}
+             {{langPurchase.price}}
             <!-- <span>{{langPurchase.yushou}}</span> -->
             <!-- <span>{{langPurchase.yushou}}</span> -->
           </p>
           </p>
-          <p class="postage">运费:顺丰包邮</p>
+          <!-- <p class="postage">运费:顺丰包邮</p> -->
           <template>
           <template>
-            <div class="taozhuang">
-              <p class="taozhuang-title">套装内容</p>
-              <div class="detail-box sceond-box">
-                <ul>
+            <div class="intro-item">
+              <h4 class="intro-title">{{langPurchase.color.key}}</h4>
+              <ul>
+                <li>{{langPurchase.color.val}}</li>
+              </ul>
+            </div>
+            <div class="intro-item">
+              <h4 class="intro-title">{{langPurchase.service.key}}</h4>
+              <ul>
                   <li v-for="(item, i) in langPurchase.service.val" :key="i">{{item}}</li>
                   <li v-for="(item, i) in langPurchase.service.val" :key="i">{{item}}</li>
                 </ul>
                 </ul>
-              </div>
             </div>
             </div>
           </template>
           </template>
           <template v-if="language!=='en'">
           <template v-if="language!=='en'">
@@ -46,7 +50,7 @@
                 </vcenter>
                 </vcenter>
               </div>
               </div>
             </div>
             </div>
-            <div class="btn-dec"><h-icon type="gouwuche" class="shop-cart-icon" />{{ $t('mall.fahuo')}}</div>
+            <div class="btn-dec" v-if="language==='zh'"><h-icon type="gouwuche" class="shop-cart-icon" />{{ langPurchasekankan.tiaokuan }}</div>
           </div>
           </div>
         </div>
         </div>
       </div>
       </div>
@@ -305,4 +309,20 @@ export default {
 
 
 <style lang="scss" scoped>
 <style lang="scss" scoped>
 @import "./style.scss";
 @import "./style.scss";
+.intro-item {
+  ul {
+    margin: 15px 0 25px;
+    padding-left: 20px;
+  }
+  li {
+    list-style: disc;
+    color: #909090;
+    line-height: 33px;
+    a {
+      font-size: 12px;
+      color: #909090;
+      text-decoration: underline;
+    }
+  }
+}
 </style>
 </style>

+ 3 - 0
pc/src/page/mall/zhijia/style.scss

@@ -89,6 +89,9 @@
       line-height: 1;
       line-height: 1;
       color: rgba(0,0,0,.7);
       color: rgba(0,0,0,.7);
       font-weight: 700;
       font-weight: 700;
+      border-bottom: 1px solid #e2e2e2;
+      padding-bottom: 20px;
+      margin-bottom: 20px;
       span{
       span{
         font-size: 14px;
         font-size: 14px;
         color: #1fe4dc;
         color: #1fe4dc;

+ 4 - 0
pc/src/page/manage/index.vue

@@ -94,6 +94,10 @@ export default {
     }
     }
   },
   },
   mounted () {
   mounted () {
+    if (!this.token) {
+      this.$router.push('/login/login')
+      return
+    }
     document.addEventListener('click', (e) => {
     document.addEventListener('click', (e) => {
       if (this.$refs.selectMenu) {
       if (this.$refs.selectMenu) {
         if (!this.$refs.selectMenu.contains(e.target)) {
         if (!this.$refs.selectMenu.contains(e.target)) {

+ 1 - 1
pc/src/page/manage/temp/information.vue

@@ -5,7 +5,7 @@
       @clickOper="handleOper('infoStatus')"
       @clickOper="handleOper('infoStatus')"
       :oper="infoStatus?langAccount.edit:langAccount.show"
       :oper="infoStatus?langAccount.edit:langAccount.show"
       :isActive="infoStatus"
       :isActive="infoStatus"
-      class="container"
+      class=""
     >
     >
       <div class="info" :class="{'info-en':language==='en'}" slot="show">
       <div class="info" :class="{'info-en':language==='en'}" slot="show">
         <div class="s-tx">
         <div class="s-tx">

+ 1 - 1
pc/src/page/manage/temp/order.vue

@@ -388,7 +388,7 @@ $border-color: #e7e7e7;
     .o-invoice{
     .o-invoice{
       display: flex;
       display: flex;
       align-items: center;
       align-items: center;
-      padding: 10px 85px;
+      padding: 10px 20px 10px 85px;
       color: #4a4a4a;
       color: #4a4a4a;
       font-size: 14px;
       font-size: 14px;
       border-bottom: 1px solid $border-color;
       border-bottom: 1px solid $border-color;

+ 3 - 3
pc/src/page/news/index.vue

@@ -12,8 +12,8 @@
       <ul class="swiper-pagination"  slot="pagination">
       <ul class="swiper-pagination"  slot="pagination">
         <li v-for="(item, index) in banners" :class="{'is-active': activeIndex === index}" :key="index" @click="slide(index)"></li>
         <li v-for="(item, index) in banners" :class="{'is-active': activeIndex === index}" :key="index" @click="slide(index)"></li>
       </ul>
       </ul>
-      <div class="swiper-button-prev swiper-button" slot="button-prev" @click.stop="mySwiper.slidePrev()"></div>
-      <div class="swiper-button-next swiper-button" slot="button-next" @click.stop="mySwiper.slideNext()"></div>
+      <div class="swiper-button-prev swiper-button" slot="button-prev" @click.stop="mySwiper.slidePrev()" v-if="activeIndex !== 0"></div>
+      <div class="swiper-button-next swiper-button" slot="button-next" @click.stop="mySwiper.slideNext()" v-if="activeIndex !== banners.length-1"></div>
     </swiper>
     </swiper>
     <div class="news-list">
     <div class="news-list">
       <div class="container">
       <div class="container">
@@ -56,7 +56,7 @@ export default {
         banner: require('@/assets/images/refactor/news/banner2.png'),
         banner: require('@/assets/images/refactor/news/banner2.png'),
         link: 'https://mp.weixin.qq.com/s/EHxLGCGvznqijxOLPLTXkQ'
         link: 'https://mp.weixin.qq.com/s/EHxLGCGvznqijxOLPLTXkQ'
       }, {
       }, {
-        html: '四维看展与德国黑提恩斯-陶瓷博物馆合作,<br/>可3D鉴赏珍宝',
+        // html: '四维看展与德国黑提恩斯-陶瓷博物馆合作,<br/>可3D鉴赏珍宝',
         className: 'banner-3',
         className: 'banner-3',
         banner: require('@/assets/images/refactor/news/banner3.png'),
         banner: require('@/assets/images/refactor/news/banner3.png'),
         link: 'https://mp.weixin.qq.com/s/eQ2IuHdlIVg7n0IsXJs5iA'
         link: 'https://mp.weixin.qq.com/s/eQ2IuHdlIVg7n0IsXJs5iA'

+ 21 - 21
pc/src/store/language/cn/about.js

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

+ 23 - 22
pc/src/store/language/en/about.js

@@ -28,24 +28,27 @@ export default{
     title: 'Chronicle',
     title: 'Chronicle',
     nodes: [
     nodes: [
       {
       {
-        year: '2014',
+        year: '2020',
         txt: [
         txt: [
-          '<i>2014.10</i>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.',
-          '<i>2014.12</i>4DAGE was granted a patent for a raster scanning digital 3D object reconstruction device with micron-level modeling accuracy.'
+          '<i>2020.01</i>In January, 4DKanKan won the new generation of artificial intelligence industry innovation key tasks of the Ministry of Industry and Information Technology.',
+          '<i>2020.02</i>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.',
+          '<i>2020.03</i>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.',
+          '<i>2020.03</i>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: [
         txt: [
-          '<i>2015.08</i>4DAGE, in competition with over 27,000 enterprises, won the China Innovation and Entrepreneurship Competition\'s Outstanding Enterprise Award.',
-          '<i>2015.10</i>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.',
-          '<i>2015.10</i>Became partner of organizations that preserves cultural heritage, including the Palace Museum and Guangdong Provincial Museum.'
+          '<i>2019.04</i>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.',
+          '<i>2019.05</i>4DKanKan Pro was unveiled at Rise of AI Conference in Berlin, Germany.'
         ]
         ]
       },
       },
       {
       {
-        year: '2016',
+        year: '2018',
         txt: [
         txt: [
-          '<i>2016.05</i>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.'
+          '<i>2018.05</i>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.',
+          '<i>2018.11</i>4DKanKan was recognized as “Scientific and Technological Achievement” by China High-tech Industrialization Association',
+          '<i>2018.11</i>4DKanKan was evaluated as “Excellent Product” by China Hi-Tech Fair.'
         ]
         ]
       },
       },
       {
       {
@@ -56,29 +59,27 @@ export default{
         ]
         ]
       },
       },
       {
       {
-        year: '2018',
+        year: '2016',
         txt: [
         txt: [
-          '<i>2018.05</i>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.',
-          '<i>2018.11</i>4DKanKan was recognized as “Scientific and Technological Achievement” by China High-tech Industrialization Association',
-          '<i>2018.11</i>4DKanKan was evaluated as “Excellent Product” by China Hi-Tech Fair.'
+          '<i>2016.05</i>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: [
         txt: [
-          '<i>2019.04</i>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.',
-          '<i>2019.05</i>4DKanKan Pro was unveiled at Rise of AI Conference in Berlin, Germany.'
+          '<i>2015.08</i>4DAGE, in competition with over 27,000 enterprises, won the China Innovation and Entrepreneurship Competition\'s Outstanding Enterprise Award.',
+          '<i>2015.10</i>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.',
+          '<i>2015.10</i>Became partner of organizations that preserves cultural heritage, including the Palace Museum and Guangdong Provincial Museum.'
         ]
         ]
       },
       },
       {
       {
-        year: '2020',
+        year: '2014',
         txt: [
         txt: [
-          '<i>2020.01</i>In January, 4DKanKan won the new generation of artificial intelligence industry innovation key tasks of the Ministry of Industry and Information Technology.',
-          '<i>2020.02</i>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.',
-          '<i>2020.03</i>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.',
-          '<i>2020.03</i>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.'
+          '<i>2014.10</i>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.',
+          '<i>2014.12</i>4DAGE was granted a patent for a raster scanning digital 3D object reconstruction device with micron-level modeling accuracy.'
         ]
         ]
-      }
+      },
+      
     ]
     ]
   },
   },
   kefu: [
   kefu: [

+ 1 - 1
pc/src/store/language/en/purchase.js

@@ -111,7 +111,7 @@ export default{
     '18hw': '$760/year',
     '18hw': '$760/year',
     '19hw': '$3490/year',
     '19hw': '$3490/year',
     '20hw': '$17990/year',
     '20hw': '$17990/year',
-    21: 'If you want topurchase more than 1T, please contact customer service.'
+    21: 'If you want to purchase more than 1T, please contact customer service.'
 
 
   },
   },
   pricetxt: [
   pricetxt: [

+ 1 - 1
pc/src/store/language/index.js

@@ -32,7 +32,7 @@ export default {
         value: 'zh'
         value: 'zh'
       },
       },
       {
       {
-        name: 'ENGLISH',
+        name: 'English',
         img: require('@/assets/images/home/USA@2x.jpg'),
         img: require('@/assets/images/home/USA@2x.jpg'),
         value: 'en'
         value: 'en'
       },
       },

+ 2 - 1
pc/src/util/http.js

@@ -62,12 +62,13 @@ axios.interceptors.response.use(
         return response
         return response
       }
       }
     }
     }
+    console.log(response.data)
     switch (code) {
     switch (code) {
       case 3004:
       case 3004:
         let msg = localStorage.getItem('language') === 'en' ? 'Please re-log in.' : '请重新登录'
         let msg = localStorage.getItem('language') === 'en' ? 'Please re-log in.' : '请重新登录'
         store.state.user.token && vue.$toast.show('warn', msg, async () => {
         store.state.user.token && vue.$toast.show('warn', msg, async () => {
           await store.dispatch('logout')
           await store.dispatch('logout')
-          router.push({name: 'home'})
+          router.push('/login/login')
         })
         })
         break
         break
       default:
       default: