Bind Feishu identity to OpenVPN sessions and refine management UI

This commit is contained in:
opsx committed 2026-10-22 23:24:41 +08:00
1 parent 347799cb1e
commit 8fd8c0cd73
27 files changed
+1556 -1011

No files matched your search

+14 -4
View File
@@ -13,7 +13,9 @@
</div>
</template>
<el-table :data="sessions" size="default" v-loading="loading">
<el-table-column prop="username" :label="$t('common.username')" min-width="120" />
<el-table-column :label="$t('common.username')" min-width="120">
<template #default="{ row }"><span :title="row.username">{{ row.display_name || displayUsername(row.username) }}</span><div v-if="row.display_name" class="identity-subject">{{ row.username }}</div></template>
</el-table-column>
<el-table-column :label="$t('common.protocol')" width="100">
<template #default="{ row }">
<span class="protocol-tag" :style="{ color: protocolColor(row.protocol) }">{{ $t(protocolDisplay(row.protocol)) }}</span>
@@ -64,7 +66,9 @@
<el-table-column prop="created_at" :label="$t('common.time')" width="170">
<template #default="{ row }">{{ new Date(row.created_at).toLocaleString() }}</template>
</el-table-column>
<el-table-column prop="username" :label="$t('common.username')" width="100" />
<el-table-column :label="$t('common.username')" min-width="180">
<template #default="{ row }"><span :title="row.username">{{ row.display_name || displayUsername(row.username) }}</span><div v-if="row.display_name" class="identity-subject">{{ row.username }}</div></template>
</el-table-column>
<el-table-column :label="$t('sessions.event')" width="100">
<template #default="{ row }">
<el-tag :type="eventTagType(row.event)" size="small">{{ eventLabel(row.event) }}</el-tag>
@@ -92,6 +96,12 @@ const alerts = ref([])
const loading = ref(false)
const loadError = ref('')
function displayUsername(value) {
return typeof value === 'string' && value.trim() && value.trim().toUpperCase() !== 'UNDEF'
? value
: t('sessions.identityUnknown')
}
function fmtDuration(dur) {
if (!dur) return '-'
const sec = Math.floor((Date.now() - new Date(dur).getTime()) / 1000)
@@ -125,7 +135,7 @@ async function load() {
async function disconnect(row) {
try {
await ElMessageBox.confirm(t('sessions.kickConfirm', { username: row.username }), t('common.confirm'), { type: 'warning' })
await ElMessageBox.confirm(t('sessions.kickConfirm', { username: row.display_name || displayUsername(row.username) }), t('common.confirm'), { type: 'warning' })
await api.post(`/sessions/${row.id}/disconnect`)
ElMessage.success(t('sessions.kicked'))
load()
@@ -137,4 +147,4 @@ onMounted(() => { load(); timer = setInterval(load, 15000) })
onUnmounted(() => clearInterval(timer))
</script>
<style scoped>.session-error { margin-bottom: var(--space-4); }</style>
<style scoped>.identity-subject { font-size: 11px; color: var(--el-text-color-secondary); overflow-wrap: anywhere; } .session-error { margin-bottom: var(--space-4); }</style>