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;
|
||
}
|
||
}
|