parent
1b239201a2
commit
977faaef75
|
|
@ -98,34 +98,6 @@ namespace Learn.VideoAnalysis.Controllers
|
||||||
return Ok(resStr);
|
return Ok(resStr);
|
||||||
}
|
}
|
||||||
|
|
||||||
[NonAction]
|
|
||||||
private static List<TimeBase> MergeTimeBases(IEnumerable<TimeBase> timeBases)
|
|
||||||
{
|
|
||||||
if (timeBases == null || timeBases.Count() == 0)
|
|
||||||
{
|
|
||||||
return new List<TimeBase>();
|
|
||||||
}
|
|
||||||
var mergedList = new List<TimeBase>();
|
|
||||||
// 初始化合并段
|
|
||||||
var current = timeBases.First();
|
|
||||||
current.Content = string.Empty;
|
|
||||||
foreach (var next in timeBases)
|
|
||||||
{
|
|
||||||
// 如果类型相同,则扩展时间段
|
|
||||||
if (current.TimeBaseType == next.TimeBaseType)
|
|
||||||
current.End = Math.Max(current.End, next.End);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// 类型不同,将当前时间段加入结果列表,并开始新时间段
|
|
||||||
mergedList.Add(current);
|
|
||||||
current = next;
|
|
||||||
current.Content = string.Empty;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// 添加最后的时间段
|
|
||||||
mergedList.Add(current);
|
|
||||||
return mergedList;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 重新开始执行GPT分析<para>taskId/tagId二选一</para>
|
/// 重新开始执行GPT分析<para>taskId/tagId二选一</para>
|
||||||
|
|
@ -154,79 +126,6 @@ namespace Learn.VideoAnalysis.Controllers
|
||||||
return Ok();
|
return Ok();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 获取视频知识点片段<para>taskId/tagId二选一</para>
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="taskId"></param>
|
|
||||||
/// <param name="tagId">自定义id</param>
|
|
||||||
/// <returns></returns>
|
|
||||||
[HttpGet(Name = "TaskKnowInfo")]
|
|
||||||
public async Task<IActionResult> TaskKnowInfo(long taskId, string? tagId)
|
|
||||||
{
|
|
||||||
if (taskId == 0 && string.IsNullOrEmpty(tagId))
|
|
||||||
return BadRequest();
|
|
||||||
var task = await videoTaskDB.AsQueryable()
|
|
||||||
.WhereIF(taskId != 0, s => s.Id == taskId)
|
|
||||||
.WhereIF(!string.IsNullOrEmpty(tagId), s => s.TagId == tagId)
|
|
||||||
.FirstAsync();
|
|
||||||
if(task is null)
|
|
||||||
return BadRequest("无效任务");
|
|
||||||
|
|
||||||
var konwArr = await videoKonwDB.AsQueryable()
|
|
||||||
.Where(s=>s.VideoTaskId == task.Id)
|
|
||||||
.ToArrayAsync();
|
|
||||||
if (konwArr is null || konwArr.Length ==0)
|
|
||||||
return BadRequest("无效任务");
|
|
||||||
return Ok(new TaskKnowRes()
|
|
||||||
{
|
|
||||||
TagId = task.TagId,
|
|
||||||
Status = task.LastEnum,
|
|
||||||
VideoTaskId = task.Id,
|
|
||||||
KnowBlockArr = konwArr
|
|
||||||
.GroupBy(s=>s.StartTime)
|
|
||||||
.Select(s=>new TaskKnowBlock()
|
|
||||||
{
|
|
||||||
Id = s.First().Id,
|
|
||||||
Content = s.First().Content,
|
|
||||||
StartTime = s.First().StartTime,
|
|
||||||
EndTime = s.First().EndTime,
|
|
||||||
Theme =s.First().Theme,
|
|
||||||
Know=s.Select(x=>new TaskKnowInfo()
|
|
||||||
{
|
|
||||||
Id=x.Id,
|
|
||||||
KnowPoint=x.KnowPoint,
|
|
||||||
KnowPointId = x.KnowPointId
|
|
||||||
}).ToArray()
|
|
||||||
}).ToArray()
|
|
||||||
});
|
|
||||||
}
|
|
||||||
/// <summary>
|
|
||||||
/// 获取视频信息<para>taskId/tagId二选一</para>
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="taskId"></param>
|
|
||||||
/// <param name="tagId">自定义id</param>
|
|
||||||
/// <returns></returns>
|
|
||||||
[HttpGet(Name = "TaskInfo")]
|
|
||||||
public async Task<IActionResult> TaskInfo(long taskId,string? tagId)
|
|
||||||
{
|
|
||||||
if(taskId == 0 && string.IsNullOrEmpty(tagId))
|
|
||||||
return BadRequest();
|
|
||||||
var task = await videoTaskDB.AsQueryable()
|
|
||||||
.WhereIF(taskId!=0, s => s.Id == taskId)
|
|
||||||
.WhereIF(!string.IsNullOrEmpty(tagId), s => s.TagId == tagId)
|
|
||||||
.FirstAsync();
|
|
||||||
if (task is null)
|
|
||||||
return BadRequest();
|
|
||||||
var taskData = task.ChatAnalysis.Adapt<TaskInfoRes>();
|
|
||||||
if (taskData is null)
|
|
||||||
return BadRequest();
|
|
||||||
taskData.Status = task.LastEnum;
|
|
||||||
if (task.LastEnum != RedisChannelEnum.EndTask)
|
|
||||||
return BadRequest(taskData);
|
|
||||||
if (taskData != null && taskData.TimeBase != null)
|
|
||||||
taskData.TimeBase = MergeTimeBases(taskData.TimeBase);
|
|
||||||
return Ok(taskData);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 插入队列
|
/// 插入队列
|
||||||
|
|
@ -241,6 +140,7 @@ namespace Learn.VideoAnalysis.Controllers
|
||||||
, msg);
|
, msg);
|
||||||
return Ok();
|
return Ok();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 视频处理
|
/// 视频处理
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
@ -274,5 +174,140 @@ namespace Learn.VideoAnalysis.Controllers
|
||||||
RedisExpand.Redis.LPush(RedisExpandKey.ChannelKey, task.Id);
|
RedisExpand.Redis.LPush(RedisExpandKey.ChannelKey, task.Id);
|
||||||
return Ok(task.Id);
|
return Ok(task.Id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 蓝鲸智库_添加文件节点监控
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="req">请求体</param>
|
||||||
|
/// <returns></returns>
|
||||||
|
[HttpPost(Name = "ZY_NodeMonitoring")]
|
||||||
|
public async Task<IActionResult> ZY_NodeMonitoring(NodeMonitoringReq req)
|
||||||
|
{
|
||||||
|
//if (!ModelState.IsValid) return BadRequest(ModelState);
|
||||||
|
|
||||||
|
//入库
|
||||||
|
//task.Id = await videoTaskDB.InsertReturnBigIdentityAsync(task);
|
||||||
|
//var hashEntries = task.GetType()
|
||||||
|
// .GetProperties(BindingFlags.Public | BindingFlags.Instance)
|
||||||
|
// .ToDictionary(s => s.Name, s => s.GetValue(task));
|
||||||
|
//RedisExpand.Redis.HMSet(RedisExpandKey.Task(task.Id), hashEntries);
|
||||||
|
//RedisExpand.Redis.LPush(RedisExpandKey.ChannelKey, task.Id);
|
||||||
|
return Ok();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
///// <summary>
|
||||||
|
///// 获取视频知识点片段<para>taskId/tagId二选一</para>
|
||||||
|
///// </summary>
|
||||||
|
///// <param name="taskId"></param>
|
||||||
|
///// <param name="tagId">自定义id</param>
|
||||||
|
///// <returns></returns>
|
||||||
|
//[HttpGet(Name = "TaskKnowInfo")]
|
||||||
|
//public async Task<IActionResult> TaskKnowInfo(long taskId, string? tagId)
|
||||||
|
//{
|
||||||
|
// if (taskId == 0 && string.IsNullOrEmpty(tagId))
|
||||||
|
// return BadRequest();
|
||||||
|
// var task = await videoTaskDB.AsQueryable()
|
||||||
|
// .WhereIF(taskId != 0, s => s.Id == taskId)
|
||||||
|
// .WhereIF(!string.IsNullOrEmpty(tagId), s => s.TagId == tagId)
|
||||||
|
// .FirstAsync();
|
||||||
|
// if (task is null)
|
||||||
|
// return BadRequest("无效任务");
|
||||||
|
|
||||||
|
// var konwArr = await videoKonwDB.AsQueryable()
|
||||||
|
// .Where(s => s.VideoTaskId == task.Id)
|
||||||
|
// .ToArrayAsync();
|
||||||
|
// if (konwArr is null || konwArr.Length == 0)
|
||||||
|
// return BadRequest("无效任务");
|
||||||
|
// return Ok(new TaskKnowRes()
|
||||||
|
// {
|
||||||
|
// TagId = task.TagId,
|
||||||
|
// Status = task.LastEnum,
|
||||||
|
// VideoTaskId = task.Id,
|
||||||
|
// KnowBlockArr = konwArr
|
||||||
|
// .GroupBy(s => s.StartTime)
|
||||||
|
// .Select(s => new TaskKnowBlock()
|
||||||
|
// {
|
||||||
|
// Id = s.First().Id,
|
||||||
|
// Content = s.First().Content,
|
||||||
|
// StartTime = s.First().StartTime,
|
||||||
|
// EndTime = s.First().EndTime,
|
||||||
|
// Theme = s.First().Theme,
|
||||||
|
// Know = s.Select(x => new TaskKnowInfo()
|
||||||
|
// {
|
||||||
|
// Id = x.Id,
|
||||||
|
// KnowPoint = x.KnowPoint,
|
||||||
|
// KnowPointId = x.KnowPointId
|
||||||
|
// }).ToArray()
|
||||||
|
// }).ToArray()
|
||||||
|
// });
|
||||||
|
//}
|
||||||
|
///// <summary>
|
||||||
|
///// 获取视频信息<para>taskId/tagId二选一</para>
|
||||||
|
///// </summary>
|
||||||
|
///// <param name="taskId"></param>
|
||||||
|
///// <param name="tagId">自定义id</param>
|
||||||
|
///// <returns></returns>
|
||||||
|
//[HttpGet(Name = "TaskInfo")]
|
||||||
|
//public async Task<IActionResult> TaskInfo(long taskId, string? tagId)
|
||||||
|
//{
|
||||||
|
// if (taskId == 0 && string.IsNullOrEmpty(tagId))
|
||||||
|
// return BadRequest();
|
||||||
|
// var task = await videoTaskDB.AsQueryable()
|
||||||
|
// .WhereIF(taskId != 0, s => s.Id == taskId)
|
||||||
|
// .WhereIF(!string.IsNullOrEmpty(tagId), s => s.TagId == tagId)
|
||||||
|
// .FirstAsync();
|
||||||
|
// if (task is null)
|
||||||
|
// return BadRequest();
|
||||||
|
// var taskData = task.ChatAnalysis.Adapt<TaskInfoRes>();
|
||||||
|
// if (taskData is null)
|
||||||
|
// return BadRequest();
|
||||||
|
// taskData.Status = task.LastEnum;
|
||||||
|
// if (task.LastEnum != RedisChannelEnum.EndTask)
|
||||||
|
// return BadRequest(taskData);
|
||||||
|
// if (taskData != null && taskData.TimeBase != null)
|
||||||
|
// taskData.TimeBase = MergeTimeBases(taskData.TimeBase);
|
||||||
|
// return Ok(taskData);
|
||||||
|
//}
|
||||||
|
|
||||||
|
|
||||||
|
//[NonAction]
|
||||||
|
//private static List<TimeBase> MergeTimeBases(IEnumerable<TimeBase> timeBases)
|
||||||
|
//{
|
||||||
|
// if (timeBases == null || timeBases.Count() == 0)
|
||||||
|
// {
|
||||||
|
// return new List<TimeBase>();
|
||||||
|
// }
|
||||||
|
// var mergedList = new List<TimeBase>();
|
||||||
|
// // 初始化合并段
|
||||||
|
// var current = timeBases.First();
|
||||||
|
// current.Content = string.Empty;
|
||||||
|
// foreach (var next in timeBases)
|
||||||
|
// {
|
||||||
|
// // 如果类型相同,则扩展时间段
|
||||||
|
// if (current.TimeBaseType == next.TimeBaseType)
|
||||||
|
// current.End = Math.Max(current.End, next.End);
|
||||||
|
// else
|
||||||
|
// {
|
||||||
|
// // 类型不同,将当前时间段加入结果列表,并开始新时间段
|
||||||
|
// mergedList.Add(current);
|
||||||
|
// current = next;
|
||||||
|
// current.Content = string.Empty;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// // 添加最后的时间段
|
||||||
|
// mergedList.Add(current);
|
||||||
|
// return mergedList;
|
||||||
|
//}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,26 @@ using VideoAnalysisCore.Enum;
|
||||||
|
|
||||||
namespace Learn.VideoAnalysis.Controllers.Dto
|
namespace Learn.VideoAnalysis.Controllers.Dto
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 视频处理 请求
|
||||||
|
/// </summary>
|
||||||
|
public class NodeMonitoringReq
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 媒体路径
|
||||||
|
/// </summary>
|
||||||
|
[Required(ErrorMessage = "文件节点ID是必填项")]
|
||||||
|
public string NodeId { get; set; } = string.Empty;
|
||||||
|
/// <summary>
|
||||||
|
/// 任务类型
|
||||||
|
/// </summary>
|
||||||
|
public TaskTypeEnum? Type { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// 自定义值 任务完成后附带通知
|
||||||
|
/// </summary>
|
||||||
|
public string Tag { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
}
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 视频处理 请求
|
/// 视频处理 请求
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
||||||
|
|
@ -59,7 +59,9 @@ namespace Learn.VideoAnalysis
|
||||||
builder.Services.InitSqlSugar();
|
builder.Services.InitSqlSugar();
|
||||||
RedisExpand.Init();
|
RedisExpand.Init();
|
||||||
Speaker.Init();
|
Speaker.Init();
|
||||||
|
CoravelExpand.Init(builder.Services);
|
||||||
//SenseVoice.Init();
|
//SenseVoice.Init();
|
||||||
|
//异常过滤器
|
||||||
builder.Services.AddControllersWithViews(options =>
|
builder.Services.AddControllersWithViews(options =>
|
||||||
{
|
{
|
||||||
options.Filters.Add(typeof(ExceptionFilter));
|
options.Filters.Add(typeof(ExceptionFilter));
|
||||||
|
|
@ -106,32 +108,26 @@ namespace Learn.VideoAnalysis
|
||||||
app.UseSwaggerUI();
|
app.UseSwaggerUI();
|
||||||
app.UseExceptionHandler("/Error");
|
app.UseExceptionHandler("/Error");
|
||||||
}
|
}
|
||||||
//else
|
//添加wwwroot 静态目录
|
||||||
//{
|
|
||||||
// app.UseExceptionHandler("/Login");
|
|
||||||
//}
|
|
||||||
|
|
||||||
app.UseStaticFiles();
|
app.UseStaticFiles();
|
||||||
|
//添加 自定义 静态目录
|
||||||
app.UseStaticFiles(new StaticFileOptions
|
app.UseStaticFiles(new StaticFileOptions
|
||||||
{
|
{
|
||||||
FileProvider = new PhysicalFileProvider(AppCommon.TaskCachedFile),
|
FileProvider = new PhysicalFileProvider(AppCommon.TaskCachedFile),
|
||||||
RequestPath = "/video",
|
RequestPath = "/video",
|
||||||
//OnPrepareResponse = ctx => //»º´æ
|
|
||||||
//{
|
|
||||||
// ctx.Context.Response.Headers[Microsoft.Net.Http.Headers.HeaderNames.CacheControl] = "public,max - age = 31536000";
|
|
||||||
//}
|
|
||||||
});
|
});
|
||||||
app.UseAntiforgery();
|
app.UseAntiforgery();
|
||||||
|
|
||||||
app.MapRazorComponents<App>()
|
app.MapRazorComponents<Learn.VideoAnalysis.Components.App>()
|
||||||
.AddInteractiveServerRenderMode();
|
.AddInteractiveServerRenderMode();
|
||||||
//.AddInteractiveWebAssemblyRenderMode()
|
//.AddInteractiveWebAssemblyRenderMode()
|
||||||
//.AddAdditionalAssemblies(typeof(VideoAnalysisRazor._Imports).Assembly);
|
//.AddAdditionalAssemblies(typeof(VideoAnalysisRazor._Imports).Assembly);
|
||||||
|
|
||||||
app.MapControllers();
|
app.MapControllers();
|
||||||
|
|
||||||
|
//自定义 应用
|
||||||
SqlSugarExpand.InitDB();
|
SqlSugarExpand.InitDB();
|
||||||
|
CoravelExpand.Run(app.Services);
|
||||||
|
|
||||||
app.Run();
|
app.Run();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -45,9 +45,17 @@
|
||||||
"SqlType": "MySql",
|
"SqlType": "MySql",
|
||||||
"UpdateTable": false
|
"UpdateTable": false
|
||||||
},
|
},
|
||||||
"KnowsDB": {
|
"OtherDBArr": [
|
||||||
"ConnectionString": "Server=47.109.35.116;Database=ResourceBank;UID=live;Password=Woshiren^&*();MultipleActiveResultSets=true;Encrypt=True;TrustServerCertificate=True;",
|
{
|
||||||
"SqlType": "SqlServer"
|
"ConfigId": 1001, //ResourceBank
|
||||||
}
|
"ConnectionString": "Server=47.109.35.116;Database=ResourceBank;UID=live;Password=Woshiren^&*();MultipleActiveResultSets=true;Encrypt=True;TrustServerCertificate=True;",
|
||||||
|
"SqlType": "SqlServer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ConfigId": 1002, //App.public.live
|
||||||
|
"ConnectionString": "Server=47.109.35.116;Database=App.public.live;UID=live;Password=Woshiren^&*();MultipleActiveResultSets=true;Encrypt=True;TrustServerCertificate=True;",
|
||||||
|
"SqlType": "SqlServer"
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,7 @@ using VideoAnalysisCore.AICore.GPT.Dto;
|
||||||
using VideoAnalysisCore.AICore.GPT;
|
using VideoAnalysisCore.AICore.GPT;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using VideoAnalysisCore.AICore.SherpaOnnx;
|
using VideoAnalysisCore.AICore.SherpaOnnx;
|
||||||
|
using VideoAnalysisCore.Model.蓝鲸智库;
|
||||||
|
|
||||||
namespace VideoAnalysisCore.AICore.GPT.ChatGPT
|
namespace VideoAnalysisCore.AICore.GPT.ChatGPT
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,7 @@ using VideoAnalysisCore.AICore.GPT.Dto;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using VideoAnalysisCore.AICore.GPT.ChatGPT;
|
using VideoAnalysisCore.AICore.GPT.ChatGPT;
|
||||||
using VideoAnalysisCore.AICore.SherpaOnnx;
|
using VideoAnalysisCore.AICore.SherpaOnnx;
|
||||||
|
using VideoAnalysisCore.Model.蓝鲸智库;
|
||||||
|
|
||||||
namespace VideoAnalysisCore.AICore.GPT.DeepSeek
|
namespace VideoAnalysisCore.AICore.GPT.DeepSeek
|
||||||
{
|
{
|
||||||
|
|
@ -58,7 +59,7 @@ namespace VideoAnalysisCore.AICore.GPT.DeepSeek
|
||||||
string title = taskInfo.MediaName;
|
string title = taskInfo.MediaName;
|
||||||
var fileNameResFormat = "{授课章节: string|null}";
|
var fileNameResFormat = "{授课章节: string|null}";
|
||||||
var fileNamePostMessages = title +
|
var fileNamePostMessages = title +
|
||||||
" 这是一堂课的标题,请你基于标题帮我分析出这堂课所讲授的内容与最恰当的授课章节(尽可能的关联最贴切的章节并且就保留一个)." +
|
" 这是一堂课的标题,请你基于标题帮我分析出这堂课所讲授的内容与最恰当的授课章节(关联最贴切的章节,保留一个章节!)." +
|
||||||
$"章节范围限定在[{string.Join(',', xkwKnows)}]范围." +
|
$"章节范围限定在[{string.Join(',', xkwKnows)}]范围." +
|
||||||
$"输出格式 json字符串 对象格式{fileNameResFormat}";
|
$"输出格式 json字符串 对象格式{fileNameResFormat}";
|
||||||
var fileNameInfoRes = await ChatAsync<FileNameInfo>(task, fileNamePostMessages, null);//, "deepseek-chat");
|
var fileNameInfoRes = await ChatAsync<FileNameInfo>(task, fileNamePostMessages, null);//, "deepseek-chat");
|
||||||
|
|
@ -90,7 +91,8 @@ namespace VideoAnalysisCore.AICore.GPT.DeepSeek
|
||||||
$"从提取出的<知识块>内容称来匹配我提供的知识点,来作为片段的知识点(请确保匹配的知识点是用户提供的,否则片段知识点值为空字符串)。" +
|
$"从提取出的<知识块>内容称来匹配我提供的知识点,来作为片段的知识点(请确保匹配的知识点是用户提供的,否则片段知识点值为空字符串)。" +
|
||||||
$"提供的方法点名称({knows})。 格式 (方法点Id|方法点名称) 如果一个<知识块>出现多个知识点那么知识点Id与知识点名称都用逗号','分割。" +
|
$"提供的方法点名称({knows})。 格式 (方法点Id|方法点名称) 如果一个<知识块>出现多个知识点那么知识点Id与知识点名称都用逗号','分割。" +
|
||||||
$"这是输入的视频字幕并且是包含时间戳的视频字幕的固定格式文本。" +
|
$"这是输入的视频字幕并且是包含时间戳的视频字幕的固定格式文本。" +
|
||||||
$"字幕格式(说话人:开始秒:结束秒:内容|下一段字幕).以下是包含时间的视频字幕文本。字幕列表 {captions.Captions}。" +
|
//$"字幕格式(说话人:开始秒:结束秒:内容|下一段字幕).以下是包含时间的视频字幕文本。字幕列表 {captions.Captions}。" +
|
||||||
|
$"字幕格式(开始秒:结束秒:内容|下一段字幕).以下是包含时间的视频字幕文本。字幕列表 {captions.Captions}。" +
|
||||||
$"最后请检查某些<知识块>之间的过渡是否自然,如果<知识块>时长超过500秒则考虑拆封为两个更加贴切的<知识块>.或者<知识块>时长小于30秒则考虑合并<知识块>到相邻的<知识块>)。" +
|
$"最后请检查某些<知识块>之间的过渡是否自然,如果<知识块>时长超过500秒则考虑拆封为两个更加贴切的<知识块>.或者<知识块>时长小于30秒则考虑合并<知识块>到相邻的<知识块>)。" +
|
||||||
$"输出格式({resFormat})";
|
$"输出格式({resFormat})";
|
||||||
|
|
||||||
|
|
@ -111,8 +113,10 @@ namespace VideoAnalysisCore.AICore.GPT.DeepSeek
|
||||||
}
|
}
|
||||||
var thems = string.Join(',', questionRes.Select(s => s.StartTime + "->" + s.Theme));
|
var thems = string.Join(',', questionRes.Select(s => s.StartTime + "->" + s.Theme));
|
||||||
|
|
||||||
var checkResFormat = """{"Score":打分(number),"Evaluation":评价(string)}""";
|
var checkResFormat = """{"Score":打分(number),"Evaluation":评价(string),"Data":优化后的分段(array)}""";
|
||||||
var checkMessage = "我为视频的讲解内容做了一些分段,你能帮我检查下这些分段的时间分配合理吗?请给出你的打分(0-100,70分及格)以及评价" +
|
var checkResFormat1 = """[{"Start":开始秒(number),"Theme":优化后的分段主题(string)}]""";
|
||||||
|
var checkMessage = "我为视频的讲解内容做了一些分段,你能帮我检查下这些分段的时间分配是否合理,标题内容符合实际吗?" +
|
||||||
|
$"请给出你的打分(0-100,70分及格)以及打分原因,并且给出优化后的分段 分段格式(${checkResFormat1})" +
|
||||||
$"这是我的分段 {thems}." +
|
$"这是我的分段 {thems}." +
|
||||||
$"后续的内容是包含时间戳的视频字幕的固定格式文本。" +
|
$"后续的内容是包含时间戳的视频字幕的固定格式文本。" +
|
||||||
$"字幕格式(说话人:开始秒:结束秒:内容|下一段字幕).以下是包含时间的视频字幕文本。字幕列表 {captions.Captions}。" +
|
$"字幕格式(说话人:开始秒:结束秒:内容|下一段字幕).以下是包含时间的视频字幕文本。字幕列表 {captions.Captions}。" +
|
||||||
|
|
@ -130,7 +134,7 @@ namespace VideoAnalysisCore.AICore.GPT.DeepSeek
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
//todo 未包含的知识点片段 如何处理
|
||||||
var insertData = questionRes
|
var insertData = questionRes
|
||||||
.Where(s => !string.IsNullOrEmpty(s.KnowPoint))
|
.Where(s => !string.IsNullOrEmpty(s.KnowPoint))
|
||||||
.SelectMany(
|
.SelectMany(
|
||||||
|
|
|
||||||
|
|
@ -138,6 +138,7 @@ namespace VideoAnalysisCore.AICore.GPT.Dto
|
||||||
/// 评分
|
/// 评分
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string Evaluation { get; set; }
|
public string Evaluation { get; set; }
|
||||||
|
public VideoKnowRes[] Data { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
|
||||||
|
|
@ -46,16 +46,11 @@ namespace VideoAnalysisCore.Common
|
||||||
.Where(u => !u.IsInterface && !u.IsAbstract && u.IsClass && u.IsDefined(typeof(SugarTable), false)));
|
.Where(u => !u.IsInterface && !u.IsAbstract && u.IsClass && u.IsDefined(typeof(SugarTable), false)));
|
||||||
DbMatserType = assembliesType
|
DbMatserType = assembliesType
|
||||||
.Where(u => u.GetInterfaces().Contains(typeof(IDB)));
|
.Where(u => u.GetInterfaces().Contains(typeof(IDB)));
|
||||||
KnowsType = assembliesType
|
|
||||||
.Where(u =>u.GetInterfaces().Contains(typeof(IKnowsDB)));
|
|
||||||
}
|
}
|
||||||
catch
|
catch
|
||||||
{
|
{
|
||||||
throw;
|
throw;
|
||||||
}
|
}
|
||||||
//.Where(u => !u.IsDefined(typeof(SplitTableAttribute), false))
|
|
||||||
//.Where(u => !typeof(Model.DataCenterYH.IDataCenterYHModel).IsAssignableFrom(u))
|
|
||||||
//.Where(u => !u.IsSubclassOf(typeof(YQ_BaseEntity)));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
@ -225,11 +220,11 @@ namespace VideoAnalysisCore.Common
|
||||||
var stringBuilder = new StringBuilder();
|
var stringBuilder = new StringBuilder();
|
||||||
foreach (var item in results)
|
foreach (var item in results)
|
||||||
{
|
{
|
||||||
stringBuilder.Append(item.Value.First());
|
//stringBuilder.Append(item.Value.First());
|
||||||
|
//stringBuilder.Append(":");
|
||||||
|
stringBuilder.Append((int)item.Key.Start);
|
||||||
stringBuilder.Append(":");
|
stringBuilder.Append(":");
|
||||||
stringBuilder.Append(item.Key.Start);
|
stringBuilder.Append((int)item.Key.End);
|
||||||
stringBuilder.Append(":");
|
|
||||||
stringBuilder.Append(item.Key.End);
|
|
||||||
stringBuilder.Append(":");
|
stringBuilder.Append(":");
|
||||||
stringBuilder.Append(item.Key.Text);
|
stringBuilder.Append(item.Key.Text);
|
||||||
stringBuilder.Append("|");
|
stringBuilder.Append("|");
|
||||||
|
|
@ -370,6 +365,10 @@ namespace VideoAnalysisCore.Common
|
||||||
/// 启动时更新表结构
|
/// 启动时更新表结构
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool UpdateTable { get; set; }
|
public bool UpdateTable { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// 配置ID
|
||||||
|
/// </summary>
|
||||||
|
public long ConfigId { get; set; }
|
||||||
|
|
||||||
}
|
}
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
@ -401,14 +400,14 @@ namespace VideoAnalysisCore.Common
|
||||||
/// ChatGpt
|
/// ChatGpt
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public ChatGptConfig ChatGpt { get; set; } = new ChatGptConfig();
|
public ChatGptConfig ChatGpt { get; set; } = new ChatGptConfig();
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 数据库配置
|
/// 数据库配置
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public DBConfig DB { get; set; } = new DBConfig();
|
public DBConfig DB { get; set; } = new DBConfig();
|
||||||
/// <summary>
|
|
||||||
/// 知识点数据库
|
public DBConfig[] OtherDBArr { get; set; } = Array.Empty<DBConfig>();
|
||||||
/// </summary>
|
|
||||||
public DBConfig KnowsDB { get; set; } = new DBConfig();
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,31 @@
|
||||||
|
using Coravel;
|
||||||
|
using Coravel.Scheduling.Schedule;
|
||||||
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using VideoAnalysisCore.Job;
|
||||||
|
|
||||||
|
namespace VideoAnalysisCore.Common
|
||||||
|
{
|
||||||
|
public static class CoravelExpand
|
||||||
|
{
|
||||||
|
public static int MyProperty { get; set; }
|
||||||
|
public static void Init(IServiceCollection service)
|
||||||
|
{
|
||||||
|
|
||||||
|
service.AddScheduler();
|
||||||
|
service.AddTransient<UnprocessedVideoJob>();
|
||||||
|
}
|
||||||
|
public static void Run(IServiceProvider provider)
|
||||||
|
{
|
||||||
|
provider.UseScheduler(scheduler =>
|
||||||
|
{
|
||||||
|
//每5分钟执行一次 未处理视频扫描
|
||||||
|
scheduler.Schedule<UnprocessedVideoJob>().EveryFiveMinutes();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -139,12 +139,12 @@ namespace VideoAnalysisCore.Common
|
||||||
download.DownloadProgressChanged += (object? sender, Downloader.DownloadProgressChangedEventArgs e) =>
|
download.DownloadProgressChanged += (object? sender, Downloader.DownloadProgressChangedEventArgs e) =>
|
||||||
{
|
{
|
||||||
pI++;
|
pI++;
|
||||||
if(pI%20==0)
|
if (pI % 20 == 0)
|
||||||
RedisExpand.SetTaskProgress(task, e.ProgressPercentage);
|
RedisExpand.SetTaskProgress(task, e.ProgressPercentage);
|
||||||
};
|
};
|
||||||
download.DownloadFileCompleted +=async (object? sender, AsyncCompletedEventArgs e) =>
|
download.DownloadFileCompleted += async (object? sender, AsyncCompletedEventArgs e) =>
|
||||||
{
|
{
|
||||||
if (download.Status == DownloadStatus.Failed && e.Error!=null)
|
if (download.Status == DownloadStatus.Failed && e.Error != null)
|
||||||
{
|
{
|
||||||
await RedisExpand.SetTaskErrorMessage(long.Parse(task), e.Error)
|
await RedisExpand.SetTaskErrorMessage(long.Parse(task), e.Error)
|
||||||
.ConfigureAwait(false);//不切回上下文
|
.ConfigureAwait(false);//不切回上下文
|
||||||
|
|
|
||||||
|
|
@ -168,6 +168,13 @@ namespace VideoAnalysisCore.Common
|
||||||
|
|
||||||
var taskData = await DbScoped.SugarScope.Queryable<VideoTask>()
|
var taskData = await DbScoped.SugarScope.Queryable<VideoTask>()
|
||||||
.FirstAsync(s => s.Id == tId);
|
.FirstAsync(s => s.Id == tId);
|
||||||
|
if (taskData.Captions == "[]")
|
||||||
|
taskData.Captions = (await Redis.HMGetAsync(RedisExpandKey.Task(task), "Captions")).First();
|
||||||
|
if (taskData.Speaker == "[]")
|
||||||
|
taskData.Speaker = (await Redis.HMGetAsync(RedisExpandKey.Task(task), "Speaker")).First();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
taskData.ChatAnalysis =JsonSerializer.Serialize(gptRes);
|
taskData.ChatAnalysis =JsonSerializer.Serialize(gptRes);
|
||||||
taskData.ChatAnalysisScore = gptRes?.Assessment?.Merit?.Sum(s => s.Score) ?? 0;
|
taskData.ChatAnalysisScore = gptRes?.Assessment?.Merit?.Sum(s => s.Score) ?? 0;
|
||||||
taskData.ErrorMessage = string.Empty;
|
taskData.ErrorMessage = string.Empty;
|
||||||
|
|
@ -176,6 +183,8 @@ namespace VideoAnalysisCore.Common
|
||||||
.UpdateColumns(it => new
|
.UpdateColumns(it => new
|
||||||
{
|
{
|
||||||
it.ChatAnalysis,
|
it.ChatAnalysis,
|
||||||
|
it.Captions,
|
||||||
|
it.Speaker,
|
||||||
it.ChatAnalysisScore,
|
it.ChatAnalysisScore,
|
||||||
it.ErrorMessage,
|
it.ErrorMessage,
|
||||||
it.TotalTokens,
|
it.TotalTokens,
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@ using SqlSugar.IOC;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using System.Reflection;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using VideoAnalysisCore.Interface;
|
using VideoAnalysisCore.Interface;
|
||||||
|
|
@ -12,13 +13,25 @@ namespace VideoAnalysisCore.Common
|
||||||
{
|
{
|
||||||
public class Repository<T> : SimpleClient<T> where T : class, new()
|
public class Repository<T> : SimpleClient<T> where T : class, new()
|
||||||
{
|
{
|
||||||
|
readonly Dictionary<Type, object?> CID= new Dictionary<Type, object?>();
|
||||||
public Repository()
|
public Repository()
|
||||||
{
|
{
|
||||||
if(typeof(T).GetInterfaces().Contains(typeof(IKnowsDB)))
|
SwitchConnection();
|
||||||
base.Context = DbScoped.SugarScope.GetConnection(1001);
|
}
|
||||||
else
|
public void SwitchConnection()
|
||||||
base.Context = DbScoped.SugarScope;
|
{
|
||||||
|
var t = typeof(T);
|
||||||
|
if (CID.ContainsKey(t))
|
||||||
|
{
|
||||||
|
base.Context = DbScoped.SugarScope.GetConnectionScope(CID[t]);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var c = t.GetCustomAttribute<TenantAttribute>();
|
||||||
|
if (!CID.ContainsKey(typeof(T)))
|
||||||
|
CID.Add(typeof(T), c?.configId);
|
||||||
|
base.Context = c != null
|
||||||
|
? DbScoped.SugarScope.GetConnectionScope(c.configId)
|
||||||
|
: DbScoped.SugarScope;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -27,15 +27,15 @@ namespace VideoAnalysisCore.Common
|
||||||
ConnectionString = AppCommon.Config.DB.ConnectionString,
|
ConnectionString = AppCommon.Config.DB.ConnectionString,
|
||||||
DbType =AppCommon.Config.DB.SqlType,
|
DbType =AppCommon.Config.DB.SqlType,
|
||||||
IsAutoCloseConnection = true//自动释放
|
IsAutoCloseConnection = true//自动释放
|
||||||
},
|
|
||||||
new IocConfig()
|
|
||||||
{
|
|
||||||
ConfigId =1001,
|
|
||||||
ConnectionString = AppCommon.Config.KnowsDB.ConnectionString,
|
|
||||||
DbType =AppCommon.Config.KnowsDB.SqlType,
|
|
||||||
IsAutoCloseConnection = true//自动释放
|
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
dbList.AddRange(AppCommon.Config.OtherDBArr.Select(s => new IocConfig()
|
||||||
|
{
|
||||||
|
ConfigId=s.ConfigId,
|
||||||
|
ConnectionString=s.ConnectionString,
|
||||||
|
DbType=s.SqlType,
|
||||||
|
IsAutoCloseConnection = true
|
||||||
|
}));
|
||||||
services.AddSingleton(typeof(Repository<>));
|
services.AddSingleton(typeof(Repository<>));
|
||||||
|
|
||||||
//注入SqlSugar 主库
|
//注入SqlSugar 主库
|
||||||
|
|
|
||||||
|
|
@ -10,12 +10,16 @@ namespace VideoAnalysisCore.Enum
|
||||||
public enum TaskTypeEnum
|
public enum TaskTypeEnum
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 蓝鲸智库视频分析
|
/// 蓝鲸智库_视频分段
|
||||||
/// </summary>
|
/// </summary>
|
||||||
蓝鲸智库_视频分析,
|
蓝鲸智库_视频分段 = 0,
|
||||||
|
/// <summary>
|
||||||
|
/// 蓝鲸智库_中职视频分段
|
||||||
|
/// </summary>
|
||||||
|
蓝鲸智库_中职视频分段 = 100,
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 教研会议_视频分析
|
/// 教研会议_视频分析
|
||||||
/// </summary>
|
/// </summary>
|
||||||
教研会议_视频分析
|
教研会议_视频分析 = 200,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,15 +0,0 @@
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace VideoAnalysisCore.Interface
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// 表属于KnowsDB
|
|
||||||
/// </summary>
|
|
||||||
interface IKnowsDB
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -0,0 +1,28 @@
|
||||||
|
using Coravel.Invocable;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using VideoAnalysisCore.Common;
|
||||||
|
using VideoAnalysisCore.Model;
|
||||||
|
|
||||||
|
namespace VideoAnalysisCore.Job
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 查找未处理的视频
|
||||||
|
/// </summary>
|
||||||
|
public class UnprocessedVideoJob : IInvocable
|
||||||
|
{
|
||||||
|
private readonly Repository<VideoTask> videoTaskDB;
|
||||||
|
public UnprocessedVideoJob(Repository<VideoTask> videoTaskDB)
|
||||||
|
{
|
||||||
|
this.videoTaskDB = videoTaskDB;
|
||||||
|
}
|
||||||
|
public async Task Invoke()
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,182 @@
|
||||||
|
using System;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using SqlSugar;
|
||||||
|
using VideoAnalysisCore.Interface;
|
||||||
|
|
||||||
|
namespace App.Model
|
||||||
|
{
|
||||||
|
///<summary>
|
||||||
|
///文件附件
|
||||||
|
///</summary>
|
||||||
|
[SugarTable("Attachments")]
|
||||||
|
[Tenant("1002")]
|
||||||
|
public partial class Attachments
|
||||||
|
{
|
||||||
|
public Attachments()
|
||||||
|
{
|
||||||
|
|
||||||
|
this.SchoolId = Convert.ToInt64("0");
|
||||||
|
this.Sort = Convert.ToInt32("0");
|
||||||
|
this.CreateTime = DateTime.Now;
|
||||||
|
this.DeleteState = false;
|
||||||
|
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// Desc:
|
||||||
|
/// Default:
|
||||||
|
/// Nullable:False
|
||||||
|
/// </summary>
|
||||||
|
[SugarColumn(IsPrimaryKey = true)]
|
||||||
|
public long Id { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Desc:关联对象类型(枚举)
|
||||||
|
/// Default:
|
||||||
|
/// Nullable:False
|
||||||
|
/// </summary>
|
||||||
|
public int ObjType { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Desc:文件名称
|
||||||
|
/// Default:
|
||||||
|
/// Nullable:False
|
||||||
|
/// </summary>
|
||||||
|
[SugarColumn(Length = 500)]
|
||||||
|
public string Name { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Desc:自定义名称
|
||||||
|
/// Default:
|
||||||
|
/// Nullable:True
|
||||||
|
/// </summary>
|
||||||
|
[SugarColumn(IsNullable = true, Length = 200)]
|
||||||
|
public string CustomName { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Desc:文件类型
|
||||||
|
/// Default:
|
||||||
|
/// Nullable:False
|
||||||
|
/// </summary>
|
||||||
|
[SugarColumn(Length = 100)]
|
||||||
|
public string Type { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Desc:链接
|
||||||
|
/// Default:
|
||||||
|
/// Nullable:False
|
||||||
|
/// </summary>
|
||||||
|
[SugarColumn(Length = 255)]
|
||||||
|
public string Url { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Desc:扩展名
|
||||||
|
/// Default:
|
||||||
|
/// Nullable:False
|
||||||
|
/// </summary>
|
||||||
|
[SugarColumn(Length = 20)]
|
||||||
|
public string Extension { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Desc:文件大小(KB)
|
||||||
|
/// Default:
|
||||||
|
/// Nullable:False
|
||||||
|
/// </summary>
|
||||||
|
[SugarColumn(Length = 11, DecimalDigits = 2)]
|
||||||
|
public decimal Size { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Desc:学校
|
||||||
|
/// Default:0
|
||||||
|
/// Nullable:True
|
||||||
|
/// </summary>
|
||||||
|
[SugarColumn(IsNullable = true)]
|
||||||
|
public long? SchoolId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Desc:时长
|
||||||
|
/// Default:
|
||||||
|
/// Nullable:True
|
||||||
|
/// </summary>
|
||||||
|
[SugarColumn(IsNullable = true, Length = 10, DecimalDigits = 2)]
|
||||||
|
public decimal? Duration { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Desc:排序
|
||||||
|
/// Default:0
|
||||||
|
/// Nullable:True
|
||||||
|
/// </summary>
|
||||||
|
[SugarColumn(IsNullable = true)]
|
||||||
|
public int? Sort { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Desc:视频码
|
||||||
|
/// Default:
|
||||||
|
/// Nullable:True
|
||||||
|
/// </summary>
|
||||||
|
[SugarColumn(IsNullable = true)]
|
||||||
|
public string VideoCode { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Desc:年级
|
||||||
|
/// Default:
|
||||||
|
/// Nullable:True
|
||||||
|
/// </summary>
|
||||||
|
[SugarColumn(IsNullable = true)]
|
||||||
|
public string GradeName { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Desc:科目
|
||||||
|
/// Default:
|
||||||
|
/// Nullable:True
|
||||||
|
/// </summary>
|
||||||
|
[SugarColumn(IsNullable = true)]
|
||||||
|
public string SubjectName { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Desc:班级
|
||||||
|
/// Default:
|
||||||
|
/// Nullable:True
|
||||||
|
/// </summary>
|
||||||
|
[SugarColumn(IsNullable = true)]
|
||||||
|
public string ClassName { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Desc:创建时间
|
||||||
|
/// Default:DateTime.Now
|
||||||
|
/// Nullable:False
|
||||||
|
/// </summary>
|
||||||
|
public DateTime CreateTime { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Desc:
|
||||||
|
/// Default:0
|
||||||
|
/// Nullable:False
|
||||||
|
/// </summary>
|
||||||
|
public bool DeleteState { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// 转换后的图片数量
|
||||||
|
/// </summary>
|
||||||
|
[SugarColumn(IsNullable = true)]
|
||||||
|
public int ConvertPageCount { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 文件所属类型
|
||||||
|
/// </summary>
|
||||||
|
[SugarColumn(IsNullable = true, DefaultValue = "0")]
|
||||||
|
public int DataType { get; set; }
|
||||||
|
|
||||||
|
[SugarColumn(IsIgnore = true)]
|
||||||
|
public string DataTypeName { get; set; }
|
||||||
|
|
||||||
|
[SugarColumn(ColumnDescription = "新增用户id", IsNullable = true)]
|
||||||
|
public long AdminId { get; set; }
|
||||||
|
|
||||||
|
[SugarColumn(ColumnDescription = "新增用户角色id", IsNullable = true)]
|
||||||
|
public long AdminRoleId { get; set; }
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,128 @@
|
||||||
|
using System;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using SqlSugar;
|
||||||
|
using VideoAnalysisCore.Interface;
|
||||||
|
|
||||||
|
namespace App.Model
|
||||||
|
{
|
||||||
|
///<summary>
|
||||||
|
/// 文件内容表
|
||||||
|
///</summary>
|
||||||
|
[SugarTable("FileContent")]
|
||||||
|
[Tenant("1002")]
|
||||||
|
public partial class FileContent
|
||||||
|
{
|
||||||
|
public FileContent(){
|
||||||
|
|
||||||
|
this.Sort =Convert.ToInt32("0");
|
||||||
|
this.CreateTime =DateTime.Now;
|
||||||
|
this.DeleteState =false;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
[SugarColumn(IsPrimaryKey=true,IsIdentity=true)]
|
||||||
|
public long Id {get;set;}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Desc:内容名称
|
||||||
|
/// Default:
|
||||||
|
/// Nullable:False
|
||||||
|
/// </summary>
|
||||||
|
[SugarColumn(ColumnDescription = "内容名称", ColumnDataType = "nvarchar(500)", IsNullable = false)]
|
||||||
|
public string FileName {get;set;}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Desc:
|
||||||
|
/// Default:
|
||||||
|
/// Nullable:True
|
||||||
|
/// </summary>
|
||||||
|
[SugarColumn(ColumnDescription = "学校id", IsNullable = true)]
|
||||||
|
public long? SchoolId {get;set;}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Desc:
|
||||||
|
/// Default:
|
||||||
|
/// Nullable:True
|
||||||
|
/// </summary>
|
||||||
|
[SugarColumn(ColumnDescription = "学校名称", ColumnDataType = "nvarchar(100)", IsNullable = true)]
|
||||||
|
public string SchoolName {get;set;}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Desc:年级
|
||||||
|
/// Default:
|
||||||
|
/// Nullable:True
|
||||||
|
/// </summary>
|
||||||
|
[SugarColumn(ColumnDescription = "年级", ColumnDataType = "nvarchar(30)", IsNullable = true)]
|
||||||
|
public string GradeName {get;set;}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Desc:科目
|
||||||
|
/// Default:
|
||||||
|
/// Nullable:True
|
||||||
|
/// </summary>
|
||||||
|
[SugarColumn(ColumnDescription = "科目", IsNullable = true)]
|
||||||
|
|
||||||
|
public int? SubjectId {get;set;}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Desc:
|
||||||
|
/// Default:
|
||||||
|
/// Nullable:True
|
||||||
|
/// </summary>
|
||||||
|
[SugarColumn(ColumnDescription = "科目名称", ColumnDataType = "nvarchar(50)", IsNullable = true)]
|
||||||
|
public string SubjectName {get;set;}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Desc:文件系统目录id
|
||||||
|
/// Default:
|
||||||
|
/// Nullable:False
|
||||||
|
/// </summary>
|
||||||
|
[SugarColumn(ColumnDescription = "件系统目录id", IsNullable = false)]
|
||||||
|
public long FileDirectoryId {get;set;}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Desc:
|
||||||
|
/// Default:0
|
||||||
|
/// Nullable:False
|
||||||
|
/// </summary>
|
||||||
|
[SugarColumn(ColumnDescription = "排序", IsNullable = false, DefaultValue = "0")]
|
||||||
|
public int Sort {get;set;}
|
||||||
|
|
||||||
|
|
||||||
|
public DateTime CreateTime {get;set;}
|
||||||
|
|
||||||
|
public bool DeleteState {get;set;}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Desc:文件包Id
|
||||||
|
/// Default:
|
||||||
|
/// Nullable:False
|
||||||
|
/// </summary>
|
||||||
|
[SugarColumn(ColumnDescription = "文件包id", IsNullable = false)]
|
||||||
|
public long BagId {get;set;}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Desc:作者
|
||||||
|
/// Default:
|
||||||
|
/// Nullable:True
|
||||||
|
/// </summary>
|
||||||
|
[SugarColumn(ColumnDescription = "作者", ColumnDataType = "nvarchar(200)", IsNullable = true)]
|
||||||
|
public string Author {get;set;}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 是否可以下载
|
||||||
|
/// </summary>
|
||||||
|
public bool DownState { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// 管理员id
|
||||||
|
/// </summary>
|
||||||
|
[SugarColumn(ColumnDescription = "管理员id", IsNullable = true)]
|
||||||
|
public long? AdminId { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// 管理员角色id
|
||||||
|
/// </summary>
|
||||||
|
[SugarColumn(ColumnDescription = "管理员角色id", IsNullable = true)]
|
||||||
|
public long? AdminRoleId { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,66 @@
|
||||||
|
using System;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using SqlSugar;
|
||||||
|
using VideoAnalysisCore.Interface;
|
||||||
|
|
||||||
|
namespace App.Model
|
||||||
|
{
|
||||||
|
///<summary>
|
||||||
|
///
|
||||||
|
///</summary>
|
||||||
|
[SugarTable("FileContentMaterial")]
|
||||||
|
[Tenant("1002")]
|
||||||
|
public partial class FileContentMaterial
|
||||||
|
{
|
||||||
|
public FileContentMaterial(){
|
||||||
|
|
||||||
|
this.CreateTime =DateTime.Now;
|
||||||
|
this.DeleteState =false;
|
||||||
|
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// Desc:文件系统内容
|
||||||
|
/// Default:
|
||||||
|
/// Nullable:False
|
||||||
|
/// </summary>
|
||||||
|
[SugarColumn(IsPrimaryKey=true,IsIdentity=true)]
|
||||||
|
public long Id {get;set;}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Desc:文件系统内容
|
||||||
|
/// Default:
|
||||||
|
/// Nullable:False
|
||||||
|
/// </summary>
|
||||||
|
public long FileContentId {get;set;}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Desc:素材id
|
||||||
|
/// Default:
|
||||||
|
/// Nullable:False
|
||||||
|
/// </summary>
|
||||||
|
public long MaterialId {get;set;}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Desc:
|
||||||
|
/// Default:DateTime.Now
|
||||||
|
/// Nullable:False
|
||||||
|
/// </summary>
|
||||||
|
public DateTime CreateTime {get;set;}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Desc:
|
||||||
|
/// Default:0
|
||||||
|
/// Nullable:False
|
||||||
|
/// </summary>
|
||||||
|
public bool DeleteState {get;set;}
|
||||||
|
|
||||||
|
public int Sort { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 是否可以下载
|
||||||
|
/// </summary>
|
||||||
|
public bool DownState { get; set; } = false;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,161 @@
|
||||||
|
using System;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using SqlSugar;
|
||||||
|
using VideoAnalysisCore.Interface;
|
||||||
|
|
||||||
|
namespace App.Model
|
||||||
|
{
|
||||||
|
///<summary>
|
||||||
|
/// 文件目录表
|
||||||
|
///</summary>
|
||||||
|
[SugarTable("FileDirectory")]
|
||||||
|
[Tenant("1002")]
|
||||||
|
public partial class FileDirectory
|
||||||
|
{
|
||||||
|
public FileDirectory(){
|
||||||
|
|
||||||
|
this.State =Convert.ToInt32("1");
|
||||||
|
this.IsCheckedSelect =true;
|
||||||
|
this.IsLastNode =false;
|
||||||
|
this.ParentId =Convert.ToInt64("0");
|
||||||
|
this.CreateTime =DateTime.Now;
|
||||||
|
this.DeleteState =false;
|
||||||
|
this.AliasName =Convert.ToString("");
|
||||||
|
this.IsPublic =false;
|
||||||
|
this.Types =Convert.ToInt32("-1");
|
||||||
|
this.Code =Convert.ToString("");
|
||||||
|
|
||||||
|
}
|
||||||
|
[SugarColumn(IsPrimaryKey=true,IsIdentity=true)]
|
||||||
|
public long Id {get;set;}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Desc:名称
|
||||||
|
/// Default:
|
||||||
|
/// Nullable:False
|
||||||
|
/// </summary>
|
||||||
|
[SugarColumn(ColumnDescription = "名称", ColumnDataType = "nvarchar(50)", IsNullable = false)]
|
||||||
|
public string Name {get;set;}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Desc:排序
|
||||||
|
/// Default:
|
||||||
|
/// Nullable:False
|
||||||
|
/// </summary>
|
||||||
|
[SugarColumn(ColumnDescription = "排序", IsNullable = false)]
|
||||||
|
public int Sort {get;set;}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Desc:结构状态 1=显示
|
||||||
|
/// Default:1
|
||||||
|
/// Nullable:False
|
||||||
|
/// </summary>
|
||||||
|
[SugarColumn(ColumnDescription = "结构状态 1=显示", IsNullable = false,DefaultValue ="1")]
|
||||||
|
public int State {get;set;}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Desc:是否自动授权
|
||||||
|
/// Default:1
|
||||||
|
/// Nullable:False
|
||||||
|
/// </summary>
|
||||||
|
[SugarColumn(ColumnDescription = "是否自动授权", IsNullable = false, DefaultValue = "1")]
|
||||||
|
public bool IsCheckedSelect {get;set;}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Desc:是否最后一级节点
|
||||||
|
/// Default:0
|
||||||
|
/// Nullable:False
|
||||||
|
/// </summary>
|
||||||
|
[SugarColumn(ColumnDescription = "是否最后一级节点", IsNullable = false, DefaultValue = "0")]
|
||||||
|
public bool IsLastNode {get;set;}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Desc:上级id
|
||||||
|
/// Default:0
|
||||||
|
/// Nullable:False
|
||||||
|
/// </summary>
|
||||||
|
[SugarColumn(ColumnDescription = "上级id", IsNullable = false, DefaultValue = "0")]
|
||||||
|
public long ParentId {get;set;}
|
||||||
|
|
||||||
|
|
||||||
|
public DateTime CreateTime {get;set;}
|
||||||
|
|
||||||
|
public bool DeleteState {get;set;}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Desc:别名
|
||||||
|
/// Default:
|
||||||
|
/// Nullable:False
|
||||||
|
/// </summary>
|
||||||
|
[SugarColumn(ColumnDescription = "别名", ColumnDataType = "nvarchar(50)", IsNullable = false)]
|
||||||
|
public string AliasName {get;set;}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Desc:是否公开
|
||||||
|
/// Default:0
|
||||||
|
/// Nullable:True
|
||||||
|
/// </summary>
|
||||||
|
[SugarColumn(ColumnDescription = "是否公开", IsNullable = true, DefaultValue = "0")]
|
||||||
|
public bool? IsPublic {get;set;}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Desc:其他=-1,目录=0,课程=1,章=2,节=3
|
||||||
|
/// Default:-1
|
||||||
|
/// Nullable:True
|
||||||
|
/// </summary>
|
||||||
|
[SugarColumn(ColumnDescription = "其他=-1,目录=0,课程=1,章=2,节=3", IsNullable = true, DefaultValue = "-1")]
|
||||||
|
public int? Types {get;set;}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Desc:
|
||||||
|
/// Default:
|
||||||
|
/// Nullable:True
|
||||||
|
/// </summary>
|
||||||
|
[SugarColumn(ColumnDescription = "更新时间", IsNullable = true)]
|
||||||
|
public DateTime? UpdateTime {get;set;}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Desc:课程id(来源courseinfo)
|
||||||
|
/// Default:
|
||||||
|
/// Nullable:True
|
||||||
|
/// </summary>
|
||||||
|
[SugarColumn(ColumnDescription = "课程id(来源courseinfo)", IsNullable = true)]
|
||||||
|
public long? CourseId {get;set;}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Desc:教材版本id(来源 textboox_versions)
|
||||||
|
/// Default:
|
||||||
|
/// Nullable:True
|
||||||
|
/// </summary>
|
||||||
|
[SugarColumn(ColumnDescription = "教材版本id(来源 textboox_versions)", IsNullable = true)]
|
||||||
|
public long? VersionsId {get;set;}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Desc:
|
||||||
|
/// Default:
|
||||||
|
/// Nullable:True
|
||||||
|
/// </summary>
|
||||||
|
[SugarColumn(ColumnDescription = "", ColumnDataType = "nvarchar(50)", IsNullable = true)]
|
||||||
|
public string Code {get;set;}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Desc:根节点id
|
||||||
|
/// Default:
|
||||||
|
/// Nullable:True
|
||||||
|
/// </summary>
|
||||||
|
[SugarColumn(ColumnDescription = "根节点id", IsNullable = true)]
|
||||||
|
public long? RootId {get;set;}
|
||||||
|
/// <summary>
|
||||||
|
/// 管理员id
|
||||||
|
/// </summary>
|
||||||
|
[SugarColumn(ColumnDescription = "管理员id", IsNullable = true)]
|
||||||
|
public long? AdminId { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// 管理员角色id
|
||||||
|
/// </summary>
|
||||||
|
[SugarColumn(ColumnDescription = "管理员角色id", IsNullable = true)]
|
||||||
|
public long? AdminRoleId { get; set; }
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -6,10 +6,14 @@ using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using VideoAnalysisCore.Interface;
|
using VideoAnalysisCore.Interface;
|
||||||
|
|
||||||
namespace VideoAnalysisCore.Model
|
namespace VideoAnalysisCore.Model.蓝鲸智库
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 蓝鲸智库 知识点表
|
||||||
|
/// </summary>
|
||||||
[SugarTable("knowledgeinfo")]
|
[SugarTable("knowledgeinfo")]
|
||||||
public class KnowledgeInfo : IKnowsDB
|
[Tenant("1001")]
|
||||||
|
public class KnowledgeInfo
|
||||||
{
|
{
|
||||||
[SugarColumn(IsPrimaryKey = true, ColumnDescription = "Id 主键", ColumnName = "id")]
|
[SugarColumn(IsPrimaryKey = true, ColumnDescription = "Id 主键", ColumnName = "id")]
|
||||||
public long Id { get; set; }
|
public long Id { get; set; }
|
||||||
|
|
@ -0,0 +1,110 @@
|
||||||
|
using System;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using SqlSugar;
|
||||||
|
using VideoAnalysisCore.Interface;
|
||||||
|
|
||||||
|
namespace App.Model
|
||||||
|
{
|
||||||
|
///<summary>
|
||||||
|
///素材表
|
||||||
|
///</summary>
|
||||||
|
[SugarTable("Material")]
|
||||||
|
[Tenant("1002")]
|
||||||
|
public partial class Material
|
||||||
|
{
|
||||||
|
public Material()
|
||||||
|
{
|
||||||
|
|
||||||
|
this.TagId = Convert.ToInt64("0");
|
||||||
|
this.CreateTime = DateTime.Now;
|
||||||
|
this.DeleteState = false;
|
||||||
|
this.DownState = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
[SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
|
||||||
|
public long Id { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Desc:素材编号
|
||||||
|
/// Default:
|
||||||
|
/// Nullable:False
|
||||||
|
/// </summary>
|
||||||
|
[SugarColumn(ColumnDescription = "素材编号", ColumnDataType = "nvarchar(50)", IsNullable = false)]
|
||||||
|
public string MaterialNo { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Desc:素材类型(1:视频;2: 文件;3:音频;4:图片;)
|
||||||
|
/// Default:
|
||||||
|
/// Nullable:False
|
||||||
|
/// </summary>
|
||||||
|
[SugarColumn(ColumnDescription = "素材类型(1:视频;2: 文件;3:音频;4:图片;)", IsNullable = false)]
|
||||||
|
public int MaterialType { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Desc:标签Id
|
||||||
|
/// Default:0
|
||||||
|
/// Nullable:False
|
||||||
|
/// </summary>
|
||||||
|
[SugarColumn(ColumnDescription = "素标签Id", IsNullable = false,DefaultValue ="0")]
|
||||||
|
public long TagId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Desc:素材名称
|
||||||
|
/// Default:
|
||||||
|
/// Nullable:False
|
||||||
|
/// </summary>
|
||||||
|
[SugarColumn(ColumnDescription = "素材名称", ColumnDataType = "nvarchar(500)", IsNullable = false)]
|
||||||
|
public string MaterialName { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Desc:附件id
|
||||||
|
/// Default:
|
||||||
|
/// Nullable:False
|
||||||
|
/// </summary>
|
||||||
|
[SugarColumn(ColumnDescription = "附件id",IsNullable = false)]
|
||||||
|
public long AttachmentsId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Desc:
|
||||||
|
/// Default:
|
||||||
|
/// Nullable:True
|
||||||
|
/// </summary>
|
||||||
|
[SugarColumn(ColumnDescription = "内容", ColumnDataType = "nvarchar(max)", IsNullable = true)]
|
||||||
|
public string Desc { get; set; }
|
||||||
|
|
||||||
|
public DateTime CreateTime { get; set; }
|
||||||
|
|
||||||
|
public bool DeleteState { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 新增用户id
|
||||||
|
/// </summary>
|
||||||
|
[SugarColumn(ColumnDescription = "新增用户id")]
|
||||||
|
public long CreateUserId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Desc:新增用户名称
|
||||||
|
/// Default:
|
||||||
|
/// Nullable:False
|
||||||
|
/// </summary>
|
||||||
|
[SugarColumn(ColumnDescription = "新增用户名称",ColumnDataType = "nvarchar(50)")]
|
||||||
|
public string CreateUserName { get; set; }
|
||||||
|
|
||||||
|
[SugarColumn(ColumnDescription = "学校id",IsNullable =true)]
|
||||||
|
public long SchoolId { get; set; }
|
||||||
|
|
||||||
|
[SugarColumn(ColumnDescription = "学校名称", ColumnDataType = "nvarchar(50)", IsNullable = true)]
|
||||||
|
public string SchoolName { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// 是否可以下载
|
||||||
|
/// </summary>
|
||||||
|
[SugarColumn(ColumnDescription = "是否可以下载", DefaultValue ="0")]
|
||||||
|
public bool DownState { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// 新增用户角色id
|
||||||
|
/// </summary>
|
||||||
|
[SugarColumn(ColumnDescription = "新增用户角色id",IsNullable =true)]
|
||||||
|
public long AdminRoleId { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -57,6 +57,7 @@
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<PackageReference Include="Coravel" Version="6.0.2" />
|
||||||
<PackageReference Include="FreeRedis" Version="1.3.2" />
|
<PackageReference Include="FreeRedis" Version="1.3.2" />
|
||||||
<PackageReference Include="Downloader" Version="3.2.1" />
|
<PackageReference Include="Downloader" Version="3.2.1" />
|
||||||
<PackageReference Include="Mapster" Version="7.4.1-pre01" />
|
<PackageReference Include="Mapster" Version="7.4.1-pre01" />
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue