优化实例选择逻辑

This commit is contained in:
chaos-zhu 2024-08-04 05:24:33 +08:00
parent e33cffbfe7
commit 5f8c3aabe7
4 changed files with 39 additions and 21 deletions

View File

@ -101,7 +101,7 @@ module.exports = (httpServer) => {
if (timer) clearInterval(timer) if (timer) clearInterval(timer)
clientSockets.forEach(socket => socket.close && socket.close()) clientSockets.forEach(socket => socket.close && socket.close())
clientSockets = null clientSockets = null
clientsData = null clientsData = {}
consola.info('clients-socket 连接断开: ', socket.id) consola.info('clients-socket 连接断开: ', socket.id)
}) })
}) })

View File

@ -12,14 +12,14 @@
> >
<div v-if="isBatchModify" class="batch_info"> <div v-if="isBatchModify" class="batch_info">
<el-alert title="正在进行批量修改操作,留空默认保留原值" type="warning" :closable="false" /> <el-alert title="正在进行批量修改操作,留空默认保留原值" type="warning" :closable="false" />
<!-- <el-tag <el-tag
v-for="item in batchHosts" v-for="item in batchHosts"
:key="item.id" :key="item.id"
class="host_name_tag" class="host_name_tag"
type="warning" type="warning"
> >
{{ item.name }} {{ item.name }}
</el-tag> --> </el-tag>
</div> </div>
<el-form <el-form
ref="formRef" ref="formRef"
@ -83,7 +83,7 @@
<el-input <el-input
v-model.trim.number="hostForm.port" v-model.trim.number="hostForm.port"
clearable clearable
placeholder="port" placeholder=""
autocomplete="off" autocomplete="off"
/> />
</el-form-item> </el-form-item>
@ -312,7 +312,7 @@ const rules = computed(() => {
group: { required: !isBatchModify.value, message: '选择一个分组' }, group: { required: !isBatchModify.value, message: '选择一个分组' },
name: { required: !isBatchModify.value, message: '输入实例别名', trigger: 'change' }, name: { required: !isBatchModify.value, message: '输入实例别名', trigger: 'change' },
host: { required: !isBatchModify.value, message: '输入IP/域名', trigger: 'change' }, host: { required: !isBatchModify.value, message: '输入IP/域名', trigger: 'change' },
port: { required: true, type: 'number', message: '输入ssh端口', trigger: 'change' }, port: { required: !isBatchModify.value, type: 'number', message: '输入ssh端口', trigger: 'change' },
index: { required: !isBatchModify.value, type: 'number', message: '输入数字', trigger: 'change' }, index: { required: !isBatchModify.value, type: 'number', message: '输入数字', trigger: 'change' },
// password: [{ required: hostForm.authType === 'password', trigger: 'change' },], // password: [{ required: hostForm.authType === 'password', trigger: 'change' },],
// privateKey: [{ required: hostForm.authType === 'privateKey', trigger: 'change' },], // privateKey: [{ required: hostForm.authType === 'privateKey', trigger: 'change' },],
@ -345,7 +345,7 @@ const setDefaultData = () => {
const setBatchDefaultData = () => { const setBatchDefaultData = () => {
if (!isBatchModify.value) return if (!isBatchModify.value) return
Object.assign(hostForm.value, { ...formField }, { group: '' }) Object.assign(hostForm.value, { ...formField }, { group: '', port: '', username: '', authType: '' })
} }
const handleOpen = async () => { const handleOpen = async () => {
setDefaultData() setDefaultData()
@ -404,6 +404,7 @@ const handleSave = () => {
if (isBatchModify.value) { if (isBatchModify.value) {
// eslint-disable-next-line // eslint-disable-next-line
let updateFileData = Object.fromEntries(Object.entries(formData).filter(([key, value]) => Boolean(value))) // let updateFileData = Object.fromEntries(Object.entries(formData).filter(([key, value]) => Boolean(value))) //
if (Object.keys(updateFileData).length === 0) return $message.warning('没有任何修改')
// console.log(updateFileData) // console.log(updateFileData)
let newHosts = batchHosts.value let newHosts = batchHosts.value
.map(item => ({ ...item, ...updateFileData })) .map(item => ({ ...item, ...updateFileData }))

View File

@ -3,10 +3,10 @@
<el-table <el-table
ref="tableRef" ref="tableRef"
:data="hosts" :data="hosts"
@select="handleSelectionChange" row-key="host"
@select-all="handleSelectionChange" @selection-change="handleSelectionChange"
> >
<el-table-column type="selection" /> <el-table-column type="selection" reserve-selection />
<el-table-column prop="index" label="序号" width="100px" /> <el-table-column prop="index" label="序号" width="100px" />
<el-table-column label="名称"> <el-table-column label="名称">
<template #default="scope">{{ scope.row.name }}</template> <template #default="scope">{{ scope.row.name }}</template>
@ -43,7 +43,7 @@
</template> </template>
<script setup> <script setup>
import { ref, computed, getCurrentInstance, nextTick, watch } from 'vue' import { ref, computed, getCurrentInstance, nextTick, watch, defineExpose } from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus' import { ElMessage, ElMessageBox } from 'element-plus'
const { proxy: { $api, $router, $tools } } = getCurrentInstance() const { proxy: { $api, $router, $tools } } = getCurrentInstance()
@ -107,23 +107,31 @@ const handleSSH = async ({ host }) => {
$router.push({ path: '/terminal', query: { host } }) $router.push({ path: '/terminal', query: { host } })
} }
let selectHosts = ref([]) // let selectHosts = ref([])
// tabletable,set // tabletable,set
watch(() => props.hosts, () => { // watch(() => props.hosts, () => {
// console.log('hosts change') // // console.log('hosts change')
nextTick(() => { // nextTick(() => {
selectHosts.value.forEach(row => { // selectHosts.value.forEach(row => {
tableRef.value.toggleRowSelection && tableRef.value.toggleRowSelection(row, true) // tableRef.value.toggleRowSelection && tableRef.value.toggleRowSelection(row, true)
}) // })
}) // })
}, { immediate: true, deep: true }) // }, { immediate: true, deep: true })
const handleSelectionChange = (val) => { const handleSelectionChange = (val) => {
// console.log('select: ', val) // console.log('select: ', val)
selectHosts.value = val // selectHosts.value = val
emit('select-change', val) emit('select-change', val)
} }
const clearSelection = () => {
tableRef.value.clearSelection()
}
defineExpose({
clearSelection
})
const handleRemoveHost = async ({ host }) => { const handleRemoveHost = async ({ host }) => {
ElMessageBox.confirm('确认删除实例', 'Warning', { ElMessageBox.confirm('确认删除实例', 'Warning', {
confirmButtonText: '确定', confirmButtonText: '确定',

View File

@ -44,6 +44,7 @@
@update-list="handleUpdateList" @update-list="handleUpdateList"
/> --> /> -->
<HostTable <HostTable
ref="hostTableRefs"
:hosts="hosts" :hosts="hosts"
:hidden-ip="hiddenIp" :hidden-ip="hiddenIp"
@update-host="handleUpdateHost" @update-host="handleUpdateHost"
@ -60,7 +61,7 @@
:is-batch-modify="isBatchModify" :is-batch-modify="isBatchModify"
:batch-hosts="selectHosts" :batch-hosts="selectHosts"
@update-list="handleUpdateList" @update-list="handleUpdateList"
@closed="updateHostData = null;isBatchModify = false" @closed="hostFormClosed"
/> />
<ImportHost <ImportHost
v-model:show="importVisible" v-model:show="importVisible"
@ -84,6 +85,7 @@ let hostFormVisible = ref(false)
let importVisible = ref(false) let importVisible = ref(false)
let selectHosts = ref([]) let selectHosts = ref([])
let isBatchModify = ref(false) let isBatchModify = ref(false)
const hostTableRefs = ref([])
let hiddenIp = ref(Number(localStorage.getItem('hiddenIp') || 0)) let hiddenIp = ref(Number(localStorage.getItem('hiddenIp') || 0))
let activeGroup = ref([]) let activeGroup = ref([])
@ -165,6 +167,13 @@ watch(groupHostList, () => {
let isNoHost = computed(() => Object.keys(groupHostList.value).length === 0) let isNoHost = computed(() => Object.keys(groupHostList.value).length === 0)
let hostFormClosed = () => {
updateHostData.value = null
isBatchModify.value = false
selectHosts.value = []
hostTableRefs.value.forEach(item => item.clearSelection())
}
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>