Skip to content

Commit 23a8f7c

Browse files
authored
Merge pull request #71 from aice030/feat/36
Feat/36(View&Controller): 补全了漏掉的api功能
2 parents edecafc + 59a6b3d commit 23a8f7c

File tree

2 files changed

+183
-2
lines changed

2 files changed

+183
-2
lines changed

client/src/api/index.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,16 @@ export const apiService = {
120120
// 获取告警详情
121121
getAlertDetail: (issueID: string) => {
122122
return api.get(`/v1/issues/${issueID}`)
123+
},
124+
125+
// 更新部署计划
126+
updateDeployment: (deployID: string, data: {version?: string, scheduleTime?: string}) => {
127+
return api.post(`/v1/deployments/${deployID}`, data)
128+
},
129+
130+
// 创建部署计划
131+
createDeployment: (data: {service: string, version: string, scheduleTime?: string}) => {
132+
return api.post('/v1/deployments', data)
123133
}
124134
}
125135

client/src/views/HomeView.vue

Lines changed: 173 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -359,6 +359,45 @@
359359
</div>
360360
</template>
361361
</el-dialog>
362+
363+
<!-- 编辑部署计划对话框 -->
364+
<el-dialog
365+
v-model="showEditDialog"
366+
title="编辑部署计划"
367+
width="500px"
368+
:before-close="cancelEdit"
369+
>
370+
<div class="edit-deployment-form">
371+
<div class="form-item">
372+
<label class="form-label">服务名称</label>
373+
<div class="form-value">{{ editingDeployment?.service || selectedNode?.name || '未知服务' }}</div>
374+
</div>
375+
376+
<div class="form-item">
377+
<label class="form-label">版本号</label>
378+
<div class="form-value">{{ editingDeployment?.version }}</div>
379+
</div>
380+
381+
<div class="form-item">
382+
<label class="form-label">计划发布时间 <span class="required">*</span></label>
383+
<el-date-picker
384+
v-model="editForm.scheduleTime"
385+
type="datetime"
386+
placeholder="选择发布时间"
387+
format="YYYY-MM-DD HH:mm"
388+
value-format="YYYY-MM-DDTHH:mm"
389+
style="width: 100%"
390+
/>
391+
</div>
392+
</div>
393+
394+
<template #footer>
395+
<div class="dialog-footer">
396+
<el-button @click="cancelEdit">取消</el-button>
397+
<el-button type="primary" @click="saveEditDeployment">保存</el-button>
398+
</div>
399+
</template>
400+
</el-dialog>
362401
</div>
363402
</template>
364403

