diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index c6c30227..eb14f9e6 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -1,6 +1,8 @@
 lockfileVersion: 5.4
 
 specifiers:
+  '@amap/amap-jsapi-loader': ^1.0.1
+  '@amap/amap-jsapi-types': ^0.0.8
   '@commitlint/cli': ^17.0.2
   '@commitlint/config-conventional': ^17.0.2
   '@types/color': ^3.0.3
@@ -65,6 +67,8 @@ specifiers:
   vuedraggable: ^4.1.0
 
 dependencies:
+  '@amap/amap-jsapi-loader': 1.0.1
+  '@amap/amap-jsapi-types': 0.0.8
   '@types/color': 3.0.3
   '@types/crypto-js': 4.1.1
   '@types/keymaster': 1.6.30
@@ -132,6 +136,14 @@ devDependencies:
 
 packages:
 
+  /@amap/amap-jsapi-loader/1.0.1:
+    resolution: {integrity: sha512-nPyLKt7Ow/ThHLkSvn2etQlUzqxmTVgK7bIgwdBRTg2HK5668oN7xVxkaiRe3YZEzGzfV2XgH5Jmu2T73ljejw==}
+    dev: false
+
+  /@amap/amap-jsapi-types/0.0.8:
+    resolution: {integrity: sha512-q0FyZDIJcXjsMLGc3oS9rjfJsErOvt9rcp6AgzY4k14vo7bBhdq4eKwoSdVp/pYjR/rfaKBns5v10ycZOFwf/A==}
+    dev: false
+
   /@ampproject/remapping/2.2.0:
     resolution: {integrity: sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==}
     engines: {node: '>=6.0.0'}
diff --git a/src/App.vue b/src/App.vue
index 1865e459..2fa191d8 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -1,9 +1,9 @@
 <template>
   <n-config-provider
-    :locale="zhCN"
     :theme="darkTheme"
     :hljs="hljsTheme"
-    :date-locale="dateZhCN"
+    :locale="locale"
+    :date-locale="dateLocale"
     :theme-overrides="overridesTheme"
   >
     <go-app-provider>
@@ -14,11 +14,10 @@
 </template>
 
 <script lang="ts" setup>
-import { zhCN, dateZhCN, NConfigProvider } from 'naive-ui'
+import { NConfigProvider } from 'naive-ui'
 import { GoAppProvider } from '@/components/GoAppProvider'
 import { I18n } from '@/components/I18n'
-
-import { useDarkThemeHook, useThemeOverridesHook, useCode } from '@/hooks'
+import { useDarkThemeHook, useThemeOverridesHook, useCode, useLang } from '@/hooks'
 
 // 暗黑主题
 const darkTheme = useDarkThemeHook()
@@ -28,4 +27,8 @@ const overridesTheme = useThemeOverridesHook()
 
 // 代码主题
 const hljsTheme = useCode()
+
+// 全局语言
+const { locale, dateLocale } = useLang()
+
 </script>
diff --git a/src/hooks/index.ts b/src/hooks/index.ts
index bc9825fb..5ecfe3dd 100644
--- a/src/hooks/index.ts
+++ b/src/hooks/index.ts
@@ -2,4 +2,5 @@ export * from '@/hooks/useTheme.hook'
 export * from '@/hooks/usePreviewScale.hook'
 export * from '@/hooks/useCode.hook'
 export * from '@/hooks/useChartDataFetch.hook'
