From f32a7105c38ee455c4b165d48651ef19fc6948db Mon Sep 17 00:00:00 2001
From: ahaos <8406649+lhailgl@user.noreply.gitee.com>
Date: 星期三, 13 十二月 2023 18:35:55 +0800
Subject: [PATCH] !68 修复升级依赖带来的问题 * Merge remote-tracking branch 'origin/dev' into dev * 升级依赖 * Merge remote-tracking branch 'origin/ts' into ts * 升级依赖 * Merge branch 'dev' of gitee.com:JavaLionLi/plus-ui into ts * 升级依赖 * !61 fix: 删除重复环境变量ElUploadInstance * fix: 删除重复环境变量ElUploadInstance

---
 src/components/BuildCode/render.vue        |    4 
 src/store/modules/app.ts                   |    4 
 src/types/global.d.ts                      |   82 ++++++-----
 src/enums/LanguageEnum.ts                  |    5 
 src/components/SizeSelect/index.vue        |    2 
 src/types/module.d.ts                      |   20 +-
 src/main.ts                                |   19 --
 src/permission.ts                          |    6 
 src/lang/index.ts                          |    7 
 src/components/IconSelect/index.vue        |    2 
 src/views/system/user/index.vue            |    5 
 src/plugins/index.ts                       |   19 ++
 .prettierrc                                |    2 
 src/views/tool/gen/genInfoForm.vue         |    2 
 src/views/system/user/profile/userInfo.vue |    6 
 src/store/modules/settings.ts              |   55 ++-----
 package.json                               |   20 +-
 src/utils/ruoyi.ts                         |    4 
 src/components/ImagePreview/index.vue      |    2 
 src/layout/components/Settings/index.vue   |   98 ++++---------
 src/App.vue                                |    2 
 src/settings.ts                            |    9 +
 22 files changed, 172 insertions(+), 203 deletions(-)

diff --git a/.prettierrc b/.prettierrc
index 0b00890..6ca3ce5 100644
--- a/.prettierrc
+++ b/.prettierrc
@@ -4,7 +4,7 @@
   "useTabs": false,
   "semi": true,
   "singleQuote": true,
-  "quoteProps": "as-needed",
+  "quoteProps": "preserve",
   "jsxSingleQuote": false,
   "bracketSameLine": false,
   "trailingComma": "none",