@@ -402,6 +441,13 @@ const selectedSlice = ref<{ nodeId: string; label: string } | null>(null)
402441
// 指标图表引用
403442
const latencyChartRef = ref<HTMLElement>()
404443
const trafficChartRef = ref<HTMLElement>()
444+
445+
// 编辑部署对话框状态
446+
const showEditDialog = ref(false)
447+
const editingDeployment = ref<any>(null)
448+
const editForm = ref({
449+
scheduleTime: ''
450+
})
405451
const errorsChartRef = ref<HTMLElement>()
406452
const saturationChartRef = ref<HTMLElement>()
407453
@@ -800,6 +846,7 @@ const deploymentPlansForDisplay = computed(() => {
800846
801847
return {
802848
id: plan.id,
849+
service: plan.service, // 保留服务名称字段
803850
version: plan.version,
804851
status: statusMap[plan.status] || plan.status,
805852
time: generateTimeDisplay(),
@@ -1024,15 +1071,101 @@ const getCurrentMetricValue = (metricName: keyof typeof metricsData.value) => {
10241071
}
10251072
10261073
const createRelease = async () => {
1074+
// 表单验证
1075+
if (!selectedNode.value?.name) {
1076+
ElMessage.error('请先选择服务')
1077+
return
1078+
}
1079+
1080+
if (!selectedVersion.value) {
1081+
ElMessage.error('请选择目标版本')
1082+
return
1083+
}
1084+
10271085
try {
1028-
ElMessage.success('发布计划创建成功')
1086+
// 准备请求数据
1087+
const requestData: any = {
1088+
service: selectedNode.value.name,
1089+
version: selectedVersion.value
1090+
}
1091+
1092+
// 如果有计划时间,转换为ISO格式
1093+
if (scheduledStart.value) {
1094+
requestData.scheduleTime = new Date(scheduledStart.value).toISOString()
1095+
}
1096+
1097+
// 调用创建部署API
1098+
const result = await apiService.createDeployment(requestData)
1099+
1100+
if (result.status === 201) {
1101+
ElMessage.success('发布计划创建成功')
1102+
1103+
// 重置表单
1104+
selectedVersion.value = ''
1105+
scheduledStart.value = ''
1106+
1107+
// 刷新相关数据
1108+
await Promise.all([
1109+
loadServiceDeploymentPlans(selectedNode.value.name),
1110+
loadServiceDetail(selectedNode.value.name)
1111+
])
1112+
} else {
1113+
ElMessage.error('创建发布计划失败')
1114+
}
10291115
} catch (error) {
1116+
console.error('创建发布计划失败:', error)
10301117
ElMessage.error('创建发布计划失败')
10311118
}
10321119
}
10331120
10341121
const editRelease = (release: any) => {
1035-
ElMessage.info('编辑发布功能待实现')
1122+
editingDeployment.value = release
1123+
// 将计划时间转换为本地时间格式(YYYY-MM-DDTHH:mm)
1124+
if (release.scheduleTime) {
1125+
const date = new Date(release.scheduleTime)
1126+
const year = date.getFullYear()
1127+
const month = String(date.getMonth() + 1).padStart(2, '0')
1128+
const day = String(date.getDate()).padStart(2, '0')
1129+
const hours = String(date.getHours()).padStart(2, '0')
1130+
const minutes = String(date.getMinutes()).padStart(2, '0')
1131+
editForm.value.scheduleTime = `${year}-${month}-${day}T${hours}:${minutes}`
1132+
} else {
1133+
editForm.value.scheduleTime = ''
1134+
}
1135+
showEditDialog.value = true
1136+
}
1137+
1138+
// 保存编辑的部署计划
1139+
const saveEditDeployment = async () => {
1140+
if (!editingDeployment.value) return
1141+
1142+
try {
1143+
// 将本地时间转换为ISO格式
1144+
const scheduleTime = editForm.value.scheduleTime ? new Date(editForm.value.scheduleTime).toISOString() : undefined
1145+
1146+
const result = await apiService.updateDeployment(editingDeployment.value.id, {
1147+
scheduleTime: scheduleTime
1148+
})
1149+
1150+
if (result.status === 200) {
1151+
ElMessage.success('部署计划已更新')
1152+
showEditDialog.value = false
1153+
// 刷新发布计划列表
1154+
await loadServiceDeploymentPlans(selectedNode.value?.name || '')
1155+
} else {
1156+
ElMessage.error('更新部署计划失败')
1157+
}
1158+
} catch (error) {
1159+
console.error('更新部署计划失败:', error)
1160+
ElMessage.error('更新部署计划失败')
1161+
}
1162+
}
1163+
1164+
// 取消编辑
1165+
const cancelEdit = () => {
1166+
showEditDialog.value = false
1167+
editingDeployment.value = null
1168+
editForm.value.scheduleTime = ''
10361169
}
10371170
10381171
const confirmCancel = async (plan: any) => {
@@ -1934,4 +2067,42 @@ const disposeMetricsCharts = () => {
19342067
align-items: stretch;
19352068
}
19362069
}
2070+
2071+
/* 编辑部署对话框样式 */
2072+
.edit-deployment-form {
2073+
padding: 20px 0;
2074+
}
2075+
2076+
.form-item {
2077+
margin-bottom: 20px;
2078+
}
2079+
2080+
.form-label {
2081+
display: block;
2082+
font-size: 14px;
2083+
font-weight: 500;
2084+
color: #374151;
2085+
margin-bottom: 8px;
2086+
}
2087+
2088+
.form-label .required {
2089+
color: #ef4444;
2090+
margin-left: 4px;
2091+
}
2092+
2093+
.form-value {
2094+
font-size: 14px;
2095+
color: #6b7280;
2096+
padding: 8px 12px;
2097+
background-color: #f9fafb;
2098+
border: 1px solid #e5e7eb;
2099+
border-radius: 6px;
2100+
min-height: 20px;
2101+
}
2102+
2103+
.dialog-footer {
2104+
display: flex;
2105+
justify-content: flex-end;
2106+
gap: 12px;
2107+
}
19372108
</style>

0 commit comments

Comments
 (0)