-export * from '@/hooks/useLifeHandler.hook'
\ No newline at end of file
+export * from '@/hooks/useLifeHandler.hook'
+export * from '@/hooks/useLang.hook'
\ No newline at end of file
diff --git a/src/hooks/useLang.hook.ts b/src/hooks/useLang.hook.ts
new file mode 100644
index 00000000..f165ce6d
--- /dev/null
+++ b/src/hooks/useLang.hook.ts
@@ -0,0 +1,24 @@
+import { computed } from 'vue'
+import { LangEnum } from '@/enums/styleEnum'
+import { useLangStore } from '@/store/modules/langStore/langStore'
+import { zhCN, enUS, dateEnUS, dateZhCN } from 'naive-ui'
+
+type LangStoreType = typeof useLangStore
+
+// 语言切换
+export const useLang = () => {
+  const lang = useLangStore()
+  
+  const locale = computed(() => {
+    return lang.getLang === LangEnum.ZH ? zhCN : enUS
+  })
+
+  const dateLocale = computed(() => {
+    return lang.getLang === LangEnum.ZH ? dateZhCN : dateEnUS
+  })
+
+  return {
+    locale,
+    dateLocale
+  }
+}
diff --git a/src/packages/components/Decorates/Three/ThreeEarth01/index.vue b/src/packages/components/Decorates/Three/ThreeEarth01/index.vue
index 057dac40..5fd62d6a 100644
--- a/src/packages/components/Decorates/Three/ThreeEarth01/index.vue
+++ b/src/packages/components/Decorates/Three/ThreeEarth01/index.vue
@@ -67,7 +67,7 @@ watch(
 onMounted(() => {
   try {
     if (navigator.userAgent.indexOf('Chrome') < -1 || navigator.userAgent.indexOf('Edg') > -1) {
-      window['$message'].error('此组件仅在【谷歌】浏览器上能正常展示!')
+      window['$message'].error('三维地图组件仅在【谷歌】浏览器上能正常展示!')
       chartEditStore.removeComponentList(undefined, false)
       return
     }
diff --git a/src/packages/components/Informations/Mores/Iframe/config.ts b/src/packages/components/Informations/Mores/Iframe/config.ts
index 514966ff..2e96c211 100644
--- a/src/packages/components/Informations/Mores/Iframe/config.ts
+++ b/src/packages/components/Informations/Mores/Iframe/config.ts
@@ -6,7 +6,7 @@ import cloneDeep from 'lodash/cloneDeep'
 
 export const option = {
   // 网站路径
-  dataset: "https://cn.vuejs.org/",
+  dataset: "https://www.mtruning.club/",
   // 圆角
   borderRadius: 10
 }
diff --git a/src/settings/pathConst.ts b/src/settings/pathConst.ts
index 74cbb91d..d3c604a6 100644
--- a/src/settings/pathConst.ts
+++ b/src/settings/pathConst.ts
@@ -1,10 +1,10 @@
 // * 外部路径地址
 
 // 项目文档地址
-export const docPath = "http://www.mtruning.club:81/"
+export const docPath = "https://www.mtruning.club/"
 
 // 项目源码
-export const giteeSourceCodePath = "https://gitee.com/MTrun/go-view/"
+export const giteeSourceCodePath = "https://gitee.com/dromara/go-view"
 
 // 赞助
-export const sponsorPath = "http://www.mtruning.club:81/more/sponsor.html"
+export const sponsorPath = "https://www.mtruning.club/sponsor/"
diff --git a/src/store/index.ts b/src/store/index.ts
index efaf6c97..4e303ea9 100644
--- a/src/store/index.ts
+++ b/src/store/index.ts
@@ -1,10 +1,10 @@
 import type { App } from 'vue';
 import { createPinia } from 'pinia';
 
-const store = createPinia();
+const pinia = createPinia();
 
 export function setupStore(app: App<Element>) {
-  app.use(store);
+  app.use(pinia);
 }
 
-export { store };
+export { pinia };
diff --git a/src/store/modules/langStore/langStore.ts b/src/store/modules/langStore/langStore.ts
index 9eb7bdeb..d1795e6c 100644
--- a/src/store/modules/langStore/langStore.ts
+++ b/src/store/modules/langStore/langStore.ts
@@ -6,10 +6,8 @@ import i18n from '@/i18n/index'
 import { setLocalStorage, getLocalStorage, reloadRoutePage } from '@/utils'
 import { StorageEnum } from '@/enums/storageEnum'
 import { useSettingStore } from '@/store/modules/settingStore/settingStore'
-const settingStore = useSettingStore()
 
 const { GO_LANG_STORE } = StorageEnum
-
 const storageLang: LangStateType = getLocalStorage(GO_LANG_STORE)
 
 // 语言
@@ -17,7 +15,7 @@ export const useLangStore = defineStore({
   id: 'useLangStore',
   state: (): LangStateType =>
     storageLang || {
-      lang,
+      lang
     },
   getters: {
     getLang(): LangEnum {
@@ -26,6 +24,8 @@ export const useLangStore = defineStore({
   },
   actions: {
     changeLang(lang: LangEnum): void {
+      const settingStore = useSettingStore()
+      
       if (this.lang === lang) return
       this.lang = lang
       i18n.global.locale = lang
diff --git a/src/views/chart/ContentConfigurations/index.vue b/src/views/chart/ContentConfigurations/index.vue
index 0f8a8609..110a3c2f 100644
--- a/src/views/chart/ContentConfigurations/index.vue
+++ b/src/views/chart/ContentConfigurations/index.vue
@@ -14,7 +14,7 @@
       @collapse="collapsedHandle"
       @expand="expandHandle"
     >
-      <content-box class="go-content-layers go-boderbox" :show-top="false" :depth="2">
+      <content-box class="go-content-configurations go-boderbox" :show-top="false" :depth="2">
         <!-- 页面配置 -->
         <n-tabs v-if="!selectTarget" class="tabs-box" size="small" type="segment">
           <n-tab-pane
@@ -160,7 +160,7 @@ const chartsTabList = [
 </script>
 
 <style lang="scss" scoped>
-@include go(content-layers) {
+@include go(content-configurations) {
   overflow: hidden;
   .tabs-box {
     padding: 10px;
diff --git a/src/views/chart/ContentEdit/components/EditRule/index.vue b/src/views/chart/ContentEdit/components/EditRule/index.vue
index e297582f..2e98460f 100644
--- a/src/views/chart/ContentEdit/components/EditRule/index.vue
+++ b/src/views/chart/ContentEdit/components/EditRule/index.vue
@@ -12,14 +12,18 @@
 </template>
 
 <script setup lang="ts">
-import { ref, toRefs, computed, watch } from 'vue'
+import { ref, toRefs, computed, watch, nextTick, onBeforeUnmount } from 'vue'
 import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
 import { useDesignStore } from '@/store/modules/designStore/designStore'
+import { useChartLayoutStore } from '@/store/modules/chartLayoutStore/chartLayoutStore'
 
 const chartEditStore = useChartEditStore()
+const chartLayoutStore = useChartLayoutStore()
 const designStore = useDesignStore()
 
 const { width, height } = toRefs(chartEditStore.getEditCanvasConfig)
+const { scale, lockScale } = toRefs(chartEditStore.getEditCanvas)
+const { getLayers, getCharts, getDetails } = toRefs(chartLayoutStore)
 
 const configShow = ref(true)
 
@@ -49,25 +53,47 @@ const canvasBox = () => {
   }
 }
 
-const scale = computed(() => {
-  return chartEditStore.getEditCanvas.scale
-})
-
 // 颜色
 const themeColor = computed(() => {
   return designStore.getAppTheme
 })
 
 // 处理标尺重制大小
+const ruleChangeHandle = () => {
+  configShow.value = false
+  setTimeout(() => {
+    configShow.value = true
+  })
+}
+
+const ruleChangeHandleTimeOut = () => {
+  if (lockScale.value) {
+    setTimeout(() => {
+      ruleChangeHandle()
+    }, 500)
+  }
+}
+
 watch(
   () => scale.value,
-  () => {
-    configShow.value = false
-    setTimeout(() => {
-      configShow.value = true
-    })
-  }
+  () => ruleChangeHandle()
 )
+
+watch(
+  () => getLayers.value,
+  () => ruleChangeHandleTimeOut()
+)
+
+watch(
+  () => getCharts.value,
+  () => ruleChangeHandleTimeOut()
+)
+
+watch(
+  () => getDetails.value,
+  () => ruleChangeHandleTimeOut()
+)
+
 </script>
 
 <style>
diff --git a/src/views/edit/index.vue b/src/views/edit/index.vue
index b9534025..b67efa28 100644
--- a/src/views/edit/index.vue
+++ b/src/views/edit/index.vue
@@ -55,8 +55,8 @@ getDataBySession()
 
 // 返回父窗口
 function back() {
-  opener.name = Date.now()
-  window.open(opener.location.href, opener.name)
+  window.opener.name = Date.now()
+  window.open(window.opener.location.href, window.opener.name)
 }
 
 // 导入json文本
@@ -71,7 +71,7 @@ async function importJSON() {
 }
 
 // 同步 [画布页失去焦点时同步数据到JSON页,JSON页Ctrl+S 时同步数据到画布页]
-opener.addEventListener(SavePageEnum.CHART, (e: any) => {
+window.opener.addEventListener(SavePageEnum.CHART, (e: any) => {
   setSessionStorage(StorageEnum.GO_CHART_STORAGE_LIST, [e.detail])
   content.value = JSON.stringify(e.detail, undefined, 2)
 })
@@ -87,14 +87,14 @@ addEventListener('blur', updateSync)
 
 // 同步更新
 function updateSync() {
-  if (!opener) {
+  if (!window.opener) {
     return window['$message'].error('源窗口已关闭,视图同步失败')
   }
   try {
     const detail = JSON.parse(content.value)
     delete detail.id
     // 保持id不变
-    opener.dispatchEvent(new CustomEvent(SavePageEnum.JSON, { detail }))
+    window.opener.dispatchEvent(new CustomEvent(SavePageEnum.JSON, { detail }))
   } catch (e) {
     window['$message'].error('内容格式有误')
     console.log(e)
diff --git a/src/views/preview/wrapper.vue b/src/views/preview/wrapper.vue
index 242910be..d209438a 100644
--- a/src/views/preview/wrapper.vue
+++ b/src/views/preview/wrapper.vue
@@ -1,5 +1,5 @@
 <template>
-  <Preview :key="key"></Preview>
+  <preview :key="key"></preview>
 </template>
 
 <script setup lang="ts">
@@ -16,10 +16,10 @@ let localStorageInfo: ChartEditStorageType = getSessionStorageInfo() as ChartEdi
 
 // 数据变更 -> 同步sessionStorage -> reload页面 (重新执行Mounted)
 ;[SavePageEnum.JSON, SavePageEnum.CHART].forEach((saveEvent: string) => {
-  opener.addEventListener(saveEvent, (e: any) => {
+  if (!window.opener) return
+  window.opener.addEventListener(saveEvent, (e: any) => {
     setSessionStorage(StorageEnum.GO_CHART_STORAGE_LIST, [{ ...e.detail, id: localStorageInfo.id }])
     key.value = Date.now()
   })
 })
-
 </script>
diff --git a/types/global.d.ts b/types/global.d.ts
index cceade09..1b11026a 100644
--- a/types/global.d.ts
+++ b/types/global.d.ts
@@ -7,6 +7,8 @@ interface Window {
   $vue: any
   // 键盘按键记录
   $KeyboardActive?: { [T: string]: boolean }
+  // 编辑 JSON 的存储对象
+  opener: any
 }
 
 declare type Recordable<T = any> = Record<string, T>