From 36cc37c2dfd03bc9fe38b66577c4bdb9e8513ae7 Mon Sep 17 00:00:00 2001 From: colin Date: Fri, 8 Aug 2025 18:41:06 +0800 Subject: [PATCH] feat(vben5): Personal Settings component - Personal Settings Add components to enable configuration items - It is allowed to revoke my session --- .../@abp/account/src/components/MySetting.vue | 33 ++++++++++++++++--- .../components/sessions/UserSessionTable.vue | 18 ++++++---- 2 files changed, 41 insertions(+), 10 deletions(-) diff --git a/apps/vben5/packages/@abp/account/src/components/MySetting.vue b/apps/vben5/packages/@abp/account/src/components/MySetting.vue index ee412c254..9266f6f8c 100644 --- a/apps/vben5/packages/@abp/account/src/components/MySetting.vue +++ b/apps/vben5/packages/@abp/account/src/components/MySetting.vue @@ -2,7 +2,7 @@ import type { ProfileDto, UpdateProfileDto } from '../types/profile'; import type { UserInfo } from '../types/user'; -import { computed, defineAsyncComponent, onMounted, reactive, ref } from 'vue'; +import { computed, defineAsyncComponent, onMounted, ref } from 'vue'; import { useRoute } from 'vue-router'; import { useVbenModal } from '@vben/common-ui'; @@ -13,6 +13,19 @@ import { Card, Menu, message, Modal } from 'ant-design-vue'; import { useProfileApi } from '../api/useProfileApi'; +interface MenuItem { + key: string; + label: string; +} + +const props = defineProps<{ + disableAuthenticator?: boolean; + disableBind?: boolean; + disableNotice?: boolean; + disablePersonalData?: boolean; + disableSecurity?: boolean; + disableSession?: boolean; +}>(); const AuthenticatorSettings = defineAsyncComponent( () => import('./components/AuthenticatorSettings.vue'), ); @@ -40,7 +53,7 @@ const { query } = useRoute(); const selectedMenuKeys = ref(['basic']); const myProfile = ref({} as ProfileDto); -const menuItems = reactive([ +const basicMenuItems: MenuItem[] = [ { key: 'basic', label: $t('abp.account.settings.basic.title'), @@ -69,7 +82,19 @@ const menuItems = reactive([ key: 'personal-data', label: $t('abp.account.settings.personalDataSettings'), }, -]); +]; +const getEnabledMenus = computed(() => { + return basicMenuItems.filter((x) => { + if (x.key === 'basic') return true; + if (x.key === 'authenticator') return !props.disableAuthenticator; + if (x.key === 'bind') return !props.disableBind; + if (x.key === 'notice') return !props.disableNotice; + if (x.key === 'personal-data') return !props.disablePersonalData; + if (x.key === 'security') return !props.disableSecurity; + if (x.key === 'session') return !props.disableSession; + return true; // default case for any unexpected keys + }); +}); const getUserInfo = computed((): null | UserInfo => { if (!userStore.userInfo) { return null; @@ -155,7 +180,7 @@ onMounted(async () => {
diff --git a/apps/vben5/packages/@abp/identity/src/components/sessions/UserSessionTable.vue b/apps/vben5/packages/@abp/identity/src/components/sessions/UserSessionTable.vue index b2c02d0b7..aa0c99a7f 100644 --- a/apps/vben5/packages/@abp/identity/src/components/sessions/UserSessionTable.vue +++ b/apps/vben5/packages/@abp/identity/src/components/sessions/UserSessionTable.vue @@ -24,17 +24,20 @@ const DescriptionItem = Descriptions.Item; const { hasAccessByCodes } = useAccess(); const abpStore = useAbpStore(); -/** 获取登录用户会话Id */ -const getMySessionId = computed(() => { - return abpStore.application?.currentUser.sessionId; +/** 获取登录用户 */ +const getCurrentUser = computed(() => { + return abpStore.application?.currentUser; }); /** 获取是否允许撤销会话 */ const getAllowRevokeSession = computed(() => { return (session: IdentitySessionDto) => { - if (getMySessionId.value === session.sessionId) { + if (getCurrentUser.value?.sessionId === session.sessionId) { return false; } - return hasAccessByCodes([IdentitySessionPermissions.Revoke]); + return ( + getCurrentUser.value?.id === session.userId || + hasAccessByCodes([IdentitySessionPermissions.Revoke]) + ); }; }); @@ -106,7 +109,10 @@ function onDelete(session: IdentitySessionDto) {
{{ row.device }}
- + {{ $t('AbpIdentity.CurrentSession') }}