feat(module): 子模块自定义ID/路径改为选填,适配按钮权限型子模块
build / build (push) Successful in 1m51s

- 校验规则改为 computed:仅根模块强制 path/customId,子模块两者皆可空
- 占位文案按 openingIsChild 切换,提示「作按钮权限时可留空」
- 提交前 path 做 trim,空值传 undefined(后端归一并放开 nullable)
This commit is contained in:
chenxing
2026-10-21 08:53:00 +08:00
parent 24ae7b13fe
commit 3605a91b78
+12 -9
View File
@@ -27,14 +27,14 @@
<Input placeholder="请输入模块名称" v-model="form.name" /> <Input placeholder="请输入模块名称" v-model="form.name" />
</FormItem> </FormItem>
<FormItem label="模块路径:" prop="path"> <FormItem label="模块路径:" prop="path">
<Input placeholder="请输入模块路径" v-model="form.path" /> <Input :placeholder="openingIsChild ? '选填;作按钮权限时可留空' : '请输入模块路径'" v-model="form.path" />
</FormItem> </FormItem>
<FormItem label="模块图标:" prop="icon"> <FormItem label="模块图标:" prop="icon">
<Input placeholder="选填,YschIcons 图标名(如 notice-list);留空则不下发图标" <Input placeholder="选填,YschIcons 图标名(如 notice-list);留空则不下发图标"
v-model="form.icon" clearable /> v-model="form.icon" clearable />
</FormItem> </FormItem>
<FormItem label="自定义ID:" prop="customId"> <FormItem label="自定义ID:" prop="customId">
<InputNumber :style="{ width: '100%' }" placeholder="请输入自定义ID" v-model="form.customId" /> <InputNumber :style="{ width: '100%' }" :placeholder="openingIsChild ? '选填;作按钮权限时可留空' : '请输入自定义ID'" v-model="form.customId" />
</FormItem> </FormItem>
<FormItem label="排序号:" prop="sortNo"> <FormItem label="排序号:" prop="sortNo">
<InputNumber :style="{ width: '100%' }" placeholder="请输入排序号" v-model="form.sortNo" /> <InputNumber :style="{ width: '100%' }" placeholder="请输入排序号" v-model="form.sortNo" />
@@ -153,13 +153,16 @@ const form = ref<{
sortNo: null, sortNo: null,
}); });
const ruleValidate = ref({ const openingIsChild = ref(false);
/* 子模块双定位:树节点(带路径/编码)或纯按钮权限(两者皆可空)→ 仅根模块必填 */
const ruleValidate = computed(() => ({
name: [{ required: true, message: "请输入模块名称", trigger: "blur" }], name: [{ required: true, message: "请输入模块名称", trigger: "blur" }],
...(openingIsChild.value ? {} : {
path: [{ required: true, message: "请输入模块路径", trigger: "blur" }], path: [{ required: true, message: "请输入模块路径", trigger: "blur" }],
customId: [{ required: true, type: "number", message: "请输入自定义ID", trigger: "change" }], customId: [{ required: true, type: "number", message: "请输入自定义ID", trigger: "change" }],
}); }),
}));
const openingIsChild = ref(false);
const modalTitle = computed(() => { const modalTitle = computed(() => {
if (currentId.value != null) return '编辑模块'; if (currentId.value != null) return '编辑模块';
return openingIsChild.value ? '新增子模块' : '新增模块'; return openingIsChild.value ? '新增子模块' : '新增模块';
@@ -258,7 +261,7 @@ async function onRawSave() {
data: { data: {
appId: appId.value, appId: appId.value,
name: form.value.name, name: form.value.name,
path: form.value.path, path: form.value.path?.trim() || undefined,
icon: form.value.icon?.trim() || undefined, icon: form.value.icon?.trim() || undefined,
customId: form.value.customId == null ? '' : String(form.value.customId), customId: form.value.customId == null ? '' : String(form.value.customId),
parentId: form.value.parentId ?? undefined, parentId: form.value.parentId ?? undefined,
@@ -272,8 +275,8 @@ async function onRawSave() {
id: currentId.value, id: currentId.value,
appId: appId.value, appId: appId.value,
name: form.value.name, name: form.value.name,
path: form.value.path, path: form.value.path?.trim() || undefined,
// 后端 edit 逐字段整体赋值,字段缺省即置空 → 清空图标能生效 // 后端 edit 逐字段整体赋值,字段缺省即置空 → 清空图标/路径能生效
icon: form.value.icon?.trim() || undefined, icon: form.value.icon?.trim() || undefined,
customId: form.value.customId == null ? '' : String(form.value.customId), customId: form.value.customId == null ? '' : String(form.value.customId),
parentId: form.value.parentId ?? undefined, parentId: form.value.parentId ?? undefined,