This commit is contained in:
DengDai
2025-12-09 13:08:38 +08:00
commit 02ecea06f8
36 changed files with 5876 additions and 0 deletions

329
static/js/task_list.js Normal file
View File

@@ -0,0 +1,329 @@
let currentPage = 1;
let claimModal, completeModal, detailModal;
$(document).ready(function() {
// 初始化模态框
claimModal = new bootstrap.Modal(document.getElementById('claimModal'));
completeModal = new bootstrap.Modal(document.getElementById('completeModal'));
detailModal = new bootstrap.Modal(document.getElementById('detailModal'));
// 加载任务列表
loadTasks();
});
// 加载任务列表
function loadTasks(page = 1) {
const status = $('#filter-status').val();
const scope = $('#filter-scope').val();
let params = {
page: page,
per_page: 20
};
if (status) {
params.status = status;
}
if (scope === 'my') {
const user = JSON.parse(localStorage.getItem('current_user'));
params.user_id = user.id;
}
$.ajax({
url: '/api/groups/1/tasks',
method: 'GET',
data: params,
success: function(response) {
renderTasks(response.tasks);
renderPagination(response.page, response.pages);
currentPage = page;
},
error: handleAjaxError
});
}
// 渲染任务列表
function renderTasks(tasks) {
const tbody = $('#task-list');
tbody.empty();
if (tasks.length === 0) {
tbody.append('<tr><td colspan="9" class="text-center">暂无数据</td></tr>');
return;
}
const currentUser = JSON.parse(localStorage.getItem('current_user'));
tasks.forEach(function(task) {
const priorityClass = getPriorityClass(task.priority);
let actions = '';
// 待认领状态 - 所有人可认领
if (task.status === 'pending') {
actions = `<button class="btn btn-sm btn-primary" onclick="openClaimModal(${task.id})">
<i class="bi bi-hand-thumbs-up"></i> 认领
</button>`;
}
// 已认领状态 - 认领人可完成或取消
if (task.status === 'claimed' && task.claimed_by_id === currentUser.id) {
actions = `
<button class="btn btn-sm btn-success" onclick="openCompleteModal(${task.id})">
<i class="bi bi-check-circle"></i> 完成
</button>
<button class="btn btn-sm btn-warning" onclick="cancelClaim(${task.id})">
<i class="bi bi-x-circle"></i> 取消
</button>
`;
}
// 查看详情按钮
actions += ` <button class="btn btn-sm btn-info" onclick="viewDetail(${task.id})">
<i class="bi bi-eye"></i> 详情
</button>`;
// 管理员可删除
if (currentUser.role === 'admin') {
actions += ` <button class="btn btn-sm btn-danger" onclick="deleteTask(${task.id})">
<i class="bi bi-trash"></i> 删除
</button>`;
}
const row = `
<tr>
<td>${task.id}</td>
<td>
${task.series_link ?
`<a href="${task.series_link}" target="_blank">${task.series_name}</a>` :
task.series_name
}
</td>
<td>${formatDate(task.series_date)}</td>
<td><span class="${priorityClass}">${task.priority || '-'}</span></td>
<td>${getStatusBadge(task.status)}</td>
<td>${task.claimed_by || '-'}</td>
<td>${task.torrent_id || '-'}</td>
<td>${formatDateTime(task.created_at)}</td>
<td>${actions}</td>
</tr>
`;
tbody.append(row);
});
}
// 渲染分页
function renderPagination(current, total) {
const pagination = $('#pagination');
pagination.empty();
if (total <= 1) return;
// 上一页
pagination.append(`
<li class="page-item ${current === 1 ? 'disabled' : ''}">
<a class="page-link" href="#" onclick="loadTasks(${current - 1}); return false;">上一页</a>
</li>
`);
// 页码
for (let i = 1; i <= total; i++) {
if (i === 1 || i === total || (i >= current - 2 && i <= current + 2)) {
pagination.append(`
<li class="page-item ${i === current ? 'active' : ''}">
<a class="page-link" href="#" onclick="loadTasks(${i}); return false;">${i}</a>
</li>
`);
} else if (i === current - 3 || i === current + 3) {
pagination.append('<li class="page-item disabled"><span class="page-link">...</span></li>');
}
}
// 下一页
pagination.append(`
<li class="page-item ${current === total ? 'disabled' : ''}">
<a class="page-link" href="#" onclick="loadTasks(${current + 1}); return false;">下一页</a>
</li>
`);
}
// 打开认领模态框
function openClaimModal(taskId) {
$('#claim-task-id').val(taskId);
$('#claim-note').val('');
claimModal.show();
}
// 提交认领
function submitClaim() {
const taskId = $('#claim-task-id').val();
const note = $('#claim-note').val();
$.ajax({
url: `/api/tasks/${taskId}/claim`,
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
data: JSON.stringify({
claim_note: note
}),
success: function() {
claimModal.hide();
showSuccess('认领成功!');
loadTasks(currentPage);
},
error: handleAjaxError
});
}
// 打开完成模态框
function openCompleteModal(taskId) {
$('#complete-task-id').val(taskId);
$('#torrent-id').val('');
$('#complete-note').val('');
completeModal.show();
}
// 提交完成
function submitComplete() {
const taskId = $('#complete-task-id').val();
const torrentId = $('#torrent-id').val();
const note = $('#complete-note').val();
if (!torrentId) {
alert('请填写种子ID');
return;
}
$.ajax({
url: `/api/tasks/${taskId}/complete`,
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
data: JSON.stringify({
torrent_id: torrentId,
complete_note: note
}),
success: function() {
completeModal.hide();
showSuccess('任务完成!');
loadTasks(currentPage);
},
error: handleAjaxError
});
}
// 取消认领
function cancelClaim(taskId) {
if (!confirm('确定要取消认领吗?')) {
return;
}
$.ajax({
url: `/api/tasks/${taskId}/cancel-claim`,
method: 'POST',
success: function() {
showSuccess('已取消认领');
loadTasks(currentPage);
},
error: handleAjaxError
});
}
// 查看详情
function viewDetail(taskId) {
$.ajax({
url: `/api/tasks/${taskId}`,
method: 'GET',
success: function(task) {
const html = `
<dl class="row">
<dt class="col-sm-3">任务ID</dt>
<dd class="col-sm-9">${task.id}</dd>
<dt class="col-sm-3">剧集名称</dt>
<dd class="col-sm-9">${task.series_name}</dd>
<dt class="col-sm-3">剧集链接</dt>
<dd class="col-sm-9">
${task.series_link ?
`<a href="${task.series_link}" target="_blank">${task.series_link}</a>` :
'-'
}
</dd>
<dt class="col-sm-3">更新日期</dt>
<dd class="col-sm-9">${formatDate(task.series_date)}</dd>
<dt class="col-sm-3">优先级</dt>
<dd class="col-sm-9"><span class="${getPriorityClass(task.priority)}">${task.priority || '-'}</span></dd>
<dt class="col-sm-3">状态</dt>
<dd class="col-sm-9">${getStatusBadge(task.status)}</dd>
<dt class="col-sm-3">创建人</dt>
<dd class="col-sm-9">${task.creator}</dd>
<dt class="col-sm-3">创建时间</dt>
<dd class="col-sm-9">${formatDateTime(task.created_at)}</dd>
${task.claimed_by ? `
<dt class="col-sm-3">认领人</dt>
<dd class="col-sm-9">${task.claimed_by}</dd>
<dt class="col-sm-3">认领时间</dt>
<dd class="col-sm-9">${formatDateTime(task.claimed_at)}</dd>
<dt class="col-sm-3">认领备注</dt>
<dd class="col-sm-9">${task.claim_note || '-'}</dd>
` : ''}
${task.torrent_id ? `
<dt class="col-sm-3">种子ID</dt>
<dd class="col-sm-9">${task.torrent_id}</dd>
<dt class="col-sm-3">完成时间</dt>
<dd class="col-sm-9">${formatDateTime(task.completed_at)}</dd>
<dt class="col-sm-3">完成备注</dt>
<dd class="col-sm-9">${task.complete_note || '-'}</dd>
` : ''}
</dl>
`;
$('#task-detail').html(html);
detailModal.show();
},
error: handleAjaxError
});
}
// 删除任务
function deleteTask(taskId) {
if (!confirm('确定要删除这个任务吗?此操作不可恢复!')) {
return;
}
$.ajax({
url: `/api/tasks/${taskId}`,
method: 'DELETE',
success: function() {
showSuccess('任务已删除');
loadTasks(currentPage);
},
error: handleAjaxError
});
}
// 重置筛选器
function resetFilters() {
$('#filter-status').val('');
$('#filter-scope').val('all');
loadTasks(1);
}