|
@@ -12,88 +12,94 @@
|
|
</div>
|
|
</div>
|
|
</template>
|
|
</template>
|
|
<template #extra>
|
|
<template #extra>
|
|
- <el-button type="primary" @click="addClick" size="large">
|
|
|
|
|
|
+ <el-button type="primary" @click="addMenu" size="large">
|
|
<HcIcon name="add"/>
|
|
<HcIcon name="add"/>
|
|
<span>新增</span>
|
|
<span>新增</span>
|
|
</el-button>
|
|
</el-button>
|
|
- <el-button type="danger" @click="cancelClick" size="large" :disabled="tableCheckedKeys.length <= 0">
|
|
|
|
|
|
+ <el-button type="danger" @click="deleteClick" size="large" :disabled="!tableCheckedKeys">
|
|
<HcIcon name="delete-bin-2"/>
|
|
<HcIcon name="delete-bin-2"/>
|
|
<span>删除</span>
|
|
<span>删除</span>
|
|
</el-button>
|
|
</el-button>
|
|
</template>
|
|
</template>
|
|
- <HcTable :column="tableColumn" :datas="tableData" isCheck @selection-change="tableSelectionChange">
|
|
|
|
|
|
+ <HcTable ui="no-border" border hasChildren="hasChildren1" :isIndex="false" isCheck
|
|
|
|
+ :column="tableColumn" :datas="tableData" @selection-change="tableSelectionChange"
|
|
|
|
+ >
|
|
|
|
+ <template #name="{row}">
|
|
|
|
+ <HcIcon class="table-menu-icon" :name="row.source" v-if="row.source"/>
|
|
|
|
+ <span>{{row.name}}</span>
|
|
|
|
+ </template>
|
|
|
|
+ <template #category="{row}">
|
|
|
|
+ <span v-if="row.category === 1">菜单</span>
|
|
|
|
+ <span v-if="row.category === 2">按钮</span>
|
|
|
|
+ </template>
|
|
|
|
+ <template #isShowButton="{row}">
|
|
|
|
+ <span v-if="row.isShowButton === 1">是</span>
|
|
|
|
+ <span v-if="row.isShowButton === 2">否</span>
|
|
|
|
+ </template>
|
|
<template #action="{row, index}">
|
|
<template #action="{row, index}">
|
|
- <el-button size="small" type="primary" @click="eidtModal">编辑</el-button>
|
|
|
|
- <el-button size="small" type="primary" @click="eidtModal">新增子项</el-button>
|
|
|
|
|
|
+ <el-button size="small" type="primary" @click="eidtMenu(row)">编辑</el-button>
|
|
|
|
+ <el-button size="small" type="primary" @click="addChildren(row)">新增子项</el-button>
|
|
</template>
|
|
</template>
|
|
</HcTable>
|
|
</HcTable>
|
|
|
|
|
|
<!--菜单新增编辑-->
|
|
<!--菜单新增编辑-->
|
|
- <HcDialog bgColor="#ffffff" isToBody :show="addModal" :title="modalTitle + '菜单'" @close="addModalClose" widths="70rem">
|
|
|
|
|
|
+ <HcDialog bgColor="#ffffff" isToBody :show="menuDataModal"
|
|
|
|
+ :title="formModel.id?'编辑菜单':'修改菜单'"
|
|
|
|
+ @close="menuDataModalClose" widths="70rem"
|
|
|
|
+ @save="menuDataModalSave"
|
|
|
|
+ >
|
|
<el-form ref="formRef" :model="formModel" :rules="formRules" label-position="left" label-width="auto" size="large">
|
|
<el-form ref="formRef" :model="formModel" :rules="formRules" label-position="left" label-width="auto" size="large">
|
|
<el-row :gutter="20">
|
|
<el-row :gutter="20">
|
|
<el-col :span="12">
|
|
<el-col :span="12">
|
|
<el-form-item label="菜单名称:" prop="name">
|
|
<el-form-item label="菜单名称:" prop="name">
|
|
- <el-input v-model="formModel.name"/>
|
|
|
|
|
|
+ <el-input v-model="formModel.name" placeholder="六字以内的名称"/>
|
|
</el-form-item>
|
|
</el-form-item>
|
|
- </el-col>
|
|
|
|
- <el-col :span="12">
|
|
|
|
- <el-form-item label="路由地址:" prop="location">
|
|
|
|
- <el-input v-model="formModel.idNumber" placeholder=""/>
|
|
|
|
|
|
+ <el-form-item label="路由地址:" prop="path">
|
|
|
|
+ <el-input v-model="formModel.path" placeholder="url上显示的地址"/>
|
|
</el-form-item>
|
|
</el-form-item>
|
|
- </el-col>
|
|
|
|
- <el-col :span="12">
|
|
|
|
- <el-form-item label="上级菜单:">
|
|
|
|
- <el-select v-model="formModel.top" class="block" placeholder="请选择" size="large">
|
|
|
|
- <el-option v-for="item in topMenuoptions" :key="item.value" :label="item.label" :value="item.value"/>
|
|
|
|
- </el-select>
|
|
|
|
|
|
+ <el-form-item label="菜单编号:" prop="code">
|
|
|
|
+ <el-input v-model="formModel.code" placeholder="路由中的跳转name"/>
|
|
</el-form-item>
|
|
</el-form-item>
|
|
- </el-col>
|
|
|
|
- <el-col :span="12">
|
|
|
|
- <el-form-item label="菜单编号:">
|
|
|
|
- <el-input v-model="formModel.deptId" placeholder=""/>
|
|
|
|
|
|
+ <el-form-item label="菜单类型:">
|
|
|
|
+ <el-radio-group v-model="formModel.category">
|
|
|
|
+ <el-radio :label="1">菜单</el-radio>
|
|
|
|
+ <el-radio :label="2">按钮</el-radio>
|
|
|
|
+ </el-radio-group>
|
|
</el-form-item>
|
|
</el-form-item>
|
|
</el-col>
|
|
</el-col>
|
|
<el-col :span="12">
|
|
<el-col :span="12">
|
|
|
|
+ <el-form-item label="上级菜单:">
|
|
|
|
+ <el-cascader v-model="formModel.parentId" :options="tableData" :props="topMenuoptions" clearable size="large"/>
|
|
|
|
+ </el-form-item>
|
|
<el-form-item label="菜单图标:">
|
|
<el-form-item label="菜单图标:">
|
|
- <el-input v-model="formModel.deptId" placeholder=""/>
|
|
|
|
|
|
+ <el-input v-model="formModel.source" placeholder="图标库为 ">
|
|
|
|
+ <template #append>
|
|
|
|
+ <a href="https://remixicon.cn/" target="_blank">图标库</a>
|
|
|
|
+ </template>
|
|
|
|
+ </el-input>
|
|
</el-form-item>
|
|
</el-form-item>
|
|
- </el-col>
|
|
|
|
- <el-col :span="12">
|
|
|
|
<el-form-item label="排序:">
|
|
<el-form-item label="排序:">
|
|
- <el-input v-model="formModel.deptId" placeholder=""/>
|
|
|
|
|
|
+ <el-input v-model="formModel.sort" placeholder="菜单的排序,值越大越后"/>
|
|
</el-form-item>
|
|
</el-form-item>
|
|
- </el-col>
|
|
|
|
- <el-col :span="12">
|
|
|
|
- <el-form-item label="菜单类型:" prop="type">
|
|
|
|
- <el-radio-group v-model="formModel.type">
|
|
|
|
- <el-radio :label="3">菜单</el-radio>
|
|
|
|
- <el-radio :label="6">按钮</el-radio>
|
|
|
|
|
|
+ <el-form-item label="显示按钮:">
|
|
|
|
+ <el-radio-group v-model="formModel.isShowButton">
|
|
|
|
+ <el-radio :label="1">是</el-radio>
|
|
|
|
+ <el-radio :label="2">否</el-radio>
|
|
</el-radio-group>
|
|
</el-radio-group>
|
|
</el-form-item>
|
|
</el-form-item>
|
|
</el-col>
|
|
</el-col>
|
|
</el-row>
|
|
</el-row>
|
|
</el-form>
|
|
</el-form>
|
|
- <template #footer>
|
|
|
|
- <div class="dialog-footer">
|
|
|
|
- <el-button size="large" @click="addModal = false">
|
|
|
|
- <HcIcon name="close"/>
|
|
|
|
- <span>取消</span>
|
|
|
|
- </el-button>
|
|
|
|
- <el-button :loading="sureSignUserLoading" hc-btn type="primary" @click="sureSignUserClick">
|
|
|
|
- <HcIcon name="check"/>
|
|
|
|
- <span>确定创建</span>
|
|
|
|
- </el-button>
|
|
|
|
- </div>
|
|
|
|
- </template>
|
|
|
|
</HcDialog>
|
|
</HcDialog>
|
|
</HcCard>
|
|
</HcCard>
|
|
</template>
|
|
</template>
|
|
|
|
|
|
<script setup>
|
|
<script setup>
|
|
-import {onActivated, ref, watch} from "vue";
|
|
|
|
|
|
+import {onActivated, ref} from "vue";
|
|
import mainApi from "~api/system/menu";
|
|
import mainApi from "~api/system/menu";
|
|
-import {getArrValue} from "js-fast-way";
|
|
|
|
|
|
+import {arrToId, formValidate, getArrValue} from "js-fast-way";
|
|
|
|
+import config from "~src/config/index";
|
|
|
|
+import {delMessage} from "~uti/tools";
|
|
|
|
|
|
//页面被激活时
|
|
//页面被激活时
|
|
onActivated(() => {
|
|
onActivated(() => {
|
|
@@ -104,14 +110,12 @@ onActivated(() => {
|
|
const searchForm = ref({name: '', parentId: ''})
|
|
const searchForm = ref({name: '', parentId: ''})
|
|
const tableColumn = [
|
|
const tableColumn = [
|
|
{key: 'name', name: '菜单名称'},
|
|
{key: 'name', name: '菜单名称'},
|
|
- {key: 'name', name: '路由地址'},
|
|
|
|
- {key: 'name', name: '菜单编号'},
|
|
|
|
- {key: 'text', name: '菜单图标'},
|
|
|
|
- {key: 'text', name: '菜单类型'},
|
|
|
|
- {key: 'text', name: '是否显示按钮'},
|
|
|
|
- {key: 'text', name: '排序'},
|
|
|
|
- {key: 'text', name: '上级菜单'},
|
|
|
|
- {key: 'action', name: '操作', width: 250}
|
|
|
|
|
|
+ {key: 'code', name: '菜单编号'},
|
|
|
|
+ {key: 'path', name: '路由地址'},
|
|
|
|
+ {key: 'category', name: '菜单类型'},
|
|
|
|
+ {key: 'isShowButton', name: '显示按钮', width: 90, align: 'center' },
|
|
|
|
+ {key: 'sort', name: '排序', width: 80, align: 'center' },
|
|
|
|
+ {key: 'action', name: '操作', width: 165}
|
|
]
|
|
]
|
|
const tableData = ref([])
|
|
const tableData = ref([])
|
|
const getTableData = async () => {
|
|
const getTableData = async () => {
|
|
@@ -123,69 +127,106 @@ const getTableData = async () => {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-const tableCheckedKeys = ref([]);
|
|
|
|
|
|
+//多选
|
|
|
|
+const tableCheckedKeys = ref('');
|
|
const tableSelectionChange = (rows) => {
|
|
const tableSelectionChange = (rows) => {
|
|
- tableCheckedKeys.value = rows
|
|
|
|
- if (tableCheckedKeys.value.length > 1) {
|
|
|
|
- window.$message.warning('只能选择一条数据')
|
|
|
|
|
|
+ tableCheckedKeys.value = arrToId(rows)
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+//删除菜单
|
|
|
|
+const deleteClick = () => {
|
|
|
|
+ if (tableCheckedKeys.value) {
|
|
|
|
+ delMessage(() => {
|
|
|
|
+ deleteApi(tableCheckedKeys.value)
|
|
|
|
+ })
|
|
|
|
+ } else {
|
|
|
|
+ window.$message.warning('请选择要删除的菜单')
|
|
}
|
|
}
|
|
}
|
|
}
|
|
-const modalTitle = ref('新增')
|
|
|
|
-const addModal = ref(false)
|
|
|
|
-//弹窗关闭
|
|
|
|
-const addModalClose = () => {
|
|
|
|
- console.log('弹窗关闭')
|
|
|
|
- addModal.value = false
|
|
|
|
|
|
+//删除请求
|
|
|
|
+const deleteApi = async (ids) => {
|
|
|
|
+ const {error, code, msg} = await mainApi.remove(ids)
|
|
|
|
+ if (!error && code === 200) {
|
|
|
|
+ window.$message.success('删除成功')
|
|
|
|
+ getTableData().then()
|
|
|
|
+ } else {
|
|
|
|
+ window.$message.success(msg)
|
|
|
|
+ }
|
|
}
|
|
}
|
|
-const addClick = () => {
|
|
|
|
- addModal.value = true
|
|
|
|
- modalTitle.value = '新增'
|
|
|
|
|
|
+
|
|
|
|
+//菜单数据弹窗
|
|
|
|
+const menuDataModal = ref(false)
|
|
|
|
+const formRef = ref(null)
|
|
|
|
+const formModel = ref({
|
|
|
|
+ category: 1, isShowButton: 1
|
|
|
|
+})
|
|
|
|
+const formRules = {
|
|
|
|
+ name: {required: true, trigger: 'blur', message: "请输入菜单名称"},
|
|
|
|
+ path: {required: true, trigger: 'blur', message: "请输入路由地址"},
|
|
|
|
+ code: {required: true, trigger: 'blur', message: "请输入菜单编号"}
|
|
}
|
|
}
|
|
-const cancelClick = () => {
|
|
|
|
- window?.$messageBox?.alert('您确定要删除该菜单信息吗? 一旦注销数据将彻底清除,请谨慎操作?', '删除提醒', {
|
|
|
|
- showCancelButton: true,
|
|
|
|
- confirmButtonText: '确认注销',
|
|
|
|
- cancelButtonText: '取消',
|
|
|
|
- type: 'warning',
|
|
|
|
- callback: (action) => {
|
|
|
|
- if (action === 'confirm') {
|
|
|
|
- console.log(11111);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- })
|
|
|
|
|
|
+const topMenuoptions = {
|
|
|
|
+ expandTrigger: 'hover',
|
|
|
|
+ checkStrictly: true,
|
|
|
|
+ emitPath: false,
|
|
|
|
+ value: 'id',
|
|
|
|
+ label: 'name',
|
|
}
|
|
}
|
|
-const sureSignUserLoading = ref(false)
|
|
|
|
-const sureSignUserClick = () => {
|
|
|
|
|
|
|
|
|
|
+//新增菜单
|
|
|
|
+const addMenu = () => {
|
|
|
|
+ formModel.value = {
|
|
|
|
+ sysId: config.sysId,
|
|
|
|
+ isOpen: 1,
|
|
|
|
+ isLayout: 1,
|
|
|
|
+ category: 1,
|
|
|
|
+ isShowButton: 1,
|
|
|
|
+ parentId: 0
|
|
|
|
+ }
|
|
|
|
+ menuDataModal.value = true
|
|
}
|
|
}
|
|
-const eidtModal = () => {
|
|
|
|
- modalTitle.value = '编辑'
|
|
|
|
- addModal.value = true
|
|
|
|
|
|
+
|
|
|
|
+//编辑菜单
|
|
|
|
+const eidtMenu = (row) => {
|
|
|
|
+ formModel.value = row
|
|
|
|
+ menuDataModal.value = true
|
|
}
|
|
}
|
|
-const formRef = ref(null)
|
|
|
|
-const formModel = ref({})
|
|
|
|
-const formRules = {
|
|
|
|
- name: {
|
|
|
|
- required: true,
|
|
|
|
- trigger: 'blur',
|
|
|
|
- message: "请输入菜单名称"
|
|
|
|
- },
|
|
|
|
- location: {
|
|
|
|
- required: true,
|
|
|
|
- trigger: 'blur',
|
|
|
|
- message: "请输入路由地址"
|
|
|
|
- },
|
|
|
|
- type: {
|
|
|
|
- required: true,
|
|
|
|
- trigger: 'blur',
|
|
|
|
- message: "请选择类型"
|
|
|
|
|
|
+
|
|
|
|
+//新增子级菜单
|
|
|
|
+const addChildren = (row) => {
|
|
|
|
+ formModel.value = {
|
|
|
|
+ sysId: config.sysId,
|
|
|
|
+ isOpen: 1,
|
|
|
|
+ isLayout: 1,
|
|
|
|
+ category: 1,
|
|
|
|
+ isShowButton: 1,
|
|
|
|
+ parentId: row.id
|
|
}
|
|
}
|
|
|
|
+ menuDataModal.value = true
|
|
}
|
|
}
|
|
-const topMenuoptions = ref([])
|
|
|
|
-</script>
|
|
|
|
|
|
|
|
-<style lang="scss" scoped>
|
|
|
|
|
|
+//提交保存
|
|
|
|
+const menuDataModalSave = async () => {
|
|
|
|
+ const isForm = await formValidate(formRef.value)
|
|
|
|
+ if (isForm) {
|
|
|
|
+ const form = formModel.value
|
|
|
|
+ const {error, code, msg} = await mainApi.submit({
|
|
|
|
+ ...form,
|
|
|
|
+ alias: form.code
|
|
|
|
+ })
|
|
|
|
+ if (!error && code === 200) {
|
|
|
|
+ window.$message.success('保存成功')
|
|
|
|
+ menuDataModal.value = false
|
|
|
|
+ getTableData().then()
|
|
|
|
+ } else {
|
|
|
|
+ window.$message.error(msg)
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
|
|
-</style>
|
|
|
|
|
|
+//弹窗关闭
|
|
|
|
+const menuDataModalClose = () => {
|
|
|
|
+ menuDataModal.value = false
|
|
|
|
+ formModel.value = {}
|
|
|
|
+}
|
|
|
|
+</script>
|