diff --git a/CHANGELOG.md b/CHANGELOG.md
index dd736f8a..021d3b1c 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -8,8 +8,11 @@
 
 ## Feats
 
-- 更新 `vue` 版本至 `3.4.7`
-- 更新 `naive-ui` 版本至 `2.37.3`
+- 更新 `vue` 版本至 `3.4.14`
+- `naive-ui` 相关
+  - 更新 `naive-ui` 版本至 `2.37.3`
+  - 更替 `naive-ui` `cdn` 为 `https://cdnjs.cloudflare.com/ajax/libs/naive-ui/2.37.3/index.prod.js`
+  - 使用 `NFlex` 组件替换 `NSpace` 组件,查看 [官方文档](https://www.naiveui.com/zh-CN/dark/components/flex)
 - 更新最新版本 `vue` 后,更新 `createDiscreteApi` 方法注册上下文,改为函数包裹,避免 `slot default invoked outside of render` 警告
 - `menu store` 相关
   - 优化 `setupAppMenu` 方法,初始化时会拼接完整的 `fullPath`,避免 `url`, `menu value` 更新路由时重复处理 `path`,提高性能
@@ -30,6 +33,9 @@
   - 同步更新所有方法,使用 `fullPath` 代替 `path`
 - `useContextmenuCoordinate` 方法
   - 使用 `readonly` 方法包裹 `show` 属性
+  - 新增返回 `updateShow` 方法,允许手动更新 `show` 属性
+  - 新增 `options` 配置项 `clickOutside` 方法,允许配置点击元素外部区域的回调函数
+  - 更新对应 demo
   - 补充一些注释
 - 统一 `app-config` 的导入导出方式,现在统一为 `import { xxx } from '@/app-config'` 导入
 - 统一 `hooks` 包的导入导出方式,现在统一为 `import { xxx } from '@/hooks'` 导入
@@ -37,10 +43,16 @@
   - 开放 `APP_CATCH_KEY.appMenuKey` 属性,配置缓存读取字段
 - `useMaximize` 相关
   - 优化 `maximize` 方法,现在支持配置滚动位置
+- `cfg.ts` 相关
+  - `cfg.ts` 更名为 `vite.custom.config.ts`
+  - `cfg.ts` 类型包更名为 `viteCustomConfig.ts`
+- 由于 `cdn.staticfile.org` 停止服务,所以切换至 `cdnjs`
 
 ## Fixes
 
 - 修复 `RChart` 组件 `RChartInst` 类型不完整的问题
+- 修复读取默认缓存语言的时候没有正确使用 `APP_CATCH_KEY.localeLanguage` 的问题
+- 修复 `RTable` 全屏没有正确弹出提示信息问题
 
 ## 4.5.0
 
diff --git a/package.json b/package.json
index 47126338..13a2993c 100755
--- a/package.json
+++ b/package.json
@@ -34,7 +34,7 @@
   "dependencies": {
     "@vueuse/core": "^10.7.1",
     "awesome-qr": "2.1.5-rc.0",
-    "axios": "^1.6.2",
+    "axios": "^1.6.5",
     "clipboard": "^2.0.11",
     "crypto-js": "^4.1.1",
     "currency.js": "^2.0.4",
@@ -48,7 +48,7 @@
     "pinia": "^2.1.7",
     "pinia-plugin-persistedstate": "^3.2.0",
     "print-js": "^1.6.0",
-    "vue": "^3.4.7",
+    "vue": "^3.4.14",
     "vue-hooks-plus": "1.8.5",
     "vue-i18n": "^9.9.0",
     "vue-router": "^4.2.5",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 72d9f96e..4235b784 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -7,13 +7,13 @@ settings:
 dependencies:
   '@vueuse/core':
     specifier: ^10.7.1
-    version: 10.7.1(vue@3.4.7)
+    version: 10.7.1(vue@3.4.14)
   awesome-qr:
     specifier: 2.1.5-rc.0
     version: 2.1.5-rc.0
   axios:
-    specifier: ^1.6.2
-    version: 1.6.2
+    specifier: ^1.6.5
+    version: 1.6.5
   clipboard:
     specifier: ^2.0.11
     version: 2.0.11
@@ -43,10 +43,10 @@ dependencies:
     version: 1.1.0
   naive-ui:
     specifier: ^2.37.3
-    version: 2.37.3(vue@3.4.7)
+    version: 2.37.3(vue@3.4.14)
   pinia:
     specifier: ^2.1.7
-    version: 2.1.7(typescript@5.2.2)(vue@3.4.7)
+    version: 2.1.7(typescript@5.2.2)(vue@3.4.14)
   pinia-plugin-persistedstate:
     specifier: ^3.2.0
     version: 3.2.0(pinia@2.1.7)
@@ -54,17 +54,17 @@ dependencies:
     specifier: ^1.6.0
     version: 1.6.0
   vue:
-    specifier: ^3.4.7
-    version: 3.4.7(typescript@5.2.2)
+    specifier: ^3.4.14
+    version: 3.4.14(typescript@5.2.2)
   vue-hooks-plus:
     specifier: 1.8.5
-    version: 1.8.5(vue@3.4.7)
+    version: 1.8.5(vue@3.4.14)
   vue-i18n:
     specifier: ^9.9.0
-    version: 9.9.0(vue@3.4.7)
+    version: 9.9.0(vue@3.4.14)
   vue-router:
     specifier: ^4.2.5
-    version: 4.2.5(vue@3.4.7)
+    version: 4.2.5(vue@3.4.14)
   xlsx:
     specifier: ^0.18.5
     version: 0.18.5
@@ -108,10 +108,10 @@ devDependencies:
     version: 6.5.0(eslint@8.52.0)(typescript@5.2.2)
   '@vitejs/plugin-vue':
     specifier: ^5.0.0
-    version: 5.0.0(vite@5.0.10)(vue@3.4.7)
+    version: 5.0.0(vite@5.0.10)(vue@3.4.14)
   '@vitejs/plugin-vue-jsx':
     specifier: ^3.1.0
-    version: 3.1.0(vite@5.0.10)(vue@3.4.7)
+    version: 3.1.0(vite@5.0.10)(vue@3.4.14)
   '@vue-hooks-plus/resolvers':
     specifier: 1.2.4
     version: 1.2.4(vue-hooks-plus@1.8.5)
@@ -183,7 +183,7 @@ devDependencies:
     version: 0.16.6(@vueuse/core@10.7.1)
   unplugin-vue-components:
     specifier: ^0.25.2
-    version: 0.25.2(vue@3.4.7)
+    version: 0.25.2(vue@3.4.14)
   vite:
     specifier: ^5.0.10
     version: 5.0.10(@types/node@20.4.7)(sass@1.69.5)
@@ -927,12 +927,12 @@ packages:
       css-render: 0.15.12
     dev: false
 
-  /@css-render/vue3-ssr@0.15.12(vue@3.4.7):
+  /@css-render/vue3-ssr@0.15.12(vue@3.4.14):
     resolution: {integrity: sha512-AQLGhhaE0F+rwybRCkKUdzBdTEM/5PZBYy+fSYe1T9z9+yxMuV/k7ZRqa4M69X+EI1W8pa4kc9Iq2VjQkZx4rg==}
     peerDependencies:
       vue: ^3.0.11
     dependencies:
-      vue: 3.4.7(typescript@5.2.2)
+      vue: 3.4.14(typescript@5.2.2)
     dev: false
 
   /@emotion/hash@0.8.0:
@@ -1430,7 +1430,7 @@ packages:
       magic-string: 0.30.5
       mlly: 1.4.1
       source-map-js: 1.0.2
-      vue-i18n: 9.9.0(vue@3.4.7)
+      vue-i18n: 9.9.0(vue@3.4.14)
       yaml-eslint-parser: 1.2.2
     dev: true
 
@@ -1492,7 +1492,7 @@ packages:
       picocolors: 1.0.0
       source-map-js: 1.0.2
       unplugin: 1.4.0
-      vue-i18n: 9.9.0(vue@3.4.7)
+      vue-i18n: 9.9.0(vue@3.4.14)
     transitivePeerDependencies:
       - rollup
       - supports-color
@@ -2111,7 +2111,7 @@ packages:
     resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==}
     dev: true
 
-  /@vitejs/plugin-vue-jsx@3.1.0(vite@5.0.10)(vue@3.4.7):
+  /@vitejs/plugin-vue-jsx@3.1.0(vite@5.0.10)(vue@3.4.14):
     resolution: {integrity: sha512-w9M6F3LSEU5kszVb9An2/MmXNxocAnUb3WhRr8bHlimhDrXNt6n6D2nJQR3UXpGlZHh/EsgouOHCsM8V3Ln+WA==}
     engines: {node: ^14.18.0 || >=16.0.0}
     peerDependencies:
@@ -2122,12 +2122,12 @@ packages:
       '@babel/plugin-transform-typescript': 7.23.6(@babel/core@7.23.6)
       '@vue/babel-plugin-jsx': 1.1.5(@babel/core@7.23.6)
       vite: 5.0.10(@types/node@20.4.7)(sass@1.69.5)
-      vue: 3.4.7(typescript@5.2.2)
+      vue: 3.4.14(typescript@5.2.2)
     transitivePeerDependencies:
       - supports-color
     dev: true
 
-  /@vitejs/plugin-vue@5.0.0(vite@5.0.10)(vue@3.4.7):
+  /@vitejs/plugin-vue@5.0.0(vite@5.0.10)(vue@3.4.14):
     resolution: {integrity: sha512-7x5e8X4J1Wi4NxudGjJBd2OFerAi/0nzF80ojCzvfj347WVr0YSn82C8BSsgwSHzlk9Kw5xnZfj0/7RLnNwP5w==}
     engines: {node: ^18.0.0 || >=20.0.0}
     peerDependencies:
@@ -2135,7 +2135,7 @@ packages:
       vue: ^3.2.25
     dependencies:
       vite: 5.0.10(@types/node@20.4.7)(sass@1.69.5)
-      vue: 3.4.7(typescript@5.2.2)
+      vue: 3.4.14(typescript@5.2.2)
     dev: true
 
   /@volar/language-core@1.10.1:
@@ -2163,7 +2163,7 @@ packages:
       vue-hooks-plus: ^1.5.2
     dependencies:
       local-pkg: 0.4.3
-      vue-hooks-plus: 1.8.5(vue@3.4.7)
+      vue-hooks-plus: 1.8.5(vue@3.4.14)
     dev: true
 
   /@vue/babel-helper-vue-transform-on@1.1.5:
@@ -2207,11 +2207,11 @@ packages:
       source-map-js: 1.0.2
     dev: true
 
-  /@vue/compiler-core@3.4.7:
-    resolution: {integrity: sha512-hhCaE3pTMrlIJK7M/o3Xf7HV8+JoNTGOQ/coWS+V+pH6QFFyqtoXqQzpqsNp7UK17xYKua/MBiKj4e1vgZOBYw==}
+  /@vue/compiler-core@3.4.14:
+    resolution: {integrity: sha512-ro4Zzl/MPdWs7XwxT7omHRxAjMbDFRZEEjD+2m3NBf8YzAe3HuoSEZosXQo+m1GQ1G3LQ1LdmNh1RKTYe+ssEg==}
     dependencies:
       '@babel/parser': 7.23.6
-      '@vue/shared': 3.4.7
+      '@vue/shared': 3.4.14
       entities: 4.5.0
       estree-walker: 2.0.2
       source-map-js: 1.0.2
@@ -2230,11 +2230,11 @@ packages:
       '@vue/shared': 3.3.8
     dev: true
 
-  /@vue/compiler-dom@3.4.7:
-    resolution: {integrity: sha512-qDKBAIurCTub4n/6jDYkXwgsFuriqqmmLrIq1N2QDfYJA/mwiwvxi09OGn28g+uDdERX9NaKDLji0oTjE3sScg==}
+  /@vue/compiler-dom@3.4.14:
+    resolution: {integrity: sha512-nOZTY+veWNa0DKAceNWxorAbWm0INHdQq7cejFaWM1WYnoNSJbSEKYtE7Ir6lR/+mo9fttZpPVI9ZFGJ1juUEQ==}
     dependencies:
-      '@vue/compiler-core': 3.4.7
-      '@vue/shared': 3.4.7
+      '@vue/compiler-core': 3.4.14
+      '@vue/shared': 3.4.14
 
   /@vue/compiler-sfc@3.3.8:
     resolution: {integrity: sha512-WMzbUrlTjfYF8joyT84HfwwXo+8WPALuPxhy+BZ6R4Aafls+jDBnSz8PDz60uFhuqFbl3HxRfxvDzrUf3THwpA==}
@@ -2251,17 +2251,17 @@ packages:
       source-map-js: 1.0.2
     dev: true
 
-  /@vue/compiler-sfc@3.4.7:
-    resolution: {integrity: sha512-Gec6CLkReVswDYjQFq79O5rktri4R7TsD/VPCiUoJw40JhNNxaNJJa8mrQrWoJluW4ETy6QN0NUyC/JO77OCOw==}
+  /@vue/compiler-sfc@3.4.14:
+    resolution: {integrity: sha512-1vHc9Kv1jV+YBZC/RJxQJ9JCxildTI+qrhtDh6tPkR1O8S+olBUekimY0km0ZNn8nG1wjtFAe9XHij+YLR8cRQ==}
     dependencies:
       '@babel/parser': 7.23.6
-      '@vue/compiler-core': 3.4.7
-      '@vue/compiler-dom': 3.4.7
-      '@vue/compiler-ssr': 3.4.7
-      '@vue/shared': 3.4.7
+      '@vue/compiler-core': 3.4.14
+      '@vue/compiler-dom': 3.4.14
+      '@vue/compiler-ssr': 3.4.14
+      '@vue/shared': 3.4.14
       estree-walker: 2.0.2
       magic-string: 0.30.5
-      postcss: 8.4.32
+      postcss: 8.4.33
       source-map-js: 1.0.2
 
   /@vue/compiler-ssr@3.3.8:
@@ -2271,11 +2271,11 @@ packages:
       '@vue/shared': 3.3.8
     dev: true
 
-  /@vue/compiler-ssr@3.4.7:
-    resolution: {integrity: sha512-PvYeSOvnCkST5mGS0TLwEn5w+4GavtEn6adcq8AspbHaIr+mId5hp7cG3ASy3iy8b+LuXEG2/QaV/nj5BQ/Aww==}
+  /@vue/compiler-ssr@3.4.14:
+    resolution: {integrity: sha512-bXT6+oAGlFjTYVOTtFJ4l4Jab1wjsC0cfSfOe2B4Z0N2vD2zOBSQ9w694RsCfhjk+bC2DY5Gubb1rHZVii107Q==}
     dependencies:
-      '@vue/compiler-dom': 3.4.7
-      '@vue/shared': 3.4.7
+      '@vue/compiler-dom': 3.4.14
+      '@vue/shared': 3.4.14
 
   /@vue/devtools-api@6.5.1:
     resolution: {integrity: sha512-+KpckaAQyfbvshdDW5xQylLni1asvNSGme1JFs8I1+/H5pHEhqUKMEQD/qn3Nx5+/nycBq11qAEi8lk+LXI2dA==}
@@ -2350,32 +2350,32 @@ packages:
       '@vue/shared': 3.3.8
     dev: true
 
-  /@vue/reactivity@3.4.7:
-    resolution: {integrity: sha512-F539DO0ogH0+L8F9Pnw7cjqibcmSOh5UTk16u5f4MKQ8fraqepI9zdh+sozPX6VmEHOcjo8qw3Or9ZcFFw4SZA==}
+  /@vue/reactivity@3.4.14:
+    resolution: {integrity: sha512-xRYwze5Q4tK7tT2J4uy4XLhK/AIXdU5EBUu9PLnIHcOKXO0uyXpNNMzlQKuq7B+zwtq6K2wuUL39pHA6ZQzObw==}
     dependencies:
-      '@vue/shared': 3.4.7
+      '@vue/shared': 3.4.14
 
-  /@vue/runtime-core@3.4.7:
-    resolution: {integrity: sha512-QMMsWRQaD3BpGyjjChthpl4Mji4Fjx1qfdufsXlDkKU3HV+hWNor2z+29F+E1MmVcP0ZfRZUfqYgtsQoL7IGwQ==}
+  /@vue/runtime-core@3.4.14:
+    resolution: {integrity: sha512-qu+NMkfujCoZL6cfqK5NOfxgXJROSlP2ZPs4CTcVR+mLrwl4TtycF5Tgo0QupkdBL+2kigc6EsJlTcuuZC1NaQ==}
     dependencies:
-      '@vue/reactivity': 3.4.7
-      '@vue/shared': 3.4.7
+      '@vue/reactivity': 3.4.14
+      '@vue/shared': 3.4.14
 
-  /@vue/runtime-dom@3.4.7:
-    resolution: {integrity: sha512-XwegyUY1rw8zxsX1Z36vwYcqo+uOgih5ti7y9vx+pPFhNdSQmN4LqK2RmSeAJG1oKV8NqSUmjpv92f/x6h0SeQ==}
+  /@vue/runtime-dom@3.4.14:
+    resolution: {integrity: sha512-B85XmcR4E7XsirEHVqhmy4HPbRT9WLFWV9Uhie3OapV9m1MEN9+Er6hmUIE6d8/l2sUygpK9RstFM2bmHEUigA==}
     dependencies:
-      '@vue/runtime-core': 3.4.7
-      '@vue/shared': 3.4.7
+      '@vue/runtime-core': 3.4.14
+      '@vue/shared': 3.4.14
       csstype: 3.1.3
 
-  /@vue/server-renderer@3.4.7(vue@3.4.7):
-    resolution: {integrity: sha512-3bWnYLEkLLhkDWqvNk7IvbQD4UcxvFKxELBiOO2iG3m6AniFIsBWfHOO5tLVQnjdWkODu4rq0GipmfEenVAK5Q==}
+  /@vue/server-renderer@3.4.14(vue@3.4.14):
+    resolution: {integrity: sha512-pwSKXQfYdJBTpvWHGEYI+akDE18TXAiLcGn+Q/2Fj8wQSHWztoo7PSvfMNqu6NDhp309QXXbPFEGCU5p85HqkA==}
     peerDependencies:
-      vue: 3.4.7
+      vue: 3.4.14
     dependencies:
-      '@vue/compiler-ssr': 3.4.7
-      '@vue/shared': 3.4.7
-      vue: 3.4.7(typescript@5.2.2)
+      '@vue/compiler-ssr': 3.4.14
+      '@vue/shared': 3.4.14
+      vue: 3.4.14(typescript@5.2.2)
 
   /@vue/shared@3.3.13:
     resolution: {integrity: sha512-/zYUwiHD8j7gKx2argXEMCUXVST6q/21DFU0sTfNX0URJroCe3b1UF6vLJ3lQDfLNIiiRl2ONp7Nh5UVWS6QnA==}
@@ -2385,8 +2385,8 @@ packages:
     resolution: {integrity: sha512-8PGwybFwM4x8pcfgqEQFy70NaQxASvOC5DJwLQfpArw1UDfUXrJkdxD3BhVTMS+0Lef/TU7YO0Jvr0jJY8T+mw==}
     dev: true
 
-  /@vue/shared@3.4.7:
-    resolution: {integrity: sha512-G+i4glX1dMJk88sbJEcQEGWRQnVm9eIY7CcQbO5dpdsD9SF8jka3Mr5OqZYGjczGN1+D6EUwdu6phcmcx9iuPA==}
+  /@vue/shared@3.4.14:
+    resolution: {integrity: sha512-nmi3BtLpvqXAWoRZ6HQ+pFJOHBU4UnH3vD3opgmwXac7vhaHKA9nj1VeGjMggdB9eLtW83eHyPCmOU1qzdsC7Q==}
 
   /@vue/typescript@1.8.8(typescript@5.2.2):
     resolution: {integrity: sha512-jUnmMB6egu5wl342eaUH236v8tdcEPXXkPgj+eI/F6JwW/lb+yAU6U07ZbQ3MVabZRlupIlPESB7ajgAGixhow==}
@@ -2397,13 +2397,13 @@ packages:
       - typescript
     dev: true
 
-  /@vueuse/core@10.7.1(vue@3.4.7):
+  /@vueuse/core@10.7.1(vue@3.4.14):
     resolution: {integrity: sha512-74mWHlaesJSWGp1ihg76vAnfVq9NTv1YT0SYhAQ6zwFNdBkkP+CKKJmVOEHcdSnLXCXYiL5e7MaewblfiYLP7g==}
     dependencies:
       '@types/web-bluetooth': 0.0.20
       '@vueuse/metadata': 10.7.1
-      '@vueuse/shared': 10.7.1(vue@3.4.7)
-      vue-demi: 0.14.6(vue@3.4.7)
+      '@vueuse/shared': 10.7.1(vue@3.4.14)
+      vue-demi: 0.14.6(vue@3.4.14)
     transitivePeerDependencies:
       - '@vue/composition-api'
       - vue
@@ -2411,10 +2411,10 @@ packages:
   /@vueuse/metadata@10.7.1:
     resolution: {integrity: sha512-jX8MbX5UX067DYVsbtrmKn6eG6KMcXxLRLlurGkZku5ZYT3vxgBjui2zajvUZ18QLIjrgBkFRsu7CqTAg18QFw==}
 
-  /@vueuse/shared@10.7.1(vue@3.4.7):
+  /@vueuse/shared@10.7.1(vue@3.4.14):
     resolution: {integrity: sha512-v0jbRR31LSgRY/C5i5X279A/WQjD6/JsMzGa+eqt658oJ75IvQXAeONmwvEMrvJQKnRElq/frzBR7fhmWY5uLw==}
     dependencies:
-      vue-demi: 0.14.6(vue@3.4.7)
+      vue-demi: 0.14.6(vue@3.4.14)
     transitivePeerDependencies:
       - '@vue/composition-api'
       - vue
@@ -2810,10 +2810,10 @@ packages:
       - supports-color
     dev: false
 
-  /axios@1.6.2:
-    resolution: {integrity: sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==}
+  /axios@1.6.5:
+    resolution: {integrity: sha512-Ii012v05KEVuUoFWmMW/UQv9aRIc3ZwkWDcM+h5Il8izZCtRVpDUfwpoFf7eOtajT3QiGR4yDUx7lPqHJULgbg==}
     dependencies:
-      follow-redirects: 1.15.3
+      follow-redirects: 1.15.5
       form-data: 4.0.0
       proxy-from-env: 1.1.0
     transitivePeerDependencies:
@@ -4555,8 +4555,8 @@ packages:
     resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==}
     dev: true
 
