网站首页 网站源码
namespace Dpz.Core.WebApi.Controllers;
/// <summary>
/// 碎碎念管理
/// </summary>
[ApiController, Route(("api/[controller]"))]
public class MumbleController(
IMumbleService mumbleService,
IObjectStorageOperation objectStorageService
) : ControllerBase
{
/// <summary>
/// 获取碎碎念
/// </summary>
/// <returns></returns>
[HttpGet]
[ProducesResponseType<List<VmMumble>>(StatusCodes.Status200OK)]
public async Task<IActionResult> GetMumbles([FromQuery] MumbleQueryParameterDto parameter)
{
var list = await mumbleService.GetPagesAsync(
parameter.PageIndex,
parameter.PageSize,
parameter.Content
);
//list.ForEach(async x => await HandleImageHostAsync(x));
list.AddPaginationMetadata(Response.Headers);
return Ok(list);
}
/// <summary>
/// 根据ID获取碎碎念
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpGet("{id}")]
[ProducesResponseType<VmMumble>(StatusCodes.Status200OK)]
public async Task<IActionResult> GetMumble(string id)
{
var mumble = await mumbleService.FindAsync(id);
//await HandleImageHostAsync(mumble);
return Ok(mumble);
}
/// <summary>
/// 新建碎碎念
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
[HttpPost, Authorize]
[ProducesResponseType(StatusCodes.Status204NoContent)]
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
public async Task<IActionResult> Create([FromBody] MumbleCreateDto model)
{
var viewModel = new VmMumble()
{
Author = User.GetIdentity(),
CommentCount = 0,
CreateTime = DateTime.Now,
HtmlContent = model.HtmlContent,
LastUpdateTime = DateTime.Now,
Markdown = model.Markdown
};
await mumbleService.CreateAsync(viewModel);
return NoContent();
}
/// <summary>
/// 编辑碎碎念内容
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
[HttpPatch, Authorize(Policy = "System")]
[ProducesResponseType(StatusCodes.Status204NoContent)]
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
public async Task<IActionResult> EditContent([FromBody] MumbleEditContentDto model)
{
var viewModel = new VmMumble()
{
Id = model.Id,
HtmlContent = model.HtmlContent,
Markdown = model.Markdown,
};
await mumbleService.EditContentAsync(viewModel);
return NoContent();
}
/// <summary>
/// 删除碎碎念
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpDelete("{id}"), Authorize(Policy = "System")]
[ProducesResponseType(StatusCodes.Status204NoContent)]
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
public async Task<IActionResult> Delete(string id)
{
await mumbleService.DeleteAsync(id);
return NoContent();
}
/// <summary>
/// 点赞
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpPost("like/{id}")]
[ProducesResponseType(StatusCodes.Status204NoContent)]
public async Task<IActionResult> Like(string id)
{
var mumble = await mumbleService.LikeAsync(id);
return Ok(mumble);
}
/// <summary>
/// 上传文章相关的图片
/// </summary>
/// <returns></returns>
[HttpPost("upload"), Authorize]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
public async Task<IActionResult> Upload()
{
var file = Request.Form.Files.FirstOrDefault();
if (file is { Length: > 0 } && file.ContentType.Contains("image"))
{
var userInfo = User.GetIdentity();
var path = new[] { "images", "mumble", DateTime.Now.ToString("yyyy-MM-dd") };
var fileName =
ObjectId.GenerateNewId() + file.FileName[file.FileName.LastIndexOf('.')..];
var result = await objectStorageService.UploadAsync(
file.OpenReadStream(),
path,
fileName
);
return Ok(
new
{
success = 1,
message = "",
url = result.AccessUrl
}
);
}
return BadRequest("Please select image to upload");
}
}
上述代码是一个 ASP.NET Core Web API 控制器,名为 MumbleController
,用于管理“碎碎念”(Mumble)相关的操作。以下是对代码中各个部分的详细解释:
[ApiController, Route(("api/[controller]"))]
public class MumbleController : ControllerBase
ApiController
特性指示该类是一个 API 控制器,提供了一些自动化的功能,如模型验证。Route
特性定义了控制器的路由,api/[controller]
表示该控制器的路由前缀为 api/mumble
。public MumbleController(IMumbleService mumbleService, IObjectStorageOperation objectStorageService)
IMumbleService
(用于处理碎碎念的业务逻辑)和 IObjectStorageOperation
(用于处理对象存储操作,如文件上传)。[HttpGet]
public async Task<IActionResult> GetMumbles([FromQuery] MumbleQueryParameterDto parameter)
MumbleQueryParameterDto
,用于分页和内容过滤。mumbleService.GetPagesAsync
方法获取数据,并将分页元数据添加到响应头中。[HttpGet("{id}")]
public async Task<IActionResult> GetMumble(string id)
mumbleService.FindAsync
方法获取数据。[HttpPost, Authorize]
public async Task<IActionResult> Create([FromBody] MumbleCreateDto model)
Authorize
特性)。MumbleCreateDto
模型,构建 VmMumble
视图模型并调用 mumbleService.CreateAsync
方法。[HttpPatch, Authorize(Policy = "System")]
public async Task<IActionResult> EditContent([FromBody] MumbleEditContentDto model)
System
)。MumbleEditContentDto
模型,并调用 mumbleService.EditContentAsync
方法。[HttpDelete("{id}"), Authorize(Policy = "System")]
public async Task<IActionResult> Delete(string id)
System
)。mumbleService.DeleteAsync
方法。[HttpPost("like/{id}")]
public async Task<IActionResult> Like(string id)
mumbleService.LikeAsync
方法。[HttpPost("upload"), Authorize]
public async Task<IActionResult> Upload()
Authorize
特性)。objectStorageService.UploadAsync
方法上传文件,并返回上传结果的 URL。这个控制器提供了完整的 CRUD(创建、读取、更新、删除)操作以及点赞和文件上传功能,主要用于管理碎碎念的内容和相关的图片。通过使用依赖注入和 ASP.NET Core 的特性,代码结构清晰且易于维护。