feat: 用户在线session 控制

This commit is contained in:
feng
2023-09-13 16:53:15 +08:00
committed by Bryan
parent 83d730cf0f
commit 54c30fcc0d
5 changed files with 152 additions and 0 deletions

View File

@@ -925,6 +925,7 @@
"CurrentConnections": "Current connections",
"TodayFailedConnections": "Connections failed today",
"OnlineSessions": "Online sessions",
"OnlineUserDevices": "Online user devices",
"RealTimeData": "Real-time data",
"UserAssetActivity": "User/Asset activity",
"UserData": "User data",
@@ -1271,6 +1272,7 @@
"CommandStorageUpdate": "Command storage update",
"Commands": "Commands",
"FileTransfer": "File transfer",
"OnlineSession": "Online session",
"CreateCommandStorage": "Create command storage",
"CreateReplayStorage": "Create replay storage",
"Dashboard": "Dashboard",
@@ -1451,6 +1453,10 @@
"NoPermission": "No permission"
},
"terminal": {
"OnlineSessionHelpMsg": "The current session cannot be offline because it is an online session of the current user. Currently, only users who have logged in through web mode are recorded.",
"Offline": "Offline",
"OfflineSuccessMsg": "Offline success",
"BulkOffline": "Bulk offline",
"Marketplace": "Marketplace",
"Author": "Author",
"Uploading": "File uploading",

View File

@@ -1277,6 +1277,8 @@
"CommandStorageUpdate": "コマンドストアの更新",
"Commands": "コマンド記録",
"FileTransfer": "ファイル転送",
"OnlineSession": "オンラインセッション",
"OnlineUserDevices": "オンラインデバイス",
"CreateCommandStorage": "コマンドストアの作成",
"CreateReplayStorage": "録画ストレージの作成",
"Dashboard": "ダッシュボード",
@@ -1446,6 +1448,10 @@
"NoPermission": "権限なし"
},
"terminal": {
"Offline": "オフライン",
"OnlineSessionHelpMsg": "セッションが現在のユーザーのオンラインセッションであるため、現在のセッションをオフラインできません。現在はWebログイン済みのユーザーのみが記録されています。",
"OfflineSuccessMsg": "オフラインに成功しました",
"BulkOffline": "オフライン",
"Marketplace": "マーケットプレイス",
"Author": "作者",
"Uploading": "ファイルのアップロード",

View File

@@ -1290,6 +1290,8 @@
"CommandStorageUpdate": "更新命令存储",
"Commands": "命令记录",
"FileTransfer": "文件传输",
"OnlineSession": "在线用户",
"OnlineUserDevices": "在线用户设备",
"CreateCommandStorage": "创建命令存储",
"CreateReplayStorage": "创建录像存储",
"Dashboard": "仪表盘",
@@ -1421,6 +1423,10 @@
"NoPermission": "暂无权限"
},
"terminal": {
"OnlineSessionHelpMsg": "无法下线当前会话,因为该会话是当前用户的在线会话。当前只记录以 Web 方式登录的用户。",
"Offline": "下线",
"OfflineSuccessMsg": "下线成功",
"BulkOffline": "批量下线",
"Marketplace": "应用市场",
"Author": "作者",
"BasePort": "监听端口",

View File

@@ -31,6 +31,16 @@ export default {
permissions: []
}
},
{
path: '/audit/online-user-session',
component: () => import('@/views/sessions/OnlineSession/OnlineSessionList'),
name: 'OnlineSession',
meta: {
icon: 'users',
title: i18n.t('route.OnlineSession'),
permissions: ['users.view_usersession']
}
},
{
path: '/audit/sessions',
component: empty,

View File

@@ -0,0 +1,124 @@
<template>
<GenericListPage
ref="GenericListPage"
:title="this.$t('route.OnlineUserDevices')"
:header-actions="headerActions"
:table-config="tableConfig"
:help-message="helpMsg"
/>
</template>
<script>
import GenericListPage from '@/layout/components/GenericListPage'
export default {
components: {
GenericListPage
},
data() {
const vm = this
return {
helpMsg: this.$t('terminal.OnlineSessionHelpMsg'),
tableConfig: {
permissions: {
app: 'users',
resource: 'usersession'
},
url: '/api/v1/users/user-sessions/',
columnsExclude: ['backend', 'user', 'is_current_user_session', 'type'],
columnsShow: {
min: ['user_display', 'actions'],
default: [
'user_display', 'ip', 'city',
'user_agent', 'date_created', 'actions'
]
},
columns: [
'user_display', 'backend_display', 'ip', 'city',
'user_agent', 'date_created', 'date_expired', 'actions'
],
columnsMeta: {
user_display: {
label: this.$t('audits.User'),
formatter: function(row) {
const to = {
name: 'UserDetail',
params: { id: row.user.id }
}
if (vm.$hasPerm('users.view_user')) {
return <router-link to={to}>{row.user.name}</router-link>
} else {
return <span>{row.user.name}</span>
}
}
},
actions: {
formatterArgs: {
hasDelete: false,
hasUpdate: false,
hasClone: false,
extraActions: [
{
name: 'OfflineSession',
title: this.$t('terminal.Offline'),
can: ({ row }) => {
return vm.$hasPerm('users.offline_usersession') && !row.is_current_user_session
},
type: 'danger',
callback: ({ row }) => {
this.$axios.post(
'/api/v1/users/user-sessions/offline/',
{ ids: [row.id] }
).then(() => {
vm.$message.success(this.$tc('terminal.OfflineSuccessMsg'))
vm.$refs.GenericListPage.$refs.ListTable.$refs.ListTable.reloadTable()
})
}
}
]
}
}
}
},
headerActions: {
hasExport: false,
hasImport: false,
hasCreate: false,
hasBulkDelete: false,
hasLeftActions: true,
hasRightActions: true,
extraMoreActions: [
{
name: 'OfflineSelected',
title: this.$t('terminal.BulkOffline'),
type: 'danger',
fa: 'clean',
can: ({ selectedRows }) => {
return selectedRows.length > 0 && vm.$hasPerm('users.offline_usersession')
},
callback: function({ selectedRows }) {
vm.$axios.post(
'/api/v1/users/user-sessions/offline/',
{
ids: selectedRows.map(v => {
return v.id
})
}
).then(res => {
vm.$message.success(vm.$tc('terminal.OfflineSuccessMsg'))
vm.$refs.GenericListPage.$refs.ListTable.$refs.ListTable.reloadTable()
})
}
}
]
}
}
}
}
</script>
<style lang="scss" scoped>
.cell a {
color: var(--color-info);
}
</style>