style:系统管理模块适配多语言

main
黄伟杰 6 days ago
parent 0caaccfd71
commit 6fc9ff2997

@ -52,6 +52,7 @@ export default {
status: 'Status',
createTime: 'Create Time',
updateTime: 'Update Time',
operate: 'Operation',
copy: 'Copy',
copySuccess: 'Copy Success',
copyError: 'Copy Error'
@ -455,6 +456,235 @@ export default {
btn_zoom_out: 'Zoom out',
preview: 'Preivew'
},
SystemManagement: {
Dept: {
name: 'Department Name',
statusLabel: 'Department Status',
status: 'Status',
leader: 'Leader',
sort: 'Sort',
phone: 'Phone',
email: 'Email',
parent: 'Parent Department',
createTime: 'Create Time',
actions: 'Actions',
searchNamePlaceholder: 'Please input department name',
searchStatusPlaceholder: 'Please select department status',
parentPlaceholder: 'Please select parent department',
leaderPlaceholder: 'Please select leader',
phonePlaceholder: 'Please input phone number',
emailPlaceholder: 'Please input email',
statusPlaceholder: 'Please select status',
parentRequired: 'Parent department is required',
nameRequired: 'Department name is required',
sortRequired: 'Sort is required',
emailInvalid: 'Please input a valid email address',
phoneInvalid: 'Please input a valid mobile number',
statusRequired: 'Status is required',
toggleExpand: 'Expand / Collapse'
},
User: {
workNo: 'Work No',
username: 'User Name',
nickname: 'Nickname',
dept: 'Department',
mobile: 'Mobile',
email: 'Email',
sex: 'User Gender',
post: 'Post',
remark: 'Remark',
status: 'Status',
createTime: 'Create Time',
actions: 'Actions',
password: 'User Password',
role: 'Role',
import: 'User Import',
importDragText: 'Drag file here, or',
importClickText: 'click to upload',
importUpdateSupport: 'Update existing user data if present',
importFormatLimit: 'Only xls, xlsx format files are allowed.',
importDownloadTemplate: 'Download template',
searchWorkNoPlaceholder: 'Please input work No',
searchUsernamePlaceholder: 'Please input user name',
searchMobilePlaceholder: 'Please input mobile',
searchStatusPlaceholder: 'Please select status',
searchCreateTimeStartPlaceholder: 'Start date',
searchCreateTimeEndPlaceholder: 'End date',
deptPlaceholder: 'Please select department',
sexPlaceholder: 'Please select',
postPlaceholder: 'Please select',
remarkPlaceholder: 'Please input content',
usernamePlaceholder: 'Please input user name',
passwordPlaceholder: 'Please input user password',
workNoPlaceholder: 'Please input work No',
mobilePlaceholder: 'Please input mobile',
emailPlaceholder: 'Please input email',
usernameRequired: 'User name is required',
workNoRequired: 'Work No is required',
passwordRequired: 'User password is required',
deptRequired: 'Department is required',
emailInvalid: 'Please input a valid email address',
mobileInvalid: 'Please input a valid mobile number',
importFileRequired: 'Please upload file',
importSuccessTip: 'Upload success: {createCount}; Update success: {updateCount}; Update failed: {failureCount};',
importFailed: 'Upload failed, please upload again!',
importFileLimit: 'Only one file can be uploaded!',
resetPasswordTitle: 'Please input new password for "{username}"',
resetPasswordSuccess: 'Modified successfully, new password is: {password}',
resetPassword: 'Reset Password',
assignRole: 'Assign Role',
changeStatusConfirm: 'Are you sure to {action} user "{username}"?'
},
Post: {
code: 'Post Code',
name: 'Post Name',
sort: 'Post Order',
remark: 'Post Remark',
status: 'Status',
createTime: 'Create Time',
actions: 'Actions',
searchNamePlaceholder: 'Please input post name',
searchCodePlaceholder: 'Please input post code',
searchStatusPlaceholder: 'Please select status',
codePlaceholder: 'Please input post code',
namePlaceholder: 'Please input post name',
sortPlaceholder: 'Please input post order',
statusPlaceholder: 'Please select status',
remarkPlaceholder: 'Please input remark',
codeRequired: 'Post code is required',
nameRequired: 'Post name is required',
sortRequired: 'Post order is required',
statusRequired: 'Post status is required'
},
Role: {
code: 'Role Code',
name: 'Role Name',
type: 'Role Type',
sort: 'Display Order',
remark: 'Remark',
status: 'Status',
menuPermission: 'Menu Permission',
dataPermission: 'Data Permission',
dataScope: 'Permission Scope',
selectAll: 'Select/Deselect All',
expandCollapse: 'Expand/Collapse All',
parentChildLink: 'Parent-child linkage (select parent to select children)',
yes: 'Yes',
no: 'No',
loadingText: 'Loading, please wait',
searchCodePlaceholder: 'Please input role code',
searchNamePlaceholder: 'Please input role name',
searchStatusPlaceholder: 'Please select status',
codePlaceholder: 'Please input role code',
namePlaceholder: 'Please input role name',
sortPlaceholder: 'Please input display order',
statusPlaceholder: 'Please select status',
remarkPlaceholder: 'Please input remark',
codeRequired: 'Role code is required',
nameRequired: 'Role name is required',
sortRequired: 'Display order is required',
statusRequired: 'Status is required'
},
Menu: {
name: 'Menu Name',
parent: 'Parent Menu',
type: 'Menu Type',
icon: 'Menu Icon',
path: 'Route Path',
component: 'Component Path',
componentName: 'Component Name',
permission: 'Permission',
sort: 'Display Order',
status: 'Menu Status',
visible: 'Visible',
alwaysShow: 'Always Show',
keepAlive: 'Keep Alive',
actions: 'Actions',
searchNamePlaceholder: 'Please input menu name',
searchStatusPlaceholder: 'Please select menu status',
namePlaceholder: 'Please input menu name',
pathPlaceholder: 'Please input route path',
componentPlaceholder: 'For example: system/user/index',
componentNamePlaceholder: 'For example: SystemUser',
permissionPlaceholder: 'Please input permission',
sortPlaceholder: 'Please input display order',
toggleExpand: 'Expand / Collapse',
refreshCache: 'Refresh Menu Cache',
updateCacheConfirm: 'The cache will be updated and the browser will be refreshed!',
updateCacheTitle: 'Refresh Menu Cache',
visibleShow: 'Show',
visibleHide: 'Hide',
always: 'Always',
notAlways: 'Not Always',
keep: 'Cache',
notKeep: 'No Cache',
parentRoot: 'Root Menu',
nameRequired: 'Menu name is required',
sortRequired: 'Menu order is required',
pathRequired: 'Route path is required',
statusRequired: 'Status is required',
pathMustStartWithSlash: 'Path must start with /',
pathMustNotStartWithSlash: 'Path must not start with /',
pathTooltipTitle: 'Route Path',
pathTooltipMessage:
'Route path to access, such as `user`. For external link, start with `http(s)://`.',
permissionTooltipTitle: 'Permission',
permissionTooltipMessage:
"Permission string on Controller method, e.g. @PreAuthorize(`@ss.hasPermission('system:user:list')`)",
visibleTooltipTitle: 'Visible',
visibleTooltipMessage:
'When hidden is selected, the route will not appear in the sidebar but can still be accessed',
alwaysShowTooltipTitle: 'Always Show',
alwaysShowTooltipMessage:
'When not selected, if the menu has only one child, the parent will be hidden and the child will be displayed directly',
keepAliveTooltipTitle: 'Keep Alive',
keepAliveTooltipMessage:
'When cached is selected, it will be cached by `keep-alive`, and the "Component Name" field must be filled in'
},
Dict: {
id: 'Dict ID',
name: 'Dict Name',
type: 'Dict Type',
label: 'Dict Label',
value: 'Dict Value',
sort: 'Dict Sort',
status: 'Status',
remark: 'Remark',
colorType: 'Color Type',
cssClass: 'CSS Class',
createTime: 'Create Time',
actions: 'Actions',
data: 'Data',
searchNamePlaceholder: 'Please input dict name',
searchTypePlaceholder: 'Please input dict type',
searchStatusPlaceholder: 'Please select dict status',
searchLabelPlaceholder: 'Please input dict label',
searchDataStatusPlaceholder: 'Please select data status',
namePlaceholder: 'Please input dict name',
typePlaceholder: 'Please input dict type',
labelPlaceholder: 'Please input data label',
valuePlaceholder: 'Please input data value',
sortPlaceholder: 'Please input data order',
remarkPlaceholder: 'Please input content',
statusPlaceholder: 'Please select status',
colorTypePlaceholder: 'Please select color type',
cssClassPlaceholder: 'Please input CSS Class',
nameRequired: 'Dict name is required',
typeRequired: 'Dict type is required',
statusRequired: 'Status is required',
labelRequired: 'Data label is required',
valueRequired: 'Data value is required',
sortRequired: 'Data order is required',
colorTypeDefault: 'Default',
colorTypePrimary: 'Primary',
colorTypeSuccess: 'Success',
colorTypeInfo: 'Info',
colorTypeWarning: 'Warning',
colorTypeDanger: 'Danger',
typeExportFilename: 'DictType.xls',
dataExportFilename: 'DictData.xls'
}
},
basedata: {
product: {
category: {

@ -52,6 +52,7 @@ export default {
status: '状态',
createTime: '创建时间',
updateTime: '更新时间',
operate: '操作',
copy: '复制',
copySuccess: '复制成功',
copyError: '复制失败'
@ -458,6 +459,231 @@ export default {
}
}
},
SystemManagement: {
Dept: {
name: '部门名称',
statusLabel: '部门状态',
status: '状态',
leader: '负责人',
sort: '显示排序',
phone: '联系电话',
email: '邮箱',
parent: '上级部门',
createTime: '创建时间',
actions: '操作',
searchNamePlaceholder: '请输入部门名称',
searchStatusPlaceholder: '请选择部门状态',
parentPlaceholder: '请选择上级部门',
leaderPlaceholder: '请选择负责人',
phonePlaceholder: '请输入联系电话',
emailPlaceholder: '请输入邮箱',
statusPlaceholder: '请选择状态',
parentRequired: '上级部门不能为空',
nameRequired: '部门名称不能为空',
sortRequired: '显示排序不能为空',
emailInvalid: '请输入正确的邮箱地址',
phoneInvalid: '请输入正确的手机号码',
statusRequired: '状态不能为空',
toggleExpand: '展开/折叠'
},
User: {
workNo: '工号',
username: '用户名称',
nickname: '用户昵称',
dept: '归属部门',
mobile: '手机号码',
email: '邮箱',
sex: '用户性别',
post: '岗位',
remark: '备注',
status: '状态',
createTime: '创建时间',
actions: '操作',
password: '用户密码',
role: '角色',
import: '用户导入',
importDragText: '将文件拖到此处,或',
importClickText: '点击上传',
importUpdateSupport: '是否更新已经存在的用户数据',
importFormatLimit: '仅允许导入 xls、xlsx 格式文件。',
importDownloadTemplate: '下载模板',
searchWorkNoPlaceholder: '请输入工号',
searchUsernamePlaceholder: '请输入用户名称',
searchMobilePlaceholder: '请输入手机号码',
searchStatusPlaceholder: '请选择状态',
searchCreateTimeStartPlaceholder: '开始日期',
searchCreateTimeEndPlaceholder: '结束日期',
deptPlaceholder: '请选择归属部门',
sexPlaceholder: '请选择',
postPlaceholder: '请选择',
remarkPlaceholder: '请输入内容',
usernamePlaceholder: '请输入用户名称',
passwordPlaceholder: '请输入用户密码',
workNoPlaceholder: '请输入工号',
mobilePlaceholder: '请输入手机号码',
emailPlaceholder: '请输入邮箱',
usernameRequired: '用户名称不能为空',
workNoRequired: '工号不能为空',
passwordRequired: '用户密码不能为空',
deptRequired: '部门不能为空',
emailInvalid: '请输入正确的邮箱地址',
mobileInvalid: '请输入正确的手机号码',
importFileRequired: '请上传文件',
importSuccessTip: '上传成功数量:{createCount};更新成功数量:{updateCount};更新失败数量:{failureCount}',
importFailed: '上传失败,请您重新上传!',
importFileLimit: '最多只能上传一个文件!',
resetPasswordTitle: '请输入"{username}"的新密码',
resetPasswordSuccess: '修改成功,新密码是:{password}',
resetPassword: '重置密码',
assignRole: '分配角色',
changeStatusConfirm: '确认要"{action}""{username}"用户吗?'
},
Post: {
code: '岗位编码',
name: '岗位名称',
sort: '岗位顺序',
remark: '岗位备注',
status: '状态',
createTime: '创建时间',
actions: '操作',
searchNamePlaceholder: '请输入岗位名称',
searchCodePlaceholder: '请输入岗位编码',
searchStatusPlaceholder: '请选择状态',
codePlaceholder: '请输入岗位编码',
namePlaceholder: '请输入岗位名称',
sortPlaceholder: '请输入岗位顺序',
statusPlaceholder: '请选择状态',
remarkPlaceholder: '请输入备注',
codeRequired: '岗位编码不能为空',
nameRequired: '岗位名称不能为空',
sortRequired: '岗位顺序不能为空',
statusRequired: '岗位状态不能为空'
},
Role: {
code: '角色编码',
name: '角色名称',
type: '角色类型',
sort: '显示顺序',
remark: '备注',
status: '状态',
menuPermission: '菜单权限',
dataPermission: '数据权限',
dataScope: '权限范围',
selectAll: '全选/全不选',
expandCollapse: '全部展开/折叠',
parentChildLink: '父子联动(选中父节点,自动选择子节点)',
yes: '是',
no: '否',
loadingText: '加载中,请稍候',
searchCodePlaceholder: '请输入角色编码',
searchNamePlaceholder: '请输入角色名称',
searchStatusPlaceholder: '请选择状态',
codePlaceholder: '请输入角色编码',
namePlaceholder: '请输入角色名称',
sortPlaceholder: '请输入显示顺序',
statusPlaceholder: '请选择状态',
remarkPlaceholder: '请输入备注',
codeRequired: '角色标识不能为空',
nameRequired: '角色名称不能为空',
sortRequired: '显示顺序不能为空',
statusRequired: '状态不能为空'
},
Menu: {
name: '菜单名称',
parent: '上级菜单',
type: '菜单类型',
icon: '菜单图标',
path: '路由地址',
component: '组件地址',
componentName: '组件名称',
permission: '权限标识',
sort: '显示排序',
status: '菜单状态',
visible: '显示状态',
alwaysShow: '总是显示',
keepAlive: '缓存状态',
actions: '操作',
searchNamePlaceholder: '请输入菜单名称',
searchStatusPlaceholder: '请选择菜单状态',
namePlaceholder: '请输入菜单名称',
pathPlaceholder: '请输入路由地址',
componentPlaceholder: '例如说system/user/index',
componentNamePlaceholder: '例如说SystemUser',
permissionPlaceholder: '请输入权限标识',
sortPlaceholder: '请输入显示排序',
toggleExpand: '展开/折叠',
refreshCache: '刷新菜单缓存',
updateCacheConfirm: '即将更新缓存刷新浏览器!',
updateCacheTitle: '刷新菜单缓存',
visibleShow: '显示',
visibleHide: '隐藏',
always: '总是',
notAlways: '不是',
keep: '缓存',
notKeep: '不缓存',
parentRoot: '主类目',
nameRequired: '菜单名称不能为空',
sortRequired: '菜单顺序不能为空',
pathRequired: '路由地址不能为空',
statusRequired: '状态不能为空',
pathMustStartWithSlash: '路径必须以 / 开头',
pathMustNotStartWithSlash: '路径不能以 / 开头',
pathTooltipTitle: '路由地址',
pathTooltipMessage: '访问的路由地址,如:`user`。如需外网地址时,则以 `http(s)://` 开头',
permissionTooltipTitle: '权限标识',
permissionTooltipMessage:
"Controller 方法上的权限字符,如:@PreAuthorize(`@ss.hasPermission('system:user:list')`)",
visibleTooltipTitle: '显示状态',
visibleTooltipMessage: '选择隐藏时,路由将不会出现在侧边栏,但仍然可以访问',
alwaysShowTooltipTitle: '总是显示',
alwaysShowTooltipMessage: '选择不是时,当该菜单只有一个子菜单时,不展示自己,直接展示子菜单',
keepAliveTooltipTitle: '缓存状态',
keepAliveTooltipMessage: '选择缓存时,则会被 `keep-alive` 缓存,必须填写「组件名称」字段'
},
Dict: {
id: '字典编号',
name: '字典名称',
type: '字典类型',
label: '字典标签',
value: '字典键值',
sort: '字典排序',
status: '状态',
remark: '备注',
colorType: '颜色类型',
cssClass: 'CSS Class',
createTime: '创建时间',
actions: '操作',
data: '数据',
searchNamePlaceholder: '请输入字典名称',
searchTypePlaceholder: '请输入字典类型',
searchStatusPlaceholder: '请选择字典状态',
searchLabelPlaceholder: '请输入字典标签',
searchDataStatusPlaceholder: '请选择数据状态',
namePlaceholder: '请输入字典名称',
typePlaceholder: '请输入字典类型',
labelPlaceholder: '请输入数据标签',
valuePlaceholder: '请输入数据键值',
sortPlaceholder: '请输入数据顺序',
remarkPlaceholder: '请输入内容',
statusPlaceholder: '请选择状态',
colorTypePlaceholder: '请选择颜色类型',
cssClassPlaceholder: '请输入 CSS Class',
nameRequired: '字典名称不能为空',
typeRequired: '字典类型不能为空',
statusRequired: '状态不能为空',
labelRequired: '数据标签不能为空',
valueRequired: '数据键值不能为空',
sortRequired: '数据顺序不能为空',
colorTypeDefault: '默认',
colorTypePrimary: '主要',
colorTypeSuccess: '成功',
colorTypeInfo: '信息',
colorTypeWarning: '警告',
colorTypeDanger: '危险',
typeExportFilename: '字典类型.xls',
dataExportFilename: '字典数据.xls'
}
},
// 设备管理
EquipmentManagement: {
// 设备分类

@ -5,27 +5,28 @@
v-loading="formLoading"
:model="formData"
:rules="formRules"
label-width="80px"
label-width="auto"
class="dept-dialog-form"
>
<el-form-item label="上级部门" prop="parentId">
<el-form-item :label="t('SystemManagement.Dept.parent')" prop="parentId">
<el-tree-select
v-model="formData.parentId"
:data="deptTree"
:props="defaultProps"
check-strictly
default-expand-all
placeholder="请选择上级部门"
:placeholder="t('SystemManagement.Dept.parentPlaceholder')"
value-key="deptId"
/>
</el-form-item>
<el-form-item label="部门名称" prop="name">
<el-input v-model="formData.name" placeholder="请输入部门名称" />
<el-form-item :label="t('SystemManagement.Dept.name')" prop="name">
<el-input v-model="formData.name" :placeholder="t('SystemManagement.Dept.searchNamePlaceholder')" />
</el-form-item>
<el-form-item label="显示排序" prop="sort">
<el-form-item :label="t('SystemManagement.Dept.sort')" prop="sort">
<el-input-number v-model="formData.sort" :min="0" controls-position="right" />
</el-form-item>
<el-form-item label="负责人" prop="leaderUserId">
<el-select v-model="formData.leaderUserId" clearable placeholder="请输入负责人">
<el-form-item :label="t('SystemManagement.Dept.leader')" prop="leaderUserId">
<el-select v-model="formData.leaderUserId" clearable :placeholder="t('SystemManagement.Dept.leaderPlaceholder')">
<el-option
v-for="item in userList"
:key="item.id"
@ -34,14 +35,14 @@
/>
</el-select>
</el-form-item>
<el-form-item label="联系电话" prop="phone">
<el-input v-model="formData.phone" maxlength="11" placeholder="请输入联系电话" />
<el-form-item :label="t('SystemManagement.Dept.phone')" prop="phone">
<el-input v-model="formData.phone" maxlength="11" :placeholder="t('SystemManagement.Dept.phonePlaceholder')" />
</el-form-item>
<el-form-item label="邮箱" prop="email">
<el-input v-model="formData.email" maxlength="50" placeholder="请输入邮箱" />
<el-form-item :label="t('SystemManagement.Dept.email')" prop="email">
<el-input v-model="formData.email" maxlength="50" :placeholder="t('SystemManagement.Dept.emailPlaceholder')" />
</el-form-item>
<el-form-item label="状态" prop="status">
<el-select v-model="formData.status" clearable placeholder="请选择状态">
<el-form-item :label="t('SystemManagement.Dept.status')" prop="status">
<el-select v-model="formData.status" clearable :placeholder="t('SystemManagement.Dept.statusPlaceholder')">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)"
:key="dict.value"
@ -52,8 +53,8 @@
</el-form-item>
</el-form>
<template #footer>
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
<el-button type="primary" @click="submitForm">{{ t('common.ok') }}</el-button>
<el-button @click="dialogVisible = false">{{ t('common.cancel') }}</el-button>
</template>
</Dialog>
</template>
@ -86,15 +87,15 @@ const formData = ref({
status: CommonStatusEnum.ENABLE
})
const formRules = reactive<FormRules>({
parentId: [{ required: true, message: '上级部门不能为空', trigger: 'blur' }],
name: [{ required: true, message: '部门名称不能为空', trigger: 'blur' }],
sort: [{ required: true, message: '显示排序不能为空', trigger: 'blur' }],
email: [{ type: 'email', message: '请输入正确的邮箱地址', trigger: ['blur', 'change'] }],
parentId: [{ required: true, message: t('SystemManagement.Dept.parentRequired'), trigger: 'blur' }],
name: [{ required: true, message: t('SystemManagement.Dept.nameRequired'), trigger: 'blur' }],
sort: [{ required: true, message: t('SystemManagement.Dept.sortRequired'), trigger: 'blur' }],
email: [{ type: 'email', message: t('SystemManagement.Dept.emailInvalid'), trigger: ['blur', 'change'] }],
phone: [
{ pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, message: '请输入正确的手机号码', trigger: 'blur' }
{ pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, message: t('SystemManagement.Dept.phoneInvalid'), trigger: 'blur' }
],
status: [{ required: true, message: '状态不能为空', trigger: 'blur' }]
})
status: [{ required: true, message: t('SystemManagement.Dept.statusRequired'), trigger: 'blur' }]
})
const formRef = ref() // Ref
const deptTree = ref() //
const userList = ref<UserApi.UserVO[]>([]) //
@ -172,3 +173,8 @@ const getTree = async () => {
deptTree.value.push(dept)
}
</script>
<style scoped>
.dept-dialog-form :deep(.el-form-item__label) {
min-width: 80px;
}
</style>

@ -2,25 +2,25 @@
<!-- 搜索工作栏 -->
<ContentWrap>
<el-form
class="-mb-15px"
class="-mb-15px dept-search-form"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
label-width="auto"
>
<el-form-item label="部门名称" prop="name">
<el-form-item :label="t('SystemManagement.Dept.name')" prop="name">
<el-input
v-model="queryParams.name"
placeholder="请输入部门名称"
:placeholder="t('SystemManagement.Dept.searchNamePlaceholder')"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="部门状态" prop="status">
<el-form-item :label="t('SystemManagement.Dept.statusLabel')" prop="status">
<el-select
v-model="queryParams.status"
placeholder="请选择部门状态"
:placeholder="t('SystemManagement.Dept.searchStatusPlaceholder')"
clearable
class="!w-240px"
>
@ -33,18 +33,18 @@
</el-select>
</el-form-item>
<el-form-item>
<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="handleQuery"><Icon icon="ep:search" class="mr-5px" /> {{ t('common.query') }}</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> {{ t('common.reset') }}</el-button>
<el-button
type="primary"
plain
@click="openForm('create')"
v-hasPermi="['system:dept:create']"
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
<Icon icon="ep:plus" class="mr-5px" /> {{ t('action.add') }}
</el-button>
<el-button type="danger" plain @click="toggleExpandAll">
<Icon icon="ep:sort" class="mr-5px" /> 展开/折叠
<Icon icon="ep:sort" class="mr-5px" /> {{ t('SystemManagement.Dept.toggleExpand') }}
</el-button>
</el-form-item>
</el-form>
@ -59,26 +59,26 @@
:default-expand-all="isExpandAll"
v-if="refreshTable"
>
<el-table-column prop="name" label="部门名称" />
<el-table-column prop="leader" label="负责人">
<el-table-column prop="name" :label="t('SystemManagement.Dept.name')" />
<el-table-column prop="leader" :label="t('SystemManagement.Dept.leader')">
<template #default="scope">
{{ userList.find((user) => user.id === scope.row.leaderUserId)?.nickname }}
</template>
</el-table-column>
<el-table-column prop="sort" label="排序" />
<el-table-column prop="status" label="状态">
<el-table-column prop="sort" :label="t('SystemManagement.Dept.sort')" />
<el-table-column prop="status" :label="t('common.status')">
<template #default="scope">
<dict-tag :type="DICT_TYPE.COMMON_STATUS" :value="scope.row.status" />
</template>
</el-table-column>
<el-table-column
label="创建时间"
:label="t('common.createTime')"
align="center"
prop="createTime"
width="180"
:formatter="dateFormatter"
/>
<el-table-column label="操作" align="center">
<el-table-column :label="t('table.action')" align="center">
<template #default="scope">
<el-button
link
@ -86,7 +86,7 @@
@click="openForm('update', scope.row.id)"
v-hasPermi="['system:dept:update']"
>
修改
{{ t('action.edit') }}
</el-button>
<el-button
link
@ -94,7 +94,7 @@
@click="handleDelete(scope.row.id)"
v-hasPermi="['system:dept:delete']"
>
删除
{{ t('action.del') }}
</el-button>
</template>
</el-table-column>
@ -188,3 +188,8 @@ onMounted(async () => {
userList.value = await UserApi.getSimpleUserList()
})
</script>
<style scoped>
.dept-search-form :deep(.el-form-item__label) {
min-width: 68px;
}
</style>

@ -5,19 +5,22 @@
v-loading="formLoading"
:model="formData"
:rules="formRules"
label-width="80px"
label-width="auto"
>
<el-form-item label="字典名称" prop="name">
<el-input v-model="formData.name" placeholder="请输入字典名称" />
<el-form-item :label="t('SystemManagement.Dict.name')" prop="name">
<el-input
v-model="formData.name"
:placeholder="t('SystemManagement.Dict.namePlaceholder')"
/>
</el-form-item>
<el-form-item label="字典类型" prop="type">
<el-form-item :label="t('SystemManagement.Dict.type')" prop="type">
<el-input
v-model="formData.type"
:disabled="typeof formData.id !== 'undefined'"
placeholder="请输入参数名称"
:placeholder="t('SystemManagement.Dict.typePlaceholder')"
/>
</el-form-item>
<el-form-item label="状态" prop="status">
<el-form-item :label="t('SystemManagement.Dict.status')" prop="status">
<el-radio-group v-model="formData.status">
<el-radio
v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)"
@ -28,13 +31,19 @@
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="formData.remark" placeholder="请输入内容" type="textarea" />
<el-form-item :label="t('SystemManagement.Dict.remark')" prop="remark">
<el-input
v-model="formData.remark"
:placeholder="t('SystemManagement.Dict.remarkPlaceholder')"
type="textarea"
/>
</el-form-item>
</el-form>
<template #footer>
<el-button :disabled="formLoading" type="primary" @click="submitForm"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
<el-button :disabled="formLoading" type="primary" @click="submitForm">
{{ t('common.ok') }}
</el-button>
<el-button @click="dialogVisible = false">{{ t('common.cancel') }}</el-button>
</template>
</Dialog>
</template>
@ -60,9 +69,11 @@ const formData = ref({
remark: ''
})
const formRules = reactive({
name: [{ required: true, message: '字典名称不能为空', trigger: 'blur' }],
type: [{ required: true, message: '字典类型不能为空', trigger: 'blur' }],
status: [{ required: true, message: '状态不能为空', trigger: 'change' }]
name: [{ required: true, message: t('SystemManagement.Dict.nameRequired'), trigger: 'blur' }],
type: [{ required: true, message: t('SystemManagement.Dict.typeRequired'), trigger: 'blur' }],
status: [
{ required: true, message: t('SystemManagement.Dict.statusRequired'), trigger: 'change' }
]
})
const formRef = ref() // Ref

