// ============================================================================ // 【文件说明】HwProductInfoController.cs - 产品信息控制器 // ============================================================================ // 这个控制器负责处理产品信息相关的 HTTP 请求。 // // 【RESTful API 设计】 // - GET portal/productInfo/list -> 查询列表 // - GET portal/productInfo/{productInfoId} -> 查询详情 // - POST portal/productInfo -> 新增 // - PUT portal/productInfo -> 更新 // - DELETE portal/productInfo/{productInfoIds} -> 批量删除 // - GET portal/productInfo/portalConfigTypeTree -> 查询配置类型树 // ============================================================================ namespace Admin.NET.Plugin.HwPortal; /// /// 产品信息控制器。 /// /// 【控制器职责】 /// 控制器只负责"请求处理",不包含业务逻辑: /// 1. 接收 HTTP 请求 /// 2. 调用 Service 处理业务 /// 3. 返回统一格式的响应 /// /// 业务逻辑在 HwProductInfoService 中实现。 /// /// [AllowAnonymous] [Route("portal/productInfo")] public class HwProductInfoController : HwPortalControllerBase { /// /// 产品信息服务。 /// private readonly HwProductInfoService _productInfoService; /// /// 配置类型服务。 /// private readonly HwPortalConfigTypeService _configTypeService; /// /// 构造函数(依赖注入)。 /// /// 【多服务注入】 /// 这个控制器需要两个服务: /// - HwProductInfoService:处理产品信息 /// - HwPortalConfigTypeService:处理配置类型 /// /// ASP.NET Core 的 DI 容器会自动创建并注入这些服务。 /// /// /// 产品信息服务 /// 配置类型服务 public HwProductInfoController(HwProductInfoService productInfoService, HwPortalConfigTypeService configTypeService) { _productInfoService = productInfoService; _configTypeService = configTypeService; } /// /// 查询产品列表(分页)。 /// /// 查询条件 /// 分页数据 [HttpGet("list")] public async Task> List([FromQuery] HwProductInfo input) { // GetDataTable 是基类方法,做内存分页。 // 如果数据量大,应该在数据库层面分页(SQL LIMIT/OFFSET)。 return GetDataTable(await _productInfoService.SelectHwProductInfoJoinList(input)); } /// /// 导出产品信息到 Excel。 /// /// 查询条件 /// Excel 文件 [HttpPost("export")] [Idempotent] public async Task Export([FromQuery] HwProductInfo input) { return ExportExcel(await _productInfoService.SelectHwProductInfoList(input), "产品信息数据"); } /// /// 根据产品ID查询详情。 /// /// 产品ID /// 产品详情 [HttpGet("{productInfoId:long}")] public async Task GetInfo(long productInfoId) { return Success(await _productInfoService.SelectHwProductInfoByProductInfoId(productInfoId)); } /// /// 新增产品。 /// /// 产品数据 /// 操作结果 [HttpPost] [Idempotent] public async Task Add([FromBody] HwProductInfo input) { return ToAjax(await _productInfoService.InsertHwProductInfo(input)); } /// /// 更新产品。 /// /// 产品数据 /// 操作结果 [HttpPut] [Idempotent] public async Task Edit([FromBody] HwProductInfo input) { return ToAjax(await _productInfoService.UpdateHwProductInfo(input)); } /// /// 批量删除产品。 /// /// 逗号分隔的产品ID /// 操作结果 [HttpDelete("{productInfoIds}")] [Idempotent] public async Task Remove(string productInfoIds) { return ToAjax(await _productInfoService.DeleteHwProductInfoByProductInfoIds(ParseLongArray(productInfoIds))); } /// /// 查询配置类型树。 /// /// 查询条件 /// 配置类型树 [HttpGet("portalConfigTypeTree")] public async Task PortalConfigTypeTree([FromQuery] HwPortalConfigType input) { return Success(await _configTypeService.SelectPortalConfigTypeTreeList(input)); } /// /// 解析逗号分隔的长整型数组(私有方法)。 /// /// 【C# 语法知识点 - 表达式体方法】 /// private static long[] ParseLongArray(string value) => ... // /// 这是"表达式体方法"(Expression-bodied method)语法。 /// 等价于: /// private static long[] ParseLongArray(string value) { /// return value.Split(...).Select(...).ToArray(); /// } /// /// 当方法体只有一行 return 语句时,可以用 => 简化。 /// /// 对比 Java: /// Java 没有这个语法,但 Java 14+ 有类似的表达式体方法: /// private static long[] parseLongArray(String value) -> /// Arrays.stream(value.split(",")).mapToLong(Long::parseLong).toArray(); /// /// /// 逗号分隔的字符串 /// 长整型数组 private static long[] ParseLongArray(string value) => value.Split(',', StringSplitOptions.RemoveEmptyEntries).Select(long.Parse).ToArray(); }