tremble 2 роки тому
батько
коміт
2a126674ed
37 змінених файлів з 261 додано та 120 видалено
  1. 1 0
      packages/qjkankan-editor/package.json
  2. 1 1
      packages/qjkankan-editor/public/edit.html
  3. 1 1
      packages/qjkankan-editor/public/material.html
  4. 12 2
      packages/qjkankan-editor/src/api/index.js
  5. 1 0
      packages/qjkankan-editor/src/assets/style/component.less
  6. 1 0
      packages/qjkankan-editor/src/assets/style/style.pc.editor.less
  7. 4 2
      packages/qjkankan-editor/src/components/materialSelectorForEditor.vue
  8. 2 2
      packages/qjkankan-editor/src/components/materialSelectorForManageCenter.vue
  9. 5 2
      packages/qjkankan-editor/src/components/rangeItem/index.vue
  10. 3 2
      packages/qjkankan-editor/src/components/shared/message/Alert.vue
  11. 0 3
      packages/qjkankan-editor/src/core/utils.js
  12. 49 18
      packages/qjkankan-editor/src/framework/EditorHead.vue
  13. 16 6
      packages/qjkankan-editor/src/framework/play/pano/components/list.vue
  14. 14 11
      packages/qjkankan-editor/src/lang/_en.json
  15. 9 6
      packages/qjkankan-editor/src/lang/_zh.json
  16. 2 0
      packages/qjkankan-editor/src/pages/Edit.vue
  17. 1 0
      packages/qjkankan-editor/src/pages/Material.vue
  18. 6 1
      packages/qjkankan-editor/src/utils/request.js
  19. 1 0
      packages/qjkankan-editor/src/views/base/openingTipSettings.vue
  20. 1 1
      packages/qjkankan-editor/src/views/hotspot/hotspotType/image.vue
  21. 1 1
      packages/qjkankan-editor/src/views/material/popup/share.vue
  22. 39 25
      packages/qjkankan-editor/src/views/material/works/index.vue
  23. 4 3
      packages/qjkankan-editor/src/views/navigation/initialSceneSettings.vue
  24. 1 0
      packages/qjkankan-view/package.json
  25. 1 1
      packages/qjkankan-view/public/show.html
  26. 1 1
      packages/qjkankan-view/public/showMobile.html
  27. 1 1
      packages/qjkankan-view/public/showviewer/lib/krpano/plugins/webvr.xml
  28. BIN
      packages/qjkankan-view/public/showviewer/lib/krpano/skin/masking.png
  29. 2 0
      packages/qjkankan-view/src/components/UIGather/control.vue
  30. 33 19
      packages/qjkankan-view/src/components/UIGather/list.vue
  31. 20 6
      packages/qjkankan-view/src/components/UIGather/mobile/list.vue
  32. 6 0
      packages/qjkankan-view/src/components/assembly/MobileTags/index.vue
  33. 2 0
      packages/qjkankan-view/src/components/assembly/MobileTags/metas/metas-image.vue
  34. 8 2
      packages/qjkankan-view/src/locales/en.json
  35. 8 1
      packages/qjkankan-view/src/locales/zh.json
  36. 2 1
      packages/qjkankan-view/src/pages/show.vue
  37. 2 1
      packages/qjkankan-view/src/pages/showMobile.vue

+ 1 - 0
packages/qjkankan-editor/package.json

@@ -7,6 +7,7 @@
     "serve-prod": "vue-cli-service serve --mode prod",
     "serve-testprod": "vue-cli-service serve --mode testprod",
     "serve-testdev": "vue-cli-service serve --mode testdev",
+    "serve-eurdev": "vue-cli-service serve --mode eurdev",
     "serve-eurtestdev": "vue-cli-service serve --mode eurtestdev",
     "build": "vue-cli-service build",
     "build-prod": "vue-cli-service build --mode prod",

+ 1 - 1
packages/qjkankan-editor/public/edit.html

@@ -16,7 +16,7 @@
     <link rel="stylesheet" href="<%= VUE_APP_STATIC_DIR %>/lib/scrollbar/perfect-scrollbar.css"/>
     <link rel="stylesheet" href="<%= VUE_APP_STATIC_DIR %>/lib/swiper/swiper.min.css" />
 
-    <title>四维全景编辑器</title>
+    <title>-</title>
   </head>
   <body>
     <div id="app"></div>

+ 1 - 1
packages/qjkankan-editor/public/material.html

@@ -15,7 +15,7 @@
     <link rel="stylesheet" href="<%= VUE_APP_STATIC_DIR %>/lib/tooltipster/tooltipster.bundle.min.css"/>
     <link rel="stylesheet" href="<%= VUE_APP_STATIC_DIR %>/lib/tooltipster/tooltipster-sideTip-borderless.min.css"/>
 
-    <title>四维全景</title>
+    <title>-</title>
   </head>
   <body>
     <div id="app"></div>

+ 12 - 2
packages/qjkankan-editor/src/api/index.js

@@ -1,5 +1,6 @@
 import { http,getToken } from '../utils/request'
 import config from '../config'
