Unverified Commit 09a64ad8 authored by zhu-mingye's avatar zhu-mingye Committed by GitHub

[Feature][web] Realize the internationalization of the authentication center (#1098)

* AuthenticationCenter internationalization(us)

* AuthenticationCenter internationalization(zh)
parent 89153c7c
...@@ -22,4 +22,26 @@ export default { ...@@ -22,4 +22,26 @@ export default {
'button.close': 'Close', 'button.close': 'Close',
'button.confirm': 'Confirm', 'button.confirm': 'Confirm',
'button.cancel': 'Cancel', 'button.cancel': 'Cancel',
'button.finish': 'Finish',
'button.save': 'Save',
'button.delete': 'Delete',
'button.batchDelete': 'Batch Delete',
'button.batchEnable': 'Batch Enable',
'button.batchDisable': 'Batch Disable',
'button.more': 'More',
'button.config': 'Config',
'button.edit': 'Edit',
'button.assignUser': 'Assign Users',
'button.assignRole': 'Assign Role',
'button.changePassword': 'Change Password',
'button.enable': 'Enable',
'button.disable': 'Disable',
'tips.selected': 'Selected',
'tips.notSelected': 'Not Select',
'tips.item': 'Item',
'status.enabled': 'Enabled',
'status.disabled': 'Disabled',
}; };
...@@ -60,17 +60,21 @@ export default { ...@@ -60,17 +60,21 @@ export default {
'menu.exception.server-error': '500', 'menu.exception.server-error': '500',
'menu.exception.trigger': 'Trigger', 'menu.exception.trigger': 'Trigger',
'menu.account': 'Account', 'menu.account': 'Account',
'menu.account.center': 'Account Center',
'menu.account.settings': 'Account Settings',
'menu.account.trigger': 'Trigger Error', 'menu.account.trigger': 'Trigger Error',
'menu.account.logout': 'Logout',
'menu.account.checkTenant': 'Check Tenant',
'menu.account.changePassword': 'Change Password',
'menu.editor': 'Graphic Editor', 'menu.editor': 'Graphic Editor',
'menu.editor.flow': 'Flow Editor', 'menu.editor.flow': 'Flow Editor',
'menu.editor.mind': 'Mind Editor', 'menu.editor.mind': 'Mind Editor',
'menu.editor.koni': 'Koni Editor', 'menu.editor.koni': 'Koni Editor',
// ------------------------------------------------------------------------------
'menu.account.center': 'Account Center',
'menu.account.settings': 'Account Settings',
'menu.account.changePassword': 'Change Password',
'menu.account.checkTenant': 'Check Tenant',
'menu.account.logout': 'Logout',
'menu.datastudio': 'Data Studio', 'menu.datastudio': 'Data Studio',
'menu.devops': 'Devops', 'menu.devops': 'Devops',
......
...@@ -69,82 +69,143 @@ export default { ...@@ -69,82 +69,143 @@ export default {
'pages.searchTable.batchDeletion': 'Bacth Deletion', 'pages.searchTable.batchDeletion': 'Bacth Deletion',
'pages.searchTable.batchApproval': 'Batch Approval', 'pages.searchTable.batchApproval': 'Batch Approval',
'pages.devops.jobstatus.CREATED' : 'Created',
'pages.devops.jobstatus.INITIALIZING' : 'Initialize', 'pages.operate': 'Operation', // all table list of operation columns is use this item
'pages.devops.jobstatus.RUNNING' : 'Running',
'pages.devops.jobstatus.FINISHED' : 'Finished',
'pages.devops.jobstatus.FAILING' : 'Abnormal', 'pages.devops.jobstatus.CREATED': 'Created',
'pages.devops.jobstatus.FAILED' : 'Failed', 'pages.devops.jobstatus.INITIALIZING': 'Initialize',
'pages.devops.jobstatus.SUSPENDED' : 'Paused', 'pages.devops.jobstatus.RUNNING': 'Running',
'pages.devops.jobstatus.CANCELLING' : 'Canceling', 'pages.devops.jobstatus.FINISHED': 'Finished',
'pages.devops.jobstatus.CANCELED' : 'Canceled', 'pages.devops.jobstatus.FAILING': 'Abnormal',
'pages.devops.jobstatus.RESTARTING' : 'Restarting', 'pages.devops.jobstatus.FAILED': 'Failed',
'pages.devops.jobstatus.UNKNOWN' : 'Unknown', 'pages.devops.jobstatus.SUSPENDED': 'Paused',
'pages.devops.jobstatus.CANCELLING': 'Canceling',
'pages.devops.LastUpdateTime' : 'LastUpdateTime', 'pages.devops.jobstatus.CANCELED': 'Canceled',
'pages.devops.jobstatus.RESTARTING': 'Restarting',
'pages.settings.UserManagement' : 'User Management', 'pages.devops.jobstatus.UNKNOWN': 'Unknown',
'pages.settings.Flink' : 'Flink Setting',
'pages.settings.FlinkURL' : 'Submit the Jar file path to FlinkSQL', 'pages.devops.LastUpdateTime': 'LastUpdateTime',
'pages.settings.FlinkSQLJarMainParameter' : 'Submit The Main Class entry To the Jar For FlinkSQL', 'pages.settings.UserManagement': 'User Management',
'pages.settings.FlinkSQLJarMainClass' : 'The Main Class Of The Jar That Submitted FlinkSQL', 'pages.settings.Flink': 'Flink Setting',
'pages.settings.FlinkRestAPI' : 'Using Rest API', 'pages.settings.FlinkURL': 'Submit the Jar file path to FlinkSQL',
'pages.settings.FlinkURLSplit' : 'FlinkSQL Statement Separator',
'pages.settings.FlinkSQLLogic' : 'Calculate Consanguinity Using A Logical Plan', 'pages.settings.FlinkSQLJarMainParameter': 'Submit The Main Class entry To the Jar For FlinkSQL',
'pages.settings.FlinkJobID' : 'Maximum Waiting Time For Getting A Job ID (seconds)', 'pages.settings.FlinkSQLJarMainClass': 'The Main Class Of The Jar That Submitted FlinkSQL',
'pages.settings.FlinkNoSetting' : 'Not Setting', 'pages.settings.FlinkRestAPI': 'Using Rest API',
'pages.settings.FlinkNoUseSetting' : 'After The Flink Task Is Enabled, Operations Such As Savepoint And Stop Are Performed Through The RestAPI Of JobManager', 'pages.settings.FlinkURLSplit': 'FlinkSQL Statement Separator',
'pages.settings.FlinkLogic' : 'Whether The Calculation Of Field Consanguinity Analysis For Flink Tasks Is Based On A Logical Plan Is Supported Only In Version 1.14', 'pages.settings.FlinkSQLLogic': 'Calculate Consanguinity Using A Logical Plan',
'pages.settings.FlinkJobID': 'Maximum Waiting Time For Getting A Job ID (seconds)',
'pages.settings.FlinkUpdate' : 'Update', 'pages.settings.FlinkNoSetting': 'Not Setting',
'pages.settings.FlinkSave' : 'Save', 'pages.settings.FlinkNoUseSetting': 'After The Flink Task Is Enabled, Operations Such As Savepoint And Stop Are Performed Through The RestAPI Of JobManager',
'pages.settings.FlinkCancel' : 'Cancel', 'pages.settings.FlinkLogic': 'Whether The Calculation Of Field Consanguinity Analysis For Flink Tasks Is Based On A Logical Plan Is Supported Only In Version 1.14',
'pages.settings.FlinkUse' : 'In Use',
'pages.settings.FlinkNotUse' : 'Not Use', 'pages.settings.FlinkUpdate': 'Update',
'pages.settings.FlinkSave': 'Save',
'pages.user.UserEdit' : 'Edit', 'pages.settings.FlinkCancel': 'Cancel',
'pages.user.UserDelete' : 'Delete', 'pages.settings.FlinkUse': 'In Use',
'pages.user.UserChangePassword' : 'Update Password', 'pages.settings.FlinkNotUse': 'Not Use',
'pages.user.UserConfig' : 'Config',
'pages.user.UserMore' : 'More',
'pages.user.UserManger': 'User Management',
'pages.user.UserCreate' : 'Create', 'pages.user.UserName': 'User Name',//用户名
'pages.user.UserManger' : 'User Management', 'pages.user.UserJobNumber': 'Job Number',//工号
'pages.user.UserName' : 'User Name',//用户名 'pages.user.UserPhoneNumber': 'Phone Number',//手机号
'pages.user.UserJobNumber' : 'Job Number',//工号 'pages.user.UserNickName': 'Nick Name',//昵称
'pages.user.UserPhoneNumber' : 'Phone Number',//手机号 'pages.user.UserIsUse': 'Is Enable',//是否启用
'pages.user.UserNickName' : 'Nick Name',//昵称 'pages.user.UserUpdateTime': 'Update Time',//最近更新时间
'pages.user.UserIsUse' : 'Is Use',//是否启用 'pages.user.UserCreateTime': 'Create Time',//创建时间
'pages.user.UserUpdateTime' : 'Update Time',//最近更新时间
'pages.user.UserOperate' : 'Operate',//操作 'pages.user.UserDeleteUser': 'Delete User',
'pages.user.UserInUse' : 'In Use',//已启用 'pages.user.UserCreateUser': 'Create User',
'pages.user.UserNotUse' : 'Not Use',//已禁用 'pages.user.UserUpdateUser': 'Update User',
'pages.user.UserCreateTime' : 'Create Time',//创建时间 'pages.user.AssignRole': 'Assign Role',
'pages.user.delete': 'Delete User',
'pages.user.UserComplete' : 'Complete', 'pages.user.deleteConfirm': 'Are you sure you want to delete this User?',
'pages.user.UserConfirm' : 'Confirm', 'pages.user.enable': 'Enable User',
'pages.user.UserCancel' : 'Cancel', 'pages.user.enableConfirm': 'Are you sure you want to enable this User?',
'pages.user.UserDeleteUser' : 'Delete User', 'pages.user.disable': 'Disable User',
'pages.user.UserCreateUser' : 'Create User', 'pages.user.disableConfirm': 'Are you sure you want to disable this User?',
'pages.user.UserUpdateUser' : 'Update User', 'pages.user.UserEnterUserName': 'Please enter user name',
'pages.user.UserEnterUserName' : 'Please enter user name', 'pages.user.UserEnterUniqueUserName': 'Please enter unique user name',
'pages.user.UserEnterUniqueUserName' : 'Please enter unique user name', 'pages.user.UserEnterJobNumber': 'Please enter job number',
'pages.user.UserEnterJobNumber' : 'Please enter job number', 'pages.user.UserEnterNickName': 'Please enter nickname',
'pages.user.UserEnterNickName' : 'Please enter nickname', 'pages.user.UserEnterPhoneNumber': 'Please enter phone number',
'pages.user.UserEnterPhoneNumber' : 'Please enter phone number', 'pages.user.UserOldPassword': 'Old Password',
'pages.user.UserOldPassword' : 'Old Password', 'pages.user.UserNewPassword': 'New Password',
'pages.user.UserNewPassword' : 'New Password', 'pages.user.UserRepeatNewPassword': 'Repeat New Password',
'pages.user.UserRepeatNewPassword' : 'Repeat New Password', 'pages.user.UserEnterOldPassword': 'Please enter old password',
'pages.user.UserEnterOldPassword' : 'Please enter old password', 'pages.user.UserEnterNewPassword': 'Please enter new password',
'pages.user.UserEnterNewPassword' : 'Please enter new password', 'pages.user.UserEnterRepeatNewPassword': 'Please enter repeat new password',
'pages.user.UserEnterRepeatNewPassword' : 'Please enter repeat new password', 'pages.user.UserNewPasswordNotMatch': 'The new passwords do not match',
'pages.user.UserNewPasswordNotMatch' : 'The new passwords do not match', 'pages.user.disableTotalOf': 'Total Of ',
'pages.user.UserUpdatePassword' : 'Update Password', 'pages.user.selectDisable': 'User Is Disabled ',
'pages.regist.openAPI' : 'openAPI Document', 'pages.tenant.TenantManager': 'Tenant Management',
'pages.regist.BusinessComponent' : 'Business Component Document', 'pages.tenant.TenantCode': 'Tenant Code',
'pages.tenant.Note': 'Note',
'pages.tenant.CreateTime': 'Create Time',
'pages.tenant.UpdateTime': 'Update Time',
'pages.tenant.AssignUser': 'Assign Users',
'pages.tenant.assignUser.pleaseHolder': 'Please enter username/nickname Search',
'pages.tenant.create': 'Create Tenant',
'pages.tenant.update': 'Update Tenant',
'pages.tenant.EnterTenantCode': 'Please enter Tenant Code!',
'pages.tenant.EnterTenantNote': 'Please enter Tenant Note!',
'pages.tenant.delete': 'Delete Tenant',
'pages.tenant.deleteConfirm': 'Are you sure you want to delete this Tenant?',
'pages.tenant.enable': 'Enable Tenant',
'pages.tenant.enableConfirm': 'Are you sure you want to enable this Tenant?',
'pages.tenant.disable': 'Disable Tenant',
'pages.tenant.disableConfirm': 'Are you sure you want to disable this Tenant?',
'pages.nameSpace.NameSpaceManagement': 'NameSpace Management',
'pages.nameSpace.NameSpaceCode': 'NameSpace Code',
'pages.nameSpace.belongTenant': 'Belong Tenant',
'pages.nameSpace.enable': 'Is Enable',
'pages.nameSpace.note': 'Note',
'pages.nameSpace.createTime': 'Create Time',
'pages.nameSpace.updateTime': 'Update Time',
'pages.nameSpace.deleteNameSpace': 'Delete NameSpace',
'pages.nameSpace.deleteNameSpaceConfirm': 'Are you sure you want to delete this NameSpace?',
'pages.nameSpace.enableNameSpace': 'Enable NameSpace',
'pages.nameSpace.enableNameSpaceConfirm': 'Are you sure you want to enable this NameSpace?',
'pages.nameSpace.disableNameSpace': 'Disable NameSpace',
'pages.nameSpace.disableNameSpaceConfirm': 'Are you sure you want to disable this NameSpace?',
'pages.nameSpace.create': 'Create NameSpace',
'pages.nameSpace.update': 'Update NameSpace',
'pages.nameSpace.EnterNameSpaceCode': 'Please enter NameSpace Code!',
'pages.nameSpace.EnterNameSpaceNote': 'Please enter NameSpace Note!',
'pages.nameSpace.disableTotalOf': 'Total Of ',
'pages.nameSpace.selectDisable': 'Namespace Is Disabled ',
'pages.role.roleManagement': 'Role Management',
'pages.role.roleCode': 'Role Code',
'pages.role.roleName': 'Role Name',
'pages.role.namespaceIds': 'Namespace',
'pages.role.note': 'Note',
'pages.role.belongTenant': 'Belong Tenant',
'pages.role.createTime': 'Create Time',
'pages.role.updateTime': 'Update Time',
'pages.role.create': 'Create Role',
'pages.role.update': 'Update Role',
'pages.role.EnterRoleCode': 'Please enter Role Code!',
'pages.role.EnterRoleName': 'Please enter Role Name!',
'pages.role.selectNameSpace': 'Please select NameSpace!',
'pages.role.EnterNote': 'Please enter Role Note!',
'pages.role.delete': 'Delete Role',
'pages.role.deleteConfirm': 'Are you sure you want to delete this Role?',
'pages.role.enable': 'Enable Role',
'pages.role.enableConfirm': 'Are you sure you want to enable this Role?',
'pages.role.disable': 'Disable Role',
'pages.role.disableConfirm': 'Are you sure you want to disable this Role?',
'pages.regist.openAPI': 'openAPI Document',
'pages.regist.BusinessComponent': 'Business Component Document',
'pages.matedata.NoDatabaseSelected' : 'No database selected', 'pages.matedata.NoDatabaseSelected' : 'No database selected',
'pages.matedata.Application' : 'Application', 'pages.matedata.Application' : 'Application',
......
...@@ -22,4 +22,27 @@ export default { ...@@ -22,4 +22,27 @@ export default {
'button.close': '关闭', 'button.close': '关闭',
'button.confirm': '确定', 'button.confirm': '确定',
'button.cancel': '取消', 'button.cancel': '取消',
'button.finish': '完成',
'button.save': '保存',
'button.delete': '删除',
'button.batchDelete': '批量删除',
'button.batchEnable': '批量启用',
'button.batchDisable': '批量禁用',
'button.more': '更多',
'button.config': '配置',
'button.edit': '编辑',
'button.assignUser': '分配用户',
'button.assignRole': '分配角色',
'button.changePassword': '修改密码',
'button.enable': '启用',
'button.disable': '禁用',
'tips.selected': '已选择',
'tips.notSelected': '未选',
'tips.item': '项',
'status.enabled': '已启用',
'status.disabled': '已禁用',
}; };
...@@ -60,12 +60,7 @@ export default { ...@@ -60,12 +60,7 @@ export default {
'menu.exception.server-error': '500', 'menu.exception.server-error': '500',
'menu.exception.trigger': '触发错误', 'menu.exception.trigger': '触发错误',
'menu.account': '个人页', 'menu.account': '个人页',
'menu.account.center': '个人中心',
'menu.account.settings': '个人设置',
'menu.account.trigger': '触发报错', 'menu.account.trigger': '触发报错',
'menu.account.logout': '退出登录',
'menu.account.changePassword': '修改密码',
'menu.account.checkTenant': '切换租户',
'menu.editor': '图形编辑器', 'menu.editor': '图形编辑器',
'menu.editor.flow': '流程编辑器', 'menu.editor.flow': '流程编辑器',
'menu.editor.mind': '脑图编辑器', 'menu.editor.mind': '脑图编辑器',
...@@ -77,6 +72,14 @@ export default { ...@@ -77,6 +72,14 @@ export default {
'menu.dev.ant-design.docs': '官方文档', 'menu.dev.ant-design.docs': '官方文档',
'menu.dev.ant-design.preview': '官方预览', 'menu.dev.ant-design.preview': '官方预览',
// ------------------------------------------------------------------------------
'menu.account.center': '个人中心',
'menu.account.settings': '个人设置',
'menu.account.changePassword': '修改密码',
'menu.account.checkTenant': '切换租户',
'menu.account.logout': '退出登录',
'menu.datastudio': '数据开发', 'menu.datastudio': '数据开发',
......
...@@ -88,4 +88,142 @@ export default { ...@@ -88,4 +88,142 @@ export default {
'pages.searchTable.tenThousand': '万', 'pages.searchTable.tenThousand': '万',
'pages.searchTable.batchDeletion': '批量删除', 'pages.searchTable.batchDeletion': '批量删除',
'pages.searchTable.batchApproval': '批量审批', 'pages.searchTable.batchApproval': '批量审批',
// ------------------------------------------------------------------------------
'pages.operate': '操作', // all table list of operation columns is use this item
'pages.devops.jobstatus.CREATED': '已创建',
'pages.devops.jobstatus.INITIALIZING': '初始化中',
'pages.devops.jobstatus.RUNNING': '运行中',
'pages.devops.jobstatus.FINISHED': '已完成',
'pages.devops.jobstatus.FAILING': '异常中',
'pages.devops.jobstatus.FAILED': '已失败',
'pages.devops.jobstatus.SUSPENDED': '已暂停',
'pages.devops.jobstatus.CANCELLING': '取消中',
'pages.devops.jobstatus.CANCELED': '已取消',
'pages.devops.jobstatus.RESTARTING': '重启中',
'pages.devops.jobstatus.UNKNOWN': '未知',
'pages.devops.LastUpdateTime': '最后更新时间',
'pages.settings.UserManagement': '用户管理',
'pages.settings.Flink': 'Flink 设置',
'pages.settings.FlinkURL': '提交 Jar 文件路径到 FlinkSQL',
'pages.settings.FlinkSQLJarMainParameter': '将主类条目提交到 FlinkSQL 的 Jar',
'pages.settings.FlinkSQLJarMainClass': '提交FlinkSQL的Jar主类',
'pages.settings.FlinkRestAPI': '使用 Rest API',
'pages.settings.FlinkURLSplit': 'FlinkSQL 语句分隔符',
'pages.settings.FlinkSQLLogic': '使用逻辑计划计算血缘关系',
'pages.settings.FlinkJobID': '获取作业 ID 的最长等待时间(秒)',
'pages.settings.FlinkNoSetting': '未设置',
'pages.settings.FlinkNoUseSetting': 'Flink任务开启后,通过 JobManager 的 RestAPI 进行 Savepoint、Stop等操作',
'pages.settings.FlinkLogic': 'Flink 任务的字段血缘分析计算是否基于逻辑计划 , 仅在 1.14 版本中支持',
'pages.settings.FlinkUpdate': '修改',
'pages.settings.FlinkSave': '保存',
'pages.settings.FlinkCancel': '返回',
'pages.settings.FlinkUse': '启用',
'pages.settings.FlinkNotUse': '禁用',
'pages.user.UserManger': '用户管理',
'pages.user.UserName': '用户名',//用户名
'pages.user.UserJobNumber': '工号',//工号
'pages.user.UserPhoneNumber': '手机号',//手机号
'pages.user.UserNickName': '昵称',//昵称
'pages.user.UserIsUse': '是否启用',//是否启用
'pages.user.UserUpdateTime': '最近更新时间',//最近更新时间
'pages.user.UserCreateTime': '创建时间',//创建时间
'pages.user.UserDeleteUser': '删除用户',
'pages.user.UserCreateUser': '添加用户',
'pages.user.UserUpdateUser': '修改用户',
'pages.user.AssignRole': '分配角色',
'pages.user.delete': '删除用户',
'pages.user.deleteConfirm': '您确定要删除此用户吗?',
'pages.user.enable': '启用用户',
'pages.user.enableConfirm': '您确定要启用此用户吗?',
'pages.user.disable': '禁用用户',
'pages.user.disableConfirm': '您确定要禁用此用户吗?',
'pages.user.UserEnterUserName': '请输入用户名',
'pages.user.UserEnterUniqueUserName': '请输入唯一的用户名',
'pages.user.UserEnterJobNumber': '请输入工号',
'pages.user.UserEnterNickName': '请输入昵称',
'pages.user.UserEnterPhoneNumber': '请输入手机号',
'pages.user.UserOldPassword': '旧密码',
'pages.user.UserNewPassword': '新密码',
'pages.user.UserRepeatNewPassword': '重复新密码',
'pages.user.UserEnterOldPassword': '请输入旧密码',
'pages.user.UserEnterNewPassword': '请输入新密码',
'pages.user.UserEnterRepeatNewPassword': '请重复输入新密码',
'pages.user.UserNewPasswordNotMatch': '两次输入的新密码不一致',
'pages.user.disableTotalOf': '被禁用的用户共 ',
'pages.user.selectDisable': ' 个',
'pages.tenant.TenantManager': '租户管理',
'pages.tenant.TenantCode': '租户编码',
'pages.tenant.Note': '备注/描述',
'pages.tenant.CreateTime': '创建时间',
'pages.tenant.UpdateTime': '最后更新时间',
'pages.tenant.AssignUser': '分配用户',
'pages.tenant.create': '创建租户',
'pages.tenant.update': '修改租户',
'pages.tenant.EnterTenantCode': '请输入租户编码!',
'pages.tenant.EnterTenantNote': '请输入租户备注/描述信息!',
'pages.tenant.delete': '删除租户',
'pages.tenant.deleteConfirm': '您确定要删除此租户吗?',
'pages.tenant.enable': '启用租户',
'pages.tenant.enableConfirm': '您确定要启用此租户吗?',
'pages.tenant.disable': '禁用租户',
'pages.tenant.disableConfirm': '您确定要禁用此租户吗?',
'pages.nameSpace.NameSpaceManagement': '命名空间管理',
'pages.nameSpace.NameSpaceCode': '命名空间编码',
'pages.nameSpace.belongTenant': '所属租户',
'pages.nameSpace.enable': '是否启用',
'pages.nameSpace.note': '备注/描述',
'pages.nameSpace.createTime': '创建时间',
'pages.nameSpace.updateTime': '最后更新时间',
'pages.nameSpace.deleteNameSpace': '删除命名空间',
'pages.nameSpace.deleteNameSpaceConfirm': '您确定要删除此命名空间吗?',
'pages.nameSpace.enableNameSpace': '启用命名空间',
'pages.nameSpace.enableNameSpaceConfirm': '您确定要启用此命名空间吗?',
'pages.nameSpace.disableNameSpace': '禁用命名空间',
'pages.nameSpace.disableNameSpaceConfirm': '您确定要禁用此命名空间吗?',
'pages.nameSpace.create': '创建命名空间',
'pages.nameSpace.update': '修改命名空间',
'pages.nameSpace.EnterNameSpaceCode': '请输入命名空间编码!',
'pages.nameSpace.EnterNameSpaceNote': '请输入命名空间的备注/描述信息!',
'pages.nameSpace.disableTotalOf': '被禁用的命名空间共 ',
'pages.nameSpace.selectDisable': '个',
'pages.role.roleManagement': '角色管理',
'pages.role.roleCode': '角色编码',
'pages.role.roleName': '角色名称',
'pages.role.namespaceIds': '命名空间',
'pages.role.note': '备注/描述',
'pages.role.belongTenant': '所属租户',
'pages.role.createTime': '创建时间',
'pages.role.updateTime': '最后更新时间',
'pages.role.create': '创建角色',
'pages.role.update': '修改角色',
'pages.role.EnterRoleCode': '请输入角色编码!',
'pages.role.EnterRoleName': '请输入角色名称!',
'pages.role.selectNameSpace': '请选择命名空间!',
'pages.role.EnterNote': '请输入角色的备注/描述信息!',
'pages.role.delete': '删除角色',
'pages.role.deleteConfirm': '您确定要删除此角色吗?',
'pages.role.enable': '启用角色',
'pages.role.enableConfirm': '您确定要启用此角色吗?',
'pages.role.disable': '禁用角色',
'pages.role.disableConfirm': '您确定要禁用此角色吗?',
'pages.regist.openAPI': 'OpenAPI 文档',
'pages.regist.BusinessComponent': '业务组件文档',
}; };
...@@ -22,6 +22,7 @@ import React, {useState} from 'react'; ...@@ -22,6 +22,7 @@ import React, {useState} from 'react';
import {Button, Form, Input, Modal, Switch} from 'antd'; import {Button, Form, Input, Modal, Switch} from 'antd';
import {NameSpaceTableListItem} from "@/pages/AuthenticationCenter/data.d"; import {NameSpaceTableListItem} from "@/pages/AuthenticationCenter/data.d";
import {getStorageTenantId} from "@/components/Common/crud"; import {getStorageTenantId} from "@/components/Common/crud";
import {useIntl} from "@@/plugin-locale/localeExports";
export type TenantFormProps = { export type TenantFormProps = {
onCancel: (flag?: boolean) => void; onCancel: (flag?: boolean) => void;
...@@ -37,6 +38,9 @@ const formLayout = { ...@@ -37,6 +38,9 @@ const formLayout = {
const NameSpaceForm: React.FC<TenantFormProps> = (props) => { const NameSpaceForm: React.FC<TenantFormProps> = (props) => {
const international = useIntl();
const l = (key: string, defaultMsg?: string) => international.formatMessage({id: key, defaultMessage: defaultMsg})
const [form] = Form.useForm(); const [form] = Form.useForm();
const [formVals, setFormVals] = useState<Partial<NameSpaceTableListItem>>({ const [formVals, setFormVals] = useState<Partial<NameSpaceTableListItem>>({
id: props.values?.id, id: props.values?.id,
...@@ -57,8 +61,8 @@ const NameSpaceForm: React.FC<TenantFormProps> = (props) => { ...@@ -57,8 +61,8 @@ const NameSpaceForm: React.FC<TenantFormProps> = (props) => {
const submitForm = async () => { const submitForm = async () => {
const fieldsValue = await form.validateFields(); const fieldsValue = await form.validateFields();
fieldsValue.id = formVals.id; fieldsValue.id = formVals.id;
setFormVals({...formVals,...fieldsValue}); setFormVals({...formVals, ...fieldsValue});
handleSubmit({...formVals,...fieldsValue}); handleSubmit({...formVals, ...fieldsValue});
}; };
const renderContent = (formValsPara: Partial<NameSpaceTableListItem>) => { const renderContent = (formValsPara: Partial<NameSpaceTableListItem>) => {
...@@ -66,28 +70,28 @@ const NameSpaceForm: React.FC<TenantFormProps> = (props) => { ...@@ -66,28 +70,28 @@ const NameSpaceForm: React.FC<TenantFormProps> = (props) => {
<> <>
<Form.Item <Form.Item
name="namespaceCode" name="namespaceCode"
label="命名空间编号" label={l('pages.nameSpace.NameSpaceCode')}
rules={[{required: true, message: '请输入命名空间唯一编码!'}]}> rules={[{required: true, message: l('pages.nameSpace.EnterNameSpaceCode')}]}>
<Input placeholder="请输入命名空间唯一编码"/> <Input placeholder={l('pages.nameSpace.EnterNameSpaceCode')}/>
</Form.Item> </Form.Item>
<Form.Item <Form.Item
hidden={true} hidden={true}
name="tenantId" name="tenantId"
label="所属租户" label={l('pages.nameSpace.belongTenant')}
> >
<Input disabled defaultValue={getStorageTenantId()}/> <Input disabled defaultValue={getStorageTenantId()}/>
</Form.Item> </Form.Item>
<Form.Item <Form.Item
name="note" name="note"
label="注释" label={l('pages.nameSpace.note')}
> >
<Input.TextArea placeholder="请输入描述信息" allowClear <Input.TextArea placeholder={l('pages.nameSpace.EnterNameSpaceNote')} allowClear
autoSize={{minRows: 3, maxRows: 10}}/> autoSize={{minRows: 3, maxRows: 10}}/>
</Form.Item> </Form.Item>
<Form.Item <Form.Item
name="enabled" name="enabled"
label="是否启用"> label={l('pages.nameSpace.enable')}>
<Switch checkedChildren="启用" unCheckedChildren="禁用" <Switch checkedChildren={l('status.enabled')} unCheckedChildren={l('status.disabled')}
defaultChecked={formValsPara.enabled}/> defaultChecked={formValsPara.enabled}/>
</Form.Item> </Form.Item>
</> </>
...@@ -97,9 +101,9 @@ const NameSpaceForm: React.FC<TenantFormProps> = (props) => { ...@@ -97,9 +101,9 @@ const NameSpaceForm: React.FC<TenantFormProps> = (props) => {
const renderFooter = () => { const renderFooter = () => {
return ( return (
<> <>
<Button onClick={() => handleModalVisible(false)}>取消</Button> <Button onClick={() => handleModalVisible(false)}> {l('button.cancel')}</Button>
<Button type="primary" onClick={() => submitForm()}> <Button type="primary" onClick={() => submitForm()}>
完成 {l('button.finish')}
</Button> </Button>
</> </>
); );
...@@ -110,7 +114,7 @@ const NameSpaceForm: React.FC<TenantFormProps> = (props) => { ...@@ -110,7 +114,7 @@ const NameSpaceForm: React.FC<TenantFormProps> = (props) => {
width={640} width={640}
bodyStyle={{padding: '32px 40px 48px'}} bodyStyle={{padding: '32px 40px 48px'}}
destroyOnClose destroyOnClose
title={formVals.id ? "修改命名空间" : "创建命名空间"} title={formVals.id ? l('pages.nameSpace.update') : l('pages.nameSpace.create')}
visible={modalVisible} visible={modalVisible}
footer={renderFooter()} footer={renderFooter()}
onCancel={() => handleModalVisible()} onCancel={() => handleModalVisible()}
......
...@@ -27,6 +27,7 @@ import ProDescriptions from '@ant-design/pro-descriptions'; ...@@ -27,6 +27,7 @@ import ProDescriptions from '@ant-design/pro-descriptions';
import {handleAddOrUpdate, handleRemove, queryData, updateEnabled} from "@/components/Common/crud"; import {handleAddOrUpdate, handleRemove, queryData, updateEnabled} from "@/components/Common/crud";
import {NameSpaceTableListItem} from "@/pages/AuthenticationCenter/data.d"; import {NameSpaceTableListItem} from "@/pages/AuthenticationCenter/data.d";
import NameSpaceForm from "@/pages/AuthenticationCenter/NamespaceManager/components/NameSpaceForm"; import NameSpaceForm from "@/pages/AuthenticationCenter/NamespaceManager/components/NameSpaceForm";
import {useIntl} from "@@/plugin-locale/localeExports";
const url = '/api/namespace'; const url = '/api/namespace';
...@@ -38,16 +39,19 @@ const NameSpaceFormList: React.FC<{}> = (props: any) => { ...@@ -38,16 +39,19 @@ const NameSpaceFormList: React.FC<{}> = (props: any) => {
const actionRef = useRef<ActionType>(); const actionRef = useRef<ActionType>();
const [selectedRowsState, setSelectedRows] = useState<NameSpaceTableListItem[]>([]); const [selectedRowsState, setSelectedRows] = useState<NameSpaceTableListItem[]>([]);
const international = useIntl();
const l = (key: string, defaultMsg?: string) => international.formatMessage({id: key, defaultMessage: defaultMsg})
const editAndDelete = (key: string | number, currentItem: NameSpaceTableListItem) => { const editAndDelete = (key: string | number, currentItem: NameSpaceTableListItem) => {
if (key === 'edit') { if (key === 'edit') {
handleUpdateModalVisible(true); handleUpdateModalVisible(true);
setFormValues(currentItem); setFormValues(currentItem);
} else if (key === 'delete') { } else if (key === 'delete') {
Modal.confirm({ Modal.confirm({
title: '删除命名空间', title: l('pages.nameSpace.deleteNameSpace', '默认'),
content: '确定删除该命名空间吗?', content: l('pages.nameSpace.deleteNameSpaceConfirm'),
okText: '确认', okText: l('button.confirm'),
cancelText: '取消', cancelText: l('button.cancel'),
onOk: async () => { onOk: async () => {
await handleRemove(url, [currentItem]); await handleRemove(url, [currentItem]);
actionRef.current?.reloadAndRest?.(); actionRef.current?.reloadAndRest?.();
...@@ -62,13 +66,13 @@ const NameSpaceFormList: React.FC<{}> = (props: any) => { ...@@ -62,13 +66,13 @@ const NameSpaceFormList: React.FC<{}> = (props: any) => {
<Dropdown <Dropdown
overlay={ overlay={
<Menu onClick={({key}) => editAndDelete(key, item)}> <Menu onClick={({key}) => editAndDelete(key, item)}>
<Menu.Item key="edit">编辑</Menu.Item> <Menu.Item key="edit">{l('button.edit')}</Menu.Item>
<Menu.Item key="delete">删除</Menu.Item> <Menu.Item key="delete">{l('button.delete')}</Menu.Item>
</Menu> </Menu>
} }
> >
<a> <a>
更多 <DownOutlined/> {l('button.more')} <DownOutlined/>
</a> </a>
</Dropdown> </Dropdown>
); );
...@@ -85,60 +89,60 @@ const NameSpaceFormList: React.FC<{}> = (props: any) => { ...@@ -85,60 +89,60 @@ const NameSpaceFormList: React.FC<{}> = (props: any) => {
}, },
}, },
{ {
title: '命名空间编码', title: l('pages.nameSpace.NameSpaceCode'),
dataIndex: 'namespaceCode', dataIndex: 'namespaceCode',
render: (dom, entity) => { render: (dom, entity) => {
return <a onClick={() => setRow(entity)}>{dom}</a>; return <a onClick={() => setRow(entity)}>{dom}</a>;
}, },
}, },
{ {
title: '所属租户', title: l('pages.nameSpace.belongTenant'),
hideInSearch: true, hideInSearch: true,
render: (dom, entity) => { render: (dom, entity) => {
return entity.tenant.tenantCode; return entity.tenant.tenantCode;
}, },
}, },
{ {
title: '是否启用', title: l('pages.nameSpace.enable'),
dataIndex: 'enabled', dataIndex: 'enabled',
hideInTable: false, hideInTable: false,
hideInSearch: true, hideInSearch: true,
filters: [ filters: [
{ {
text: '已启用', text: l('status.enabled'),
value: 1, value: 1,
}, },
{ {
text: '未启用', text: l('status.disabled'),
value: 0, value: 0,
}, },
], ],
filterMultiple: false, filterMultiple: false,
valueEnum: { valueEnum: {
true: {text: '已启用', status: 'Success'}, true: {text: l('status.enabled'), status: 'Success'},
false: {text: '未启用', status: 'Error'}, false: {text: l('status.disabled'), status: 'Error'},
}, },
}, },
{ {
title: '备注', title: l('pages.nameSpace.note'),
dataIndex: 'note', dataIndex: 'note',
hideInSearch: true, hideInSearch: true,
ellipsis: true, ellipsis: true,
}, },
{ {
title: '创建时间', title: l('pages.nameSpace.createTime'),
dataIndex: 'createTime', dataIndex: 'createTime',
sorter: true, sorter: true,
valueType: 'dateTime', valueType: 'dateTime',
}, },
{ {
title: '最近更新时间', title: l('pages.nameSpace.updateTime'),
dataIndex: 'updateTime', dataIndex: 'updateTime',
sorter: true, sorter: true,
valueType: 'dateTime', valueType: 'dateTime',
}, },
{ {
title: '操作', title: l('pages.operate'),
dataIndex: 'option', dataIndex: 'option',
valueType: 'option', valueType: 'option',
render: (_, record) => [ render: (_, record) => [
...@@ -148,7 +152,7 @@ const NameSpaceFormList: React.FC<{}> = (props: any) => { ...@@ -148,7 +152,7 @@ const NameSpaceFormList: React.FC<{}> = (props: any) => {
setFormValues(record); setFormValues(record);
}} }}
> >
配置 {l('button.config')}
</a>, </a>,
<MoreBtn key="more" item={record}/>, <MoreBtn key="more" item={record}/>,
], ],
...@@ -156,9 +160,9 @@ const NameSpaceFormList: React.FC<{}> = (props: any) => { ...@@ -156,9 +160,9 @@ const NameSpaceFormList: React.FC<{}> = (props: any) => {
]; ];
return ( return (
<PageContainer> <PageContainer title={false}>
<ProTable<NameSpaceTableListItem> <ProTable<NameSpaceTableListItem>
headerTitle="命名空间管理" headerTitle={l('pages.nameSpace.NameSpaceManagement')}
actionRef={actionRef} actionRef={actionRef}
rowKey="id" rowKey="id"
search={{ search={{
...@@ -166,7 +170,7 @@ const NameSpaceFormList: React.FC<{}> = (props: any) => { ...@@ -166,7 +170,7 @@ const NameSpaceFormList: React.FC<{}> = (props: any) => {
}} }}
toolBarRender={() => [ toolBarRender={() => [
<Button type="primary" onClick={() => handleModalVisible(true)}> <Button type="primary" onClick={() => handleModalVisible(true)}>
<PlusOutlined/> 新建 <PlusOutlined/> {l('button.create')}
</Button>, </Button>,
]} ]}
request={(params, sorter, filter) => queryData(url, {...params, sorter, filter})} request={(params, sorter, filter) => queryData(url, {...params, sorter, filter})}
...@@ -179,9 +183,10 @@ const NameSpaceFormList: React.FC<{}> = (props: any) => { ...@@ -179,9 +183,10 @@ const NameSpaceFormList: React.FC<{}> = (props: any) => {
<FooterToolbar <FooterToolbar
extra={ extra={
<div> <div>
已选择 <a style={{fontWeight: 600}}>{selectedRowsState.length}</a>&nbsp;&nbsp; {l('tips.selected')} <a
style={{fontWeight: 600}}>{selectedRowsState.length}</a> {l('tips.item')}&nbsp;&nbsp;
<span> <span>
被禁用的命名空间共 {selectedRowsState.length - selectedRowsState.reduce((pre, item) => pre + (item.enabled ? 1 : 0), 0)} {l('pages.nameSpace.disableTotalOf')} {selectedRowsState.length - selectedRowsState.reduce((pre, item) => pre + (item.enabled ? 1 : 0), 0)} {l('pages.nameSpace.selectDisable')}
</span> </span>
</div> </div>
} }
...@@ -189,10 +194,10 @@ const NameSpaceFormList: React.FC<{}> = (props: any) => { ...@@ -189,10 +194,10 @@ const NameSpaceFormList: React.FC<{}> = (props: any) => {
<Button type="primary" danger <Button type="primary" danger
onClick={() => { onClick={() => {
Modal.confirm({ Modal.confirm({
title: '删除命名空间', title: l('pages.nameSpace.deleteNameSpace'),
content: '确定删除选中的命名空间吗?', content: l('pages.nameSpace.deleteNameSpaceConfirm'),
okText: '确认', okText: l('button.confirm'),
cancelText: '取消', cancelText: l('button.cancel'),
onOk: async () => { onOk: async () => {
await handleRemove(url, selectedRowsState); await handleRemove(url, selectedRowsState);
setSelectedRows([]); setSelectedRows([]);
...@@ -201,15 +206,15 @@ const NameSpaceFormList: React.FC<{}> = (props: any) => { ...@@ -201,15 +206,15 @@ const NameSpaceFormList: React.FC<{}> = (props: any) => {
}); });
}} }}
> >
批量删除 {l('button.batchDelete')}
</Button> </Button>
<Button type="primary" <Button type="primary"
onClick={() => { onClick={() => {
Modal.confirm({ Modal.confirm({
title: '启用命名空间', title: l('pages.nameSpace.enableNameSpace'),
content: '确定启用选中的命名空间吗?', content: l('pages.nameSpace.enableNameSpaceConfirm'),
okText: '确认', okText: l('button.confirm'),
cancelText: '取消', cancelText: l('button.cancel'),
onOk: async () => { onOk: async () => {
await updateEnabled(url, selectedRowsState, true); await updateEnabled(url, selectedRowsState, true);
setSelectedRows([]); setSelectedRows([]);
...@@ -217,14 +222,14 @@ const NameSpaceFormList: React.FC<{}> = (props: any) => { ...@@ -217,14 +222,14 @@ const NameSpaceFormList: React.FC<{}> = (props: any) => {
} }
}); });
}} }}
>批量启用</Button> >{l('button.batchEnable')}</Button>
<Button danger <Button danger
onClick={() => { onClick={() => {
Modal.confirm({ Modal.confirm({
title: '禁用命名空间', title: l('pages.nameSpace.disableNameSpace'),
content: '确定禁用选中的命名空间吗?', content: l('pages.nameSpace.disableNameSpaceConfirm'),
okText: '确认', okText: l('button.confirm'),
cancelText: '取消', cancelText: l('button.cancel'),
onOk: async () => { onOk: async () => {
await updateEnabled(url, selectedRowsState, false); await updateEnabled(url, selectedRowsState, false);
setSelectedRows([]); setSelectedRows([]);
...@@ -232,7 +237,7 @@ const NameSpaceFormList: React.FC<{}> = (props: any) => { ...@@ -232,7 +237,7 @@ const NameSpaceFormList: React.FC<{}> = (props: any) => {
} }
}); });
}} }}
>批量禁用</Button> > {l('button.batchDisable')}</Button>
</FooterToolbar> </FooterToolbar>
)} )}
<NameSpaceForm <NameSpaceForm
......
...@@ -25,6 +25,7 @@ import {getStorageTenantId} from "@/components/Common/crud"; ...@@ -25,6 +25,7 @@ import {getStorageTenantId} from "@/components/Common/crud";
import {connect} from "umi"; import {connect} from "umi";
import {NameSpaceStateType} from "@/pages/AuthenticationCenter/RoleManager/model"; import {NameSpaceStateType} from "@/pages/AuthenticationCenter/RoleManager/model";
import {buildFormData, getFormData} from "@/pages/AuthenticationCenter/function"; import {buildFormData, getFormData} from "@/pages/AuthenticationCenter/function";
import {useIntl} from "@@/plugin-locale/localeExports";
export type TenantFormProps = { export type TenantFormProps = {
...@@ -45,6 +46,10 @@ const Option = Select.Option; ...@@ -45,6 +46,10 @@ const Option = Select.Option;
const RoleForm: React.FC<TenantFormProps> = (props) => { const RoleForm: React.FC<TenantFormProps> = (props) => {
const international = useIntl();
const l = (key: string, defaultMsg?: string) => international.formatMessage({id: key, defaultMessage: defaultMsg})
const [form] = Form.useForm(); const [form] = Form.useForm();
const [formVals, setFormVals] = useState<Partial<RoleTableListItem>>({ const [formVals, setFormVals] = useState<Partial<RoleTableListItem>>({
id: props.values?.id, id: props.values?.id,
...@@ -95,25 +100,25 @@ const RoleForm: React.FC<TenantFormProps> = (props) => { ...@@ -95,25 +100,25 @@ const RoleForm: React.FC<TenantFormProps> = (props) => {
<> <>
<Form.Item <Form.Item
name="roleCode" name="roleCode"
label="角色编号" label={l('pages.role.roleCode')}
rules={[{required: true, message: '请输入角色唯一编码!'}]}> rules={[{required: true, message: l('pages.role.roleCode')}]}>
<Input placeholder="请输入角色唯一编码"/> <Input placeholder={l('pages.role.EnterRoleCode')}/>
</Form.Item> </Form.Item>
<Form.Item <Form.Item
name="roleName" name="roleName"
label="角色名称" label={l('pages.role.roleName')}
rules={[{required: true, message: '请输入角色名称!'}]}> rules={[{required: true, message: l('pages.role.EnterRoleName')}]}>
<Input placeholder="请输入角色名称"/> <Input placeholder={l('pages.role.EnterRoleName')}/>
</Form.Item> </Form.Item>
<Form.Item <Form.Item
name="namespaceIds" name="namespaceIds"
label="命名空间" label={l('pages.role.namespaceIds')}
rules={[{required: true, message: '请选择命名空间!'}]} rules={[{required: true, message: l('pages.role.selectNameSpace')}]}
> >
<Select <Select
mode="multiple" mode="multiple"
style={{width: '100%'}} style={{width: '100%'}}
placeholder="请选择命名空间" placeholder={l('pages.role.selectNameSpace')}
optionLabelProp="label" optionLabelProp="label"
> >
{getNameSpaceOptions()} {getNameSpaceOptions()}
...@@ -121,9 +126,9 @@ const RoleForm: React.FC<TenantFormProps> = (props) => { ...@@ -121,9 +126,9 @@ const RoleForm: React.FC<TenantFormProps> = (props) => {
</Form.Item> </Form.Item>
<Form.Item <Form.Item
name="note" name="note"
label="注释" label={l('pages.role.note')}
> >
<Input.TextArea placeholder="请输入文本注释" allowClear <Input.TextArea placeholder={l('pages.role.EnterNote')} allowClear
autoSize={{minRows: 3, maxRows: 10}}/> autoSize={{minRows: 3, maxRows: 10}}/>
</Form.Item> </Form.Item>
</> </>
...@@ -133,9 +138,9 @@ const RoleForm: React.FC<TenantFormProps> = (props) => { ...@@ -133,9 +138,9 @@ const RoleForm: React.FC<TenantFormProps> = (props) => {
const renderFooter = () => { const renderFooter = () => {
return ( return (
<> <>
<Button onClick={() => handleModalVisible(false)}>取消</Button> <Button onClick={() => handleModalVisible(false)}>{l('button.cancel')}</Button>
<Button type="primary" onClick={() => submitForm()}> <Button type="primary" onClick={() => submitForm()}>
完成 {l('button.finish')}
</Button> </Button>
</> </>
); );
...@@ -146,7 +151,7 @@ const RoleForm: React.FC<TenantFormProps> = (props) => { ...@@ -146,7 +151,7 @@ const RoleForm: React.FC<TenantFormProps> = (props) => {
width={1000} width={1000}
bodyStyle={{padding: '32px 40px 48px'}} bodyStyle={{padding: '32px 40px 48px'}}
destroyOnClose destroyOnClose
title={formVals.id ? "修改角色" : "创建角色"} title={formVals.id ? l('pages.role.update') : l('pages.role.create')}
visible={modalVisible} visible={modalVisible}
footer={renderFooter()} footer={renderFooter()}
onCancel={() => handleModalVisible()} onCancel={() => handleModalVisible()}
......
...@@ -29,6 +29,7 @@ import {RoleTableListItem} from "@/pages/AuthenticationCenter/data.d"; ...@@ -29,6 +29,7 @@ import {RoleTableListItem} from "@/pages/AuthenticationCenter/data.d";
import RoleForm from "@/pages/AuthenticationCenter/RoleManager/components/RoleForm"; import RoleForm from "@/pages/AuthenticationCenter/RoleManager/components/RoleForm";
import {getNameSpaceList} from "@/pages/AuthenticationCenter/service"; import {getNameSpaceList} from "@/pages/AuthenticationCenter/service";
import {connect} from "umi"; import {connect} from "umi";
import {useIntl} from "@@/plugin-locale/localeExports";
const url = '/api/role'; const url = '/api/role';
...@@ -41,6 +42,10 @@ const RoleFormList: React.FC<{}> = (props: any) => { ...@@ -41,6 +42,10 @@ const RoleFormList: React.FC<{}> = (props: any) => {
const actionRef = useRef<ActionType>(); const actionRef = useRef<ActionType>();
const [selectedRowsState, setSelectedRows] = useState<RoleTableListItem[]>([]); const [selectedRowsState, setSelectedRows] = useState<RoleTableListItem[]>([]);
const international = useIntl();
const l = (key: string, defaultMsg?: string) => international.formatMessage({id: key, defaultMessage: defaultMsg})
useEffect(() => { useEffect(() => {
getNameSpaceList(dispatch); getNameSpaceList(dispatch);
}, []); }, []);
...@@ -51,10 +56,10 @@ const RoleFormList: React.FC<{}> = (props: any) => { ...@@ -51,10 +56,10 @@ const RoleFormList: React.FC<{}> = (props: any) => {
handleUpdateModalVisible(true); handleUpdateModalVisible(true);
} else if (key === 'delete') { } else if (key === 'delete') {
Modal.confirm({ Modal.confirm({
title: '删除角色', title: l('pages.role.delete'),
content: '确定删除该角色吗?', content: l('pages.role.deleteConfirm'),
okText: '确认', okText: l('button.confirm'),
cancelText: '取消', cancelText: l('button.cancel'),
onOk: async () => { onOk: async () => {
await handleRemove(url, [currentItem]); await handleRemove(url, [currentItem]);
actionRef.current?.reloadAndRest?.(); actionRef.current?.reloadAndRest?.();
...@@ -69,13 +74,13 @@ const RoleFormList: React.FC<{}> = (props: any) => { ...@@ -69,13 +74,13 @@ const RoleFormList: React.FC<{}> = (props: any) => {
<Dropdown <Dropdown
overlay={ overlay={
<Menu onClick={({key}) => editAndDelete(key, item)}> <Menu onClick={({key}) => editAndDelete(key, item)}>
<Menu.Item key="edit">编辑</Menu.Item> <Menu.Item key="edit">{l('button.edit')}</Menu.Item>
<Menu.Item key="delete">删除</Menu.Item> <Menu.Item key="delete">{l('button.delete')}</Menu.Item>
</Menu> </Menu>
} }
> >
<a> <a>
更多 <DownOutlined/> {l('button.more')} <DownOutlined/>
</a> </a>
</Dropdown> </Dropdown>
); );
...@@ -89,18 +94,18 @@ const RoleFormList: React.FC<{}> = (props: any) => { ...@@ -89,18 +94,18 @@ const RoleFormList: React.FC<{}> = (props: any) => {
sorter: true, sorter: true,
}, },
{ {
title: '角色编码', title: l('pages.role.roleCode'),
dataIndex: 'roleCode', dataIndex: 'roleCode',
render: (dom, entity) => { render: (dom, entity) => {
return <a onClick={() => setRow(entity)}>{dom}</a>; return <a onClick={() => setRow(entity)}>{dom}</a>;
}, },
}, },
{ {
title: '角色名称', title: l('pages.role.roleName'),
dataIndex: 'roleName', dataIndex: 'roleName',
}, },
{ {
title: '所属租户', title: l('pages.role.belongTenant'),
hideInSearch: true, hideInSearch: true,
render: (dom, entity) => { render: (dom, entity) => {
return entity?.tenant?.tenantCode || ''; return entity?.tenant?.tenantCode || '';
...@@ -129,35 +134,35 @@ const RoleFormList: React.FC<{}> = (props: any) => { ...@@ -129,35 +134,35 @@ const RoleFormList: React.FC<{}> = (props: any) => {
// }, // },
// }, // },
{ {
title: '备注', title: l('pages.role.note'),
dataIndex: 'note', dataIndex: 'note',
hideInSearch: true, hideInSearch: true,
ellipsis: true, ellipsis: true,
}, },
{ {
title: '创建时间', title: l('pages.role.createTime'),
dataIndex: 'createTime', dataIndex: 'createTime',
sorter: true, sorter: true,
valueType: 'dateTime', valueType: 'dateTime',
}, },
{ {
title: '最近更新时间', title: l('pages.role.updateTime'),
dataIndex: 'updateTime', dataIndex: 'updateTime',
sorter: true, sorter: true,
valueType: 'dateTime', valueType: 'dateTime',
}, },
{ {
title: '操作', title: l('pages.operate'),
dataIndex: 'option', dataIndex: 'option',
valueType: 'option', valueType: 'option',
render: (_, record) => [ render: (_, record) => [
<Button type={"link"} <Button type={"link"}
onClick={() => { onClick={() => {
handleUpdateModalVisible(true); handleUpdateModalVisible(true);
setFormValues(record); setFormValues(record);
}} }}
> >
配置 {l('button.config')}
</Button>, </Button>,
<MoreBtn key="more" item={record}/>, <MoreBtn key="more" item={record}/>,
], ],
...@@ -165,9 +170,9 @@ const RoleFormList: React.FC<{}> = (props: any) => { ...@@ -165,9 +170,9 @@ const RoleFormList: React.FC<{}> = (props: any) => {
]; ];
return ( return (
<PageContainer> <PageContainer title={false}>
<ProTable<RoleTableListItem> <ProTable<RoleTableListItem>
headerTitle="角色管理" headerTitle={l('pages.role.roleManagement')}
actionRef={actionRef} actionRef={actionRef}
rowKey="id" rowKey="id"
search={{ search={{
...@@ -175,7 +180,7 @@ const RoleFormList: React.FC<{}> = (props: any) => { ...@@ -175,7 +180,7 @@ const RoleFormList: React.FC<{}> = (props: any) => {
}} }}
toolBarRender={() => [ toolBarRender={() => [
<Button type="primary" onClick={() => handleModalVisible(true)}> <Button type="primary" onClick={() => handleModalVisible(true)}>
<PlusOutlined/> 新建 <PlusOutlined/> {l('button.create')}
</Button>, </Button>,
]} ]}
request={(params, sorter, filter) => queryData(url, {tenantId: getStorageTenantId(), sorter, filter})} request={(params, sorter, filter) => queryData(url, {tenantId: getStorageTenantId(), sorter, filter})}
...@@ -188,17 +193,17 @@ const RoleFormList: React.FC<{}> = (props: any) => { ...@@ -188,17 +193,17 @@ const RoleFormList: React.FC<{}> = (props: any) => {
<FooterToolbar <FooterToolbar
extra={ extra={
<div> <div>
已选择 <a style={{fontWeight: 600}}>{selectedRowsState.length}</a> {l('tips.selected')} <a style={{fontWeight: 600}}>{selectedRowsState.length}</a> {l('tips.item')}
</div> </div>
} }
> >
<Button type="primary" danger <Button type="primary" danger
onClick={() => { onClick={() => {
Modal.confirm({ Modal.confirm({
title: '删除角色', title: l('pages.role.delete'),
content: '确定删除选中的角色吗?', content: l('pages.role.deleteConfirm'),
okText: '确认', okText: l('button.confirm'),
cancelText: '取消', cancelText: l('button.cancel'),
onOk: async () => { onOk: async () => {
await handleRemove(url, selectedRowsState); await handleRemove(url, selectedRowsState);
setSelectedRows([]); setSelectedRows([]);
...@@ -207,7 +212,7 @@ const RoleFormList: React.FC<{}> = (props: any) => { ...@@ -207,7 +212,7 @@ const RoleFormList: React.FC<{}> = (props: any) => {
}); });
}} }}
> >
批量删除 {l('button.batchDelete')}
</Button> </Button>
</FooterToolbar> </FooterToolbar>
)} )}
......
...@@ -23,7 +23,8 @@ import difference from 'lodash/difference'; ...@@ -23,7 +23,8 @@ import difference from 'lodash/difference';
import React, {useEffect, useState} from 'react'; import React, {useEffect, useState} from 'react';
import {getData} from "@/components/Common/crud"; import {getData} from "@/components/Common/crud";
import {Scrollbars} from 'react-custom-scrollbars'; import {Scrollbars} from 'react-custom-scrollbars';
import { TenantTableListItem, UserTableListItem} from "@/pages/AuthenticationCenter/data.d"; import {TenantTableListItem, UserTableListItem} from "@/pages/AuthenticationCenter/data.d";
import {useIntl} from "@@/plugin-locale/localeExports";
interface TableTransferProps extends TransferProps<UserTableListItem> { interface TableTransferProps extends TransferProps<UserTableListItem> {
...@@ -36,13 +37,6 @@ interface TableTransferProps extends TransferProps<UserTableListItem> { ...@@ -36,13 +37,6 @@ interface TableTransferProps extends TransferProps<UserTableListItem> {
// Customize Table Transfer // Customize Table Transfer
const GrantTenantTransfer = ({leftColumns, rightColumns, ...restProps}: TableTransferProps) => ( const GrantTenantTransfer = ({leftColumns, rightColumns, ...restProps}: TableTransferProps) => (
<Transfer <Transfer
titles={['未选', '已选']}
locale={{
itemUnit: "项",
itemsUnit: "项",
searchPlaceholder: "请输入用户名搜索",
}}
showSelectAll={false} showSelectAll={false}
showSearch={true} showSearch={true}
{...restProps}> {...restProps}>
...@@ -90,7 +84,7 @@ const GrantTenantTransfer = ({leftColumns, rightColumns, ...restProps}: TableTra ...@@ -90,7 +84,7 @@ const GrantTenantTransfer = ({leftColumns, rightColumns, ...restProps}: TableTra
}} }}
onRow={({id, enabled: itemDisabled}) => ({ onRow={({id, enabled: itemDisabled}) => ({
onClick: (e) => { onClick: (e) => {
if (itemDisabled || !enabled){ if (itemDisabled || !enabled) {
onItemSelect(id, listSelectedKeys.includes(id)); onItemSelect(id, listSelectedKeys.includes(id));
} else { } else {
return; return;
...@@ -111,7 +105,7 @@ export type TableTransferFromProps = { ...@@ -111,7 +105,7 @@ export type TableTransferFromProps = {
}; };
const GrantTenantToUserTableTransferFrom = (props: TableTransferFromProps) => { const GrantTenantToUserTableTransferFrom = (props: TableTransferFromProps) => {
const intl = useIntl();
const {tenant, onChange: handleChange} = props; const {tenant, onChange: handleChange} = props;
const [targetKeys, setTargetKeys] = useState<string[]>([]); const [targetKeys, setTargetKeys] = useState<string[]>([]);
...@@ -135,30 +129,30 @@ const GrantTenantToUserTableTransferFrom = (props: TableTransferFromProps) => { ...@@ -135,30 +129,30 @@ const GrantTenantToUserTableTransferFrom = (props: TableTransferFromProps) => {
const leftTableColumns: ColumnsType<UserTableListItem> = [ const leftTableColumns: ColumnsType<UserTableListItem> = [
{ {
title: '用户名', title: intl.formatMessage({id: 'pages.user.UserName'}),
dataIndex: 'username', dataIndex: 'username',
}, },
{ {
title: '昵称', title: intl.formatMessage({id: 'pages.user.UserNickName'}),
dataIndex: 'nickname', dataIndex: 'nickname',
}, },
{ {
title: '工号', title: intl.formatMessage({id: 'pages.user.UserJobNumber'}),
dataIndex: 'worknum', dataIndex: 'worknum',
}, },
]; ];
const rightTableColumns: ColumnsType<UserTableListItem> = [ const rightTableColumns: ColumnsType<UserTableListItem> = [
{ {
title: '用户名', title: intl.formatMessage({id: 'pages.user.UserName'}),
dataIndex: 'username', dataIndex: 'username',
}, },
{ {
title: '昵称', title: intl.formatMessage({id: 'pages.user.UserNickName'}),
dataIndex: 'nickname', dataIndex: 'nickname',
}, },
{ {
title: '工号', title: intl.formatMessage({id: 'pages.user.UserJobNumber'}),
dataIndex: 'worknum', dataIndex: 'worknum',
}, },
]; ];
......
...@@ -21,6 +21,7 @@ ...@@ -21,6 +21,7 @@
import React, {useState} from 'react'; import React, {useState} from 'react';
import {Button, Form, Input, Modal} from 'antd'; import {Button, Form, Input, Modal} from 'antd';
import {TenantTableListItem} from "@/pages/AuthenticationCenter/data.d"; import {TenantTableListItem} from "@/pages/AuthenticationCenter/data.d";
import {useIntl} from "@@/plugin-locale/localeExports";
export type TenantFormProps = { export type TenantFormProps = {
onCancel: (flag?: boolean) => void; onCancel: (flag?: boolean) => void;
...@@ -37,6 +38,8 @@ const FormItem = Form.Item; ...@@ -37,6 +38,8 @@ const FormItem = Form.Item;
const TenantForm: React.FC<TenantFormProps> = (props) => { const TenantForm: React.FC<TenantFormProps> = (props) => {
const intl = useIntl();
const [form] = Form.useForm(); const [form] = Form.useForm();
const [formVals, setFormVals] = useState<Partial<TenantTableListItem>>({ const [formVals, setFormVals] = useState<Partial<TenantTableListItem>>({
id: props.values.id, id: props.values.id,
...@@ -56,8 +59,8 @@ const TenantForm: React.FC<TenantFormProps> = (props) => { ...@@ -56,8 +59,8 @@ const TenantForm: React.FC<TenantFormProps> = (props) => {
const submitForm = async () => { const submitForm = async () => {
const fieldsValue = await form.validateFields(); const fieldsValue = await form.validateFields();
fieldsValue.id = formVals.id; fieldsValue.id = formVals.id;
setFormVals({...formVals,...fieldsValue}); setFormVals({...formVals, ...fieldsValue});
handleSubmit({...formVals,...fieldsValue}); handleSubmit({...formVals, ...fieldsValue});
}; };
const renderContent = (formVals: Partial<TenantTableListItem>) => { const renderContent = (formVals: Partial<TenantTableListItem>) => {
...@@ -65,16 +68,16 @@ const TenantForm: React.FC<TenantFormProps> = (props) => { ...@@ -65,16 +68,16 @@ const TenantForm: React.FC<TenantFormProps> = (props) => {
<> <>
<FormItem <FormItem
name="tenantCode" name="tenantCode"
label="唯一编码" label={intl.formatMessage({id: 'pages.tenant.TenantCode'})}
rules={[{required: true, message: '请输入租户唯一编码!'}]}> rules={[{required: true, message: intl.formatMessage({id: 'pages.tenant.EnterTenantCode'})}]}>
<Input allowClear placeholder="请输入租户唯一编码"/> <Input allowClear placeholder={intl.formatMessage({id: 'pages.tenant.EnterTenantCode'})}/>
</FormItem> </FormItem>
<FormItem <FormItem
name="note" name="note"
label="注释" label={intl.formatMessage({id: 'pages.tenant.Note'})}
rules={[{required: true, message: '请输入租户注释/描述信息!'}]} rules={[{required: true, message: intl.formatMessage({id: 'pages.tenant.EnterTenantNote'})}]}
> >
<Input.TextArea placeholder="请输入租户注释/描述信息" allowClear <Input.TextArea placeholder={intl.formatMessage({id: 'pages.tenant.EnterTenantNote'})} allowClear
autoSize={{minRows: 3, maxRows: 10}}/> autoSize={{minRows: 3, maxRows: 10}}/>
</FormItem> </FormItem>
</> </>
...@@ -84,9 +87,9 @@ const TenantForm: React.FC<TenantFormProps> = (props) => { ...@@ -84,9 +87,9 @@ const TenantForm: React.FC<TenantFormProps> = (props) => {
const renderFooter = () => { const renderFooter = () => {
return ( return (
<> <>
<Button onClick={() => handleModalVisible(false)}>取消</Button> <Button onClick={() => handleModalVisible(false)}>{intl.formatMessage({id: 'button.cancel'})}</Button>
<Button type="primary" onClick={() => submitForm()}> <Button type="primary" onClick={() => submitForm()}>
完成 {intl.formatMessage({id: 'button.finish'})}
</Button> </Button>
</> </>
); );
...@@ -97,7 +100,7 @@ const TenantForm: React.FC<TenantFormProps> = (props) => { ...@@ -97,7 +100,7 @@ const TenantForm: React.FC<TenantFormProps> = (props) => {
width={640} width={640}
bodyStyle={{padding: '32px 40px 48px'}} bodyStyle={{padding: '32px 40px 48px'}}
destroyOnClose destroyOnClose
title={formVals.id ? "修改租户" : "创建租户"} title={formVals.id ? intl.formatMessage({id: 'pages.tenant.update'}) : intl.formatMessage({id: 'pages.tenant.create'})}
visible={modalVisible} visible={modalVisible}
footer={renderFooter()} footer={renderFooter()}
onCancel={() => handleModalVisible()} onCancel={() => handleModalVisible()}
......
...@@ -28,6 +28,7 @@ import {handleAddOrUpdate, handleRemove, queryData} from "@/components/Common/cr ...@@ -28,6 +28,7 @@ import {handleAddOrUpdate, handleRemove, queryData} from "@/components/Common/cr
import {TenantTableListItem} from "@/pages/AuthenticationCenter/data.d"; import {TenantTableListItem} from "@/pages/AuthenticationCenter/data.d";
import TenantForm from "@/pages/AuthenticationCenter/TenantManager/components/TenantForm"; import TenantForm from "@/pages/AuthenticationCenter/TenantManager/components/TenantForm";
import GrantTenantTransfer from "@/pages/AuthenticationCenter/TenantManager/components/GrantTenantTransfer"; import GrantTenantTransfer from "@/pages/AuthenticationCenter/TenantManager/components/GrantTenantTransfer";
import {useIntl} from "umi";
const url = '/api/tenant'; const url = '/api/tenant';
const TenantFormList: React.FC<{}> = (props: any) => { const TenantFormList: React.FC<{}> = (props: any) => {
...@@ -40,16 +41,20 @@ const TenantFormList: React.FC<{}> = (props: any) => { ...@@ -40,16 +41,20 @@ const TenantFormList: React.FC<{}> = (props: any) => {
const [selectedRowsState, setSelectedRows] = useState<TenantTableListItem[]>([]); const [selectedRowsState, setSelectedRows] = useState<TenantTableListItem[]>([]);
const [formValues, setFormValues] = useState({}); const [formValues, setFormValues] = useState({});
const international = useIntl();
const l = (key: string, defaultMsg?: string) => international.formatMessage({id: key, defaultMessage: defaultMsg})
const editAndDelete = (key: string | number, currentItem: TenantTableListItem) => { const editAndDelete = (key: string | number, currentItem: TenantTableListItem) => {
if (key === 'edit') { if (key === 'edit') {
handleUpdateModalVisible(true); handleUpdateModalVisible(true);
setFormValues(currentItem); setFormValues(currentItem);
} else if (key === 'delete') { } else if (key === 'delete') {
Modal.confirm({ Modal.confirm({
title: '删除租户', title: l('pages.tenant.delete'),
content: '确定删除该租户吗?', content: l('pages.tenant.deleteConfirm'),
okText: '确认', okText: l('button.confirm'),
cancelText: '取消', cancelText: l('button.cancel'),
onOk: async () => { onOk: async () => {
await handleRemove(url, [currentItem]); await handleRemove(url, [currentItem]);
actionRef.current?.reloadAndRest?.(); actionRef.current?.reloadAndRest?.();
...@@ -64,13 +69,13 @@ const TenantFormList: React.FC<{}> = (props: any) => { ...@@ -64,13 +69,13 @@ const TenantFormList: React.FC<{}> = (props: any) => {
<Dropdown <Dropdown
overlay={ overlay={
<Menu onClick={({key}) => editAndDelete(key, item)}> <Menu onClick={({key}) => editAndDelete(key, item)}>
<Menu.Item key="edit">编辑</Menu.Item> <Menu.Item key="edit">{l('button.edit')}</Menu.Item>
<Menu.Item key="delete">删除</Menu.Item> <Menu.Item key="delete">{l('button.delete')}</Menu.Item>
</Menu> </Menu>
} }
> >
<a> <a>
更多 <DownOutlined/> {l('button.more')} <DownOutlined/>
</a> </a>
</Dropdown> </Dropdown>
); );
...@@ -78,7 +83,8 @@ const TenantFormList: React.FC<{}> = (props: any) => { ...@@ -78,7 +83,8 @@ const TenantFormList: React.FC<{}> = (props: any) => {
const handleGrantTenantForm = () => { const handleGrantTenantForm = () => {
return ( return (
<Modal title="分配用户" visible={handleGrantTenant} destroyOnClose={true} width={"1500px"} <Modal title={l('pages.tenant.AssignUser')} visible={handleGrantTenant}
destroyOnClose={true} width={"1500px"}
onCancel={() => { onCancel={() => {
setHandleGrantTenant(false); setHandleGrantTenant(false);
}} }}
...@@ -86,11 +92,11 @@ const TenantFormList: React.FC<{}> = (props: any) => { ...@@ -86,11 +92,11 @@ const TenantFormList: React.FC<{}> = (props: any) => {
<Button key="back" onClick={() => { <Button key="back" onClick={() => {
setHandleGrantTenant(false); setHandleGrantTenant(false);
}}> }}>
关闭 {l('button.close')}
</Button>, </Button>,
<Button type="primary" onClick={async () => { <Button type="primary" onClick={async () => {
// to save // to save
const success = await handleAddOrUpdate(url+ "/grantTenantToUser", { const success = await handleAddOrUpdate(url + "/grantTenantToUser", {
tenantId: formValues.id, tenantId: formValues.id,
users: tenantRelFormValues users: tenantRelFormValues
}); });
...@@ -103,7 +109,7 @@ const TenantFormList: React.FC<{}> = (props: any) => { ...@@ -103,7 +109,7 @@ const TenantFormList: React.FC<{}> = (props: any) => {
} }
}} }}
> >
确认 {l('button.confirm')}
</Button>, </Button>,
]}> ]}>
<GrantTenantTransfer tenant={formValues} onChange={(value) => { <GrantTenantTransfer tenant={formValues} onChange={(value) => {
...@@ -122,8 +128,7 @@ const TenantFormList: React.FC<{}> = (props: any) => { ...@@ -122,8 +128,7 @@ const TenantFormList: React.FC<{}> = (props: any) => {
sorter: true, sorter: true,
}, },
{ {
title: '租户编码', title: l('pages.tenant.TenantCode'),
tip: '编码是唯一的',
dataIndex: 'tenantCode', dataIndex: 'tenantCode',
render: (dom, entity) => { render: (dom, entity) => {
return <a onClick={() => setRow(entity)}>{dom}</a>; return <a onClick={() => setRow(entity)}>{dom}</a>;
...@@ -152,33 +157,33 @@ const TenantFormList: React.FC<{}> = (props: any) => { ...@@ -152,33 +157,33 @@ const TenantFormList: React.FC<{}> = (props: any) => {
// }, // },
// }, // },
{ {
title: '备注', title: l('pages.tenant.Note'),
dataIndex: 'note', dataIndex: 'note',
hideInSearch: true, hideInSearch: true,
ellipsis: true, ellipsis: true,
}, },
{ {
title: '创建时间', title: l('pages.tenant.CreateTime'),
dataIndex: 'createTime', dataIndex: 'createTime',
valueType: 'dateTime', valueType: 'dateTime',
}, },
{ {
title: '最近更新时间', title: l('pages.tenant.UpdateTime'),
dataIndex: 'updateTime', dataIndex: 'updateTime',
valueType: 'dateTime', valueType: 'dateTime',
}, },
{ {
title: '操作', title: l('pages.operate'),
dataIndex: 'option', dataIndex: 'option',
valueType: 'option', valueType: 'option',
render: (_, record:TenantTableListItem) => [ render: (_, record: TenantTableListItem) => [
<a <a
onClick={() => { onClick={() => {
handleUpdateModalVisible(true); handleUpdateModalVisible(true);
setFormValues(record); setFormValues(record);
}} }}
> >
配置 {l('button.config')}
</a>, </a>,
<a <a
onClick={() => { onClick={() => {
...@@ -186,7 +191,7 @@ const TenantFormList: React.FC<{}> = (props: any) => { ...@@ -186,7 +191,7 @@ const TenantFormList: React.FC<{}> = (props: any) => {
setFormValues(record); setFormValues(record);
}} }}
> >
分配用户 {l('pages.tenant.AssignUser')}
</a>, </a>,
<MoreBtn key="more" item={record}/>, <MoreBtn key="more" item={record}/>,
], ],
...@@ -194,9 +199,9 @@ const TenantFormList: React.FC<{}> = (props: any) => { ...@@ -194,9 +199,9 @@ const TenantFormList: React.FC<{}> = (props: any) => {
]; ];
return ( return (
<PageContainer> <PageContainer title={false}>
<ProTable<TenantTableListItem> <ProTable<TenantTableListItem>
headerTitle="租户管理" headerTitle={l('pages.tenant.TenantManager')}
actionRef={actionRef} actionRef={actionRef}
rowKey="id" rowKey="id"
search={{ search={{
...@@ -204,7 +209,7 @@ const TenantFormList: React.FC<{}> = (props: any) => { ...@@ -204,7 +209,7 @@ const TenantFormList: React.FC<{}> = (props: any) => {
}} }}
toolBarRender={() => [ toolBarRender={() => [
<Button type="primary" onClick={() => handleModalVisible(true)}> <Button type="primary" onClick={() => handleModalVisible(true)}>
<PlusOutlined/> 新建 <PlusOutlined/> {l('button.create')}
</Button>, </Button>,
]} ]}
request={(params, sorter, filter) => queryData(url, {...params, sorter, filter})} request={(params, sorter, filter) => queryData(url, {...params, sorter, filter})}
...@@ -217,17 +222,18 @@ const TenantFormList: React.FC<{}> = (props: any) => { ...@@ -217,17 +222,18 @@ const TenantFormList: React.FC<{}> = (props: any) => {
<FooterToolbar <FooterToolbar
extra={ extra={
<div> <div>
已选择 <a style={{fontWeight: 600}}>{selectedRowsState.length}</a> {l('tips.selected')} <a
style={{fontWeight: 600}}>{selectedRowsState.length}</a> {l('tips.item')}
</div> </div>
} }
> >
<Button type="primary" danger <Button type="primary" danger
onClick={() => { onClick={() => {
Modal.confirm({ Modal.confirm({
title: '删除租户', title: l('pages.tenant.delete'),
content: '确定删除选中的租户吗?', content: l('pages.tenant.deleteConfirm'),
okText: '确认', okText: l('button.confirm'),
cancelText: '取消', cancelText: l('button.cancel'),
onOk: async () => { onOk: async () => {
await handleRemove(url, selectedRowsState); await handleRemove(url, selectedRowsState);
setSelectedRows([]); setSelectedRows([]);
...@@ -236,7 +242,7 @@ const TenantFormList: React.FC<{}> = (props: any) => { ...@@ -236,7 +242,7 @@ const TenantFormList: React.FC<{}> = (props: any) => {
}); });
}} }}
> >
批量删除 {l('button.batchDelete')}
</Button> </Button>
</FooterToolbar> </FooterToolbar>
)} )}
......
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
import React, {useState} from 'react'; import React, {useState} from 'react';
import {Button, Form, Input, Modal} from 'antd'; import {Button, Form, Input, Modal} from 'antd';
import {PasswordItem} from "@/pages/AuthenticationCenter/data.d"; import {PasswordItem} from "@/pages/AuthenticationCenter/data.d";
import { useIntl, Link, history, FormattedMessage, SelectLang} from 'umi'; import {useIntl} from 'umi';
export type PasswordFormProps = { export type PasswordFormProps = {
onCancel: (flag?: boolean) => void; onCancel: (flag?: boolean) => void;
...@@ -37,7 +37,9 @@ const formLayout = { ...@@ -37,7 +37,9 @@ const formLayout = {
const PasswordForm: React.FC<PasswordFormProps> = (props) => { const PasswordForm: React.FC<PasswordFormProps> = (props) => {
const intl = useIntl(); const international = useIntl();
const l = (key: string, defaultMsg?: string) => international.formatMessage({id: key, defaultMessage: defaultMsg})
const [form] = Form.useForm(); const [form] = Form.useForm();
const [formVals, setFormVals] = useState<Partial<PasswordItem>>({ const [formVals, setFormVals] = useState<Partial<PasswordItem>>({
...@@ -53,8 +55,8 @@ const PasswordForm: React.FC<PasswordFormProps> = (props) => { ...@@ -53,8 +55,8 @@ const PasswordForm: React.FC<PasswordFormProps> = (props) => {
const submitForm = async () => { const submitForm = async () => {
const fieldsValue = await form.validateFields(); const fieldsValue = await form.validateFields();
setFormVals({ ...formVals, ...fieldsValue }); setFormVals({...formVals, ...fieldsValue});
handleSubmit({ ...formVals, ...fieldsValue }); handleSubmit({...formVals, ...fieldsValue});
}; };
const renderContent = () => { const renderContent = () => {
...@@ -62,39 +64,39 @@ const PasswordForm: React.FC<PasswordFormProps> = (props) => { ...@@ -62,39 +64,39 @@ const PasswordForm: React.FC<PasswordFormProps> = (props) => {
<> <>
<Form.Item <Form.Item
name="password" name="password"
label= {intl.formatMessage({id: 'pages.user.UserOldPassword', defaultMessage: '旧密码',})} label={l('pages.user.UserOldPassword')}
hasFeedback hasFeedback
rules={[{required: true, message: intl.formatMessage({id: 'pages.user.UserEnterOldPassword', defaultMessage: '请输入旧密码!',})}]}> rules={[{required: true, message: l('pages.user.UserEnterOldPassword')}]}>
<Input.Password placeholder={intl.formatMessage({id: 'pages.user.UserEnterOldPassword', defaultMessage: '请输入旧密码!',})}/> <Input.Password placeholder={l('pages.user.UserEnterOldPassword')}/>
</Form.Item> </Form.Item>
<Form.Item <Form.Item
name="newPassword" name="newPassword"
label={intl.formatMessage({id: 'pages.user.UserNewPassword', defaultMessage: '新密码',})} label={l('pages.user.UserNewPassword')}
hasFeedback hasFeedback
rules={[{required: true, message: intl.formatMessage({id: 'pages.user.UserEnterNewPassword', defaultMessage: '请输入新密码',})}]}> rules={[{required: true, message: l('pages.user.UserEnterNewPassword')}]}>
<Input.Password placeholder={intl.formatMessage({id: 'pages.user.UserEnterNewPassword', defaultMessage: '请输入新密码',})}/> <Input.Password placeholder={l('pages.user.UserEnterNewPassword')}/>
</Form.Item> </Form.Item>
<Form.Item <Form.Item
name="newPasswordCheck" name="newPasswordCheck"
label={intl.formatMessage({id: 'pages.user.UserRepeatNewPassword', defaultMessage: '重复新密码',})} label={l('pages.user.UserRepeatNewPassword')}
hasFeedback hasFeedback
dependencies={['newPassword']} dependencies={['newPassword']}
rules={[ rules={[
{ {
required: true, required: true,
message: intl.formatMessage({id: 'pages.user.UserNewPasswordNotMatch', defaultMessage: '重复密码不一致',}), message: l('pages.user.UserNewPasswordNotMatch'),
},
({ getFieldValue }) => ({
validator(_, value) {
if (!value || getFieldValue('newPassword') === value) {
return Promise.resolve();
}
return Promise.reject(new Error(intl.formatMessage({id: 'pages.user.UserNewPasswordNotMatch', defaultMessage: '重复密码不一致',})));
}, },
}), ({getFieldValue}) => ({
]}> validator(_, value) {
<Input.Password placeholder={intl.formatMessage({id: 'pages.user.UserEnterRepeatNewPassword', defaultMessage: '请重复输入新密码',})}/> if (!value || getFieldValue('newPassword') === value) {
</Form.Item> return Promise.resolve();
}
return Promise.reject(new Error(l('pages.user.UserNewPasswordNotMatch')));
},
}),
]}>
<Input.Password placeholder={l('pages.user.UserEnterRepeatNewPassword')}/>
</Form.Item>
</> </>
); );
}; };
...@@ -102,9 +104,9 @@ const PasswordForm: React.FC<PasswordFormProps> = (props) => { ...@@ -102,9 +104,9 @@ const PasswordForm: React.FC<PasswordFormProps> = (props) => {
const renderFooter = () => { const renderFooter = () => {
return ( return (
<> <>
<Button onClick={() => handleModalVisible(false)}>{intl.formatMessage({id: 'pages.user.UserCancel', defaultMessage: '取消',})}</Button> <Button onClick={() => handleModalVisible(false)}> {l('button.cancel')}</Button>
<Button type="primary" onClick={() => submitForm()}> <Button type="primary" onClick={() => submitForm()}>
{intl.formatMessage({id: 'pages.user.UserComplete', defaultMessage: '完成',})} {l('button.finish')}
</Button> </Button>
</> </>
); );
...@@ -115,7 +117,7 @@ const PasswordForm: React.FC<PasswordFormProps> = (props) => { ...@@ -115,7 +117,7 @@ const PasswordForm: React.FC<PasswordFormProps> = (props) => {
width={1200} width={1200}
bodyStyle={{padding: '32px 40px 48px'}} bodyStyle={{padding: '32px 40px 48px'}}
destroyOnClose destroyOnClose
title={intl.formatMessage({id: 'pages.user.UserUpdatePassword', defaultMessage: '修改密码',})} title={l('button.changePassword')}
visible={modalVisible} visible={modalVisible}
footer={renderFooter()} footer={renderFooter()}
onCancel={() => handleModalVisible()} onCancel={() => handleModalVisible()}
......
...@@ -24,6 +24,7 @@ import {useEffect, useState} from 'react'; ...@@ -24,6 +24,7 @@ import {useEffect, useState} from 'react';
import {getData} from "@/components/Common/crud"; import {getData} from "@/components/Common/crud";
import {Scrollbars} from 'react-custom-scrollbars'; import {Scrollbars} from 'react-custom-scrollbars';
import {RoleTableListItem, UserTableListItem} from "@/pages/AuthenticationCenter/data.d"; import {RoleTableListItem, UserTableListItem} from "@/pages/AuthenticationCenter/data.d";
import {useIntl} from "@@/plugin-locale/localeExports";
interface TableTransferProps extends TransferProps<RoleTableListItem> { interface TableTransferProps extends TransferProps<RoleTableListItem> {
...@@ -36,13 +37,6 @@ interface TableTransferProps extends TransferProps<RoleTableListItem> { ...@@ -36,13 +37,6 @@ interface TableTransferProps extends TransferProps<RoleTableListItem> {
// Customize Table Transfer // Customize Table Transfer
const TableTransfer = ({leftColumns, rightColumns, ...restProps}: TableTransferProps) => ( const TableTransfer = ({leftColumns, rightColumns, ...restProps}: TableTransferProps) => (
<Transfer <Transfer
titles={['未选', '已选']}
locale={{
itemUnit: "项",
itemsUnit: "项",
searchPlaceholder: "请输入角色名称搜索",
}}
showSelectAll={false} showSelectAll={false}
showSearch={true} showSearch={true}
{...restProps}> {...restProps}>
...@@ -109,6 +103,9 @@ export type TableTransferFromProps = { ...@@ -109,6 +103,9 @@ export type TableTransferFromProps = {
const TableTransferFrom = (props: TableTransferFromProps) => { const TableTransferFrom = (props: TableTransferFromProps) => {
const international = useIntl();
const l = (key: string, defaultMsg?: string) => international.formatMessage({id: key, defaultMessage: defaultMsg})
const {user, onChange: handleChange} = props; const {user, onChange: handleChange} = props;
const [targetKeys, setTargetKeys] = useState<string[]>([]); const [targetKeys, setTargetKeys] = useState<string[]>([]);
...@@ -133,15 +130,15 @@ const TableTransferFrom = (props: TableTransferFromProps) => { ...@@ -133,15 +130,15 @@ const TableTransferFrom = (props: TableTransferFromProps) => {
const leftTableColumns: ColumnsType<RoleTableListItem> = [ const leftTableColumns: ColumnsType<RoleTableListItem> = [
{ {
dataIndex: 'roleCode', dataIndex: 'roleCode',
title: '角色编码', title: l('pages.role.roleCode'),
}, },
{ {
dataIndex: 'roleName', dataIndex: 'roleName',
title: '角色名称', title: l('pages.role.roleName'),
}, },
{ {
dataIndex: 'note', dataIndex: 'note',
title: '描述', title: l('pages.role.note'),
ellipsis: true, ellipsis: true,
}, },
]; ];
...@@ -149,15 +146,15 @@ const TableTransferFrom = (props: TableTransferFromProps) => { ...@@ -149,15 +146,15 @@ const TableTransferFrom = (props: TableTransferFromProps) => {
const rightTableColumns: ColumnsType<RoleTableListItem> = [ const rightTableColumns: ColumnsType<RoleTableListItem> = [
{ {
dataIndex: 'roleCode', dataIndex: 'roleCode',
title: '角色编码', title: l('pages.role.roleCode'),
}, },
{ {
dataIndex: 'roleName', dataIndex: 'roleName',
title: '角色名称', title: l('pages.role.roleName'),
}, },
{ {
dataIndex: 'note', dataIndex: 'note',
title: '描述', title: l('pages.role.note'),
ellipsis: true, ellipsis: true,
}, },
]; ];
......
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
import React, {useState} from 'react'; import React, {useState} from 'react';
import {Button, Form, Input, Modal, Switch} from 'antd'; import {Button, Form, Input, Modal, Switch} from 'antd';
import {UserTableListItem} from "@/pages/AuthenticationCenter/data.d"; import {UserTableListItem} from "@/pages/AuthenticationCenter/data.d";
import { useIntl, Link, history, FormattedMessage, SelectLang} from 'umi'; import {useIntl} from 'umi';
export type UserFormProps = { export type UserFormProps = {
onCancel: (flag?: boolean) => void; onCancel: (flag?: boolean) => void;
...@@ -37,7 +37,9 @@ const formLayout = { ...@@ -37,7 +37,9 @@ const formLayout = {
const UserForm: React.FC<UserFormProps> = (props) => { const UserForm: React.FC<UserFormProps> = (props) => {
const intl = useIntl(); const international = useIntl();
const l = (key: string, defaultMsg?: string) => international.formatMessage({id: key, defaultMessage: defaultMsg})
const [form] = Form.useForm(); const [form] = Form.useForm();
const [formVals, setFormVals] = useState<Partial<UserTableListItem>>({ const [formVals, setFormVals] = useState<Partial<UserTableListItem>>({
...@@ -60,8 +62,8 @@ const UserForm: React.FC<UserFormProps> = (props) => { ...@@ -60,8 +62,8 @@ const UserForm: React.FC<UserFormProps> = (props) => {
const submitForm = async () => { const submitForm = async () => {
const fieldsValue = await form.validateFields(); const fieldsValue = await form.validateFields();
setFormVals({ ...formVals, ...fieldsValue }); setFormVals({...formVals, ...fieldsValue});
handleSubmit({ ...formVals, ...fieldsValue }); handleSubmit({...formVals, ...fieldsValue});
}; };
const renderContent = (formVals: Partial<UserTableListItem>) => { const renderContent = (formVals: Partial<UserTableListItem>) => {
...@@ -69,32 +71,38 @@ const UserForm: React.FC<UserFormProps> = (props) => { ...@@ -69,32 +71,38 @@ const UserForm: React.FC<UserFormProps> = (props) => {
<> <>
<Form.Item <Form.Item
name="username" name="username"
label={intl.formatMessage({id: 'pages.user.UserName', defaultMessage: '用户名',})} label={l('pages.user.UserName')}
rules={[{required: true, message: intl.formatMessage({id: 'pages.user.UserEnterUserName', defaultMessage: '请输入用户名',})}]}> rules={[{
<Input placeholder={intl.formatMessage({id: 'pages.user.UserEnterUniqueUserName', defaultMessage: "请输入唯一用户名",})}/> required: true,
message: l('pages.user.UserEnterUserName')
}]}>
<Input placeholder={l('pages.user.UserEnterUniqueUserName')}/>
</Form.Item> </Form.Item>
<Form.Item <Form.Item
name="nickname" name="nickname"
label={intl.formatMessage({id: 'pages.user.UserNickName', defaultMessage: '昵称',})} label={l('pages.user.UserNickName')}
> >
<Input placeholder={intl.formatMessage({id: 'pages.user.UserEnterNickName', defaultMessage: "请输入昵称",})}/> <Input placeholder={l('pages.user.UserEnterNickName')}/>
</Form.Item> </Form.Item>
<Form.Item <Form.Item
name="worknum" name="worknum"
label={intl.formatMessage({id: 'pages.user.UserJobNumber', defaultMessage: '工号',})} label={l('pages.user.UserJobNumber')}
> >
<Input placeholder={intl.formatMessage({id: 'pages.user.UserEnterJobNumber', defaultMessage: "请输入工号",})}/> <Input
placeholder={l('pages.user.UserEnterJobNumber')}/>
</Form.Item> </Form.Item>
<Form.Item <Form.Item
name="mobile" name="mobile"
label={intl.formatMessage({id: 'pages.user.UserPhoneNumber', defaultMessage: '手机号',})} label={l('pages.user.UserPhoneNumber')}
> >
<Input placeholder={intl.formatMessage({id: 'pages.user.UserEnterPhoneNumber', defaultMessage: "请输入手机号",})}/> <Input
placeholder={l('pages.user.UserEnterPhoneNumber')}/>
</Form.Item> </Form.Item>
<Form.Item <Form.Item
name="enabled" name="enabled"
label={intl.formatMessage({id: 'pages.user.UserIsUse', defaultMessage: '是否启用',})}> label={l('pages.user.UserIsUse')}>
<Switch checkedChildren={intl.formatMessage({id: 'pages.user.UserInUse', defaultMessage: '启用',})} unCheckedChildren={intl.formatMessage({id: 'pages.user.UserNotUse', defaultMessage: '禁用',})} <Switch checkedChildren={l('status.enabled')}
unCheckedChildren={l('status.disabled')}
defaultChecked={formVals.enabled}/> defaultChecked={formVals.enabled}/>
</Form.Item> </Form.Item>
</> </>
...@@ -104,9 +112,9 @@ const UserForm: React.FC<UserFormProps> = (props) => { ...@@ -104,9 +112,9 @@ const UserForm: React.FC<UserFormProps> = (props) => {
const renderFooter = () => { const renderFooter = () => {
return ( return (
<> <>
<Button onClick={() => handleModalVisible(false)}>{intl.formatMessage({id: 'pages.user.UserCancel', defaultMessage: '取消',})}</Button> <Button onClick={() => handleModalVisible(false)}>{l('button.cancel')}</Button>
<Button type="primary" onClick={() => submitForm()}> <Button type="primary" onClick={() => submitForm()}>
{intl.formatMessage({id: 'pages.user.UserComplete', defaultMessage: '完成',})} {l('button.finish')}
</Button> </Button>
</> </>
); );
...@@ -117,7 +125,7 @@ const UserForm: React.FC<UserFormProps> = (props) => { ...@@ -117,7 +125,7 @@ const UserForm: React.FC<UserFormProps> = (props) => {
width={1200} width={1200}
bodyStyle={{padding: '32px 40px 48px'}} bodyStyle={{padding: '32px 40px 48px'}}
destroyOnClose destroyOnClose
title={formVals.id?intl.formatMessage({id: 'pages.user.UserUpdateUser', defaultMessage: '维护用户',}):intl.formatMessage({id: 'pages.user.UserCreateUser', defaultMessage: '创建用户',})} title={formVals.id ? l('pages.user.UserUpdateUser') : l('pages.user.UserCreateUser')}
visible={modalVisible} visible={modalVisible}
footer={renderFooter()} footer={renderFooter()}
onCancel={() => handleModalVisible()} onCancel={() => handleModalVisible()}
......
...@@ -29,6 +29,7 @@ import {UserTableListItem} from "@/pages/AuthenticationCenter/data.d"; ...@@ -29,6 +29,7 @@ import {UserTableListItem} from "@/pages/AuthenticationCenter/data.d";
import UserForm from "@/pages/AuthenticationCenter/UserManager/components/UserForm"; import UserForm from "@/pages/AuthenticationCenter/UserManager/components/UserForm";
import PasswordForm from "@/pages/AuthenticationCenter/UserManager/components/PasswordForm"; import PasswordForm from "@/pages/AuthenticationCenter/UserManager/components/PasswordForm";
import TableTransferFrom from "@/pages/AuthenticationCenter/UserManager/components/TableTransfer"; import TableTransferFrom from "@/pages/AuthenticationCenter/UserManager/components/TableTransfer";
import {useIntl} from "@@/plugin-locale/localeExports";
const url = '/api/user'; const url = '/api/user';
const UserTableList: React.FC<{}> = (props: any) => { const UserTableList: React.FC<{}> = (props: any) => {
...@@ -43,6 +44,9 @@ const UserTableList: React.FC<{}> = (props: any) => { ...@@ -43,6 +44,9 @@ const UserTableList: React.FC<{}> = (props: any) => {
const actionRef = useRef<ActionType>(); const actionRef = useRef<ActionType>();
const [selectedRowsState, setSelectedRows] = useState<UserTableListItem[]>([]); const [selectedRowsState, setSelectedRows] = useState<UserTableListItem[]>([]);
const international = useIntl();
const l = (key: string, defaultMsg?: string) => international.formatMessage({id: key, defaultMessage: defaultMsg})
const editAndDelete = (key: string | number, currentItem: UserTableListItem) => { const editAndDelete = (key: string | number, currentItem: UserTableListItem) => {
if (key === 'edit') { if (key === 'edit') {
setFormValues(currentItem); setFormValues(currentItem);
...@@ -52,10 +56,10 @@ const UserTableList: React.FC<{}> = (props: any) => { ...@@ -52,10 +56,10 @@ const UserTableList: React.FC<{}> = (props: any) => {
handlePasswordModalVisible(true); handlePasswordModalVisible(true);
} else if (key === 'delete') { } else if (key === 'delete') {
Modal.confirm({ Modal.confirm({
title: '删除用户', title: l('pages.user.delete'),
content: '确定删除该用户吗?', content: l('pages.user.deleteConfirm'),
okText: '确认', okText: l('button.confirm'),
cancelText: '取消', cancelText: l('button.cancel'),
onOk: async () => { onOk: async () => {
await handleRemove(url, [currentItem]); await handleRemove(url, [currentItem]);
actionRef.current?.reloadAndRest?.(); actionRef.current?.reloadAndRest?.();
...@@ -70,14 +74,14 @@ const UserTableList: React.FC<{}> = (props: any) => { ...@@ -70,14 +74,14 @@ const UserTableList: React.FC<{}> = (props: any) => {
<Dropdown <Dropdown
overlay={ overlay={
<Menu onClick={({key}) => editAndDelete(key, item)}> <Menu onClick={({key}) => editAndDelete(key, item)}>
<Menu.Item key="edit">编辑</Menu.Item> <Menu.Item key="edit">{l('button.edit')}</Menu.Item>
<Menu.Item key="password">修改密码</Menu.Item> <Menu.Item key="password">{l('button.changePassword')}</Menu.Item>
{item.username == 'admin' ? '' : (<Menu.Item key="delete">删除</Menu.Item>)} {item.username == 'admin' ? '' : (<Menu.Item key="delete">{l('button.delete')}</Menu.Item>)}
</Menu> </Menu>
} }
> >
<a> <a>
更多 <DownOutlined/> {l('button.more')} <DownOutlined/>
</a> </a>
</Dropdown> </Dropdown>
); );
...@@ -85,7 +89,7 @@ const UserTableList: React.FC<{}> = (props: any) => { ...@@ -85,7 +89,7 @@ const UserTableList: React.FC<{}> = (props: any) => {
const handleGrantRoleForm = () => { const handleGrantRoleForm = () => {
return ( return (
<Modal title="添加角色" visible={handleGrantRole} destroyOnClose={true} width={"1500px"} <Modal title={l('pages.user.AssignRole')} visible={handleGrantRole} destroyOnClose={true} width={"1500px"}
onCancel={() => { onCancel={() => {
setHandleGrantRole(false); setHandleGrantRole(false);
}} }}
...@@ -93,7 +97,7 @@ const UserTableList: React.FC<{}> = (props: any) => { ...@@ -93,7 +97,7 @@ const UserTableList: React.FC<{}> = (props: any) => {
<Button key="back" onClick={() => { <Button key="back" onClick={() => {
setHandleGrantRole(false); setHandleGrantRole(false);
}}> }}>
关闭 {l('button.close')}
</Button>, </Button>,
<Button type="primary" onClick={async () => { <Button type="primary" onClick={async () => {
// to save // to save
...@@ -110,7 +114,7 @@ const UserTableList: React.FC<{}> = (props: any) => { ...@@ -110,7 +114,7 @@ const UserTableList: React.FC<{}> = (props: any) => {
} }
}} }}
> >
确认 {l('button.confirm')}
</Button>, </Button>,
]}> ]}>
<TableTransferFrom user={formValues} onChange={(value) => { <TableTransferFrom user={formValues} onChange={(value) => {
...@@ -122,7 +126,7 @@ const UserTableList: React.FC<{}> = (props: any) => { ...@@ -122,7 +126,7 @@ const UserTableList: React.FC<{}> = (props: any) => {
const columns: ProColumns<UserTableListItem>[] = [ const columns: ProColumns<UserTableListItem>[] = [
{ {
title: '用户名', title: l('pages.user.UserName'),
dataIndex: 'username', dataIndex: 'username',
sorter: true, sorter: true,
render: (dom, entity) => { render: (dom, entity) => {
...@@ -137,60 +141,60 @@ const UserTableList: React.FC<{}> = (props: any) => { ...@@ -137,60 +141,60 @@ const UserTableList: React.FC<{}> = (props: any) => {
hideInSearch: true, hideInSearch: true,
}, },
{ {
title: '昵称', title: l('pages.user.UserNickName'),
sorter: true, sorter: true,
dataIndex: 'nickname', dataIndex: 'nickname',
hideInTable: false, hideInTable: false,
}, },
{ {
title: '工号', title: l('pages.user.UserJobNumber'),
sorter: true, sorter: true,
dataIndex: 'worknum', dataIndex: 'worknum',
hideInTable: false, hideInTable: false,
}, },
{ {
title: '手机号', title: l('pages.user.UserPhoneNumber'),
sorter: true, sorter: true,
dataIndex: 'mobile', dataIndex: 'mobile',
hideInTable: false, hideInTable: false,
}, },
{ {
title: '是否启用', title: l('pages.user.UserIsUse'),
dataIndex: 'enabled', dataIndex: 'enabled',
hideInForm: true, hideInForm: true,
hideInSearch: true, hideInSearch: true,
hideInTable: false, hideInTable: false,
filters: [ filters: [
{ {
text: '已启用', text: l('status.enabled'),
value: 1, value: 1,
}, },
{ {
text: '已禁用', text: l('status.disabled'),
value: 0, value: 0,
}, },
], ],
filterMultiple: false, filterMultiple: false,
valueEnum: { valueEnum: {
true: {text: '已启用', status: 'Success'}, true: {text: l('status.enabled'), status: 'Success'},
false: {text: '已禁用', status: 'Error'}, false: {text: l('status.disabled'), status: 'Error'},
}, },
}, },
{ {
title: '创建时间', title: l('pages.user.UserCreateTime'),
dataIndex: 'createTime', dataIndex: 'createTime',
sorter: true, sorter: true,
valueType: 'dateTime', valueType: 'dateTime',
hideInTable: true, hideInTable: true,
}, },
{ {
title: '最近更新时间', title: l('pages.user.UserUpdateTime'),
dataIndex: 'updateTime', dataIndex: 'updateTime',
sorter: true, sorter: true,
valueType: 'dateTime', valueType: 'dateTime',
}, },
{ {
title: '操作', title: l('pages.operate'),
dataIndex: 'option', dataIndex: 'option',
valueType: 'option', valueType: 'option',
render: (_, record) => [ render: (_, record) => [
...@@ -200,7 +204,7 @@ const UserTableList: React.FC<{}> = (props: any) => { ...@@ -200,7 +204,7 @@ const UserTableList: React.FC<{}> = (props: any) => {
setFormValues(record); setFormValues(record);
}} }}
> >
配置 {l('button.config')}
</a>, </a>,
<a <a
onClick={() => { onClick={() => {
...@@ -208,7 +212,7 @@ const UserTableList: React.FC<{}> = (props: any) => { ...@@ -208,7 +212,7 @@ const UserTableList: React.FC<{}> = (props: any) => {
setFormValues(record); setFormValues(record);
}} }}
> >
关联角色 {l('pages.user.AssignRole')}
</a>, </a>,
<MoreBtn key="more" item={record}/>, <MoreBtn key="more" item={record}/>,
], ],
...@@ -217,9 +221,9 @@ const UserTableList: React.FC<{}> = (props: any) => { ...@@ -217,9 +221,9 @@ const UserTableList: React.FC<{}> = (props: any) => {
return ( return (
<> <>
<PageContainer> <PageContainer title={false}>
<ProTable<UserTableListItem> <ProTable<UserTableListItem>
headerTitle="用户管理" headerTitle={l('pages.user.UserManger')}
actionRef={actionRef} actionRef={actionRef}
rowKey="id" rowKey="id"
search={{ search={{
...@@ -227,7 +231,7 @@ const UserTableList: React.FC<{}> = (props: any) => { ...@@ -227,7 +231,7 @@ const UserTableList: React.FC<{}> = (props: any) => {
}} }}
toolBarRender={() => [ toolBarRender={() => [
<Button type="primary" onClick={() => handleModalVisible(true)}> <Button type="primary" onClick={() => handleModalVisible(true)}>
<PlusOutlined/> 新建 <PlusOutlined/> {l('button.create')}
</Button>, </Button>,
]} ]}
request={(params, sorter, filter) => queryData(url, {...params, sorter, filter})} request={(params, sorter, filter) => queryData(url, {...params, sorter, filter})}
...@@ -240,9 +244,10 @@ const UserTableList: React.FC<{}> = (props: any) => { ...@@ -240,9 +244,10 @@ const UserTableList: React.FC<{}> = (props: any) => {
<FooterToolbar <FooterToolbar
extra={ extra={
<div> <div>
已选择 <a style={{fontWeight: 600}}>{selectedRowsState.length}</a>&nbsp;&nbsp; {l('tips.selected')} <a
style={{fontWeight: 600}}>{selectedRowsState.length}</a> {l('tips.item')}&nbsp;&nbsp;
<span> <span>
被禁用的用户共 {selectedRowsState.length - selectedRowsState.reduce((pre, item) => pre + (item.enabled ? 1 : 0), 0)} {l('pages.user.disableTotalOf')} {selectedRowsState.length - selectedRowsState.reduce((pre, item) => pre + (item.enabled ? 1 : 0), 0)} {l('pages.user.selectDisable')}
</span> </span>
</div> </div>
} }
...@@ -250,10 +255,10 @@ const UserTableList: React.FC<{}> = (props: any) => { ...@@ -250,10 +255,10 @@ const UserTableList: React.FC<{}> = (props: any) => {
<Button type="primary" danger <Button type="primary" danger
onClick={() => { onClick={() => {
Modal.confirm({ Modal.confirm({
title: '删除用户', title: l('pages.user.delete'),
content: '确定删除选中的用户吗?', content: l('pages.user.deleteConfirm'),
okText: '确认', okText: l('button.confirm'),
cancelText: '取消', cancelText: l('button.cancel'),
onOk: async () => { onOk: async () => {
await handleRemove(url, selectedRowsState); await handleRemove(url, selectedRowsState);
setSelectedRows([]); setSelectedRows([]);
...@@ -262,15 +267,15 @@ const UserTableList: React.FC<{}> = (props: any) => { ...@@ -262,15 +267,15 @@ const UserTableList: React.FC<{}> = (props: any) => {
}); });
}} }}
> >
批量删除 {l('button.batchDelete')}
</Button> </Button>
<Button type="primary" <Button type="primary"
onClick={() => { onClick={() => {
Modal.confirm({ Modal.confirm({
title: '启用用户', title: l('pages.user.enable'),
content: '确定启用选中的用户吗?', content: l('pages.user.enableConfirm'),
okText: '确认', okText: l('button.confirm'),
cancelText: '取消', cancelText: l('button.cancel'),
onOk: async () => { onOk: async () => {
await updateEnabled(url, selectedRowsState, true); await updateEnabled(url, selectedRowsState, true);
setSelectedRows([]); setSelectedRows([]);
...@@ -278,14 +283,14 @@ const UserTableList: React.FC<{}> = (props: any) => { ...@@ -278,14 +283,14 @@ const UserTableList: React.FC<{}> = (props: any) => {
} }
}); });
}} }}
>批量启用</Button> >{l('button.batchEnable')}</Button>
<Button danger <Button danger
onClick={() => { onClick={() => {
Modal.confirm({ Modal.confirm({
title: '禁用用户', title: l('pages.user.disable'),
content: '确定禁用选中的用户吗?', content: l('pages.user.disableConfirm'),
okText: '确认', okText: l('button.confirm'),
cancelText: '取消', cancelText: l('button.cancel'),
onOk: async () => { onOk: async () => {
await updateEnabled(url, selectedRowsState, false); await updateEnabled(url, selectedRowsState, false);
setSelectedRows([]); setSelectedRows([]);
...@@ -293,7 +298,7 @@ const UserTableList: React.FC<{}> = (props: any) => { ...@@ -293,7 +298,7 @@ const UserTableList: React.FC<{}> = (props: any) => {
} }
}); });
}} }}
>批量禁用</Button> >{l('button.batchDisable')}</Button>
</FooterToolbar> </FooterToolbar>
)} )}
<UserForm <UserForm
...@@ -317,7 +322,7 @@ const UserTableList: React.FC<{}> = (props: any) => { ...@@ -317,7 +322,7 @@ const UserTableList: React.FC<{}> = (props: any) => {
<> <>
<PasswordForm <PasswordForm
onSubmit={async (value) => { onSubmit={async (value) => {
const success = await handleOption(url + "/modifyPassword", '修改密码', value); const success = await handleOption(url + "/modifyPassword", l('button.changePassword'), value);
if (success) { if (success) {
handlePasswordModalVisible(false); handlePasswordModalVisible(false);
setFormValues({}); setFormValues({});
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment