浏览代码

feat:备份下

xzh 4 年之前
父节点
当前提交
e737c64546

+ 3 - 1
pc/build/webpack.dev.conf.js

@@ -9,6 +9,7 @@ const CopyWebpackPlugin = require('copy-webpack-plugin')
 const HtmlWebpackPlugin = require('html-webpack-plugin')
 const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin')
 const portfinder = require('portfinder')
+const wepackDevServer = require('./wepack.dev.server')
 
 // const HOST = '192.168.0.172'
 const HOST = '0.0.0.0'
@@ -49,7 +50,8 @@ const devWebpackConfig = merge(baseWebpackConfig, {
         target: 'https://test.4dkankan.com',
         changeOrigin: true,
       }
-    }
+    },
+    setup: wepackDevServer
   },
   plugins: [
     new webpack.DefinePlugin({

+ 29 - 0
pc/build/wepack.dev.server.js

@@ -0,0 +1,29 @@
+const fs = require('fs')
+const path = require('path')
+const bodyParser = require('body-parser');
+const langDir = path.join(__dirname, '../src/lang')
+module.exports = function(app, server) {
+    app.use('/dev', bodyParser.json());
+    app.use('/dev', bodyParser.urlencoded({ extended: false }));
+
+    app.get('/dev/lang/:id', function(req, res) {
+        let filePath = path.join(langDir, req.params.id + '/modules')
+        console.log(filePath)
+        const files = fs.readdirSync(filePath)
+        let data = {}
+        files.forEach(item => {
+          data[item.replace(/\.\w+$/, '')] = require(path.join(__dirname, `../src/lang/${req.params.id}/modules/${item}`))
+        })
+        res.json({ ok: true, data });
+    });
+    app.post('/dev/lang/:id', function(req, res) {
+      Object.keys(req.body).forEach(item => {
+        fs.writeFile('./src/lang/' + req.params.id + `/modules/${item}.js`, 'module.exports = ' + JSON.stringify(req.body[item], null, 4), err => {
+          if (err) {
+              return res.json({ ok: false });
+          }
+          res.json({ ok: true });
+        })
+      })
+    });
+}

+ 114 - 0
pc/src/components/dev/Configuration.vue

@@ -0,0 +1,114 @@
+<!--
+ * @Author: Rindy
+ * @Date: 2020-03-13 16:53:05
+ * @LastEditors: Rindy
+ * @LastEditTime: 2020-09-07 16:25:41
+ * @Description: 注释
+ -->
+<template>
+    <div class="dev-system">
+        <div class="container">
+            <header>
+                <span>系统设置</span>
+                <span @click="onClose">
+                    <i class="iconfont icon_close"></i>
+                </span>
+            </header>
+            <article>
+                <div class="menu">
+                    <ul>
+                        <li v-for="(item,key) in menu" :key="key" @click="onMenuClick(item)">{{item.text}}</li>
+                    </ul>
+                </div>
+                <div class="page">
+                    <component :is="component"></component>
+                </div>
+            </article>
+        </div>
+    </div>
+</template>
+<script>
+export default {
+    data() {
+        return {
+            menu: [{ text: "语言设置", name: "Lang" }],
+            page: "Lang"
+        };
+    },
+    computed: {
+        component() {
+            let page = this.page;
+            return () => import(`@/components/dev/components/${page}.vue`);
+        }
+    },
+    methods: {
+        onClose() {
+            document.body.removeChild(this.$el);
+            this.$destroy();
+            //this.$route.replace('/')
+        },
+        onMenuClick(item){
+            this.page =item.name
+        }
+    }
+};
+</script>
+<style lang="less" scoped>
+.dev-system {
+    padding: 20px;
+    position: fixed;
+    left: 0;
+    top: 0;
+    width: 100%;
+    height: 100%;
+    background-color: rgba(0, 0, 0, 0.3);
+    z-index: 1000;
+    color: #000;
+}
+.container {
+    display: flex;
+    width: 100%;
+    height: 100%;
+    background-color: #efefef;
+    flex-direction: column;
+    overflow: hidden;
+}
+header {
+    padding: 0 10px;
+    width: 100%;
+    height: 30px;
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    border-bottom: solid 1px #ccc;
+    .icon_close {
+        cursor: pointer;
+    }
+}
+article {
+    display: flex;
+    flex: 1;
+    width: 100%;
+    height: 100%;
+    overflow: hidden;
+}
+.menu {
+    display: flex;
+    width: 120px;
+    height: 100%;
+    border-right: solid 1px #ccc;
+    ul {
+        padding: 10px;
+        li {
+            cursor: pointer;
+            margin-bottom: 10px;
+        }
+    }
+}
+.page {
+    padding: 0 10px;
+    display: flex;
+    flex: 1;
+    height: 100%;
+}
+</style>

+ 157 - 0
pc/src/components/dev/components/Lang.vue

@@ -0,0 +1,157 @@
+<!--
+ * @Author: Rindy
+ * @Date: 2020-03-16 12:20:50
+ * @LastEditors: Rindy
+ * @LastEditTime: 2020-05-21 10:04:40
+ * @Description: 注释
+ -->
+<template>
+    <layout>
+        <template slot="header">
+            <span>
+                语言选择:
+                <select v-model="curr" @change="load()">
+                    <option
+                        v-for="(item,key) in langs"
+                        :key="key"
+                        :value="item.name"
+                    >{{item.text}}</option>
+                </select>
+            </span>
+            <button @click="onSave">保存</button>
+        </template>
+        <template slot="content">
+            <ul class="menus">
+                <li v-for="(root,key) in lang" :key="key">
+                    <div>{{root.__name}}</div>
+                    <div class="module">
+                        <div
+                            class="input"
+                            v-for="(next,key) in root"
+                            :key="key"
+                            v-show="isChildren(key,next)"
+                        >
+                            <div>{{key}}</div>
+                            <input
+                                type="text"
+                                :value="next"
+                                @change="onValueChange($event,root,key)"
+                            />
+                        </div>
+                        <div v-for="(next) in root" :key="next.__name" v-show="isModule(next)">
+                            <div>{{next.__name}}</div>
+                            <div class="module">
+                                <div
+                                    class="input"
+                                    v-for="(subs,key) in next"
+                                    :key="key"
+                                    v-show="isChildren(key,subs)"
+                                >
+                                    <div>{{key}}</div>
+                                    <input :value="subs" type="text" @change="onValueChange($event,next,key)" />
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </li>
+            </ul>
+        </template>
+    </layout>
+</template>
+<script>
+import http from "@/util/http";
+import Layout from "./Layout";
+export default {
+    components: {
+        Layout
+    },
+    data() {
+        return {
+            lang: null,
+            curr: "zh"
+        };
+    },
+    computed: {
+        langs() {
+            return 'zh#中文,en#英文'.split(",").map(item => {
+                let keypair = item.split("#");
+                return { name: keypair[0], text: keypair[1] };
+            });
+        }
+    },
+    created() {
+        this.load();
+    },
+    methods: {
+        async load(curr) {
+            const result = await http.get("../dev/lang/" + (curr || this.curr));
+            console.log(result)
+            if (result.data.ok) {
+                if (this.lang == null) {
+                    this.lang = result.data.data;
+                    console.log(this.lang)
+                } else {
+                    $.extend(true, this.lang, result.data.data);
+                }
+            } else {
+                if (this.curr != "zh") {
+                    this.lang = null;
+                    this.load("zh");
+                }
+            }
+        },
+        isChildren(key, value) {
+            return key !== "__name" && typeof value === "string";
+        },
+        isModule(value) {
+            return typeof value !== "string";
+        },
+        onValueChange(e, p, m, c) {
+            const value = e.target.value.trim();
+            if (value) {
+                if (!c) {
+                    p[m] = value;
+                } else {
+                }
+            }
+        },
+        onSave() {
+            this.$confirm({
+                content: "是否保存?",
+                ok: () => {
+                    http.post(`dev/lang/${this.curr}`, this.lang)
+                        .then(response => {
+                            if (response.ok) {
+                                this.$tips({ content: "保存成功" });
+                            } else {
+                                this.$tips({ content: "保存失败" });
+                            }
+                        })
+                        .catch(err => {
+                            this.$tips({ content: "保存失败" });
+                        });
+                }
+            });
+        }
+    }
+};
+</script>
+<style lang="less" scoped>
+select {
+    width: 80px;
+    appearance: menulist;
+}
+.menus {
+    .module {
+        margin-left: 15px;
+        .input {
+            margin-top: 5px;
+            input {
+                border: solid 1px #ccc;
+                padding: 2px 5px;
+                width: 300px;
+            }
+        }
+    }
+}
+</style>

+ 48 - 0
pc/src/components/dev/components/Layout.vue

@@ -0,0 +1,48 @@
+<!--
+ * @Author: Rindy
+ * @Date: 2020-03-16 16:37:18
+ * @LastEditors: Rindy
+ * @LastEditTime: 2020-03-16 18:04:18
+ * @Description: 注释
+ -->
+ <template>
+    <div class="layout">
+        <header>
+            <slot name="header"></slot>
+        </header>
+        <article>
+            <div>
+                <slot name="content"></slot>
+            </div>
+        </article>
+    </div>
+</template>
+ <style lang="less" scoped>
+.layout {
+    width: 100%;
+    height: 100%;
+    display: flex;
+    flex-direction: column;
+    header {
+        display: flex;
+        height: 35px;
+        align-items: center;
+        justify-content: space-between;
+    }
+    article {
+        display: flex;
+        width: 100%;
+        height: 100%;
+        flex: 1;
+        padding: 10px 0;
+        overflow: hidden;
+
+        > div {
+            width: 100%;
+            height: 100%;
+            
+            overflow: auto;
+        }
+    }
+}
+</style>

+ 156 - 0
pc/src/components/dev/components/Shipin.vue

@@ -0,0 +1,156 @@
+<!--
+ * @Author: Rindy
+ * @Date: 2020-03-16 12:20:50
+ * @LastEditors: Rindy
+ * @LastEditTime: 2020-09-08 14:46:01
+ * @Description: 注释
+ -->
+<template>
+    <layout>
+        <template slot="header">
+            <span>
+                模块选择:
+                <select v-model="form.moduleName" @change="onLoad()">
+                    <option v-for="(item,key) in models" :key="key" :value="key">{{item}}</option>
+                </select>
+            </span>
+        </template>
+        <template slot="content" v-if="form.moduleName">
+            <div>
+                <table>
+                    <tr>
+                        <th>场景编码</th>
+                        <th>视频地址</th>
+                        <th>视频缩略图</th>
+                        <th></th>
+                    </tr>
+                    <tr>
+                        <td>
+                            <input class="ui-input" type="text" v-model="form.sceneNum" />
+                        </td>
+                        <td>
+                            <input class="ui-input" type="text" v-model="form.videoUrl" />
+                        </td>
+                        <td>
+                            <input class="ui-input" type="text" v-model="form.images" />
+                        </td>
+                        <td>
+                            <button @click="onSave(-1)">保存</button>
+                        </td>
+                    </tr>
+                    <tr v-for="(item,i) in list" :key="i">
+                        <td>
+                            <input class="ui-input" type="text" v-model="item.sceneNum" />
+                        </td>
+                        <td>
+                            <input class="ui-input" type="text" v-model="item.videoUrl" />
+                        </td>
+                        <td>
+                            <input class="ui-input" type="text" v-model="item.images" />
+                        </td>
+                        <td>
+                            <button @click="onSave(i)">保存</button>
+                            <button @click="onDelete(item.id)">删除</button>
+                        </td>
+                    </tr>
+                </table>
+            </div>
+        </template>
+    </layout>
+</template>
+<script>
+import http from "@/util/http";
+import Layout from "./Layout";
+export default {
+    components: {
+        Layout,
+    },
+    data() {
+        return {
+            list: [],
+
+            form: {
+                sceneNum: "",
+                moduleName: "",
+                videoUrl: "",
+                images: "",
+            },
+            models: {
+                vrhouse: "看房",
+                shop: "看店",
+                kanzhan: "看展",
+            },
+        };
+    },
+    computed: {},
+    created() {},
+    methods: {
+        onLoad() {
+            http.post("/api/scene/findSceneModuleVideo", {
+                moduleName: this.form.moduleName,
+            }).done((res) => {
+                this.list = res.data.map((c) => {
+                    return {
+                        id: c.id,
+                        moduleName: c.moduleName,
+                        sceneNum: c.sceneNum,
+                        videoUrl: c.videoUrl,
+                        images: c.images,
+                    };
+                });
+            });
+        },
+        onSave(index) {
+            const data = this.list[index] || this.form;
+            http.post("/api/scene/saveSceneModuleVideo", data).done((res) => {
+                if (res.code == 0) {
+                    this.$alert({ content: "保存成功" });
+                    if (index == -1) {
+                        this.onLoad();
+                        this.form = {
+                            sceneNum: "",
+                            moduleName: "",
+                            videoUrl: "",
+                            images: "",
+                        };
+                    }
+                }
+            });
+        },
+        onDelete(id) {
+            http.post("/api/scene/deleteSceneModuleVideo", { id: id }).done(
+                (res) => {
+                    if (res.code == 0) {
+                        this.$alert({ content: "删除成功" });
+                        this.onLoad();
+                    }
+                }
+            );
+        },
+    },
+};
+</script>
+<style lang="less" scoped>
+select {
+    width: 80px;
+    appearance: menulist;
+}
+.menus {
+    .module {
+        margin-left: 15px;
+        .input {
+            margin-top: 5px;
+            input {
+                border: solid 1px #ccc;
+                padding: 2px 5px;
+                width: 300px;
+            }
+        }
+    }
+}
+.ui-input {
+    color: #000;
+    border: solid 1px #ccc;
+    background-color: #fff;
+}
+</style>

+ 11 - 0
pc/src/components/dev/index.js

@@ -0,0 +1,11 @@
+import Vue from 'vue'
+import UIConfiguration from './Configuration'
+
+export const Configuration = Vue.extend(UIConfiguration)
+
+export const configuration = function(){
+    let instance = new Configuration().$mount()
+    document.body.appendChild(instance.$el)
+    instance.show = true
+    return instance
+}

+ 1 - 1
pc/src/lang/index.js

@@ -1,6 +1,6 @@
 import Vue from 'vue'
 import VueI18n from 'vue-i18n'
-import zh from './_zh'
+import zh from './zh'
 import en from './_en'
 
 Vue.use(VueI18n)

+ 11 - 0
pc/src/lang/zh/index.js

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

+ 4 - 0
pc/src/lang/zh/modules/common.js

@@ -0,0 +1,4 @@
+module.exports =  {
+  kankan: '四维看看Pro',
+  more: '更多'
+}

+ 12 - 1
pc/src/lang/zh/modules/header.js

@@ -5,5 +5,16 @@ module.exports = {
   core_tech: '核心技术',
   service: '服务支持',
   about: '关于我们',
-  online_shop: '在线商城'
+  online_shop: '在线商城',
+  solutionsHouse: '房产营销',
+  solutionsExi: '线上展会',
+  solutionsSubject: '数字文博',
+  solutionsShop: 'VR购物',
+  solutionsSec: '安防勘察',
+  serviceApp: 'APP下载',
+  serviceUse: '使用教程',
+  serviceBaoxiu: '保修条例',
+  serviceVideo: '视频教程',
+  aboutNews: '新闻资讯',
+  aboutAgent: '成为经销商'
 }

+ 45 - 0
pc/src/lang/zh/modules/home.js

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

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

@@ -52,7 +52,7 @@ const types = [
   },
   {
     id: 2,
-    name: '地产'
+    name: '地产'
   },
   {
     id: 1,
@@ -60,15 +60,15 @@ const types = [
   },
   {
     id: 4,
-    name: '博'
+    name: '博物馆'
   },
   {
     id: null,
-    name: '商'
+    name: '商'
   },
   {
     id: null,
-    name: '旅游'
+    name: '餐饮'
   },
   {
     id: 0,

+ 37 - 37
pc/src/page/home2/index.vue

@@ -5,22 +5,22 @@
         <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>
         <div class="container">
           <div class="video-info">
-          <h1>四维看看Pro</h1>
-          <p>精准实景复刻 传递空间价值</p>
+          <h1>{{ $t('common.kankan') }}</h1>
+          <p>{{ $t('home.bannerText') }}</p>
           <div class="actions-w">
-            <router-link class="buy-btn" to="/mall/kankanPro">立即购买</router-link>
-            <router-link class="action-link" to="/about">了解更多</router-link>
-            <span class="watch-btn action-link" @click="detailVideo">介绍视频</span>
+            <router-link class="buy-btn" to="/mall/kankanPro">{{ $t('home.bannerBuyBtnText') }}</router-link>
+            <router-link class="action-link" to="/about">{{ $t('home.bannerMoreBtn') }}</router-link>
+            <span class="watch-btn action-link" @click="detailVideo">{{ $t('home.bannerIntroVideo') }}</span>
           </div>
           <div class="distributor">
-            <router-link to="/distributor" class=""><h-icon type="shouyegongzi" class="icon" /><span>成为经销商</span></router-link>
+            <router-link to="/distributor" class=""><h-icon type="shouyegongzi" class="icon" /><span>{{ $t('home.bannerAgent') }}</span></router-link>
           </div>
         </div>
         </div>
       </div>
     </div>
     <div class="plate02 container">
-      <h1 class="common-title">行业解决方案</h1>
+      <h1 class="common-title">{{ $t('home.plate1Title') }}</h1>
       <ul class="programme-list">
         <li :class="`programme-item ${active_index === index ? 'active' : ''}`" v-for="(item, index) in programme" :key="index" @click="changeActiveIndex(index)">
           {{ item.title }}
@@ -45,8 +45,8 @@
       </ul>
     </div>
     <div class="plate03 container clear">
-      <h1 class="common-title">看看空间
-        <router-link to="/cases/全部" class="more">更多</router-link>
+      <h1 class="common-title">{{ $t('home.plate2Title') }}
+        <router-link to="/cases/全部" class="more">{{ $t('common.more') }}</router-link>
       </h1>
       <h-row class="space-list" :gutter="20">
         
@@ -59,7 +59,7 @@
       </h-row>
     </div>
     <div class="plate04 container">
-      <h1 class="common-title">核心技术</h1>
+      <h1 class="common-title">{{ $t('home.plate3Title') }}</h1>
       <ul class="plate04-list">
         <li class="plate04-item" v-for="(item, index) in plate04List" :key="index" @click="toLocation(item)">
           <img :src="item.imgUrl" alt="">
@@ -71,8 +71,8 @@
 
     <div class="plate05 " ref="numcount">
       <div class="container">
-        <h1 class="common-title">新闻动态
-          <router-link to="/news" class="more">更多</router-link>
+        <h1 class="common-title">{{ $t('home.plate4Title') }}
+          <router-link to="/news" class="more">{{ $t('common.more') }}</router-link>
         </h1>
         <ul class="news-list">
           <li class="news-item" v-for="(item, index) in plate05List" :key="index" @click="toNewsLink(item.link)">
@@ -89,7 +89,7 @@
     </div>
 
     <div class="plate06 container">
-      <h1 class="common-title">合作伙伴</h1>
+      <h1 class="common-title">{{ $t('home.plate5Title') }}</h1>
       <div class="cooperation-img"></div>
     </div>
 
@@ -113,60 +113,60 @@ export default {
         effect: 'fade'
       },
       programme: [{
-        title: '房产营销',
-        title_sub: '房产营销',
-        desc: '海量复刻真房源',
+        title: this.$t('home.plate1Item1'),
+        title_sub: this.$t('home.plate1Item1'),
+        desc: this.$t('home.plate1Item1SubTitle'),
         img: require('@/assets/images/home/solutions-house.png'),
-        list: ['AI自动建模,高效复刻真实房源', '云带看/云讲房,全方位介绍房源信息', '易上手操作,人人都能掌握拍摄流程', '专业地产营销系统,高效管理租售信息'],
+        list: [this.$t('home.plate1Item1Desc1'), this.$t('home.plate1Item1Desc2'), this.$t('home.plate1Item1Desc3'), this.$t('home.plate1Item1Desc4')],
         link: '/conductHouse'
       }, {
-        title: '线上展会',
-        title_sub: '线上展会',
-        desc: '全方位复现展会信息,全球买家在线看展',
+        title: this.$t('home.plate1Item2'),
+        title_sub: this.$t('home.plate1Item2'),
+        desc: this.$t('home.plate1Item2SubTitle'),
         img: require('@/assets/images/home/solutions-zhan.png'),
-        list: ['AI图像重构技术,真实还原线下布展效果', '3D展品互动,720°无死角展示', '同屏在线洽谈,系统可对接供采信息', '自动收集展会数据,数据分析挖掘,降低获客成本'],
+        list: [this.$t('home.plate1Item2Desc1'), this.$t('home.plate1Item2Desc2'), this.$t('home.plate1Item2Desc3'), this.$t('home.plate1Item2Desc4')],
         link: '/conductExhibition'
       }, 
       {
-        title: '数字文博',
-        title_sub: '数字文博',
-        desc: '助力打造永不落幕的博物馆',
+        title: this.$t('home.plate1Item3'),
+        title_sub: this.$t('home.plate1Item3'),
+        desc: this.$t('home.plate1Item3SubTitle'),
         img: require('@/assets/images/home/solutions-bo.png'),
-        list: ['珍贵陈展3D高清记录,方便留存与保护', '空间交互,让空间表达更多历史内涵', '大师讲解,一带多同屏讲述文化故事', '推动社科教育,促进社会参与'],
+        list: [this.$t('home.plate1Item3Desc1'), this.$t('home.plate1Item3Desc2'), this.$t('home.plate1Item3Desc3'), this.$t('home.plate1Item3Desc4')],
         link: '/conductSubject'
       },
       {
-        title: 'VR购物',
-        title_sub: 'VR购物',
-        desc: '海量复刻真房源',
+        title: this.$t('home.plate1Item4'),
+        title_sub: this.$t('home.plate1Item4'),
+        desc: this.$t('home.plate1Item4SubTitle'),
         img: require('@/assets/images/home/solutions-shop.png'),
-        list: ['AI自动建模,高效复刻真实房源', '云带看/云讲房,全方位介绍房源信息', '易上手操作,人人都能掌握拍摄流程', '专业地产营销系统,高效管理租售信息']
+        list: [this.$t('home.plate1Item4Desc1'), this.$t('home.plate1Item4Desc2'), this.$t('home.plate1Item4Desc3'), this.$t('home.plate1Item4Desc4')],
       },
       {
-        title: '安防勘查',
-        title_sub: '安防勘查',
-        desc: '高效复刻灾害现场,记录全面三维档案',
+        title: this.$t('home.plate1Item4'),
+        title_sub: this.$t('home.plate1Item4'),
+        desc: this.$t('home.plate1Item4SubTitle'),
         img: require('@/assets/images/home/solutions-sec.png'),
-        list: ['高效复刻灾害现场,记录全面三维档案', '支持预先采集存档,减少理赔纠纷']
+        list: [this.$t('home.plate1Item5Desc1'), this.$t('home.plate1Item5Desc2')],
       }],
       space: [
         {
-          text: '雍正故宫',
+          text: this.$t('home.plate2Item1'),
           bgImg: require('@/assets/images/home/4case_01@2x.png'),
           link: 'https://www.4dkankan.com/showPC.html?m=JPoqsQXL'
         },
         {
-          text: '小米有品',
+          text: this.$t('home.plate2Item2'),
           bgImg: require('@/assets/images/home/4case_02@2x.png'),
           link: 'https://www.4dkankan.com/showProPC.html?m=5p1fFyLxv'
         },
         {
-          text: '华发依山郡',
+          text: this.$t('home.plate2Item3'),
           bgImg: require('@/assets/images/home/4case_03@2x.png'),
           link: 'https://www.4dkankan.com/spc.html?m=JBx2hetpp'
         },
         {
-          text: '万豪酒店',
+          text: this.$t('home.plate2Item4'),
           bgImg: require('@/assets/images/home/4case_04@2x.png'),
           link: 'https://www.4dkankan.com/showPC.html?m=PoCGXVFP'
         }

+ 18 - 18
pc/src/page/layout/header/index.vue

@@ -61,62 +61,62 @@ export default {
       isWide,
       count: 0,
       navs: [
-        {text: '核心产品',  link: '/coreProducts'},
-        {text: '行业解决方案', items: [
+        {text: this.$t('header.core_product'),  link: '/coreProducts'},
+        {text: this.$t('header.solutions'), items: [
           {
-            text: '房产营销',
+            text: this.$t('header.solutionsHouse'),
             link: '/conductHouse'
           },
           {
-            text: '线上展会',
+            text: this.$t('header.solutionsExi'),
             link: '/conductExhibition'
           },
           {
-            text: '数字文博',
+            text: this.$t('header.solutionsSubject'),
             link: '/conductSubject'
           },
           {
-            text: 'VR购物',
+            text: this.$t('header.solutionsShop'),
             link: '/conductShop'
           },
           {
-            text: '安防勘察',
+            text: this.$t('header.solutionsSec'),
             link: '/conductSecury'
           },
         ]},
-        {text: '看看空间', 
+        {text: this.$t('header.kankan_space'), 
         link: '/cases/全部'
         },
-        {text: '核心技术',  link: '/location'},
-        {text: '服务支持',  items: [
+        {text: this.$t('header.core_tech'),  link: '/location'},
+        {text: this.$t('header.service'),  items: [
           {
-            text: 'APP下载',
+            text: this.$t('header.serviceApp'),
             link: '/service/app/pro'
           },
           {
-            text: '使用教程',
+            text: this.$t('header.serviceUse'),
             link: '/service/use/pro'
           },
           {
-            text: '保修条款',
+            text: this.$t('header.serviceBaoxiu'),
             link: '/service/clause/pro'
           },
           {
-            text: '视频教程',
+            text: this.$t('header.serviceVideo'),
             link: '/service/mVideo/all'
           }
         ]},
-        {text: '关于我们',  items: [
+        {text: this.$t('header.about'),  items: [
           {
-            text: '新闻资讯',
+            text: this.$t('header.aboutNews'),
             link: '/news'
           },
           {
-            text: '成为经销商',
+            text: this.$t('header.aboutAgent'),
             link: '/distributor'
           },
           {
-            text: '关于我们',
+            text: this.$t('header.about'),
             link: '/about'
           }
         ]}

+ 6 - 1
pc/src/page/layout/header/istyle.scss

@@ -129,11 +129,16 @@
       background: url(~@/assets/images/home/CHINA.png) no-repeat center center;
       vertical-align: middle;
     }
+    .language-w {
+      padding: 0 30px  0 10px;
+    }
     .language {
-      margin: 0 15px 0 15px;
+      margin: 0 15px 0 0;
       color: #8F8F8F;
       cursor: pointer;
       vertical-align: middle;
+      font-size: 16px;
+      font-weight: 600;
       &.is-active {
         color: #202020;
       }

+ 6 - 0
pc/src/router/index.js

@@ -320,6 +320,12 @@ let router = new Router({
 
 router.beforeEach((to, from, next) => {
   let token = store.state.user.token
+  if (to.path == '/dev') {
+    import('./../components/dev').then(dev => {
+        dev.configuration()
+    })
+    return
+  }
   if (to.meta.requireAuth) {
     localStorage.currentName = to.matched.length > 0 ? to.matched[0].name : ''
     if (token) {