|
@@ -0,0 +1,168 @@
|
|
|
+<template>
|
|
|
+ <ElDrawer ref="elDrawerRef" v-model="drawerVisible" :title="drawerProps.title" v-bind="$attrs" destroy-on-close>
|
|
|
+ <template #header="scope">
|
|
|
+ <slot name="header" v-bind="scope">
|
|
|
+ <div style="display: flex">
|
|
|
+ <slot name="title">
|
|
|
+ <span style="flex: 1">{{ drawerProps.title }}</span>
|
|
|
+ </slot>
|
|
|
+ </div>
|
|
|
+ </slot>
|
|
|
+ </template>
|
|
|
+
|
|
|
+ <el-form ref="ruleFormRef" label-width="100px" label-suffix=" :" :rules="rules" :model="drawerProps.row" @submit.enter.prevent="handleConfirm">
|
|
|
+ <el-form-item label="上级" prop="parentId">
|
|
|
+ <el-tree-select
|
|
|
+ v-model="drawerProps.row.parentId"
|
|
|
+ :data="treeData"
|
|
|
+ check-strictly
|
|
|
+ placeholder="请选择上级"
|
|
|
+ :render-after-expand="false"
|
|
|
+ clearable
|
|
|
+ :default-expand-all="true"
|
|
|
+ :props="treeProps" />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="菜单名称" prop="title">
|
|
|
+ <el-input v-model="drawerProps.row.title" placeholder="请填写名称" clearable />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="菜单类型" prop="menuType">
|
|
|
+ <el-input v-model="drawerProps.row.menuType" placeholder="请填写名称" clearable />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="图标" prop="icon">
|
|
|
+ <el-input v-model="drawerProps.row.icon" placeholder="请选择图标" clearable />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="路由名称" prop="name">
|
|
|
+ <el-input v-model="drawerProps.row.name" placeholder="请填写路由名称" clearable />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="路由地址" prop="path">
|
|
|
+ <el-input v-model="drawerProps.row.path" placeholder="请填写路由地址" clearable />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="组件路径" prop="component">
|
|
|
+ <el-input v-model="drawerProps.row.component" placeholder="请填写组件路径" clearable />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="显示状态" prop="visible">
|
|
|
+ <el-radio-group v-model="drawerProps.row.visible">
|
|
|
+ <el-radio-button :value="item.dictValue" v-for="(item, index) in commonStatus" :key="index" :label="item.dictLabel" />
|
|
|
+ </el-radio-group>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="是否全屏" prop="displayLayout">
|
|
|
+ <el-radio-group v-model="drawerProps.row.displayLayout">
|
|
|
+ <el-radio-button :value="item.dictValue" v-for="(item, index) in commonStatus" :key="index" :label="item.dictLabel" />
|
|
|
+ </el-radio-group>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="固定标签页" prop="affix">
|
|
|
+ <el-radio-group v-model="drawerProps.row.affix">
|
|
|
+ <el-radio-button :value="item.dictValue" v-for="(item, index) in commonStatus" :key="index" :label="item.dictLabel" />
|
|
|
+ </el-radio-group>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="是否缓存" prop="keepLive">
|
|
|
+ <el-radio-group v-model="drawerProps.row.keepLive">
|
|
|
+ <el-radio-button :value="item.dictValue" v-for="(item, index) in commonStatus" :key="index" :label="item.dictLabel" />
|
|
|
+ </el-radio-group>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="状态" prop="status">
|
|
|
+ <el-radio-group v-model="drawerProps.row.status">
|
|
|
+ <el-radio-button :value="item.dictValue" v-for="(item, index) in commonStatus" :key="index" :label="item.dictLabel" />
|
|
|
+ </el-radio-group>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="备注" prop="remark">
|
|
|
+ <el-input v-model="drawerProps.row.remark" placeholder="请填写备注" clearable />
|
|
|
+ </el-form-item>
|
|
|
+ </el-form>
|
|
|
+
|
|
|
+ <template #footer>
|
|
|
+ <slot name="footer">
|
|
|
+ <ElButton @click="drawerVisible = false">取 消</ElButton>
|
|
|
+ <ElButton type="primary" @click="handleConfirm()">确 定</ElButton>
|
|
|
+ </slot>
|
|
|
+ </template>
|
|
|
+ </ElDrawer>
|
|
|
+</template>
|
|
|
+
|
|
|
+<script setup lang="ts" name="MenuForm">
|
|
|
+import { MenuBO } from '@/api/interface/system/menu'
|
|
|
+import MenuApi from '@/api/module/system/menu'
|
|
|
+import { ResultEnum } from '@/enums/HttpEnum'
|
|
|
+import { FormInstance } from 'element-plus'
|
|
|
+import { useDictOptions } from '@/hooks'
|
|
|
+import { MenuTreeVO } from '@/api/interface/system/menu'
|
|
|
+
|
|
|
+const commonStatus = useDictOptions('COMMON_STATUS')
|
|
|
+const rules = reactive({
|
|
|
+ account: [{ required: true, message: '请填写账号' }],
|
|
|
+ menuName: [{ required: true, message: '请填写姓名' }],
|
|
|
+ status: [{ required: true, message: '状态不能为空' }]
|
|
|
+})
|
|
|
+
|
|
|
+interface EcoDrawerProps {
|
|
|
+ api?: (params: any) => Promise<any> // 调用接口
|
|
|
+ title: string // 顶部标题
|
|
|
+ isView: boolean
|
|
|
+ row: Partial<MenuBO>
|
|
|
+ getTableList?: () => void
|
|
|
+}
|
|
|
+
|
|
|
+const treeData = ref<MenuTreeVO[]>([])
|
|
|
+const treeProps = {
|
|
|
+ label: 'title',
|
|
|
+ value: 'menuId'
|
|
|
+}
|
|
|
+
|
|
|
+const drawerVisible = ref(false)
|
|
|
+const drawerProps = ref<EcoDrawerProps>({
|
|
|
+ isView: false,
|
|
|
+ title: '',
|
|
|
+ row: {}
|
|
|
+})
|
|
|
+
|
|
|
+// emit
|
|
|
+const emit = defineEmits(['submit'])
|
|
|
+
|
|
|
+// 接收父组件传过来的参数
|
|
|
+const acceptParams = (params: EcoDrawerProps) => {
|
|
|
+ drawerProps.value = params
|
|
|
+ drawerVisible.value = true
|
|
|
+ loadTree()
|
|
|
+ drawerProps.value.row.status = drawerProps.value.row.status || '1'
|
|
|
+}
|
|
|
+
|
|
|
+const loadTree = () => {
|
|
|
+ MenuApi.tree().then(res => {
|
|
|
+ treeData.value = [
|
|
|
+ {
|
|
|
+ parentId: '-1',
|
|
|
+ menuId: '0',
|
|
|
+ title: '顶层',
|
|
|
+ children: res.data
|
|
|
+ }
|
|
|
+ ]
|
|
|
+ })
|
|
|
+}
|
|
|
+
|
|
|
+// 提交数据(新增/编辑)
|
|
|
+const ruleFormRef = ref<FormInstance>()
|
|
|
+const handleConfirm = () => {
|
|
|
+ ruleFormRef.value!.validate(async valid => {
|
|
|
+ if (!valid) return
|
|
|
+ try {
|
|
|
+ console.log(drawerProps.value.row)
|
|
|
+
|
|
|
+ const { code } = await drawerProps.value.api!(drawerProps.value.row)
|
|
|
+ if (code == ResultEnum.SUCCESS) {
|
|
|
+ ElMessage.success({ message: `${drawerProps.value.title}成功!` })
|
|
|
+ drawerProps.value.getTableList!()
|
|
|
+ emit('submit')
|
|
|
+ drawerVisible.value = false
|
|
|
+ }
|
|
|
+ } catch (error) {
|
|
|
+ console.log(error)
|
|
|
+ }
|
|
|
+ })
|
|
|
+}
|
|
|
+
|
|
|
+defineExpose({
|
|
|
+ acceptParams
|
|
|
+})
|
|
|
+</script>
|
|
|
+
|
|
|
+<style scoped lang="scss"></style>
|