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// 指标图表引用
403442const latencyChartRef = ref <HTMLElement >()
404443const trafficChartRef = ref <HTMLElement >()
444+
445+ // 编辑部署对话框状态
446+ const showEditDialog = ref (false )
447+ const editingDeployment = ref <any >(null )
448+ const editForm = ref ({
449+ scheduleTime: ' '
450+ })
405451const errorsChartRef = ref <HTMLElement >()
406452const 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
10261073const 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
10341121const 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
10381171const 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