diff --git a/.eslintrc-auto-import.json b/.eslintrc-auto-import.json
index a6661b6..98226d9 100644
--- a/.eslintrc-auto-import.json
+++ b/.eslintrc-auto-import.json
@@ -1,46 +1,25 @@
{
"globals": {
- "ComponentInternalInstance": true,
- "TransferKey": true,
- "ElFormRules": true,
- "CheckboxValueType": true,
- "PropType": true,
- "DateModelType": true,
- "UploadFile": true,
- "ElFormInstance": true,
- "ElTableInstance": true,
- "ElTreeInstance": true,
- "ElTreeSelectInstance": true,
- "ElSelectInstance": true,
- "ElUploadInstance": true,
- "ElCardInstance": true,
- "ElDialogInstance": true,
- "ElInputInstance": true,
- "ElInputNumberInstance": true,
- "ElRadioInstance": true,
- "ElRadioGroupInstance": true,
- "ElRadioButtonInstance": true,
- "ElCheckboxInstance": true,
- "ElCheckboxGroupInstance": true,
- "ElSwitchInstance": true,
- "ElDatePickerInstance": true,
- "ElTimePickerInstance": true,
- "ElTimeSelectInstance": true,
- "ElScrollbarInstance": true,
- "ElCascaderInstance": true,
- "ElColorPickerInstance": true,
- "ElRateInstance": true,
- "ElSliderInstance": true,
- "useRouter": true,
- "useRoute": true,
+ "Component": true,
+ "ComponentPublicInstance": true,
+ "ComputedRef": true,
+ "DirectiveBinding": true,
"EffectScope": true,
- "ElTable": true,
- "ElSelect": true,
- "ElUpload": true,
- "ElForm": true,
- "ElTree": true,
+ "ElLoading": true,
"ElMessage": true,
"ElMessageBox": true,
+ "ElNotification": true,
+ "ExtractDefaultPropTypes": true,
+ "ExtractPropTypes": true,
+ "ExtractPublicPropTypes": true,
+ "InjectionKey": true,
+ "MaybeRef": true,
+ "MaybeRefOrGetter": true,
+ "PropType": true,
+ "Ref": true,
+ "VNode": true,
+ "WritableComputedRef": true,
+ "acceptHMRUpdate": true,
"asyncComputed": true,
"autoResetRef": true,
"computed": true,
@@ -54,36 +33,50 @@
"createEventHook": true,
"createGlobalState": true,
"createInjectionState": true,
+ "createPinia": true,
"createReactiveFn": true,
+ "createReusableTemplate": true,
"createSharedComposable": true,
+ "createTemplatePromise": true,
"createUnrefFn": true,
"customRef": true,
"debouncedRef": true,
"debouncedWatch": true,
"defineAsyncComponent": true,
"defineComponent": true,
+ "defineStore": true,
"eagerComputed": true,
"effectScope": true,
"extendRef": true,
+ "getActivePinia": true,
"getCurrentInstance": true,
"getCurrentScope": true,
"h": true,
"ignorableWatch": true,
"inject": true,
+ "injectLocal": true,
"isDefined": true,
"isProxy": true,
"isReactive": true,
"isReadonly": true,
"isRef": true,
"makeDestructurable": true,
+ "mapActions": true,
+ "mapGetters": true,
+ "mapState": true,
+ "mapStores": true,
+ "mapWritableState": true,
"markRaw": true,
"nextTick": true,
"onActivated": true,
"onBeforeMount": true,
+ "onBeforeRouteLeave": true,
+ "onBeforeRouteUpdate": true,
"onBeforeUnmount": true,
"onBeforeUpdate": true,
"onClickOutside": true,
"onDeactivated": true,
+ "onElementRemoval": true,
"onErrorCaptured": true,
"onKeyStroke": true,
"onLongPress": true,
@@ -95,8 +88,10 @@
"onStartTyping": true,
"onUnmounted": true,
"onUpdated": true,
+ "onWatcherCleanup": true,
"pausableWatch": true,
"provide": true,
+ "provideLocal": true,
"reactify": true,
"reactifyObject": true,
"reactive": true,
@@ -111,12 +106,14 @@
"refThrottled": true,
"refWithControl": true,
"resolveComponent": true,
- "resolveDirective": true,
"resolveRef": true,
"resolveUnref": true,
+ "setActivePinia": true,
+ "setMapStoreSuffix": true,
"shallowReactive": true,
"shallowReadonly": true,
"shallowRef": true,
+ "storeToRefs": true,
"syncRef": true,
"syncRefs": true,
"templateRef": true,
@@ -126,6 +123,7 @@
"toReactive": true,
"toRef": true,
"toRefs": true,
+ "toValue": true,
"triggerRef": true,
"tryOnBeforeMount": true,
"tryOnBeforeUnmount": true,
@@ -136,11 +134,14 @@
"unrefElement": true,
"until": true,
"useActiveElement": true,
+ "useAnimate": true,
+ "useArrayDifference": true,
"useArrayEvery": true,
"useArrayFilter": true,
"useArrayFind": true,
"useArrayFindIndex": true,
"useArrayFindLast": true,
+ "useArrayIncludes": true,
"useArrayJoin": true,
"useArrayMap": true,
"useArrayReduce": true,
@@ -157,9 +158,11 @@
"useBrowserLocation": true,
"useCached": true,
"useClipboard": true,
+ "useClipboardItems": true,
"useCloned": true,
"useColorMode": true,
"useConfirmDialog": true,
+ "useCountdown": true,
"useCounter": true,
"useCssModule": true,
"useCssVar": true,
@@ -198,6 +201,7 @@
"useFullscreen": true,
"useGamepad": true,
"useGeolocation": true,
+ "useId": true,
"useIdle": true,
"useImage": true,
"useInfiniteScroll": true,
@@ -206,6 +210,7 @@
"useIntervalFn": true,
"useKeyModifier": true,
"useLastChanged": true,
+ "useLink": true,
"useLocalStorage": true,
"useMagicKeys": true,
"useManualRefHistory": true,
@@ -213,6 +218,7 @@
"useMediaQuery": true,
"useMemoize": true,
"useMemory": true,
+ "useModel": true,
"useMounted": true,
"useMouse": true,
"useMouseInElement": true,
@@ -226,6 +232,8 @@
"useOnline": true,
"usePageLeave": true,
"useParallax": true,
+ "useParentElement": true,
+ "usePerformanceObserver": true,
"usePermission": true,
"usePointer": true,
"usePointerLock": true,
@@ -235,10 +243,14 @@
"usePreferredDark": true,
"usePreferredLanguages": true,
"usePreferredReducedMotion": true,
+ "usePreferredReducedTransparency": true,
"usePrevious": true,
"useRafFn": true,
"useRefHistory": true,
"useResizeObserver": true,
+ "useRoute": true,
+ "useRouter": true,
+ "useSSRWidth": true,
"useScreenOrientation": true,
"useScreenSafeArea": true,
"useScriptTag": true,
@@ -256,6 +268,7 @@
"useStyleTag": true,
"useSupported": true,
"useSwipe": true,
+ "useTemplateRef": true,
"useTemplateRefsList": true,
"useTextDirection": true,
"useTextSelection": true,
@@ -291,8 +304,10 @@
"watchArray": true,
"watchAtMost": true,
"watchDebounced": true,
+ "watchDeep": true,
"watchEffect": true,
"watchIgnorable": true,
+ "watchImmediate": true,
"watchOnce": true,
"watchPausable": true,
"watchPostEffect": true,
@@ -300,13 +315,6 @@
"watchThrottled": true,
"watchTriggerable": true,
"watchWithFilter": true,
- "whenever": true,
- "ImportOption": true,
- "TreeType": true,
- "FieldOption": true,
- "PageData": true,
- "storeToRefs": true,
- "DictDataOption": true,
- "UploadOption": true
+ "whenever": true
}
}
diff --git a/eslint.config.js b/eslint.config.js
deleted file mode 100644
index 8b67e9e..0000000
--- a/eslint.config.js
+++ /dev/null
@@ -1,86 +0,0 @@
-import globals from 'globals';
-import pluginJs from '@eslint/js';
-import tseslint from 'typescript-eslint';
-import pluginVue from 'eslint-plugin-vue';
-import { readFile } from 'node:fs/promises';
-import prettier from 'eslint-plugin-prettier';
-
-/**
- * https://blog.csdn.net/sayUonly/article/details/123482912
- * 自动导入的配置
- */
-const autoImportFile = new URL('./.eslintrc-auto-import.json', import.meta.url);
-const autoImportGlobals = JSON.parse(await readFile(autoImportFile, 'utf8'));
-
-/** @type {import('eslint').Linter.Config[]} */
-export default [
- {
- /**
- * 不需要.eslintignore文件 而是在这里配置
- */
- ignores: [
- '*.sh',
- 'node_modules',
- '*.md',
- '*.woff',
- '*.ttf',
- '.vscode',
- '.idea',
- 'dist',
- '/public',
- '/docs',
- '.husky',
- '.local',
- '/bin',
- '.eslintrc.cjs',
- 'prettier.config.js',
- 'src/assets',
- 'tailwind.config.js'
- ]
- },
- { files: ['**/*.{js,mjs,cjs,ts,vue}'] },
- {
- languageOptions: {
- globals: globals.browser
- }
- },
- pluginJs.configs.recommended,
- ...tseslint.configs.recommended,
- ...pluginVue.configs['flat/essential'],
- {
- files: ['**/*.vue'],
- languageOptions: {
- parserOptions: {
- parser: tseslint.parser
- }
- }
- },
- {
- languageOptions: {
- globals: {
- // 自动导入的配置 undef
- ...autoImportGlobals.globals,
- DialogOption: 'readonly',
- LayoutSetting: 'readonly'
- }
- },
- plugins: { prettier },
- rules: {
- '@typescript-eslint/no-empty-function': 'off',
- '@typescript-eslint/no-explicit-any': 'off',
- '@typescript-eslint/no-unused-vars': 'off',
- '@typescript-eslint/no-this-alias': 'off',
-
- // vue
- 'vue/multi-word-component-names': 'off',
- 'vue/valid-define-props': 'off',
- 'vue/no-v-model-argument': 'off',
- 'prefer-rest-params': 'off',
- // prettier
- 'prettier/prettier': 'error',
- // 允许使用空Object类型 {}
- '@typescript-eslint/no-empty-object-type': 'off',
- '@typescript-eslint/no-unused-expressions': 'off'
- }
- }
-];
diff --git a/eslint.config.ts b/eslint.config.ts
new file mode 100644
index 0000000..50458d1
--- /dev/null
+++ b/eslint.config.ts
@@ -0,0 +1,44 @@
+import pluginVue from 'eslint-plugin-vue';
+import globals from 'globals';
+import prettier from 'eslint-plugin-prettier';
+import { defineConfigWithVueTs, vueTsConfigs } from '@vue/eslint-config-typescript';
+import skipFormatting from '@vue/eslint-config-prettier/skip-formatting';
+
+export default defineConfigWithVueTs(
+ {
+ name: 'app/files-to-lint',
+ files: ['**/*.{js,cjs,ts,mts,tsx,vue}']
+ },
+
+ {
+ name: 'app/files-to-ignore',
+ ignores: ['**/dist/**', '**/dist-ssr/**', '**/coverage/**']
+ },
+ {
+ languageOptions: {
+ globals: globals.browser
+ }
+ },
+ pluginVue.configs['flat/essential'],
+ vueTsConfigs.recommended,
+ skipFormatting,
+ {
+ plugins: { prettier },
+ rules: {
+ '@typescript-eslint/no-empty-function': 'off',
+ '@typescript-eslint/no-explicit-any': 'off',
+ '@typescript-eslint/no-unused-vars': 'off',
+ '@typescript-eslint/no-this-alias': 'off',
+ // vue
+ 'vue/multi-word-component-names': 'off',
+ 'vue/valid-define-props': 'off',
+ 'vue/no-v-model-argument': 'off',
+ 'prefer-rest-params': 'off',
+ // prettier
+ 'prettier/prettier': 'error',
+ // 允许使用空Object类型 {}
+ '@typescript-eslint/no-empty-object-type': 'off',
+ '@typescript-eslint/no-unused-expressions': 'off'
+ }
+ }
+);
diff --git a/package.json b/package.json
index 26d0862..5edbf92 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
{
- "$schema": "https://json.schemastore.org/tsconfig",
+ "$schema": "https://json.schemastore.org/package",
"name": "ruoyi-vue-plus",
- "version": "5.3.0",
+ "version": "5.3.1-BETA_2.3.0-BETA",
"description": "RuoYi-Vue-Plus多租户管理系统",
"author": "LionLi",
"license": "MIT",
@@ -23,13 +23,11 @@
"@element-plus/icons-vue": "2.3.1",
"@highlightjs/vue-plugin": "2.1.0",
"@vueup/vue-quill": "1.2.0",
- "@vueuse/core": "11.3.0",
+ "@vueuse/core": "12.7.0",
"animate.css": "4.1.1",
"await-to-js": "3.0.0",
"axios": "1.7.8",
"crypto-js": "4.2.0",
- "diagram-js": "12.3.0",
- "didi": "9.0.2",
"echarts": "5.5.0",
"element-plus": "2.8.8",
"file-saver": "2.0.5",
@@ -50,38 +48,47 @@
"vxe-table": "4.5.22"
},
"devDependencies": {
- "@eslint/js": "9.15.0",
"@iconify/json": "2.2.276",
"@types/crypto-js": "4.2.2",
"@types/file-saver": "2.0.7",
"@types/js-cookie": "3.0.6",
- "@types/node": "18.18.2",
+ "@types/node": "^22.13.4",
"@types/nprogress": "0.2.3",
- "@unocss/preset-attributify": "0.64.1",
- "@unocss/preset-icons": "0.64.1",
- "@unocss/preset-uno": "0.64.1",
- "@vitejs/plugin-vue": "5.0.4",
+ "@unocss/preset-attributify": "66.0.0",
+ "@unocss/preset-icons": "66.0.0",
+ "@unocss/preset-uno": "66.0.0",
+ "@vitejs/plugin-vue": "5.2.1",
"@vue/compiler-sfc": "3.4.23",
- "autoprefixer": "10.4.18",
- "eslint": "9.15.0",
- "eslint-plugin-prettier": "^5.2.1",
- "eslint-plugin-vue": "9.31.0",
- "fast-glob": "3.3.2",
- "globals": "15.12.0",
- "postcss": "8.4.36",
- "prettier": "3.2.5",
- "sass": "1.72.0",
- "typescript": "5.7.2",
- "typescript-eslint": "8.16.0",
- "unocss": "0.64.1",
+ "@vue/eslint-config-prettier": "10.2.0",
+ "@vue/eslint-config-typescript": "14.4.0",
+ "autoprefixer": "10.4.20",
+ "eslint": "9.21.0",
+ "eslint-plugin-prettier": "5.2.3",
+ "eslint-plugin-vue": "9.32.0",
+ "globals": "16.0.0",
+ "prettier": "3.5.2",
+ "sass": "1.84.0",
+ "typescript": "~5.7.3",
+ "unocss": "66.0.0",
"unplugin-auto-import": "0.17.5",
"unplugin-icons": "0.18.5",
- "unplugin-vue-components": "0.26.0",
+ "unplugin-vue-components": "28.0.0",
"unplugin-vue-setup-extend-plus": "1.0.1",
"vite": "5.4.11",
"vite-plugin-compression": "0.5.1",
- "vite-plugin-svg-icons": "2.0.1",
- "vitest": "1.5.0",
- "vue-tsc": "2.0.13"
- }
+ "vite-plugin-svg-icons-ng": "^1.2.2",
+ "vite-plugin-vue-devtools": "7.7.1",
+ "vitest": "3.0.5",
+ "vue-tsc": "^2.2.2"
+ },
+ "engines": {
+ "node": ">=18.18.0",
+ "npm": ">=8.9.0"
+ },
+ "browserslist": [
+ "Chrome >= 87",
+ "Edge >= 88",
+ "Safari >= 14",
+ "Firefox >= 78"
+ ]
}
diff --git a/src/App.vue b/src/App.vue
index 66dbed6..617a10e 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -5,9 +5,9 @@
-
diff --git a/src/directive/permission/index.ts b/src/directive/permission/index.ts
index eb2dccc..c66da22 100644
--- a/src/directive/permission/index.ts
+++ b/src/directive/permission/index.ts
@@ -1,5 +1,5 @@
import { Directive, DirectiveBinding } from 'vue';
-import useUserStore from '@/store/modules/user';
+import { useUserStore } from '@/store/modules/user';
/**
* 操作权限处理
*/
diff --git a/src/layout/components/AppMain.vue b/src/layout/components/AppMain.vue
index 0d402f2..f27a37f 100644
--- a/src/layout/components/AppMain.vue
+++ b/src/layout/components/AppMain.vue
@@ -1,12 +1,12 @@
-
+
-
+
@@ -15,8 +15,8 @@
-
diff --git a/src/views/system/role/index.vue b/src/views/system/role/index.vue
index fc42cd5..9f0ea11 100644
--- a/src/views/system/role/index.vue
+++ b/src/views/system/role/index.vue
@@ -135,7 +135,7 @@
node-key="id"
:check-strictly="!form.menuCheckStrictly"
empty-text="加载中,请稍候"
- :props="{ label: 'label', children: 'children' }"
+ :props="{ label: 'label', children: 'children' } as any"
>
@@ -177,7 +177,7 @@
node-key="id"
:check-strictly="!form.deptCheckStrictly"
empty-text="加载中,请稍候"
- :props="{ label: 'label', children: 'children' }"
+ :props="{ label: 'label', children: 'children' } as any"
>
diff --git a/src/views/system/role/selectUser.vue b/src/views/system/role/selectUser.vue
index e55120a..12df828 100644
--- a/src/views/system/role/selectUser.vue
+++ b/src/views/system/role/selectUser.vue
@@ -128,5 +128,3 @@ defineExpose({
show
});
-
-
diff --git a/src/views/system/tenant/index.vue b/src/views/system/tenant/index.vue
index df97b64..1e3ff81 100644
--- a/src/views/system/tenant/index.vue
+++ b/src/views/system/tenant/index.vue
@@ -155,7 +155,7 @@ import {
syncTenantDict
} from '@/api/system/tenant';
import { selectTenantPackage } from '@/api/system/tenantPackage';
-import useUserStore from '@/store/modules/user';
+import { useUserStore } from '@/store/modules/user';
import { TenantForm, TenantQuery, TenantVO } from '@/api/system/tenant/types';
import { TenantPkgVO } from '@/api/system/tenantPackage/types';
diff --git a/src/views/system/tenantPackage/index.vue b/src/views/system/tenantPackage/index.vue
index f97bb35..1609b6d 100644
--- a/src/views/system/tenantPackage/index.vue
+++ b/src/views/system/tenantPackage/index.vue
@@ -82,7 +82,7 @@
node-key="id"
:check-strictly="!form.menuCheckStrictly"
empty-text="加载中,请稍候"
- :props="{ label: 'label', children: 'children' }"
+ :props="{ label: 'label', children: 'children' } as any"
>
diff --git a/src/views/system/user/index.vue b/src/views/system/user/index.vue
index 430c55a..fdc5018 100644
--- a/src/views/system/user/index.vue
+++ b/src/views/system/user/index.vue
@@ -10,7 +10,7 @@
class="mt-2"
node-key="id"
:data="deptOptions"
- :props="{ label: 'label', children: 'children' }"
+ :props="{ label: 'label', children: 'children' } as any"
:expand-on-click-node="false"
:filter-node-method="filterNode"
highlight-current
@@ -81,8 +81,9 @@
下载模板
- 导入数据
- 导出数据
+
+ 导入数据
+ 导出数据
@@ -155,7 +156,7 @@
import api from '@/api/system/user';
import { UserForm, UserQuery, UserVO } from '@/api/system/user/types';
-import {DeptTreeVO, DeptVO} from '@/api/system/dept/types';
+import { DeptTreeVO, DeptVO } from '@/api/system/dept/types';
import { RoleVO } from '@/api/system/role/types';
import { PostQuery, PostVO } from '@/api/system/post/types';
import { treeselect } from '@/api/system/dept';
import { globalHeaders } from '@/utils/request';
import { to } from 'await-to-js';
import { optionselect } from '@/api/system/post';
+import { hasPermi } from '@/directive/permission';
+import { checkPermi } from '@/utils/permission';
const router = useRouter();
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
@@ -450,7 +453,7 @@ const getDeptTree = async () => {
/** 过滤禁用的部门 */
const filterDisabledDept = (deptList: DeptTreeVO[]) => {
- return deptList.filter(dept => {
+ return deptList.filter((dept) => {
if (dept.disabled) {
return false;
}
@@ -660,5 +663,3 @@ async function handleDeptChange(value: number | string) {
form.value.postIds = [];
}
-
-
diff --git a/src/views/system/user/profile/onlineDevice.vue b/src/views/system/user/profile/onlineDevice.vue
index 7634b06..b884446 100644
--- a/src/views/system/user/profile/onlineDevice.vue
+++ b/src/views/system/user/profile/onlineDevice.vue
@@ -26,7 +26,7 @@
-
-