作为用户,我希望能够创建新任务,以便记录我需要完成的工作作为用户,
能够查看我的任务列表,以便了解所有待办事项
标记任务为完成,以便跟踪进度,
能够删除任务,以便清理不再需要的任务最小可用系统(MVP)架构设计、
技术栈选择
·前端: React.is(简单、组件化)
后端: Node.js +Express(轻量级、快速。开发)
·数据库:SQLite(简单、无需额外配置)
React │ │ Express │ │ SQLite │
│ Frontend │ ←→ │ API │ ←→ │ Database │
└─────────────┘
API设计
·GET /api/tasks-获取所有任务
·POST /api/tasks-创建新任务
·PUT /api/tasks/:id-更新任务状态
·DELETE /api/tasks/:id-删除任务
// server.js
const express = require('express');
const sqlite3 = require('sqlite3').verbose();
const bodyParser = require('body-parser');
const app = express();
const port = 3001;
const db = new sqlite3.Database(':memory:');
app.use(bodyParser.json());
app.use((req, res, next) => {
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE');
res.header('Access-Control-Allow-Headers', 'Content-Type');
next();
});
// 初始化数据库
db.serialize(() => {
db.run("CREATE TABLE tasks (id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT, completed BOOLEAN DEFAULT 0)");
});
// 获取所有任务
app.get('/api/tasks', (req, res) => {
db.all("SELECT * FROM tasks", [], (err, rows) => {
if (err) {
res.status(500).json({ error: err.message });
return;
}
res.json(rows);
});
});
// 创建新任务
app.post('/api/tasks', (req, res) => {
const { title } = req.body;
if (!title) {
res.status(400).json({ error: "Title is required" });
return;
}
db.run("INSERT INTO tasks (title) VALUES (?)", [title], function(err) {
if (err) {
res.status(500).json({ error: err.message });
return;
}
res.json({ id: this.lastID, title, completed: false });
});
});
// 更新任务状态
app.put('/api/tasks/:id', (req, res) => {
const { id } = req.params;
const { completed } = req.body;
db.run("UPDATE tasks SET completed = ? WHERE id = ?", [completed, id], function(err) {
if (err) {
res.status(500).json({ error: err.message });
return;
}
if (this.changes === 0) {
res.status(404).json({ error: "Task not found" });
return;
}
res.json({ id, completed });
});
});
// 删除任务
app.delete('/api/tasks/:id', (req, res) => {
const { id } = req.params;
db.run("DELETE FROM tasks WHERE id = ?", [id], function(err) {
if (err) {
res.status(500).json({ error: err.message });
return;
}
if (this.changes === 0) {
res.status(404).json({ error: "Task not found" });
return;
}
res.json({ success: true });
});
});
app.listen(port, () => {
console.log(Server running on http://localhost😒{port});
});
数据库设置
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE,
password VARCHAR(100) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE categories (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
user_id INT NOT NULL,
FOREIGN KEY (user_id) REFERENCES users(id)
);
CREATE TABLE tasks (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255) NOT NULL,
description TEXT,
completed BOOLEAN DEFAULT FALSE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
user_id INT NOT NULL,
category_id INT,
FOREIGN KEY (user_id) REFERENCES users(id),
FOREIGN KEY (category_id) REFERENCES categories(id)
);
前端设置:
.app {
max-width: 600px;
margin: 0 auto;
padding: 20px;
font-family: Arial, sans-serif;
}
.task-form {
display: flex;
margin-bottom: 20px;
}
.task-form input {
flex: 1;
padding: 8px;
font-size: 16px;
}
.task-form button {
padding: 8px 16px;
background-color: #4CAF50;
color: white;
border: none;
cursor: pointer;
}
.task-list {
list-style-type: none;
padding: 0;
}
.task-list li {
display: flex;
justify-content: space-between;
align-items: center;
padding: 10px;
border-bottom: 1px solid #ddd;
}
.task-list li.completed {
text-decoration: line-through;
color: #888;
}
.task-list li span {
cursor: pointer;
}
.task-list li button {
background-color: #f44336;
color: white;
border: none;
padding: 5px 10px;
cursor: pointer;
}
冲刺结果总结:通过这次冲刺任务,我们实现了管理系统的功能,包括创建新任务,查看任务,标记任务和删除任务,可以为后续迭代开发奠定了基础
浙公网安备 33010602011771号