| <template> | 
|     <div class="sys-menu-container"> | 
|         <el-dialog v-model="state.isShowDialog" draggable :close-on-click-modal="false" width="700px"> | 
|             <template #header> | 
|                 <div style="color: #fff"> | 
|                     <el-icon size="16" style="margin-right: 3px; display: inline; vertical-align: middle"> <ele-Edit /> </el-icon> | 
|                     <span> {{ props.title }} </span> | 
|                 </div> | 
|             </template> | 
|             <el-form :model="state.ruleForm" ref="ruleFormRef" label-width="auto"> | 
|                 <el-row :gutter="35"> | 
|                     <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20"> | 
|                         <el-form-item label="上级菜单"> | 
|                             <el-cascader | 
|                                 :options="props.menuData" | 
|                                 :props="{ checkStrictly: true, emitPath: false, value: 'id', label: 'title' }" | 
|                                 placeholder="请选择上级菜单" | 
|                                 clearable | 
|                                 class="w100" | 
|                                 v-model="state.ruleForm.pid" | 
|                             > | 
|                                 <template #default="{ node, data }"> | 
|                                     <span>{{ data.title }}</span> | 
|                                     <span v-if="!node.isLeaf"> ({{ data.children.length }}) </span> | 
|                                 </template> | 
|                             </el-cascader> | 
|                         </el-form-item> | 
|                     </el-col> | 
|                     <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20"> | 
|                         <el-form-item label="菜单类型" prop="type" :rules="[{ required: true, message: '菜单类型不能为空', trigger: 'blur' }]"> | 
|                             <el-radio-group v-model="state.ruleForm.type"> | 
|                                 <el-radio :value="1">目录</el-radio> | 
|                                 <el-radio :value="2">菜单</el-radio> | 
|                                 <el-radio :value="3">按钮</el-radio> | 
|                             </el-radio-group> | 
|                         </el-form-item> | 
|                     </el-col> | 
|                     <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20"> | 
|                         <el-form-item label="菜单名称" prop="title" :rules="[{ required: true, message: '菜单名称不能为空', trigger: 'blur' }]"> | 
|                             <el-input v-model="state.ruleForm.title" placeholder="菜单名称" clearable /> | 
|                         </el-form-item> | 
|                     </el-col> | 
|                     <template v-if="state.ruleForm.type === 1 || state.ruleForm.type === 2"> | 
|                         <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20"> | 
|                             <el-form-item label="路由名称"> | 
|                                 <el-input v-model="state.ruleForm.name" placeholder="路由名称" clearable /> | 
|                             </el-form-item> | 
|                         </el-col> | 
|                         <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20"> | 
|                             <el-form-item label="路由路径"> | 
|                                 <el-input v-model="state.ruleForm.path" placeholder="路由路径" clearable /> | 
|                             </el-form-item> | 
|                         </el-col> | 
|                         <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20"> | 
|                             <el-form-item label="组件路径"> | 
|                                 <el-input v-model="state.ruleForm.component" placeholder="组件路径" clearable /> | 
|                             </el-form-item> | 
|                         </el-col> | 
|                         <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20"> | 
|                             <el-form-item label="菜单图标"> | 
|                                 <IconSelector v-model="state.ruleForm.icon" :size="getGlobalComponentSize" placeholder="菜单图标" type="all" /> | 
|                             </el-form-item> | 
|                         </el-col> | 
|                         <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20"> | 
|                             <el-form-item label="重定向"> | 
|                                 <el-input v-model="state.ruleForm.redirect" placeholder="重定向地址" clearable /> | 
|                             </el-form-item> | 
|                         </el-col> | 
|                         <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20"> | 
|                             <el-form-item label="链接地址"> | 
|                                 <el-input v-model="state.ruleForm.outLink" placeholder="外链/内嵌时链接地址" clearable /> | 
|                             </el-form-item> | 
|                         </el-col> | 
|                         <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20"> | 
|                             <el-form-item label="菜单排序"> | 
|                                 <el-input-number v-model="state.ruleForm.orderNo" placeholder="排序" class="w100" /> | 
|                             </el-form-item> | 
|                         </el-col> | 
|                         <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20"> | 
|                             <el-form-item label="是否隐藏"> | 
|                                 <el-radio-group v-model="state.ruleForm.isHide"> | 
|                                     <el-radio :value="true">隐藏</el-radio> | 
|                                     <el-radio :value="false">不隐藏</el-radio> | 
|                                 </el-radio-group> | 
|                             </el-form-item> | 
|                         </el-col> | 
|                         <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20"> | 
|                             <el-form-item label="是否缓存"> | 
|                                 <el-radio-group v-model="state.ruleForm.isKeepAlive"> | 
|                                     <el-radio :value="true">缓存</el-radio> | 
|                                     <el-radio :value="false">不缓存</el-radio> | 
|                                 </el-radio-group> | 
|                             </el-form-item> | 
|                         </el-col> | 
|                         <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20"> | 
|                             <el-form-item label="是否固定"> | 
|                                 <el-radio-group v-model="state.ruleForm.isAffix"> | 
|                                     <el-radio :value="true">固定</el-radio> | 
|                                     <el-radio :value="false">不固定</el-radio> | 
|                                 </el-radio-group> | 
|                             </el-form-item> | 
|                         </el-col> | 
|                         <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20"> | 
|                             <el-form-item label="是否内嵌"> | 
|                                 <el-radio-group v-model="state.ruleForm.isIframe"> | 
|                                     <el-radio :value="true">内嵌</el-radio> | 
|                                     <el-radio :value="false">不内嵌</el-radio> | 
|                                 </el-radio-group> | 
|                             </el-form-item> | 
|                         </el-col> | 
|                     </template> | 
|                     <template v-if="state.ruleForm.type === 3"> | 
|                         <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20"> | 
|                             <el-form-item label="权限标识"> | 
|                                 <el-input v-model="state.ruleForm.permission" placeholder="权限标识" clearable /> | 
|                             </el-form-item> | 
|                         </el-col> | 
|                         <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20"> | 
|                             <el-form-item label="菜单排序"> | 
|                                 <el-input-number v-model="state.ruleForm.orderNo" placeholder="排序" class="w100" /> | 
|                             </el-form-item> | 
|                         </el-col> | 
|                     </template> | 
|                     <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20"> | 
|                         <el-form-item label="是否启用"> | 
|                             <el-radio-group v-model="state.ruleForm.status"> | 
|                                 <el-radio :value="1">启用</el-radio> | 
|                                 <el-radio :value="2">不启用</el-radio> | 
|                             </el-radio-group> | 
|                         </el-form-item> | 
|                     </el-col> | 
|                     <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20"> | 
|                         <el-form-item label="备注"> | 
|                             <el-input v-model="state.ruleForm.remark" placeholder="请输入备注内容" clearable type="textarea" /> | 
|                         </el-form-item> | 
|                     </el-col> | 
|                 </el-row> | 
|             </el-form> | 
|             <template #footer> | 
|                 <span class="dialog-footer"> | 
|                     <el-button @click="cancel">取 消</el-button> | 
|                     <el-button type="primary" @click="submit">确 定</el-button> | 
|                 </span> | 
|             </template> | 
|         </el-dialog> | 
|     </div> | 
| </template> | 
|   | 
| <script lang="ts" setup name="sysEditMenu"> | 
| import { computed, reactive, ref } from 'vue'; | 
| import IconSelector from '/@/components/iconSelector/index.vue'; | 
|   | 
| import { getAPI } from '/@/utils/axios-utils'; | 
| import other from '/@/utils/other'; | 
| import { SysMenuApi } from '/@/api-services/api'; | 
| import { SysMenu, UpdateMenuInput } from '/@/api-services/models'; | 
|   | 
| const props = defineProps({ | 
|     title: String, | 
|     menuData: Array<SysMenu>, | 
| }); | 
| const emits = defineEmits(['handleQuery']); | 
| const ruleFormRef = ref(); | 
| const state = reactive({ | 
|     isShowDialog: false, | 
|     ruleForm: {} as UpdateMenuInput, | 
| }); | 
|   | 
| // 获取全局组件大小 | 
| const getGlobalComponentSize = computed(() => { | 
|     return other.globalComponentSize(); | 
| }); | 
|   | 
| // 打开弹窗 | 
| const openDialog = (row: any) => { | 
|     state.ruleForm = JSON.parse(JSON.stringify(row)); | 
|     state.isShowDialog = true; | 
|     ruleFormRef.value?.resetFields(); | 
| }; | 
|   | 
| // 关闭弹窗 | 
| const closeDialog = () => { | 
|     emits('handleQuery'); | 
|     state.isShowDialog = false; | 
| }; | 
|   | 
| // 取消 | 
| const cancel = () => { | 
|     state.isShowDialog = false; | 
| }; | 
|   | 
| // 提交 | 
| const submit = () => { | 
|     ruleFormRef.value.validate(async (valid: boolean) => { | 
|         if (!valid) return; | 
|         if (state.ruleForm.id != undefined && state.ruleForm.id > 0) { | 
|             await getAPI(SysMenuApi).apiSysMenuUpdatePost(state.ruleForm); | 
|         } else { | 
|             await getAPI(SysMenuApi).apiSysMenuAddPost(state.ruleForm); | 
|         } | 
|         closeDialog(); | 
|     }); | 
| }; | 
|   | 
| // 导出对象 | 
| defineExpose({ openDialog }); | 
| </script> |