todolist案例

题目描述:

你正在开发一个简单的待办事项应用,用户可以在网页上创建和管理自己的待办事项列表。请根据以下要求完成代码实现。

前端任务:

在HTML页面上创建一个表单,包含以下字段:

任务名称:用户输入待办事项的名称。
截止日期:用户选择待办事项的截止日期。
使用JavaScript/jQuery编写前端逻辑,实现以下功能:

在表单提交前对用户输入进行验证,验证不通过时阻止表单提交并给出相应提示信息。
验证任务名称和截止日期是否为空,以及截止日期是否在当前日期之前。
使用jQuery的Ajax方法,将表单数据以JSON格式发送到后端的"/api/tasks"路由,并在成功后刷新待办事项列表显示最新的待办事项。

后端任务:

使用Node.js和Express框架创建一个服务器应用程序。
创建一个POST路由"/api/tasks",接收来自前端的任务数据,并进行后端处理。
将接收到的任务数据保存到一个数组中(每个任务对象包含任务名称和截止日期)。
创建一个GET路由"/api/tasks",用于获取已创建的待办事项列表。

你需要完成以下任务:
在前端编写HTML、CSS和JavaScript/jQuery代码,实现待办事项的创建表单和验证逻辑。
在后端使用Node.js和Express框架,创建路由和处理逻辑。
将前后端代码连接起来,实现待办事项的创建和列表显示的完整功能。
注意:为了简化题目,可以将任务数据保存在服务器端的数组中,无需使用真实的数据库。


前端代码:

HTML代码:

<!DOCTYPE html>
<html>
<head>
<title>待办事项应用</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="style.css">
</head>
<body>
<div class="container">
<h1>待办事项应用</h1>
<form id="task-form">
<label for="task-name">任务名称:</label>
<input type="text" id="task-name" name="task-name" required>
<label for="due-date">截止日期:</label>
<input type="date" id="due-date" name="due-date" required>
<button type="submit">添加任务</button>
</form>
<div id="task-list"></div>
</div>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script src="script.js"></script>
</body>
</html>

CSS代码:

.container {
max-width: 600px;
margin: 0 auto;
padding: 20px;
}

h1 {
text-align: center;
}

form {
display: flex;
flex-direction: column;
margin-bottom: 20px;
}

label {
margin-bottom: 10px;
font-weight: bold;
}

input[type="text"],
input[type="date"] {
padding: 5px;
margin-bottom: 20px;
border-radius: 5px;
border: none;
box-shadow: 1px 1px 5px #ccc;
}

button {
padding: 10px;
background-color: #4CAF50;
color: white;
border: none;
border-radius: 5px;
cursor: pointer;
}

button:hover {
background-color: #3e8e41;
}

#task-list {
display: flex;
flex-direction: column;
}

.task {
background-color: #f2f2f2;
padding: 10px;
margin-bottom: 10px;
border-radius: 5px;
box-shadow: 1px 1px 5px #ccc;
}

.task-name {
font-weight: bold;
margin-bottom: 5px;
}

.task-due-date {
color: #666;
}

后端代码:

const express = require('express');
const app = express();
const bodyParser = require('body-parser');

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));

let tasks = [];

app.post('/api/tasks', (req, res) => {
const taskName = req.body['task-name'];
const dueDate = req.body['due-date'];
const task = {
name: taskName,
dueDate: dueDate
};
tasks.push(task);
res.sendStatus(200);
});

app.get('/api/tasks', (req, res) => {
res.json(tasks);
});

const port = 3000;
app.listen(port, () => console.log(Server running on port ${port}));

JavaScript/jQuery代码:

$(function() {
$('#task-form').submit(function(event) {
event.preventDefault();
const taskName = $('#task-name').val();
const dueDate = $('#due-date').val();
const currentDate = new Date().toISOString().slice(0, 10);
if (taskName === '') {
alert('请输入任务名称');
return false;
}
if (dueDate === '') {
alert('请选择截止日期');
return false;
}
if (dueDate < currentDate) {
alert('截止日期不能早于当前日期');
return false;
}
const formData = {
'task-name': taskName,
'due-date': dueDate
};
$.ajax({
type: 'POST',
url: '/api/tasks',
data: formData,
success: function() {
$('#task-form')[0].reset();
refreshTaskList();
}
});
});

function refreshTaskList() {
    $.get('/api/tasks', function(tasks) {
        let taskListHtml = '';
        for (let i = 0; i < tasks.length; i++) {
            const task = tasks[i];
            const taskHtml = `
                <div class="task">
                    <div class="task-name">${task.name}</div>
                    <div class="task-due-date">截止日期:${task.dueDate}</div>
                </div>
            `;
            taskListHtml += taskHtml;
        }
        $('#task-list').html(taskListHtml);
    });
}

refreshTaskList();
});

前端代码

<!DOCTYPE html>
<html>
<head>
  <title>待办事项应用</title>
  <link rel="stylesheet" type="text/css" href="styles.css">
</head>
<body>
  <h1>待办事项应用</h1>
  <form id="taskForm">
    <label for="taskName">任务名称:</label>
    <input type="text" id="taskName" required>
    <br>
    <label for="dueDate">截止日期:</label>
    <input type="date" id="dueDate" required>
    <br>
    <button type="submit">添加任务</button>
  </form>
  <div id="taskList"></div>

  <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
  <script src="app.js"></script>
</body>
</html>

CSS代码

body {
  font-family: Arial, sans-serif;
  padding: 20px;
}

h1 {
  text-align: center;
}

form {
  margin-bottom: 20px;
}

#taskList {
  margin-top: 20px;
}

.taskItem {
  margin-bottom: 10px;
}


前端JavaScript/jQuery代码

$(document).ready(function() {
  $('#taskForm').submit(function(event) {
    event.preventDefault();

    var taskName = $('#taskName').val();
    var dueDate = $('#dueDate').val();

    if (taskName.trim() === '') {
      alert('请填写任务名称');
      return;
    }

    var today = new Date();
    var selectedDate = new Date(dueDate);

    if (selectedDate < today) {
      alert('截止日期不能早于今天');
      return;
    }

    var taskData = {
      taskName: taskName,
      dueDate: dueDate
    };

    $.ajax({
      type: 'POST',
      url: '/api/tasks',
      data: JSON.stringify(taskData),
      contentType: 'application/json',
      success: function() {
        $('#taskName').val('');
        $('#dueDate').val('');
        loadTaskList();
      },
      error: function() {
        alert('无法添加任务');
      }
    });
  });

  function loadTaskList() {
    $.ajax({
      type: 'GET',
      url: '/api/tasks',
      success: function(tasks) {
        $('#taskList').empty();

        tasks.forEach(function(task) {
          var taskItem = $('<div>').addClass('taskItem');
          var taskName = $('<h3>').text(task.taskName);
          var dueDate = $('<p>').text('截止日期: ' + task.dueDate);

          taskItem.append(taskName);
          taskItem.append(dueDate);

          $('#taskList').append(taskItem);
        });
      },
      error: function() {
        alert('无法获取任务列表');
      }
    });
  }

  loadTaskList();
});


后端代码

const express = require('express');
const app = express();
const bodyParser = require('body-parser');

app.use(bodyParser.json());

let tasks = [];

app.post('/api/tasks', function(req, res) {
  const task = req.body;
  tasks.push(task);
  res.sendStatus(200);
});

app.get('/api/tasks', function(req, res) {
  res.json(tasks);
});

app.listen(3000, function() {
  console.log('服务器已启动,监听端口 3000');
});