using DRS9.Dashboard.Application.DTOs; using DRS9.Dashboard.Application.Services; using Microsoft.AspNetCore.Mvc; namespace DRS9.Dashboard.Server.Controllers; /// /// 轮播显示控制器 - 供设备客户端使用 /// [Route("rotator")] public class RotatorViewerController : Controller { private readonly RotatorItemService _rotatorItemService; private readonly IHttpContextAccessor _httpContextAccessor; private readonly ILogger _logger; public RotatorViewerController( RotatorItemService rotatorItemService, IHttpContextAccessor httpContextAccessor, ILogger logger) { _rotatorItemService = rotatorItemService; _httpContextAccessor = httpContextAccessor; _logger = logger; } /// /// 获取指定应用的轮播配置 (JSON) /// [HttpGet("{applicationId}/config.json")] public async Task GetConfig(int applicationId) { try { var items = await _rotatorItemService.GetByApplicationIdAsync(applicationId); // 只返回启用的项目 var enabledItems = items.Where(i => i.IsEnabled).OrderBy(i => i.Order).ToList(); var config = new { urls = enabledItems.Select(i => GetAbsoluteUrl(i.Url)).ToList(), switchIntervals = enabledItems.Select(i => i.Duration).ToList() }; return Json(config); } catch (Exception ex) { _logger.LogError(ex, "获取轮播配置失败: ApplicationId={ApplicationId}", applicationId); return Json(new { urls = new List(), switchIntervals = new List() }); } } /// /// 显示轮播页面 /// [HttpGet("{applicationId}")] public IActionResult ViewRotator(int applicationId) { return View(applicationId); } private string GetAbsoluteUrl(string relativeOrAbsoluteUrl) { if (string.IsNullOrWhiteSpace(relativeOrAbsoluteUrl)) return string.Empty; // 如果已经是绝对 URL,直接返回 if (relativeOrAbsoluteUrl.StartsWith("http://", StringComparison.OrdinalIgnoreCase) || relativeOrAbsoluteUrl.StartsWith("https://", StringComparison.OrdinalIgnoreCase)) { return relativeOrAbsoluteUrl; } // 转换为绝对 URL var request = _httpContextAccessor.HttpContext?.Request; if (request != null) { var baseUrl = $"{request.Scheme}://{request.Host}"; return relativeOrAbsoluteUrl.StartsWith("/") ? baseUrl + relativeOrAbsoluteUrl : baseUrl + "/" + relativeOrAbsoluteUrl; } return relativeOrAbsoluteUrl; } }