字段名 | 数据类型 | 长度 | 校验规则 | 描述 |
---|---|---|---|---|
id | INT | N/A | 自动递增1 | 任务的唯一标识,从1开始,每个任务自动递增1 |
description | VARCHAR | 255 | N/A | 任务的描述,记录任务的具体信息 |
status | INT | N/A | 1表示未完成,2表示已完成 | 任务的状态,表示任务的当前进度 |
creation_time | DATETIME | N/A | N/A | 任务的创建时间,记录任务被创建的具体时间 |
expected_completion_time | DATETIME | N/A | 不能早于创建时间 | 任务的预期完成时间,记录任务预计何时完成 |
actual_completion_time | DATETIME | N/A | 不能早于创建时间,且当任务状态为"已完成"时,此字段必须有值 | 任务的实际完成时间,记录任务实际何时完成 |
服务的基础URL是 http://localhost:3000
该接口用于创建新任务。
URL: /tasks
方法: POST
数据参数:
{
"description": "[字符串] 任务的描述",
"expected_completion_time": "[字符串] 预期完成时间,格式为 YYYY-MM-DD HH:mm:ss"
}
成功响应:
代码: 201 Created
内容:
{
"id": "[整数] 新建任务的id",
"description": "[字符串] 任务的描述",
"status": 1,
"creation_time": "[字符串] 任务的创建时间",
"expected_completion_time": "[字符串] 预期完成时间",
"actual_completion_time": null
}
该接口用于删除现有任务。
URL: /tasks/:id
方法: DELETE
URL参数: id=[整数] 任务的id
成功响应:
代码: 204 No Content
该接口用于更新现有任务,具体来说,将其状态设置为'2'并记录实际完成时间。
URL: /tasks/:id
方法: PUT
URL参数: id=[整数] 任务的id
成功响应:
代码: 200 OK
该接口用于获取所有任务的列表,或获取特定状态的任务。
URL: /tasks
方法: GET
URL参数: status=[整数] (可选) 要检索的任务的状态
成功响应:
代码: 200 OK
内容:
[
{
"id": "[整数] 任务的id",
"description": "[字符串] 任务的描述",
"status": "[整数] 任务的状态",
"creation_time": "[字符串] 任务的创建时间",
"expected_completion_time": "[字符串] 预期完成时间",
"actual_completion_time": "[字符串] 实际完成时间"
},
...
]
注意:
增加一个任务记录:
curl -X POST -H "Content-Type: application/json" -d '{"description": "task1", "expected_completion_time": "2023-07-01 12:00:00"}' http://localhost:3000/tasks
查询任务记录:
curl -X GET http://localhost:3000/tasks
如果只想获取具有特定状态的任务,例如,如果只想获取未完成的任务,可以这样做:
curl -X GET http://localhost:3000/tasks?status=1
完成一个任务记录:(请用具体的任务ID替换 {id})
curl -X PUT http://localhost:3000/tasks/{id}
删除一个任务记录:(请用具体的任务ID替换 {id})
curl -X DELETE http://localhost:3000/tasks/{id}
请注意,你可能需要根据你的具体情况对上述命令进行修改。具体来说,你可能需要更改基本URL(如果你的服务不是运行在 http://localhost:3000
上),以及 POST
请求的任务描述和预期完成时间。
const express = require('express');
const fs = require('fs');
const path = require('path');
const moment = require('moment');
const cors = require('cors');
const app = express();
app.use(cors({
origin: '*',
methods: ['GET', 'POST', 'PUT', 'DELETE'],
allowedHeaders: ['Content-Type', 'Authorization'],
credentials: true,
optionsSuccessStatus: 200
}));
app.use(express.json());
const DATE_FORMAT = `YYYY/MM/DD HH:mm:ss`;
const dataFilePath = path.resolve(__dirname, './data.json');
let tasks;
if (!fs.existsSync(dataFilePath)) {
tasks = [];
fs.writeFileSync(dataFilePath, JSON.stringify(tasks));
} else {
tasks = JSON.parse(fs.readFileSync(dataFilePath, 'utf-8'));
}
app.post('/tasks', (req, res) => {
const {
description,
expected_completion_time
} = req.body;
const newTask = {
id: tasks.length + 1,
description,
status: 1,
creation_time: moment().format(DATE_FORMAT),
expected_completion_time,
actual_completion_time: null
};
tasks.push(newTask);
fs.writeFileSync(dataFilePath, JSON.stringify(tasks));
res.status(201).send(newTask);
});
app.delete('/tasks/:id', (req, res) => {
const {
id
} = req.params;
tasks = tasks.filter(task => task.id !== parseInt(id));
fs.writeFileSync(dataFilePath, JSON.stringify(tasks));
res.status(204).send();
});
app.put('/tasks/:id', (req, res) => {
const { id } = req.params;
tasks = tasks.map(task => {
if (task.id === parseInt(id)) {
task.status = 2;
task.actual_completion_time = moment().format(DATE_FORMAT);
}
return task;
});
fs.writeFileSync(dataFilePath, JSON.stringify(tasks));
res.status(200).send();
});
app.get('/tasks', (req, res) => {
const { status } = req.query;
let filteredTasks = tasks;
if (status) {
filteredTasks = tasks.filter(task => task.status === parseInt(status));
}
res.status(200).send(filteredTasks);
});
const port = 3000;
app.listen(port, () => {
console.log(`Server is up and running on port ${port}`);
});
src\api\index.js
import axios from 'axios';
// 创建 axios 实例
const service = axios.create({
baseURL: 'http://localhost:3000', // API 的 base URL
timeout: 5000, // 请求超时时间
});
// 请求拦截器
service.interceptors.request.use(
config => {
// 在此处可以进行一些请求前的操作,例如设置请求头等
// config.headers['Authorization'] = 'Bearer ' + getToken();
return config;
},
error => {
// 请求错误处理
console.error(error);
return Promise.reject(error);
},
);
// 响应拦截器
service.interceptors.response.use(
response => {
// 在此处可以进行一些响应的操作,例如错误处理等
// if (response.data.code !== 200) {
// // 错误处理
// }
return response.data;
},
error => {
// 响应错误处理
console.error('err' + error);
return Promise.reject(error);
},
);
export default service;
src\api\taskService.js
import service from './index';
export default {
// 获取任务列表
getTasks(status) {
return service.get('/tasks', { params: { status } });
},
// 创建新任务
createTask(description, expected_completion_time) {
return service.post('/tasks', { description, expected_completion_time });
},
// 删除任务
deleteTask(id) {
return service.delete(`/tasks/${id}`);
},
// 更新任务
updateTask(id) {
return service.put(`/tasks/${id}`);
},
};
src\test.js
import taskService from '../api/taskService';// 导入你的任务服务模块
// 测试获取任务列表方法
const testGetTasks = () => {
const status = 'completed'; // 假设我们正在获取已完成的任务
taskService.getTasks(status)
.then(response => console.log(response)) // 成功时打印结果
.catch(error => console.error(error)); // 失败时打印错误信息
};
// 测试创建新任务方法
const testCreateTask = () => {
const description = 'Test Task';
const expected_completion_time = '2023-12-31';
taskService.createTask(description, expected_completion_time)
.then(response => console.log(response))
.catch(error => console.error(error));
};
// 测试删除任务方法
const testDeleteTask = () => {
const id = 1; // 假设我们正在删除ID为1的任务
taskService.deleteTask(id)
.then(response => console.log(response))
.catch(error => console.error(error));
};
// 测试更新任务方法
const testUpdateTask = () => {
const id = 1; // 假设我们正在更新ID为1的任务
taskService.updateTask(id)
.then(response => console.log(response))
.catch(error => console.error(error));
};
// 执行测试
testGetTasks();
testCreateTask();
testDeleteTask();
testUpdateTask();