Merge feature/merge-upstream: 数据看板视频封面接口 + Cookie 编辑弹窗全屏化
部署到群晖 / deploy (push) Failing after 3h9m17s

This commit is contained in:
yuming
2026-07-03 23:35:06 +08:00
3 changed files with 87 additions and 22 deletions
+69
View File
@@ -238,6 +238,75 @@ namespace dy.net.Controllers
return new EmptyResult(); return new EmptyResult();
} }
/// <summary>
/// 获取视频封面图片
/// </summary>
/// <param name="id">视频ID</param>
[Authorize]
[HttpGet("cover/{id}")]
public async Task<IActionResult> GetVideoCover([FromRoute] string id)
{
try
{
var video = await douyinVideoService.GetById(id);
if (video == null)
{
return GetDefaultCoverImage();
}
// 优先使用本地保存的封面
if (!string.IsNullOrWhiteSpace(video.VideoCoverSavePath) && System.IO.File.Exists(video.VideoCoverSavePath))
{
var contentType = GetImageContentType(video.VideoCoverSavePath);
var fileStream = System.IO.File.OpenRead(video.VideoCoverSavePath);
return File(fileStream, contentType);
}
// 本地封面缺失时回落到默认占位图
return GetDefaultCoverImage();
}
catch (Exception ex)
{
Serilog.Log.Error(ex, $"获取视频封面失败: {id}");
return GetDefaultCoverImage();
}
}
/// <summary>
/// 默认封面占位图(SVG)
/// </summary>
private IActionResult GetDefaultCoverImage()
{
var svgContent = @"<svg width=""400"" height=""225"" xmlns=""http://www.w3.org/2000/svg"">
<rect width=""400"" height=""225"" fill=""#f0f0f0""/>
<text x=""50%"" y=""50%"" font-family=""Arial, sans-serif"" font-size=""16"" fill=""#999"" text-anchor=""middle"" dy="".3em"">暂无封面</text>
</svg>";
var svgBytes = System.Text.Encoding.UTF8.GetBytes(svgContent);
return File(svgBytes, "image/svg+xml");
}
/// <summary>
/// 根据文件扩展名获取图片 Content-Type
/// </summary>
private string GetImageContentType(string fileName)
{
if (string.IsNullOrWhiteSpace(fileName))
{
return "image/jpeg";
}
var extension = Path.GetExtension(fileName).ToLowerInvariant();
return extension switch
{
".jpg" or ".jpeg" => "image/jpeg",
".png" => "image/png",
".gif" => "image/gif",
".webp" => "image/webp",
".svg" => "image/svg+xml",
".bmp" => "image/bmp",
_ => "image/jpeg"
};
}
/// <summary> /// <summary>
/// 播放视频 /// 播放视频
/// </summary> /// </summary>
+18 -4
View File
@@ -179,15 +179,29 @@ body {
} }
} }
// 抖音授权 Cookie 编辑用 full-modal(顶部对齐的宽 modal) // 抖音授权 Cookie 编辑用 full-modal(全屏抽屉式,高度 100vh、footer 常驻底部)
.full-modal .ant-modal { .full-modal .ant-modal {
top: 0 !important; top: 0 !important;
padding-bottom: 0 !important; padding-bottom: 0 !important;
margin-bottom: 0; margin: 0 !important;
max-width: 100%;
height: 100vh;
}
.full-modal .ant-modal-content {
height: 100vh;
display: flex;
flex-direction: column;
border-radius: 0;
}
.full-modal .ant-modal-header,
.full-modal .ant-modal-footer {
flex-shrink: 0;
} }
// full-modal 没有 top 留白,body max-height 减去的常量更小
.full-modal .ant-modal-body { .full-modal .ant-modal-body {
max-height: calc(100vh - 110px) !important; flex: 1 1 auto;
min-height: 0;
max-height: none !important;
overflow-y: auto !important;
} }
// 登录页整个界面本身就是一个 Modal(LoginModal.vue),必须恢复 antd 默认布局,不能被上面的全局规则改 // 登录页整个界面本身就是一个 Modal(LoginModal.vue),必须恢复 antd 默认布局,不能被上面的全局规则改
-18
View File
@@ -713,26 +713,8 @@ const switchdownCollect = (e: any) => {
<style scoped lang="less"> <style scoped lang="less">
.modal-scroll-body { .modal-scroll-body {
max-height: calc(100vh - 160px);
overflow-y: scroll;
overflow-x: hidden;
padding-right: 4px; padding-right: 4px;
} }
.modal-scroll-body::-webkit-scrollbar {
-webkit-appearance: none;
width: 8px;
}
.modal-scroll-body::-webkit-scrollbar-track {
background: #f0f0f0;
border-radius: 4px;
}
.modal-scroll-body::-webkit-scrollbar-thumb {
background: #bbb;
border-radius: 4px;
}
.modal-scroll-body::-webkit-scrollbar-thumb:hover {
background: #888;
}
.ant-form-item { .ant-form-item {
margin-bottom: 10px; margin-bottom: 10px;
} }