diff --git a/src/views/app/ModuleManage.vue b/src/views/app/ModuleManage.vue
index 6f9be9a..e476706 100644
--- a/src/views/app/ModuleManage.vue
+++ b/src/views/app/ModuleManage.vue
@@ -27,14 +27,14 @@
-
+
-
+
@@ -153,13 +153,16 @@ const form = ref<{
sortNo: null,
});
-const ruleValidate = ref({
- name: [{ required: true, message: "请输入模块名称", trigger: "blur" }],
- path: [{ required: true, message: "请输入模块路径", trigger: "blur" }],
- customId: [{ required: true, type: "number", message: "请输入自定义ID", trigger: "change" }],
-});
-
const openingIsChild = ref(false);
+
+/* 子模块双定位:树节点(带路径/编码)或纯按钮权限(两者皆可空)→ 仅根模块必填 */
+const ruleValidate = computed(() => ({
+ name: [{ required: true, message: "请输入模块名称", trigger: "blur" }],
+ ...(openingIsChild.value ? {} : {
+ path: [{ required: true, message: "请输入模块路径", trigger: "blur" }],
+ customId: [{ required: true, type: "number", message: "请输入自定义ID", trigger: "change" }],
+ }),
+}));
const modalTitle = computed(() => {
if (currentId.value != null) return '编辑模块';
return openingIsChild.value ? '新增子模块' : '新增模块';
@@ -258,7 +261,7 @@ async function onRawSave() {
data: {
appId: appId.value,
name: form.value.name,
- path: form.value.path,
+ path: form.value.path?.trim() || undefined,
icon: form.value.icon?.trim() || undefined,
customId: form.value.customId == null ? '' : String(form.value.customId),
parentId: form.value.parentId ?? undefined,
@@ -272,8 +275,8 @@ async function onRawSave() {
id: currentId.value,
appId: appId.value,
name: form.value.name,
- path: form.value.path,
- // 后端 edit 逐字段整体赋值,字段缺省即置空 → 清空图标能生效
+ path: form.value.path?.trim() || undefined,
+ // 后端 edit 逐字段整体赋值,字段缺省即置空 → 清空图标/路径能生效
icon: form.value.icon?.trim() || undefined,
customId: form.value.customId == null ? '' : String(form.value.customId),
parentId: form.value.parentId ?? undefined,