namespace Dpz.Core.WebApi.Controllers;

/// <summary>
/// 系统配置
/// </summary>
[ApiController, Route("api/[controller]")]
public class OptionController(IAppOptionService appOptionService) : ControllerBase
{
    /// <summary>
    /// 获取友情链接
    /// </summary>
    /// <returns></returns>
    [HttpGet("friends")]
    [ProducesResponseType<List<VmFriends>>(StatusCodes.Status200OK)]
    public async Task<IActionResult> GetFriends()
    {
        var list = await appOptionService.GetFriendsAsync();
        return Ok(list);
    }

    /// <summary>
    /// 添加友情链接
    /// </summary>
    /// <returns></returns>
    [HttpPost("friends")]
    [Authorize(Policy = "System")]
    [ProducesResponseType(StatusCodes.Status204NoContent)]
    [ProducesResponseType(StatusCodes.Status401Unauthorized)]
    public async Task<IActionResult> AddFriend([FromBody] FriendSaveDto model)
    {
        var friend = new VmFriends
        {
            Avatar = model.Avatar,
            Description = model.Description,
            Link = model.Link,
            Name = model.Name,
        };
        await appOptionService.AddFriendAsync(friend);
        return NoContent();
    }

    /// <summary>
    /// 编辑友情链接
    /// </summary>
    /// <param name="model"></param>
    /// <returns></returns>
    [HttpPatch("friends")]
    [Authorize(Policy = "System")]
    [ProducesResponseType(StatusCodes.Status204NoContent)]
    [ProducesResponseType(StatusCodes.Status401Unauthorized)]
    public async Task<IActionResult> EditFriend([FromBody] FriendEditDto model)
    {
        var friend = new VmFriends
        {
            Avatar = model.Avatar,
            Description = model.Description,
            Link = model.Link,
            Name = model.Name,
            Id = model.Id,
        };
        await appOptionService.EditFriendAsync(friend);
        return NoContent();
    }

    /// <summary>
    /// 删除友情链接
    /// </summary>
    /// <param name="id"></param>
    /// <returns></returns>
    [HttpDelete("friends/{id}")]
    [Authorize(Policy = "System")]
    [ProducesResponseType(StatusCodes.Status204NoContent)]
    [ProducesResponseType(StatusCodes.Status401Unauthorized)]
    public async Task<IActionResult> DeleteFriend(string id)
    {
        await appOptionService.DeleteFriendAsync(id);
        return NoContent();
    }
}
⚠⚠    以下内容为AI分析的结果,请根据实际情况进行判断。

这是一个基于 ASP.NET Core Web API 的控制器类,专门用于管理系统配置中的友情链接功能。让我详细解释一下这个代码:

类定义和依赖注入

[ApiController, Route("api/[controller]")]
public class OptionController(IAppOptionService appOptionService) : ControllerBase
  • 使用了 C# 12 的主构造函数语法来注入 IAppOptionService 依赖
  • [ApiController] 特性提供了 API 控制器的默认行为
  • 路由模板 api/[controller] 会解析为 api/option

API 端点功能

1. 获取友情链接列表

[HttpGet("friends")]
  • 路径: GET /api/option/friends
  • 权限: 无需授权(公开访问)
  • 功能: 获取所有友情链接
  • 返回: List<VmFriends> 类型的友情链接列表

2. 添加友情链接

[HttpPost("friends")]
[Authorize(Policy = "System")]
  • 路径: POST /api/option/friends
  • 权限: 需要 "System" 策略授权
  • 功能: 添加新的友情链接
  • 参数: 从请求体接收 FriendSaveDto 对象
  • 返回: 204 No Content(成功)或 401 Unauthorized(未授权)

3. 编辑友情链接

[HttpPatch("friends")]
[Authorize(Policy = "System")]
  • 路径: PATCH /api/option/friends
  • 权限: 需要 "System" 策略授权
  • 功能: 更新现有友情链接
  • 参数: 从请求体接收 FriendEditDto 对象(包含ID)

4. 删除友情链接

[HttpDelete("friends/{id}")]
[Authorize(Policy = "System")]
  • 路径: DELETE /api/option/friends/{id}
  • 权限: 需要 "System" 策略授权
  • 功能: 根据ID删除友情链接
  • 参数: 路径参数中的 id

设计特点

  1. 权限分离: 读取操作(GET)公开访问,写入操作(POST/PATCH/DELETE)需要系统级权限
  2. RESTful 设计: 遵循 REST API 设计原则,使用合适的 HTTP 动词
  3. 响应码规范: 使用 ProducesResponseType 明确标注可能的响应状态码
  4. DTO 模式: 使用不同的 DTO 类型区分添加和编辑操作的数据结构
  5. 异步处理: 所有操作都是异步的,提高性能

这个控制器为前端提供了完整的友情链接 CRUD(创建、读取、更新、删除)功能,是一个典型的资源管理 API 实现。

评论加载中...