智慧水务管理系统 - 精河县供水工程综合管理平台

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>任务追踪</title>
  7. <script src="https://cdn.tailwindcss.com"></script>
  8. </head>
  9. <body class="bg-gray-50 min-h-screen">
  10. <nav class="bg-purple-600 text-white shadow-lg">
  11. <div class="container mx-auto px-4 py-4">
  12. <div class="flex justify-between items-center">
  13. <div class="flex items-center space-x-3"><span class="text-2xl">🤝</span><h1 class="text-xl font-bold">远程团队协作工具</h1></div>
  14. <div class="flex space-x-4">
  15. <a href="/" class="hover:bg-purple-500 px-3 py-2 rounded">首页</a>
  16. <a href="/documents" class="hover:bg-purple-500 px-3 py-2 rounded">文档</a>
  17. <a href="/tasks" class="bg-purple-500 px-3 py-2 rounded">任务</a>
  18. </div>
  19. </div>
  20. </div>
  21. </nav>
  22. <main class="container mx-auto px-4 py-8">
  23. <div class="flex justify-between items-center mb-8">
  24. <div><h2 class="text-3xl font-bold text-gray-800">✅ 任务追踪</h2><p class="text-gray-600 mt-2">异步任务管理和进度跟踪</p></div>
  25. <button onclick="createTask()" class="bg-green-600 text-white px-6 py-3 rounded-lg">➕ 创建任务</button>
  26. </div>
  27. <div class="grid grid-cols-1 md:grid-cols-3 gap-6 mb-8">
  28. <div><h3 class="font-bold mb-3 text-gray-700">📋 待办</h3><div id="todoList" class="space-y-3"></div></div>
  29. <div><h3 class="font-bold mb-3 text-gray-700">⏳ 进行中</h3><div id="inProgressList" class="space-y-3"></div></div>
  30. <div><h3 class="font-bold mb-3 text-gray-700">✅ 已完成</h3><div id="doneList" class="space-y-3"></div></div>
  31. </div>
  32. </main>
  33. <script>
  34. async function loadTasks() {
  35. const res = await fetch('/api/tasks');
  36. const data = await res.json();
  37. if (data.success) {
  38. const todo = data.data.filter(t => t.status === 'todo');
  39. const progress = data.data.filter(t => t.status === 'in_progress');
  40. const done = data.data.filter(t => t.status === 'done');
  41. document.getElementById('todoList').innerHTML = renderTasks(todo);
  42. document.getElementById('inProgressList').innerHTML = renderTasks(progress);
  43. document.getElementById('doneList').innerHTML = renderTasks(done);
  44. if (data.data.length === 0) document.getElementById('todoList').innerHTML = '<p class="text-gray-500 text-center py-4">暂无任务</p>';
  45. }
  46. }
  47. function renderTasks(tasks) {
  48. if (tasks.length === 0) return '<p class="text-gray-500 text-center py-4">无</p>';
  49. return tasks.map(t => `
  50. <div class="bg-white rounded-lg shadow p-4">
  51. <h4 class="font-medium">${t.title}</h4>
  52. <p class="text-sm text-gray-600 mt-1">${t.description || ''}</p>
  53. <div class="flex justify-between items-center mt-3">
  54. <span class="text-xs ${t.priority==='high'?'text-red-600':t.priority==='medium'?'text-orange-600':'text-green-600'}">${t.priority}</span>
  55. ${t.status !== 'done' ? `<button onclick="advanceTask(${t.id}, '${t.status}')" class="text-blue-600 hover:underline text-sm">→ 推进</button>` : ''}
  56. </div>
  57. </div>
  58. `).join('');
  59. }
  60. async function advanceTask(id, status) {
  61. const newStatus = status === 'todo' ? 'in_progress' : 'done';
  62. const res = await fetch(`/api/tasks/${id}/status`, { method: 'PUT', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ status: newStatus, user_id: 1 }) });
  63. const result = await res.json();
  64. if (result.success) { alert('✅ 任务已推进'); loadTasks(); }
  65. }
  66. async function createTask() {
  67. const title = prompt('任务标题:');
  68. if (!title) return;
  69. const description = prompt('任务描述:') || '';
  70. const res = await fetch('/api/tasks', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ title, description, creator_id: 1, priority: 'medium' }) });
  71. const result = await res.json();
  72. if (result.success) { alert('✅ 任务创建成功'); loadTasks(); }
  73. else alert('❌ ' + result.error);
  74. }
  75. document.addEventListener('DOMContentLoaded', loadTasks);
  76. </script>
  77. </body>
  78. </html>