@ -5,25 +5,31 @@
v-loading="formLoading"
:model="formData"
:rules="formRules"
label-width="80px"
label-width="auto"
>
<el-form-item label="字典类型" prop="type">
<el-form-item :label="t('SystemManagement.Dict.type')" prop="type">
<el-input
v-model="formData.dictType"
:disabled="typeof formData.id !== 'undefined'"
placeholder="请输入参数名称"
:placeholder="t('SystemManagement.Dict.typePlaceholder')"
/>
</el-form-item>
<el-form-item label="数据标签" prop="label">
<el-input v-model="formData.label" placeholder="请输入数据标签" />
<el-form-item :label="t('SystemManagement.Dict.label')" prop="label">
<el-input
v-model="formData.label"
:placeholder="t('SystemManagement.Dict.labelPlaceholder')"
/>
</el-form-item>
<el-form-item label="数据键值" prop="value">
<el-input v-model="formData.value" placeholder="请输入数据键值" />
<el-form-item :label="t('SystemManagement.Dict.value')" prop="value">
<el-input
v-model="formData.value"
:placeholder="t('SystemManagement.Dict.valuePlaceholder')"
/>
</el-form-item>
<el-form-item label="显示排序" prop="sort">
<el-form-item :label="t('SystemManagement.Dict.sort')" prop="sort">
<el-input-number v-model="formData.sort" :min="0" controls-position="right" />
</el-form-item>
<el-form-item label="状态" prop="status">
<el-form-item :label="t('SystemManagement.Dict.status')" prop="status">
<el-radio-group v-model="formData.status">
<el-radio
v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)"
@ -34,8 +40,11 @@
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="颜色类型" prop="colorType">
<el-select v-model="formData.colorType">
<el-form-item :label="t('SystemManagement.Dict.colorType')" prop="colorType">
<el-select
v-model="formData.colorType"
:placeholder="t('SystemManagement.Dict.colorTypePlaceholder')"
>
<el-option
v-for="item in colorTypeOptions"
:key="item.value"
@ -44,16 +53,25 @@
/>
</el-select>
</el-form-item>
<el-form-item label="CSS Class" prop="cssClass">
<el-input v-model="formData.cssClass" placeholder="请输入 CSS Class" />
<el-form-item :label="t('SystemManagement.Dict.cssClass')" prop="cssClass">
<el-input
v-model="formData.cssClass"
:placeholder="t('SystemManagement.Dict.cssClassPlaceholder')"
/>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="formData.remark" placeholder="请输入内容" type="textarea" />
<el-form-item :label="t('SystemManagement.Dict.remark')" prop="remark">
<el-input
v-model="formData.remark"
:placeholder="t('SystemManagement.Dict.remarkPlaceholder')"
type="textarea"
/>
</el-form-item>
</el-form>
<template #footer>
<el-button :disabled="formLoading" type="primary" @click="submitForm"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
<el-button :disabled="formLoading" type="primary" @click="submitForm">
{{ t('common.ok') }}
</el-button>
<el-button @click="dialogVisible = false">{{ t('common.cancel') }}</el-button>
</template>
</Dialog>
</template>
@ -83,10 +101,12 @@ const formData = ref({
remark: ''
})
const formRules = reactive({
label: [{ required: true, message: '数据标签不能为空', trigger: 'blur' }],
value: [{ required: true, message: '数据键值不能为空', trigger: 'blur' }],
sort: [{ required: true, message: '数据顺序不能为空', trigger: 'blur' }],
status: [{ required: true, message: '状态不能为空', trigger: 'change' }]
label: [{ required: true, message: t('SystemManagement.Dict.labelRequired'), trigger: 'blur' }],
value: [{ required: true, message: t('SystemManagement.Dict.valueRequired'), trigger: 'blur' }],
sort: [{ required: true, message: t('SystemManagement.Dict.sortRequired'), trigger: 'blur' }],
status: [
{ required: true, message: t('SystemManagement.Dict.statusRequired'), trigger: 'change' }
]
})
const formRef = ref() // Ref
@ -94,27 +114,27 @@ const formRef = ref() // 表单 Ref
const colorTypeOptions = readonly([
{
value: 'default',
label: '默认'
label: t('SystemManagement.Dict.colorTypeDefault')
},
{
value: 'primary',
label: '主要'
label: t('SystemManagement.Dict.colorTypePrimary')
},
{
value: 'success',
label: '成功'
label: t('SystemManagement.Dict.colorTypeSuccess')
},
{
value: 'info',
label: '信息'
label: t('SystemManagement.Dict.colorTypeInfo')
},
{
value: 'warning',
label: '警告'
label: t('SystemManagement.Dict.colorTypeWarning')
},
{
value: 'danger',
label: '危险'
label: t('SystemManagement.Dict.colorTypeDanger')
}
])

