Skip to content

Commit ec03b27

Browse files
committed
任务列表添加删除按钮
1 parent f81692d commit ec03b27

3 files changed

Lines changed: 70 additions & 13 deletions

File tree

app.py

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -288,8 +288,8 @@ def get_task(task_id):
288288

289289
@app.route('/api/tasks/<int:task_id>', methods=['DELETE'])
290290
@login_required
291-
def cancel_task(task_id):
292-
"""取消任务"""
291+
def delete_task(task_id):
292+
"""彻底删除任务"""
293293
try:
294294
with get_db() as db:
295295
task = db.query(NotifyTask).filter(
@@ -299,14 +299,14 @@ def cancel_task(task_id):
299299
if not task:
300300
return jsonify({'error': '任务不存在'}), 404
301301

302-
# 更新状态为已取消
303-
task.status = NotifyStatus.CANCELLED
304-
db.commit()
305-
306302
# 从调度器移除
307303
scheduler.remove_task(task_id, task.is_recurring)
308304

309-
return jsonify({'message': '任务已取消'})
305+
# 彻底删除
306+
db.delete(task)
307+
db.commit()
308+
309+
return jsonify({'message': '任务已彻底删除'})
310310

311311
except Exception as e:
312312
return jsonify({'error': str(e)}), 500
@@ -334,11 +334,21 @@ def update_task(task_id):
334334
# 记录原始状态
335335
original_status = task.status
336336

337-
# 处理状态变更(暂停/恢复)
337+
# 处理状态变更(暂停/恢复/取消
338338
if 'status' in data:
339339
try:
340340
target_status_str = data['status']
341341

342+
# 取消任务 (软删除)
343+
if target_status_str == 'cancelled':
344+
task.status = NotifyStatus.CANCELLED
345+
scheduler.remove_task(task_id, task.is_recurring)
346+
db.commit()
347+
return jsonify({
348+
'message': '任务已取消',
349+
'task': task.to_dict()
350+
})
351+
342352
# 暂停任务
343353
if target_status_str == 'paused':
344354
task.status = NotifyStatus.PAUSED

static/js/app.js

Lines changed: 51 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -899,6 +899,9 @@ function createTaskElement(task) {
899899
const channelText = channels.find(c => c.value === task.channel)?.label || task.channel;
900900
const scheduleLabel = task.is_recurring ? '📅 下一次执行时间' : '📅 计划时间';
901901

902+
// 定义删除按钮
903+
const deleteBtn = `<button class="btn btn-sm btn-ghost" style="color: #ef4444; border-color: rgba(239, 68, 68, 0.2);" onclick="deleteTask(${task.id})">🗑️ 删除</button>`;
904+
902905
div.innerHTML = `
903906
<div class="task-header">
904907
<div>
@@ -924,12 +927,15 @@ function createTaskElement(task) {
924927
<button class="btn btn-sm btn-info" onclick="editTask(${task.id})">编辑</button>
925928
${task.is_recurring ? `<button class="btn btn-sm btn-warning" onclick="toggleTaskPause(${task.id}, 'pause')">暂停</button>` : ''}
926929
<button class="btn btn-sm btn-danger" onclick="cancelTask(${task.id})">取消任务</button>
930+
${deleteBtn}
927931
` : task.status === 'paused' ? `
928932
<button class="btn btn-sm btn-info" onclick="editTask(${task.id})">编辑</button>
929933
<button class="btn btn-sm btn-success" onclick="toggleTaskPause(${task.id}, 'resume')">恢复</button>
930934
<button class="btn btn-sm btn-danger" onclick="cancelTask(${task.id})">取消任务</button>
935+
${deleteBtn}
931936
` : `
932937
<button class="btn btn-sm btn-success" onclick="editTask(${task.id})">重新启用</button>
938+
${deleteBtn}
933939
`}
934940
</div>
935941
`;
@@ -1097,23 +1103,26 @@ function showConfirmDialog({
10971103
});
10981104
}
10991105

1100-
// 取消任务
1106+
// 取消任务(软删除)
11011107
async function cancelTask(taskId) {
11021108
const confirmed = await showConfirmDialog({
11031109
title: '取消任务',
1104-
message: '确定要取消这个任务吗?此操作不可恢复。',
1110+
message: '确定要取消这个任务吗?\n取消后任务将停止发送,但保留在列表中,可以重新启用。',
11051111
confirmText: '确认取消',
11061112
cancelText: '保留任务'
11071113
});
11081114

11091115
if (!confirmed) return;
11101116

11111117
try {
1118+
// 使用 PUT 更新状态为 cancelled
11121119
const response = await fetch(`${API_BASE}/tasks/${taskId}`, {
1113-
method: 'DELETE',
1120+
method: 'PUT',
11141121
headers: {
1122+
'Content-Type': 'application/json',
11151123
'Authorization': `Bearer ${localStorage.getItem('token')}`
1116-
}
1124+
},
1125+
body: JSON.stringify({ status: 'cancelled' })
11171126
});
11181127

11191128
const result = await response.json();
@@ -1135,6 +1144,44 @@ async function cancelTask(taskId) {
11351144
}
11361145
}
11371146

1147+
// 彻底删除任务(硬删除)
1148+
async function deleteTask(taskId) {
1149+
const confirmed = await showConfirmDialog({
1150+
title: '彻底删除任务',
1151+
message: '⚠️ 确定要彻底删除这个任务吗?\n此操作将永久移除任务记录,无法恢复!',
1152+
confirmText: '彻底删除',
1153+
cancelText: '取消'
1154+
});
1155+
1156+
if (!confirmed) return;
1157+
1158+
try {
1159+
const response = await fetch(`${API_BASE}/tasks/${taskId}`, {
1160+
method: 'DELETE',
1161+
headers: {
1162+
'Authorization': `Bearer ${localStorage.getItem('token')}`
1163+
}
1164+
});
1165+
1166+
const result = await response.json();
1167+
1168+
if (response.ok) {
1169+
showNotification('任务已彻底删除', 'success');
1170+
loadTasks();
1171+
1172+
// 刷新日历
1173+
if (typeof window.loadCalendar === 'function') {
1174+
delete window.__TASKS_CACHE;
1175+
window.loadCalendar();
1176+
}
1177+
} else {
1178+
showNotification('删除失败: ' + result.error, 'error');
1179+
}
1180+
} catch (error) {
1181+
showNotification('删除失败: ' + error.message, 'error');
1182+
}
1183+
}
1184+
11381185
// 切换任务暂停/恢复状态
11391186
async function toggleTaskPause(taskId, action) {
11401187
const isPause = action === 'pause';

version.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
version: 0.5.0
1+
version: 0.5.1

0 commit comments

Comments
 (0)