-  /follow-redirects@1.15.3:
-    resolution: {integrity: sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==}
+  /follow-redirects@1.15.5:
+    resolution: {integrity: sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==}
     engines: {node: '>=4.0'}
     peerDependencies:
       debug: '*'
@@ -5978,13 +5978,13 @@ packages:
       minimatch: 3.1.2
     dev: true
 
-  /naive-ui@2.37.3(vue@3.4.7):
+  /naive-ui@2.37.3(vue@3.4.14):
     resolution: {integrity: sha512-aUkHFXVIluSi8Me+npbcsdv1NYhVMj5t9YaruoCESlqmfqspj+R2QHEVXkTtUI1kQwVrABMCtAGq/wountqjZA==}
     peerDependencies:
       vue: ^3.0.0
     dependencies:
       '@css-render/plugin-bem': 0.15.12(css-render@0.15.12)
-      '@css-render/vue3-ssr': 0.15.12(vue@3.4.7)
+      '@css-render/vue3-ssr': 0.15.12(vue@3.4.14)
       '@types/katex': 0.16.7
       '@types/lodash': 4.14.202
       '@types/lodash-es': 4.17.11
@@ -5999,10 +5999,10 @@ packages:
       lodash-es: 4.17.21
       seemly: 0.3.8
       treemate: 0.3.11
-      vdirs: 0.1.8(vue@3.4.7)
-      vooks: 0.2.12(vue@3.4.7)
-      vue: 3.4.7(typescript@5.2.2)
-      vueuc: 0.4.58(vue@3.4.7)
+      vdirs: 0.1.8(vue@3.4.14)
+      vooks: 0.2.12(vue@3.4.14)
+      vue: 3.4.14(typescript@5.2.2)
+      vueuc: 0.4.58(vue@3.4.14)
     dev: false
 
   /nan@2.17.0:
@@ -6389,10 +6389,10 @@ packages:
     peerDependencies:
       pinia: ^2.0.0
     dependencies:
-      pinia: 2.1.7(typescript@5.2.2)(vue@3.4.7)
+      pinia: 2.1.7(typescript@5.2.2)(vue@3.4.14)
     dev: false
 
