feat:基础功能实现

This commit is contained in:
ShaoHua
2026-03-31 22:44:32 +08:00
parent ed3d90cd7a
commit 81c649cb23
131 changed files with 22903 additions and 196 deletions
@@ -0,0 +1,291 @@
using Microsoft.AspNetCore.Mvc;
using TodoList.Api.Models;
using TodoTask = TodoList.Core.Entities.Task;
using TodoList.Core.Entities;
using TodoList.Core.Interfaces;
namespace TodoList.Api.Controllers;
/// <summary>
/// 任务控制器,提供任务的 RESTful API 接口
/// </summary>
[ApiController]
[Route("api/[controller]")]
public class TasksController : ControllerBase
{
private readonly ITaskService _taskService;
/// <summary>
/// 构造函数,注入任务服务
/// </summary>
/// <param name="taskService">任务服务接口</param>
public TasksController(ITaskService taskService)
{
_taskService = taskService;
}
/// <summary>
/// 获取任务列表
/// </summary>
/// <param name="completed">可选参数,true 获取已完成任务,false 获取未完成任务,不传则获取所有任务</param>
/// <returns>任务列表响应</returns>
[HttpGet]
public async Task<ActionResult<ApiResponse<List<TaskDto>>>> GetTasks([FromQuery] bool? completed = null)
{
try
{
List<TodoTask> tasks;
if (completed.HasValue)
{
tasks = completed.Value
? await _taskService.GetCompletedTasksAsync()
: await _taskService.GetActiveTasksAsync();
}
else
{
tasks = await _taskService.GetAllTasksAsync();
}
var taskDtos = tasks.Select(MapToDto).ToList();
return Ok(new ApiResponse<List<TaskDto>>
{
Success = true,
Data = taskDtos,
Message = "获取任务列表成功"
});
}
catch (Exception ex)
{
return StatusCode(500, new ApiResponse<List<TaskDto>>
{
Success = false,
Message = "获取任务列表失败",
Errors = new List<string> { ex.Message }
});
}
}
/// <summary>
/// 根据ID获取指定任务
/// </summary>
/// <param name="id">任务ID</param>
/// <returns>任务详情响应</returns>
[HttpGet("{id}")]
public async Task<ActionResult<ApiResponse<TaskDto>>> GetTask(int id)
{
try
{
var task = await _taskService.GetTaskByIdAsync(id);
if (task == null)
{
return NotFound(new ApiResponse<TaskDto>
{
Success = false,
Message = $"未找到ID为 {id} 的任务"
});
}
return Ok(new ApiResponse<TaskDto>
{
Success = true,
Data = MapToDto(task),
Message = "获取任务成功"
});
}
catch (Exception ex)
{
return StatusCode(500, new ApiResponse<TaskDto>
{
Success = false,
Message = "获取任务失败",
Errors = new List<string> { ex.Message }
});
}
}
/// <summary>
/// 创建新任务
/// </summary>
/// <param name="dto">创建任务的数据传输对象</param>
/// <returns>创建的任务响应</returns>
[HttpPost]
public async Task<ActionResult<ApiResponse<TaskDto>>> CreateTask([FromBody] CreateTaskDto dto)
{
try
{
if (string.IsNullOrWhiteSpace(dto.Title))
{
return BadRequest(new ApiResponse<TaskDto>
{
Success = false,
Message = "任务标题不能为空",
Errors = new List<string> { "Title is required" }
});
}
var task = await _taskService.CreateTaskAsync(dto.Title, dto.Priority, dto.ParentTaskId);
return CreatedAtAction(nameof(GetTask), new { id = task.Id }, new ApiResponse<TaskDto>
{
Success = true,
Data = MapToDto(task),
Message = "创建任务成功"
});
}
catch (Exception ex)
{
return StatusCode(500, new ApiResponse<TaskDto>
{
Success = false,
Message = "创建任务失败",
Errors = new List<string> { ex.Message }
});
}
}
/// <summary>
/// 更新任务
/// </summary>
/// <param name="id">任务ID</param>
/// <param name="dto">更新任务的数据传输对象</param>
/// <returns>更新后的任务响应</returns>
[HttpPut("{id}")]
public async Task<ActionResult<ApiResponse<TaskDto>>> UpdateTask(int id, [FromBody] UpdateTaskDto dto)
{
try
{
var task = await _taskService.UpdateTaskAsync(id, dto.Title, dto.Priority);
return Ok(new ApiResponse<TaskDto>
{
Success = true,
Data = MapToDto(task),
Message = "更新任务成功"
});
}
catch (KeyNotFoundException)
{
return NotFound(new ApiResponse<TaskDto>
{
Success = false,
Message = $"未找到ID为 {id} 的任务"
});
}
catch (Exception ex)
{
return StatusCode(500, new ApiResponse<TaskDto>
{
Success = false,
Message = "更新任务失败",
Errors = new List<string> { ex.Message }
});
}
}
/// <summary>
/// 切换任务的完成状态
/// </summary>
/// <param name="id">任务ID</param>
/// <returns>更新后的任务响应</returns>
[HttpPatch("{id}/complete")]
public async Task<ActionResult<ApiResponse<TaskDto>>> ToggleComplete(int id)
{
try
{
var task = await _taskService.ToggleCompleteAsync(id);
return Ok(new ApiResponse<TaskDto>
{
Success = true,
Data = MapToDto(task),
Message = task.IsCompleted ? "任务已完成" : "任务已取消完成"
});
}
catch (KeyNotFoundException)
{
return NotFound(new ApiResponse<TaskDto>
{
Success = false,
Message = $"未找到ID为 {id} 的任务"
});
}
catch (Exception ex)
{
return StatusCode(500, new ApiResponse<TaskDto>
{
Success = false,
Message = "更新任务状态失败",
Errors = new List<string> { ex.Message }
});
}
}
/// <summary>
/// 删除任务
/// </summary>
/// <param name="id">任务ID</param>
/// <returns>删除结果响应</returns>
[HttpDelete("{id}")]
public async Task<ActionResult<ApiResponse<object>>> DeleteTask(int id)
{
try
{
await _taskService.DeleteTaskAsync(id);
return Ok(new ApiResponse<object>
{
Success = true,
Message = "删除任务成功"
});
}
catch (KeyNotFoundException)
{
return NotFound(new ApiResponse<object>
{
Success = false,
Message = $"未找到ID为 {id} 的任务"
});
}
catch (Exception ex)
{
return StatusCode(500, new ApiResponse<object>
{
Success = false,
Message = "删除任务失败",
Errors = new List<string> { ex.Message }
});
}
}
/// <summary>
/// 将任务实体映射为数据传输对象
/// </summary>
/// <param name="task">任务实体</param>
/// <returns>任务数据传输对象</returns>
private static TaskDto MapToDto(TodoTask task)
{
return new TaskDto
{
Id = task.Id,
Title = task.Title,
Priority = task.Priority,
IsCompleted = task.IsCompleted,
CreatedAt = task.CreatedAt,
UpdatedAt = task.UpdatedAt,
ParentTaskId = task.ParentTaskId,
SubTasks = task.SubTasks?.Select(st => new TaskDto
{
Id = st.Id,
Title = st.Title,
Priority = st.Priority,
IsCompleted = st.IsCompleted,
CreatedAt = st.CreatedAt,
UpdatedAt = st.UpdatedAt,
ParentTaskId = st.ParentTaskId,
SubTasks = new List<TaskDto>()
}).ToList() ?? new List<TaskDto>()
};
}
}