Files
collab-ledger/frontend/web/src/views/system/menu/form.vue
T
2026-05-07 18:39:00 +08:00

238 lines
7.3 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<script setup lang="ts">
import { ref, computed } from "vue";
import ReCol from "@/components/ReCol";
import { formRules } from "./utils/rule";
import { usePublicHooks } from "../hooks";
import { MenuRequest } from "@/api/system/menu";
import IconSelect from "@/components/ReIcon/src/Select.vue";
interface FormProps {
formInline: MenuRequest;
higherMenuOptions: any[];
}
// TODO 为什么这里设置的rank: 1是不生效的,而hook那边定义的才能生效 到底需不需要 这个withDefaults
const props = withDefaults(defineProps<FormProps>(), {
formInline: () => ({
id: 0,
parentId: 0,
menuName: "",
routerName: "",
path: "",
status: 1,
isButton: undefined,
permission: "",
menuType: undefined,
meta: {}
}),
higherMenuOptions: () => []
});
const ruleFormRef = ref();
const { switchStyle } = usePublicHooks();
const newFormInline = ref(props.formInline);
const deptOptions = ref(props.higherMenuOptions);
const typeName = computed(() => {
return newFormInline.value.isButton ? "按钮" : "菜单";
});
function getRef() {
return ruleFormRef.value;
}
defineExpose({ getRef });
</script>
<template>
<el-form
ref="ruleFormRef"
:model="newFormInline"
:rules="formRules"
label-width="82px"
>
<el-row :gutter="30">
<re-col>
<el-form-item label="父菜单">
<el-cascader
class="w-full"
v-model="newFormInline.parentId"
:options="deptOptions"
:props="{
value: 'id',
label: 'menuName',
emitPath: false,
checkStrictly: true
}"
clearable
placeholder="请选择父菜单(不选则为根目录菜单)"
/>
<!-- 这种写法可以自定义选项的内容 比如括号后面加上子节点的数字 -->
<!-- <template #default="{ node, data }">
<span>{{ data.deptName }}</span>
<span v-if="!node.isLeaf"> ({{ data.children.length }}) </span>
</template> -->
<!-- </el-cascader> -->
</el-form-item>
</re-col>
<re-col :value="12" :xs="24" :sm="24">
<el-form-item label="类型">
<el-radio-group
v-model="newFormInline.isButton"
:disabled="newFormInline.id !== 0"
>
<el-radio :label="false">菜单</el-radio>
<el-radio :label="true">按钮</el-radio>
</el-radio-group>
</el-form-item>
</re-col>
<template v-if="newFormInline.isButton === false">
<re-col :value="24">
<el-form-item label="菜单类型">
<el-radio-group
v-model="newFormInline.menuType"
:disabled="newFormInline.id !== 0"
>
<el-radio :label="1">页面</el-radio>
<el-radio :label="2">目录</el-radio>
<el-radio :label="3">内嵌Iframe</el-radio>
<el-radio :label="4">外链跳转</el-radio>
</el-radio-group>
</el-form-item>
</re-col>
</template>
</el-row>
<el-row :gutter="30">
<re-col :value="12" :xs="24" :sm="24">
<el-form-item :label="`${typeName}图标`" prop="meta.icon">
<IconSelect v-model="newFormInline.meta.icon" />
</el-form-item>
</re-col>
</el-row>
<el-row :gutter="30">
<re-col :value="12" :xs="24" :sm="24">
<el-form-item :label="`${typeName}名称`" prop="menuName">
<el-input
v-model="newFormInline.menuName"
clearable
:placeholder="`请输入${typeName}名称`"
/>
</el-form-item>
</re-col>
<re-col :value="12" :xs="24" :sm="24">
<el-form-item label="权限标识" prop="permission">
<template v-slot:label>
<el-tooltip content="这是权限标识" placement="top">
<span>权限标识</span>
</el-tooltip>
</template>
<el-input
v-model="newFormInline.permission"
clearable
placeholder="请输入权限标识"
/>
</el-form-item>
</re-col>
</el-row>
<el-row v-if="newFormInline.isButton === false" :gutter="30">
<template v-if="newFormInline.menuType == 1">
<re-col :value="12" :xs="24" :sm="24">
<el-form-item label="页面路径" prop="path">
<el-input
v-model="newFormInline.path"
clearable
placeholder="请输入前端项目views文件内的页面路径"
/>
</el-form-item>
</re-col>
<re-col :value="12">
<el-form-item label="组件名">
<el-input
v-model="newFormInline.routerName"
clearable
placeholder="请输入组件定义的namedefineOptions中的name"
/>
</el-form-item>
</re-col>
</template>
<template v-else-if="newFormInline.menuType == 2">
<re-col :value="24" :xs="24" :sm="24">
<el-form-item label="路由地址" prop="path">
<el-input
v-model="newFormInline.path"
clearable
placeholder="请输入目录的路由地址以/开头"
/>
</el-form-item>
</re-col>
</template>
<template v-else-if="newFormInline.menuType == 3">
<re-col :value="24" :xs="24" :sm="24">
<el-form-item label="网站地址" prop="meta.frameSrc">
<el-input
v-model="newFormInline.meta.frameSrc"
clearable
placeholder="请输入外部网站地址或者内部网站相对地址"
/>
</el-form-item>
</re-col>
</template>
<template v-else-if="newFormInline.menuType == 4">
<re-col :value="24" :xs="24" :sm="24">
<el-form-item label="网站地址" prop="routerName">
<!-- 这里需要做拦截处理 -->
<el-input
v-model="newFormInline.routerName"
clearable
placeholder="请输入外部网站地址,必须以https://或者http://开头"
/>
</el-form-item>
</re-col>
</template>
</el-row>
<el-row>
<re-col :value="12" :xs="24" :sm="24">
<el-form-item label="显示">
<el-switch
v-model="newFormInline.meta.showLink"
inline-prompt
:active-value="true"
:inactive-value="false"
active-text="显示"
inactive-text="隐藏"
:style="switchStyle"
/>
</el-form-item>
</re-col>
<re-col :value="12" :xs="24" :sm="24">
<el-form-item label="状态">
<el-switch
v-model="newFormInline.status"
inline-prompt
:active-value="1"
:inactive-value="0"
active-text="启用"
inactive-text="停用"
:style="switchStyle"
/>
</el-form-item>
</re-col>
</el-row>
<el-row>
<re-col :value="12" :xs="24" :sm="24">
<el-form-item label="排序">
<el-input-number
v-model="newFormInline.meta.rank"
:min="0"
:max="999"
controls-position="right"
/>
</el-form-item>
</re-col>
</el-row>
</el-form>
</template>