87 lines
2.8 KiB
C#
87 lines
2.8 KiB
C#
|
|
using DRS9.Dashboard.Application.DTOs;
|
|||
|
|
using DRS9.Dashboard.Application.Services;
|
|||
|
|
using Microsoft.AspNetCore.Mvc;
|
|||
|
|
|
|||
|
|
namespace DRS9.Dashboard.Server.Controllers;
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 轮播显示控制器 - 供设备客户端使用
|
|||
|
|
/// </summary>
|
|||
|
|
[Route("rotator")]
|
|||
|
|
public class RotatorViewerController : Controller
|
|||
|
|
{
|
|||
|
|
private readonly RotatorItemService _rotatorItemService;
|
|||
|
|
private readonly IHttpContextAccessor _httpContextAccessor;
|
|||
|
|
private readonly ILogger<RotatorViewerController> _logger;
|
|||
|
|
|
|||
|
|
public RotatorViewerController(
|
|||
|
|
RotatorItemService rotatorItemService,
|
|||
|
|
IHttpContextAccessor httpContextAccessor,
|
|||
|
|
ILogger<RotatorViewerController> logger)
|
|||
|
|
{
|
|||
|
|
_rotatorItemService = rotatorItemService;
|
|||
|
|
_httpContextAccessor = httpContextAccessor;
|
|||
|
|
_logger = logger;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 获取指定应用的轮播配置 (JSON)
|
|||
|
|
/// </summary>
|
|||
|
|
[HttpGet("{applicationId}/config.json")]
|
|||
|
|
public async Task<ActionResult> 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<string>(), switchIntervals = new List<int>() });
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 显示轮播页面
|
|||
|
|
/// </summary>
|
|||
|
|
[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;
|
|||
|
|
}
|
|||
|
|
}
|