diff --git a/package.json b/package.json
index 95cd2a1..3b1c1d6 100644
--- a/package.json
+++ b/package.json
@@ -18,19 +18,19 @@
     "url": "https://gitee.com/JavaLionLi/plus-ui.git"
   },
   "dependencies": {
-    "@element-plus/icons-vue": "2.1.0",
+    "@element-plus/icons-vue": "2.3.1",
     "@vueup/vue-quill": "1.2.0",
     "@vueuse/core": "10.7.0",
     "animate.css": "4.1.1",
     "await-to-js": "^3.0.0",
     "axios": "^1.3.4",
     "crypto-js": "^4.1.1",
-    "echarts": "5.4.0",
+    "echarts": "5.4.3",
     "element-plus": "2.4.3",
     "file-saver": "2.0.5",
     "fuse.js": "6.6.2",
-    "js-cookie": "3.0.1",
-    "jsencrypt": "3.3.1",
+    "js-cookie": "3.0.5",
+    "jsencrypt": "3.3.2",
     "nprogress": "0.2.0",
     "path-browserify": "1.0.1",
     "path-to-regexp": "6.2.0",
@@ -38,14 +38,14 @@
     "screenfull": "6.0.0",
     "vform3-builds": "3.0.8",
     "vue": "3.3.11",
-    "vue-cropper": "1.0.3",
+    "vue-cropper": "1.1.1",
     "vue-i18n": "9.2.2",
     "vue-router": "4.2.5",
     "vue-types": "5.1.1"
   },
   "devDependencies": {
-    "@iconify/json": "^2.2.40",
-    "@intlify/unplugin-vue-i18n": "0.8.2",
+    "@iconify/json": "^2.2.157",
+    "@intlify/unplugin-vue-i18n": "1.6.0",
     "@types/crypto-js": "^4.1.1",
     "@types/file-saver": "2.0.5",
     "@types/js-cookie": "3.0.3",
@@ -57,7 +57,7 @@
     "@unocss/preset-attributify": "^0.58.0",
     "@unocss/preset-icons": "^0.58.0",
     "@unocss/preset-uno": "^0.58.0",
-    "@vue/compiler-sfc": "3.2.45",
+    "@vue/compiler-sfc": "3.3.9",
     "@vitejs/plugin-vue": "4.5.2",
     "autoprefixer": "10.4.14",
     "eslint": "8.55.0",
@@ -72,13 +72,13 @@
     "husky": "7.0.4",
     "postcss": "^8.4.21",
     "prettier": "3.1.1",
-    "sass": "1.56.1",
+    "sass": "1.69.5",
     "typescript": "5.2.2",
     "unocss": "^0.58.0",
     "unplugin-auto-import": "0.17.2",
     "unplugin-icons": "0.18.1",
     "unplugin-vue-components": "0.26.0",
-    "unplugin-vue-setup-extend-plus": "0.4.9",
+    "unplugin-vue-setup-extend-plus": "1.0.0",
     "vite-plugin-compression": "0.5.1",
     "vite-plugin-svg-icons": "2.0.1",
     "vitest": "^0.29.7",
diff --git a/src/App.vue b/src/App.vue
index 0b058d7..a93790a 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -10,7 +10,7 @@
 import useAppStore from '@/store/modules/app';
 
 const appStore = useAppStore();
-const size = computed(() => appStore.size as any);
+const size = computed(() => appStore.size);
 
 onMounted(() => {
   nextTick(() => {
diff --git a/src/components/BuildCode/render.vue b/src/components/BuildCode/render.vue
index 3c0865c..aeb9312 100644
--- a/src/components/BuildCode/render.vue
+++ b/src/components/BuildCode/render.vue
@@ -18,7 +18,7 @@
   isView: false
 });
 
-const vFormRef = ref(null);
+const vFormRef = ref();
 // 鑾峰彇琛ㄥ崟鏁版嵁-寮傛
 const getFormData = () => {
   return vFormRef.value.getFormData();
@@ -29,7 +29,7 @@
  * @param {琛ㄥ崟閰嶇疆} formConf
  * formConfig锛歿 formTemplate锛氳〃鍗曟ā鏉匡紝formData锛氳〃鍗曟暟鎹紝hiddenField锛氶渶瑕侀殣钘忕殑瀛楁瀛楃涓查泦鍚堬紝disabledField锛氶渶瑕佺鐢ㄧ殑鑷瀛楃涓查泦鍚坿
  */
-const initForm = (formConf) => {
+const initForm = (formConf: any) => {
   const { formTemplate, formData, hiddenField, disabledField } = toRaw(formConf);
   if (formTemplate) {
     vFormRef.value.setFormJson(formTemplate);
diff --git a/src/components/IconSelect/index.vue b/src/components/IconSelect/index.vue
index 7e392e7..3bfde4d 100644
--- a/src/components/IconSelect/index.vue
+++ b/src/components/IconSelect/index.vue
@@ -1,5 +1,5 @@
 <template>
-  <div class="relative" :style="{ width: width }">
+  <div class="relative" :style="{ 'width': width }">
     <el-input v-model="modelValue" readonly placeholder="鐐瑰嚮閫夋嫨鍥炬爣" @click="visible = !visible">
       <template #prepend>
         <svg-icon :icon-class="modelValue" />
diff --git a/src/components/ImagePreview/index.vue b/src/components/ImagePreview/index.vue
index 349c443..31bf873 100644
--- a/src/components/ImagePreview/index.vue
+++ b/src/components/ImagePreview/index.vue
@@ -37,7 +37,7 @@
   }
   let real_src_list = props.src.split(',');
   let srcList: string[] = [];
-  real_src_list.forEach((item) => {
+  real_src_list.forEach((item: string) => {
     return srcList.push(item);
   });
   return srcList;
diff --git a/src/components/SizeSelect/index.vue b/src/components/SizeSelect/index.vue
index 86671f5..abf72cc 100644
--- a/src/components/SizeSelect/index.vue
+++ b/src/components/SizeSelect/index.vue
@@ -27,7 +27,7 @@
   { label: '绋嶅皬', value: 'small' }
 ]);
 
-const handleSetSize = (size: string) => {
+const handleSetSize = (size: 'large' | 'default' | 'small') => {
   appStore.setSize(size);
 };
 </script>
diff --git a/src/enums/LanguageEnum.ts b/src/enums/LanguageEnum.ts
new file mode 100644
index 0000000..c857c43
--- /dev/null
+++ b/src/enums/LanguageEnum.ts
@@ -0,0 +1,5 @@
+export enum LanguageEnum {
+  zh_CN = 'zh_CN',
+
+  en_US = 'en_US'
+}
diff --git a/src/lang/index.ts b/src/lang/index.ts
index dddb86b..071599e 100644
--- a/src/lang/index.ts
+++ b/src/lang/index.ts
@@ -4,6 +4,7 @@
 // 鏈湴璇█鍖�
 import enUSLocale from './en_US';
 import zhCNLocale from './zh_CN';
+import { LanguageEnum } from '@/enums/LanguageEnum';
 
 const messages = {
   zh_CN: {
@@ -18,12 +19,12 @@
  * 鑾峰彇褰撳墠璇█
  * @returns zh-cn|en ...
  */
-export const getLanguage = () => {
-  const language = useStorage('language', 'zh_CN');
+export const getLanguage = (): LanguageEnum => {
+  const language = useStorage<LanguageEnum>('language', LanguageEnum.zh_CN);
   if (language.value) {
     return language.value;
   }
-  return 'zh_CN';
+  return LanguageEnum.zh_CN;
 };
 
 const i18n = createI18n({
diff --git a/src/layout/components/Settings/index.vue b/src/layout/components/Settings/index.vue
index c748998..2a2e077 100644
--- a/src/layout/components/Settings/index.vue
+++ b/src/layout/components/Settings/index.vue
@@ -48,35 +48,35 @@
     <div class="drawer-item">
       <span>寮�鍚� TopNav</span>
       <span class="comp-style">
-        <el-switch v-model="topNav" class="drawer-switch" />
+        <el-switch v-model="settingsStore.topNav" class="drawer-switch" @change="topNavChange" />
       </span>
     </div>
 
     <div class="drawer-item">
       <span>寮�鍚� Tags-Views</span>
       <span class="comp-style">
-        <el-switch v-model="tagsView" class="drawer-switch" />
+        <el-switch v-model="settingsStore.tagsView" class="drawer-switch" />
       </span>
     </div>
 
     <div class="drawer-item">
       <span>鍥哄畾 Header</span>
       <span class="comp-style">
-        <el-switch v-model="fixedHeader" class="drawer-switch" />
+        <el-switch v-model="settingsStore.fixedHeader" class="drawer-switch" />
       </span>
     </div>
 
     <div class="drawer-item">
       <span>鏄剧ず Logo</span>
       <span class="comp-style">
-        <el-switch v-model="sidebarLogo" class="drawer-switch" />
+        <el-switch v-model="settingsStore.sidebarLogo" class="drawer-switch" />
       </span>
     </div>
 
     <div class="drawer-item">
       <span>鍔ㄦ�佹爣棰�</span>
       <span class="comp-style">
-        <el-switch v-model="dynamicTitle" class="drawer-switch" />
+        <el-switch v-model="settingsStore.dynamicTitle" class="drawer-switch" @change="dynamicTitleChange" />
       </span>
     </div>
 
@@ -93,8 +93,8 @@
 import useSettingsStore from '@/store/modules/settings';
 import usePermissionStore from '@/store/modules/permission';
 import { handleThemeStyle } from '@/utils/theme';
-import { SettingTypeEnum } from '@/enums/SettingTypeEnum';
 import { SideThemeEnum } from '@/enums/SideThemeEnum';
+import defaultSettings from '@/settings';
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 const appStore = useAppStore();
@@ -113,92 +113,58 @@
   valueDark: 'dark',
   valueLight: 'light'
 });
+// 鍖归厤鑿滃崟棰滆壊
 watch(isDark, () => {
   if (isDark.value) {
-    settingsStore.changeSetting({ key: SettingTypeEnum.SIDE_THEME, value: SideThemeEnum.DARK });
+    settingsStore.sideTheme = SideThemeEnum.DARK;
   } else {
-    settingsStore.changeSetting({ key: SettingTypeEnum.SIDE_THEME, value: sideTheme.value });
+    settingsStore.sideTheme = sideTheme.value;
   }
 });
 const toggleDark = () => useToggle(isDark);
 
-/** 鏄惁闇�瑕乼opNav */
-const topNav = computed({
-  get: () => storeSettings.value.topNav,
-  set: (val) => {
-    settingsStore.changeSetting({ key: SettingTypeEnum.TOP_NAV, value: val });
-    if (!val) {
-      appStore.toggleSideBarHide(false);
-      permissionStore.setSidebarRouters(permissionStore.defaultRoutes);
-    }
+const topNavChange = (val) => {
+  if (!val) {
+    appStore.toggleSideBarHide(false);
+    permissionStore.setSidebarRouters(permissionStore.defaultRoutes);
   }
-});
-/** 鏄惁闇�瑕乼agview */
-const tagsView = computed({
-  get: () => storeSettings.value.tagsView,
-  set: (val) => {
-    settingsStore.changeSetting({ key: SettingTypeEnum.TAGS_VIEW, value: val });
-  }
-});
-/**鏄惁闇�瑕佸浐瀹氬ご閮� */
-const fixedHeader = computed({
-  get: () => storeSettings.value.fixedHeader,
-  set: (val) => {
-    settingsStore.changeSetting({ key: SettingTypeEnum.FIXED_HEADER, value: val });
-  }
-});
-/**鏄惁闇�瑕佷晶杈规爮鐨刲ogo */
-const sidebarLogo = computed({
-  get: () => storeSettings.value.sidebarLogo,
-  set: (val) => {
-    settingsStore.changeSetting({ key: SettingTypeEnum.SIDEBAR_LOGO, value: val });
-  }
-});
-/**鏄惁闇�瑕佷晶杈规爮鐨勫姩鎬佺綉椤电殑title */
-const dynamicTitle = computed({
-  get: () => storeSettings.value.dynamicTitle,
-  set: (val) => {
-    settingsStore.changeSetting({ key: SettingTypeEnum.DYNAMIC_TITLE, value: val });
-    // 鍔ㄦ�佽缃綉椤垫爣棰�
-    useDynamicTitle();
-  }
-});
+};
+
+const dynamicTitleChange = () => {
+  // 鍔ㄦ�佽缃綉椤垫爣棰�
+  useDynamicTitle();
+};
 
 const themeChange = (val: string) => {
-  settingsStore.changeSetting({ key: SettingTypeEnum.THEME, value: val });
-  theme.value = val;
-  if (val) {
-    handleThemeStyle(val);
-  }
+  settingsStore.theme = val;
+  handleThemeStyle(val);
 };
 const handleTheme = (val: string) => {
   sideTheme.value = val;
   if (isDark.value && val === SideThemeEnum.LIGHT) {
     // 鏆楅粦妯″紡棰滆壊涓嶅彉
-    settingsStore.changeSetting({ key: SettingTypeEnum.SIDE_THEME, value: SideThemeEnum.DARK });
+    settingsStore.sideTheme = SideThemeEnum.DARK;
     return;
   }
-  settingsStore.changeSetting({ key: SettingTypeEnum.SIDE_THEME, value: val });
+  settingsStore.sideTheme = val;
 };
 const saveSetting = () => {
   proxy?.$modal.loading('姝e湪淇濆瓨鍒版湰鍦帮紝璇风◢鍊�...');
-  let layoutSetting = {
-    topNav: storeSettings.value.topNav,
-    tagsView: storeSettings.value.tagsView,
-    fixedHeader: storeSettings.value.fixedHeader,
-    sidebarLogo: storeSettings.value.sidebarLogo,
-    dynamicTitle: storeSettings.value.dynamicTitle,
-    sideTheme: storeSettings.value.sideTheme,
-    theme: storeSettings.value.theme
-  };
-  localStorage.setItem('layout-setting', JSON.stringify(layoutSetting));
+  const settings = useStorage<LayoutSetting>('layout-setting', defaultSettings);
+  settings.value.topNav = storeSettings.value.topNav;
+  settings.value.tagsView = storeSettings.value.tagsView;
+  settings.value.fixedHeader = storeSettings.value.fixedHeader;
+  settings.value.sidebarLogo = storeSettings.value.sidebarLogo;
+  settings.value.dynamicTitle = storeSettings.value.dynamicTitle;
+  settings.value.sideTheme = storeSettings.value.sideTheme;
+  settings.value.theme = storeSettings.value.theme;
   setTimeout(() => {
     proxy?.$modal.closeLoading();
   }, 1000);
 };
 const resetSetting = () => {
   proxy?.$modal.loading('姝e湪娓呴櫎璁剧疆缂撳瓨骞跺埛鏂帮紝璇风◢鍊�...');
-  localStorage.removeItem('layout-setting');
+  useStorage<any>('layout-setting', null).value = null;
   setTimeout('window.location.reload()', 1000);
 };
 const openSetting = () => {
diff --git a/src/main.ts b/src/main.ts
index 0ad939a..7d5d153 100644
--- a/src/main.ts
+++ b/src/main.ts
@@ -14,10 +14,6 @@
 
 // 娉ㄥ唽鎻掍欢
 import plugins from './plugins/index'; // plugins
-import { download } from '@/utils/request';
-
-// 棰勮鍔ㄧ敾
-import animate from './animate';
 
 // svg鍥炬爣
 import 'virtual:svg-icons-register';
@@ -26,25 +22,10 @@
 // permission control
 import './permission';
 
-import { useDict } from '@/utils/dict';
-import { getConfigKey, updateConfigByKey } from '@/api/system/config';
-import { parseTime, addDateRange, handleTree, selectDictLabel, selectDictLabels } from '@/utils/ruoyi';
-
 // 鍥介檯鍖�
 import i18n from '@/lang/index';
 
 const app = createApp(App);
-// 鍏ㄥ眬鏂规硶鎸傝浇
-app.config.globalProperties.useDict = useDict;
-app.config.globalProperties.getConfigKey = getConfigKey;
-app.config.globalProperties.updateConfigByKey = updateConfigByKey;
-app.config.globalProperties.download = download;
-app.config.globalProperties.parseTime = parseTime;
-app.config.globalProperties.handleTree = handleTree;
-app.config.globalProperties.addDateRange = addDateRange;
-app.config.globalProperties.selectDictLabel = selectDictLabel;
-app.config.globalProperties.selectDictLabels = selectDictLabels;
-app.config.globalProperties.animate = animate;
 
 app.use(ElementIcons);
 app.use(router);
diff --git a/src/permission.ts b/src/permission.ts
index 402fdec..2fc105b 100644
--- a/src/permission.ts
+++ b/src/permission.ts
@@ -16,13 +16,13 @@
 router.beforeEach(async (to, from, next) => {
   NProgress.start();
   if (getToken()) {
-    to.meta.title && useSettingsStore().setTitle(to.meta.title as string);
+    to.meta.title && useSettingsStore().setTitle(to.meta.title);
     /* has token*/
     if (to.path === '/login') {
       next({ path: '/' });
       NProgress.done();
-    } else if (whiteList.indexOf(to.path) !== -1) {
-      next()
+    } else if (whiteList.indexOf(to.path as string) !== -1) {
+      next();
     } else {
       if (useUserStore().roles.length === 0) {
         isRelogin.show = true;
diff --git a/src/plugins/index.ts b/src/plugins/index.ts
index 09d550a..6c5e0c3 100644
--- a/src/plugins/index.ts
+++ b/src/plugins/index.ts
@@ -3,6 +3,13 @@
 import download from './download';
 import cache from './cache';
 import auth from './auth';
+// 棰勮鍔ㄧ敾
+import animate from '@/animate';
+
+import { download as dl } from '@/utils/request';
+import { useDict } from '@/utils/dict';
+import { getConfigKey, updateConfigByKey } from '@/api/system/config';
+import { parseTime, addDateRange, handleTree, selectDictLabel, selectDictLabels } from '@/utils/ruoyi';
 
 import { App } from 'vue';
 
@@ -21,4 +28,16 @@
 
   // 璁よ瘉瀵硅薄
   app.config.globalProperties.$auth = auth;
+
+  // 鍏ㄥ眬鏂规硶鎸傝浇
+  app.config.globalProperties.useDict = useDict;
+  app.config.globalProperties.getConfigKey = getConfigKey;
+  app.config.globalProperties.updateConfigByKey = updateConfigByKey;
+  app.config.globalProperties.download = dl;
+  app.config.globalProperties.parseTime = parseTime;
+  app.config.globalProperties.handleTree = handleTree;
+  app.config.globalProperties.addDateRange = addDateRange;
+  app.config.globalProperties.selectDictLabel = selectDictLabel;
+  app.config.globalProperties.selectDictLabels = selectDictLabels;
+  app.config.globalProperties.animate = animate;
 }
diff --git a/src/settings.ts b/src/settings.ts
index 9cebde7..4b62c75 100644
--- a/src/settings.ts
+++ b/src/settings.ts
@@ -1,3 +1,5 @@
+import { LanguageEnum } from '@/enums/LanguageEnum';
+
 const setting: DefaultSettings = {
   /**
    * 缃戦〉鏍囬
@@ -50,6 +52,11 @@
 
   animationEnable: false,
 
-  dark: false
+  dark: false,
+  language: LanguageEnum.zh_CN,
+
+  size: 'default',
+
+  layout: ''
 };
 export default setting;
diff --git a/src/store/modules/app.ts b/src/store/modules/app.ts
index 90866c1..0205fab 100644
--- a/src/store/modules/app.ts
+++ b/src/store/modules/app.ts
@@ -9,7 +9,7 @@
     hide: false
   });
   const device = ref<string>('desktop');
-  const size = useStorage('size', 'default');
+  const size = useStorage<'large' | 'default' | 'small'>('size', 'default');
 
   // 璇█
   const language = useStorage('language', 'zh_CN');
@@ -43,7 +43,7 @@
   const toggleDevice = (d: string): void => {
     device.value = d;
   };
-  const setSize = (s: string): void => {
+  const setSize = (s: 'large' | 'default' | 'small'): void => {
     size.value = s;
   };
   const toggleSideBarHide = (status: boolean): void => {
diff --git a/src/store/modules/settings.ts b/src/store/modules/settings.ts
index 861c6c8..ef49b3c 100644
--- a/src/store/modules/settings.ts
+++ b/src/store/modules/settings.ts
@@ -1,43 +1,29 @@
 import { defineStore } from 'pinia';
 import defaultSettings from '@/settings';
-import { SettingTypeEnum } from '@/enums/SettingTypeEnum';
 import { useDynamicTitle } from '@/utils/dynamicTitle';
+
 export const useSettingsStore = defineStore('setting', () => {
-  const storageSetting = JSON.parse(localStorage.getItem('layout-setting') || '{}');
+  const storageSetting = useStorage<LayoutSetting>('layout-setting', {
+    topNav: defaultSettings.topNav,
+    tagsView: defaultSettings.tagsView,
+    fixedHeader: defaultSettings.fixedHeader,
+    sidebarLogo: defaultSettings.sidebarLogo,
+    dynamicTitle: defaultSettings.dynamicTitle,
+    sideTheme: defaultSettings.sideTheme,
+    theme: defaultSettings.theme
+  });
   const title = ref<string>(defaultSettings.title);
-  const theme = ref<string>(storageSetting.theme || defaultSettings.theme);
-  const sideTheme = ref<string>(storageSetting.sideTheme || defaultSettings.sideTheme);
-  const showSettings = ref<boolean>(storageSetting.showSettings || defaultSettings.showSettings);
-  const topNav = ref<boolean>(storageSetting.topNav === undefined ? defaultSettings.topNav : storageSetting.topNav);
-  const tagsView = ref<boolean>(storageSetting.tagsView === undefined ? defaultSettings.tagsView : storageSetting.tagsView);
-  const fixedHeader = ref<boolean>(storageSetting.fixedHeader === undefined ? defaultSettings.fixedHeader : storageSetting.fixedHeader);
-  const sidebarLogo = ref<boolean>(storageSetting.sidebarLogo === undefined ? defaultSettings.sidebarLogo : storageSetting.sidebarLogo);
-  const dynamicTitle = ref<boolean>(storageSetting.dynamicTitle === undefined ? defaultSettings.dynamicTitle : storageSetting.dynamicTitle);
-  const animationEnable = ref<boolean>(
-    storageSetting.animationEnable === undefined ? defaultSettings.animationEnable : storageSetting.animationEnable
-  );
-  const dark = ref<boolean>(storageSetting.dark || defaultSettings.dark);
+  const theme = ref<string>(storageSetting.value.theme);
+  const sideTheme = ref<string>(storageSetting.value.sideTheme);
+  const showSettings = ref<boolean>(defaultSettings.showSettings);
+  const topNav = ref<boolean>(storageSetting.value.topNav);
+  const tagsView = ref<boolean>(storageSetting.value.tagsView);
+  const fixedHeader = ref<boolean>(storageSetting.value.fixedHeader);
+  const sidebarLogo = ref<boolean>(storageSetting.value.sidebarLogo);
+  const dynamicTitle = ref<boolean>(storageSetting.value.dynamicTitle);
+  const animationEnable = ref<boolean>(defaultSettings.animationEnable);
+  const dark = ref<boolean>(defaultSettings.dark);
 
-  const prop: { [key: string]: Ref<any> } = {
-    theme,
-    sideTheme,
-    showSettings,
-    topNav,
-    tagsView,
-    fixedHeader,
-    sidebarLogo,
-    dynamicTitle,
-    animationEnable,
-    dark
-  };
-
-  // actions
-  const changeSetting = (param: { key: SettingTypeEnum; value: any }) => {
-    const { key, value } = param;
-    if (key in prop) {
-      prop[key].value = value;
-    }
-  };
   const setTitle = (value: string) => {
     title.value = value;
     useDynamicTitle();
@@ -54,7 +40,6 @@
     dynamicTitle,
     animationEnable,
     dark,
-    changeSetting,
     setTitle
   };
 });
diff --git a/src/types/global.d.ts b/src/types/global.d.ts
index bb1c1e2..c6cb210 100644
--- a/src/types/global.d.ts
+++ b/src/types/global.d.ts
@@ -1,4 +1,5 @@
 import type { ComponentInternalInstance as ComponentInstance, PropType as VuePropType } from 'vue/runtime-core';
+import { LanguageEnum } from '@/enums/LanguageEnum';
 
 declare global {
   /** vue Instance */
@@ -49,6 +50,8 @@
     /** 鏄惁绂佺敤涓婁紶 */
     isUploading: boolean;
 
+    updateSupport: number;
+
     /** 鍏朵粬鍙傛暟 */
     [key: string]: any;
   }
@@ -87,76 +90,77 @@
     pageNum: number;
     pageSize: number;
   }
+  declare interface LayoutSetting {
+    /**
+     * 鏄惁鏄剧ず椤堕儴瀵艰埅
+     */
+    topNav: boolean;
 
-  declare type DefaultSettings = {
+    /**
+     * 鏄惁鏄剧ず澶氭爣绛惧鑸�
+     */
+    tagsView: boolean;
+    /**
+     * 鏄惁鍥哄畾澶撮儴
+     */
+    fixedHeader: boolean;
+    /**
+     * 鏄惁鏄剧ず渚ц竟鏍廘ogo
+     */
+    sidebarLogo: boolean;
+    /**
+     * 鏄惁鏄剧ず鍔ㄦ�佹爣棰�
+     */
+    dynamicTitle: boolean;
+    /**
+     * 渚ц竟鏍忎富棰� theme-dark | theme-light
+     */
+    sideTheme: string;
+    /**
+     * 涓婚妯″紡
+     */
+    theme: string;
+  }
+
+  declare interface DefaultSettings extends LayoutSetting {
     /**
      * 缃戦〉鏍囬
      */
     title: string;
 
     /**
-     * 渚ц竟鏍忎富棰� theme-dark | theme-light
-     */
-    sideTheme?: string;
-
-    /**
      * 鏄惁鏄剧ず绯荤粺甯冨眬璁剧疆
      */
-    showSettings?: boolean;
+    showSettings: boolean;
 
-    /**
-     * 鏄惁鏄剧ず椤堕儴瀵艰埅
-     */
-    topNav?: boolean;
-
-    /**
-     * 鏄惁鏄剧ず澶氭爣绛惧鑸�
-     */
-    tagsView?: boolean;
-    /**
-     * 鏄惁鍥哄畾澶撮儴
-     */
-    fixedHeader?: boolean;
-    /**
-     * 鏄惁鏄剧ず渚ц竟鏍廘ogo
-     */
-    sidebarLogo?: boolean;
     /**
      * 瀵艰埅鏍忓竷灞�
      */
-    layout?: string;
-    /**
-     * 涓婚妯″紡
-     */
-    theme?: string;
+    layout: string;
 
     /**
      * 甯冨眬澶у皬
      */
-    size?: string;
+    size: 'large' | 'default' | 'small';
 
     /**
      * 璇█
      */
-    language?: string;
+    language: LanguageEnum;
 
-    /**
-     * 鏄惁鏄剧ず鍔ㄦ�佹爣棰�
-     */
-    dynamicTitle?: boolean;
     /**
      * 鏄惁鍚敤鍔ㄧ敾鏁堟灉
      */
-    animationEnable?: boolean;
+    animationEnable: boolean;
     /**
      *  鏄惁鍚敤鏆楅粦妯″紡
      *
      * true:鏆楅粦妯″紡
      * false: 鏄庝寒妯″紡
      */
-    dark?: boolean;
+    dark: boolean;
 
-    errorLog?: string;
-  };
+    errorLog: string;
+  }
 }
 export {};
diff --git a/src/types/module.d.ts b/src/types/module.d.ts
index 987c349..b1be08d 100644
--- a/src/types/module.d.ts
+++ b/src/types/module.d.ts
@@ -1,13 +1,13 @@
-import type modal from '@/plugins/modal';
-import type tab from '@/plugins/tab';
-import type download from '@/plugins/download';
-import type auth from '@/plugins/auth';
-import type cache from '@/plugins/cache';
-import type animate from '@/animate';
-import type { useDict } from '@/utils/dict';
-import type { addDateRange, handleTree, selectDictLabel, selectDictLabels, parseTime } from '@/utils/ruoyi';
-import type { getConfigKey, updateConfigByKey } from '@/api/system/config';
-import type { download as rd } from '@/utils/request';
+import modal from '@/plugins/modal';
+import tab from '@/plugins/tab';
+import download from '@/plugins/download';
+import auth from '@/plugins/auth';
+import cache from '@/plugins/cache';
+import animate from '@/animate';
+import { useDict } from '@/utils/dict';
+import handleTree, { addDateRange, selectDictLabel, selectDictLabels, parseTime } from '@/utils/ruoyi';
+import { getConfigKey, updateConfigByKey } from '@/api/system/config';
+import { download as rd } from '@/utils/request';
 
 declare module '@vue/runtime-core' {
   interface ComponentCustomProperties {
diff --git a/src/utils/ruoyi.ts b/src/utils/ruoyi.ts
index a116b52..bbba282 100644
--- a/src/utils/ruoyi.ts
+++ b/src/utils/ruoyi.ts
@@ -245,3 +245,7 @@
 export const blobValidate = (data: any) => {
   return data.type !== 'application/json';
 };
+
+export default {
+  handleTree
+};
diff --git a/src/views/system/user/index.vue b/src/views/system/user/index.vue
index 79ae8f8..56078d9 100644
--- a/src/views/system/user/index.vue
+++ b/src/views/system/user/index.vue
@@ -306,9 +306,8 @@
 import { globalHeaders } from '@/utils/request';
 
 const router = useRouter();
-const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+const { proxy } = getCurrentInstance();
 const { sys_normal_disable, sys_user_sex } = toRefs<any>(proxy?.useDict('sys_normal_disable', 'sys_user_sex'));
-
 const userList = ref<UserVO[]>();
 const loading = ref(true);
 const showSearch = ref(true);
@@ -512,7 +511,7 @@
       inputErrorMessage: '鐢ㄦ埛瀵嗙爜闀垮害蹇呴』浠嬩簬 5 鍜� 20 涔嬮棿'
     })
   );
-  if (!err) {
+  if (!err && res) {
     await api.resetUserPwd(row.userId, res.value);
     proxy?.$modal.msgSuccess('淇敼鎴愬姛锛屾柊瀵嗙爜鏄細' + res.value);
   }
diff --git a/src/views/system/user/profile/userInfo.vue b/src/views/system/user/profile/userInfo.vue
index 5ea5456..885f1c9 100644
--- a/src/views/system/user/profile/userInfo.vue
+++ b/src/views/system/user/profile/userInfo.vue
@@ -24,12 +24,10 @@
 
 <script setup lang="ts">
 import { updateUserProfile } from '@/api/system/user';
+import { propTypes } from '@/utils/propTypes';
 
 const props = defineProps({
-  user: {
-    type: Object as PropType<any>,
-    required: true
-  }
+  user: propTypes.any.isRequired
 });
 const userForm = computed(() => props.user);
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
diff --git a/src/views/tool/gen/genInfoForm.vue b/src/views/tool/gen/genInfoForm.vue
index 84e1d90..ad8fd5e 100644
--- a/src/views/tool/gen/genInfoForm.vue
+++ b/src/views/tool/gen/genInfoForm.vue
@@ -233,7 +233,7 @@
 
 const subColumns = ref<any>([]);
 const menuOptions = ref<Array<MenuOptionsType>>([]);
-const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+const { proxy } = getCurrentInstance();
 
 const props = defineProps({
   info: propTypes.any.def(null),

--
Gitblit v1.9.3