using System.ComponentModel.DataAnnotations;
using Dpz.Core.Public.ViewModel.DynamicPages;
using Microsoft.AspNetCore.Mvc.ModelBinding;

namespace Dpz.Core.Web.Controllers;

[CheckAuthorize]
public class DynamicController(
    IDynamicPageService dynamicPageService,
    IHttpCurrentUserService currentUserService
) : Controller
{
    [HttpGet]
    public async Task<IActionResult> MyDynamicPages(
        int pageIndex = 1,
        int pageSize = 10,
        string name = ""
    )
    {
        var source = await dynamicPageService.GetPageAsync(
            pageIndex,
            pageSize,
            name,
            User.RequiredNameIdentifier
        );
        var data = Pagination<VmDynamicPage>.Create(source);
        return Json(new ResultInfo(data));
    }

    /// <summary>
    /// 创建动态页
    /// </summary>
    /// <param name="model"></param>
    /// <returns></returns>
    [HttpPost]
    public async Task<IActionResult> Create([FromBody] [Required] VmCreateDynamicPage model)
    {
        if (!ModelState.IsValid)
        {
            var errors = ModelState
                .Select(x => x.Value?.Errors ?? new ModelErrorCollection())
                .SelectMany(x => x)
                .Select(x => x.ErrorMessage)
                .ToArray();
            return Json(new ResultInfo(string.Join("\n", errors)));
        }

        model.Creator = await currentUserService.GetRequiredUserInfoAsync();
        await dynamicPageService.CreateAsync(model);
        return Json(new ResultInfo(true));
    }

    public async Task<IActionResult> Find(string id = "")
    {
        var userInfo = await currentUserService.GetRequiredUserInfoAsync();
        var pageInformation = await dynamicPageService.FindAsync(id, userInfo.Id);
        return Json(new ResultInfo(pageInformation));
    }

    public async Task<IActionResult> Save([FromBody] [Required] VmEditDynamicPage model)
    {
        if (!ModelState.IsValid)
        {
            var errors = ModelState
                .Select(x => x.Value?.Errors ?? new ModelErrorCollection())
                .SelectMany(x => x)
                .Select(x => x.ErrorMessage)
                .ToArray();
            return Json(new ResultInfo(string.Join("\n", errors)));
        }

        model.CreatorId = User.RequiredNameIdentifier;
        await dynamicPageService.EditContentAsync(model);
        return Json(new ResultInfo(true));
    }
}
⚠⚠    以下内容为AI分析的结果,请根据实际情况进行判断。

代码解释

这是一个 ASP.NET Core MVC 控制器,用于管理动态页面(Dynamic Pages)的 CRUD 操作。

整体结构

控制器定义

[CheckAuthorize]
public class DynamicController : Controller
  • 使用 [CheckAuthorize] 特性进行授权检查,确保只有授权用户才能访问
  • 通过主构造函数(C# 12 特性)注入两个依赖服务:
    • IDynamicPageService:动态页面业务逻辑服务
    • IHttpCurrentUserService:当前用户信息服务

方法详解

1. MyDynamicPages(获取分页列表)

[HttpGet]
public async Task<IActionResult> MyDynamicPages(int pageIndex = 1, int pageSize = 10, string name = "")

功能:获取当前用户的动态页面列表(支持分页和名称搜索)

参数:

  • pageIndex:页码(默认第1页)
  • pageSize:每页数量(默认10条)
  • name:搜索关键字(可选)

流程:

  1. 调用服务层获取分页数据
  2. 使用 User.RequiredNameIdentifier 获取当前用户ID
  3. 将结果封装成 Pagination<VmDynamicPage> 对象
  4. 返回 JSON 格式的成功结果

2. Create(创建动态页)

[HttpPost]
public async Task<IActionResult> Create([FromBody] [Required] VmCreateDynamicPage model)

功能:创建新的动态页面

验证机制:

if (!ModelState.IsValid) {
    // 提取所有验证错误信息
    var errors = ModelState
        .Select(x => x.Value?.Errors ?? new ModelErrorCollection())
        .SelectMany(x => x)
        .Select(x => x.ErrorMessage)
        .ToArray();
    return Json(new ResultInfo(string.Join("\n", errors)));
}
  • 检查模型验证状态
  • 如果验证失败,收集所有错误消息并用换行符连接
  • 返回包含错误信息的 JSON 响应

核心逻辑:

  1. 获取当前用户信息并设置为创建者
  2. 调用服务层创建动态页
  3. 返回成功结果

3. Find(查找单个动态页)

public async Task<IActionResult> Find(string id = "")

功能:根据 ID 查找特定动态页面

流程:

  1. 获取当前用户信息
  2. 调用服务层查找页面(传入页面ID和用户ID,可能用于权限验证)
  3. 返回页面详细信息

4. Save(保存编辑)

public async Task<IActionResult> Save([FromBody] [Required] VmEditDynamicPage model)

功能:保存对动态页面的编辑

特点:

  • 与 Create 方法类似的验证逻辑
  • 使用 User.RequiredNameIdentifier 设置创建者ID(确保权限控制)
  • 调用 EditContentAsync 更新内容
  • 返回操作结果

技术特点

  1. 异步编程:所有方法都使用 async/await 模式
  2. 模型验证:使用 [Required] 和 ModelState 进行数据验证
  3. 依赖注入:使用主构造函数注入服务
  4. 统一响应格式:所有接口都返回 ResultInfo 包装的 JSON 数据
  5. 权限控制:通过 [CheckAuthorize] 和用户标识符确保数据安全

潜在改进点

  • Create 和 Save 方法中的验证逻辑重复,可以提取为私有方法或过滤器
  • Find 方法缺少 [HttpGet] 特性标注(虽然默认为 GET)
  • 可以添加更详细的 XML 注释文档
评论加载中...