From a503b2ca7530b30303eba47f0ff6855ca3589665 Mon Sep 17 00:00:00 2001 From: 2256907009 <2256907009@qq.com> Date: Wed, 1 Oct 2025 00:33:34 +0800 Subject: [PATCH] =?UTF-8?q?fix:=E4=BF=AE=E6=94=B9=E5=88=9B=E5=BB=BA?= =?UTF-8?q?=E8=99=9A=E6=8B=9F=E6=9C=BA=E9=95=9C=E5=83=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/acs/images/VmImages.vue | 132 ++++++++++++++++++++++++++---- 1 file changed, 118 insertions(+), 14 deletions(-) diff --git a/src/views/acs/images/VmImages.vue b/src/views/acs/images/VmImages.vue index e6bb9b4..9742c1b 100644 --- a/src/views/acs/images/VmImages.vue +++ b/src/views/acs/images/VmImages.vue @@ -143,16 +143,39 @@ - + - - - - + +
+ + + +
+ + + 创建新分类 + +
+
@@ -249,7 +272,7 @@ import { import { ElMessage, ElMessageBox } from 'element-plus' import { getServer, getServerPlan } from '@/utils/acs/server' import { - editMirror, delMirror, getUserMirrorList, addVirtualMirror, getImageTypeList + editMirror, delMirror, getUserMirrorList, addVirtualMirror, getImageTypeList, createImageType } from '@/utils/acs/mirror' import { uploadFile, getFileList } from '@/utils/acs/message' import { mainUrl } from '@/utils/request' @@ -298,13 +321,15 @@ const imageForm = reactive({ image_ico: '', server_id: '', path: '', - class_id: '' + class_id: '', + class_name: '' }) const rules = { - name: [{ required: true, message: '请输入镜像名称', trigger: 'blur' }], - path: [{ required: true, message: '请输入镜像文件路径', trigger: 'blur' }], - show_name: [{ required: true, message: '请输入展示名称', trigger: 'blur' }], + // 根据接口文档,所有字段都是可选的 + // name: [{ required: true, message: '请输入镜像名称', trigger: 'blur' }], + // path: [{ required: true, message: '请输入镜像文件路径', trigger: 'blur' }], + // show_name: [{ required: true, message: '请输入展示名称', trigger: 'blur' }], // plan_id: [{ required: true, message: '请选择套餐', trigger: 'change' }] } @@ -320,6 +345,7 @@ const picList = ref([]) const total = ref(10) const currentIndex = ref(null) const categoryList = ref([]) +const showNewCategoryInput = ref(false) // 获取操作系统图标 const getOsIcon = (os) => { @@ -447,6 +473,47 @@ const fetchCategoryList = async (serverId) => { } } +// 处理分类选择变化 +const handleCategoryChange = (value) => { + if (value) { + // 选择了现有分类,清空新分类名称 + imageForm.class_name = '' + showNewCategoryInput.value = false + } else { + // 清空选择,显示新分类输入框 + showNewCategoryInput.value = true + } +} + +// 创建新分类 +const createNewCategory = async () => { + if (!imageForm.class_name.trim()) { + ElMessage.warning('请输入分类名称') + return + } + + try { + const response = await createImageType(nowserver_id.value, imageForm.class_name.trim(), '') + if (response.data.code === 200) { + ElMessage.success('分类创建成功') + // 重新获取分类列表 + await fetchCategoryList(nowserver_id.value) + // 设置新创建的分类为选中状态 + const newCategory = categoryList.value.find(item => item.name === imageForm.class_name.trim()) + if (newCategory) { + imageForm.class_id = newCategory.class_id + imageForm.class_name = '' + showNewCategoryInput.value = false + } + } else { + ElMessage.error('创建分类失败:' + response.data.message) + } + } catch (error) { + console.error('创建分类出错:', error) + ElMessage.error('创建分类失败') + } +} + // 新增镜像 const toLoad = async (data) => { dialogVisible.value = true @@ -456,6 +523,7 @@ const toLoad = async (data) => { }) imageForm.server_id = data nowserver_id.value = data + showNewCategoryInput.value = true // 添加镜像时默认显示新分类输入框 try { // 获取套餐列表 let res = await getServerPlan({ server_id: data }) @@ -515,6 +583,7 @@ const handleEdit = async (row) => { editOr.value = true dialogVisible.value = true + showNewCategoryInput.value = false // 编辑时默认不显示新分类输入框 for (const key in row) { if (row.hasOwnProperty(key)) { imageForm[key] = row[key] @@ -553,6 +622,7 @@ const handleCreateVM = (row) => { // 关闭对话框 const handleDialogClose = () => { dialogVisible.value = false + showNewCategoryInput.value = false if (imageFormRef.value) { imageFormRef.value.resetFields() } @@ -564,10 +634,27 @@ const submitForm = async () => { await imageFormRef.value.validate((valid) => { if (valid) { + // 准备提交数据,根据接口要求处理分类字段 + const submitData = { ...imageForm } + + // 如果选择了现有分类,清空 class_name + if (submitData.class_id) { + submitData.class_name = '' + } + // 如果没有选择现有分类但有新分类名称,清空 class_id + else if (submitData.class_name) { + submitData.class_id = '' + } + // 如果都没有,清空两个字段 + else { + submitData.class_id = '' + submitData.class_name = '' + } + if (editOr.value) { - imageForm.image_id = imageForm.id - delete imageForm.id - editMirror(imageForm).then(res => { + submitData.image_id = submitData.id + delete submitData.id + editMirror(submitData).then(res => { if (res.data.code == 200) { dialogVisible.value = false ElMessage.success('编辑成功') @@ -579,7 +666,7 @@ const submitForm = async () => { ElMessage.error('编辑失败') }) } else { - addVirtualMirror(imageForm).then(res => { + addVirtualMirror(submitData).then(res => { if (res.data.code == 200) { dialogVisible.value = false ElMessage.success('添加成功') @@ -882,6 +969,23 @@ onMounted(() => { border-radius: 4px; } +/* 分类选择容器样式 */ +.category-select-container { + width: 100%; +} + +.category-input-container { + margin-top: 8px; + padding: 12px; + background-color: #f8f9fa; + border-radius: 6px; + border: 1px solid #e9ecef; +} + +.category-input-container .el-input { + margin-bottom: 8px; +} + /* 响应式调整 */ @media (max-width: 768px) { .image-info-cell {