Commit 56e2f21d by YunaiV

Vue3 重构:REVIEW 菜单

parent d72101b1
...@@ -18,18 +18,13 @@ export interface MenuVO { ...@@ -18,18 +18,13 @@ export interface MenuVO {
createTime: Date createTime: Date
} }
export interface MenuPageReqVO {
name?: string
status?: number
}
// 查询菜单(精简)列表 // 查询菜单(精简)列表
export const listSimpleMenusApi = () => { export const getSimpleMenusList = () => {
return request.get({ url: '/system/menu/list-all-simple' }) return request.get({ url: '/system/menu/list-all-simple' })
} }
// 查询菜单列表 // 查询菜单列表
export const getMenuListApi = (params: MenuPageReqVO) => { export const getMenuList = (params) => {
return request.get({ url: '/system/menu/list', params }) return request.get({ url: '/system/menu/list', params })
} }
...@@ -39,16 +34,16 @@ export const getMenuApi = (id: number) => { ...@@ -39,16 +34,16 @@ export const getMenuApi = (id: number) => {
} }
// 新增菜单 // 新增菜单
export const createMenuApi = (data: MenuVO) => { export const createMenu = (data: MenuVO) => {
return request.post({ url: '/system/menu/create', data }) return request.post({ url: '/system/menu/create', data })
} }
// 修改菜单 // 修改菜单
export const updateMenuApi = (data: MenuVO) => { export const updateMenu = (data: MenuVO) => {
return request.put({ url: '/system/menu/update', data }) return request.put({ url: '/system/menu/update', data })
} }
// 删除菜单 // 删除菜单
export const deleteMenuApi = (id: number) => { export const deleteMenu = (id: number) => {
return request.delete({ url: '/system/menu/delete?id=' + id }) return request.delete({ url: '/system/menu/delete?id=' + id })
} }
...@@ -6,7 +6,7 @@ import { useForm } from '@/hooks/web/useForm' ...@@ -6,7 +6,7 @@ import { useForm } from '@/hooks/web/useForm'
import { FormSchema } from '@/types/form' import { FormSchema } from '@/types/form'
import { CodegenTableVO } from '@/api/infra/codegen/types' import { CodegenTableVO } from '@/api/infra/codegen/types'
import { getIntDictOptions } from '@/utils/dict' import { getIntDictOptions } from '@/utils/dict'
import { listSimpleMenusApi } from '@/api/system/menu' import { getSimpleMenusList } from '@/api/system/menu'
import { handleTree, defaultProps } from '@/utils/tree' import { handleTree, defaultProps } from '@/utils/tree'
import { PropType } from 'vue' import { PropType } from 'vue'
...@@ -21,7 +21,7 @@ const templateTypeOptions = getIntDictOptions(DICT_TYPE.INFRA_CODEGEN_TEMPLATE_T ...@@ -21,7 +21,7 @@ const templateTypeOptions = getIntDictOptions(DICT_TYPE.INFRA_CODEGEN_TEMPLATE_T
const sceneOptions = getIntDictOptions(DICT_TYPE.INFRA_CODEGEN_SCENE) const sceneOptions = getIntDictOptions(DICT_TYPE.INFRA_CODEGEN_SCENE)
const menuOptions = ref<any>([]) // 树形结构 const menuOptions = ref<any>([]) // 树形结构
const getTree = async () => { const getTree = async () => {
const res = await listSimpleMenusApi() const res = await getSimpleMenusList()
menuOptions.value = handleTree(res) menuOptions.value = handleTree(res)
} }
......
<template> <template>
<!-- 搜索工作栏 -->
<ContentWrap> <ContentWrap>
<!-- 搜索工作栏 --> <el-form
<el-form :model="queryParams" ref="queryFormRef" :inline="true"> class="-mb-15px"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
>
<el-form-item label="菜单名称" prop="name"> <el-form-item label="菜单名称" prop="name">
<el-input <el-input
v-model="queryParams.name" v-model="queryParams.name"
placeholder="请输入菜单名称" placeholder="请输入菜单名称"
clearable clearable
@keyup.enter="handleQuery" @keyup.enter="handleQuery"
class="!w-240px"
/> />
</el-form-item> </el-form-item>
<el-form-item label="状态" prop="status"> <el-form-item label="状态" prop="status">
<el-select v-model="queryParams.status" placeholder="菜单状态" clearable> <el-select
v-model="queryParams.status"
placeholder="请选择菜单状态"
clearable
class="!w-240px"
>
<el-option <el-option
v-for="dict in getDictOptions(DICT_TYPE.COMMON_STATUS)" v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)"
:key="parseInt(dict.value)" :key="dict.value"
:label="dict.label" :label="dict.label"
:value="parseInt(dict.value)" :value="dict.value"
/> />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button> <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button> <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
<el-button type="primary" @click="openModal('create')" v-hasPermi="['system:menu:create']"> <el-button
type="primary"
plain
@click="openForm('create')"
v-hasPermi="['system:menu:create']"
>
<Icon icon="ep:plus" class="mr-5px" /> 新增 <Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button> </el-button>
<el-button type="danger" plain @click="toggleExpandAll">
<Icon icon="ep:sort" class="mr-5px" /> 展开/折叠
</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
</ContentWrap>
<el-row :gutter="10" class="mb8"> <!-- 列表 -->
<el-col :span="1.5"> <ContentWrap>
<el-button type="info" plain icon="el-icon-sort" @click="toggleExpandAll"
>展开/折叠</el-button
>
</el-col>
</el-row>
<el-table <el-table
v-loading="loading" v-loading="loading"
:data="list" :data="list"
v-if="refreshTable"
row-key="id" row-key="id"
v-if="refreshTable"
:default-expand-all="isExpandAll" :default-expand-all="isExpandAll"
:tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
> >
<el-table-column prop="name" label="菜单名称" :show-overflow-tooltip="true" width="250" /> <el-table-column prop="name" label="菜单名称" :show-overflow-tooltip="true" width="250" />
<el-table-column prop="icon" label="图标" align="center" width="100"> <el-table-column prop="icon" label="图标" align="center" width="100">
...@@ -60,62 +74,63 @@ ...@@ -60,62 +74,63 @@
<dict-tag :type="DICT_TYPE.COMMON_STATUS" :value="scope.row.status" /> <dict-tag :type="DICT_TYPE.COMMON_STATUS" :value="scope.row.status" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width"> <el-table-column label="操作" align="center">
<template #default="scope"> <template #default="scope">
<el-button <el-button
link link
type="primary" type="primary"
@click="openModal('update', scope.row.id)" @click="openForm('update', scope.row.id)"
v-hasPermi="['system:menu:update']" v-hasPermi="['system:menu:update']"
>修改</el-button
> >
修改
</el-button>
<el-button <el-button
link link
type="primary" type="primary"
@click="openModal('create', scope.row.id)" @click="openForm('create', undefined, scope.row.id)"
v-hasPermi="['system:menu:create']" v-hasPermi="['system:menu:create']"
>新增</el-button
> >
新增
</el-button>
<el-button <el-button
link link
type="primary" type="danger"
@click="handleDelete(scope.row.id)" @click="handleDelete(scope.row.id)"
v-hasPermi="['system:menu:delete']" v-hasPermi="['system:menu:delete']"
>删除</el-button
> >
删除
</el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
</ContentWrap> </ContentWrap>
<!-- 表单弹窗:添加/修改 --> <!-- 表单弹窗:添加/修改 -->
<menu-form ref="modalRef" @success="getList" /> <MenuForm ref="formRef" @success="getList" />
</template> </template>
<script setup lang="ts" name="Menu"> <script setup lang="ts" name="Menu">
// 业务相关的 import import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
import { DICT_TYPE, getDictOptions } from '@/utils/dict'
import { handleTree } from '@/utils/tree' import { handleTree } from '@/utils/tree'
import * as MenuApi from '@/api/system/menu' import * as MenuApi from '@/api/system/menu'
import MenuForm from './form.vue' import MenuForm from './MenuForm.vue'
const { t } = useI18n() // 国际化 const { t } = useI18n() // 国际化
const message = useMessage() // 消息弹窗 const message = useMessage() // 消息弹窗
const loading = ref(true) // 列表的加载中 const loading = ref(true) // 列表的加载中
const list = ref<any>([]) // 列表的数据 const list = ref<any>([]) // 列表的数据
const isExpandAll = ref(false) // 是否展开,默认全部折叠
const refreshTable = ref(true) // 重新渲染表格状态
const queryParams = reactive({ const queryParams = reactive({
name: undefined, name: undefined,
status: undefined status: undefined
}) })
const queryFormRef = ref() // 搜索的表单 const queryFormRef = ref() // 搜索的表单
const isExpandAll = ref(false) // 是否展开,默认全部折叠
const refreshTable = ref(true) // 重新渲染表格状态
/** 查询参数列表 */ /** 查询参数列表 */
const getList = async () => { const getList = async () => {
loading.value = true loading.value = true
try { try {
const data = await MenuApi.getMenuListApi(queryParams) const data = await MenuApi.getMenuList(queryParams)
list.value = handleTree(data) list.value = handleTree(data)
} finally { } finally {
loading.value = false loading.value = false
...@@ -134,9 +149,9 @@ const resetQuery = () => { ...@@ -134,9 +149,9 @@ const resetQuery = () => {
} }
/** 添加/修改操作 */ /** 添加/修改操作 */
const modalRef = ref() const formRef = ref()
const openModal = async (type: string, id?: number) => { const openForm = (type: string, id?: number, parentId?: number) => {
modalRef.value.openModal(type, id) formRef.value.open(type, id, parentId)
} }
/** 展开/折叠操作 */ /** 展开/折叠操作 */
...@@ -154,7 +169,7 @@ const handleDelete = async (id: number) => { ...@@ -154,7 +169,7 @@ const handleDelete = async (id: number) => {
// 删除的二次确认 // 删除的二次确认
await message.delConfirm() await message.delConfirm()
// 发起删除 // 发起删除
await MenuApi.deleteMenuApi(id) await MenuApi.deleteMenu(id)
message.success(t('common.delSuccess')) message.success(t('common.delSuccess'))
// 刷新列表 // 刷新列表
await getList() await getList()
......
...@@ -164,7 +164,7 @@ import { SystemDataScopeEnum } from '@/utils/constants' ...@@ -164,7 +164,7 @@ import { SystemDataScopeEnum } from '@/utils/constants'
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict' import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
import { rules, allSchemas } from './role.data' import { rules, allSchemas } from './role.data'
import * as RoleApi from '@/api/system/role' import * as RoleApi from '@/api/system/role'
import { listSimpleMenusApi } from '@/api/system/menu' import { getSimpleMenusList } from '@/api/system/menu'
import { getSimpleDeptList } from '@/api/system/dept' import { getSimpleDeptList } from '@/api/system/dept'
import * as PermissionApi from '@/api/system/permission' import * as PermissionApi from '@/api/system/permission'
...@@ -269,7 +269,7 @@ const handleScope = async (type: string, row: RoleApi.RoleVO) => { ...@@ -269,7 +269,7 @@ const handleScope = async (type: string, row: RoleApi.RoleVO) => {
actionScopeType.value = type actionScopeType.value = type
dialogScopeVisible.value = true dialogScopeVisible.value = true
if (type === 'menu') { if (type === 'menu') {
const menuRes = await listSimpleMenusApi() const menuRes = await getSimpleMenusList()
treeOptions.value = handleTree(menuRes) treeOptions.value = handleTree(menuRes)
const role = await PermissionApi.listRoleMenusApi(row.id) const role = await PermissionApi.listRoleMenusApi(row.id)
if (role) { if (role) {
......
...@@ -71,7 +71,7 @@ import type { ElTree } from 'element-plus' ...@@ -71,7 +71,7 @@ import type { ElTree } from 'element-plus'
// 业务相关的 import // 业务相关的 import
import { rules, allSchemas } from './tenantPackage.data' import { rules, allSchemas } from './tenantPackage.data'
import * as TenantPackageApi from '@/api/system/tenantPackage' import * as TenantPackageApi from '@/api/system/tenantPackage'
import { listSimpleMenusApi } from '@/api/system/menu' import { getSimpleMenusList } from '@/api/system/menu'
const { t } = useI18n() // 国际化 const { t } = useI18n() // 国际化
const message = useMessage() // 消息弹窗 const message = useMessage() // 消息弹窗
...@@ -102,7 +102,7 @@ const validateCategory = (rule: any, value: any, callback: any) => { ...@@ -102,7 +102,7 @@ const validateCategory = (rule: any, value: any, callback: any) => {
rules.menuIds = [{ required: true, validator: validateCategory, trigger: 'blur' }] rules.menuIds = [{ required: true, validator: validateCategory, trigger: 'blur' }]
const getTree = async () => { const getTree = async () => {
const res = await listSimpleMenusApi() const res = await getSimpleMenusList()
menuOptions.value = handleTree(res) menuOptions.value = handleTree(res)
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment