🐛 修复group&ssh ID索引

This commit is contained in:
chaoszhu 2024-07-25 22:24:59 +08:00
parent 9dfea65c2f
commit f820e28540
4 changed files with 66 additions and 139 deletions

View File

@ -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)

View File

@ -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)

View File

@ -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)
} }
} }

View File

@ -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 {