@ -1,14 +1,18 @@
<template>
<ContentWrap>
<el-form
class="-mb-15px"
class="-mb-15px dict-data-search-form"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
label-width="auto"
>
<el-form-item :label="t('SystemManagement.Dict.name')" prop="dictType">
<el-select
v-model="queryParams.dictType"
class="!w-240px"
:placeholder="t('SystemManagement.Dict.searchNamePlaceholder')"
>
<el-form-item label="字典名称" prop="dictType">
<el-select v-model="queryParams.dictType" class="!w-240px">
<el-option
v-for="item in dictTypeList"
:key="item.type"
@ -17,17 +21,22 @@
/>
</el-select>
</el-form-item>
<el-form-item label="字典标签" prop="label">
<el-form-item :label="t('SystemManagement.Dict.label')" prop="label">
<el-input
v-model="queryParams.label"
placeholder="请输入字典标签"
:placeholder="t('SystemManagement.Dict.searchLabelPlaceholder')"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="状态" prop="status">
<el-select v-model="queryParams.status" placeholder="数据状态" clearable class="!w-240px">
<el-form-item :label="t('SystemManagement.Dict.status')" prop="status">
<el-select
v-model="queryParams.status"
:placeholder="t('SystemManagement.Dict.searchDataStatusPlaceholder')"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)"
:key="dict.value"
@ -37,15 +46,22 @@
</el-select>
</el-form-item>
<el-form-item>
<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="handleQuery">
<Icon icon="ep:search" class="mr-5px" />
{{ t('common.query') }}
</el-button>
<el-button @click="resetQuery">
<Icon icon="ep:refresh" class="mr-5px" />
{{ t('common.reset') }}
</el-button>
<el-button
type="primary"
plain
@click="openForm('create')"
v-hasPermi="['system:dict:create']"
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
<Icon icon="ep:plus" class="mr-5px" />
{{ t('action.add') }}
</el-button>
<el-button
type="success"
@ -54,7 +70,8 @@
:loading="exportLoading"
v-hasPermi="['system:dict:export']"
>
<Icon icon="ep:download" class="mr-5px" /> 导出
<Icon icon="ep:download" class="mr-5px" />
{{ t('action.export') }}
</el-button>
</el-form-item>
</el-form>
@ -63,26 +80,31 @@
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list">
<el-table-column label="字典编码" align="center" prop="id" />
<el-table-column label="字典标签" align="center" prop="label" />
<el-table-column label="字典键值" align="center" prop="value" />
<el-table-column label="字典排序" align="center" prop="sort" />
<el-table-column label="状态" align="center" prop="status">
<el-table-column :label="t('SystemManagement.Dict.id')" align="center" prop="id" />
<el-table-column :label="t('SystemManagement.Dict.label')" align="center" prop="label" />
<el-table-column :label="t('SystemManagement.Dict.value')" align="center" prop="value" />
<el-table-column :label="t('SystemManagement.Dict.sort')" align="center" prop="sort" />
<el-table-column :label="t('SystemManagement.Dict.status')" align="center" prop="status">
<template #default="scope">
<dict-tag :type="DICT_TYPE.COMMON_STATUS" :value="scope.row.status" />
</template>
</el-table-column>
<el-table-column label="颜色类型" align="center" prop="colorType" />
<el-table-column label="CSS Class" align="center" prop="cssClass" />
<el-table-column label="备注" align="center" prop="remark" show-overflow-tooltip />
<el-table-column :label="t('SystemManagement.Dict.colorType')" align="center" prop="colorType" />
<el-table-column :label="t('SystemManagement.Dict.cssClass')" align="center" prop="cssClass" />
<el-table-column
:label="t('SystemManagement.Dict.remark')"
align="center"
prop="remark"
show-overflow-tooltip
/>
<el-table-column
label="创建时间"
:label="t('common.createTime')"
align="center"
prop="createTime"
width="180"
:formatter="dateFormatter"
/>
<el-table-column label="操作" align="center">
<el-table-column :label="t('common.operate')" align="center">
<template #default="scope">
<el-button
link
@ -90,7 +112,7 @@
@click="openForm('update', scope.row.id)"
v-hasPermi="['system:dict:update']"
>
修改
{{ t('action.edit') }}
</el-button>
<el-button
link
@ -98,7 +120,7 @@
@click="handleDelete(scope.row.id)"
v-hasPermi="['system:dict:delete']"
>
删除
{{ t('action.del') }}
</el-button>
</template>
</el-table-column>
@ -194,7 +216,7 @@ const handleExport = async () => {
//
exportLoading.value = true
const data = await DictDataApi.exportDictData(queryParams)
download.excel(data, '字典数据.xls')
download.excel(data, t('SystemManagement.Dict.dataExportFilename'))
} catch {
} finally {
exportLoading.value = false
@ -208,3 +230,9 @@ onMounted(async () => {
dictTypeList.value = await DictTypeApi.getSimpleDictTypeList()
})
</script>
<style scoped>
.dict-data-search-form :deep(.el-form-item__label) {
min-width: 68px;
}
</style>

@ -5,33 +5,33 @@
ref="queryFormRef"
:inline="true"
:model="queryParams"
class="-mb-15px"
label-width="68px"
class="-mb-15px dict-search-form"
label-width="auto"
>
<el-form-item label="字典名称" prop="name">
<el-form-item :label="t('SystemManagement.Dict.name')" prop="name">
<el-input
v-model="queryParams.name"
class="!w-240px"
clearable
placeholder="请输入字典名称"
:placeholder="t('SystemManagement.Dict.searchNamePlaceholder')"
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item label="字典类型" prop="type">
<el-form-item :label="t('SystemManagement.Dict.type')" prop="type">
<el-input
v-model="queryParams.type"
class="!w-240px"
clearable
placeholder="请输入字典类型"
:placeholder="t('SystemManagement.Dict.searchTypePlaceholder')"
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item label="状态" prop="status">
<el-form-item :label="t('SystemManagement.Dict.status')" prop="status">
<el-select
v-model="queryParams.status"
class="!w-240px"
clearable
placeholder="请选择字典状态"
:placeholder="t('SystemManagement.Dict.searchStatusPlaceholder')"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)"
@ -41,13 +41,13 @@
/>
</el-select>
</el-form-item>
<el-form-item label="创建时间" prop="createTime">
<el-form-item :label="t('common.createTime')" prop="createTime">
<el-date-picker
v-model="queryParams.createTime"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-240px"
end-placeholder="结束日期"
start-placeholder="开始日期"
:end-placeholder="t('common.endTimeText')"
:start-placeholder="t('common.startTimeText')"
type="daterange"
value-format="YYYY-MM-DD HH:mm:ss"
/>
@ -55,11 +55,11 @@
<el-form-item>
<el-button @click="handleQuery">
<Icon class="mr-5px" icon="ep:search" />
搜索
{{ t('common.query') }}
</el-button>
<el-button @click="resetQuery">
<Icon class="mr-5px" icon="ep:refresh" />
重置
{{ t('common.reset') }}
</el-button>
<el-button
v-hasPermi="['system:dict:create']"
@ -68,7 +68,7 @@
@click="openForm('create')"
>
<Icon class="mr-5px" icon="ep:plus" />
新增
{{ t('action.add') }}
</el-button>
<el-button
v-hasPermi="['system:dict:export']"
@ -78,7 +78,7 @@
@click="handleExport"
>
<Icon class="mr-5px" icon="ep:download" />
导出
{{ t('action.export') }}
</el-button>
</el-form-item>
</el-form>
@ -87,23 +87,33 @@
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list">
<el-table-column align="center" label="字典编号" prop="id" />
<el-table-column align="center" label="字典名称" prop="name" show-overflow-tooltip />
<el-table-column align="center" label="字典类型" prop="type" width="300" />
<el-table-column align="center" label="状态" prop="status">
<el-table-column align="center" :label="t('SystemManagement.Dict.id')" prop="id" />
<el-table-column
align="center"
:label="t('SystemManagement.Dict.name')"
prop="name"
show-overflow-tooltip
/>
<el-table-column
align="center"
:label="t('SystemManagement.Dict.type')"
prop="type"
width="300"
/>
<el-table-column align="center" :label="t('SystemManagement.Dict.status')" prop="status">
<template #default="scope">
<dict-tag :type="DICT_TYPE.COMMON_STATUS" :value="scope.row.status" />
</template>
</el-table-column>
<el-table-column align="center" label="备注" prop="remark" />
<el-table-column align="center" :label="t('SystemManagement.Dict.remark')" prop="remark" />
<el-table-column
:formatter="dateFormatter"
align="center"
label="创建时间"
:label="t('common.createTime')"
prop="createTime"
width="180"
/>
<el-table-column align="center" label="操作">
<el-table-column align="center" :label="t('common.operate')">
<template #default="scope">
<el-button
v-hasPermi="['system:dict:update']"
@ -111,10 +121,10 @@
type="primary"
@click="openForm('update', scope.row.id)"
>
修改
{{ t('action.edit') }}
</el-button>
<router-link :to="'/dict/type/data/' + scope.row.type">
<el-button link type="primary">数据</el-button>
<el-button link type="primary">{{ t('SystemManagement.Dict.data') }}</el-button>
</router-link>
<el-button
v-hasPermi="['system:dict:delete']"
@ -122,7 +132,7 @@
type="danger"
@click="handleDelete(scope.row.id)"
>
删除
{{ t('action.del') }}
</el-button>
</template>
</el-table-column>
@ -217,7 +227,7 @@ const handleExport = async () => {
//
exportLoading.value = true
const data = await DictTypeApi.exportDictType(queryParams)
download.excel(data, '字典类型.xls')
download.excel(data, t('SystemManagement.Dict.typeExportFilename'))
} catch {
} finally {
exportLoading.value = false
@ -229,3 +239,9 @@ onMounted(() => {
getList()
})
</script>
<style scoped>
.dict-search-form :deep(.el-form-item__label) {
min-width: 68px;
}
</style>

@ -5,9 +5,10 @@
v-loading="formLoading"
:model="formData"
:rules="formRules"
label-width="100px"
label-width="auto"
class="system-menu-form"
>
<el-form-item label="上级菜单">
<el-form-item :label="t('SystemManagement.Menu.parent')">
<el-tree-select
v-model="formData.parentId"
:data="menuTree"
@ -17,10 +18,10 @@
node-key="id"
/>
</el-form-item>
<el-form-item label="菜单名称" prop="name">
<el-input v-model="formData.name" clearable placeholder="请输入菜单名称" />
<el-form-item :label="t('SystemManagement.Menu.name')" prop="name">
<el-input v-model="formData.name" clearable :placeholder="t('SystemManagement.Menu.namePlaceholder')" />
</el-form-item>
<el-form-item label="菜单类型" prop="type">
<el-form-item :label="t('SystemManagement.Menu.type')" prop="type">
<el-radio-group v-model="formData.type">
<el-radio-button
v-for="dict in getIntDictOptions(DICT_TYPE.SYSTEM_MENU_TYPE)"
@ -31,37 +32,37 @@
</el-radio-button>
</el-radio-group>
</el-form-item>
<el-form-item v-if="formData.type !== 3" label="菜单图标">
<el-form-item v-if="formData.type !== 3" :label="t('SystemManagement.Menu.icon')">
<IconSelect v-model="formData.icon" clearable />
</el-form-item>
<el-form-item v-if="formData.type !== 3" label="路由地址" prop="path">
<el-form-item v-if="formData.type !== 3" :label="t('SystemManagement.Menu.path')" prop="path">
<template #label>
<Tooltip
message="访问的路由地址,如:`user`。如需外网地址时,则以 `http(s)://` 开头"
title="路由地址"
:message="t('SystemManagement.Menu.pathTooltipMessage')"
:title="t('SystemManagement.Menu.pathTooltipTitle')"
/>
</template>
<el-input v-model="formData.path" clearable placeholder="请输入路由地址" />
<el-input v-model="formData.path" clearable :placeholder="t('SystemManagement.Menu.pathPlaceholder')" />
</el-form-item>
<el-form-item v-if="formData.type === 2" label="组件地址" prop="component">
<el-input v-model="formData.component" clearable placeholder="例如说system/user/index" />
<el-form-item v-if="formData.type === 2" :label="t('SystemManagement.Menu.component')" prop="component">
<el-input v-model="formData.component" clearable :placeholder="t('SystemManagement.Menu.componentPlaceholder')" />
</el-form-item>
<el-form-item v-if="formData.type === 2" label="组件名字" prop="componentName">
<el-input v-model="formData.componentName" clearable placeholder="例如说SystemUser" />
<el-form-item v-if="formData.type === 2" :label="t('SystemManagement.Menu.componentName')" prop="componentName">
<el-input v-model="formData.componentName" clearable :placeholder="t('SystemManagement.Menu.componentNamePlaceholder')" />
</el-form-item>
<el-form-item v-if="formData.type !== 1" label="权限标识" prop="permission">
<el-form-item v-if="formData.type !== 1" :label="t('SystemManagement.Menu.permission')" prop="permission">
<template #label>
<Tooltip
message="Controller 方法上的权限字符,如:@PreAuthorize(`@ss.hasPermission('system:user:list')`)"
title="权限标识"
:message="t('SystemManagement.Menu.permissionTooltipMessage')"
:title="t('SystemManagement.Menu.permissionTooltipTitle')"
/>
</template>
<el-input v-model="formData.permission" clearable placeholder="请输入权限标识" />
<el-input v-model="formData.permission" clearable :placeholder="t('SystemManagement.Menu.permissionPlaceholder')" />
</el-form-item>
<el-form-item label="显示排序" prop="sort">
<el-form-item :label="t('SystemManagement.Menu.sort')" prop="sort">
<el-input-number v-model="formData.sort" :min="0" clearable controls-position="right" />
</el-form-item>
<el-form-item label="菜单状态" prop="status">
<el-form-item :label="t('SystemManagement.Menu.status')" prop="status">
<el-radio-group v-model="formData.status">
<el-radio
v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)"
@ -72,43 +73,43 @@
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item v-if="formData.type !== 3" label="显示状态" prop="visible">
<el-form-item v-if="formData.type !== 3" :label="t('SystemManagement.Menu.visible')" prop="visible">
<template #label>
<Tooltip message="选择隐藏时,路由将不会出现在侧边栏,但仍然可以访问" title="显示状态" />
<Tooltip :message="t('SystemManagement.Menu.visibleTooltipMessage')" :title="t('SystemManagement.Menu.visibleTooltipTitle')" />
</template>
<el-radio-group v-model="formData.visible">
<el-radio key="true" :value="true" border>显示</el-radio>
<el-radio key="false" :value="false" border>隐藏</el-radio>
<el-radio key="true" :value="true" border>{{ t('SystemManagement.Menu.visibleShow') }}</el-radio>
<el-radio key="false" :value="false" border>{{ t('SystemManagement.Menu.visibleHide') }}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item v-if="formData.type !== 3" label="总是显示" prop="alwaysShow">
<el-form-item v-if="formData.type !== 3" :label="t('SystemManagement.Menu.alwaysShow')" prop="alwaysShow">
<template #label>
<Tooltip
message="选择不是时,当该菜单只有一个子菜单时,不展示自己,直接展示子菜单"
title="总是显示"
:message="t('SystemManagement.Menu.alwaysShowTooltipMessage')"
:title="t('SystemManagement.Menu.alwaysShowTooltipTitle')"
/>
</template>
<el-radio-group v-model="formData.alwaysShow">
<el-radio key="true" :value="true" border>总是</el-radio>
<el-radio key="false" :value="false" border>不是</el-radio>
<el-radio key="true" :value="true" border>{{ t('SystemManagement.Menu.always') }}</el-radio>
<el-radio key="false" :value="false" border>{{ t('SystemManagement.Menu.notAlways') }}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item v-if="formData.type === 2" label="缓存状态" prop="keepAlive">
<el-form-item v-if="formData.type === 2" :label="t('SystemManagement.Menu.keepAlive')" prop="keepAlive">
<template #label>
<Tooltip
message="选择缓存时,则会被 `keep-alive` 缓存,必须填写「组件名称」字段"
title="缓存状态"
:message="t('SystemManagement.Menu.keepAliveTooltipMessage')"
:title="t('SystemManagement.Menu.keepAliveTooltipTitle')"
/>
</template>
<el-radio-group v-model="formData.keepAlive">
<el-radio key="true" :value="true" border>缓存</el-radio>
<el-radio key="false" :value="false" border>不缓存</el-radio>
<el-radio key="true" :value="true" border>{{ t('SystemManagement.Menu.keep') }}</el-radio>
<el-radio key="false" :value="false" border>{{ t('SystemManagement.Menu.notKeep') }}</el-radio>
</el-radio-group>
</el-form-item>
</el-form>
<template #footer>
<el-button :disabled="formLoading" type="primary" @click="submitForm"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
<el-button :disabled="formLoading" type="primary" @click="submitForm">{{ t('common.ok') }}</el-button>
<el-button @click="dialogVisible = false">{{ t('common.cancel') }}</el-button>
</template>
</Dialog>
</template>
@ -146,10 +147,10 @@ const formData = ref({
alwaysShow: true
})
const formRules = reactive({
name: [{ required: true, message: '菜单名称不能为空', trigger: 'blur' }],
sort: [{ required: true, message: '菜单顺序不能为空', trigger: 'blur' }],
path: [{ required: true, message: '路由地址不能为空', trigger: 'blur' }],
status: [{ required: true, message: '状态不能为空', trigger: 'blur' }]
name: [{ required: true, message: t('SystemManagement.Menu.nameRequired'), trigger: 'blur' }],
sort: [{ required: true, message: t('SystemManagement.Menu.sortRequired'), trigger: 'blur' }],
path: [{ required: true, message: t('SystemManagement.Menu.pathRequired'), trigger: 'blur' }],
status: [{ required: true, message: t('SystemManagement.Menu.statusRequired'), trigger: 'blur' }]
})
const formRef = ref() // Ref
@ -192,10 +193,10 @@ const submitForm = async () => {
) {
if (!isExternal(formData.value.path)) {
if (formData.value.parentId === 0 && formData.value.path.charAt(0) !== '/') {
message.error('路径必须以 / 开头')
message.error(t('SystemManagement.Menu.pathMustStartWithSlash'))
return
} else if (formData.value.parentId !== 0 && formData.value.path.charAt(0) === '/') {
message.error('路径不能以 / 开头')
message.error(t('SystemManagement.Menu.pathMustNotStartWithSlash'))
return
}
}
@ -223,7 +224,7 @@ const menuTree = ref<Tree[]>([]) // 树形结构
const getTree = async () => {
menuTree.value = []
const res = await MenuApi.getSimpleMenusList()
let menu: Tree = { id: 0, name: '主类目', children: [] }
let menu: Tree = { id: 0, name: t('SystemManagement.Menu.parentRoot'), children: [] }
menu.children = handleTree(res)
menuTree.value.push(menu)
}

@ -8,24 +8,24 @@
ref="queryFormRef"
:inline="true"
:model="queryParams"
class="-mb-15px"
label-width="68px"
class="-mb-15px system-menu-query-form"
label-width="auto"
>
<el-form-item label="菜单名称" prop="name">
<el-form-item :label="t('SystemManagement.Menu.name')" prop="name">
<el-input
v-model="queryParams.name"
class="!w-240px"
clearable
placeholder="请输入菜单名称"
:placeholder="t('SystemManagement.Menu.searchNamePlaceholder')"
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item label="状态" prop="status">
<el-form-item :label="t('SystemManagement.Menu.status')" prop="status">
<el-select
v-model="queryParams.status"
class="!w-240px"
clearable
placeholder="请选择菜单状态"
:placeholder="t('SystemManagement.Menu.searchStatusPlaceholder')"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)"
@ -38,11 +38,11 @@
<el-form-item>
<el-button @click="handleQuery">
<Icon class="mr-5px" icon="ep:search" />
搜索
{{ t('common.query') }}
</el-button>
<el-button @click="resetQuery">
<Icon class="mr-5px" icon="ep:refresh" />
重置
{{ t('common.reset') }}
</el-button>
<el-button
v-hasPermi="['system:menu:create']"
@ -51,15 +51,15 @@
@click="openForm('create')"
>
<Icon class="mr-5px" icon="ep:plus" />
新增
{{ t('action.add') }}
</el-button>
<el-button plain type="danger" @click="toggleExpandAll">
<Icon class="mr-5px" icon="ep:sort" />
展开/折叠
{{ t('SystemManagement.Menu.toggleExpand') }}
</el-button>
<el-button plain @click="refreshMenu">
<Icon class="mr-5px" icon="ep:refresh" />
刷新菜单缓存
{{ t('SystemManagement.Menu.refreshCache') }}
</el-button>
</el-form-item>
</el-form>
@ -74,17 +74,17 @@
:default-expand-all="isExpandAll"
row-key="id"
>
<el-table-column :show-overflow-tooltip="true" label="菜单名称" prop="name" width="250" />
<el-table-column align="center" label="图标" prop="icon" width="100">
<el-table-column :show-overflow-tooltip="true" :label="t('SystemManagement.Menu.name')" prop="name" width="250" />
<el-table-column align="center" :label="t('SystemManagement.Menu.icon')" prop="icon" width="100">
<template #default="scope">
<Icon :icon="scope.row.icon" />
</template>
</el-table-column>
<el-table-column label="排序" prop="sort" width="60" />
<el-table-column :show-overflow-tooltip="true" label="权限标识" prop="permission" />
<el-table-column :show-overflow-tooltip="true" label="组件路径" prop="component" />
<el-table-column :show-overflow-tooltip="true" label="组件名称" prop="componentName" />
<el-table-column label="状态" prop="status">
<el-table-column :label="t('SystemManagement.Menu.sort')" prop="sort" width="60" />
<el-table-column :show-overflow-tooltip="true" :label="t('SystemManagement.Menu.permission')" prop="permission" />
<el-table-column :show-overflow-tooltip="true" :label="t('SystemManagement.Menu.component')" prop="component" />
<el-table-column :show-overflow-tooltip="true" :label="t('SystemManagement.Menu.componentName')" prop="componentName" />
<el-table-column :label="t('SystemManagement.Menu.status')" prop="status">
<template #default="scope">
<el-switch
class="ml-4px"
@ -97,7 +97,7 @@
/>
</template>
</el-table-column>
<el-table-column align="center" label="操作">
<el-table-column align="center" :label="t('SystemManagement.Menu.actions')">
<template #default="scope">
<el-button
v-hasPermi="['system:menu:update']"
@ -105,7 +105,7 @@
type="primary"
@click="openForm('update', scope.row.id)"
>
修改
{{ t('action.edit') }}
</el-button>
<el-button
v-hasPermi="['system:menu:create']"
@ -113,7 +113,7 @@
type="primary"
@click="openForm('create', undefined, scope.row.id)"
>
新增
{{ t('action.add') }}
</el-button>
<el-button
v-hasPermi="['system:menu:delete']"
@ -121,7 +121,7 @@
type="danger"
@click="handleDelete(scope.row.id)"
>
删除
{{ t('action.delete') }}
</el-button>
</template>
</el-table-column>
@ -196,7 +196,7 @@ const toggleExpandAll = () => {
/** 刷新菜单缓存按钮操作 */
const refreshMenu = async () => {
try {
await message.confirm('即将更新缓存刷新浏览器!', '刷新菜单缓存')
await message.confirm(t('SystemManagement.Menu.updateCacheConfirm'), t('SystemManagement.Menu.updateCacheTitle'))
//
wsCache.delete(CACHE_KEY.USER)
wsCache.delete(CACHE_KEY.ROLE_ROUTERS)

@ -5,19 +5,20 @@
v-loading="formLoading"
:model="formData"
:rules="formRules"
label-width="80px"
label-width="auto"
class="post-dialog-form"
>
<el-form-item label="岗位编码" prop="code">
<el-input v-model="formData.code" placeholder="请输入岗位编码" />
<el-form-item :label="t('SystemManagement.Post.code')" prop="code">
<el-input v-model="formData.code" :placeholder="t('SystemManagement.Post.codePlaceholder')" />
</el-form-item>
<el-form-item label="岗位名称" prop="name">
<el-input v-model="formData.name" placeholder="请输入岗位名称" />
<el-form-item :label="t('SystemManagement.Post.name')" prop="name">
<el-input v-model="formData.name" :placeholder="t('SystemManagement.Post.namePlaceholder')" />
</el-form-item>
<el-form-item label="岗位顺序" prop="sort">
<el-input v-model="formData.sort" placeholder="请输入岗位顺序" />
<el-form-item :label="t('SystemManagement.Post.sort')" prop="sort">
<el-input v-model="formData.sort" :placeholder="t('SystemManagement.Post.sortPlaceholder')" />
</el-form-item>
<el-form-item label="状态" prop="status">
<el-select v-model="formData.status" clearable placeholder="请选择状态">
<el-form-item :label="t('SystemManagement.Post.status')" prop="status">
<el-select v-model="formData.status" clearable :placeholder="t('SystemManagement.Post.statusPlaceholder')">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)"
:key="dict.value"
@ -26,13 +27,13 @@
/>
</el-select>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="formData.remark" placeholder="请输备注" type="textarea" />
<el-form-item :label="t('SystemManagement.Post.remark')" prop="remark">
<el-input v-model="formData.remark" :placeholder="t('SystemManagement.Post.remarkPlaceholder')" type="textarea" />
</el-form-item>
</el-form>
<template #footer>
<el-button :disabled="formLoading" type="primary" @click="submitForm"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
<el-button :disabled="formLoading" type="primary" @click="submitForm">{{ t('common.ok') }}</el-button>
<el-button @click="dialogVisible = false">{{ t('common.cancel') }}</el-button>
</template>
</Dialog>
</template>
@ -59,11 +60,11 @@ const formData = ref({
remark: ''
})
const formRules = reactive({
name: [{ required: true, message: '岗位名称不能为空', trigger: 'blur' }],
code: [{ required: true, message: '岗位编码不能为空', trigger: 'change' }],
sort: [{ required: true, message: '岗位顺序不能为空', trigger: 'blur' }],
status: [{ required: true, message: '岗位状态不能为空', trigger: 'change' }],
remark: [{ required: false, message: '岗位内容不能为空', trigger: 'blur' }]
name: [{ required: true, message: t('SystemManagement.Post.nameRequired'), trigger: 'blur' }],
code: [{ required: true, message: t('SystemManagement.Post.codeRequired'), trigger: 'change' }],
sort: [{ required: true, message: t('SystemManagement.Post.sortRequired'), trigger: 'blur' }],
status: [{ required: true, message: t('SystemManagement.Post.statusRequired'), trigger: 'change' }],
remark: [{ required: false, message: t('SystemManagement.Post.remarkPlaceholder'), trigger: 'blur' }]
})
const formRef = ref() // Ref
@ -124,3 +125,8 @@ const resetForm = () => {
formRef.value?.resetFields()
}
</script>
<style scoped>
.post-dialog-form :deep(.el-form-item__label) {
min-width: 80px;
}
</style>

@ -2,32 +2,37 @@
<ContentWrap>
<!-- 搜索工作栏 -->
<el-form
class="-mb-15px"
class="-mb-15px post-search-form"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
label-width="auto"
>
<el-form-item label="岗位名称" prop="name">
<el-form-item :label="t('SystemManagement.Post.name')" prop="name">
<el-input
v-model="queryParams.name"
placeholder="请输入岗位名称"
:placeholder="t('SystemManagement.Post.searchNamePlaceholder')"
clearable
class="!w-240px"
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item label="岗位编码" prop="code">
<el-form-item :label="t('SystemManagement.Post.code')" prop="code">
<el-input
v-model="queryParams.code"
placeholder="请输入岗位编码"
:placeholder="t('SystemManagement.Post.searchCodePlaceholder')"
clearable
class="!w-240px"
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item label="状态" prop="status">
<el-select v-model="queryParams.status" placeholder="请选择状态" clearable class="!w-240px">
<el-form-item :label="t('SystemManagement.Post.status')" prop="status">
<el-select
v-model="queryParams.status"
:placeholder="t('SystemManagement.Post.searchStatusPlaceholder')"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)"
:key="dict.value"
@ -37,15 +42,15 @@
</el-select>
</el-form-item>
<el-form-item>
<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="handleQuery"><Icon icon="ep:search" class="mr-5px" /> {{ t('common.query') }}</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> {{ t('common.reset') }}</el-button>
<el-button
type="primary"
plain
@click="openForm('create')"
v-hasPermi="['system:post:create']"
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
<Icon icon="ep:plus" class="mr-5px" /> {{ t('action.add') }}
</el-button>
<el-button
type="success"
@ -54,7 +59,7 @@
:loading="exportLoading"
v-hasPermi="['system:post:export']"
>
<Icon icon="ep:download" class="mr-5px" /> 导出
<Icon icon="ep:download" class="mr-5px" /> {{ t('action.export') }}
</el-button>
</el-form-item>
</el-form>
@ -63,23 +68,23 @@
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list">
<el-table-column label="岗位编码" align="center" prop="code" />
<el-table-column label="岗位名称" align="center" prop="name" />
<el-table-column label="岗位顺序" align="center" prop="sort" />
<el-table-column label="岗位备注" align="center" prop="remark" />
<el-table-column label="状态" align="center" prop="status">
<el-table-column :label="t('SystemManagement.Post.code')" align="center" prop="code" />
<el-table-column :label="t('SystemManagement.Post.name')" align="center" prop="name" />
<el-table-column :label="t('SystemManagement.Post.sort')" align="center" prop="sort" />
<el-table-column :label="t('SystemManagement.Post.remark')" align="center" prop="remark" />
<el-table-column :label="t('common.status')" align="center" prop="status">
<template #default="scope">
<dict-tag :type="DICT_TYPE.COMMON_STATUS" :value="scope.row.status" />
</template>
</el-table-column>
<el-table-column
label="创建时间"
:label="t('common.createTime')"
align="center"
prop="createTime"
width="180"
:formatter="dateFormatter"
/>
<el-table-column label="操作" align="center">
<el-table-column :label="t('table.action')" align="center">
<template #default="scope">
<el-button
link
@ -87,7 +92,7 @@
@click="openForm('update', scope.row.id)"
v-hasPermi="['system:post:update']"
>
编辑
{{ t('action.edit') }}
</el-button>
<el-button
link
@ -95,7 +100,7 @@
@click="handleDelete(scope.row.id)"
v-hasPermi="['system:post:delete']"
>
删除
{{ t('action.del') }}
</el-button>
</template>
</el-table-column>

@ -1,28 +1,34 @@
<template>
<Dialog v-model="dialogVisible" title="菜单权限">
<el-form ref="formRef" v-loading="formLoading" :model="formData" label-width="80px">
<el-form-item label="角色名称">
<Dialog v-model="dialogVisible" :title="t('SystemManagement.Role.menuPermission')">
<el-form
ref="formRef"
v-loading="formLoading"
:model="formData"
label-width="auto"
class="role-assign-menu-form"
>
<el-form-item :label="t('SystemManagement.Role.name')">
<el-tag>{{ formData.name }}</el-tag>
</el-form-item>
<el-form-item label="角色标识">
<el-form-item :label="t('SystemManagement.Role.code')">
<el-tag>{{ formData.code }}</el-tag>
</el-form-item>
<el-form-item label="菜单权限">
<el-form-item :label="t('SystemManagement.Role.menuPermission')">
<el-card class="w-full h-400px !overflow-y-scroll" shadow="never">
<template #header>
全选/全不选:
{{ t('SystemManagement.Role.selectAll') }}:
<el-switch
v-model="treeNodeAll"
active-text=""
inactive-text=""
:active-text="t('SystemManagement.Role.yes')"
:inactive-text="t('SystemManagement.Role.no')"
inline-prompt
@change="handleCheckedTreeNodeAll"
/>
全部展开/折叠:
{{ t('SystemManagement.Role.expandCollapse') }}:
<el-switch
v-model="menuExpand"
active-text="展开"
inactive-text="折叠"
:active-text="t('SystemManagement.Role.yes')"
:inactive-text="t('SystemManagement.Role.no')"
inline-prompt
@change="handleCheckedTreeExpand"
/>
@ -31,7 +37,7 @@
ref="treeRef"
:data="menuOptions"
:props="defaultProps"
empty-text="加载中,请稍候"
:empty-text="t('SystemManagement.Role.loadingText')"
node-key="id"
show-checkbox
/>
@ -39,8 +45,8 @@
</el-form-item>
</el-form>
<template #footer>
<el-button :disabled="formLoading" type="primary" @click="submitForm"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
<el-button :disabled="formLoading" type="primary" @click="submitForm">{{ t('common.ok') }}</el-button>
<el-button @click="dialogVisible = false">{{ t('common.cancel') }}</el-button>
</template>
</Dialog>
</template>
@ -81,9 +87,9 @@ const open = async (row: RoleApi.RoleVO) => {
formData.code = row.code
formLoading.value = true
try {
formData.value.menuIds = await PermissionApi.getRoleMenuList(row.id)
formData.menuIds = await PermissionApi.getRoleMenuList(row.id)
//
formData.value.menuIds.forEach((menuId: number) => {
formData.menuIds.forEach((menuId: number) => {
treeRef.value.setChecked(menuId, true, false)
})
} finally {
@ -125,12 +131,10 @@ const resetForm = () => {
treeNodeAll.value = false
menuExpand.value = false
//
formData.value = {
id: undefined,
name: '',
code: '',
menuIds: []
}
formData.id = undefined
formData.name = ''
formData.code = ''
formData.menuIds = []
treeRef.value?.setCheckedNodes([])
formRef.value?.resetFields()
}
@ -151,3 +155,9 @@ const handleCheckedTreeExpand = () => {
}
}
</script>
<style scoped>
.role-assign-menu-form :deep(.el-form-item__label) {
min-width: 80px;
}
</style>

@ -5,19 +5,20 @@
v-loading="formLoading"
:model="formData"
:rules="formRules"
label-width="80px"
label-width="auto"
class="role-dialog-form"
>
<el-form-item label="角色编码" prop="code">
<el-input v-model="formData.code" placeholder="请输入角色编码" />
<el-form-item :label="t('SystemManagement.Role.code')" prop="code">
<el-input v-model="formData.code" :placeholder="t('SystemManagement.Role.codePlaceholder')" />
</el-form-item>
<el-form-item label="角色名称" prop="name">
<el-input v-model="formData.name" placeholder="请输入角色名称" />
<el-form-item :label="t('SystemManagement.Role.name')" prop="name">
<el-input v-model="formData.name" :placeholder="t('SystemManagement.Role.namePlaceholder')" />
</el-form-item>
<el-form-item label="显示顺序" prop="sort">
<el-input v-model="formData.sort" placeholder="请输入显示顺序" />
<el-form-item :label="t('SystemManagement.Role.sort')" prop="sort">
<el-input v-model="formData.sort" :placeholder="t('SystemManagement.Role.sortPlaceholder')" />
</el-form-item>
<el-form-item label="状态" prop="status">
<el-select v-model="formData.status" clearable placeholder="请选择状态">
<el-form-item :label="t('SystemManagement.Role.status')" prop="status">
<el-select v-model="formData.status" clearable :placeholder="t('SystemManagement.Role.statusPlaceholder')">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)"
:key="dict.value"
@ -26,13 +27,13 @@
/>
</el-select>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="formData.remark" placeholder="请输备注" type="textarea" />
<el-form-item :label="t('SystemManagement.Role.remark')" prop="remark">
<el-input v-model="formData.remark" :placeholder="t('SystemManagement.Role.remarkPlaceholder')" type="textarea" />
</el-form-item>
</el-form>
<template #footer>
<el-button :disabled="formLoading" type="primary" @click="submitForm"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
<el-button :disabled="formLoading" type="primary" @click="submitForm">{{ t('common.ok') }}</el-button>
<el-button @click="dialogVisible = false">{{ t('common.cancel') }}</el-button>
</template>
</Dialog>
</template>
@ -59,11 +60,10 @@ const formData = ref({
remark: ''
})
const formRules = reactive({
name: [{ required: true, message: '角色名称不能为空', trigger: 'blur' }],
code: [{ required: true, message: '角色标识不能为空', trigger: 'change' }],
sort: [{ required: true, message: '显示顺序不能为空', trigger: 'change' }],
status: [{ required: true, message: '状态不能为空', trigger: 'change' }],
remark: [{ required: false, message: '备注不能为空', trigger: 'blur' }]
name: [{ required: true, message: t('SystemManagement.Role.nameRequired'), trigger: 'blur' }],
code: [{ required: true, message: t('SystemManagement.Role.codeRequired'), trigger: 'change' }],
sort: [{ required: true, message: t('SystemManagement.Role.sortRequired'), trigger: 'change' }],
status: [{ required: true, message: t('SystemManagement.Role.statusRequired'), trigger: 'change' }]
})
const formRef = ref() // Ref
@ -124,3 +124,9 @@ const submitForm = async () => {
}
}
</script>
<style scoped>
.role-dialog-form :deep(.el-form-item__label) {
min-width: 80px;
}
</style>

@ -1,34 +1,38 @@
<template>
<ContentWrap>
<!-- 搜索工作栏 -->
<el-form
ref="queryFormRef"
:inline="true"
:model="queryParams"
class="-mb-15px"
label-width="68px"
class="-mb-15px role-search-form"
label-width="auto"
>
<el-form-item label="角色编码" prop="code">
<el-form-item :label="t('SystemManagement.Role.code')" prop="code">
<el-input
v-model="queryParams.code"
class="!w-240px"
clearable
placeholder="请输入角色编码"
:placeholder="t('SystemManagement.Role.searchCodePlaceholder')"
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item label="角色名称" prop="name">
<el-form-item :label="t('SystemManagement.Role.name')" prop="name">
<el-input
v-model="queryParams.name"
class="!w-240px"
clearable
placeholder="请输入角色名称"
:placeholder="t('SystemManagement.Role.searchNamePlaceholder')"
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item label="状态" prop="status">
<el-select v-model="queryParams.status" class="!w-240px" clearable placeholder="请选择状态">
<el-form-item :label="t('SystemManagement.Role.status')" prop="status">
<el-select
v-model="queryParams.status"
class="!w-240px"
clearable
:placeholder="t('SystemManagement.Role.searchStatusPlaceholder')"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)"
:key="dict.value"
@ -37,13 +41,13 @@
/>
</el-select>
</el-form-item>
<el-form-item label="创建时间" prop="createTime">
<el-form-item :label="t('common.createTime')" prop="createTime">
<el-date-picker
v-model="queryParams.createTime"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-240px"
end-placeholder="结束日期"
start-placeholder="开始日期"
:end-placeholder="t('common.endTimeText')"
:start-placeholder="t('common.startTimeText')"
type="daterange"
value-format="YYYY-MM-DD HH:mm:ss"
/>
@ -51,11 +55,11 @@
<el-form-item>
<el-button @click="handleQuery">
<Icon class="mr-5px" icon="ep:search" />
搜索
{{ t('common.query') }}
</el-button>
<el-button @click="resetQuery">
<Icon class="mr-5px" icon="ep:refresh" />
重置
{{ t('common.reset') }}
</el-button>
<el-button
v-hasPermi="['system:role:create']"
@ -64,7 +68,7 @@
@click="openForm('create')"
>
<Icon class="mr-5px" icon="ep:plus" />
新增
{{ t('action.add') }}
</el-button>
<el-button
v-hasPermi="['system:role:export']"
@ -74,7 +78,7 @@
@click="handleExport"
>
<Icon class="mr-5px" icon="ep:download" />
导出
{{ t('action.export') }}
</el-button>
</el-form-item>
</el-form>
@ -83,16 +87,16 @@
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list">
<el-table-column align="center" label="角色编码" prop="code" />
<el-table-column align="center" label="角色名称" prop="name" />
<el-table-column label="角色类型" align="center" prop="type">
<el-table-column align="center" :label="t('SystemManagement.Role.code')" prop="code" />
<el-table-column align="center" :label="t('SystemManagement.Role.name')" prop="name" />
<el-table-column :label="t('SystemManagement.Role.type')" align="center" prop="type">
<template #default="scope">
<dict-tag :type="DICT_TYPE.SYSTEM_ROLE_TYPE" :value="scope.row.type" />
</template>
</el-table-column>
<el-table-column align="center" label="显示顺序" prop="sort" />
<el-table-column align="center" label="备注" prop="remark" />
<el-table-column align="center" label="状态" prop="status">
<el-table-column align="center" :label="t('SystemManagement.Role.sort')" prop="sort" />
<el-table-column align="center" :label="t('SystemManagement.Role.remark')" prop="remark" />
<el-table-column align="center" :label="t('SystemManagement.Role.status')" prop="status">
<template #default="scope">
<dict-tag :type="DICT_TYPE.COMMON_STATUS" :value="scope.row.status" />
</template>
@ -100,11 +104,11 @@
<el-table-column
:formatter="dateFormatter"
align="center"
label="创建时间"
:label="t('common.createTime')"
prop="createTime"
width="180"
/>
<el-table-column :width="300" align="center" label="操作">
<el-table-column :width="300" align="center" :label="t('common.operate')">
<template #default="scope">
<el-button
v-hasPermi="['system:role:update']"
@ -112,27 +116,27 @@
type="primary"
@click="openForm('update', scope.row.id)"
>
编辑
{{ t('action.edit') }}
</el-button>
<el-button
v-hasPermi="['system:permission:assign-role-menu']"
link
preIcon="ep:basketball"
title="菜单权限"
:title="t('SystemManagement.Role.menuPermission')"
type="primary"
@click="openAssignMenuForm(scope.row)"
>
菜单权限
{{ t('SystemManagement.Role.menuPermission') }}
</el-button>
<el-button
v-hasPermi="['system:permission:assign-role-data-scope']"
link
preIcon="ep:coin"
title="数据权限"
:title="t('SystemManagement.Role.dataPermission')"
type="primary"
@click="openDataPermissionForm(scope.row)"
>
数据权限
{{ t('SystemManagement.Role.dataPermission') }}
</el-button>
<el-button
v-hasPermi="['system:role:delete']"
@ -140,7 +144,7 @@
type="danger"
@click="handleDelete(scope.row.id)"
>
删除
{{ t('action.del') }}
</el-button>
</template>
</el-table-column>
@ -259,8 +263,13 @@ const handleExport = async () => {
}
}
/** 初始化 **/
onMounted(() => {
getList()
})
</script>
<style scoped>
.role-search-form :deep(.el-form-item__label) {
min-width: 68px;
}
</style>

