|
|
@@ -3,18 +3,18 @@
|
|
|
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
|
|
|
<div v-show="showSearch" class="mb-[10px]">
|
|
|
<el-card shadow="hover">
|
|
|
- <el-form ref="queryFormRef" :model="queryParams" :inline="true">
|
|
|
- <el-form-item label="菜单名称" prop="menuName">
|
|
|
- <el-input v-model="queryParams.menuName" placeholder="请输入菜单名称" clearable @keyup.enter="handleQuery" />
|
|
|
+ <el-form ref="queryFormRef" :model="queryParams" :inline="true" label-width="100px">
|
|
|
+ <el-form-item :label="$t('menu.search.menuName')" prop="menuName">
|
|
|
+ <el-input v-model="queryParams.menuName" :placeholder="$t('menu.search.menuNamePlaceholder')" clearable @keyup.enter="handleQuery" />
|
|
|
</el-form-item>
|
|
|
- <el-form-item label="状态" prop="status">
|
|
|
- <el-select v-model="queryParams.status" placeholder="菜单状态" clearable>
|
|
|
- <el-option v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.label" :value="dict.value" />
|
|
|
+ <el-form-item :label="$t('menu.search.status')" prop="status">
|
|
|
+ <el-select v-model="queryParams.status" :placeholder="$t('menu.search.statusPlaceholder')" clearable>
|
|
|
+ <el-option v-for="dict in sys_normal_disable" :key="dict.value" :label="parseI18nName(dict.label)" :value="dict.value" />
|
|
|
</el-select>
|
|
|
</el-form-item>
|
|
|
<el-form-item>
|
|
|
- <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
|
|
|
- <el-button icon="Refresh" @click="resetQuery">重置</el-button>
|
|
|
+ <el-button type="primary" icon="Search" @click="handleQuery">{{ $t('menu.search.search') }}</el-button>
|
|
|
+ <el-button icon="Refresh" @click="resetQuery">{{ $t('menu.search.reset') }}</el-button>
|
|
|
</el-form-item>
|
|
|
</el-form>
|
|
|
</el-card>
|
|
|
@@ -25,10 +25,10 @@
|
|
|
<template #header>
|
|
|
<el-row :gutter="10">
|
|
|
<el-col :span="1.5">
|
|
|
- <el-button v-hasPermi="['system:menu:add']" type="primary" plain icon="Plus" @click="handleAdd()">新增</el-button>
|
|
|
+ <el-button v-hasPermi="['system:menu:add']" type="primary" plain icon="Plus" @click="handleAdd()">{{ $t('menu.button.add') }}</el-button>
|
|
|
</el-col>
|
|
|
<el-col :span="1.5">
|
|
|
- <el-button v-hasPermi="['system:menu:remove']" type="danger" plain icon="Delete" @click="handleCascadeDelete" :loading="deleteLoading">级联删除</el-button>
|
|
|
+ <el-button v-hasPermi="['system:menu:remove']" type="danger" plain icon="Delete" @click="handleCascadeDelete" :loading="deleteLoading">{{ $t('menu.button.cascadeDelete') }}</el-button>
|
|
|
</el-col>
|
|
|
<right-toolbar v-model:show-search="showSearch" @query-table="getList"></right-toolbar>
|
|
|
</el-row>
|
|
|
@@ -46,34 +46,38 @@
|
|
|
:load="getChildrenList"
|
|
|
:expand-change="expandMenuHandle"
|
|
|
>
|
|
|
- <el-table-column prop="menuName" label="菜单名称" :show-overflow-tooltip="true" width="160"></el-table-column>
|
|
|
- <el-table-column prop="icon" label="图标" align="center" width="100">
|
|
|
+ <el-table-column prop="menuName" :label="$t('menu.table.menuName')" :show-overflow-tooltip="true" width="160">
|
|
|
+ <template #default="scope">
|
|
|
+ <span>{{ parseI18nName(scope.row.menuName) }}</span>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column prop="icon" :label="$t('menu.table.icon')" align="center" width="100">
|
|
|
<template #default="scope">
|
|
|
<svg-icon :icon-class="scope.row.icon" />
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
- <el-table-column prop="orderNum" label="排序" width="60"></el-table-column>
|
|
|
- <el-table-column prop="perms" label="权限标识" :show-overflow-tooltip="true"></el-table-column>
|
|
|
- <el-table-column prop="component" label="组件路径" :show-overflow-tooltip="true"></el-table-column>
|
|
|
- <el-table-column prop="status" label="状态" width="80">
|
|
|
+ <el-table-column prop="orderNum" :label="$t('menu.table.sort')" width="60"></el-table-column>
|
|
|
+ <el-table-column prop="perms" :label="$t('menu.table.perms')" :show-overflow-tooltip="true"></el-table-column>
|
|
|
+ <el-table-column prop="component" :label="$t('menu.table.component')" :show-overflow-tooltip="true"></el-table-column>
|
|
|
+ <el-table-column prop="status" :label="$t('menu.table.status')" width="80">
|
|
|
<template #default="scope">
|
|
|
<dict-tag :options="sys_normal_disable" :value="scope.row.status" />
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
- <el-table-column label="创建时间" align="center" prop="createTime">
|
|
|
+ <el-table-column :label="$t('menu.table.createTime')" align="center" prop="createTime">
|
|
|
<template #default="scope">
|
|
|
<span>{{ scope.row.createTime }}</span>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
- <el-table-column fixed="right" label="操作" width="180">
|
|
|
+ <el-table-column fixed="right" :label="$t('menu.table.operation')" width="180">
|
|
|
<template #default="scope">
|
|
|
- <el-tooltip content="修改" placement="top">
|
|
|
+ <el-tooltip :content="$t('menu.button.edit')" placement="top">
|
|
|
<el-button v-hasPermi="['system:menu:edit']" link type="primary" icon="Edit" @click="handleUpdate(scope.row)" />
|
|
|
</el-tooltip>
|
|
|
- <el-tooltip content="新增" placement="top">
|
|
|
+ <el-tooltip :content="$t('menu.button.add')" placement="top">
|
|
|
<el-button v-hasPermi="['system:menu:add']" link type="primary" icon="Plus" @click="handleAdd(scope.row)" />
|
|
|
</el-tooltip>
|
|
|
- <el-tooltip content="删除" placement="top">
|
|
|
+ <el-tooltip :content="$t('menu.button.delete')" placement="top">
|
|
|
<el-button v-hasPermi="['system:menu:remove']" link type="primary" icon="Delete" @click="handleDelete(scope.row)" />
|
|
|
</el-tooltip>
|
|
|
</template>
|
|
|
@@ -81,43 +85,48 @@
|
|
|
</el-table>
|
|
|
</el-card>
|
|
|
|
|
|
- <el-dialog v-model="dialog.visible" :title="dialog.title" destroy-on-close append-to-bod width="750px">
|
|
|
- <el-form ref="menuFormRef" :model="form" :rules="rules" label-width="100px">
|
|
|
+ <el-dialog v-model="dialog.visible" :title="dialog.title" destroy-on-close append-to-bod width="900px">
|
|
|
+ <el-form ref="menuFormRef" :model="form" :rules="rules" label-width="150px">
|
|
|
<el-row>
|
|
|
<el-col :span="24">
|
|
|
- <el-form-item label="上级菜单">
|
|
|
+ <el-form-item :label="$t('menu.form.parentMenu')">
|
|
|
<el-tree-select
|
|
|
v-model="form.parentId"
|
|
|
:data="menuOptions"
|
|
|
:props="{ value: 'menuId', label: 'menuName', children: 'children' } as any"
|
|
|
value-key="menuId"
|
|
|
- placeholder="选择上级菜单"
|
|
|
+ :placeholder="$t('menu.form.parentMenuPlaceholder')"
|
|
|
check-strictly
|
|
|
/>
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
<el-col :span="24">
|
|
|
- <el-form-item label="菜单类型" prop="menuType">
|
|
|
+ <el-form-item :label="$t('menu.form.menuType')" prop="menuType">
|
|
|
<el-radio-group v-model="form.menuType">
|
|
|
- <el-radio value="M">目录</el-radio>
|
|
|
- <el-radio value="C">菜单</el-radio>
|
|
|
- <el-radio value="F">按钮</el-radio>
|
|
|
+ <el-radio value="M">{{ $t('menu.form.directory') }}</el-radio>
|
|
|
+ <el-radio value="C">{{ $t('menu.form.menu') }}</el-radio>
|
|
|
+ <el-radio value="F">{{ $t('menu.form.button') }}</el-radio>
|
|
|
</el-radio-group>
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
<el-col v-if="form.menuType !== 'F'" :span="24">
|
|
|
- <el-form-item label="菜单图标" prop="icon">
|
|
|
+ <el-form-item :label="$t('menu.form.menuIcon')" prop="icon">
|
|
|
<!-- 图标选择器 -->
|
|
|
<icon-select v-model="form.icon" />
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
<el-col :span="12">
|
|
|
- <el-form-item label="菜单名称" prop="menuName">
|
|
|
- <el-input v-model="form.menuName" placeholder="请输入菜单名称" />
|
|
|
+ <el-form-item :label="$t('menu.form.zhName')" prop="menuNameZh">
|
|
|
+ <el-input v-model="form.menuNameZh" :placeholder="$t('menu.form.zhNamePlaceholder')" />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item :label="$t('menu.form.enName')" prop="menuNameEn">
|
|
|
+ <el-input v-model="form.menuNameEn" :placeholder="$t('menu.form.enNamePlaceholder')" />
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
<el-col :span="12">
|
|
|
- <el-form-item label="显示排序" prop="orderNum">
|
|
|
+ <el-form-item :label="$t('menu.form.sort')" prop="orderNum">
|
|
|
<el-input-number v-model="form.orderNum" controls-position="right" :min="0" />
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
@@ -125,16 +134,16 @@
|
|
|
<el-form-item>
|
|
|
<template #label>
|
|
|
<span>
|
|
|
- <el-tooltip content="选择是外链则路由地址需要以`http(s)://`开头" placement="top">
|
|
|
+ <el-tooltip :content="$t('menu.form.isFrameTip')" placement="top">
|
|
|
<el-icon>
|
|
|
<question-filled />
|
|
|
</el-icon> </el-tooltip
|
|
|
- >是否外链
|
|
|
+ >{{ $t('menu.form.isFrame') }}
|
|
|
</span>
|
|
|
</template>
|
|
|
<el-radio-group v-model="form.isFrame">
|
|
|
- <el-radio value="0">是</el-radio>
|
|
|
- <el-radio value="1">否</el-radio>
|
|
|
+ <el-radio value="0">{{ $t('menu.form.yes') }}</el-radio>
|
|
|
+ <el-radio value="1">{{ $t('menu.form.no') }}</el-radio>
|
|
|
</el-radio-group>
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
@@ -142,58 +151,58 @@
|
|
|
<el-form-item prop="path">
|
|
|
<template #label>
|
|
|
<span>
|
|
|
- <el-tooltip content="访问的路由地址,如:`user`,如外网地址需内链访问则以`http(s)://`开头" placement="top">
|
|
|
+ <el-tooltip :content="$t('menu.form.pathTip')" placement="top">
|
|
|
<el-icon>
|
|
|
<question-filled />
|
|
|
</el-icon>
|
|
|
</el-tooltip>
|
|
|
- 路由地址
|
|
|
+ {{ $t('menu.form.path') }}
|
|
|
</span>
|
|
|
</template>
|
|
|
- <el-input v-model="form.path" placeholder="请输入路由地址" />
|
|
|
+ <el-input v-model="form.path" :placeholder="$t('menu.form.pathPlaceholder')" />
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
<el-col v-if="form.menuType === 'C'" :span="12">
|
|
|
<el-form-item prop="component">
|
|
|
<template #label>
|
|
|
<span>
|
|
|
- <el-tooltip content="访问的组件路径,如:`system/user/index`,默认在`views`目录下" placement="top">
|
|
|
+ <el-tooltip :content="$t('menu.form.componentTip')" placement="top">
|
|
|
<el-icon>
|
|
|
<question-filled />
|
|
|
</el-icon>
|
|
|
</el-tooltip>
|
|
|
- 组件路径
|
|
|
+ {{ $t('menu.form.component') }}
|
|
|
</span>
|
|
|
</template>
|
|
|
- <el-input v-model="form.component" placeholder="请输入组件路径" />
|
|
|
+ <el-input v-model="form.component" :placeholder="$t('menu.form.componentPlaceholder')" />
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
<el-col v-if="form.menuType !== 'M'" :span="12">
|
|
|
<el-form-item>
|
|
|
- <el-input v-model="form.perms" placeholder="请输入权限标识" maxlength="100" />
|
|
|
+ <el-input v-model="form.perms" :placeholder="$t('menu.form.permsPlaceholder')" maxlength="100" />
|
|
|
<template #label>
|
|
|
<span>
|
|
|
- <el-tooltip content="控制器中定义的权限字符,如:@SaCheckPermission('system:user:list')" placement="top">
|
|
|
+ <el-tooltip :content="$t('menu.form.permsTip')" placement="top">
|
|
|
<el-icon>
|
|
|
<question-filled />
|
|
|
</el-icon>
|
|
|
</el-tooltip>
|
|
|
- 权限字符
|
|
|
+ {{ $t('menu.form.perms') }}
|
|
|
</span>
|
|
|
</template>
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
<el-col v-if="form.menuType === 'C'" :span="12">
|
|
|
<el-form-item>
|
|
|
- <el-input v-model="form.queryParam" placeholder="请输入路由参数" maxlength="255" />
|
|
|
+ <el-input v-model="form.queryParam" :placeholder="$t('menu.form.queryParamPlaceholder')" maxlength="255" />
|
|
|
<template #label>
|
|
|
<span>
|
|
|
- <el-tooltip content='访问路由的默认传递参数,如:`{"id": 1, "name": "ry"}`' placement="top">
|
|
|
+ <el-tooltip :content="$t('menu.form.queryParamTip')" placement="top">
|
|
|
<el-icon>
|
|
|
<question-filled />
|
|
|
</el-icon>
|
|
|
</el-tooltip>
|
|
|
- 路由参数
|
|
|
+ {{ $t('menu.form.queryParam') }}
|
|
|
</span>
|
|
|
</template>
|
|
|
</el-form-item>
|
|
|
@@ -202,17 +211,17 @@
|
|
|
<el-form-item>
|
|
|
<template #label>
|
|
|
<span>
|
|
|
- <el-tooltip content="选择是则会被`keep-alive`缓存,需要匹配组件的`name`和地址保持一致" placement="top">
|
|
|
+ <el-tooltip :content="$t('menu.form.isCacheTip')" placement="top">
|
|
|
<el-icon>
|
|
|
<question-filled />
|
|
|
</el-icon>
|
|
|
</el-tooltip>
|
|
|
- 是否缓存
|
|
|
+ {{ $t('menu.form.isCache') }}
|
|
|
</span>
|
|
|
</template>
|
|
|
<el-radio-group v-model="form.isCache">
|
|
|
- <el-radio value="0">缓存</el-radio>
|
|
|
- <el-radio value="1">不缓存</el-radio>
|
|
|
+ <el-radio value="0">{{ $t('menu.form.cache') }}</el-radio>
|
|
|
+ <el-radio value="1">{{ $t('menu.form.noCache') }}</el-radio>
|
|
|
</el-radio-group>
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
@@ -220,16 +229,16 @@
|
|
|
<el-form-item>
|
|
|
<template #label>
|
|
|
<span>
|
|
|
- <el-tooltip content="选择隐藏则路由将不会出现在侧边栏,但仍然可以访问" placement="top">
|
|
|
+ <el-tooltip :content="$t('menu.form.visibleTip')" placement="top">
|
|
|
<el-icon>
|
|
|
<question-filled />
|
|
|
</el-icon>
|
|
|
</el-tooltip>
|
|
|
- 显示状态
|
|
|
+ {{ $t('menu.form.visible') }}
|
|
|
</span>
|
|
|
</template>
|
|
|
<el-radio-group v-model="form.visible">
|
|
|
- <el-radio v-for="dict in sys_show_hide" :key="dict.value" :value="dict.value">{{ dict.label }} </el-radio>
|
|
|
+ <el-radio v-for="dict in sys_show_hide" :key="dict.value" :value="dict.value">{{ parseI18nName(dict.label) }} </el-radio>
|
|
|
</el-radio-group>
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
@@ -237,17 +246,17 @@
|
|
|
<el-form-item>
|
|
|
<template #label>
|
|
|
<span>
|
|
|
- <el-tooltip content="选择停用则路由将不会出现在侧边栏,也不能被访问" placement="top">
|
|
|
+ <el-tooltip :content="$t('menu.form.statusTip')" placement="top">
|
|
|
<el-icon>
|
|
|
<question-filled />
|
|
|
</el-icon>
|
|
|
</el-tooltip>
|
|
|
- 菜单状态
|
|
|
+ {{ $t('menu.form.status') }}
|
|
|
</span>
|
|
|
</template>
|
|
|
<el-radio-group v-model="form.status">
|
|
|
<el-radio v-for="dict in sys_normal_disable" :key="dict.value" :value="dict.value">
|
|
|
- {{ dict.label }}
|
|
|
+ {{ parseI18nName(dict.label) }}
|
|
|
</el-radio>
|
|
|
</el-radio-group>
|
|
|
</el-form-item>
|
|
|
@@ -256,13 +265,13 @@
|
|
|
</el-form>
|
|
|
<template #footer>
|
|
|
<div class="dialog-footer">
|
|
|
- <el-button type="primary" @click="submitForm">确 定</el-button>
|
|
|
- <el-button @click="cancel">取 消</el-button>
|
|
|
+ <el-button type="primary" @click="submitForm">{{ $t('menu.button.submit') }}</el-button>
|
|
|
+ <el-button @click="cancel">{{ $t('menu.button.cancel') }}</el-button>
|
|
|
</div>
|
|
|
</template>
|
|
|
</el-dialog>
|
|
|
|
|
|
- <el-dialog v-model="deleteDialog.visible" :title="deleteDialog.title" destroy-on-close append-to-bod width="750px">
|
|
|
+ <el-dialog v-model="deleteDialog.visible" :title="deleteDialog.title" destroy-on-close append-to-bod width="900px">
|
|
|
<el-tree
|
|
|
ref="menuTreeRef"
|
|
|
class="tree-border"
|
|
|
@@ -270,14 +279,14 @@
|
|
|
show-checkbox
|
|
|
node-key="menuId"
|
|
|
:check-strictly="false"
|
|
|
- empty-text="加载中,请稍候"
|
|
|
+ :empty-text="$t('menu.message.loading')"
|
|
|
:default-expanded-keys="[0]"
|
|
|
:props="{ value: 'menuId', label: 'menuName', children: 'children' } as any"
|
|
|
/>
|
|
|
<template #footer>
|
|
|
<div class="dialog-footer">
|
|
|
- <el-button type="primary" @click="submitDeleteForm" :loading="deleteLoading">确 定</el-button>
|
|
|
- <el-button @click="cancelCascade">取 消</el-button>
|
|
|
+ <el-button type="primary" @click="submitDeleteForm" :loading="deleteLoading">{{ $t('menu.button.submit') }}</el-button>
|
|
|
+ <el-button @click="cancelCascade">{{ $t('menu.button.cancel') }}</el-button>
|
|
|
</div>
|
|
|
</template>
|
|
|
</el-dialog>
|
|
|
@@ -288,6 +297,7 @@
|
|
|
import { addMenu, cascadeDelMenu, delMenu, getMenu, listMenu, updateMenu } from '@/api/system/menu';
|
|
|
import { MenuForm, MenuQuery, MenuVO } from '@/api/system/menu/types';
|
|
|
import { MenuTypeEnum } from '@/enums/MenuTypeEnum';
|
|
|
+import { parseI18nName } from '@/utils/i18n';
|
|
|
|
|
|
interface MenuOptionsType {
|
|
|
menuId: number;
|
|
|
@@ -317,6 +327,8 @@ const initFormData = {
|
|
|
menuId: undefined,
|
|
|
parentId: 0,
|
|
|
menuName: '',
|
|
|
+ menuNameZh: '',
|
|
|
+ menuNameEn: '',
|
|
|
icon: '',
|
|
|
menuType: MenuTypeEnum.M,
|
|
|
orderNum: 1,
|
|
|
@@ -332,9 +344,10 @@ const data = reactive<PageData<MenuForm, MenuQuery>>({
|
|
|
status: undefined
|
|
|
},
|
|
|
rules: {
|
|
|
- menuName: [{ required: true, message: '菜单名称不能为空', trigger: 'blur' }],
|
|
|
- orderNum: [{ required: true, message: '菜单顺序不能为空', trigger: 'blur' }],
|
|
|
- path: [{ required: true, message: '路由地址不能为空', trigger: 'blur' }]
|
|
|
+ menuNameZh: [{ required: true, message: proxy?.$t('menu.rule.zhNameRequired'), trigger: 'blur' }],
|
|
|
+ menuNameEn: [{ required: true, message: proxy?.$t('menu.rule.enNameRequired'), trigger: 'blur' }],
|
|
|
+ orderNum: [{ required: true, message: proxy?.$t('menu.rule.sortRequired'), trigger: 'blur' }],
|
|
|
+ path: [{ required: true, message: proxy?.$t('menu.rule.pathRequired'), trigger: 'blur' }]
|
|
|
}
|
|
|
});
|
|
|
|
|
|
@@ -414,8 +427,13 @@ const getList = async () => {
|
|
|
const getTreeselect = async () => {
|
|
|
menuOptions.value = [];
|
|
|
const response = await listMenu();
|
|
|
- const menu: MenuOptionsType = { menuId: 0, menuName: '主类目', children: [] };
|
|
|
- menu.children = proxy?.handleTree<MenuOptionsType>(response.data, 'menuId');
|
|
|
+ // 解析每个菜单的国际化名称
|
|
|
+ const parsedData = response.data.map((item) => ({
|
|
|
+ ...item,
|
|
|
+ menuName: parseI18nName(item.menuName)
|
|
|
+ }));
|
|
|
+ const menu: MenuOptionsType = { menuId: 0, menuName: proxy?.$t('menu.form.mainMenu'), children: [] };
|
|
|
+ menu.children = proxy?.handleTree<MenuOptionsType>(parsedData, 'menuId');
|
|
|
menuOptions.value.push(menu);
|
|
|
};
|
|
|
/** 取消按钮 */
|
|
|
@@ -444,7 +462,7 @@ const handleAdd = (row?: MenuVO) => {
|
|
|
getTreeselect();
|
|
|
row && row.menuId ? (form.value.parentId = row.menuId) : (form.value.parentId = 0);
|
|
|
dialog.visible = true;
|
|
|
- dialog.title = '添加菜单';
|
|
|
+ dialog.title = proxy?.$t('menu.dialog.add');
|
|
|
};
|
|
|
/** 修改按钮操作 */
|
|
|
const handleUpdate = async (row: MenuVO) => {
|
|
|
@@ -453,16 +471,24 @@ const handleUpdate = async (row: MenuVO) => {
|
|
|
if (row.menuId) {
|
|
|
const { data } = await getMenu(row.menuId);
|
|
|
form.value = data;
|
|
|
+ // 解析国际化名称
|
|
|
+ parseMenuNameForEdit(data.menuName);
|
|
|
}
|
|
|
dialog.visible = true;
|
|
|
- dialog.title = '修改菜单';
|
|
|
+ dialog.title = proxy?.$t('menu.dialog.edit');
|
|
|
};
|
|
|
/** 提交按钮 */
|
|
|
const submitForm = () => {
|
|
|
menuFormRef.value?.validate(async (valid: boolean) => {
|
|
|
if (valid) {
|
|
|
- form.value.menuId ? await updateMenu(form.value) : await addMenu(form.value);
|
|
|
- proxy?.$modal.msgSuccess('操作成功');
|
|
|
+ // 合成国际化名称JSON字符串
|
|
|
+ const menuNameJson = JSON.stringify({
|
|
|
+ zh_CN: form.value.menuNameZh,
|
|
|
+ en_US: form.value.menuNameEn
|
|
|
+ });
|
|
|
+ const submitData = { ...form.value, menuName: menuNameJson };
|
|
|
+ form.value.menuId ? await updateMenu(submitData) : await addMenu(submitData);
|
|
|
+ proxy?.$modal.msgSuccess(proxy?.$t('menu.message.operationSuccess'));
|
|
|
dialog.visible = false;
|
|
|
await getList();
|
|
|
}
|
|
|
@@ -470,10 +496,10 @@ const submitForm = () => {
|
|
|
};
|
|
|
/** 删除按钮操作 */
|
|
|
const handleDelete = async (row: MenuVO) => {
|
|
|
- await proxy?.$modal.confirm('是否确认删除名称为"' + row.menuName + '"的数据项?');
|
|
|
+ await proxy?.$modal.confirm(proxy?.$t('menu.message.deleteConfirm', { name: parseI18nName(row.menuName) }));
|
|
|
await delMenu(row.menuId);
|
|
|
await getList();
|
|
|
- proxy?.$modal.msgSuccess('删除成功');
|
|
|
+ proxy?.$modal.msgSuccess(proxy?.$t('menu.message.deleteSuccess'));
|
|
|
};
|
|
|
|
|
|
const deleteLoading = ref<boolean>(false);
|
|
|
@@ -481,7 +507,7 @@ const menuTreeRef = ref<ElTreeInstance>();
|
|
|
|
|
|
const deleteDialog = reactive<DialogOption>({
|
|
|
visible: false,
|
|
|
- title: '级联删除菜单'
|
|
|
+ title: proxy?.$t('menu.dialog.cascadeDelete')
|
|
|
});
|
|
|
|
|
|
/** 级联删除按钮操作 */
|
|
|
@@ -512,6 +538,19 @@ const submitDeleteForm = async () => {
|
|
|
deleteDialog.visible = false;
|
|
|
};
|
|
|
|
|
|
+/** 解析国际化菜单名称用于编辑 */
|
|
|
+const parseMenuNameForEdit = (menuName: string) => {
|
|
|
+ try {
|
|
|
+ const nameObj = JSON.parse(menuName);
|
|
|
+ form.value.menuNameZh = nameObj.zh_CN || '';
|
|
|
+ form.value.menuNameEn = nameObj.en_US || '';
|
|
|
+ } catch (e) {
|
|
|
+ // 如果解析失败,将原值设为中文名称
|
|
|
+ form.value.menuNameZh = menuName;
|
|
|
+ form.value.menuNameEn = '';
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
onMounted(() => {
|
|
|
getList();
|
|
|
});
|