🐛 修复group&ssh ID索引
This commit is contained in:
parent
9dfea65c2f
commit
f820e28540
@ -13,7 +13,7 @@ const addGroupList = async ({ res, request }) => {
|
|||||||
let { body: { name, index } } = request
|
let { body: { name, index } } = request
|
||||||
if (!name) return res.fail({ data: false, msg: '参数错误' })
|
if (!name) return res.fail({ data: false, msg: '参数错误' })
|
||||||
let groupList = await readGroupList()
|
let groupList = await readGroupList()
|
||||||
let group = { id: randomStr(), name, index }
|
let group = { name, index }
|
||||||
groupList.push(group)
|
groupList.push(group)
|
||||||
await writeGroupList(groupList)
|
await writeGroupList(groupList)
|
||||||
res.success({ data: '新增成功' })
|
res.success({ data: '新增成功' })
|
||||||
@ -24,9 +24,10 @@ const updateGroupList = async ({ res, request }) => {
|
|||||||
let { body: { name, index } } = request
|
let { body: { name, index } } = request
|
||||||
if (!id || !name) return res.fail({ data: false, msg: '参数错误' })
|
if (!id || !name) return res.fail({ data: false, msg: '参数错误' })
|
||||||
let groupList = await readGroupList()
|
let groupList = await readGroupList()
|
||||||
let idx = groupList.findIndex(item => item.id === id)
|
let idx = groupList.findIndex(item => item._id === id)
|
||||||
let group = { id, name, index: Number(index) || 0 }
|
|
||||||
if (idx === -1) return res.fail({ data: false, msg: `分组ID${ id }不存在` })
|
if (idx === -1) return res.fail({ data: false, msg: `分组ID${ id }不存在` })
|
||||||
|
const { _id } = groupList[idx]
|
||||||
|
let group = { _id, name, index: Number(index) || 0 }
|
||||||
groupList.splice(idx, 1, group)
|
groupList.splice(idx, 1, group)
|
||||||
await writeGroupList(groupList)
|
await writeGroupList(groupList)
|
||||||
res.success({ data: '修改成功' })
|
res.success({ data: '修改成功' })
|
||||||
@ -36,13 +37,13 @@ const removeGroup = async ({ res, request }) => {
|
|||||||
let { params: { id } } = request
|
let { params: { id } } = request
|
||||||
if (id === 'default') return res.fail({ data: false, msg: '保留分组, 禁止删除' })
|
if (id === 'default') return res.fail({ data: false, msg: '保留分组, 禁止删除' })
|
||||||
let groupList = await readGroupList()
|
let groupList = await readGroupList()
|
||||||
let idx = groupList.findIndex(item => item.id === id)
|
let idx = groupList.findIndex(item => item._id === id)
|
||||||
if (idx === -1) return res.fail({ msg: '分组不存在' })
|
if (idx === -1) return res.fail({ msg: '分组不存在' })
|
||||||
|
|
||||||
// 移除分组将所有该分组下host分配到default中去
|
// 移除分组将所有该分组下host分配到default中去
|
||||||
let hostList = await readHostList()
|
let hostList = await readHostList()
|
||||||
hostList = hostList?.map((item) => {
|
hostList = hostList?.map((item) => {
|
||||||
if (item.group === groupList[idx].id) item.group = 'default'
|
if (item.group === groupList[idx]._id) item.group = 'default'
|
||||||
return item
|
return item
|
||||||
})
|
})
|
||||||
await writeHostList(hostList)
|
await writeHostList(hostList)
|
||||||
|
@ -52,6 +52,7 @@ const updateSSH = async ({ res, request }) => {
|
|||||||
record[authType] = await AESEncryptSync(clearSSHKey)
|
record[authType] = await AESEncryptSync(clearSSHKey)
|
||||||
console.log(`${ authType }__commonKey加密存储: `, record[authType])
|
console.log(`${ authType }__commonKey加密存储: `, record[authType])
|
||||||
}
|
}
|
||||||
|
record._id = sshRecord[idx]._id
|
||||||
sshRecord.splice(idx, 1, record)
|
sshRecord.splice(idx, 1, record)
|
||||||
await writeSSHRecord(sshRecord)
|
await writeSSHRecord(sshRecord)
|
||||||
consola.info('修改凭证:', name)
|
consola.info('修改凭证:', name)
|
||||||
|
@ -75,7 +75,7 @@ function initGroupDB() {
|
|||||||
} else {
|
} else {
|
||||||
if (count === 0) {
|
if (count === 0) {
|
||||||
consola.log('初始化groupDB✔')
|
consola.log('初始化groupDB✔')
|
||||||
const defaultData = [{ 'id': 'default', 'name': '默认分组', 'index': 0 }]
|
const defaultData = [{ '_id': 'default', 'name': '默认分组', 'index': 0 }]
|
||||||
await writeGroupList(defaultData)
|
await writeGroupList(defaultData)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,64 +1,14 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="group_container">
|
<div class="group_container">
|
||||||
<el-form
|
<div class="header">
|
||||||
ref="groupFormRef"
|
<el-button type="primary" @click="addGroup">添加分组</el-button>
|
||||||
:model="groupForm"
|
</div>
|
||||||
:rules="rules"
|
|
||||||
:inline="true"
|
|
||||||
:hide-required-asterisk="true"
|
|
||||||
label-suffix=":"
|
|
||||||
:show-message="false"
|
|
||||||
>
|
|
||||||
<el-form-item label="" prop="name" style="width: 200px;">
|
|
||||||
<el-input
|
|
||||||
v-model.trim="groupForm.name"
|
|
||||||
clearable
|
|
||||||
placeholder="分组名称"
|
|
||||||
autocomplete="off"
|
|
||||||
@keyup.enter="addGroup"
|
|
||||||
/>
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item label="" prop="index" style="width: 200px;">
|
|
||||||
<el-input
|
|
||||||
v-model.number="groupForm.index"
|
|
||||||
clearable
|
|
||||||
placeholder="序号(数字, 用于分组排序)"
|
|
||||||
autocomplete="off"
|
|
||||||
@keyup.enter="addGroup"
|
|
||||||
/>
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item label="">
|
|
||||||
<el-button type="primary" @click="addGroup">
|
|
||||||
添加
|
|
||||||
</el-button>
|
|
||||||
</el-form-item>
|
|
||||||
</el-form>
|
|
||||||
<!-- 提示 -->
|
|
||||||
<el-alert type="success" :closable="false">
|
|
||||||
<template #title>
|
|
||||||
<span style="letter-spacing: 2px;">
|
|
||||||
Tips: 已添加实例数量 <u>{{ hostGroupInfo.total }}</u>
|
|
||||||
<span v-show="hostGroupInfo.notGroupCount">, 有 <u>{{ hostGroupInfo.notGroupCount }}</u> 台实例尚未分组</span>
|
|
||||||
</span>
|
|
||||||
</template>
|
|
||||||
</el-alert><br>
|
|
||||||
<el-alert type="success" :closable="false">
|
|
||||||
<template #title>
|
|
||||||
<span style="letter-spacing: 2px;"> Tips: 删除分组会将分组内所有实例移至默认分组 </span>
|
|
||||||
</template>
|
|
||||||
</el-alert>
|
|
||||||
<el-table v-loading="loading" :data="list">
|
<el-table v-loading="loading" :data="list">
|
||||||
<el-table-column prop="index" label="序号" />
|
<el-table-column prop="index" label="序号" />
|
||||||
<el-table-column prop="id" label="ID" />
|
|
||||||
<el-table-column prop="name" label="分组名称" />
|
<el-table-column prop="name" label="分组名称" />
|
||||||
<el-table-column label="关联实例数量">
|
<el-table-column label="关联实例数量">
|
||||||
<template #default="{ row }">
|
<template #default="{ row }">
|
||||||
<el-popover
|
<el-popover v-if="row.hosts.list.length !== 0" placement="left" :width="350" trigger="hover">
|
||||||
v-if="row.hosts.list.length !== 0"
|
|
||||||
placement="left"
|
|
||||||
:width="350"
|
|
||||||
trigger="hover"
|
|
||||||
>
|
|
||||||
<template #reference>
|
<template #reference>
|
||||||
<u class="host_count">{{ row.hosts.count }}</u>
|
<u class="host_count">{{ row.hosts.count }}</u>
|
||||||
</template>
|
</template>
|
||||||
@ -80,41 +30,21 @@
|
|||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
<el-dialog
|
<el-dialog v-model="groupFormVisible" width="600px" top="150px" :title="isModify ? '修改分组' : '添加分组'"
|
||||||
v-model="visible"
|
:close-on-click-modal="false" @close="clearFormInfo">
|
||||||
width="400px"
|
<el-form ref="updateFormRef" :model="groupForm" :rules="rules" :hide-required-asterisk="true" label-suffix=":"
|
||||||
title="修改分组"
|
label-width="100px" :show-message="false">
|
||||||
:close-on-click-modal="false"
|
|
||||||
>
|
|
||||||
<el-form
|
|
||||||
ref="updateFormRef"
|
|
||||||
:model="updateForm"
|
|
||||||
:rules="rules"
|
|
||||||
:hide-required-asterisk="true"
|
|
||||||
label-suffix=":"
|
|
||||||
label-width="100px"
|
|
||||||
>
|
|
||||||
<el-form-item label="分组名称" prop="name">
|
<el-form-item label="分组名称" prop="name">
|
||||||
<el-input
|
<el-input v-model.trim="groupForm.name" clearable placeholder="" autocomplete="off" />
|
||||||
v-model.trim="updateForm.name"
|
|
||||||
clearable
|
|
||||||
placeholder="分组名称"
|
|
||||||
autocomplete="off"
|
|
||||||
/>
|
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="分组序号" prop="index">
|
<el-form-item label="分组序号" prop="index">
|
||||||
<el-input
|
<el-input v-model.number="groupForm.index" clearable placeholder="用于分组排序" autocomplete="off" />
|
||||||
v-model.number="updateForm.index"
|
|
||||||
clearable
|
|
||||||
placeholder="分组序号"
|
|
||||||
autocomplete="off"
|
|
||||||
/>
|
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-form>
|
</el-form>
|
||||||
<template #footer>
|
<template #footer>
|
||||||
<span class="dialog-footer">
|
<span>
|
||||||
<el-button @click="visible = false">关闭</el-button>
|
<el-button @click="groupFormVisible = false">关闭</el-button>
|
||||||
<el-button type="primary" @click="updateGroup">修改</el-button>
|
<el-button type="primary" @click="updateForm">{{ isModify ? '修改' : '新增' }}</el-button>
|
||||||
</span>
|
</span>
|
||||||
</template>
|
</template>
|
||||||
</el-dialog>
|
</el-dialog>
|
||||||
@ -122,40 +52,34 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { ref, reactive, computed, getCurrentInstance } from 'vue'
|
import { ref, reactive, computed, nextTick, getCurrentInstance } from 'vue'
|
||||||
|
|
||||||
const { proxy: { $api, $message, $messageBox, $store } } = getCurrentInstance()
|
const { proxy: { $api, $message, $messageBox, $store } } = getCurrentInstance()
|
||||||
|
|
||||||
const loading = ref(false)
|
const loading = ref(false)
|
||||||
const visible = ref(false)
|
const groupFormVisible = ref(false)
|
||||||
|
let isModify = ref(false)
|
||||||
const groupForm = reactive({
|
const groupForm = reactive({
|
||||||
|
id: null,
|
||||||
name: '',
|
name: '',
|
||||||
index: ''
|
index: ''
|
||||||
})
|
})
|
||||||
const updateForm = reactive({
|
|
||||||
name: '',
|
|
||||||
index: ''
|
|
||||||
})
|
|
||||||
const rules = reactive({
|
|
||||||
name: { required: true, message: '需输入分组名称', trigger: 'change' },
|
|
||||||
index: { required: true, type: 'number', message: '需输入数字', trigger: 'change' }
|
|
||||||
})
|
|
||||||
|
|
||||||
const groupFormRef = ref(null)
|
const rules = computed(() => {
|
||||||
|
return {
|
||||||
|
name: { required: true, message: '需输入分组名称', trigger: 'change' },
|
||||||
|
index: { required: true, type: 'number', message: '需输入数字', trigger: 'change' }
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
const updateFormRef = ref(null)
|
const updateFormRef = ref(null)
|
||||||
|
|
||||||
const hostGroupInfo = computed(() => {
|
let groupList = computed(() => $store.groupList || [])
|
||||||
const total = $store.hostList.length
|
const hostList = computed(() => $store.hostList)
|
||||||
const notGroupCount = $store.hostList.reduce((prev, next) => {
|
|
||||||
if (!next.group) prev++
|
|
||||||
return prev
|
|
||||||
}, 0)
|
|
||||||
return { total, notGroupCount }
|
|
||||||
})
|
|
||||||
|
|
||||||
const list = computed(() => {
|
const list = computed(() => {
|
||||||
return groupList.value.map(item => {
|
return groupList.value.map(item => {
|
||||||
const hosts = $store.hostList.reduce((prev, next) => {
|
const hosts = hostList.value.reduce((prev, next) => {
|
||||||
if (next.group === item.id) {
|
if (next.group === item.id) {
|
||||||
prev.count++
|
prev.count++
|
||||||
prev.list.push(next)
|
prev.list.push(next)
|
||||||
@ -166,45 +90,39 @@ const list = computed(() => {
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
let groupList = computed(() => $store.groupList || [])
|
let addGroup = () => {
|
||||||
|
groupForm.id = null
|
||||||
const addGroup = () => {
|
groupFormVisible.value = true
|
||||||
groupFormRef.value.validate()
|
isModify.value = false
|
||||||
.then(() => {
|
|
||||||
const { name, index } = groupForm
|
|
||||||
$api.addGroup({ name, index })
|
|
||||||
.then(() => {
|
|
||||||
$message.success('success')
|
|
||||||
groupForm.name = ''
|
|
||||||
groupForm.index = ''
|
|
||||||
$store.getGroupList()
|
|
||||||
groupFormRef.value.resetFields()
|
|
||||||
})
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const handleChange = ({ id, name, index }) => {
|
const handleChange = (row) => {
|
||||||
updateForm.id = id
|
Object.assign(groupForm, { ...row })
|
||||||
updateForm.name = name
|
groupFormVisible.value = true
|
||||||
updateForm.index = index
|
isModify.value = true
|
||||||
visible.value = true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const updateGroup = () => {
|
const updateForm = () => {
|
||||||
updateFormRef.value.validate()
|
updateFormRef.value.validate()
|
||||||
.then(() => {
|
.then(async () => {
|
||||||
const { id, name, index } = updateForm
|
const { id, index, name } = groupForm
|
||||||
$api.updateGroup(id, { name, index })
|
if (isModify.value) {
|
||||||
.then(() => {
|
await $api.updateGroup(id, { index, name })
|
||||||
$message.success('success')
|
} else {
|
||||||
visible.value = false
|
await $api.addGroup({ index, name })
|
||||||
$store.getGroupList()
|
}
|
||||||
})
|
await $store.getGroupList()
|
||||||
|
groupFormVisible.value = false
|
||||||
|
$message.success('success')
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const clearFormInfo = () => {
|
||||||
|
nextTick(() => updateFormRef.value.resetFields())
|
||||||
|
}
|
||||||
|
|
||||||
const deleteGroup = ({ id, name }) => {
|
const deleteGroup = ({ id, name }) => {
|
||||||
$messageBox.confirm(`确认删除分组:${ name }`, 'Warning', {
|
$messageBox.confirm(`确认删除分组:${name} (分组下实例将移动至默认分组)`, 'Warning', {
|
||||||
confirmButtonText: '确定',
|
confirmButtonText: '确定',
|
||||||
cancelButtonText: '取消',
|
cancelButtonText: '取消',
|
||||||
type: 'warning'
|
type: 'warning'
|
||||||
@ -222,6 +140,13 @@ const deleteGroup = ({ id, name }) => {
|
|||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.group_container {
|
.group_container {
|
||||||
padding: 20px;
|
padding: 20px;
|
||||||
|
|
||||||
|
.header {
|
||||||
|
padding: 15px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: end;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.host_count {
|
.host_count {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user