@ -1,6 +1,6 @@
<template>
<div class="head-container">
<el-input v-model="deptName" class="mb-20px" clearable placeholder="请输入部门名称">
<el-input v-model="deptName" class="mb-20px" clearable :placeholder="t('SystemManagement.Dept.searchNamePlaceholder')">
<template #prefix>
<Icon icon="ep:search" />
</template>
@ -28,6 +28,7 @@ import { defaultProps, handleTree } from '@/utils/tree'
defineOptions({ name: 'SystemUserDeptTree' })
const { t } = useI18n() //
const deptName = ref('')
const deptList = ref<Tree[]>([]) //
const treeRef = ref<InstanceType<typeof ElTree>>()

@ -1,21 +1,21 @@
<template>
<Dialog v-model="dialogVisible" title="分配角色">
<el-form ref="formRef" v-loading="formLoading" :model="formData" label-width="80px">
<el-form-item label="用户名称">
<Dialog v-model="dialogVisible" :title="t('SystemManagement.User.assignRole')">
<el-form ref="formRef" v-loading="formLoading" :model="formData" label-width="auto" class="system-user-assign-role-form">
<el-form-item :label="t('SystemManagement.User.username')">
<el-input v-model="formData.username" :disabled="true" />
</el-form-item>
<el-form-item label="用户昵称">
<el-form-item :label="t('SystemManagement.User.nickname')">
<el-input v-model="formData.nickname" :disabled="true" />
</el-form-item>
<el-form-item label="角色">
<el-select v-model="formData.roleIds" multiple placeholder="请选择角色">
<el-form-item :label="t('SystemManagement.User.role')">
<el-select v-model="formData.roleIds" multiple :placeholder="t('SystemManagement.User.rolePlaceholder')">
<el-option v-for="item in roleList" :key="item.id" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
</el-form>
<template #footer>
<el-button :disabled="formLoading" type="primary" @click="submitForm"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
<el-button :disabled="formLoading" type="primary" @click="submitForm">{{ t('common.ok') }}</el-button>
<el-button @click="dialogVisible = false">{{ t('common.cancel') }}</el-button>
</template>
</Dialog>
</template>

