🐛 复制主机.

This commit is contained in:
lijiahangmax
2025-05-30 01:29:28 +08:00
parent 2457a015e4
commit fdd3be5a91
3 changed files with 54 additions and 35 deletions

View File

@@ -1,4 +1,4 @@
import type { HostSpecExtraModel, HostExtraUpdateRequest } from './host-extra';
import type { HostExtraUpdateRequest, HostSpecExtraModel } from './host-extra';
import type { TableData } from '@arco-design/web-vue';
import type { DataGrid, OrderDirection, Pagination } from '@/types/global';
import axios from 'axios';
@@ -114,6 +114,13 @@ export function updateHost(request: HostUpdateRequest) {
return axios.put('/asset/host/update', request);
}
/**
* 复制主机
*/
export function copyHost(request: HostUpdateRequest) {
return axios.post('/asset/host/copy', request);
}
/**
* 通过 id 更新主机状态
*/

View File

@@ -21,7 +21,7 @@
<host-form-info ref="infoRef"
class="form-panel"
@change-type="(ts: string[]) => types = ts"
@updated="updateHostInfo" />
@updated="onUpdateHostInfo" />
</a-tab-pane>
<!-- 规格配置 -->
<a-tab-pane v-permission="['asset:host:update']"
@@ -31,7 +31,7 @@
<host-form-spec v-if="hostId"
class="form-panel"
:hostId="hostId"
@updated="incrUpdatedCount" />
@updated="onUpdateHostSpec" />
</a-tab-pane>
<!-- SSH 配置 -->
<a-tab-pane v-permission="['asset:host:update-config']"
@@ -59,12 +59,10 @@
import { Message } from '@arco-design/web-vue';
import { useCacheStore } from '@/store';
import { HostType } from '../types/const';
import { useCounter } from '@vueuse/core';
import HostFormInfo from './host-form-info.vue';
import HostFormSsh from './host-form-ssh.vue';
import HostFormSpec from './host-form-spec.vue';
import HostFormSsh from './host-form-ssh.vue';
const { count: updatedCount, inc: incrUpdatedCount, reset: resetCounter } = useCounter();
const { visible, setVisible } = useVisible();
const activeTab = ref<string>('info');
@@ -72,6 +70,7 @@
const hostId = ref<number>();
const types = ref<string[]>([]);
const infoRef = ref();
const hostViewUpdated = ref(false);
const emits = defineEmits(['reload']);
@@ -93,7 +92,7 @@
// 打开复制
const openCopy = (id: number) => {
init('复制主机', id);
init('复制主机', undefined);
nextTick(() => {
infoRef.value.openCopy(id);
});
@@ -104,9 +103,9 @@
title.value = _title;
activeTab.value = 'info';
hostId.value = id;
hostViewUpdated.value = false;
types.value = [];
checkHostGroup();
resetCounter();
setVisible(true);
};
@@ -123,14 +122,20 @@
defineExpose({ openAdd, openUpdate, openCopy });
// 更新主机信息
const updateHostInfo = (id: number) => {
const onUpdateHostInfo = (id: number) => {
hostId.value = id;
incrUpdatedCount();
hostViewUpdated.value = true;
};
// 更新主机信息
const onUpdateHostSpec = () => {
hostViewUpdated.value = true;
};
// 处理关闭
const handleClose = () => {
if (updatedCount.value) {
// 修改主机视图信息后刷新列表
if (hostViewUpdated.value) {
emits('reload');
}
};

View File

@@ -5,28 +5,6 @@
label-align="right"
:auto-label-width="true"
:rules="hostFormRules">
<!-- 主机协议 -->
<a-form-item field="types" label="主机协议">
<a-select v-model="formModel.types"
placeholder="请选择支持的主机协议"
:options="toOptions(hostTypeKey)"
multiple
allow-clear />
</a-form-item>
<!-- 系统类型 -->
<a-form-item field="osType" label="系统类型">
<a-select v-model="formModel.osType"
placeholder="请选择系统类型"
:options="toOptions(hostOsTypeKey)"
allow-clear />
</a-form-item>
<!-- 系统架构 -->
<a-form-item field="archType" label="系统架构">
<a-select v-model="formModel.archType"
placeholder="请选择系统架构"
:options="toOptions(hostArchTypeKey)"
allow-clear />
</a-form-item>
<!-- 主机名称 -->
<a-form-item field="name" label="主机名称">
<a-input v-model="formModel.name"
@@ -45,6 +23,28 @@
placeholder="请输入主机地址"
allow-clear />
</a-form-item>
<!-- 系统类型 -->
<a-form-item field="osType" label="系统类型">
<a-select v-model="formModel.osType"
placeholder="请选择系统类型"
:options="toOptions(hostOsTypeKey)"
allow-clear />
</a-form-item>
<!-- 系统架构 -->
<a-form-item field="archType" label="系统架构">
<a-select v-model="formModel.archType"
placeholder="请选择系统架构"
:options="toOptions(hostArchTypeKey)"
allow-clear />
</a-form-item>
<!-- 主机协议 -->
<a-form-item field="types" label="主机协议">
<a-select v-model="formModel.types"
placeholder="请选择支持的主机协议"
:options="toOptions(hostTypeKey)"
multiple
allow-clear />
</a-form-item>
<!-- 主机分组 -->
<a-form-item field="groupIdList" label="主机分组">
<host-group-tree-selector v-model="formModel.groupIdList"
@@ -90,7 +90,7 @@
import { ref } from 'vue';
import useLoading from '@/hooks/loading';
import { hostFormRules } from '../types/form.rules';
import { createHost, getHost, updateHost } from '@/api/asset/host';
import { createHost, getHost, updateHost, copyHost } from '@/api/asset/host';
import { Message } from '@arco-design/web-vue';
import { pick } from 'lodash';
import { tagColor, hostTypeKey, hostOsTypeKey, HostOsType, hostArchTypeKey } from '../types/const';
@@ -118,6 +118,7 @@
};
};
const isCopy = ref(false);
const formRef = ref();
const formModel = ref<HostUpdateRequest>({});
@@ -135,6 +136,7 @@
// 打开复制
const openCopy = async (id: number) => {
renderForm({ ...defaultForm() });
isCopy.value = true;
await fetchHostRender(id);
};
@@ -188,7 +190,12 @@
if (error) {
return;
}
if (!formModel.value.id) {
if (isCopy.value) {
// 复制
const { data } = await copyHost(formModel.value);
Message.success('复制成功');
emits('updated', data);
} else if (!formModel.value.id) {
// 新增
const { data } = await createHost(formModel.value);
Message.success('创建成功');