主机上架功能

This commit is contained in:
qiuyuan 2026-01-29 19:08:45 +08:00
parent a5471e319d
commit 15b9b28358
3 changed files with 232 additions and 74 deletions

View File

@ -19,12 +19,6 @@ export const deleteBlackCustomers = (id) => request.basic.delete(`/api/v1/blackC
// 拉黑用户 // 拉黑用户
export const updateCustomers = (id, data) => request.basic.put(`/api/v1/customers/${id}`, data) export const updateCustomers = (id, data) => request.basic.put(`/api/v1/customers/${id}`, data)
// 上架主机资源
export const addHostResource = (params) => request.basic.get('/api/v1/autoDl-dl-hosts/sync', params)
//获取单个banner
export const getBanner = (id) => request.basic.get(`/api/v1/banners/${id}`)
//创建banner
export const createBanner = (data) => request.basic.post('/api/v1/banners', data)
//更新banner
export const updateBanner = (id, data) => request.basic.put(`/api/v1/banners/${id}`, data)
//删除banner
export const deleteBanner = (id) => request.basic.delete(`/api/v1/banners/${id}`)

View File

@ -1,27 +1,88 @@
<template> <template>
<a-modal <a-modal :open="modal.open" :title="modal.title" :confirm-loading="modal.confirmLoading" :width="800"
:open="modal.open" :after-close="onAfterClose" @ok="handleOk" @cancel="handleCancel">
:title="modal.title" <a-form ref="formRef" scroll-to-first-error :model="formData" :rules="formRules" :label-col="{ span: 6 }"
:confirm-loading="modal.confirmLoading" :wrapper-col="{ span: 16 }">
:after-close="onAfterClose" <!-- 价格输入部分 -->
@ok="handleOk" <a-row :gutter="16">
@cancel="handleCancel"> <a-col :span="12">
<a-form <!-- 机器ID编辑时显示新建时隐藏 -->
ref="formRef" <a-form-item v-if="modal.type === 'edit'" label="机器ID" name="machine_id">
scroll-to-first-error <a-input v-model:value="formData.machine_id" placeholder="机器ID" disabled>
:model="formData" </a-input>
:rules="formRules"
:label-col="{ style: { width: '80px' } }">
<a-form-item
label="标题"
name="title">
<a-input v-model:value="formData.title"></a-input>
</a-form-item> </a-form-item>
</a-col>
<a-col :span="12">
<!-- 数据中心ID下拉选择 -->
<a-form-item label="数据中心" name="center_id" :rules="[{ required: true, message: '请选择数据中心' }]">
<a-select v-model:value="formData.center_id" placeholder="请选择数据中心" :options="centerOptions"
allowClear show-search :filter-option="filterOption">
</a-select>
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label="按时付费" name="payOnTime" :rules="[{ required: true, message: '请输入按时付费价格' }]">
<a-input-number v-model:value="formData.payOnTime" placeholder="请输入按时付费价格" style="width: 100%"
:min="0" :precision="2" :step="0.01" addon-after="元">
</a-input-number>
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label="按日付费" name="payOnDay" :rules="[{ required: true, message: '请输入按日付费价格' }]">
<a-input-number v-model:value="formData.payOnDay" placeholder="请输入按日付费价格" style="width: 100%"
:min="0" :precision="2" :step="0.01" addon-after="元">
</a-input-number>
</a-form-item>
</a-col>
</a-row>
<a-row :gutter="16">
<a-col :span="12">
<a-form-item label="按周付费" name="payOnWeek" :rules="[{ required: true, message: '请输入按周付费价格' }]">
<a-input-number v-model:value="formData.payOnWeek" placeholder="请输入按周付费价格" style="width: 100%"
:min="0" :precision="2" :step="0.01" addon-after="元">
</a-input-number>
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label="按月付费" name="payOnMonth" :rules="[{ required: true, message: '请输入按月付费价格' }]">
<a-input-number v-model:value="formData.payOnMonth" placeholder="请输入按月付费价格" style="width: 100%"
:min="0" :precision="2" :step="0.01" addon-after="元">
</a-input-number>
</a-form-item>
</a-col>
</a-row>
<a-row :gutter="16">
<a-col :span="12">
<a-form-item label="按年付费" name="payOnYear" :rules="[{ required: true, message: '请输入按年付费价格' }]">
<a-input-number v-model:value="formData.payOnYear" placeholder="请输入按年付费价格" style="width: 100%"
:min="0" :precision="2" :step="0.01" addon-after="元">
</a-input-number>
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label="状态" name="status" :rules="[{ required: true, message: '请选择状态' }]">
<a-radio-group v-model:value="formData.status">
<a-radio value="ENABLED">启用</a-radio>
<a-radio value="DISABLED">禁用</a-radio>
</a-radio-group>
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label="是否推荐" name="is_recommend">
<a-switch v-model:checked="formData.is_recommend" checked-children="推荐"
un-checked-children="不推荐">
</a-switch>
</a-form-item>
</a-col>
</a-row>
</a-form> </a-form>
</a-modal> </a-modal>
</template> </template>
<script setup> <script setup>
import { ref, onMounted } from 'vue'
import { cloneDeep } from 'lodash-es' import { cloneDeep } from 'lodash-es'
import apis from '@/apis' import apis from '@/apis'
import { useForm, useModal } from '@/hooks' import { useForm, useModal } from '@/hooks'
@ -31,17 +92,69 @@ const emit = defineEmits(['ok'])
const { modal, showModal, hideModal, showLoading, hideLoading } = useModal() const { modal, showModal, hideModal, showLoading, hideLoading } = useModal()
const { formRef, formRules, formRecord, formData, resetForm } = useForm() const { formRef, formRules, formRecord, formData, resetForm } = useForm()
formRules.value = { //
title: { required: true, message: '请输入标题' }, const centerOptions = ref([
{ label: '数据中心1', value: '20004adaknk656' },
{ label: '数据中心2', value: '20004adaknk656' },
{ label: '数据中心3', value: '20004adaknk656' },
])
//
const initFormData = () => {
formData.value = {
machine_id: '', // ID
center_id: undefined, // ID
payOnTime: undefined, //
payOnDay: undefined, //
payOnWeek: undefined, //
payOnMonth: undefined, //
payOnYear: undefined, //
status: 'ENABLED', //
is_recommend: false, //
}
//
formRules.value = {
center_id: [{ required: true, message: '请选择数据中心' }],
payOnTime: [{ required: true, message: '请输入按时付费价格' }],
payOnDay: [{ required: true, message: '请输入按日付费价格' }],
payOnWeek: [{ required: true, message: '请输入按周付费价格' }],
payOnMonth: [{ required: true, message: '请输入按月付费价格' }],
payOnYear: [{ required: true, message: '请输入按年付费价格' }],
status: [{ required: true, message: '请选择状态' }],
}
}
//
const filterOption = (input, option) => {
return option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0
}
//
const fetchCenterList = async () => {
try {
// API
// const result = await apis.system.getCenterList()
// if (result?.success || result?.code === 200) {
// centerOptions.value = result.data.map(item => ({
// label: item.name,
// value: item.id
// }))
// }
} catch (error) {
console.error('获取数据中心列表失败:', error)
}
} }
/** /**
* 新建 * 新建
*/ */
function handleCreate() { function handleCreate() {
initFormData()
showModal({ showModal({
type: 'create', type: 'create',
title: '新建', title: '新增主机同步',
confirmLoading: false,
}) })
} }
@ -49,51 +162,83 @@ function handleCreate() {
* 编辑 * 编辑
*/ */
function handleEdit(record = {}) { function handleEdit(record = {}) {
initFormData()
showModal({ showModal({
type: 'edit', type: 'edit',
title: '编辑', title: '上架主机资源',
confirmLoading: false,
}) })
//
formRecord.value = record formRecord.value = record
formData.value = cloneDeep(record)
//
formData.value = {
machine_id: record.machine_id,
center_id: record.center_id || undefined,
payOnTime: record.payOnTime || undefined,
payOnDay: record.payOnDay || undefined,
payOnWeek: record.payOnWeek || undefined,
payOnMonth: record.payOnMonth || undefined,
payOnYear: record.payOnYear || undefined,
status: record.status || 'ENABLED',
is_recommend: record.is_recommend || false,
}
} }
/** /**
* 确定 * 确定 - 提交表单
*/ */
function handleOk() { async function handleOk() {
formRef.value
.validateFields()
.then(async (values) => {
try { try {
//
await formRef.value.validateFields()
showLoading() showLoading()
const params = {
...values, //
const submitData = {
machine_id: formData.value.machine_id,
center_id: formData.value.center_id,
payOnTime: Number(formData.value.payOnTime || 0),
payOnDay: Number(formData.value.payOnDay || 0),
payOnWeek: Number(formData.value.payOnWeek || 0),
payOnMonth: Number(formData.value.payOnMonth || 0),
payOnYear: Number(formData.value.payOnYear || 0),
status: formData.value.status,
is_recommend: formData.value.is_recommend,
} }
console.log('提交数据:', submitData)
let result = null let result = null
switch (modal.value.type) {
case 'create': //
result = await apis.common.create(params).catch(() => { if (modal.value.type === 'create') {
throw new Error() //
}) result = await apis.host.syncHostInfo(submitData)
break } else if (modal.value.type === 'edit') {
case 'edit': //
result = await apis.common.update(formRecord.value.id, params).catch(() => { result = await apis.resource.addHostResource(submitData)
throw new Error()
})
break
} }
hideLoading() hideLoading()
if (200 === result?.code) {
// API
if (result?.success || result?.code === 200) {
//
hideModal() hideModal()
emit('ok') emit('ok') //
} else {
//
console.error('操作失败:', result?.message)
} }
} catch (error) { } catch (error) {
hideLoading() hideLoading()
console.error('表单验证或提交失败:', error)
} }
})
.catch(() => {
hideLoading()
})
} }
/** /**
@ -104,16 +249,35 @@ function handleCancel() {
} }
/** /**
* 关闭后 * 关闭后重置
*/ */
function onAfterClose() { function onAfterClose() {
resetForm() resetForm()
} }
//
onMounted(() => {
initFormData()
//
// fetchCenterList()
})
defineExpose({ defineExpose({
handleCreate, handleCreate,
handleEdit, handleEdit,
}) })
</script> </script>
<style lang="less" scoped></style> <style lang="less" scoped>
:deep(.ant-form-item) {
margin-bottom: 16px;
}
:deep(.ant-input-number) {
width: 100%;
}
:deep(.ant-select) {
width: 100%;
}
</style>

View File

@ -110,15 +110,15 @@
<!-- 操作 --> <!-- 操作 -->
<template v-if="'action' === column.key"> <template v-if="'action' === column.key">
<a-space> <a-space>
<a-button type="link" size="small" @click="$refs.editDialogRef.handleEdit(record)"> <!-- <a-button type="link" size="small" @click="$refs.editDialogRef.handleEdit(record)">
编辑 编辑
</a-button> -->
<a-button type="link" size="small" @click="$refs.editDialogRef.handleEdit(record)">
上架
</a-button> </a-button>
<a-button type="link" size="small" danger @click="handleDownShelf(record)"> <!-- <a-button type="link" size="small" danger @click="handleRemove(record)">
下架
</a-button>
<a-button type="link" size="small" danger @click="handleRemove(record)">
删除 删除
</a-button> </a-button> -->
</a-space> </a-space>
</template> </template>
</template> </template>