| | |
| | | <!-- 菜单管理页面 --> |
| | | <template> |
| | | <div class="menu-page art-full-height"> |
| | | <ArtSearchBar |
| | |
| | | @refresh="handleRefresh" |
| | | > |
| | | <template #left> |
| | | <ElButton v-auth="'add'" @click="handleAddMenu" v-ripple>添加菜单</ElButton> |
| | | <ElButton v-auth="'add'" @click="handleAddMenu" v-ripple>{{ t('pages.system.menu.buttons.add') }}</ElButton> |
| | | <ElButton @click="toggleExpand" v-ripple> |
| | | {{ isExpanded ? '收起' : '展开' }} |
| | | {{ isExpanded ? t('pages.system.menu.actions.collapse') : t('pages.system.menu.actions.expand') }} |
| | | </ElButton> |
| | | </template> |
| | | </ArtTableHeader> |
| | |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { computed, nextTick, onMounted, reactive, ref } from 'vue' |
| | | import { useI18n } from 'vue-i18n' |
| | | import MenuDialog from './modules/menu-dialog.vue' |
| | | |
| | | import { formatMenuTitle } from '@/utils/router' |
| | |
| | | } from './menuPage.helpers' |
| | | |
| | | defineOptions({ name: 'Menus' }) |
| | | const { t } = useI18n() |
| | | |
| | | const loading = ref(false) |
| | | const isExpanded = ref(false) |
| | |
| | | |
| | | const formItems = computed(() => [ |
| | | { |
| | | label: '菜单名称', |
| | | label: t('pages.system.menu.search.name'), |
| | | key: 'name', |
| | | type: 'input', |
| | | props: { clearable: true } |
| | | }, |
| | | { |
| | | label: '路由地址', |
| | | label: t('pages.system.menu.search.route'), |
| | | key: 'route', |
| | | type: 'input', |
| | | props: { clearable: true } |
| | |
| | | loading.value = true |
| | | try { |
| | | const list = await guardRequestWithMessage(fetchGetMenuList({}), null, { |
| | | timeoutMessage: '菜单加载超时,已停止等待' |
| | | timeoutMessage: t('pages.system.menu.messages.loadTimeout') |
| | | }) |
| | | if (list === null) { |
| | | tableData.value = [] |
| | |
| | | tableData.value = Array.isArray(list) ? list : [] |
| | | menuTreeOptions.value = buildMenuTreeOptions(tableData.value, formatMenuTitle) |
| | | } catch (error) { |
| | | ElMessage.error(error?.message || '获取菜单失败') |
| | | ElMessage.error(error?.message || t('pages.system.menu.messages.loadFailed')) |
| | | } finally { |
| | | loading.value = false |
| | | } |
| | |
| | | async function handleSubmit(formData) { |
| | | const payload = buildMenuSubmitPayload(formData) |
| | | if (payload.id && payload.id === payload.parentId) { |
| | | ElMessage.error('上级菜单不能选择当前菜单') |
| | | ElMessage.error(t('pages.system.menu.messages.menuSelfParent')) |
| | | return |
| | | } |
| | | |
| | | try { |
| | | if (payload.id) { |
| | | await fetchUpdateMenu(payload) |
| | | ElMessage.success('修改成功') |
| | | ElMessage.success(t('crud.messages.updateSuccess')) |
| | | } else { |
| | | await fetchSaveMenu(payload) |
| | | ElMessage.success('新增成功') |
| | | ElMessage.success(t('crud.messages.createSuccess')) |
| | | } |
| | | closeDialog() |
| | | await loadMenuResources() |
| | | } catch (error) { |
| | | ElMessage.error(error?.message || '提交失败') |
| | | ElMessage.error(error?.message || t('pages.system.menu.messages.submitFailed')) |
| | | } |
| | | } |
| | | |
| | | async function handleDeleteMenu(row) { |
| | | try { |
| | | await ElMessageBox.confirm( |
| | | `确定要删除菜单「${getMenuDisplayTitle(row, formatMenuTitle)}」吗?删除后无法恢复`, |
| | | '删除确认', |
| | | t('pages.system.menu.messages.deleteMenuConfirm', { |
| | | title: getMenuDisplayTitle(row, formatMenuTitle) |
| | | }), |
| | | t('crud.confirm.deleteTitle'), |
| | | { |
| | | confirmButtonText: '确定', |
| | | cancelButtonText: '取消', |
| | | confirmButtonText: t('common.confirm'), |
| | | cancelButtonText: t('common.cancel'), |
| | | type: 'warning' |
| | | } |
| | | ) |
| | | await fetchDeleteMenu(row.id) |
| | | ElMessage.success('删除成功') |
| | | ElMessage.success(t('crud.messages.deleteSuccess')) |
| | | await loadMenuResources() |
| | | } catch (error) { |
| | | if (error !== 'cancel') { |
| | | ElMessage.error(error?.message || '删除失败') |
| | | ElMessage.error(error?.message || t('crud.messages.deleteFailed')) |
| | | } |
| | | } |
| | | } |
| | | |
| | | async function handleDeleteAuth(row) { |
| | | try { |
| | | await ElMessageBox.confirm(`确定要删除权限「${row.name || row.authority || row.id}」吗?删除后无法恢复`, '删除确认', { |
| | | confirmButtonText: '确定', |
| | | cancelButtonText: '取消', |
| | | type: 'warning' |
| | | }) |
| | | await ElMessageBox.confirm( |
| | | t('pages.system.menu.messages.deleteAuthConfirm', { |
| | | title: row.name || row.authority || row.id |
| | | }), |
| | | t('crud.confirm.deleteTitle'), |
| | | { |
| | | confirmButtonText: t('common.confirm'), |
| | | cancelButtonText: t('common.cancel'), |
| | | type: 'warning' |
| | | } |
| | | ) |
| | | await fetchDeleteMenu(row.id) |
| | | ElMessage.success('删除成功') |
| | | ElMessage.success(t('crud.messages.deleteSuccess')) |
| | | await loadMenuResources() |
| | | } catch (error) { |
| | | if (error !== 'cancel') { |
| | | ElMessage.error(error?.message || '删除失败') |
| | | ElMessage.error(error?.message || t('crud.messages.deleteFailed')) |
| | | } |
| | | } |
| | | } |