diff --git a/package.json b/package.json
index 7995d9316418a0fffae0610d5ae97d3f14790e85..f1c8084557d0138cf978a077901197a8118f1208 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "ruoyi-vue-plus",
- "version": "5.2.0",
+ "version": "5.2.1",
"description": "RuoYi-Vue-Plus多租户管理系统",
"author": "LionLi",
"license": "MIT",
diff --git a/src/api/workflow/formManage/index.ts b/src/api/workflow/formManage/index.ts
index c2930cfec1d41e5d00a47f064651a2d66844a323..6c5ec60a7365ed3383860df65451192f2245931a 100644
--- a/src/api/workflow/formManage/index.ts
+++ b/src/api/workflow/formManage/index.ts
@@ -25,7 +25,7 @@ export const listFormManage = (query?: FormManageQuery): AxiosPromise => {
return request({
url: '/workflow/formManage/list/selectList',
- method: 'get',
+ method: 'get'
});
};
diff --git a/src/api/workflow/formManage/types.ts b/src/api/workflow/formManage/types.ts
index 6554f5529798483f7ad0860672951fe25ab92ac4..b9dc1d874cfdf108f31a8e4c1e9d55ff5d5caf4b 100644
--- a/src/api/workflow/formManage/types.ts
+++ b/src/api/workflow/formManage/types.ts
@@ -26,7 +26,7 @@ export interface FormManageVO {
/**
* 备注
*/
- remork: string;
+ remark: string;
}
export interface FormManageForm extends BaseEntity {
@@ -53,7 +53,7 @@ export interface FormManageForm extends BaseEntity {
/**
* 备注
*/
- remork?: string;
+ remark?: string;
}
export interface FormManageQuery extends PageQuery {
diff --git a/src/api/workflow/model/index.ts b/src/api/workflow/model/index.ts
index 56f7fedbc5a324274915b50546b1bc99c505fc57..1ca8b19c9156ad5097b2773b012b4bc5560f1866 100644
--- a/src/api/workflow/model/index.ts
+++ b/src/api/workflow/model/index.ts
@@ -22,7 +22,7 @@ export const listModel = (query: ModelQuery): AxiosPromise => {
*/
export const getInfo = (id: string): AxiosPromise => {
return request({
- url: '/workflow/model/getInfo/'+id,
+ url: '/workflow/model/getInfo/' + id,
method: 'get'
});
};
@@ -101,4 +101,4 @@ export const copyModel = (data: ModelForm): AxiosPromise => {
method: 'post',
data: data
});
-};
\ No newline at end of file
+};
diff --git a/src/api/workflow/model/types.ts b/src/api/workflow/model/types.ts
index 40a0faa1fe461f8675815eba9eae723c0cfa0f51..77f947d4b476240d180c538ce9e04f746ae72e93 100644
--- a/src/api/workflow/model/types.ts
+++ b/src/api/workflow/model/types.ts
@@ -1,10 +1,10 @@
export interface ModelForm {
- id: string,
+ id: string;
name: string;
key: string;
categoryCode: string;
- xml:string,
- svg:string,
+ xml: string;
+ svg: string;
description: string;
}
diff --git a/src/api/workflow/nodeConfig/types.ts b/src/api/workflow/nodeConfig/types.ts
index 4e3a60b33d3bc5da962a1c28e1a5fafdb5b7886c..a55fc914097b1959aa31147558b6952476cb26f3 100644
--- a/src/api/workflow/nodeConfig/types.ts
+++ b/src/api/workflow/nodeConfig/types.ts
@@ -35,9 +35,4 @@ export interface NodeConfigVO {
* 表单管理
*/
wfFormManageVo: FormManageVO;
-
}
-
-
-
-
diff --git a/src/bpmn/assets/module/ContextPad/CustomContextPadProvider.ts b/src/bpmn/assets/module/ContextPad/CustomContextPadProvider.ts
index 9f12ff24d1cf4c2a155faada59795abf4a4cc8a3..13ccf50df6c29275ff8c677850b7c26d8e096672 100644
--- a/src/bpmn/assets/module/ContextPad/CustomContextPadProvider.ts
+++ b/src/bpmn/assets/module/ContextPad/CustomContextPadProvider.ts
@@ -40,7 +40,7 @@ class CustomContextPadProvider extends ContextPadProvider {
rules: Rules,
translate
) {
- // @ts-ignore
+ // @ts-expect-error 忽略异常
super(config, injector, eventBus, contextPad, modeling, elementFactory, connect, create, popupMenu, canvas, rules, translate);
this._contextPad = contextPad;
diff --git a/src/components/Editor/index.vue b/src/components/Editor/index.vue
index fc30c85ed2062b314cabbb0b07e54fc1beaccc25..ba70fbba0c072d5b5b534bd92796fb653898170b 100644
--- a/src/components/Editor/index.vue
+++ b/src/components/Editor/index.vue
@@ -110,7 +110,7 @@ watch(
() => props.modelValue,
(v: string) => {
if (v !== content.value) {
- content.value = v === undefined ? '' : v;
+ content.value = v || '';
}
},
{ immediate: true }
diff --git a/src/components/ImagePreview/index.vue b/src/components/ImagePreview/index.vue
index 349f72909cce60f5ccdf45ffb7a40325f98d1930..98e6479106d46e683f4294467e0348298fe5b79b 100644
--- a/src/components/ImagePreview/index.vue
+++ b/src/components/ImagePreview/index.vue
@@ -38,7 +38,7 @@ const realSrcList = computed(() => {
let real_src_list = props.src.split(',');
let srcList: string[] = [];
real_src_list.forEach((item: string) => {
- if(item.trim() === '') {
+ if (item.trim() === '') {
return;
}
return srcList.push(item);
diff --git a/src/components/Process/multiInstanceUser.vue b/src/components/Process/multiInstanceUser.vue
index 292b1b7d6eb6c80942203b6bfdc020bffc765065..d19fb5fd8199f2762d8d1f1bf0f23d1b02eb0a88 100644
--- a/src/components/Process/multiInstanceUser.vue
+++ b/src/components/Process/multiInstanceUser.vue
@@ -128,7 +128,7 @@ const props = defineProps({
//回显用户id
userIdList: {
type: Array,
- default: []
+ default: () => []
}
});
const deptTreeRef = ref(ElTree);
diff --git a/src/components/Process/submitVerify.vue b/src/components/Process/submitVerify.vue
index bcbc657dfca3c660f2bde666fdea8a8c8c0ae0e1..09fc82e4a2a10860d1e8873a85284b2edadc7b6b 100644
--- a/src/components/Process/submitVerify.vue
+++ b/src/components/Process/submitVerify.vue
@@ -106,7 +106,7 @@ const multiInstanceUserRef = ref>();
const props = defineProps({
taskVariables: {
type: Object as () => Record,
- default: {}
+ default: () => {}
}
});
//遮罩层
diff --git a/src/components/UserSelect/index.vue b/src/components/UserSelect/index.vue
index f6e552e41d3ed389d8dcdfa4582d50ba402e9cf7..e9865e577bf8de7e3b2da842e135f26039ced139 100644
--- a/src/components/UserSelect/index.vue
+++ b/src/components/UserSelect/index.vue
@@ -29,16 +29,11 @@
-
+
搜索
- 重置
+ resetQuery()">重置
@@ -223,13 +218,13 @@ const handleQuery = () => {
getList();
};
/** 重置按钮操作 */
-const resetQuery = () => {
+const resetQuery = (refresh = true) => {
dateRange.value = ['', ''];
queryFormRef.value?.resetFields();
queryParams.value.pageNum = 1;
queryParams.value.deptId = undefined;
deptTreeRef.value?.setCurrentKey(undefined);
- handleQuery();
+ refresh && handleQuery();
};
const handleCheckboxChange = (checked) => {
@@ -288,23 +283,20 @@ const close = () => {
watch(
() => userDialog.visible.value,
- (newValue: boolean) => {
+ async (newValue: boolean) => {
if (newValue) {
- initSelectUser();
+ await getTreeSelect(); // 初始化部门数据
+ await getList(); // 初始化列表数据
+ await initSelectUser();
} else {
tableRef.value.clearCheckboxReserve();
tableRef.value.clearCheckboxRow();
- resetQuery();
+ resetQuery(false);
selectUserList.value = [];
}
}
);
-onMounted(() => {
- getTreeSelect(); // 初始化部门数据
- getList(); // 初始化列表数据
-});
-
defineExpose({
open: userDialog.openDialog,
close: userDialog.closeDialog
diff --git a/src/hooks/useDialog.ts b/src/hooks/useDialog.ts
index 68440bf2eca51b6d82e67ee4428f7981ea86eb10..547f199766d142e66f41b07eda589cf535e39582 100644
--- a/src/hooks/useDialog.ts
+++ b/src/hooks/useDialog.ts
@@ -28,4 +28,4 @@ export default (ops?: Options): Return => {
openDialog,
closeDialog
};
-};
\ No newline at end of file
+};
diff --git a/src/layout/components/AppMain.vue b/src/layout/components/AppMain.vue
index d634935a145b57db5515b958109b0cb5f01509cf..7f86ef4c75f281f46a56c151c92f2ee2319bc0a2 100644
--- a/src/layout/components/AppMain.vue
+++ b/src/layout/components/AppMain.vue
@@ -1,13 +1,13 @@
-
-
-
-
-
-
-
+
+
+
+
+
+
+
diff --git a/src/layout/components/SocialCallback/index.vue b/src/layout/components/SocialCallback/index.vue
index de65aed65fc52d50c89b7b1179bbcc0b9880d636..746de20a5e4e646c46864780670120575d9be36d 100644
--- a/src/layout/components/SocialCallback/index.vue
+++ b/src/layout/components/SocialCallback/index.vue
@@ -18,7 +18,7 @@ const code = route.query.code as string;
const state = route.query.state as string;
const source = route.query.source as string;
const stateJson = JSON.parse(atob(state));
-const tenantId = stateJson.tenantId as string ? stateJson.tenantId as string : '000000';
+const tenantId = (stateJson.tenantId as string) ? (stateJson.tenantId as string) : '000000';
const domain = stateJson.domain as string;
const processResponse = async (res: any) => {
diff --git a/src/permission.ts b/src/permission.ts
index 1123738ce12d57934f4df687f7e439a52889c373..6771f8cc1f21060d580a681ce9c1704105779dcf 100644
--- a/src/permission.ts
+++ b/src/permission.ts
@@ -53,7 +53,7 @@ router.beforeEach(async (to, from, next) => {
next();
} else {
const redirect = encodeURIComponent(to.fullPath || '/');
- next(`/login?redirect=${redirect}`) // 否则全部重定向到登录页
+ next(`/login?redirect=${redirect}`); // 否则全部重定向到登录页
NProgress.done();
}
}
diff --git a/src/store/modules/permission.ts b/src/store/modules/permission.ts
index cf12a73024064f50518b4755b98faccdc9c816fc..2e719bae3e22cd7d0a345a139d5fb6d772d9bcda 100644
--- a/src/store/modules/permission.ts
+++ b/src/store/modules/permission.ts
@@ -9,6 +9,8 @@ import Layout from '@/layout/index.vue';
import ParentView from '@/components/ParentView/index.vue';
import InnerLink from '@/layout/components/InnerLink/index.vue';
+import { createCustomNameComponent } from '@/utils/createCustomNameComponent';
+
// 匹配views里面所有的.vue文件
const modules = import.meta.glob('./../../views/**/*.vue');
export const usePermissionStore = defineStore('permission', () => {
@@ -58,6 +60,8 @@ export const usePermissionStore = defineStore('permission', () => {
setSidebarRouters(constantRoutes.concat(sidebarRoutes));
setDefaultRoutes(sidebarRoutes);
setTopbarRoutes(defaultRoutes);
+ // 路由name重复检查
+ duplicateRouteChecker(asyncRoutes, sidebarRoutes);
return new Promise((resolve) => resolve(rewriteRoutes));
};
@@ -80,7 +84,7 @@ export const usePermissionStore = defineStore('permission', () => {
} else if (route.component?.toString() === 'InnerLink') {
route.component = InnerLink;
} else {
- route.component = loadView(route.component);
+ route.component = loadView(route.component, route.name as string);
}
if (route.children != null && route.children && route.children.length) {
route.children = filterAsyncRouter(route.children, route, type);
@@ -151,12 +155,12 @@ export const filterDynamicRoutes = (routes: RouteRecordRaw[]) => {
return res;
};
-export const loadView = (view: any) => {
+export const loadView = (view: any, name: string) => {
let res;
for (const path in modules) {
const dir = path.split('views/')[1].split('.vue')[0];
if (dir === view) {
- res = () => modules[path]();
+ res = createCustomNameComponent(modules[path], { name });
}
}
return res;
@@ -167,4 +171,48 @@ export const usePermissionStoreHook = () => {
return usePermissionStore(store);
};
+interface Route {
+ name?: string | symbol;
+ path: string;
+ children?: Route[];
+}
+
+/**
+ * 检查路由name是否重复
+ * @param localRoutes 本地路由
+ * @param routes 动态路由
+ */
+function duplicateRouteChecker(localRoutes: Route[], routes: Route[]) {
+ // 展平
+ function flatRoutes(routes: Route[]) {
+ const res: Route[] = [];
+ routes.forEach((route) => {
+ if (route.children) {
+ res.push(...flatRoutes(route.children));
+ } else {
+ res.push(route);
+ }
+ });
+ return res;
+ }
+
+ const allRoutes = flatRoutes([...localRoutes, ...routes]);
+
+ const nameList: string[] = [];
+ allRoutes.forEach((route) => {
+ const name = route.name.toString();
+ if (name && nameList.includes(name)) {
+ const message = `路由名称: [${name}] 重复, 会造成 404`;
+ console.error(message);
+ ElNotification({
+ title: '路由名称重复',
+ message,
+ type: 'error'
+ });
+ return;
+ }
+ nameList.push(route.name.toString());
+ });
+}
+
export default usePermissionStore;
diff --git a/src/utils/createCustomNameComponent.tsx b/src/utils/createCustomNameComponent.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..daf58667e68905b1b0cf051cb912e5dc395d6d41
--- /dev/null
+++ b/src/utils/createCustomNameComponent.tsx
@@ -0,0 +1,39 @@
+/**
+ * 后台返回的路由动态生成name 解决缓存问题
+ * 感谢 @fourteendp
+ * 详见 https://github.com/vbenjs/vue-vben-admin/issues/3927
+ */
+import { Component, defineComponent, h } from 'vue';
+
+interface Options {
+ name?: string;
+}
+
+export function createCustomNameComponent(loader: () => Promise, options: Options = {}): () => Promise {
+ const { name } = options;
+ let component: Component | null = null;
+
+ const load = async () => {
+ try {
+ const { default: loadedComponent } = await loader();
+ component = loadedComponent;
+ } catch (error) {
+ console.error(`Cannot resolve component ${name}, error:`, error);
+ }
+ };
+
+ return async () => {
+ if (!component) {
+ await load();
+ }
+
+ return Promise.resolve(
+ defineComponent({
+ name,
+ render() {
+ return h(component as Component);
+ }
+ })
+ );
+ };
+}
diff --git a/src/views/index.vue b/src/views/index.vue
index d384909b7ccf104ce9a68c138a8e14d415b733ea..aa60a9b350e93ef4a40d931fc89188e6d364a94d 100644
--- a/src/views/index.vue
+++ b/src/views/index.vue
@@ -33,7 +33,7 @@
* 部署方式 Docker 容器编排 一键部署业务集群
* 国际化 SpringMessage Spring标准国际化方案
- 当前版本: v5.2.0
+ 当前版本: v5.2.1
¥免费开源
diff --git a/src/views/monitor/logininfor/index.vue b/src/views/monitor/logininfor/index.vue
index 27c0a85f367aca00ca70317418fbb3d30d8ce44c..03d0d8f543633fce4771af215484355299f8ef2d 100644
--- a/src/views/monitor/logininfor/index.vue
+++ b/src/views/monitor/logininfor/index.vue
@@ -11,7 +11,7 @@
-
+
diff --git a/src/views/monitor/operlog/index.vue b/src/views/monitor/operlog/index.vue
index 1442984ba81ab8db9c0357a289bab887c990e27d..ed0d75515ea2613c5f7e22ce7c2fef2627fcedc1 100644
--- a/src/views/monitor/operlog/index.vue
+++ b/src/views/monitor/operlog/index.vue
@@ -14,12 +14,12 @@
-
+
-
+
diff --git a/src/views/system/client/index.vue b/src/views/system/client/index.vue
index af8696bf3d2a7bde4e699acc8c3a681cda0cf4b5..c05dcdcf48b531ce00cc13f38fd7c972ab8d70b8 100644
--- a/src/views/system/client/index.vue
+++ b/src/views/system/client/index.vue
@@ -10,7 +10,7 @@
-
+
diff --git a/src/views/system/config/index.vue b/src/views/system/config/index.vue
index 138068e43e1dfd007a92dfcef87df84fd7328aa4..1b67d4849aff641dc8ba201c3cbfec9f6d2af575 100644
--- a/src/views/system/config/index.vue
+++ b/src/views/system/config/index.vue
@@ -11,7 +11,7 @@
-
+
diff --git a/src/views/system/dept/index.vue b/src/views/system/dept/index.vue
index 71aeff1cc4752a0dfed1acaae597f303f9b4d480..199a99777d745601dbe1b6a861e17dea13c11dde 100644
--- a/src/views/system/dept/index.vue
+++ b/src/views/system/dept/index.vue
@@ -11,7 +11,7 @@
-
+
diff --git a/src/views/system/menu/index.vue b/src/views/system/menu/index.vue
index 9e5b5c3a6f3a0491aa62f0e85857b083890f4bdc..cf5f0fcafb3d01179d7a011abefb81413acf755c 100644
--- a/src/views/system/menu/index.vue
+++ b/src/views/system/menu/index.vue
@@ -8,7 +8,7 @@
-
+
diff --git a/src/views/system/oss/index.vue b/src/views/system/oss/index.vue
index 2e50582b4c112291d258404320aa1067643361e7..a6e60e83ed426b29ff1d41fc67e595c443584365 100644
--- a/src/views/system/oss/index.vue
+++ b/src/views/system/oss/index.vue
@@ -13,7 +13,7 @@
-
+
{
showTable.value = true;
};
function checkFileSuffix(fileSuffix: string | string[]) {
- const arr = [".png", ".jpg", ".jpeg"];
+ const arr = ['.png', '.jpg', '.jpeg'];
const suffixArray = Array.isArray(fileSuffix) ? fileSuffix : [fileSuffix];
- return suffixArray.some(suffix => arr.includes(suffix.toLowerCase()));
+ return suffixArray.some((suffix) => arr.includes(suffix.toLowerCase()));
}
/** 取消按钮 */
function cancel() {
diff --git a/src/views/system/role/index.vue b/src/views/system/role/index.vue
index bd84af3cac340157e3ace1d42e3f0ea277d936bb..0b6ba00877a658c28a1233cf4d6ae0f354a0313f 100644
--- a/src/views/system/role/index.vue
+++ b/src/views/system/role/index.vue
@@ -11,7 +11,7 @@
-
+
diff --git a/src/views/system/user/profile/index.vue b/src/views/system/user/profile/index.vue
index 426fca88d2bf94c82738352163832f66e1e05b78..7c1389a35aa8083fda73956f90591fd5546918b5 100644
--- a/src/views/system/user/profile/index.vue
+++ b/src/views/system/user/profile/index.vue
@@ -58,8 +58,8 @@
-
-
+
+
@@ -73,7 +73,7 @@ import UserAvatar from './userAvatar.vue';
import UserInfo from './userInfo.vue';
import ResetPwd from './resetPwd.vue';
import ThirdParty from './thirdParty.vue';
-import OnlinDevice from './onlineDevice.vue';
+import OnlineDevice from './onlineDevice.vue';
import { getAuthList } from '@/api/system/social/auth';
import { getUserProfile } from '@/api/system/user';
import { getOnline } from '@/api/monitor/online';
diff --git a/src/views/system/user/profile/onlineDevice.vue b/src/views/system/user/profile/onlineDevice.vue
index 8da96f60f0354a97baf96bb242c95d2bcdbd5d2a..bd7c822e48bd2a07dd92a05cbaaf64bc94c8a2ae 100644
--- a/src/views/system/user/profile/onlineDevice.vue
+++ b/src/views/system/user/profile/onlineDevice.vue
@@ -18,8 +18,7 @@
-
-
+
@@ -55,5 +54,4 @@ const handldDelOnline = (row: any) => {
})
.catch(() => {});
};
-
diff --git a/src/views/system/user/profile/resetPwd.vue b/src/views/system/user/profile/resetPwd.vue
index 6d536daf9f15f00e948ddb5636ba67ab36e28639..aae5ef8c20ff17d45088ed3f226da39b22c09919 100644
--- a/src/views/system/user/profile/resetPwd.vue
+++ b/src/views/system/user/profile/resetPwd.vue
@@ -45,7 +45,7 @@ const rules = ref({
message: '长度在 6 到 20 个字符',
trigger: 'blur'
},
- { pattern: /^[^<>"'|\\]+$/, message: "不能包含非法字符:< > \" ' \\\ |", trigger: "blur" }
+ { pattern: /^[^<>"'|\\]+$/, message: '不能包含非法字符:< > " \' \\\ |', trigger: 'blur' }
],
confirmPassword: [
{ required: true, message: '确认密码不能为空', trigger: 'blur' },
diff --git a/src/views/system/user/profile/thirdParty.vue b/src/views/system/user/profile/thirdParty.vue
index 957122a5b89700b97a3d8373ccbad29d3d307091..5cd73475a079e9baa7e9ad50203d5a3ba23b7309 100644
--- a/src/views/system/user/profile/thirdParty.vue
+++ b/src/views/system/user/profile/thirdParty.vue
@@ -58,7 +58,7 @@