diff --git a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/service/impl/UserServiceImpl.java b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/service/impl/UserServiceImpl.java index 853e6819d..fb3937356 100644 --- a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/service/impl/UserServiceImpl.java +++ b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/service/impl/UserServiceImpl.java @@ -39,6 +39,7 @@ import org.apache.seatunnel.app.service.IRoleService; import org.apache.seatunnel.app.service.IUserService; import org.apache.seatunnel.app.utils.PasswordUtils; +import org.apache.seatunnel.app.utils.ServletUtils; import org.apache.seatunnel.server.common.PageData; import org.apache.seatunnel.server.common.SeatunnelErrorEnum; import org.apache.seatunnel.server.common.SeatunnelException; @@ -135,6 +136,11 @@ public void update(UpdateUserReq updateReq) { @Override @Transactional(rollbackFor = Exception.class) public void delete(int id) { + // can't delete yourself + if (ServletUtils.getCurrentUserId() == id) { + throw new SeatunnelException( + SeatunnelErrorEnum.INVALID_OPERATION, "Can't delete yourself"); + } userDaoImpl.delete(id); roleServiceImpl.deleteByUserId(id); } diff --git a/seatunnel-server/seatunnel-server-common/src/main/java/org/apache/seatunnel/server/common/SeatunnelErrorEnum.java b/seatunnel-server/seatunnel-server-common/src/main/java/org/apache/seatunnel/server/common/SeatunnelErrorEnum.java index 56c89da33..8a232b343 100644 --- a/seatunnel-server/seatunnel-server-common/src/main/java/org/apache/seatunnel/server/common/SeatunnelErrorEnum.java +++ b/seatunnel-server/seatunnel-server-common/src/main/java/org/apache/seatunnel/server/common/SeatunnelErrorEnum.java @@ -91,6 +91,7 @@ public enum SeatunnelErrorEnum { 40005, "load engine metrics error", "load engine metrics error. error msg is [%s]"), JOB_NO_VALUE_FOUND_FOR_PLACEHOLDER( 40006, "No value found for placeholder", "No value found for placeholder: [%s]"), + INVALID_OPERATION(40007, "invalid operation", "invalid operation [%s]"), JOB_RUN_GENERATE_UUID_ERROR(50001, "generate uuid error", "generate uuid error"), /* datasource and virtual table */ diff --git a/seatunnel-ui/src/views/user-manage/list/use-table.ts b/seatunnel-ui/src/views/user-manage/list/use-table.ts index d781c8572..b1afd766e 100644 --- a/seatunnel-ui/src/views/user-manage/list/use-table.ts +++ b/seatunnel-ui/src/views/user-manage/list/use-table.ts @@ -17,14 +17,16 @@ import { reactive, ref, h } from 'vue' import { useI18n } from 'vue-i18n' -import { NSpace, NButton } from 'naive-ui' +import { NSpace, NButton, NTooltip } from 'naive-ui' import { userList, userDelete, userEnable, userDisable } from '@/service/user' import { getTableColumn } from '@/common/table' import type { ResponseTable } from '@/service/types' import type { UserDetail } from '@/service/user/types' +import { useUserStore } from '@/store/user' export function useTable() { const { t } = useI18n() + const userStore = useUserStore() const state = reactive({ columns: [], tableData: [], @@ -56,8 +58,11 @@ export function useTable() { { title: t('user_manage.operation'), key: 'operation', - render: (row: UserDetail) => - h(NSpace, null, { + render: (row: UserDetail) => { + const currentUser = userStore.getUserInfo as UserDetail + const isCurrentUser = Boolean(currentUser?.id && row?.id && currentUser.id === row.id) + + return h(NSpace, null, { default: () => [ h( NButton, @@ -76,11 +81,18 @@ export function useTable() { ), h( NButton, - { text: true, onClick: () => handleDelete(row) }, - { default: () => t('user_manage.delete') } + { + text: true, + disabled: isCurrentUser, + onClick: () => handleDelete(row) + }, + { + default: () => t('user_manage.delete') + } ) ] }) + } } ] }