@ -5,19 +5,20 @@
v-loading="formLoading"
:model="formData"
:rules="formRules"
label-width="80px"
label-width="auto"
class="system-user-form"
>
<el-row>
<el-col :span="12">
<el-form-item v-if="formData.id === undefined" label="用户名称" prop="username">
<el-input v-model="formData.username" placeholder="请输入用户名称" />
<el-form-item v-if="formData.id === undefined" :label="t('SystemManagement.User.username')" prop="username">
<el-input v-model="formData.username" :placeholder="t('SystemManagement.User.usernamePlaceholder')" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item v-if="formData.id === undefined" label="用户密码" prop="password">
<el-form-item v-if="formData.id === undefined" :label="t('SystemManagement.User.password')" prop="password">
<el-input
v-model="formData.password"
placeholder="请输入用户密码"
:placeholder="t('SystemManagement.User.passwordPlaceholder')"
show-password
type="password"
/>
@ -26,39 +27,39 @@
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="工号" prop="nickname">
<el-input v-model="formData.nickname" placeholder="请输入工号" />
<el-form-item :label="t('SystemManagement.User.workNo')" prop="nickname">
<el-input v-model="formData.nickname" :placeholder="t('SystemManagement.User.workNoPlaceholder')" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="归属部门" prop="deptId">
<el-form-item :label="t('SystemManagement.User.dept')" prop="deptId">
<el-tree-select
v-model="formData.deptId"
:data="deptList"
:props="defaultProps"
check-strictly
node-key="id"
placeholder="请选择归属部门"
:placeholder="t('SystemManagement.User.deptPlaceholder')"
/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="手机号码" prop="mobile">
<el-input v-model="formData.mobile" maxlength="11" placeholder="请输入手机号码" />
<el-form-item :label="t('SystemManagement.User.mobile')" prop="mobile">
<el-input v-model="formData.mobile" maxlength="11" :placeholder="t('SystemManagement.User.mobilePlaceholder')" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="邮箱" prop="email">
<el-input v-model="formData.email" maxlength="50" placeholder="请输入邮箱" />
<el-form-item :label="t('SystemManagement.User.email')" prop="email">
<el-input v-model="formData.email" maxlength="50" :placeholder="t('SystemManagement.User.emailPlaceholder')" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="用户性别">
<el-select v-model="formData.sex" placeholder="请选择">
<el-form-item :label="t('SystemManagement.User.sex')">
<el-select v-model="formData.sex" :placeholder="t('SystemManagement.User.sexPlaceholder')">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.SYSTEM_USER_SEX)"
:key="dict.value"
@ -69,8 +70,8 @@
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="岗位">
<el-select v-model="formData.postIds" multiple placeholder="请选择">
<el-form-item :label="t('SystemManagement.User.post')">
<el-select v-model="formData.postIds" multiple :placeholder="t('SystemManagement.User.postPlaceholder')">
<el-option
v-for="item in postList"
:key="item.id"
@ -83,15 +84,15 @@
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="备注">
<el-input v-model="formData.remark" placeholder="请输入内容" type="textarea" />
<el-form-item :label="t('SystemManagement.User.remark')">
<el-input v-model="formData.remark" :placeholder="t('SystemManagement.User.remarkPlaceholder')" type="textarea" />
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<el-button :disabled="formLoading" type="primary" @click="submitForm"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
<el-button :disabled="formLoading" type="primary" @click="submitForm">{{ t('common.ok') }}</el-button>
<el-button @click="dialogVisible = false">{{ t('common.cancel') }}</el-button>
</template>
</Dialog>
</template>
@ -128,14 +129,14 @@ const formData = ref({
roleIds: []
})
const formRules = reactive<FormRules>({
username: [{ required: true, message: '用户名称不能为空', trigger: 'blur' }],
nickname: [{ required: true, message: '工号不能为空', trigger: 'blur' }],
password: [{ required: true, message: '用户密码不能为空', trigger: 'blur' }],
deptId: [{ required: true, message: '部门不能为空', trigger: 'blur' }],
username: [{ required: true, message: t('SystemManagement.User.usernameRequired'), trigger: 'blur' }],
nickname: [{ required: true, message: t('SystemManagement.User.workNoRequired'), trigger: 'blur' }],
password: [{ required: true, message: t('SystemManagement.User.passwordRequired'), trigger: 'blur' }],
deptId: [{ required: true, message: t('SystemManagement.User.deptRequired'), trigger: 'blur' }],
email: [
{
type: 'email',
message: '请输入正确的邮箱地址',
message: t('SystemManagement.User.emailInvalid'),
trigger: ['blur', 'change']
}
],
@ -143,7 +144,7 @@ const formRules = reactive<FormRules>({
{
required: true,
pattern: /^(?:(?:\+|00)86)?1(?:3[\d]|4[5-79]|5[0-35-9]|6[5-7]|7[0-8]|8[\d]|9[189])\d{8}$/,
message: '请输入正确的手机号码',
message: t('SystemManagement.User.mobileInvalid'),
trigger: 'blur'
}
]

@ -1,5 +1,5 @@
<template>
<Dialog v-model="dialogVisible" title="用户导入" width="400">
<Dialog v-model="dialogVisible" :title="t('SystemManagement.User.import')" width="400">
<el-upload
ref="uploadRef"
v-model:file-list="fileList"
@ -15,28 +15,30 @@
drag
>
<Icon icon="ep:upload" />
<div class="el-upload__text">将文件拖到此处<em>点击上传</em></div>
<div class="el-upload__text">
{{ t('SystemManagement.User.importDragText') }}<em>{{ t('SystemManagement.User.importClickText') }}</em>
</div>
<template #tip>
<div class="el-upload__tip text-center">
<div class="el-upload__tip">
<el-checkbox v-model="updateSupport" />
是否更新已经存在的用户数据
{{ t('SystemManagement.User.importUpdateSupport') }}
</div>
<span>仅允许导入 xlsxlsx 格式文件</span>
<span>{{ t('SystemManagement.User.importFormatLimit') }}</span>
<el-link
:underline="false"
style="font-size: 12px; vertical-align: baseline"
type="primary"
@click="importTemplate"
>
下载模板
{{ t('SystemManagement.User.importDownloadTemplate') }}
</el-link>
</div>
</template>
</el-upload>
<template #footer>
<el-button :disabled="formLoading" type="primary" @click="submitForm"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
<el-button :disabled="formLoading" type="primary" @click="submitForm">{{ t('common.ok') }}</el-button>
<el-button @click="dialogVisible = false">{{ t('common.cancel') }}</el-button>
</template>
</Dialog>
</template>
@ -47,6 +49,7 @@ import download from '@/utils/download'
defineOptions({ name: 'SystemUserImportForm' })
const { t } = useI18n() //
const message = useMessage() //
const dialogVisible = ref(false) //
@ -70,7 +73,7 @@ defineExpose({ open }) // 提供 open 方法,用于打开弹窗
/** 提交表单 */
const submitForm = async () => {
if (fileList.value.length == 0) {
message.error('请上传文件')
message.error(t('SystemManagement.User.importFileRequired'))
return
}
//
@ -92,15 +95,17 @@ const submitFormSuccess = (response: any) => {
}
//
const data = response.data
let text = '上传成功数量:' + data.createUsernames.length + ';'
let text = t('SystemManagement.User.importSuccessTip', {
createCount: data.createUsernames.length,
updateCount: data.updateUsernames.length,
failureCount: Object.keys(data.failureUsernames).length
})
for (let username of data.createUsernames) {
text += '< ' + username + ' >'
}
text += '更新成功数量:' + data.updateUsernames.length + ';'
for (const username of data.updateUsernames) {
text += '< ' + username + ' >'
}
text += '更新失败数量:' + Object.keys(data.failureUsernames).length + ';'
for (const username in data.failureUsernames) {
text += '< ' + username + ': ' + data.failureUsernames[username] + ' >'
}
@ -113,7 +118,7 @@ const submitFormSuccess = (response: any) => {
/** 上传错误提示 */
const submitFormError = (): void => {
message.error('上传失败,请您重新上传!')
message.error(t('SystemManagement.User.importFailed'))
formLoading.value = false
}
@ -127,7 +132,7 @@ const resetForm = async (): Promise<void> => {
/** 文件数超出提示 */
const handleExceed = (): void => {
message.error('最多只能上传一个文件!')
message.error(t('SystemManagement.User.importFileLimit'))
}
/** 下载模板操作 */

@ -10,43 +10,43 @@
<!-- 搜索 -->
<ContentWrap>
<el-form
class="-mb-15px"
class="-mb-15px system-user-query-form"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
label-width="auto"
>
<el-form-item label="工号" prop="nickname">
<el-form-item :label="t('SystemManagement.User.workNo')" prop="nickname">
<el-input
v-model="queryParams.nickname"
placeholder="请输入工号"
:placeholder="t('SystemManagement.User.searchWorkNoPlaceholder')"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="用户名称" prop="username">
<el-form-item :label="t('SystemManagement.User.username')" prop="username">
<el-input
v-model="queryParams.username"
placeholder="请输入用户名称"
:placeholder="t('SystemManagement.User.searchUsernamePlaceholder')"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="手机号码" prop="mobile">
<el-form-item :label="t('SystemManagement.User.mobile')" prop="mobile">
<el-input
v-model="queryParams.mobile"
placeholder="请输入手机号码"
:placeholder="t('SystemManagement.User.searchMobilePlaceholder')"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="状态" prop="status">
<el-form-item :label="t('SystemManagement.User.status')" prop="status">
<el-select
v-model="queryParams.status"
placeholder="用户状态"
:placeholder="t('SystemManagement.User.searchStatusPlaceholder')"
clearable
class="!w-240px"
>
@ -58,26 +58,26 @@
/>
</el-select>
</el-form-item>
<el-form-item label="创建时间" prop="createTime">
<el-form-item :label="t('SystemManagement.User.createTime')" prop="createTime">
<el-date-picker
v-model="queryParams.createTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="datetimerange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:start-placeholder="t('SystemManagement.User.searchCreateTimeStartPlaceholder')"
:end-placeholder="t('SystemManagement.User.searchCreateTimeEndPlaceholder')"
class="!w-240px"
/>
</el-form-item>
<el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" />搜索</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" />重置</el-button>
<el-button @click="handleQuery"><Icon icon="ep:search" />{{ t('common.query') }}</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" />{{ t('common.reset') }}</el-button>
<el-button
type="primary"
plain
@click="openForm('create')"
v-hasPermi="['system:user:create']"
>
<Icon icon="ep:plus" /> 新增
<Icon icon="ep:plus" /> {{ t('action.add') }}
</el-button>
<el-button
type="warning"
@ -85,7 +85,7 @@
@click="handleImport"
v-hasPermi="['system:user:import']"
>
<Icon icon="ep:upload" /> 导入
<Icon icon="ep:upload" /> {{ t('action.import') }}
</el-button>
<el-button
type="success"
@ -94,7 +94,7 @@
:loading="exportLoading"
v-hasPermi="['system:user:export']"
>
<Icon icon="ep:download" />导出
<Icon icon="ep:download" />{{ t('action.export') }}
</el-button>
</el-form-item>
</el-form>
@ -102,31 +102,31 @@
<ContentWrap>
<el-table v-loading="loading" :data="list">
<el-table-column
label="工号"
:label="t('SystemManagement.User.workNo')"
align="center"
prop="nickname"
:show-overflow-tooltip="true"
/>
<el-table-column
label="用户名称"
:label="t('SystemManagement.User.username')"
align="center"
prop="username"
:show-overflow-tooltip="true"
/>
<el-table-column
label="部门"
:label="t('SystemManagement.User.dept')"
align="center"
key="deptName"
prop="deptName"
:show-overflow-tooltip="true"
/>
<el-table-column label="用户性别" align="center" prop="sex">
<el-table-column :label="t('SystemManagement.User.sex')" align="center" prop="sex">
<template #default="scope">
<dict-tag :type="DICT_TYPE.SYSTEM_USER_SEX" :value="scope.row.sex" />
</template>
</el-table-column>
<el-table-column label="手机号码" align="center" prop="mobile" width="120" />
<el-table-column label="状态" key="status">
<el-table-column :label="t('SystemManagement.User.mobile')" align="center" prop="mobile" width="120" />
<el-table-column :label="t('SystemManagement.User.status')" key="status">
<template #default="scope">
<el-switch
v-model="scope.row.status"
@ -137,13 +137,13 @@
</template>
</el-table-column>
<el-table-column
label="创建时间"
:label="t('SystemManagement.User.createTime')"
align="center"
prop="createTime"
:formatter="dateFormatter"
width="180"
/>
<el-table-column label="操作" align="center" width="160">
<el-table-column :label="t('SystemManagement.User.actions')" align="center" width="200">
<template #default="scope">
<div class="flex items-center justify-center">
<el-button
@ -152,7 +152,7 @@
@click="openForm('update', scope.row.id)"
v-hasPermi="['system:user:update']"
>
<Icon icon="ep:edit" />修改
<Icon icon="ep:edit" />{{ t('action.edit') }}
</el-button>
<el-dropdown
@command="(command) => handleCommand(command, scope.row)"
@ -162,26 +162,26 @@
'system:permission:assign-user-role'
]"
>
<el-button type="primary" link><Icon icon="ep:d-arrow-right" /> 更多</el-button>
<el-button type="primary" link><Icon icon="ep:d-arrow-right" /> {{ t('action.more') }}</el-button>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item
command="handleDelete"
v-if="checkPermi(['system:user:delete'])"
>
<Icon icon="ep:delete" />删除
<Icon icon="ep:delete" />{{ t('action.delete') }}
</el-dropdown-item>
<el-dropdown-item
command="handleResetPwd"
v-if="checkPermi(['system:user:update-password'])"
>
<Icon icon="ep:key" />重置密码
<Icon icon="ep:key" />{{ t('SystemManagement.User.resetPassword') }}
</el-dropdown-item>
<el-dropdown-item
command="handleRole"
v-if="checkPermi(['system:permission:assign-user-role'])"
>
<Icon icon="ep:circle-check" />分配角色
<Icon icon="ep:circle-check" />{{ t('SystemManagement.User.assignRole') }}
</el-dropdown-item>
</el-dropdown-menu>
</template>
@ -239,6 +239,9 @@ const queryParams = reactive({
})
const queryFormRef = ref() //
const resetPasswordLabel = computed(() => t('SystemManagement.User.resetPassword'))
const assignRoleLabel = computed(() => t('SystemManagement.User.assignRole'))
/** 查询列表 */
const getList = async () => {
loading.value = true
@ -285,8 +288,8 @@ const handleImport = () => {
const handleStatusChange = async (row: UserApi.UserVO) => {
try {
//
const text = row.status === CommonStatusEnum.ENABLE ? '启用' : '停用'
await message.confirm('确认要"' + text + '""' + row.username + '"用户吗?')
const text = row.status === CommonStatusEnum.ENABLE ? t('common.enable') : t('common.disable')
await message.confirm(t('SystemManagement.User.changeStatusConfirm', { action: text, username: row.username }))
//
await UserApi.updateUserStatus(row.id, row.status)
//

Loading…
Cancel
Save