|
|
@@ -49,13 +49,11 @@
|
|
49
|
49
|
<br>
|
|
50
|
50
|
<span>{{ T('You can reference export file') }}</span>
|
|
51
|
51
|
</div>
|
|
52
|
|
-
|
|
53
|
52
|
</template>
|
|
54
|
|
-
|
|
55
|
53
|
</el-upload>
|
|
56
|
54
|
<el-button @click="showImport=false" type="primary">{{ T('Cancel') }}</el-button>
|
|
57
|
55
|
<template #reference>
|
|
58
|
|
- <el-button @click="showImport=true" type="danger">{{ T('Import') }}</el-button>
|
|
|
56
|
+ <el-button @click="showImport=true" type="danger" :icon="ArrowDown">{{ T('Import') }}</el-button>
|
|
59
|
57
|
</template>
|
|
60
|
58
|
</el-popover>
|
|
61
|
59
|
<el-button type="danger" @click="toBatchDelete">{{ T('BatchDelete') }}</el-button>
|
|
|
@@ -64,36 +62,44 @@
|
|
64
|
62
|
</el-form>
|
|
65
|
63
|
</el-card>
|
|
66
|
64
|
<el-card class="list-body" shadow="hover">
|
|
|
65
|
+ <div style="text-align: right; margin-bottom: 10px">
|
|
|
66
|
+ <el-button :icon="Setting" @click="showColumnSetting"></el-button>
|
|
|
67
|
+ </div>
|
|
|
68
|
+
|
|
67
|
69
|
<el-table :data="listRes.list" v-loading="listRes.loading" border size="small" @selection-change="handleSelectionChange">
|
|
68
|
70
|
<el-table-column type="selection" width="55" align="center"/>
|
|
69
|
|
- <el-table-column prop="id" label="ID" align="center" width="150">
|
|
70
|
|
- <template #default="{row}">
|
|
71
|
|
- <span>{{ row.id }} <el-icon @click="handleClipboard(row.id, $event)"><CopyDocument/></el-icon></span>
|
|
72
|
|
- </template>
|
|
73
|
|
- </el-table-column>
|
|
74
|
|
- <el-table-column prop="cpu" label="CPU" align="center" width="100" show-overflow-tooltip/>
|
|
75
|
|
- <el-table-column prop="hostname" :label="T('Hostname')" align="center" width="120"/>
|
|
76
|
|
- <el-table-column prop="memory" :label="T('Memory')" align="center" width="120"/>
|
|
77
|
|
- <el-table-column prop="os" :label="T('Os')" align="center" width="120" show-overflow-tooltip/>
|
|
78
|
|
- <el-table-column prop="last_online_time" :label="T('LastOnlineTime')" align="center" min-width="120">
|
|
79
|
|
- <template #default="{row}">
|
|
80
|
|
- <div class="last_oline_time">
|
|
81
|
|
- <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>
|
|
82
|
|
- </div>
|
|
83
|
|
- </template>
|
|
84
|
|
- </el-table-column>
|
|
85
|
|
- <el-table-column prop="last_online_ip" :label="T('LastOnlineIp')" align="center" min-width="120"/>
|
|
86
|
|
- <el-table-column prop="username" :label="T('Username')" align="center" width="120"/>
|
|
87
|
|
- <el-table-column prop="group_id" :label="T('Group')" align="center" width="120">
|
|
88
|
|
- <template #default="{row}">
|
|
89
|
|
- <span v-if="row.group_id"> <el-tag>{{ groupListRes.list?.find(g => g.id === row.group_id)?.name }} </el-tag> </span>
|
|
90
|
|
- <span v-else> - </span>
|
|
91
|
|
- </template>
|
|
92
|
|
- </el-table-column>
|
|
93
|
|
- <el-table-column prop="uuid" :label="T('Uuid')" align="center" width="120" show-overflow-tooltip/>
|
|
94
|
|
- <el-table-column prop="version" :label="T('Version')" align="center" width="80"/>
|
|
95
|
|
- <el-table-column prop="created_at" :label="T('CreatedAt')" align="center" width="150"/>
|
|
96
|
|
- <el-table-column prop="updated_at" :label="T('UpdatedAt')" align="center" width="150"/>
|
|
|
71
|
+ <template v-for="c in visibleColumns.filter(cc => cc.visible)" :key="c">
|
|
|
72
|
+ <el-table-column v-if="c.name==='id'" prop="id" label="ID" align="center" width="150">
|
|
|
73
|
+ <template #default="{row}">
|
|
|
74
|
+ <span>{{ row.id }} <el-icon @click="handleClipboard(row.id, $event)"><CopyDocument/></el-icon></span>
|
|
|
75
|
+ </template>
|
|
|
76
|
+ </el-table-column>
|
|
|
77
|
+ <el-table-column v-if="c.name==='cpu'" prop="cpu" label="CPU" align="center" width="100" show-overflow-tooltip/>
|
|
|
78
|
+ <el-table-column v-if="c.name==='hostname'" prop="hostname" :label="T('Hostname')" align="center" width="120"/>
|
|
|
79
|
+ <el-table-column v-if="c.name==='memory'" prop="memory" :label="T('Memory')" align="center" width="120"/>
|
|
|
80
|
+ <el-table-column v-if="c.name==='os'" prop="os" :label="T('Os')" align="center" width="120" show-overflow-tooltip/>
|
|
|
81
|
+ <el-table-column v-if="c.name==='last_online_time'" prop="last_online_time" :label="T('LastOnlineTime')" align="center" min-width="120">
|
|
|
82
|
+ <template #default="{row}">
|
|
|
83
|
+ <div class="last_oline_time">
|
|
|
84
|
+ <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>
|
|
|
85
|
+ </div>
|
|
|
86
|
+ </template>
|
|
|
87
|
+ </el-table-column>
|
|
|
88
|
+ <el-table-column v-if="c.name==='last_online_ip'" prop="last_online_ip" :label="T('LastOnlineIp')" align="center" min-width="120"/>
|
|
|
89
|
+ <el-table-column v-if="c.name==='username'" prop="username" :label="T('Username')" align="center" width="120"/>
|
|
|
90
|
+ <el-table-column v-if="c.name==='group_id'" prop="group_id" :label="T('Group')" align="center" width="120">
|
|
|
91
|
+ <template #default="{row}">
|
|
|
92
|
+ <span v-if="row.group_id"> <el-tag>{{ groupListRes.list?.find(g => g.id === row.group_id)?.name }} </el-tag> </span>
|
|
|
93
|
+ <span v-else> - </span>
|
|
|
94
|
+ </template>
|
|
|
95
|
+ </el-table-column>
|
|
|
96
|
+ <el-table-column v-if="c.name==='uuid'" prop="uuid" :label="T('Uuid')" align="center" width="120" show-overflow-tooltip/>
|
|
|
97
|
+ <el-table-column v-if="c.name==='version'" prop="version" :label="T('Version')" align="center" width="80"/>
|
|
|
98
|
+ <el-table-column v-if="c.name==='alias'" prop="alias" :label="T('Alias')" align="center" width="80"/>
|
|
|
99
|
+ <el-table-column v-if="c.name==='created_at'" prop="created_at" :label="T('CreatedAt')" align="center" width="150"/>
|
|
|
100
|
+ <el-table-column v-if="c.name==='updated_at'" prop="updated_at" :label="T('UpdatedAt')" align="center" width="150"/>
|
|
|
101
|
+ </template>
|
|
|
102
|
+
|
|
97
|
103
|
<el-table-column :label="T('Actions')" align="center" width="500" class-name="table-actions" fixed="right">
|
|
98
|
104
|
<template #default="{row}">
|
|
99
|
105
|
<el-button type="success" @click="connectByClient(row.id)">{{ T('Link') }}</el-button>
|
|
|
@@ -150,7 +156,9 @@
|
|
150
|
156
|
<el-form-item :label="T('Version')" prop="version">
|
|
151
|
157
|
<el-input v-model="formData.version"></el-input>
|
|
152
|
158
|
</el-form-item>
|
|
153
|
|
-
|
|
|
159
|
+ <el-form-item :label="T('Alias')" prop="alias">
|
|
|
160
|
+ <el-input v-model="formData.alias"></el-input>
|
|
|
161
|
+ </el-form-item>
|
|
154
|
162
|
<el-form-item>
|
|
155
|
163
|
<el-button @click="formVisible = false">{{ T('Cancel') }}</el-button>
|
|
156
|
164
|
<el-button @click="submit" type="primary">{{ T('Submit') }}</el-button>
|
|
|
@@ -196,6 +204,28 @@
|
|
196
|
204
|
</el-form-item>
|
|
197
|
205
|
</el-form>
|
|
198
|
206
|
</el-dialog>
|
|
|
207
|
+
|
|
|
208
|
+ <el-dialog v-model="columnSettingVisible" title="Column Setting">
|
|
|
209
|
+ <div v-for="(row, key) in visibleColumns" :key="key" style="margin-bottom: 10px;display: flex;align-items: center">
|
|
|
210
|
+ <div style="width: 200px">
|
|
|
211
|
+ <el-checkbox v-model="row.visible" :label="true">{{ T(row.label) }}</el-checkbox>
|
|
|
212
|
+ </div>
|
|
|
213
|
+ <div @click="upColumn(key)" style="width: 100px;cursor: pointer">
|
|
|
214
|
+ <el-icon :size="20">
|
|
|
215
|
+ <ArrowUp/>
|
|
|
216
|
+ </el-icon>
|
|
|
217
|
+ </div>
|
|
|
218
|
+ <div @click="downColumn(key)" style="width: 100px;cursor: pointer">
|
|
|
219
|
+ <el-icon :size="20">
|
|
|
220
|
+ <ArrowDown/>
|
|
|
221
|
+ </el-icon>
|
|
|
222
|
+ </div>
|
|
|
223
|
+ </div>
|
|
|
224
|
+ <span slot="footer" class="dialog-footer">
|
|
|
225
|
+ <el-button @click="columnSettingVisible = false">{{ T('Cancel') }}</el-button>
|
|
|
226
|
+ <el-button type="primary" @click="saveColumnSetting">{{ T('Save') }}</el-button>
|
|
|
227
|
+ </span>
|
|
|
228
|
+ </el-dialog>
|
|
199
|
229
|
</div>
|
|
200
|
230
|
</template>
|
|
201
|
231
|
|
|
|
@@ -211,7 +241,7 @@
|
|
211
|
241
|
import { loadAllUsers } from '@/global'
|
|
212
|
242
|
import { useAppStore } from '@/store/app'
|
|
213
|
243
|
import { connectByClient } from '@/utils/peer'
|
|
214
|
|
- import { CopyDocument } from '@element-plus/icons'
|
|
|
244
|
+ import { ArrowDown, ArrowUp, CopyDocument, Setting } from '@element-plus/icons'
|
|
215
|
245
|
import { handleClipboard } from '@/utils/clipboard'
|
|
216
|
246
|
import { batchCreateFromPeers } from '@/api/address_book'
|
|
217
|
247
|
import { useRepositories as useCollectionRepositories } from '@/views/address_book/collection'
|
|
|
@@ -495,6 +525,47 @@
|
|
495
|
525
|
}
|
|
496
|
526
|
// 批量添加到地址簿 end
|
|
497
|
527
|
|
|
|
528
|
+ const columnSettingVisible = ref(false)
|
|
|
529
|
+ const allColumns = ref([
|
|
|
530
|
+ { name: 'id', visible: true, label: 'Id' },
|
|
|
531
|
+ { name: 'cpu', visible: true, label: 'Cpu' },
|
|
|
532
|
+ { name: 'hostname', visible: true, label: 'Hostname' },
|
|
|
533
|
+ { name: 'memory', visible: true, label: 'Memory' },
|
|
|
534
|
+ { name: 'os', visible: true, label: 'Os' },
|
|
|
535
|
+ { name: 'last_online_time', visible: true, label: 'LastOnlineTime' },
|
|
|
536
|
+ { name: 'last_online_ip', visible: true, label: 'LastOnlineIp' },
|
|
|
537
|
+ { name: 'username', visible: true, label: 'Username' },
|
|
|
538
|
+ { name: 'group_id', visible: true, label: 'Group' },
|
|
|
539
|
+ { name: 'uuid', visible: true, label: 'Uuid' },
|
|
|
540
|
+ { name: 'version', visible: true, label: 'Version' },
|
|
|
541
|
+ { name: 'alias', visible: true, label: 'Alias' },
|
|
|
542
|
+ { name: 'created_at', visible: true, label: 'CreatedAt' },
|
|
|
543
|
+ { name: 'updated_at', visible: true, label: 'UpdatedAt' },
|
|
|
544
|
+ ])
|
|
|
545
|
+ const visibleColumns = ref(JSON.parse(localStorage.getItem('peer_visible_columns')) || allColumns.value)
|
|
|
546
|
+ const showColumnSetting = () => {
|
|
|
547
|
+ columnSettingVisible.value = true
|
|
|
548
|
+ }
|
|
|
549
|
+ const saveColumnSetting = () => {
|
|
|
550
|
+ localStorage.setItem('peer_visible_columns', JSON.stringify(visibleColumns.value))
|
|
|
551
|
+ ElMessage.success(T('OperationSuccess'))
|
|
|
552
|
+ columnSettingVisible.value = false
|
|
|
553
|
+ }
|
|
|
554
|
+
|
|
|
555
|
+ const upColumn = (index) => {
|
|
|
556
|
+ if (index === 0) return
|
|
|
557
|
+ const col = visibleColumns.value[index]
|
|
|
558
|
+ visibleColumns.value.splice(index, 1)
|
|
|
559
|
+ visibleColumns.value.splice(index - 1, 0, col)
|
|
|
560
|
+
|
|
|
561
|
+ }
|
|
|
562
|
+ const downColumn = (index) => {
|
|
|
563
|
+ if (index === visibleColumns.value.length - 1) return
|
|
|
564
|
+ const col = visibleColumns.value[index]
|
|
|
565
|
+ visibleColumns.value.splice(index, 1)
|
|
|
566
|
+ visibleColumns.value.splice(index + 1, 0, col)
|
|
|
567
|
+
|
|
|
568
|
+ }
|
|
498
|
569
|
</script>
|
|
499
|
570
|
|
|
500
|
571
|
<style scoped lang="scss">
|