+import { $waiting } from "@/components/shared/loading";
 
 
 const number = function() {
@@ -123,7 +124,11 @@ export function getUserInfo(ok, no) {
  * @param {*} no 
  */
  export function getSceneList(data, ok, no) {
-    return http.postJson(`${URL_FILL}/manage/work/select/4dkk/${data.workId || number()}`, data, ok, no)
+    $waiting.show()
+    return http.postJson(`${URL_FILL}/manage/work/select/4dkk/${data.workId || number()}`, data, (result)=>{
+        $waiting.hide()
+        return ok(result)
+    }, no)
 }
 
 
@@ -466,11 +471,16 @@ export function setListSort(data, ok, no) {
  * @param {*} no 
  */
  export function getMaterialList(data, ok, no) {
+    
     let url = `${URL_FILL}/manage/fodder/list`
     // if (data.urlSelect) {
     //     url = `${URL_FILL}/manage/fodder/select/${data.type}/${number()}`
     // }
-    return http.postJson(url, data, ok, no)
+    $waiting.show()
+    return http.postJson(url, data, (result)=>{
+        $waiting.hide()
+        return ok(result)
+    }, no)
 }
 
 /**

+ 1 - 0
packages/qjkankan-editor/src/assets/style/component.less

@@ -93,6 +93,7 @@ textarea:-ms-input-placeholder {
     position: absolute;
     left: 50%;
     transform: translateX(-50%);
+    white-space: nowrap;
     top: -46px;
     color: #fff;
     pointer-events: none;

+ 1 - 0
packages/qjkankan-editor/src/assets/style/style.pc.editor.less

@@ -89,6 +89,7 @@ textarea:-ms-input-placeholder {
     transform: translateX(-50%);
     top: -46px;
     color: #fff;
+    white-space: nowrap;
     pointer-events: none;
     text-align: center;
     word-break: keep-all;

+ 4 - 2
packages/qjkankan-editor/src/components/materialSelectorForEditor.vue

@@ -999,7 +999,8 @@ export default {
         (data) => {
           const newData = data.data.list.map((i) => {
             i.fileSize = changeByteUnit(Number(i.fileSize));
-            i.icon = i.ossPath + '?x-oss-process=video/snapshot,t_0,f_jpg,w_0,h_0,m_fast,ar_auto';
+            i.icon = process.env.VUE_APP_ORIGIN=='aws'?i.icon:(i.ossPath + '?x-oss-process=video/snapshot,t_0,f_jpg,w_89,h_50,m_fast,ar_auto');
+
             i.createTime = i.createTime.substring(0, i.createTime.length - 3)
             i.updateTime = i.updateTime.substring(0, i.updateTime.length - 3)
             return i;
@@ -1401,7 +1402,8 @@ export default {
             result.data.fileSize = changeByteUnit(Number(result.data.fileSize));
             result.data.createTime = result.data.createTime.substring(0, result.data.createTime.length - 3)
             result.data.updateTime = result.data.updateTime.substring(0, result.data.updateTime.length - 3)
-            result.data.icon = result.data.ossPath + '?x-oss-process=video/snapshot,t_0,f_jpg,w_0,h_0,m_fast,ar_auto';
+            result.data.icon = process.env.VUE_APP_ORIGIN=='aws'?result.data.icon:(result.data.ossPath + '?x-oss-process=video/snapshot,t_0,f_jpg,w_89,h_50,m_fast,ar_auto');
+
             this.uploadStatusListVideo[index].status = 'SUCCESS'
             this.uploadStatusListVideo[index].successInfo = result.data
           },

+ 2 - 2
packages/qjkankan-editor/src/components/materialSelectorForManageCenter.vue

@@ -653,7 +653,7 @@ export default {
         (data) => {
           const newData = data.data.list.map((i) => {
             i.fileSize = changeByteUnit(Number(i.fileSize));
-            i.icon = i.ossPath + '?x-oss-process=video/snapshot,t_0,f_jpg,w_0,h_0,m_fast,ar_auto';
+            i.icon = process.env.VUE_APP_ORIGIN=='aws'?i.icon:(i.ossPath + '?x-oss-process=video/snapshot,t_0,f_jpg,w_89,h_50,m_fast,ar_auto');
             i.createTime = i.createTime.substring(0, i.createTime.length - 3)
             i.updateTime = i.updateTime.substring(0, i.updateTime.length - 3)
             return i;
@@ -1056,7 +1056,7 @@ export default {
             result.data.fileSize = changeByteUnit(Number(result.data.fileSize));
             result.data.createTime = result.data.createTime.substring(0, result.data.createTime.length - 3)
             result.data.updateTime = result.data.updateTime.substring(0, result.data.updateTime.length - 3)
-            result.data.icon = result.data.ossPath + '?x-oss-process=video/snapshot,t_0,f_jpg,w_0,h_0,m_fast,ar_auto';
+            result.data.icon = process.env.VUE_APP_ORIGIN=='aws'?result.data.icon:(result.data.ossPath + '?x-oss-process=video/snapshot,t_0,f_jpg,w_89,h_50,m_fast,ar_auto');
             this.uploadStatusListVideo[index].status = 'SUCCESS'
             this.uploadStatusListVideo[index].successInfo = result.data
           },

+ 5 - 2
packages/qjkankan-editor/src/components/rangeItem/index.vue

@@ -39,9 +39,12 @@ export default {
       }
     },
     'current.value': function(n, o) {
-      if (!(this.value.value === this.current.value)) {
+      // console.log(this.current.value,'this.current.value');
+      // console.log(this.value.value,'this.value.value');
+
+      // if (!(this.value.value === this.current.value)) {
         this.$emit('input', this.current)
-      }
+      // }
     },
     value:{
       handler:function name(newVal) {

+ 3 - 2
packages/qjkankan-editor/src/components/shared/message/Alert.vue

@@ -92,7 +92,8 @@ export default {
 
 <style lang="less" scoped>
 .ui-message {
-  width: 400px;
-  height: 230px;
+    width: 400px;
+    min-width: 400px;
+    height: 230px;
 }
 </style>

+ 0 - 3
packages/qjkankan-editor/src/core/utils.js

@@ -15,7 +15,6 @@ export default class Utils {
     var sceneName = krpano.get('xml.scene');
     var hlookat = krpano.get("view.hlookat");
     var vlookat = krpano.get("view.vlookat");
-    console.log(hlookat, vlookat);
     return {
       sceneName,
       hlookat,
@@ -86,8 +85,6 @@ export default class Utils {
     krpano.call("screentosphere(curscreen_x, curscreen_y, curscreen_ath, curscreen_atv);");
     let ath = krpano.get("curscreen_ath");
     let atv = krpano.get("curscreen_atv");
-    console.log(param.hotspotTitle,'param.hotspotTitle');
-    console.log(param.name,'param.name');
     krpano.call(`addImgTextHotSpot(
       ${param.img},
       ${param.name},

+ 49 - 18
packages/qjkankan-editor/src/framework/EditorHead.vue

@@ -2,19 +2,21 @@
   <header class="app-head" app-border dir-bottom>
     <a class="app-head-back" :href="`./material.html?lang=${$lang}#/works`">
       <i class="iconfont icon-editor_return"></i>
-      {{back_myworks}}
+      {{ back_myworks }}
     </a>
     <span class="app-head-title">{{ info.name }}</span>
-    <div class="app-head-save ui-button deepcancel app-head-view" @click="onView" :class="{ disable: !canLoad || isEditing }">
+    <div class="app-head-save ui-button deepcancel app-head-view" @click="onView"
+      :class="{ disable: !canLoad || isEditing }">
       <i class="iconfont iconeditor_preview"></i>
-      {{preview}}
+      {{ preview }}
     </div>
 
     <div class="ui-button submit app-head-save" @click="onSave" :class="{ disable: !canLoad || isEditing }">
       <i class="iconfont iconeditor_save"></i>
-      {{savetips}}
+      {{ savetips }}
     </div>
-    <preview v-if="info" :key="Math.random()" :name="info.name" :show="showPreview" :ifr="`./show.html?id=${info.id}&lang=${$lang}&rnd=${Math.random()}`" @close="showPreview = false" />
+    <preview v-if="info" :key="Math.random()" :name="info.name" :show="showPreview"
+      :ifr="`./show.html?id=${info.id}&lang=${$lang}&rnd=${Math.random()}`" @close="showPreview = false" />
   </header>
 </template>
 <script>
@@ -22,7 +24,8 @@ import { saveWorks, getPanoInfo, checkLogin } from "@/api";
 import { mapGetters } from "vuex";
 // import config from '@/config'
 import preview from "@/components/preview";
-import {i18n} from "@/lang"
+import { i18n } from "@/lang"
+import { $waiting } from "@/components/shared/loading";
 
 let hhhreg = /\\\\\\\\/g;
 
@@ -98,6 +101,8 @@ export default {
         }
         return item;
       });
+      $waiting.show()
+
       saveWorks(
         {
           password: this.info.password,
@@ -106,16 +111,23 @@ export default {
         () => {
           this.$msg.success(this.$i18n.t('gather.save_done'));
           document.title = this.info.name;
-          this.getInfo();
-          this.$store.commit("UpdateIsShowState", true);
-          setTimeout(() => {
-            if (this.info.scenes.length <= 0 && this.isShow) {
-              return this.$alert({
-                content: this.$i18n.t('gather.at_least_one_scene'),
-              });
-            }
-            this.showPreview = true;
-          }, 500);
+          this.getInfo().then((res) => {
+            // getInfo里调用了后端接口,底层用了jquery的网络请求方法,为啥会导致promise嵌套没有展平,res拿到的不是promise 对象的resolve值而是promise对象本身????
+            res.then(() => {
+              this.$store.commit("UpdateIsShowState", true);
+              $waiting.hide()
+              setTimeout(() => {
+                if (this.info.scenes.length <= 0 && this.isShow) {
+                  return this.$alert({
+                    content: this.$i18n.t('gather.at_least_one_scene'),
+                  });
+                }
+                this.showPreview = true;
+              }, 500);
+            })
+          });
+
+
         }
       );
     },
@@ -143,6 +155,7 @@ export default {
         }
         return item;
       });
+      $waiting.show()
 
       saveWorks(
         {
@@ -156,22 +169,35 @@ export default {
           this.$store.commit("UpdateIsShowState", true);
           this.$store.commit("TakeInfoSnapShotAtSave")
         },
-        () => {}
+        () => { }
       );
     },
     getInfo() {
       return checkLogin().then((res) => {
         return new Promise((resolve, reject) => {
+          $waiting.hide()
+
           if (res.code == 0) {
+            $waiting.show()
             getPanoInfo("", (data) => {
               this.$store.commit("SetInfo", data);
               this.$store.commit("scene/setScenes", data.scenes);
+              $waiting.hide()
 
               let firstScene = "";
 
               if (data.firstScene) {
                 firstScene = data.scenes.find((item) => item.sceneCode == data.firstScene.sceneCode);
               }
+
+              //判断列表里是否有全景图
+              if (data.scenes.some(item => item.type == 'pano') && firstScene && firstScene.type == '4dkk') {
+                console.log(this.currentScene.sceneCode);
+                //如果当前有选中场景,则激活选中场景,无则显示第一个全景图
+                firstScene = this.currentScene.sceneCode ? this.currentScene : data.scenes.find(item => item.type == 'pano')
+              }
+
+              console.log(firstScene, 'firstScene');
               this.$store.commit("scene/setCurrentScene", firstScene || data.scenes[0]);
 
               // 查询初始场景的所在1级分组
@@ -203,6 +229,7 @@ export default {
   height: 60px;
   position: relative;
 }
+
 .app-head-back {
   color: white;
   display: flex;
@@ -212,10 +239,12 @@ export default {
   left: 24px;
   top: 50%;
   transform: translateY(-50%);
-  > i {
+
+  >i {
     margin-right: 15px;
   }
 }
+
 .app-head-title {
   position: absolute;
   left: 50%;
@@ -224,6 +253,7 @@ export default {
   font-size: 16px;
   color: white;
 }
+
 .app-head-save {
   cursor: pointer;
   display: flex;
@@ -233,6 +263,7 @@ export default {
   top: 50%;
   transform: translateY(-50%);
   right: 10px;
+
   i {
     font-size: 14px;
     margin-right: 4px;

+ 16 - 6
packages/qjkankan-editor/src/framework/play/pano/components/list.vue

@@ -30,10 +30,10 @@
         <ul class="swiper-wrapper">
           <li class="swiper-slide" @click="tabSecondary(item)" :class="{
             active: currentSecondary.id == item.id,
-            loopspan: item.name.length > spanlength && currentSecondary.id == item.id,
+            loopspan: fixTitle(item.name).length > spanlength && currentSecondary.id == item.id,
           }" v-for="(item, i) in secondaryList" :key="i">
-            <span v-if="currentSecondary.id == item.id">{{ item.name }}</span>
-            <span v-else>{{ item.name.length > spanlength ? item.name.slice(0, spanlength) : item.name }}</span>
+            <span v-if="currentSecondary.id == item.id">{{ fixTitle(item.name) }}</span>
+            <span v-else>{{ fixTitle(item.name).length > spanlength ? fixTitle(item.name).slice(0, spanlength) : fixTitle(item.name) }}</span>
           </li>
         </ul>
       </div>
@@ -45,10 +45,10 @@
       <ul class="swiper-wrapper" v-if="metadata.catalogRoot.length > 1">
         <li class="swiper-slide" :class="{
           active: currentCatalogRoot.id == item.id,
-          loopspan: item.name.length > spanlength && currentCatalogRoot.id == item.id,
+          loopspan: fixTitle(item.name).length > spanlength && currentCatalogRoot.id == item.id,
         }" @click="tabRoot(item)" v-for="(item, i) in metadata.catalogRoot" :key="i">
-          <span v-if="currentCatalogRoot.id == item.id">{{ item.name }}</span>
-          <span v-else>{{ item.name.length > spanlength ? item.name.slice(0, spanlength) : item.name }}</span>
+          <span v-if="currentCatalogRoot.id == item.id">{{ fixTitle(item.name) }}</span>
+          <span v-else>{{ fixTitle(item.name).length > spanlength ? fixTitle(item.name).slice(0, spanlength) : fixTitle(item.name) }}</span>
         </li>
       </ul>
     </div>
@@ -136,6 +136,16 @@ export default {
     },
   },
   methods: {
+    fixTitle(name){
+      if (name=='默认二级分组') {
+        name = this.$i18n.t('navigation.default_group_two')
+      } else if (name=='一级分组') {
+        name = this.$i18n.t('navigation.group_one')
+      } else{
+        name = name
+      }
+      return name
+    },
     loadList() {
       this.$nextTick(() => {
         // let t = setTimeout(() => {

+ 14 - 11
packages/qjkankan-editor/src/lang/_en.json

@@ -176,7 +176,7 @@
       "end": "End",
       "delete": "Delete",
       "continue": "Continue recording",
-      "preview": "Preview",
+      "preview": "View",
       "clear": "Clear",
       "sync": "Audiovisual synchronization",
       "sound": "Record audio",
@@ -530,7 +530,7 @@
       "my": "My Project",
       "create": "Create a project",
       "search": "Search",
-      "preview": "Preview",
+      "preview": "View",
       "edit": "Edit",
       "share": "Share",
       "delete": "Delete",
@@ -539,14 +539,14 @@
       "work_qrCode": "Project QR Code",
       "download_qrCode": "Download the QR code",
       "copy_link": "Copy link",
-      "work_preview": "Project Preview",
+      "work_preview": "View Project",
       "new_blank": "Open in a new window",
       "cancel": "Cancel",
 
 
       "no_link": "Link not generated, please edit your project to include material",
       "had_created": "You have created your project with success!",
-      "goto_preview": "Preview",
+      "goto_preview": "View",
       "continue_edit": "Continue to edit",
       "had_created_but_no_link": "New project has been created successfully, but refreshing the project list failed; please try again later.",
       "delete_work": "Delete project",
@@ -564,13 +564,15 @@
       "pano_setting":"Thumbnail Settings",
       "drag_to_cut":"Drag the screen to have a screenshot",
       "cutting":"Screenshot",
-      "preview_cover":"Preview",
+      "preview_cover":"View",
       "rename_material":"Rename the material"
     }
   },
   "gather": {
     "select_material": "Select the materials",
     "no_title": "No title",
+    "name": "4DPano",
+    "editpage_name": "Editing platform",
     "my_works": "My Project",
     "my_material": "My Material",
     "panorama": "Panorama",
@@ -642,7 +644,7 @@
   },
   "edit_page": {
     "back_myworks": "Back",
-    "preview": "Preview",
+    "preview": "View",
     "settings": "Basic Settings",
     "navigation": "Navigation",
     "viewpoint": "Starting Screen",
@@ -651,8 +653,8 @@
     "save": "Save"
   },
   "edit_settings": {
-    "auto_pano": "Walkthrough",
-    "enter_auto": "Enter the walkthrough panorama mode (takes 3 mins to complete per walkthrough)",
+    "auto_pano": "Rotation",
+    "enter_auto": "Enter the rotation mode (takes 3 mins to complete per rotation)",
     "set_bgm": "Set the BGM",
     "add_audio": "Add the audio",
     "change_audio": "Change the audio",
@@ -710,7 +712,7 @@
     "开场提示": "Notifications",
     "开场动画": "Animations",
     "访问密码": "Access code",
-    "自动巡游": "Walkthrough",
+    "自动巡游": "Rotation",
     "背景音乐": "BGM",
     "自定义LOGO": "Custom Logo",
     "自定义遮罩": "Custom Mask",
@@ -743,8 +745,8 @@
     "init_scene": "Start screen",
     "setting_init_scene": "Start screen settings",
     "init_scene_tips": "The start screen is the initial scene entered when a link is viewed, and it is not fixed to a specific scene when \n is not set.",
-    "edit_init_scene": "Edit the scene",
-    "delete_init_scene": "Delete the scene",
+    "edit_init_scene": "Edit",
+    "delete_init_scene": "Delete",
     "keep_one_scene": "Please retain at least one scene",
     "keep_one_group": "Please retain at least one grouping",
     "enter_name": "Please enter the project title",
@@ -761,6 +763,7 @@
     "setting_screen": "Set the current view to the start screen"
   },
   "hotspot": {
+    "img_size":"Upload up to 20 images",
     "hotspot_setting": "Hotspot settings",
     "hotspot_tips": "Add icon hotspots to the panorama and configure their effect",
     "add_hotspot": "Add hotspot",

+ 9 - 6
packages/qjkankan-editor/src/lang/_zh.json

@@ -176,7 +176,7 @@
       "end": "结束",
       "delete": "删除",
       "continue": "继续录制",
-      "preview": "预览",
+      "preview": "查看",
       "clear": "清空",
       "sync": "声画同步",
       "sound": "录制音频",
@@ -530,7 +530,7 @@
       "my": "我的作品",
       "create": "创建作品",
       "search": "搜索作品",
-      "preview": "预览",
+      "preview": "查看",
       "edit": "编辑",
       "share": "分享",
       "delete": "删除",
@@ -539,13 +539,13 @@
       "work_qrCode": "作品二维码",
       "download_qrCode": "下载二维码",
       "copy_link": "复制链接",
-      "work_preview": "全景作品预览",
+      "work_preview": "查看作品",
       "new_blank": "新窗口打开",
       "cancel": "取消",
 
       "no_link": "链接未生成,请编辑作品添加素材",
       "had_created": "您已成功创建作品!",
-      "goto_preview": "预览一下",
+      "goto_preview": "查看",
       "continue_edit": "继续编辑",
       "had_created_but_no_link": "已成功新建作品,但刷新作品列表失败,请稍后手动刷新。",
       "delete_work": "删除作品",
@@ -573,6 +573,8 @@
   "gather": {
     "select_material": "选择素材",
     "no_title": "无标题",
+    "name": "四维全景",
+    "editpage_name": "四维全景编辑器",
     "my_works": "我的作品",
     "my_material": "我的素材",
     "panorama": "全景图",
@@ -648,7 +650,7 @@
   },
   "edit_page": {
     "back_myworks": "返回我的作品",
-    "preview": "预览",
+    "preview": "查看",
     "settings": "基础",
     "navigation": "导航",
     "viewpoint": "视角",
@@ -772,6 +774,7 @@
     "setting_screen": "将当前视角设为初始画面"
   },
   "hotspot": {
+    "img_size":"最多添加20张图片",
     "hotspot_setting": "热点设置",
     "hotspot_tips": "在全景图中添加图标热点,并设置热点的效果。",
     "add_hotspot": "添加热点",
@@ -842,7 +845,7 @@
     "FAILURE_5002": "redis token不存在",
     "FAILURE_5003": "token invalid(无效)",
     "FAILURE_3001": "对象不存在",
-    "FAILURE_3011": "没有操作权限",
+    "FAILURE_3011": "当前无操作权限",
     "FAILURE_3020": "空文件",
     "FAILURE_3021": "非法文件",
     "FAILURE_3022": "上传文件超过最大值",

+ 2 - 0
packages/qjkankan-editor/src/pages/Edit.vue

@@ -17,6 +17,8 @@ export default {
     ]),
   },
   mounted() {
+    document.title = this.$i18n.t('gather.editpage_name')
+
     window.addEventListener('beforeunload', (e) => {
       if (this.isInfoChangedSinceSave) {
         e.preventDefault()

+ 1 - 0
packages/qjkankan-editor/src/pages/Material.vue

@@ -11,6 +11,7 @@ export default {
     AppLayout
   },
   mounted() {
+    document.title = this.$i18n.t('gather.name')
     window.addEventListener('keydown',  (event) =>{
       if (event.keyCode === 27) {
         this.$bus.emit('clickEsc')

+ 6 - 1
packages/qjkankan-editor/src/utils/request.js

@@ -133,10 +133,15 @@ export function statusCodesHandler(result, callback) {
   }
 
   if (result.code == statusCode.FAILURE_CODE_3005) {
-    $alert({ content: i18n.t('tips_code.work_had_delete') });
+    $alert({ content: i18n.t('tips_code.FAILURE_3011') });
+    return false
+  }
+  if (result.code == statusCode.FAILURE_CODE_3011) {
+    $alert({ content: i18n.t('tips_code.FAILURE_3011') });
     return false
   }
   
+  
   if (result.code == statusCode.FAILURE_CODE_3006) {
     $alert({ content: i18n.t('tips_code.work_had_delete') });
     return

+ 1 - 0
packages/qjkankan-editor/src/views/base/openingTipSettings.vue

@@ -113,6 +113,7 @@ export default {
       this.info.isRemind = data
     },
     onRangeChange(data) {
+      console.log(data.value);
       this.info.remindTime = parseInt(data.value)
     },
   }

+ 1 - 1
packages/qjkankan-editor/src/views/hotspot/hotspotType/image.vue

@@ -66,7 +66,7 @@ export default {
   watch: {
     images(newVal) {
       if (newVal.length > 20) {
-        return this.$alert({ content: "最多添加20张图片" });
+        return this.$alert({ content: this.$i18n.t('hotspot.img_size') });
       }
       this.$emit('imageChange',newVal)
     }

+ 1 - 1
packages/qjkankan-editor/src/views/material/popup/share.vue

@@ -11,7 +11,7 @@
         <ul>
           <li>
             <span>{{work_link}}</span>
-            <input :title="item.share" class="ui-input" disabled type="text" maxlength="15"  v-model="item.share" />
+            <input :title="item.share+`&lang=${$lang}`" class="ui-input" disabled type="text" maxlength="15"  v-model="item.share" />
           </li>
           <li>
             <span>{{work_qrCode}}</span>

+ 39 - 25
packages/qjkankan-editor/src/views/material/works/index.vue

@@ -4,13 +4,13 @@
       <i class="iconfont icon-top"></i>
     </div>
     <div class="tab">
-      <span>{{myWorks}} {{workTotalNum !== undefined ? `(${workTotalNum})`:''}}</span>
+      <span>{{ myWorks }} {{ workTotalNum !== undefined ? `(${workTotalNum})` : '' }}</span>
       <div class="tab-r">
         <div class="filter">
-          <div :class="{active: isFilterFocus}" @focusin="onFilterFocus" @focusout="onFilterBlur">
+          <div :class="{ active: isFilterFocus }" @focusin="onFilterFocus" @focusout="onFilterBlur">
             <i class="iconfont iconworks_search search"></i>
             <input type="text" :placeholder="search" v-model="searchKey">
-            <i v-if="searchKey" @click="searchKey=''" class="iconfont icontoast_red del"></i>
+            <i v-if="searchKey" @click="searchKey = ''" class="iconfont icontoast_red del"></i>
           </div>
         </div>
       </div>
@@ -26,7 +26,7 @@
             <div>
               <i class="iconfont icon_plus"></i>
             </div>
-            <span>{{create}}</span>
+            <span>{{ create }}</span>
           </div>
         </div>
       </li>
@@ -38,27 +38,27 @@
           </div>
         </li>
       </template>
-      <li v-for="(item,i) in list" :key="i" :class="{'has-more-data': hasMoreData}">
+      <li v-for="(item, i) in list" :key="i" :class="{ 'has-more-data': hasMoreData }">
         <div class="wrapper">
           <div class="li-hover">
-            <span class="lipreview" @click="handlePreview(item)">{{preview}}</span>
+            <span class="lipreview" @click="handlePreview(item)">{{ preview }}</span>
             <ul class="oper">
-              <li class="comfirmhover" @click="edit(item)"><i class="iconfont icon-works_editor"></i>{{edittips}}</li>
-              <li class="comfirmhover" @click="openShare(item)"><i class="iconfont icon-works_share"></i>{{share}}</li>
-              <li class="cancelhover" @click="del(item, i)"><i class="iconfont icon-works_delete"></i>{{deltips}}</li>
+              <li class="comfirmhover" @click="edit(item)"><i class="iconfont icon-works_editor"></i>{{ edittips }}</li>
+              <li class="comfirmhover" @click="openShare(item)"><i class="iconfont icon-works_share"></i>{{ share }}</li>
+              <li class="cancelhover" @click="del(item, i)"><i class="iconfont icon-works_delete"></i>{{ deltips }}</li>
             </ul>
           </div>
           <div class="img" @click="handlePreview(item)">
-            <img class="real" :src="item.icon||$thumb" alt="" />
+            <img class="real" :src="item.icon || $thumb" alt="" />
           </div>
           <div class="li-info">
             <div>
-              <span class="shenglve tttttt" :title="item.name||no_title">{{item.name||no_title}}</span>
+              <span class="shenglve tttttt" :title="item.name || no_title">{{ item.name || no_title }}</span>
             </div>
             <div>
-              <span>{{item.createTime.split(' ')[0]}}</span>
+              <span>{{ item.createTime.split(' ')[0] }}</span>
               <div :title="item.visit">
-                <i class="iconfont iconworks_look"></i>{{item.visit>10000?'1w+':item.visit}}
+                <i class="iconfont iconworks_look"></i>{{ item.visit > 10000 ? '1w+' : item.visit }}
               </div>
             </div>
           </div>
@@ -70,19 +70,20 @@
     </ul>
     <div class="nodata" v-if="list.length == 0 && !hasMoreData && lastestUsedSearchKey">
       <img :src="$noresult" alt="" />
-      <span>{{no_serch_result}}~</span>
+      <span>{{ no_serch_result }}~</span>
     </div>
     <div class="nodata" v-if="list.length == 0 && !hasMoreData && !lastestUsedSearchKey">
       <img :src="config.empty" alt="" />
-      <span>{{no_works}}</span>
-      <button @click="add" class="upload-btn-in-table">{{create}}</button>
+      <span>{{ no_works }}</span>
+      <button @click="add" class="upload-btn-in-table">{{ create }}</button>
     </div>
-    <share :show='showShare' :item="shareItem" @close="showShare=false"></share>
-    <preview v-if="showItem" :name="showItem.name" :show="showPreview" :ifr="`./show.html?id=${showItem.id}&lang=${$lang}`"
-      :dark="false" @close="showPreview = false" />
+    <share :show='showShare' :item="shareItem" @close="showShare = false"></share>
+    <preview v-if="showItem" :name="showItem.name" :show="showPreview"
+      :ifr="`./show.html?id=${showItem.id}&lang=${$lang}`" :dark="false" @close="showPreview = false" />
     <div class="dialog" style="z-index: 10" v-if="isShowMaterialSelector">
-      <MaterialSelector :title="select_material" @cancle="isShowMaterialSelector = false" @submit="handleSubmitFromMaterialSelector"
-        :selectableType="['pano', '3D']" :isMultiSelection="true" :workId="newWorkId" initialMaterialType="pano" />
+      <MaterialSelector :title="select_material" @cancle="isShowMaterialSelector = false"
+        @submit="handleSubmitFromMaterialSelector" :selectableType="['pano', '3D']" :isMultiSelection="true"
+        :workId="newWorkId" initialMaterialType="pano" />
     </div>
   </div>
 </template>
@@ -95,7 +96,8 @@ import config from "@/config";
 import { debounce } from "@/utils/other.js"
 import MaterialSelector from "@/components/materialSelectorForManageCenter.vue";
 import { mapGetters } from "vuex";
-import {i18n} from "@/lang"
+import { i18n } from "@/lang"
+import { $waiting } from "@/components/shared/loading";
 
 
 import {
@@ -207,15 +209,18 @@ export default {
     },
     add() {
       // 新建作品,弹窗让用户给作品选择素材。
+      $waiting.show();
       addWorks(
         {},
         (res) => {
+          $waiting.hide();
           this.newWorkId = res.data.id
           this.isShowMaterialSelector = true
         },
       )
     },
     handleSubmitFromMaterialSelector(selected) {
+      $waiting.show();
       // 拿新作品的初始数据
       getPanoInfo(
         this.newWorkId,
@@ -250,12 +255,15 @@ export default {
             {
               id: this.newWorkId,
               password: '',
-              someData: { ...this.info,
-                 status: 1,
-                icon: this.info.scenes[0].icon },
+              someData: {
+                ...this.info,
+                status: 1,
+                icon: this.info.scenes[0].icon
+              },
             },
             // 保存成功
             () => {
+              $waiting.hide();
               // 隐藏素材选择弹窗
               this.isShowMaterialSelector = false
 
@@ -290,6 +298,7 @@ export default {
             },
             // 保存失败,删除新建的作品。
             (error) => {
+              $waiting.hide();
               console.error('保存失败:', error);
               delWorks(this.newWorkId)
               this.newWorkId = ''
@@ -313,6 +322,9 @@ export default {
         title: this.$i18n.t("material.works.delete_work"),
         content: this.$i18n.t("material.works.comfirm_delete"),
         ok: () => {
+
+          $waiting.show();
+
           delWorks(item.id, () => {
             this.$msg.success(this.$i18n.t("gather.delete_success"));
             this.isRequestingMoreData = true
@@ -324,6 +336,7 @@ export default {
                 searchKey: this.searchKey
               },
               (data) => {
+                $waiting.hide();
                 this.list.splice(index, 1)
                 this.list = this.list.concat(data.data.list)
                 if (this.list.length === data.data.total) {
@@ -340,6 +353,7 @@ export default {
                 })
               },
               () => {
+                $waiting.hide();
                 this.lastestUsedSearchKey = lastestUsedSearchKey
                 this.isRequestingMoreData = false
               }

+ 4 - 3
packages/qjkankan-editor/src/views/navigation/initialSceneSettings.vue

@@ -55,11 +55,11 @@ export default {
   methods:{
     deleteIndexInfo(){
       this.$confirm({
-          content: "是否删除?",
+          content: this.$i18n.t('tips.delete'),
           ok: () => {
               this.info.firstScene = ''
               this.$store.commit("SetInfo", this.info);
-              this.$msg.success('删除成功')
+              this.$msg.success(this.$i18n.t('tips.delete_done'))
           }
       });
       
@@ -110,7 +110,8 @@ export default {
     display: flex;
     justify-content: space-between;
     .ui-button {
-      width: calc((100% - 14px) / 2)
+      width: calc((100% - 14px) / 2);
+      white-space: initial;
     }
   }
   .set-init {

+ 1 - 0
packages/qjkankan-view/package.json

@@ -5,6 +5,7 @@
   "scripts": {
     "serve": "vue-cli-service serve",
     "serve-eurtestdev": "vue-cli-service serve --mode eurtestdev",
+    "serve-eurdev": "vue-cli-service serve --mode eurdev",
     "build": "vue-cli-service build",
     "build-testprod": "vue-cli-service build --mode testprod",
     "build-eurtestprod": "vue-cli-service build --mode eurtestprod",

+ 1 - 1
packages/qjkankan-view/public/show.html

@@ -11,7 +11,7 @@
     <link rel="stylesheet" href="<%= VUE_APP_STATIC_DIR %>/lib/iconfontV1.2.0/iconfont.css"/>
     <link rel="stylesheet" href="<%= VUE_APP_STATIC_DIR %>/lib/swiper/swiper-bundle.min.css" />
     <link rel="icon" href="./favicon.png" />
-    <title>四维全景</title>
+    <title>-</title>
   </head>
   <body>
     <div id="app"></div>

+ 1 - 1
packages/qjkankan-view/public/showMobile.html

@@ -12,7 +12,7 @@
     <link rel="stylesheet" href="<%= VUE_APP_STATIC_DIR %>/lib/iconfontV1.2.0/iconfont.css"/>
     <link rel="stylesheet" href="<%= VUE_APP_STATIC_DIR %>/lib/swiper/swiper-bundle.min.css" />
     <link rel="icon" href="./favicon.png" />
-    <title>四维全景</title>
+    <title>-</title>
   </head>
   <body>
     <div id="app"></div>

+ 1 - 1
packages/qjkankan-view/public/showviewer/lib/krpano/plugins/webvr.xml

@@ -194,7 +194,7 @@
 	
 	<layer name="webvr_enterbutton" keep="true" vr="true"
 	       style="webvr_button_style"
-	       html="Enter VR"
+	       html=""
 	       align="top" y="24"
 	       autoalpha="true" alpha="0.0"
 	       onclick="webvr.enterVR();"

BIN
packages/qjkankan-view/public/showviewer/lib/krpano/skin/masking.png


+ 2 - 0
packages/qjkankan-view/src/components/UIGather/control.vue

@@ -99,6 +99,8 @@ watchEffect(() => {
   if (currentScene.value.explanation) {
     let { audioUrl, openByDefault, repeat } = currentScene.value.explanation
     if (audioUrl) {
+      //解说有变,初始化按钮状态
+      showCommentaryPlaying.value = false
       store.commit("functions/setCommentaryUrl", {
         src: audioUrl,
         loop: repeat,

+ 33 - 19
packages/qjkankan-view/src/components/UIGather/list.vue

@@ -2,12 +2,10 @@
   <div class="bar-list"
     v-if="show && !((metadata.catalogRoot && metadata.catalogRoot.length == 1) && scenes.length == 1 && secondaryList.length == 1)"
     :class="{ barshow: isShowScenesList }">
-    <div class="top-con" 
-    :style="`width:${(Math.max(scenesListW,secondaryW)>1150)?'100%':((Math.max(scenesListW,secondaryW) + 120)+'px')}`"
-    >
-      <div class="swiper-container" 
-      :style="`width:${scenesListW>1150?'100%':(scenesListW+'px')}`"
-        id="swScenes" v-if="currentScenesList.length > 0">
+    <div class="top-con"
+      :style="`width:${(Math.max(scenesListW, secondaryW) > 1150) ? '100%' : ((Math.max(scenesListW, secondaryW) + 120) + 'px')}`">
+      <div class="swiper-container" :style="`width:${scenesListW > 1150 ? '100%' : (scenesListW + 'px')}`" id="swScenes"
+        v-if="currentScenesList.length > 0">
         <ul class="swiper-wrapper">
           <li @click="tabCurrentScene(item)" class="swiper-slide" :class="{
             active: currentScene.sceneCode == item.sceneCode,
@@ -15,8 +13,9 @@
           }" :style="{ backgroundImage: `url(${item.icon})` }" v-for="(item, i) in currentScenesList" :key="i">
             <i class="iconfont " :class="item.type == '4dkk' ? 'icon-editor_3d' : 'icon-editor_panoramic'"></i>
             <div>
-              <span v-if="currentScene.id == item.id">{{item.sceneTitle}}</span>
-              <span v-else>{{ item.sceneTitle.length > spanlength ? item.sceneTitle.slice(0, spanlength) : item.sceneTitle
+              <span v-if="currentScene.id == item.id">{{ item.sceneTitle }}</span>
+              <span v-else>{{ item.sceneTitle.length > spanlength ? item.sceneTitle.slice(0, spanlength) :
+                  item.sceneTitle
               }}</span>
             </div>
           </li>
@@ -27,25 +26,24 @@
         <ul class="swiper-wrapper">
           <li class="swiper-slide" @click="tabSecondary(item)" :class="{
             active: currentSecondary.id == item.id,
-            loopspan: item.name.length > spanlength && currentSecondary.id == item.id,
+            loopspan: fixTitle(item.name).length > spanlength && currentSecondary.id == item.id,
           }" v-for="(item, i) in secondaryList" :key="i">
-            <span v-if="currentSecondary.id == item.id">{{item.name}}</span>
-            <span v-else>{{ item.name.length > spanlength ? item.name.slice(0, spanlength) : item.name }}</span>
+            <span v-if="currentSecondary.id == item.id">{{ fixTitle(item.name) }}</span>
+            <span v-else>{{ fixTitle(item.name).length > spanlength ? fixTitle(item.name).slice(0, spanlength) : fixTitle(item.name) }}</span>
           </li>
         </ul>
       </div>
     </div>
 
-    <div class="swiper-container" id="swcatalogRoot"
-    :style="`width:${catalogRootW>innerW?'100%':(catalogRootW+'px')}`"
+    <div class="swiper-container" id="swcatalogRoot" :style="`width:${catalogRootW > innerW ? '100%' : (catalogRootW + 'px')}`"
       v-if="metadata.catalogRoot.length > 0 && metadata.catalogs.length > 1">
       <ul class="swiper-wrapper" v-if="metadata.catalogRoot.length > 1">
         <li class="swiper-slide" :class="{
           active: currentCatalogRoot.id == item.id,
-          loopspan: item.name.length > spanlength && currentCatalogRoot.id == item.id,
+          loopspan: fixTitle(item.name).length > spanlength && currentCatalogRoot.id == item.id,
         }" @click="tabRoot(item)" v-for="(item, i) in metadata.catalogRoot" :key="i">
-          <span v-if="currentCatalogRoot.id == item.id">{{item.name}}</span>
-          <span v-else>{{ item.name.length > spanlength ? item.name.slice(0, spanlength) : item.name }}</span>
+          <span v-if="currentCatalogRoot.id == item.id">{{ fixTitle(item.name) }}</span>
+          <span v-else>{{ fixTitle(item.name).length > spanlength ? fixTitle(item.name).slice(0, spanlength) : fixTitle(item.name) }}</span>
         </li>
       </ul>
     </div>
@@ -56,6 +54,10 @@
 import { ref, watch, computed, onMounted, nextTick } from "vue";
 import { useStore } from "vuex";
 import { useApp } from "@/app";
+
+import { useI18n, getLocale } from '@/i18n'
+const { t } = useI18n({ useScope: 'global' })
+
 const store = useStore();
 
 const spanlength = ref(5);
@@ -82,9 +84,9 @@ const swidth = ref({
   "swScenes": 72,
 })
 
-const scenesListW = computed(()=>currentScenesList.value.length * (swidth.value['swScenes'] + 10) - 10)
-const secondaryW = computed(()=>secondaryList.value.length * (swidth.value['swSecondary'] + 10) - 10)
-const catalogRootW = computed(()=>metadata.value.catalogRoot.length * (swidth.value['swcatalogRoot'] + 10) - 10)
+const scenesListW = computed(() => currentScenesList.value.length * (swidth.value['swScenes'] + 10) - 10)
+const secondaryW = computed(() => secondaryList.value.length * (swidth.value['swSecondary'] + 10) - 10)
+const catalogRootW = computed(() => metadata.value.catalogRoot.length * (swidth.value['swcatalogRoot'] + 10) - 10)
 const innerW = computed(() => 1150)
 
 
@@ -101,6 +103,17 @@ const tabRoot = (data) => {
   store.commit("scene/setCurrentCatalogRoot", data);
 };
 
+const fixTitle = (name) => {
+  if (name == '默认二级分组') {
+    name = t('navigation.default_group_two')
+  } else if (name == '一级分组') {
+    name = t('navigation.group_one')
+  } else {
+    name = name
+  }
+  return name
+}
+
 const loadList = () => {
   nextTick(() => {
     let t = setTimeout(() => {
@@ -158,6 +171,7 @@ $width: 1150px;
     >ul {
       >li {
         white-space: nowrap;
+
         >span,
         >div>span {
           cursor: pointer;

+ 20 - 6
packages/qjkankan-view/src/components/UIGather/mobile/list.vue

@@ -26,10 +26,10 @@
         <ul class="swiper-wrapper">
           <li class="swiper-slide" @click="tabSecondary(item)" :class="{
             active: currentSecondary.id == item.id,
-            loopspan: item.name.length > spanlength && currentSecondary.id == item.id,
+            loopspan: fixTitle(item.name).length > spanlength && currentSecondary.id == item.id,
           }" v-for="(item, i) in secondaryList" :key="i">
-            <span v-if="currentSecondary.id == item.id">{{ item.name }}</span>
-            <span v-else>{{ item.name.length > spanlength ? item.name.slice(0, spanlength) : item.name }}</span>
+            <span v-if="currentSecondary.id == item.id">{{ fixTitle(item.name) }}</span>
+            <span v-else>{{ fixTitle(item.name).length > spanlength ? fixTitle(item.name).slice(0, spanlength) : fixTitle(item.name) }}</span>
           </li>
         </ul>
       </div>
@@ -41,10 +41,10 @@
       <ul class="swiper-wrapper" v-show="metadata.catalogRoot.length > 1">
         <li class="swiper-slide" :class="{
           active: currentCatalogRoot.id == item.id,
-          loopspan: item.name.length > spanlength && currentCatalogRoot.id == item.id,
+          loopspan: fixTitle(item.name).length > spanlength && currentCatalogRoot.id == item.id,
         }" @click="tabRoot(item)" v-for="(item, i) in metadata.catalogRoot" :key="i">
-          <span v-if="currentCatalogRoot.id == item.id">{{ item.name }}</span>
-          <span v-else>{{ item.name.length > spanlength ? item.name.slice(0, spanlength) : item.name }}</span>
+          <span v-if="currentCatalogRoot.id == item.id">{{ fixTitle(item.name) }}</span>
+          <span v-else>{{ fixTitle(item.name).length > spanlength ? fixTitle(item.name).slice(0, spanlength) : fixTitle(item.name) }}</span>
 
         </li>
       </ul>
@@ -56,6 +56,9 @@
 import { ref, watch, computed, onMounted, nextTick } from "vue";
 import { useStore } from "vuex";
 import { useApp } from "@/app";
+import { useI18n, getLocale } from '@/i18n'
+const { t } = useI18n({ useScope: 'global' })
+
 const store = useStore();
 
 const spanlength = ref(5);
@@ -102,6 +105,17 @@ const tabRoot = (data) => {
   store.commit("scene/setCurrentCatalogRoot", data);
 };
 
+const fixTitle = (name) => {
+  if (name == '默认二级分组') {
+    name = t('navigation.default_group_two')
+  } else if (name == '一级分组') {
+    name = t('navigation.group_one')
+  } else {
+    name = name
+  }
+  return name
+}
+
 const loadList = () => {
   nextTick(() => {
     let t = setTimeout(() => {

+ 6 - 0
packages/qjkankan-view/src/components/assembly/MobileTags/index.vue

@@ -55,6 +55,12 @@ const close = () => {
     font-size: 18px;
     border-bottom: solid 1px rgba(255, 255, 255, 0.16);
     color: #fff;
+    
+    >span{
+      overflow: hidden;
+      white-space: nowrap;
+      text-overflow: ellipsis;
+    }
 
     .close {
       color: rgba(255, 255, 255, 0.6);

+ 2 - 0
packages/qjkankan-view/src/components/assembly/MobileTags/metas/metas-image.vue

@@ -3,6 +3,8 @@ import PhotoSwipe from 'photoswipe';
 import 'photoswipe/style.css';
 import { reactive, defineEmits, onBeforeMount, onMounted, ref, watchEffect, computed, watch, nextTick } from "vue";
 import { useStore } from "vuex";
+import { useI18n, getLocale } from "@/i18n";
+
 const store = useStore();
 const { t } = useI18n({ useScope: "global" });
 

+ 8 - 2
packages/qjkankan-view/src/locales/en.json

@@ -26,8 +26,9 @@
     "fullScene": "Full screen",
     "exitFullScene": "Exit full screen",
     "image_fail": "Failed to load image",
-    "exit_vr": "Exit VR"
-
+    "exit_vr": "Exit VR",
+    "no_title": "No title",
+    "name":"4DPano"
   },
   "menu":{
     "introduce": "Introduction ",
@@ -60,5 +61,10 @@
     "inputPassword": "Please enter the password",
     "checkBrowser": "Please upgrade or change your browser, then reopen the page.",
     "changeBrowser": "The following web browsers are recommended:"
+  },
+  "navigation": {
+    "group_one": "1st Grouping",
+    "group_two": "2nd Grouping",
+    "default_group_two": "Default as 2nd grouping"
   }
 }

+ 8 - 1
packages/qjkankan-view/src/locales/zh.json

@@ -26,7 +26,9 @@
     "fullScene": "全屏",
     "exitFullScene": "取消全屏",
     "image_fail": "图片加载失败",
-    "exit_vr": "退出VR模式"
+    "exit_vr": "退出VR模式",
+    "no_title": "无标题",
+    "name":"四维全景"
 
   },
   "menu":{
@@ -60,5 +62,10 @@
     "inputPassword": "请输入密码",
     "checkBrowser": "无法打开页面,请升级或更换浏览器后重新打开",
     "changeBrowser": "建议使用以下浏览器"
+  },
+  "navigation": {
+    "group_one": "一级分组",
+    "group_two": "二级分组",
+    "default_group_two": "默认二级分组"
   }
 }

+ 2 - 1
packages/qjkankan-view/src/pages/show.vue

@@ -76,6 +76,7 @@ onMounted(async () => {
     store.commit("scene/setScenes", data.scenes);
     store.commit("scene/setPassword", data.password === "" ? false : data.password);
     store.commit("scene/setMetaData", data);
+    document.title = data.name || t('common.no_title')
 
     let firstScene = "";
 
@@ -131,7 +132,7 @@ onMounted(async () => {
 
     const app = createApp({
       // xml: "%HTMLPATH%/static/template/tour.xml",
-      xml: `${process.env.VUE_APP_CDN}/720yun_fd_manage/${config.projectNum}/tour.xml`,
+      xml: `${process.env.VUE_APP_CDN}/720yun_fd_manage/${config.projectNum}/tour.xml?rnd=${Math.random()}`,
       swf: "%HTMLPATH%/showviewer/lib/krpano/tour.swf",
       target: "pano",
       html5: "auto",

+ 2 - 1
packages/qjkankan-view/src/pages/showMobile.vue

@@ -76,6 +76,7 @@ onMounted(async () => {
     store.commit("scene/setScenes", data.scenes);
     store.commit("scene/setPassword", data.password === "" ? false : data.password);
     store.commit("scene/setMetaData", data);
+    document.title = data.name || t('common.no_title')
 
     let firstScene = "";
 
@@ -131,7 +132,7 @@ onMounted(async () => {
 
     const app = createApp({
       // xml: "%HTMLPATH%/static/template/tour.xml",
-      xml: `${process.env.VUE_APP_CDN}/720yun_fd_manage/${config.projectNum}/tour.xml`,
+      xml: `${process.env.VUE_APP_CDN}/720yun_fd_manage/${config.projectNum}/tour.xml?rnd=${Math.random()}`,
       swf: "%HTMLPATH%/showviewer/lib/krpano/tour.swf",
       target: "pano",
       html5: "auto",