兰宝车间质量管理系统-前端
!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
已添加1个文件
已修改21个文件
375 ■■■■ 文件已修改
.prettierrc 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
package.json 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/App.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/BuildCode/render.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/IconSelect/index.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/ImagePreview/index.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/SizeSelect/index.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/enums/LanguageEnum.ts 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/lang/index.ts 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/layout/components/Settings/index.vue 98 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main.ts 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/permission.ts 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/plugins/index.ts 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/settings.ts 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/store/modules/app.ts 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/store/modules/settings.ts 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/types/global.d.ts 82 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/types/module.d.ts 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/ruoyi.ts 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/system/user/index.vue 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/system/user/profile/userInfo.vue 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/tool/gen/genInfoForm.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
.prettierrc
@@ -4,7 +4,7 @@
  "useTabs": false,
  "semi": true,
  "singleQuote": true,
  "quoteProps": "as-needed",
  "quoteProps": "preserve",
  "jsxSingleQuote": false,
  "bracketSameLine": false,
  "trailingComma": "none",
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",
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(() => {
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);
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" />
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;
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>
src/enums/LanguageEnum.ts
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,5 @@
export enum LanguageEnum {
  zh_CN = 'zh_CN',
  en_US = 'en_US'
}
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({
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);
/** æ˜¯å¦éœ€è¦topNav */
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);
  }
});
/** æ˜¯å¦éœ€è¦tagview */
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 });
  }
});
/**是否需要侧边栏的logo */
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('正在保存到本地,请稍候...');
  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('正在清除设置缓存并刷新,请稍候...');
  localStorage.removeItem('layout-setting');
  useStorage<any>('layout-setting', null).value = null;
  setTimeout('window.location.reload()', 1000);
};
const openSetting = () => {
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);
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;
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;
}
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;
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 => {
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
  };
});
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;
    /**
     * æ˜¯å¦æ˜¾ç¤ºä¾§è¾¹æ Logo
     */
    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;
    /**
     * æ˜¯å¦æ˜¾ç¤ºä¾§è¾¹æ Logo
     */
    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 {};
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 {
src/utils/ruoyi.ts
@@ -245,3 +245,7 @@
export const blobValidate = (data: any) => {
  return data.type !== 'application/json';
};
export default {
  handleTree
};
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);
  }
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;
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),