fix: webclient share
feat: peer list
This commit is contained in:
@@ -16,7 +16,7 @@ export const toWebClientLink = (row) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export async function getPeerSlat (id) {
|
export async function getPeerSlat (id) {
|
||||||
const [addr, port] = app.setting.rustdeskConfig.value.id_server.split(':')
|
const [addr, port] = app.setting.rustdeskConfig.id_server.split(':')
|
||||||
if (!addr) {
|
if (!addr) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -69,7 +69,7 @@ export async function getPeerSlat (id) {
|
|||||||
await _ws.open()
|
await _ws.open()
|
||||||
console.log(new Date() + ': Connected to relay server')
|
console.log(new Date() + ': Connected to relay server')
|
||||||
const request_relay = rendezvous.RequestRelay.fromPartial({
|
const request_relay = rendezvous.RequestRelay.fromPartial({
|
||||||
licence_key: app.setting.rustdeskConfig.value.key || undefined,
|
licence_key: app.setting.rustdeskConfig.key || undefined,
|
||||||
uuid,
|
uuid,
|
||||||
})
|
})
|
||||||
_ws.sendRendezvous({ request_relay })
|
_ws.sendRendezvous({ request_relay })
|
||||||
@@ -94,5 +94,5 @@ export async function getPeerSlat (id) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function getV2ShareUrl (token) {
|
export function getV2ShareUrl (token) {
|
||||||
return `${app.setting.rustdeskConfig.value.api_server}/webclient2/#/?share_token=${token}`
|
return `${app.setting.rustdeskConfig.api_server}/webclient2/#/?share_token=${token}`
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -51,6 +51,7 @@
|
|||||||
<el-table-column prop="username" :label="T('Username')" align="center" width="120"/>
|
<el-table-column prop="username" :label="T('Username')" align="center" width="120"/>
|
||||||
<el-table-column prop="uuid" :label="T('Uuid')" align="center" width="120" show-overflow-tooltip/>
|
<el-table-column prop="uuid" :label="T('Uuid')" align="center" width="120" show-overflow-tooltip/>
|
||||||
<el-table-column prop="version" :label="T('Version')" align="center" width="80"/>
|
<el-table-column prop="version" :label="T('Version')" align="center" width="80"/>
|
||||||
|
<el-table-column prop="alias" :label="T('Alias')" align="center" width="80"/>
|
||||||
<el-table-column prop="created_at" :label="T('CreatedAt')" align="center" width="150"/>
|
<el-table-column prop="created_at" :label="T('CreatedAt')" align="center" width="150"/>
|
||||||
<el-table-column prop="updated_at" :label="T('UpdatedAt')" align="center" width="150"/>
|
<el-table-column prop="updated_at" :label="T('UpdatedAt')" align="center" width="150"/>
|
||||||
<el-table-column :label="T('Actions')" align="center" width="500" class-name="table-actions" fixed="right">
|
<el-table-column :label="T('Actions')" align="center" width="500" class-name="table-actions" fixed="right">
|
||||||
|
|||||||
+89
-18
@@ -49,13 +49,11 @@
|
|||||||
<br>
|
<br>
|
||||||
<span>{{ T('You can reference export file') }}</span>
|
<span>{{ T('You can reference export file') }}</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
</el-upload>
|
</el-upload>
|
||||||
<el-button @click="showImport=false" type="primary">{{ T('Cancel') }}</el-button>
|
<el-button @click="showImport=false" type="primary">{{ T('Cancel') }}</el-button>
|
||||||
<template #reference>
|
<template #reference>
|
||||||
<el-button @click="showImport=true" type="danger">{{ T('Import') }}</el-button>
|
<el-button @click="showImport=true" type="danger" :icon="ArrowDown">{{ T('Import') }}</el-button>
|
||||||
</template>
|
</template>
|
||||||
</el-popover>
|
</el-popover>
|
||||||
<el-button type="danger" @click="toBatchDelete">{{ T('BatchDelete') }}</el-button>
|
<el-button type="danger" @click="toBatchDelete">{{ T('BatchDelete') }}</el-button>
|
||||||
@@ -64,36 +62,44 @@
|
|||||||
</el-form>
|
</el-form>
|
||||||
</el-card>
|
</el-card>
|
||||||
<el-card class="list-body" shadow="hover">
|
<el-card class="list-body" shadow="hover">
|
||||||
|
<div style="text-align: right; margin-bottom: 10px">
|
||||||
|
<el-button :icon="Setting" @click="showColumnSetting"></el-button>
|
||||||
|
</div>
|
||||||
|
|
||||||
<el-table :data="listRes.list" v-loading="listRes.loading" border size="small" @selection-change="handleSelectionChange">
|
<el-table :data="listRes.list" v-loading="listRes.loading" border size="small" @selection-change="handleSelectionChange">
|
||||||
<el-table-column type="selection" width="55" align="center"/>
|
<el-table-column type="selection" width="55" align="center"/>
|
||||||
<el-table-column prop="id" label="ID" align="center" width="150">
|
<template v-for="c in visibleColumns.filter(cc => cc.visible)" :key="c">
|
||||||
|
<el-table-column v-if="c.name==='id'" prop="id" label="ID" align="center" width="150">
|
||||||
<template #default="{row}">
|
<template #default="{row}">
|
||||||
<span>{{ row.id }} <el-icon @click="handleClipboard(row.id, $event)"><CopyDocument/></el-icon></span>
|
<span>{{ row.id }} <el-icon @click="handleClipboard(row.id, $event)"><CopyDocument/></el-icon></span>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column prop="cpu" label="CPU" align="center" width="100" show-overflow-tooltip/>
|
<el-table-column v-if="c.name==='cpu'" prop="cpu" label="CPU" align="center" width="100" show-overflow-tooltip/>
|
||||||
<el-table-column prop="hostname" :label="T('Hostname')" align="center" width="120"/>
|
<el-table-column v-if="c.name==='hostname'" prop="hostname" :label="T('Hostname')" align="center" width="120"/>
|
||||||
<el-table-column prop="memory" :label="T('Memory')" align="center" width="120"/>
|
<el-table-column v-if="c.name==='memory'" prop="memory" :label="T('Memory')" align="center" width="120"/>
|
||||||
<el-table-column prop="os" :label="T('Os')" align="center" width="120" show-overflow-tooltip/>
|
<el-table-column v-if="c.name==='os'" prop="os" :label="T('Os')" align="center" width="120" show-overflow-tooltip/>
|
||||||
<el-table-column prop="last_online_time" :label="T('LastOnlineTime')" align="center" min-width="120">
|
<el-table-column v-if="c.name==='last_online_time'" prop="last_online_time" :label="T('LastOnlineTime')" align="center" min-width="120">
|
||||||
<template #default="{row}">
|
<template #default="{row}">
|
||||||
<div class="last_oline_time">
|
<div class="last_oline_time">
|
||||||
<span> {{ row.last_online_time ? timeAgo(row.last_online_time * 1000) : '-' }}</span> <span class="dot" :class="{red: timeDis(row.last_online_time) >= 60, green: timeDis(row.last_online_time)< 60}"></span>
|
<span> {{ row.last_online_time ? timeAgo(row.last_online_time * 1000) : '-' }}</span> <span class="dot" :class="{red: timeDis(row.last_online_time) >= 60, green: timeDis(row.last_online_time)< 60}"></span>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column prop="last_online_ip" :label="T('LastOnlineIp')" align="center" min-width="120"/>
|
<el-table-column v-if="c.name==='last_online_ip'" prop="last_online_ip" :label="T('LastOnlineIp')" align="center" min-width="120"/>
|
||||||
<el-table-column prop="username" :label="T('Username')" align="center" width="120"/>
|
<el-table-column v-if="c.name==='username'" prop="username" :label="T('Username')" align="center" width="120"/>
|
||||||
<el-table-column prop="group_id" :label="T('Group')" align="center" width="120">
|
<el-table-column v-if="c.name==='group_id'" prop="group_id" :label="T('Group')" align="center" width="120">
|
||||||
<template #default="{row}">
|
<template #default="{row}">
|
||||||
<span v-if="row.group_id"> <el-tag>{{ groupListRes.list?.find(g => g.id === row.group_id)?.name }} </el-tag> </span>
|
<span v-if="row.group_id"> <el-tag>{{ groupListRes.list?.find(g => g.id === row.group_id)?.name }} </el-tag> </span>
|
||||||
<span v-else> - </span>
|
<span v-else> - </span>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column prop="uuid" :label="T('Uuid')" align="center" width="120" show-overflow-tooltip/>
|
<el-table-column v-if="c.name==='uuid'" prop="uuid" :label="T('Uuid')" align="center" width="120" show-overflow-tooltip/>
|
||||||
<el-table-column prop="version" :label="T('Version')" align="center" width="80"/>
|
<el-table-column v-if="c.name==='version'" prop="version" :label="T('Version')" align="center" width="80"/>
|
||||||
<el-table-column prop="created_at" :label="T('CreatedAt')" align="center" width="150"/>
|
<el-table-column v-if="c.name==='alias'" prop="alias" :label="T('Alias')" align="center" width="80"/>
|
||||||
<el-table-column prop="updated_at" :label="T('UpdatedAt')" align="center" width="150"/>
|
<el-table-column v-if="c.name==='created_at'" prop="created_at" :label="T('CreatedAt')" align="center" width="150"/>
|
||||||
|
<el-table-column v-if="c.name==='updated_at'" prop="updated_at" :label="T('UpdatedAt')" align="center" width="150"/>
|
||||||
|
</template>
|
||||||
|
|
||||||
<el-table-column :label="T('Actions')" align="center" width="500" class-name="table-actions" fixed="right">
|
<el-table-column :label="T('Actions')" align="center" width="500" class-name="table-actions" fixed="right">
|
||||||
<template #default="{row}">
|
<template #default="{row}">
|
||||||
<el-button type="success" @click="connectByClient(row.id)">{{ T('Link') }}</el-button>
|
<el-button type="success" @click="connectByClient(row.id)">{{ T('Link') }}</el-button>
|
||||||
@@ -150,7 +156,9 @@
|
|||||||
<el-form-item :label="T('Version')" prop="version">
|
<el-form-item :label="T('Version')" prop="version">
|
||||||
<el-input v-model="formData.version"></el-input>
|
<el-input v-model="formData.version"></el-input>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
<el-form-item :label="T('Alias')" prop="alias">
|
||||||
|
<el-input v-model="formData.alias"></el-input>
|
||||||
|
</el-form-item>
|
||||||
<el-form-item>
|
<el-form-item>
|
||||||
<el-button @click="formVisible = false">{{ T('Cancel') }}</el-button>
|
<el-button @click="formVisible = false">{{ T('Cancel') }}</el-button>
|
||||||
<el-button @click="submit" type="primary">{{ T('Submit') }}</el-button>
|
<el-button @click="submit" type="primary">{{ T('Submit') }}</el-button>
|
||||||
@@ -196,6 +204,28 @@
|
|||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-form>
|
</el-form>
|
||||||
</el-dialog>
|
</el-dialog>
|
||||||
|
|
||||||
|
<el-dialog v-model="columnSettingVisible" title="Column Setting">
|
||||||
|
<div v-for="(row, key) in visibleColumns" :key="key" style="margin-bottom: 10px;display: flex;align-items: center">
|
||||||
|
<div style="width: 200px">
|
||||||
|
<el-checkbox v-model="row.visible" :label="true">{{ T(row.label) }}</el-checkbox>
|
||||||
|
</div>
|
||||||
|
<div @click="upColumn(key)" style="width: 100px;cursor: pointer">
|
||||||
|
<el-icon :size="20">
|
||||||
|
<ArrowUp/>
|
||||||
|
</el-icon>
|
||||||
|
</div>
|
||||||
|
<div @click="downColumn(key)" style="width: 100px;cursor: pointer">
|
||||||
|
<el-icon :size="20">
|
||||||
|
<ArrowDown/>
|
||||||
|
</el-icon>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<span slot="footer" class="dialog-footer">
|
||||||
|
<el-button @click="columnSettingVisible = false">{{ T('Cancel') }}</el-button>
|
||||||
|
<el-button type="primary" @click="saveColumnSetting">{{ T('Save') }}</el-button>
|
||||||
|
</span>
|
||||||
|
</el-dialog>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@@ -211,7 +241,7 @@
|
|||||||
import { loadAllUsers } from '@/global'
|
import { loadAllUsers } from '@/global'
|
||||||
import { useAppStore } from '@/store/app'
|
import { useAppStore } from '@/store/app'
|
||||||
import { connectByClient } from '@/utils/peer'
|
import { connectByClient } from '@/utils/peer'
|
||||||
import { CopyDocument } from '@element-plus/icons'
|
import { ArrowDown, ArrowUp, CopyDocument, Setting } from '@element-plus/icons'
|
||||||
import { handleClipboard } from '@/utils/clipboard'
|
import { handleClipboard } from '@/utils/clipboard'
|
||||||
import { batchCreateFromPeers } from '@/api/address_book'
|
import { batchCreateFromPeers } from '@/api/address_book'
|
||||||
import { useRepositories as useCollectionRepositories } from '@/views/address_book/collection'
|
import { useRepositories as useCollectionRepositories } from '@/views/address_book/collection'
|
||||||
@@ -495,6 +525,47 @@
|
|||||||
}
|
}
|
||||||
// 批量添加到地址簿 end
|
// 批量添加到地址簿 end
|
||||||
|
|
||||||
|
const columnSettingVisible = ref(false)
|
||||||
|
const allColumns = ref([
|
||||||
|
{ name: 'id', visible: true, label: 'Id' },
|
||||||
|
{ name: 'cpu', visible: true, label: 'Cpu' },
|
||||||
|
{ name: 'hostname', visible: true, label: 'Hostname' },
|
||||||
|
{ name: 'memory', visible: true, label: 'Memory' },
|
||||||
|
{ name: 'os', visible: true, label: 'Os' },
|
||||||
|
{ name: 'last_online_time', visible: true, label: 'LastOnlineTime' },
|
||||||
|
{ name: 'last_online_ip', visible: true, label: 'LastOnlineIp' },
|
||||||
|
{ name: 'username', visible: true, label: 'Username' },
|
||||||
|
{ name: 'group_id', visible: true, label: 'Group' },
|
||||||
|
{ name: 'uuid', visible: true, label: 'Uuid' },
|
||||||
|
{ name: 'version', visible: true, label: 'Version' },
|
||||||
|
{ name: 'alias', visible: true, label: 'Alias' },
|
||||||
|
{ name: 'created_at', visible: true, label: 'CreatedAt' },
|
||||||
|
{ name: 'updated_at', visible: true, label: 'UpdatedAt' },
|
||||||
|
])
|
||||||
|
const visibleColumns = ref(JSON.parse(localStorage.getItem('peer_visible_columns')) || allColumns.value)
|
||||||
|
const showColumnSetting = () => {
|
||||||
|
columnSettingVisible.value = true
|
||||||
|
}
|
||||||
|
const saveColumnSetting = () => {
|
||||||
|
localStorage.setItem('peer_visible_columns', JSON.stringify(visibleColumns.value))
|
||||||
|
ElMessage.success(T('OperationSuccess'))
|
||||||
|
columnSettingVisible.value = false
|
||||||
|
}
|
||||||
|
|
||||||
|
const upColumn = (index) => {
|
||||||
|
if (index === 0) return
|
||||||
|
const col = visibleColumns.value[index]
|
||||||
|
visibleColumns.value.splice(index, 1)
|
||||||
|
visibleColumns.value.splice(index - 1, 0, col)
|
||||||
|
|
||||||
|
}
|
||||||
|
const downColumn = (index) => {
|
||||||
|
if (index === visibleColumns.value.length - 1) return
|
||||||
|
const col = visibleColumns.value[index]
|
||||||
|
visibleColumns.value.splice(index, 1)
|
||||||
|
visibleColumns.value.splice(index + 1, 0, col)
|
||||||
|
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped lang="scss">
|
<style scoped lang="scss">
|
||||||
|
|||||||
Reference in New Issue
Block a user