-  /pinia@2.1.7(typescript@5.2.2)(vue@3.4.7):
+  /pinia@2.1.7(typescript@5.2.2)(vue@3.4.14):
     resolution: {integrity: sha512-+C2AHFtcFqjPih0zpYuvof37SFxMQ7OEG2zV9jRI12i9BOy3YQVAHwdKtyyc8pDcDyIc33WCIsZaCFWU7WWxGQ==}
     peerDependencies:
       '@vue/composition-api': ^1.4.0
@@ -6406,8 +6406,8 @@ packages:
     dependencies:
       '@vue/devtools-api': 6.5.1
       typescript: 5.2.2
-      vue: 3.4.7(typescript@5.2.2)
-      vue-demi: 0.14.6(vue@3.4.7)
+      vue: 3.4.14(typescript@5.2.2)
+      vue-demi: 0.14.6(vue@3.4.14)
     dev: false
 
   /pkg-types@1.0.3:
@@ -6481,6 +6481,15 @@ packages:
       nanoid: 3.3.7
       picocolors: 1.0.0
       source-map-js: 1.0.2
+    dev: true
+
+  /postcss@8.4.33:
+    resolution: {integrity: sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==}
+    engines: {node: ^10 || ^12 || >=14}
+    dependencies:
+      nanoid: 3.3.7
+      picocolors: 1.0.0
+      source-map-js: 1.0.2
 
   /posthtml-parser@0.2.1:
     resolution: {integrity: sha512-nPC53YMqJnc/+1x4fRYFfm81KV2V+G9NZY+hTohpYg64Ay7NemWWcV4UWuy/SgMupqQ3kJ88M/iRfZmSnxT+pw==}
@@ -7680,7 +7689,7 @@ packages:
     dependencies:
       '@antfu/utils': 0.7.6
       '@rollup/pluginutils': 5.0.4
-      '@vueuse/core': 10.7.1(vue@3.4.7)
+      '@vueuse/core': 10.7.1(vue@3.4.14)
       fast-glob: 3.3.1
       local-pkg: 0.4.3
       magic-string: 0.30.5
@@ -7691,7 +7700,7 @@ packages:
       - rollup
     dev: true
 
-  /unplugin-vue-components@0.25.2(vue@3.4.7):
+  /unplugin-vue-components@0.25.2(vue@3.4.14):
     resolution: {integrity: sha512-OVmLFqILH6w+eM8fyt/d/eoJT9A6WO51NZLf1vC5c1FZ4rmq2bbGxTy8WP2Jm7xwFdukaIdv819+UI7RClPyCA==}
     engines: {node: '>=14'}
     peerDependencies:
@@ -7714,7 +7723,7 @@ packages:
       minimatch: 9.0.3
       resolve: 1.22.5
       unplugin: 1.4.0
-      vue: 3.4.7(typescript@5.2.2)
+      vue: 3.4.14(typescript@5.2.2)
     transitivePeerDependencies:
       - rollup
       - supports-color
@@ -7805,13 +7814,13 @@ packages:
     engines: {node: '>= 0.8'}
     dev: true
 
-  /vdirs@0.1.8(vue@3.4.7):
+  /vdirs@0.1.8(vue@3.4.14):
     resolution: {integrity: sha512-H9V1zGRLQZg9b+GdMk8MXDN2Lva0zx72MPahDKc30v+DtwKjfyOSXWRIX4t2mhDubM1H09gPhWeth/BJWPHGUw==}
     peerDependencies:
       vue: ^3.0.11
     dependencies:
       evtd: 0.2.4
-      vue: 3.4.7(typescript@5.2.2)
+      vue: 3.4.14(typescript@5.2.2)
     dev: false
 
   /vite-plugin-cdn2@0.15.2:
@@ -7994,16 +8003,16 @@ packages:
       fsevents: 2.3.3
     dev: true
 
-  /vooks@0.2.12(vue@3.4.7):
+  /vooks@0.2.12(vue@3.4.14):
     resolution: {integrity: sha512-iox0I3RZzxtKlcgYaStQYKEzWWGAduMmq+jS7OrNdQo1FgGfPMubGL3uGHOU9n97NIvfFDBGnpSvkWyb/NSn/Q==}
     peerDependencies:
       vue: ^3.0.0
     dependencies:
       evtd: 0.2.4
-      vue: 3.4.7(typescript@5.2.2)
+      vue: 3.4.14(typescript@5.2.2)
     dev: false
 
-  /vue-demi@0.14.6(vue@3.4.7):
+  /vue-demi@0.14.6(vue@3.4.14):
     resolution: {integrity: sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==}
     engines: {node: '>=12'}
     hasBin: true
@@ -8015,7 +8024,7 @@ packages:
       '@vue/composition-api':
         optional: true
     dependencies:
-      vue: 3.4.7(typescript@5.2.2)
+      vue: 3.4.14(typescript@5.2.2)
 
   /vue-eslint-parser@9.3.1(eslint@8.52.0):
     resolution: {integrity: sha512-Clr85iD2XFZ3lJ52/ppmUDG/spxQu6+MAeHXjjyI4I1NUYZ9xmenQp4N0oaHJhrA8OOxltCVxMRfANGa70vU0g==}
@@ -8035,7 +8044,7 @@ packages:
       - supports-color
     dev: true
 
-  /vue-hooks-plus@1.8.5(vue@3.4.7):
+  /vue-hooks-plus@1.8.5(vue@3.4.14):
     resolution: {integrity: sha512-cIatTWz6QQcoSCDn7jadQ3zMr799FmNiHyb59yUvR7Ws5KDJ/KdIMHHx/b0XDKzbGhQ61kcJ78zJKAKhOV0pWw==}
     peerDependencies:
       vue: ^3.2.25
@@ -8047,9 +8056,9 @@ packages:
       qs: 6.11.2
       query-string: 7.1.3
       screenfull: 5.2.0
-      vue: 3.4.7(typescript@5.2.2)
+      vue: 3.4.14(typescript@5.2.2)
 
-  /vue-i18n@9.9.0(vue@3.4.7):
+  /vue-i18n@9.9.0(vue@3.4.14):
     resolution: {integrity: sha512-xQ5SxszUAqK5n84N+uUyHH/PiQl9xZ24FOxyAaNonmOQgXeN+rD9z/6DStOpOxNFQn4Cgcquot05gZc+CdOujA==}
     engines: {node: '>= 16'}
     peerDependencies:
@@ -8058,15 +8067,15 @@ packages:
       '@intlify/core-base': 9.9.0
       '@intlify/shared': 9.9.0
       '@vue/devtools-api': 6.5.1
-      vue: 3.4.7(typescript@5.2.2)
+      vue: 3.4.14(typescript@5.2.2)
 
-  /vue-router@4.2.5(vue@3.4.7):
+  /vue-router@4.2.5(vue@3.4.14):
     resolution: {integrity: sha512-DIUpKcyg4+PTQKfFPX88UWhlagBEBEfJ5A8XDXRJLUnZOvcpMF8o/dnL90vpVkGaPbjvXazV/rC1qBKrZlFugw==}
     peerDependencies:
       vue: ^3.2.0
     dependencies:
       '@vue/devtools-api': 6.5.1
-      vue: 3.4.7(typescript@5.2.2)
+      vue: 3.4.14(typescript@5.2.2)
     dev: false
 
   /vue-template-compiler@2.7.14:
@@ -8088,34 +8097,34 @@ packages:
       typescript: 5.2.2
     dev: true
 
-  /vue@3.4.7(typescript@5.2.2):
-    resolution: {integrity: sha512-4urmkWpudekq0CPNMO7p6mBGa9qmTXwJMO2r6CT4EzIJVG7WoSReiysiNb7OSi/WI113oX0Srn9Rz1k/DCXKFQ==}
+  /vue@3.4.14(typescript@5.2.2):
+    resolution: {integrity: sha512-Rop5Al/ZcBbBz+KjPZaZDgHDX0kUP4duEzDbm+1o91uxYUNmJrZSBuegsNIJvUGy+epLevNRNhLjm08VKTgGyw==}
     peerDependencies:
       typescript: '*'
     peerDependenciesMeta:
       typescript:
         optional: true
     dependencies:
-      '@vue/compiler-dom': 3.4.7
-      '@vue/compiler-sfc': 3.4.7
-      '@vue/runtime-dom': 3.4.7
-      '@vue/server-renderer': 3.4.7(vue@3.4.7)
-      '@vue/shared': 3.4.7
+      '@vue/compiler-dom': 3.4.14
+      '@vue/compiler-sfc': 3.4.14
+      '@vue/runtime-dom': 3.4.14
+      '@vue/server-renderer': 3.4.14(vue@3.4.14)
+      '@vue/shared': 3.4.14
       typescript: 5.2.2
 
-  /vueuc@0.4.58(vue@3.4.7):
+  /vueuc@0.4.58(vue@3.4.14):
     resolution: {integrity: sha512-Wnj/N8WbPRSxSt+9ji1jtDHPzda5h2OH/0sFBhvdxDRuyCZbjGg3/cKMaKqEoe+dErTexG2R+i6Q8S/Toq1MYg==}
     peerDependencies:
       vue: ^3.0.11
     dependencies:
-      '@css-render/vue3-ssr': 0.15.12(vue@3.4.7)
+      '@css-render/vue3-ssr': 0.15.12(vue@3.4.14)
       '@juggle/resize-observer': 3.4.0
       css-render: 0.15.12
       evtd: 0.2.4
       seemly: 0.3.8
-      vdirs: 0.1.8(vue@3.4.7)
-      vooks: 0.2.12(vue@3.4.7)
-      vue: 3.4.7(typescript@5.2.2)
+      vdirs: 0.1.8(vue@3.4.14)
+      vooks: 0.2.12(vue@3.4.14)
+      vue: 3.4.14(typescript@5.2.2)
     dev: false
 
   /webidl-conversions@3.0.1:
diff --git a/src/app-components/app/AppAvatar/index.tsx b/src/app-components/app/AppAvatar/index.tsx
index 73696d0c..b977b47f 100644
--- a/src/app-components/app/AppAvatar/index.tsx
+++ b/src/app-components/app/AppAvatar/index.tsx
@@ -19,9 +19,9 @@
 
 import './index.scss'
 
-import { NAvatar, NSpace } from 'naive-ui'
+import { NAvatar, NFlex } from 'naive-ui'
 
-import { avatarProps, spaceProps } from 'naive-ui'
+import { avatarProps, flexProps } from 'naive-ui'
 import { APP_CATCH_KEY } from '@/app-config'
 import { getStorage } from '@/utils'
 
