diff --git a/src/components/layout/TagsView.vue b/src/components/layout/TagsView.vue index c446003..73d8b35 100644 --- a/src/components/layout/TagsView.vue +++ b/src/components/layout/TagsView.vue @@ -1,6 +1,9 @@ - + @@ -410,23 +415,31 @@ 刷新 - - - - + + + + + - + + + + - + + + + -
@@ -443,7 +456,7 @@ import { ref, reactive, computed, onMounted, watch } from 'vue' import { useRouter } from 'vue-router' import { ElMessage, ElMessageBox } from 'element-plus' -import { Plus, Refresh, Search } from '@element-plus/icons-vue' +import { Plus, Refresh, Search, ArrowDown } from '@element-plus/icons-vue' import { getUserGoodsList, createUserGoods, updateUserGoods, deleteUserGoods, getUserVmList, getExpireRemindList, sendExpireRemind } from '@/api/admin/userVm' import { extractApiError } from '@/utils/kvmErrorUtil' import { formatToApiTime } from '@/utils/tool' @@ -828,6 +841,12 @@ const handleDetail = (row) => { } } +const handleMoreCmd = (cmd, row) => { + if (cmd === 'remind') openRemindList(row) + else if (cmd === 'send') handleSendRemind(row) + else if (cmd === 'delete') handleDelete(row) +} + const handleDelete = (row) => { ElMessageBox.confirm(`确定删除该用户商品吗?`, '删除确认', { type: 'warning' }) .then(async () => { @@ -854,6 +873,12 @@ const openRemindList = (row) => { loadRemindList() } +const formatRemindTime = (row) => { + const t = row.CreatedAt || row.created_at || row.send_time + if (!t || t.startsWith('0001')) return '-' + try { return dayjs(t).format('YYYY-MM-DD HH:mm:ss') } catch { return t } +} + const loadRemindList = async () => { remindLoading.value = true try { diff --git a/src/views/user-vm/UserVmList.vue b/src/views/user-vm/UserVmList.vue index 6984d73..f0b7c17 100644 --- a/src/views/user-vm/UserVmList.vue +++ b/src/views/user-vm/UserVmList.vue @@ -48,7 +48,7 @@
- @@ -83,14 +83,21 @@ - + @@ -589,23 +596,31 @@ 刷新
- - - - + + + + + - + + + + - + + + + -
@@ -862,7 +877,7 @@ import { ref, reactive, computed, onMounted, nextTick } from 'vue' import { useRouter } from 'vue-router' import { ElMessage, ElMessageBox } from 'element-plus' -import { Plus, Refresh, Search } from '@element-plus/icons-vue' +import { Plus, Refresh, Search, ArrowDown } from '@element-plus/icons-vue' import { getUserVmList, getUserVmDetail, createUserVm, updateUserVm, deleteUserVm, getUserGoodsList, createUserGoods, updateUserGoods, deleteUserGoods, bindUserVm, getExpireRemindList, sendExpireRemind } from '@/api/admin/userVm' import { getProductParameterList, getProductPlanDetail } from '@/api/admin/product' import { hasUnit, getArgKey, getBaseUnit, getParamUnits, getParamDefaultUnit, toBaseUnit, fromBaseUnit } from '@/utils/dynamicUnit' @@ -944,27 +959,6 @@ const loadList = async () => { const handleSearch = () => { query.page = 1; loadList() } -// 处理表格行点击事件 -const handleRowClick = async (row) => { - if (!row.goodId) { - ElMessage.warning('该行没有商品ID') - return - } - - try { - // 调用用户虚拟机列表API,传递当前行的goodId - const res = await getUserVmList({ - page: 1, - count: 10, - good_id: row.goodId // 传递当前行的商品ID - }) - if (res.data.code === 200) { - console.log('用户虚拟机列表:', res.data.data) - } - } catch (error) { - console.error('获取用户虚拟机列表失败:', error) - } -} const goDetail = (row) => { if (!row.id) return @@ -1512,13 +1506,23 @@ const getStatusText = (status) => { } } -// ---- 删除 ---- -const handleDelete = (row) => { - if (!row.itemId) { ElMessage.warning('该用户商品未绑定虚拟机,无法删除'); return } - ElMessageBox.confirm('确定删除该用户虚拟机吗?此操作会同时删除远程VM和用户商品记录!', '删除确认', { type: 'error' }) +// ---- 更多操作 ---- +const handleMoreCmd = (cmd, row) => { + if (cmd === 'remind') openRemindList(row) + else if (cmd === 'send') handleSendRemind(row) + else if (cmd === 'delete') handleDeleteGoods(row) +} + +// ---- 删除用户商品 ---- +const handleDeleteGoods = (row) => { + const hasBoundVm = row.itemId && row.itemId !== 0 + const msg = hasBoundVm + ? `该商品(ID: ${row.id})已绑定虚拟机(VM ID: ${row.itemId}),删除后虚拟机将不再关联此商品记录,确定删除?` + : `确定删除该用户商品(ID: ${row.id})吗?` + ElMessageBox.confirm(msg, '删除确认', { type: 'error', confirmButtonText: '确认删除' }) .then(async () => { try { - const res = await deleteUserVm({ user_goods_id: row.id }) + const res = await deleteUserGoods({ id: row.id }) if (res?.data?.code === 200) { ElMessage.success('删除成功'); loadList() } else ElMessage.error(extractApiError(res?.data, '删除失败')) } catch (e) { ElMessage.error(extractApiError(e?.response?.data, '删除失败')) } @@ -1540,6 +1544,12 @@ const openRemindList = (row) => { loadRemindList() } +const formatRemindTime = (row) => { + const t = row.CreatedAt || row.created_at || row.send_time + if (!t || t.startsWith('0001')) return '-' + try { return dayjs(t).format('YYYY-MM-DD HH:mm:ss') } catch { return t } +} + const loadRemindList = async () => { remindLoading.value = true try {