@@ -33,7 +33,7 @@ const AppAvatar = defineComponent({
   name: 'AppAvatar',
   props: {
     ...avatarProps,
-    ...spaceProps,
+    ...flexProps,
     cursor: {
       type: String,
       default: 'auto',
@@ -64,12 +64,11 @@ const AppAvatar = defineComponent({
   },
   render() {
     return (
-      <NSpace
+      <NFlex
         class="app-avatar"
         {...this.$props}
         style={this.cssVars}
         size={this.spaceSize}
-        wrapItem={false}
       >
         <NAvatar
           // eslint-disable-next-line prettier/prettier, @typescript-eslint/no-explicit-any
@@ -80,7 +79,7 @@ const AppAvatar = defineComponent({
           size={this.avatarSize}
         />
         <div class="app-avatar__name">{this.signing?.name}</div>
-      </NSpace>
+      </NFlex>
     )
   },
 })
diff --git a/src/app-components/app/AppLockScreen/components/UnlockScreen/index.tsx b/src/app-components/app/AppLockScreen/components/UnlockScreen/index.tsx
index d2c31e2d..67a739ab 100644
--- a/src/app-components/app/AppLockScreen/components/UnlockScreen/index.tsx
+++ b/src/app-components/app/AppLockScreen/components/UnlockScreen/index.tsx
@@ -11,7 +11,7 @@
 
 /** 解锁界面 */
 
-import { NInput, NForm, NFormItem, NButton, NSpace } from 'naive-ui'
+import { NInput, NForm, NFormItem, NButton, NFlex } from 'naive-ui'
 import AppAvatar from '@/app-components/app/AppAvatar'
 
 import dayjs from 'dayjs'
@@ -137,14 +137,14 @@ export default defineComponent({
                   }}
                 />
               </NFormItem>
-              <NSpace justify="space-between">
+              <NFlex justify="space-between">
                 <NButton type="primary" text onClick={backToSigning.bind(this)}>
                   返回登陆
                 </NButton>
                 <NButton type="primary" text onClick={unlockScreen.bind(this)}>
                   进入系统
                 </NButton>
-              </NSpace>
+              </NFlex>
             </NForm>
           </div>
           <div class="app-lock-screen__unlock__content-date">
diff --git a/src/app-components/app/RayLink/index.tsx b/src/app-components/app/RayLink/index.tsx
index 5ca52f8c..908e38ec 100644
--- a/src/app-components/app/RayLink/index.tsx
+++ b/src/app-components/app/RayLink/index.tsx
@@ -3,7 +3,7 @@
  * 友情链接组件,无实际项目意义
  */
 
-import { NAvatar, NTooltip, NSpace } from 'naive-ui'
+import { NAvatar, NTooltip, NFlex } from 'naive-ui'
 
 interface AvatarOptions {
   key: string
@@ -65,7 +65,7 @@ export default defineComponent({
   },
   render() {
     return (
-      <NSpace>
+      <NFlex>
         {this.avatarOptions.map((curr) => (
           <NTooltip key={curr.key}>
             {{
@@ -85,7 +85,7 @@ export default defineComponent({
             }}
           </NTooltip>
         ))}
-      </NSpace>
+      </NFlex>
     )
   },
 })
diff --git a/src/components/RCollapseGrid/src/index.tsx b/src/components/RCollapseGrid/src/index.tsx
index 9c4babe1..6b3f4244 100644
--- a/src/components/RCollapseGrid/src/index.tsx
+++ b/src/components/RCollapseGrid/src/index.tsx
@@ -21,7 +21,7 @@
 
 import './index.scss'
 
-import { NCard, NGrid, NGridItem, NSpace } from 'naive-ui'
+import { NCard, NGrid, NGridItem, NFlex } from 'naive-ui'
 import { RIcon } from '@/components'
 
 import { call } from '@/utils'
@@ -85,10 +85,10 @@ export default defineComponent({
             >
               {this.$slots.default?.()}
               <NGridItem suffix class="ray-collapse-grid__suffix--btn">
-                <NSpace justify="end">
+                <NFlex justify="end">
                   {this.$slots.action?.()}
                   {this.CollapseIcon()}
-                </NSpace>
+                </NFlex>
               </NGridItem>
             </NGrid>
           ),
diff --git a/src/components/RTable/src/Table.tsx b/src/components/RTable/src/Table.tsx
index aaad7d3c..6f947985 100644
--- a/src/components/RTable/src/Table.tsx
+++ b/src/components/RTable/src/Table.tsx
@@ -11,7 +11,7 @@
 
 import './index.scss'
 
-import { NCard, NDataTable, NDropdown, NSpace } from 'naive-ui'
+import { NCard, NDataTable, NDropdown, NFlex } from 'naive-ui'
 import Size from './components/Size'
 import Fullscreen from './components/Fullscreen'
 import C from './components/C'
@@ -238,10 +238,10 @@ export default defineComponent({
             defaultElement: <div style="display: none;"></div>,
           }),
           'header-extra': () => (
-            <NSpace align="center">
+            <NFlex align="center">
               {/* eslint-disable @typescript-eslint/no-explicit-any */}
               {tool(this.$props as any)}
-            </NSpace>
+            </NFlex>
           ),
           footer: () => this.$slots.tableFooter?.(),
           action: () => this.$slots.tableAction?.(),
diff --git a/src/components/RTable/src/components/C.tsx b/src/components/RTable/src/components/C.tsx
index 636fabea..86d0237d 100644
--- a/src/components/RTable/src/components/C.tsx
+++ b/src/components/RTable/src/components/C.tsx
@@ -18,7 +18,7 @@
  * 2. 大量数据的时候,可能会出现性能问题
  */
 
-import { NPopover, NSpace, NTree } from 'naive-ui'
+import { NPopover, NFlex, NTree } from 'naive-ui'
 import { RIcon } from '@/components'
 
 import config from '../config'
@@ -97,6 +97,8 @@ const findSiblingsAndIndex = (
   return [null, null]
 }
 
+const R_TABLE_C_TOOL_ICON_ACTIVE = 'r-table__c-tool-icon--active'
+
 export default defineComponent({
   name: 'TableC',
   props: {
@@ -129,12 +131,12 @@ export default defineComponent({
           return {
             ...attr,
             suffix: () => (
-              <NSpace style="padding-left: 32px;">
+              <NFlex style="padding-left: 32px;">
                 <RowIconRender
                   icon="row_head"
                   title="固定在列首"
                   customClassName={
-                    isLeftFixedActivated ? 'r-table__c-tool-icon--active' : ''
+                    isLeftFixedActivated ? R_TABLE_C_TOOL_ICON_ACTIVE : ''
                   }
                   onClick={fixedClick.bind(this, 'left', attr, idx)}
                 />
@@ -146,7 +148,7 @@ export default defineComponent({
                         size={config.tableIconSize}
                         cursor="pointer"
                         customClassName={
-                          isResizable ? 'r-table__c-tool-icon--active' : ''
+                          isResizable ? R_TABLE_C_TOOL_ICON_ACTIVE : ''
                         }
                         onClick={resizableClick.bind(this, attr, idx)}
                       />
@@ -158,11 +160,11 @@ export default defineComponent({
                   icon="row_end"
                   title="固定在列尾"
                   customClassName={
-                    isRightFixedActivated ? 'r-table__c-tool-icon--active' : ''
+                    isRightFixedActivated ? R_TABLE_C_TOOL_ICON_ACTIVE : ''
                   }
                   onClick={fixedClick.bind(this, 'right', attr, idx)}
                 />
-              </NSpace>
+              </NFlex>
             ),
           }
         }) as C[]
diff --git a/src/components/RTable/src/components/Fullscreen.tsx b/src/components/RTable/src/components/Fullscreen.tsx
index 3c829cf9..653ab0f5 100644
--- a/src/components/RTable/src/components/Fullscreen.tsx
+++ b/src/components/RTable/src/components/Fullscreen.tsx
@@ -46,7 +46,9 @@ export default defineComponent({
               cursor="pointer"
               onClick={() => {
                 if (!isEnabled) {
-                  $t('globalMessage.isEnabledFullscreen')
+                  window.$message.warning(
+                    $t('globalMessage.isEnabledFullscreen'),
+                  )
                 }
 
                 toggleFullscreen()
diff --git a/src/directives/README_DIR.md b/src/directives/README_DIR.md
index 382f1a0b..8e76c48e 100644
--- a/src/directives/README_DIR.md
+++ b/src/directives/README_DIR.md
@@ -8,7 +8,7 @@
 #### 示例
 
 ```tsx
-import { NSpace, NCard, NInput, NInputGroup, NButton, NSwitch } from 'naive-ui'
+import { NFlex, NCard, NInput, NInputGroup, NButton, NSwitch } from 'naive-ui'
 
 const Demo = defineComponent({
   name: 'Demo',
@@ -46,7 +46,7 @@ const Demo = defineComponent({
 #### 示例
 
 ```tsx
-import { NSpace, NCard, NInput, NInputGroup, NButton, NSwitch } from 'naive-ui'
+import { NFlex, NCard, NInput, NInputGroup, NButton, NSwitch } from 'naive-ui'
 
 const Demo = defineComponent({
   name: 'Demo',
@@ -64,7 +64,7 @@ const Demo = defineComponent({
   },
   render() {
     return (
-      <NSpace wrapItem={true} vertical>
+      <NFlex wrapItem={true} vertical>
         <NButton
           v-debounce={{
             func: this.updateDemoValue,
@@ -77,7 +77,7 @@ const Demo = defineComponent({
         </NButton>
         <p>我执行了{this.demoValue}次</p>
         <p>该方法将延迟 1s 执行</p>
-      </NSpace>
+      </NFlex>
     )
   },
 })
@@ -99,7 +99,7 @@ const Demo = defineComponent({
 #### 示例
 
 ```tsx
-import { NSpace, NCard, NInput, NInputGroup, NButton, NSwitch } from 'naive-ui'
+import { NFlex, NCard, NInput, NInputGroup, NButton, NSwitch } from 'naive-ui'
 
 const Demo = defineComponent({
   name: 'Demo',
@@ -117,7 +117,7 @@ const Demo = defineComponent({
   },
   render() {
     return (
-      <NSpace wrapItem={true} vertical>
+      <NFlex wrapItem={true} vertical>
         <NButton
           v-throttle={{
             func: this.updateDemoValue,
@@ -130,7 +130,7 @@ const Demo = defineComponent({
         </NButton>
         <p>我执行了{this.demoValue}次</p>
         <p>该方法 1s 内仅会执行一次</p>
-      </NSpace>
+      </NFlex>
     )
   },
 })
@@ -149,7 +149,7 @@ const Demo = defineComponent({
 
 ```tsx
 import {
-  NSpace,
+  NFlex,
   NCard,
   NInput,
   NInputGroup,
@@ -170,7 +170,7 @@ const Demo = defineComponent({
   },
   render() {
     return (
-      <NSpace vertical>
+      <NFlex vertical>
         <NSwitch v-model:value={this.disabledValue}>
           {{
             checked: () => '取消',
@@ -182,22 +182,22 @@ const Demo = defineComponent({
           组件提供了完整的 disabled
           属性,所以在组件库有禁用需求时,直接调用组件库 disabled 属性即可
         </p>
-        <NSpace vertical wrapItem={false}>
+        <NFlex vertical wrapItem={false}>
           <NCard title="原生表单" bordered={false}>
-            <NSpace vertical wrapItem={false}>
+            <NFlex vertical wrapItem={false}>
               <form v-disabled={this.disabledValue}>
                 <input type="text" placeholder="请输入" />
                 <button>提交</button>
               </form>
-            </NSpace>
+            </NFlex>
           </NCard>
           <NCard title="文本内容" bordered={false}>
-            <NSpace vertical wrapItem={false}>
+            <NFlex vertical wrapItem={false}>
               <p v-disabled={this.disabledValue}>我是可以被禁用的文本内容</p>
-            </NSpace>
+            </NFlex>
           </NCard>
           <NCard title="naive 组件" bordered={false}>
-            <NSpace vertical wrapItem={false} justify="start">
+            <NFlex vertical wrapItem={false} justify="start">
               <NButton v-disabled={this.disabledValue}>按钮</NButton>
               <NForm v-disabled={this.disabledValue}>
                 <NFormItem label="名称">
@@ -205,10 +205,10 @@ const Demo = defineComponent({
                 </NFormItem>
               </NForm>
               <NSwitch v-disabled={this.disabledValue}></NSwitch>
-            </NSpace>
+            </NFlex>
           </NCard>
-        </NSpace>
-      </NSpace>
+        </NFlex>
+      </NFlex>
     )
   },
 })
diff --git a/src/hooks/components/useContextmenuCoordinate.ts b/src/hooks/components/useContextmenuCoordinate.ts
index 733a5d6e..7f8a1698 100644
--- a/src/hooks/components/useContextmenuCoordinate.ts
+++ b/src/hooks/components/useContextmenuCoordinate.ts
@@ -16,8 +16,20 @@ import type {
   MaybeElementRef,
   MaybeElement,
   MaybeRefOrGetter,
+  OnClickOutsideHandler,
 } from '@vueuse/core'
 
+export interface UseContextmenuCoordinateOptions {
+  /**
+   *
+   * 自定义点击元素外部时的回调函数。
+   * 但是值得注意的事,该方法的优先级很高,可能会优先于其他方法执行
+   *
+   * @default null
+   */
+  clickOutside?: OnClickOutsideHandler
+}
+
 /**
  *
  * @param target 绑定元素
@@ -35,11 +47,17 @@ import type {
  */
 export const useContextmenuCoordinate = (
   target: BasicTarget,
-  options?: MaybeRefOrGetter<boolean | AddEventListenerOptions>,
+  options?: UseContextmenuCoordinateOptions &
+    MaybeRefOrGetter<boolean | AddEventListenerOptions>,
 ) => {
   const x = ref(0) // 鼠标 x 坐标
   const y = ref(0) // 鼠标 y 坐标
   const show = ref(false) // 是否显示右键菜单
+  const { clickOutside } = options ?? {}
+
+  const updateShow = (value: boolean) => {
+    show.value = value
+  }
 
   /**
    *
@@ -51,24 +69,27 @@ export const useContextmenuCoordinate = (
   const bindContextMenuEvent = (evt: Event) => {
     evt.preventDefault()
 
-    show.value = false
+    updateShow(false)
 
     nextTick().then(() => {
       const { clientX, clientY } = evt as MouseEvent
 
       x.value = clientX
       y.value = clientY
-      show.value = true
+
+      updateShow(true)
     })
   }
 
-  /**
-   *
-   * 点击元素外部时,隐藏右键菜单
-   */
-  onClickOutside(target as MaybeElementRef<MaybeElement>, () => {
-    show.value = false
-  })
+  if (clickOutside) {
+    /**
+     *
+     * 自定义点击元素外部时的回调函数
+     */
+    onClickOutside(target as MaybeElementRef<MaybeElement>, (detectIframe) => {
+      clickOutside(detectIframe)
+    })
+  }
 
   /**
    *
@@ -85,7 +106,7 @@ export const useContextmenuCoordinate = (
    * 为传递 ref dom 绑定点击事件
    */
   const cleanupClick = useEventListener(target, 'click', () => {
-    show.value = false
+    updateShow(false)
   })
 
   /**
@@ -103,6 +124,7 @@ export const useContextmenuCoordinate = (
     x: readonly(x),
     y: readonly(y),
     show: readonly(show),
+    updateShow,
   }
 }
 
diff --git a/src/layout/components/MenuTag/index.tsx b/src/layout/components/MenuTag/index.tsx
index b239480a..65165439 100644
--- a/src/layout/components/MenuTag/index.tsx
+++ b/src/layout/components/MenuTag/index.tsx
@@ -33,7 +33,7 @@ import './index.scss'
 
 import {
   NScrollbar,
-  NSpace,
+  NFlex,
   NLayoutHeader,
   NDropdown,
   NButton,
@@ -456,13 +456,12 @@ export default defineComponent({
               this.actionState.actionDropdownShow = false
             }}
           />
-          <NSpace
+          <NFlex
             class="menu-tag-space"
             wrap={false}
             align="center"
             justify="space-between"
             inline
-            wrapItem={false}
           >
             <RIcon
               name="expanded"
@@ -478,7 +477,7 @@ export default defineComponent({
                 id: uuidScrollBar,
               }}
             >
-              <NSpace
+              <NFlex
                 ref="menuTagSpaceRef"
                 class="menu-tag-wrapper"
                 wrap={false}
@@ -545,9 +544,9 @@ export default defineComponent({
                     }}
                   </NButton>
                 ))}
-              </NSpace>
+              </NFlex>
             </NScrollbar>
-            <NSpace
+            <NFlex
               class="menu-tag__right-wrapper"
               align="center"
               inline
@@ -586,8 +585,8 @@ export default defineComponent({
                   onClick={this.setCurrentContextmenuIndex.bind(this)}
                 />
               </RMoreDropdown>
-            </NSpace>
-          </NSpace>
+            </NFlex>
+          </NFlex>
         </div>
       </NLayoutHeader>
     )
diff --git a/src/layout/components/SiderBar/components/GlobalSearch/index.tsx b/src/layout/components/SiderBar/components/GlobalSearch/index.tsx
index 7dfc5c8f..4e4ac4c3 100644
--- a/src/layout/components/SiderBar/components/GlobalSearch/index.tsx
+++ b/src/layout/components/SiderBar/components/GlobalSearch/index.tsx
@@ -20,7 +20,7 @@
 
 import './index.scss'
 
-import { NInput, NModal, NResult, NScrollbar, NSpace } from 'naive-ui'
+import { NInput, NModal, NResult, NScrollbar, NFlex } from 'naive-ui'
 import { RIcon } from '@/components'
 
 import { queryElements, addClass, removeClass } from '@/utils'
@@ -255,7 +255,7 @@ export default defineComponent({
     }
 
     const SearchItem = ({ menuOption }: { menuOption: AppMenuOption }) => (
-      <NSpace
+      <NFlex
         align="center"
         class="content-item"
         {...{
@@ -265,7 +265,7 @@ export default defineComponent({
       >
         <div class="content-item-icon">{RenderPreIcon(menuOption.meta)}</div>
         <div class="content-item-label">{menuOption.breadcrumbLabel}</div>
-      </NSpace>
+      </NFlex>
     )
 
     watchEffect(() => {
@@ -320,30 +320,30 @@ export default defineComponent({
               </div>
               <NScrollbar class="global-search__card-content">
                 {searchOptions.length ? (
-                  <NSpace vertical size={[8, 8]}>
+                  <NFlex vertical size={[8, 8]}>
                     {searchOptions.map((curr) => (
                       <SearchItem menuOption={curr} key={curr.fullPath} />
                     ))}
-                  </NSpace>
+                  </NFlex>
                 ) : (
                   <NResult size="large" class="global-search__empty">
                     {{
                       icon: () => null,
                       default: () => (
-                        <NSpace
+                        <NFlex
                           justify="center"
                           class="global-search__empty-content"
                         >
                           <RIcon name="empty" size="24" />
                           暂无搜索结果
-                        </NSpace>
+                        </NFlex>
                       ),
                     }}
                   </NResult>
                 )}
               </NScrollbar>
               <div class="global-search__card-footer">
-                <NSpace
+                <NFlex
                   class="card-footer__tip-wrapper"
                   align="center"
                   size={[24, 8]}
@@ -360,7 +360,7 @@ export default defineComponent({
                       <div class="item-label">{curr.label}</div>
                     </div>
                   ))}
-                </NSpace>
+                </NFlex>
               </div>
             </div>
           </div>
diff --git a/src/layout/components/SiderBar/components/SettingDrawer/components/ThemeSwitch/index.tsx b/src/layout/components/SiderBar/components/SettingDrawer/components/ThemeSwitch/index.tsx
index 959e7e88..de578ba0 100644
--- a/src/layout/components/SiderBar/components/SettingDrawer/components/ThemeSwitch/index.tsx
+++ b/src/layout/components/SiderBar/components/SettingDrawer/components/ThemeSwitch/index.tsx
@@ -9,7 +9,7 @@
  * @remark 今天也是元气满满撸代码的一天
  */
 
-import { NSpace, NSwitch, NTooltip } from 'naive-ui'
+import { NFlex, NSwitch, NTooltip } from 'naive-ui'
 import { RIcon } from '@/components'
 
 import { useSettingGetters } from '@/store'
@@ -44,7 +44,7 @@ export default defineComponent({
     const { $t, changeDarkTheme, changeLightTheme, railStyle } = this
 
     return (
-      <NSpace justify="center">
+      <NFlex justify="center">
         <NTooltip>
           {{
             trigger: () => (
@@ -69,7 +69,7 @@ export default defineComponent({
                 : $t('headerSettingOptions.ThemeOptions.Light'),
           }}
         </NTooltip>
-      </NSpace>
+      </NFlex>
     )
   },
 })
diff --git a/src/layout/components/SiderBar/components/SettingDrawer/index.tsx b/src/layout/components/SiderBar/components/SettingDrawer/index.tsx
index 77fa9ab6..8ee0058d 100644
--- a/src/layout/components/SiderBar/components/SettingDrawer/index.tsx
+++ b/src/layout/components/SiderBar/components/SettingDrawer/index.tsx
@@ -14,7 +14,7 @@ import {
   NDrawer,
   NDrawerContent,
   NDivider,
-  NSpace,
+  NFlex,
   NSwitch,
   NColorPicker,
   NDescriptions,
@@ -111,7 +111,7 @@ const SettingDrawer = defineComponent({
         width={this.width}
       >
         <NDrawerContent title={$t('headerSettingOptions.Title')}>
-          <NSpace class="setting-drawer__space" vertical>
+          <NFlex class="setting-drawer__space" vertical>
             <NDivider titlePlacement="center">
               {$t('headerSettingOptions.ThemeOptions.Title')}
             </NDivider>
@@ -171,7 +171,7 @@ const SettingDrawer = defineComponent({
                 />
               </NDescriptionsItem>
             </NDescriptions>
-          </NSpace>
+          </NFlex>
         </NDrawerContent>
       </NDrawer>
     )
diff --git a/src/layout/components/SiderBar/index.tsx b/src/layout/components/SiderBar/index.tsx
index c756b543..b8406934 100644
--- a/src/layout/components/SiderBar/index.tsx
+++ b/src/layout/components/SiderBar/index.tsx
@@ -19,7 +19,7 @@
 
 import './index.scss'
 
-import { NLayoutHeader, NSpace, NDropdown } from 'naive-ui'
+import { NLayoutHeader, NFlex, NDropdown } from 'naive-ui'
 import { RIcon } from '@/components'
 import TooltipIcon from '@/layout/components/SiderBar/components/TooltipIcon'
 import SettingDrawer from './components/SettingDrawer'
@@ -128,12 +128,12 @@ export default defineComponent({
     return (
       <NLayoutHeader class="layout-header" bordered>
         <GlobalSearch v-model:show={this.globalSearchShown} />
-        <NSpace
+        <NFlex
           class="layout-header__method"
           align="center"
           justify="space-between"
         >
-          <NSpace align="center">
+          <NFlex align="center">
             {this.leftIconOptions.map((curr) => (
               <TooltipIcon
                 key={curr.name}
@@ -146,8 +146,8 @@ export default defineComponent({
               />
             ))}
             {this.getBreadcrumbSwitch ? <Breadcrumb /> : null}
-          </NSpace>
-          <NSpace align="center">
+          </NFlex>
+          <NFlex align="center">
             {this.rightTooltipIconOptions.map((curr) => (
               <TooltipIcon
                 key={curr.name}
@@ -180,8 +180,8 @@ export default defineComponent({
             >
               <AppAvatar avatarSize="small" align="center" cursor="pointer" />
             </NDropdown>
-          </NSpace>
-        </NSpace>
+          </NFlex>
+        </NFlex>
         <SettingDrawer
           v-model:show={this.showSettings}
           placement={this.getDrawerPlacement}
diff --git a/src/layout/default/HeaderWrapper/index.tsx b/src/layout/default/HeaderWrapper/index.tsx
index aa9994c4..751bac07 100644
--- a/src/layout/default/HeaderWrapper/index.tsx
+++ b/src/layout/default/HeaderWrapper/index.tsx
@@ -9,7 +9,7 @@
  * @remark 今天也是元气满满撸代码的一天
  */
 
-import { NSpace } from 'naive-ui'
+import { NFlex } from 'naive-ui'
 import SiderBar from '@/layout/components/SiderBar'
 
 export default defineComponent({
@@ -19,9 +19,9 @@ export default defineComponent({
   },
   render() {
     return (
-      <NSpace size={[0, 0]} wrapItem={false}>
+      <NFlex size={[0, 0]}>
         <SiderBar />
-      </NSpace>
+      </NFlex>
     )
   },
 })
diff --git a/src/locales/lang/en-US/views/login/index.json b/src/locales/lang/en-US/views/login/index.json
index d91a6d81..6bc01f95 100644
--- a/src/locales/lang/en-US/views/login/index.json
+++ b/src/locales/lang/en-US/views/login/index.json
@@ -6,5 +6,6 @@
   "PasswordPlaceholder": "please enter password",
   "Login": "Login",
   "Name": "User Name",
-  "Password": "User Password"
+  "Password": "User Password",
+  "RayTemplate": "Fast Background Template"
 }
diff --git a/src/locales/lang/zh-CN/views/login/index.json b/src/locales/lang/zh-CN/views/login/index.json
index ed0b14f0..01ceef8e 100644
--- a/src/locales/lang/zh-CN/views/login/index.json
+++ b/src/locales/lang/zh-CN/views/login/index.json
@@ -6,5 +6,6 @@
   "PasswordPlaceholder": "请输入密码",
   "Login": "登 陆",
   "Name": "用户名",
-  "Password": "密码"
+  "Password": "密码",
+  "RayTemplate": "开箱即用的中后台管理系统"
 }
diff --git a/src/store/modules/setting/index.ts b/src/store/modules/setting/index.ts
index 4d267fae..00dea971 100644
--- a/src/store/modules/setting/index.ts
+++ b/src/store/modules/setting/index.ts
@@ -3,6 +3,7 @@ import { set } from 'lodash-es'
 import { colorToRgba, setStorage } from '@/utils'
 import { useI18n, useDayjs } from '@/hooks'
 import { APP_THEME } from '@/app-config'
+import { APP_CATCH_KEY } from '@/app-config'
 
 import type { SettingState } from '@/store/modules/setting/type'
 import type { LocalKey } from '@/hooks'
@@ -57,7 +58,7 @@ export const piniaSettingStore = defineStore(
 
       settingState.localeLanguage = key
 
-      setStorage('localeLanguage', key, 'localStorage')
+      setStorage(APP_CATCH_KEY.localeLanguage, key, 'localStorage')
     }
 
     /** 切换主题色 */
diff --git a/src/types/global.d.ts b/src/types/global.d.ts
index c49a18eb..bb78f385 100644
--- a/src/types/global.d.ts
+++ b/src/types/global.d.ts
@@ -1,7 +1,7 @@
 /* eslint-disable @typescript-eslint/no-explicit-any */
 export {}
 
-import type { AppConfig } from './modules/cfg'
+import type { AppConfig } from './modules/viteCustomConfig'
 import type {
   MessageApi,
   DialogApi,
diff --git a/src/types/index.ts b/src/types/index.ts
index 8b32d110..59ee7600 100644
--- a/src/types/index.ts
+++ b/src/types/index.ts
@@ -1,7 +1,7 @@
 export type * from './modules/app'
 export type * from './modules/appConfig'
 export type * from './modules/axios'
-export type * from './modules/cfg'
+export type * from './modules/viteCustomConfig'
 export type * from './modules/component'
 export type * from './modules/helper'
 export type * from './modules/utils'
diff --git a/src/types/modules/cfg.ts b/src/types/modules/viteCustomConfig.ts
similarity index 100%
rename from src/types/modules/cfg.ts
rename to src/types/modules/viteCustomConfig.ts
diff --git a/src/views/dashboard/index.tsx b/src/views/dashboard/index.tsx
index 7bb95331..6fc1a4ee 100644
--- a/src/views/dashboard/index.tsx
+++ b/src/views/dashboard/index.tsx
@@ -6,7 +6,7 @@ import {
   NDescriptions,
   NDescriptionsItem,
   NTag,
-  NSpace,
+  NFlex,
   NP,
   NH6,
 } from 'naive-ui'
@@ -20,34 +20,34 @@ const Dashboard = defineComponent({
       {
         label: '掌握搬砖框架',
         des: () => (
-          <NSpace>
+          <NFlex>
             <NTag type="success">Vue3.x</NTag>
             <NTag type="info">React</NTag>
-          </NSpace>
+          </NFlex>
         ),
       },
       {
         label: '从事搬砖时长',
         des: () => (
-          <NSpace>
+          <NFlex>
             <NTag type="success">练习时长两年半的小白前端搬砖师</NTag>
-          </NSpace>
+          </NFlex>
         ),
       },
       {
         label: '个人',
         des: () => (
-          <NSpace align="center">
+          <NFlex align="center">
             <RIcon name="ray" size="22" />
             努力搬砖、努力摸鱼, 建设美丽家园
-          </NSpace>
+          </NFlex>
         ),
         span: 2,
       },
       {
         label: '补充说明',
         des: () => (
-          <NSpace align="center">
+          <NFlex align="center">
             如果有希望补充的功能可以在
             <a
               class="dashboard-link"
@@ -56,7 +56,7 @@ const Dashboard = defineComponent({
               GitHub
             </a>
             提一个 Issues
-          </NSpace>
+          </NFlex>
         ),
         span: 2,
       },
@@ -110,13 +110,13 @@ const Dashboard = defineComponent({
         <NCard title="项目介绍">
           <NH6>技术栈</NH6>
           <NP>
-            <NSpace>
+            <NFlex>
               {this.technologyTagOptions.map((curr) => (
                 <NTag key={curr.value} type="info">
                   {curr.label}
                 </NTag>
               ))}
-            </NSpace>
+            </NFlex>
           </NP>
           <NH6>项目介绍</NH6>
           <NP>
diff --git a/src/views/demo/axios/index.tsx b/src/views/demo/axios/index.tsx
index 34d6f017..ae06a4f5 100644
--- a/src/views/demo/axios/index.tsx
+++ b/src/views/demo/axios/index.tsx
@@ -1,6 +1,6 @@
 import './index.scss'
 
-import { NCard, NLayout, NSpace, NInput, NButton } from 'naive-ui'
+import { NCard, NLayout, NFlex, NInput, NButton } from 'naive-ui'
 import { getWeather, getTypicode } from '@/api/demo/test'
 import { useRequest, useHookPlusRequest } from '@/axios'
 
@@ -77,7 +77,7 @@ const Axios = defineComponent({
   render() {
     return (
       <NLayout>
-        <NSpace vertical>
+        <NFlex vertical>
           <h1>请求</h1>
           <NCard>
             <h2>useRequest</h2>
@@ -100,17 +100,17 @@ const Axios = defineComponent({
             <h3>3.详情请查看文档</h3>
           </NCard>
           <NCard title="useRequest示例(手动触发)">
-            <NSpace vertical>
+            <NFlex vertical>
               <NButton onClick={this.demoRun.bind(this)}>获取数据</NButton>
               <h3>
                 结果:&nbsp;
                 {this.demoLoading ? '获取中...' : this.demoData?.title}
               </h3>
-            </NSpace>
+            </NFlex>
           </NCard>
           <h1>使用 useHookPlusRequest 获取</h1>
           <NCard title="节流">
-            <NSpace vertical>
+            <NFlex vertical>
               <NInput
                 v-model:value={this.throttleDemoInputValue}
                 onUpdateValue={() => {
@@ -122,10 +122,10 @@ const Axios = defineComponent({
                 当前状态:&nbsp;
                 {this.throttleDemoLoading ? '获取中...' : '获取成功!!!'}
               </h3>
-            </NSpace>
+            </NFlex>
           </NCard>
           <NCard title="防抖">
-            <NSpace vertical>
+            <NFlex vertical>
               <NInput
                 v-model:value={this.debounceDemoInputValue}
                 onUpdateValue={() => {
@@ -137,10 +137,10 @@ const Axios = defineComponent({
                 当前状态:&nbsp;
                 {this.debounceDemoLoading ? '获取中...' : '获取成功!!!'}
               </h3>
-            </NSpace>
+            </NFlex>
           </NCard>
           <NCard title="获取气候">
-            <NSpace vertical>
+            <NFlex vertical>
               <NInput
                 v-model:value={this.weatherDemoInputValue}
                 onUpdateValue={(val) => {
@@ -152,9 +152,9 @@ const Axios = defineComponent({
                 当前状态:&nbsp;
                 {this.weatherDemoLoading ? '获取中...' : '获取成功!!!'}
               </h3>
-            </NSpace>
+            </NFlex>
           </NCard>
-        </NSpace>
+        </NFlex>
       </NLayout>
     )
   },
diff --git a/src/views/demo/context-menu/index.tsx b/src/views/demo/context-menu/index.tsx
index 12033afc..d623e131 100644
--- a/src/views/demo/context-menu/index.tsx
+++ b/src/views/demo/context-menu/index.tsx
@@ -9,7 +9,7 @@
  * @remark 今天也是元气满满撸代码的一天
  */
 
-import { NSpace, NCard, NDropdown } from 'naive-ui'
+import { NFlex, NCard, NDropdown } from 'naive-ui'
 
 import { useContextmenuCoordinate } from '@/hooks'
 
@@ -33,11 +33,17 @@ export default defineComponent({
       },
       {
         label: '尼克·卡拉威',
-        key: 'nick carraway',
+        key: 'nick caraway',
       },
     ])
 
-    const { x, y, show } = useContextmenuCoordinate(demoOneRef)
+    const { x, y, show, updateShow } = useContextmenuCoordinate(demoOneRef)
+
+    const clickOutside = (e: MouseEvent) => {
+      e.preventDefault()
+
+      updateShow(false)
+    }
 
     return {
       demoOneRef,
@@ -46,15 +52,18 @@ export default defineComponent({
       y,
       show,
       options,
+      clickOutside,
+      updateShow,
     }
   },
   render() {
     const { x, y, show } = this
+    const { clickOutside, updateShow } = this
 
     return (
-      <NSpace vertical>
+      <NFlex vertical>
         <NCard title="useContextmenuCoordinate + NDropdown 实现右键菜单">
-          <NSpace vertical>
+          <NFlex vertical>
             <h3>默认点击元素外部会关闭菜单。</h3>
             <div
               ref="demoOneRef"
@@ -62,7 +71,7 @@ export default defineComponent({
             >
               右击
             </div>
-          </NSpace>
+          </NFlex>
         </NCard>
         <NDropdown
           show={show}
@@ -71,8 +80,14 @@ export default defineComponent({
           options={this.options}
           trigger="manual"
           placement="bottom-start"
+          onSelect={(value, option) => {
+            window.$message.info(`选中了 ${option.label}`)
+
+            updateShow(false)
+          }}
+          onClickoutside={clickOutside.bind(this)}
         />
-      </NSpace>
+      </NFlex>
     )
   },
 })
diff --git a/src/views/demo/directive/index.tsx b/src/views/demo/directive/index.tsx
index de0a5ec1..ca5b71b6 100644
--- a/src/views/demo/directive/index.tsx
+++ b/src/views/demo/directive/index.tsx
@@ -10,7 +10,7 @@
  */
 
 import {
-  NSpace,
+  NFlex,
   NCard,
   NInput,
   NInputGroup,
@@ -50,7 +50,7 @@ const RDirective = defineComponent({
   },
   render() {
     return (
-      <NSpace wrapItem={false}>
+      <NFlex>
         <NCard title="指令">该页面展示如何使用已封装好的指令</NCard>
         <NCard title="文本复制示例一">
           <NInputGroup>
@@ -65,7 +65,7 @@ const RDirective = defineComponent({
           </NInputGroup>
         </NCard>
         <NCard title="节流">
-          <NSpace vertical>
+          <NFlex vertical>
             <NButton
               v-throttle={{
                 func: this.updateDemoValue.bind(null, 'throttleBtnClickCount'),
@@ -78,10 +78,10 @@ const RDirective = defineComponent({
             </NButton>
             <p>我执行了{this.throttleBtnClickCount}次</p>
             <p>该方法 1s 内仅会执行一次</p>
-          </NSpace>
+          </NFlex>
         </NCard>
         <NCard title="防抖">
-          <NSpace vertical>
+          <NFlex vertical>
             <NButton
               v-debounce={{
                 func: this.updateDemoValue.bind(null, 'debounceBtnClickCount'),
@@ -94,10 +94,10 @@ const RDirective = defineComponent({
             </NButton>
             <p>我执行了{this.debounceBtnClickCount}次</p>
             <p>该方法将延迟 1s 执行</p>
-          </NSpace>
+          </NFlex>
         </NCard>
         <NCard title="禁用">
-          <NSpace vertical>
+          <NFlex vertical>
             <NSwitch v-model:value={this.disabledValue}>
               {{
                 checked: () => '取消',
@@ -120,12 +120,12 @@ const RDirective = defineComponent({
               </form>
             </NCard>
             <NCard title="文本内容">
-              <NSpace vertical>
+              <NFlex vertical>
                 <p v-disabled={this.disabledValue}>我是可以被禁用的文本内容</p>
-              </NSpace>
+              </NFlex>
             </NCard>
             <NCard title="naive 组件">
-              <NSpace vertical justify="start">
+              <NFlex vertical justify="start">
                 <NForm v-disabled={this.disabledValue}>
                   <NFormItem>
                     <NInput />
@@ -133,11 +133,11 @@ const RDirective = defineComponent({
                 </NForm>
                 <NButton v-disabled={this.disabledValue}>按钮</NButton>
                 <NSwitch v-disabled={this.disabledValue}></NSwitch>
-              </NSpace>
+              </NFlex>
             </NCard>
-          </NSpace>
+          </NFlex>
         </NCard>
-      </NSpace>
+      </NFlex>
     )
   },
 })
diff --git a/src/views/demo/echart/index.tsx b/src/views/demo/echart/index.tsx
index 2fe1170c..ab274742 100644
--- a/src/views/demo/echart/index.tsx
+++ b/src/views/demo/echart/index.tsx
@@ -1,6 +1,6 @@
 import './index.scss'
 
-import { NCard, NSwitch, NSpace, NH2, NButton } from 'naive-ui'
+import { NCard, NSwitch, NFlex, NH2, NButton } from 'naive-ui'
 import { RChart } from '@/components'
 
 import type { RChartType } from '@/components'
@@ -239,13 +239,13 @@ const Echart = defineComponent({
           </ul>
         </NCard>
         <NH2>强制渲染过渡动画(animation),预设 card 风格图表</NH2>
-        <NSpace style={['padding: 18px 0']}>
+        <NFlex style={['padding: 18px 0']}>
           <NButton onClick={this.mountChart.bind(this)}>渲染</NButton>
           <NButton onClick={this.unmountChart.bind(this)}>卸载</NButton>
           <NButton onClick={this.handleUpdateTitle.bind(this)}>
             更新配置项
           </NButton>
-        </NSpace>
+        </NFlex>
         <div class="chart--container">
           <RChart
             title="周销售量"
diff --git a/src/views/demo/iframe/index.tsx b/src/views/demo/iframe/index.tsx
index 674b67e3..3dc560e8 100644
--- a/src/views/demo/iframe/index.tsx
+++ b/src/views/demo/iframe/index.tsx
@@ -17,7 +17,7 @@
  * 做了简单的一个组件封装, 希望有用
  */
 
-import { NCard, NSpace } from 'naive-ui'
+import { NCard, NFlex } from 'naive-ui'
 import { RIframe } from '@/components'
 
 const IframeDemo = defineComponent({
@@ -27,7 +27,7 @@ const IframeDemo = defineComponent({
   },
   render() {
     return (
-      <NSpace vertical size={[20, 20]}>
+      <NFlex vertical size={[20, 20]}>
         <NCard title="naive ui(延迟加载)">
           <RIframe
             src="https://www.naiveui.com/zh-CN/dark"
@@ -42,7 +42,7 @@ const IframeDemo = defineComponent({
             lazy={false}
           />
         </NCard>
-      </NSpace>
+      </NFlex>
     )
   },
 })
diff --git a/src/views/demo/mock-demo/index.tsx b/src/views/demo/mock-demo/index.tsx
index 9fe56d9e..50308925 100644
--- a/src/views/demo/mock-demo/index.tsx
+++ b/src/views/demo/mock-demo/index.tsx
@@ -9,7 +9,7 @@
  * @remark 今天也是元气满满撸代码的一天
  */
 
-import { NSpace, NCard, NButton, NFormItemGi, NInput, NForm } from 'naive-ui'
+import { NFlex, NCard, NButton, NFormItemGi, NInput, NForm } from 'naive-ui'
 import { RCollapseGrid, RTable } from '@/components'
 
 import { useHookPlusRequest } from '@/axios'
@@ -78,7 +78,7 @@ const MockDemo = defineComponent({
         key: 'action',
         render: (row: Person) => {
           return (
-            <NSpace align="center">
+            <NFlex align="center">
               <NButton
                 type="primary"
                 text
@@ -106,7 +106,7 @@ const MockDemo = defineComponent({
               >
                 删除
               </NButton>
-            </NSpace>
+            </NFlex>
           )
         },
       },
@@ -147,7 +147,7 @@ const MockDemo = defineComponent({
   },
   render() {
     return (
-      <NSpace vertical>
+      <NFlex vertical>
         <NCard title="Mock 数据">
           <h2>
             mock
@@ -187,7 +187,7 @@ const MockDemo = defineComponent({
           pagination={this.paginationRef}
           remote
         />
-      </NSpace>
+      </NFlex>
     )
   },
 })
diff --git a/src/views/demo/modal-demo/index.tsx b/src/views/demo/modal-demo/index.tsx
index 3b873bed..a5476adc 100644
--- a/src/views/demo/modal-demo/index.tsx
+++ b/src/views/demo/modal-demo/index.tsx
@@ -10,7 +10,7 @@
  */
 
 import { RModal } from '@/components'
-import { NButton, NCard, NSpace } from 'naive-ui'
+import { NButton, NCard, NFlex } from 'naive-ui'
 
 export default defineComponent({
   name: 'ModalDemo',
@@ -27,16 +27,16 @@ export default defineComponent({
   },
   render() {
     return (
-      <NSpace vertical>
+      <NFlex vertical>
         <NCard title="props">
-          <NSpace vertical>
+          <NFlex vertical>
             <h3>
               memoryPosition: 是否记住上一次被拖拽的位置,如果设置为
               true,那么下一次打开的时候会自动定位到上一次的位置。
             </h3>
             <h3>fullscreen: 全屏模态框。</h3>
             <h3>dad: 启用拖拽,当配置为 false 时,会禁用拖拽效果。</h3>
-          </NSpace>
+          </NFlex>
         </NCard>
         <RModal
           v-model:show={this.modal1}
@@ -67,13 +67,13 @@ export default defineComponent({
           <NButton onClick={() => (this.modal3 = true)}>对话框模态框</NButton>
         </NCard>
         <NCard title="全屏模态框">
-          <NSpace vertical>
+          <NFlex vertical>
             <h4>
               全屏模态框需要同时设置:fullscreen 为 true,并且 preset 为 card
               时才会生效。
             </h4>
             <NButton onClick={() => (this.modal1 = true)}>打开</NButton>
-          </NSpace>
+          </NFlex>
         </NCard>
         <NCard title="手动设置宽度">
           <h4>
@@ -91,7 +91,7 @@ export default defineComponent({
             所有的宽度配置属性都会注入一个对应的 `css variable`,有时候会用上。
           </h4>
         </NCard>
-      </NSpace>
+      </NFlex>
     )
   },
 })
diff --git a/src/views/demo/precision/index.tsx b/src/views/demo/precision/index.tsx
index ea228eb5..2bb440d8 100644
--- a/src/views/demo/precision/index.tsx
+++ b/src/views/demo/precision/index.tsx
@@ -9,7 +9,7 @@
  * @remark 今天也是元气满满撸代码的一天
  */
 
-import { NLayout, NCard, NDynamicTags, NSpace, NInputNumber } from 'naive-ui'
+import { NLayout, NCard, NDynamicTags, NFlex, NInputNumber } from 'naive-ui'
 
 import { add, subtract, multiply, divide, distribute, format } from '@/utils'
 
@@ -67,7 +67,7 @@ const CalculatePrecision = defineComponent({
           https://currency.js.org/#subtract
         </h3>
 
-        <NSpace vertical>
+        <NFlex vertical>
           <NCard title="加法">
             {{
               default: () => (
@@ -131,7 +131,7 @@ const CalculatePrecision = defineComponent({
           <NCard title="平分一个值">
             {{
               default: () => (
-                <NSpace>
+                <NFlex>
                   <NInputNumber
                     v-model:value={this.distributeValue}
                     onUpdateValue={() => {
@@ -144,14 +144,14 @@ const CalculatePrecision = defineComponent({
                       this.updateDistributeValue()
                     }}
                   />
-                </NSpace>
+                </NFlex>
               ),
               footer: () => {
                 return '结果: ' + this.distributeOutputValue.join(', ')
               },
             }}
           </NCard>
-        </NSpace>
+        </NFlex>
       </NLayout>
     )
   },
diff --git a/src/views/demo/qrcode/index.tsx b/src/views/demo/qrcode/index.tsx
index e7a990c5..979223ac 100644
--- a/src/views/demo/qrcode/index.tsx
+++ b/src/views/demo/qrcode/index.tsx
@@ -9,7 +9,7 @@
  * @remark 今天也是元气满满撸代码的一天
  */
 
-import { NSpace, NCard, NButton } from 'naive-ui'
+import { NFlex, NCard, NButton } from 'naive-ui'
 import { RQRCode } from '@/components'
 
 import LOGO from '@/assets/images/ray.svg'
@@ -31,7 +31,7 @@ export default defineComponent({
   },
   render() {
     return (
-      <NSpace wrapItem={false}>
+      <NFlex>
         <NCard>
           <h2>
             基于 awesome-qr 进行封装,支持 LOGO、gif、backgroundImage 等属性。
@@ -40,7 +40,7 @@ export default defineComponent({
           <h2>具体使用请参考 props 配置项</h2>
         </NCard>
         <NCard title="基础二维码">
-          <NSpace>
+          <NFlex>
             <RQRCode text="ray template yes" />
             <RQRCode text="ray template yes" logoImage={LOGO} />
             <RQRCode
@@ -49,10 +49,10 @@ export default defineComponent({
               dotScale={0.5}
               colorDark="#64d9d6"
             />
-          </NSpace>
+          </NFlex>
         </NCard>
         <NCard title="状态二维码">
-          <NSpace>
+          <NFlex>
             <RQRCode
               text="ray template yes"
               logoImage={LOGO}
@@ -66,11 +66,11 @@ export default defineComponent({
               logoImage={LOGO}
               status="loading"
             />
-          </NSpace>
+          </NFlex>
         </NCard>
         <NCard title="监听内容变化">
-          <NSpace vertical>
-            <NSpace>
+          <NFlex vertical>
+            <NFlex>
               <NButton
                 onClick={() => {
                   this.qrcodeStatus = 'loading'
@@ -90,8 +90,8 @@ export default defineComponent({
               >
                 下载二维码
               </NButton>
-            </NSpace>
-            <NSpace>
+            </NFlex>
+            <NFlex>
               <RQRCode
                 text={this.qrcodeText}
                 status={this.qrcodeStatus}
@@ -99,10 +99,10 @@ export default defineComponent({
                 ref="rayQRCodeRef"
               />
               当前二维码内容:{this.qrcodeText}
-            </NSpace>
-          </NSpace>
+            </NFlex>
+          </NFlex>
         </NCard>
-      </NSpace>
+      </NFlex>
     )
   },
 })
diff --git a/src/views/demo/router-demo/router-demo-detail/index.tsx b/src/views/demo/router-demo/router-demo-detail/index.tsx
index 93d956ca..a36b05da 100644
--- a/src/views/demo/router-demo/router-demo-detail/index.tsx
+++ b/src/views/demo/router-demo/router-demo-detail/index.tsx
@@ -9,13 +9,13 @@
  * @remark 今天也是元气满满撸代码的一天
  */
 
-import { NCard, NSpace } from 'naive-ui'
+import { NCard, NFlex } from 'naive-ui'
 
 const RouterDemoDetail = defineComponent({
   name: 'RouterDemoDetail',
   render() {
     return (
-      <NSpace>
+      <NFlex>
         <NCard title={(this.$route.query.name as string) || 'hello'}>
           你好 {this.$route.query.name}
         </NCard>
@@ -27,7 +27,7 @@ const RouterDemoDetail = defineComponent({
             中,将所需页面配置为 sameLevel 即可。
           </h2>
         </NCard>
-      </NSpace>
+      </NFlex>
     )
   },
 })
diff --git a/src/views/demo/router-demo/router-demo-home/index.tsx b/src/views/demo/router-demo/router-demo-home/index.tsx
index 08c919da..be1872c0 100644
--- a/src/views/demo/router-demo/router-demo-home/index.tsx
+++ b/src/views/demo/router-demo/router-demo-home/index.tsx
@@ -9,7 +9,7 @@
  * @remark 今天也是元气满满撸代码的一天
  */
 
-import { NSpace, NButton } from 'naive-ui'
+import { NFlex, NButton } from 'naive-ui'
 import { RTable } from '@/components'
 
 import type { DataTableColumns } from 'naive-ui'
@@ -44,7 +44,7 @@ const RouterDemoHome = defineComponent({
         key: '',
         render: (row) => {
           return (
-            <NSpace align="center">
+            <NFlex align="center">
               <NButton
                 type="info"
                 text
@@ -60,7 +60,7 @@ const RouterDemoHome = defineComponent({
               >
                 详情
               </NButton>
-            </NSpace>
+            </NFlex>
           )
         },
       },
@@ -83,9 +83,9 @@ const RouterDemoHome = defineComponent({
   },
   render() {
     return (
-      <NSpace wrapItem={false}>
+      <NFlex>
         <RTable v-model:columns={this.columns} data={this.dataSource} />
-      </NSpace>
+      </NFlex>
     )
   },
 })
diff --git a/src/views/demo/svg-icons/index.tsx b/src/views/demo/svg-icons/index.tsx
index 9eaa8c5f..0380b503 100644
--- a/src/views/demo/svg-icons/index.tsx
+++ b/src/views/demo/svg-icons/index.tsx
@@ -11,7 +11,7 @@
 
 import './index.scss'
 
-import { NSpace, NCard, NPopover } from 'naive-ui'
+import { NFlex, NCard, NPopover } from 'naive-ui'
 import { RIcon } from '@/components'
 
 const PreviewSVGIcons = defineComponent({
@@ -38,7 +38,7 @@ const PreviewSVGIcons = defineComponent({
         {{
           'header-extra': () => '点击图标复制代码',
           default: () => (
-            <NSpace>
+            <NFlex>
               {this.icons.map((curr) => (
                 <div
                   class="pre-view-icons__card"
@@ -55,7 +55,7 @@ const PreviewSVGIcons = defineComponent({
                   </NPopover>
                 </div>
               ))}
-            </NSpace>
+            </NFlex>
           ),
         }}
       </NCard>
diff --git a/src/views/demo/table/index.tsx b/src/views/demo/table/index.tsx
index ac5d2404..e3d86d49 100644
--- a/src/views/demo/table/index.tsx
+++ b/src/views/demo/table/index.tsx
@@ -17,7 +17,7 @@ import {
   NInput,
   NDatePicker,
   NSwitch,
-  NSpace,
+  NFlex,
   NPopover,
   NCard,
 } from 'naive-ui'
@@ -74,7 +74,7 @@ const TableView = defineComponent({
         title: 'Action',
         key: 'actions',
         render: (row: RowData) => (
-          <NSpace align="center">
+          <NFlex align="center">
             <NButton size="tiny">查看</NButton>
             <RMoreDropdown
               options={[
@@ -91,7 +91,7 @@ const TableView = defineComponent({
                 window.$message.info(`当前选择: ${key}`)
               }}
             />
-          </NSpace>
+          </NFlex>
         ),
       },
     ]
@@ -155,7 +155,7 @@ const TableView = defineComponent({
   },
   render() {
     return (
-      <NSpace vertical>
+      <NFlex vertical>
         <NCard title="RTable">
           基于 NDataTable 封装,继承该组件所有 props 属性。查看 RTable props
           文件即可查看该组件拓展项
@@ -201,12 +201,12 @@ const TableView = defineComponent({
         <RTable
           scrollX={2000}
           title={
-            <NSpace align="center">
+            <NFlex align="center">
               <span>标题插槽:</span>
               <NSwitch
                 onUpdateValue={(value: boolean) => (this.tableLoading = value)}
               ></NSwitch>
-            </NSpace>
+            </NFlex>
           }
           data={this.tableData}
           v-model:columns={this.actionColumns}
@@ -239,7 +239,7 @@ const TableView = defineComponent({
             tableAction: () => '表格的操作区域内容插槽,有时候可能会用上',
           }}
         </RTable>
-      </NSpace>
+      </NFlex>
     )
   },
 })
diff --git a/src/views/demo/template-hooks/index.tsx b/src/views/demo/template-hooks/index.tsx
index c299e135..bc9176a3 100644
--- a/src/views/demo/template-hooks/index.tsx
+++ b/src/views/demo/template-hooks/index.tsx
@@ -9,7 +9,7 @@
  * @remark 今天也是元气满满撸代码的一天
  */
 
-import { NSpace, NCard, NButton, NInput } from 'naive-ui'
+import { NFlex, NCard, NButton, NInput } from 'naive-ui'
 
 import {
   useAppNavigation,
@@ -79,7 +79,7 @@ export default defineComponent({
     } = this
 
     return (
-      <NSpace vertical>
+      <NFlex vertical>
         <NCard title="接口说明">
           <h3>
             hooks/template 包存放模板专属 hook
@@ -87,29 +87,29 @@ export default defineComponent({
           </h3>
         </NCard>
         <NCard title="useTheme 主题">
-          <NSpace vertical>
+          <NFlex vertical>
             <h3>getAppTheme 获取当前主题色: {getAppTheme().themeLabel}</h3>
-            <NSpace>
+            <NFlex>
               <NButton onClick={() => changeDarkTheme()}>切换暗黑主题</NButton>
               <NButton onClick={() => changeLightTheme()}>切换明亮主题</NButton>
               <NButton onClick={() => toggleTheme()}>切换主题</NButton>
-            </NSpace>
-          </NSpace>
+            </NFlex>
+          </NFlex>
         </NCard>
         <NCard title="useWatermark 水印">
-          <NSpace vertical>
+          <NFlex vertical>
             <NInput
               v-model:value={this.watermark}
               onInput={(val) => {
                 setWatermarkContent(val)
               }}
             />
-            <NSpace>
+            <NFlex>
               <NButton onClick={() => showWatermark()}>显示水印</NButton>
               <NButton onClick={() => hiddenWatermark()}>隐藏水印</NButton>
               <NButton onClick={() => toggleWatermark()}>切换水印</NButton>
-            </NSpace>
-          </NSpace>
+            </NFlex>
+          </NFlex>
         </NCard>
         <NCard title="useSpinning">
           <h3>
@@ -117,7 +117,7 @@ export default defineComponent({
             vue 生命周期)。默认 800ms 延迟。
           </h3>
           <br />
-          <NSpace>
+          <NFlex>
             <NButton
               onClick={() => {
                 reload()
@@ -136,7 +136,7 @@ export default defineComponent({
             >
               触发加载动画(不强制刷新)
             </NButton>
-          </NSpace>
+          </NFlex>
         </NCard>
         <NCard title="useMaximize 内容区域最大化">
           <h3>
@@ -167,7 +167,7 @@ export default defineComponent({
             跳转至多级菜单
           </NButton>
         </NCard>
-      </NSpace>
+      </NFlex>
     )
   },
 })
diff --git a/src/views/login/components/SSOSigning/index.tsx b/src/views/login/components/SSOSigning/index.tsx
index a460ad45..84c86e41 100644
--- a/src/views/login/components/SSOSigning/index.tsx
+++ b/src/views/login/components/SSOSigning/index.tsx
@@ -18,7 +18,7 @@
 
 import './index.scss'
 
-import { NSpace, NPopover } from 'naive-ui'
+import { NFlex, NPopover } from 'naive-ui'
 import { RIcon } from '@/components'
 
 interface SSOSigningOptions {
@@ -59,7 +59,7 @@ const SSOSigning = defineComponent({
   },
   render() {
     return (
-      <NSpace class="sso-signing" align="center">
+      <NFlex class="sso-signing" align="center">
         {this.ssoSigningOptions.map((curr) => (
           <NPopover key={curr.key}>
             {{
@@ -75,7 +75,7 @@ const SSOSigning = defineComponent({
             }}
           </NPopover>
         ))}
-      </NSpace>
+      </NFlex>
     )
   },
 })
diff --git a/src/views/login/index.tsx b/src/views/login/index.tsx
index 80406069..a628920b 100644
--- a/src/views/login/index.tsx
+++ b/src/views/login/index.tsx
@@ -1,7 +1,7 @@
 import './index.scss'
 
 import {
-  NSpace,
+  NFlex,
   NCard,
   NTabs,
   NTabPane,
@@ -63,13 +63,13 @@ const Login = defineComponent({
           ]}
         >
           <div class={['login-wrapper__content']}>
-            <NSpace align="center" class="login-title__wrapper">
+            <NFlex align="center" class="login-title__wrapper">
               <RIcon name="ray" size="48" />
               <NGradientText class="login-title" type="info" size={28}>
                 Ray Template
               </NGradientText>
-            </NSpace>
-            <NSpace align="center" class="login-action__wrapper">
+            </NFlex>
+            <NFlex align="center" class="login-action__wrapper">
               <ThemeSwitch />
               <NDropdown
                 options={LOCAL_OPTIONS}
@@ -83,7 +83,7 @@ const Login = defineComponent({
                   cursor="pointer"
                 />
               </NDropdown>
-            </NSpace>
+            </NFlex>
             <NGrid
               cols={'s:1 m:1 l:2 xl:2 2xl:2'}
               itemResponsive={false}
@@ -93,12 +93,12 @@ const Login = defineComponent({
                 span={'s:0 m:0 l:1 xl:1 2xl:1'}
                 class="login__left-wrapper"
               >
-                <NSpace align="center" vertical>
+                <NFlex align="center" vertical>
                   <RIcon name="login_bg" width="368" height="368" />
                   <NGradientText class="login-title" type="info" size={36}>
-                    开箱即用的中后台管理系统
+                    {$t('views.login.index.RayTemplate')}
                   </NGradientText>
-                </NSpace>
+                </NFlex>
               </NGridItem>
               <NGridItem span={1} class="login__right-wrapper">
                 <NCard
@@ -144,13 +144,13 @@ const Login = defineComponent({
                 </NCard>
               </NGridItem>
             </NGrid>
-            <NSpace
+            <NFlex
               align="center"
               justify="center"
               class="login-copyright__wrapper"
             >
               {this.copyright}
-            </NSpace>
+            </NFlex>
           </div>
         </div>
       </div>
diff --git a/tsconfig.json b/tsconfig.json
index 8727c8db..70404a79 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -35,7 +35,7 @@
     "vite.config.ts",
     "vite-plugins/index.ts",
     "vite-plugins/type.ts",
-    "cfg.ts",
+    "vite.custom.config.ts",
     "package.json",
     "vite-env.d.ts",
     "./unplugin/**/*",
diff --git a/vite.config.ts b/vite.config.ts
index 8239062e..2fedc172 100644
--- a/vite.config.ts
+++ b/vite.config.ts
@@ -1,6 +1,6 @@
 import { defineConfig } from 'vite'
 
-import config from './cfg'
+import config from './vite.custom.config'
 import pkg from './package.json'
 import vitePlugins from './vite.plugin.config'
 
diff --git a/cfg.ts b/vite.custom.config.ts
similarity index 97%
rename from cfg.ts
rename to vite.custom.config.ts
index 5dee5ebb..d9e0ebed 100644
--- a/cfg.ts
+++ b/vite.custom.config.ts
@@ -18,7 +18,7 @@
  *   - 系统: 根路由、标题、浏览器标题、别名等
  *   - 请求: 代理配置
  *
- * 如果需要新增相关内容, 需要在 src/types/modules/cfg.ts 中进行类型配置
+ * 如果需要新增相关内容, 需要在 src/types/modules/viteCustomConfig.ts 中进行类型配置
  * ```
  * interface Config // config 内容类型配置
  *
diff --git a/vite.plugin.config.ts b/vite.plugin.config.ts
index 8bc39a67..5055ddf1 100644
--- a/vite.plugin.config.ts
+++ b/vite.plugin.config.ts
@@ -29,7 +29,7 @@ import { cdn as viteCDNPlugin } from 'vite-plugin-cdn2'
 
 import { NaiveUiResolver } from 'unplugin-vue-components/resolvers'
 
-import config from './cfg'
+import config from './vite.custom.config'
 
 import type { PluginOption } from 'vite'
 
@@ -50,56 +50,61 @@ function onlyReportOptions(mode: string) {
 function onlyBuildOptions(mode: string) {
   return [
     viteCDNPlugin({
-      url: 'https://www.staticfile.org/',
       // modules 顺序 vue, vue-demi 必须保持当前顺序加载,否则会出现加载错误问题
       modules: [
         {
           name: 'vue',
           global: 'Vue',
-          resolve: 'https://cdn.staticfile.org/vue/3.4.7/vue.global.min.js',
+          resolve:
+            'https://cdnjs.cloudflare.com/ajax/libs/vue/3.4.14/vue.global.min.js',
         },
         {
           name: 'vue-demi',
           global: 'VueDemi',
           resolve:
-            'https://cdn.staticfile.org/vue-demi/0.14.6/index.iife.min.js',
+            'https://cdnjs.cloudflare.com/ajax/libs/vue-demi/0.14.6/index.iife.min.js',
         },
         {
           name: 'naive-ui',
           global: 'naive',
-          resolve: 'https://cdn.staticfile.org/naive-ui/2.35.0/index.min.js',
+          resolve:
+            'https://cdnjs.cloudflare.com/ajax/libs/naive-ui/2.37.3/index.prod.js',
         },
         {
           name: 'pinia',
           global: 'Pinia',
-          resolve: 'https://cdn.staticfile.org/pinia/2.1.7/pinia.iife.min.js',
+          resolve:
+            'https://cdnjs.cloudflare.com/ajax/libs/pinia/2.1.7/pinia.iife.min.js',
         },
         {
           name: 'vue-router',
           global: 'VueRouter',
           resolve:
-            'https://cdn.staticfile.org/vue-router/4.2.5/vue-router.global.min.js',
+            'https://cdnjs.cloudflare.com/ajax/libs/vue-router/4.2.5/vue-router.global.min.js',
         },
         {
           name: 'vue-i18n',
           global: 'VueI18n',
           resolve:
-            'https://cdn.staticfile.org/vue-i18n/9.9.0/vue-i18n.global.min.js',
+            'https://cdnjs.cloudflare.com/ajax/libs/vue-i18n/9.9.0/vue-i18n.global.min.js',
         },
         {
           name: 'echarts',
           global: 'echarts',
-          resolve: 'https://cdn.staticfile.org/echarts/5.4.3/echarts.min.js',
+          resolve:
+            'https://cdnjs.cloudflare.com/ajax/libs/echarts/5.4.3/echarts.min.js',
         },
         {
           name: 'xlsx',
           global: 'XLSX',
-          resolve: 'https://cdn.staticfile.org/xlsx/0.18.5/xlsx.full.min.js',
+          resolve:
+            'https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.18.5/xlsx.full.min.js',
         },
         {
           name: 'axios',
           global: 'axios',
-          resolve: 'https://cdn.staticfile.org/axios/1.6.2/axios.min.js',
+          resolve:
+            'https://cdnjs.cloudflare.com/ajax/libs/axios/1.6.5/axios.min.js',
         },
       ],
     }),