Compare commits
No commits in common. "04881ef3b8c49b219917fc39e9576517ba1c0002" and "de3bd9082290b8c63e237a8d4595d0c3bf1b881e" have entirely different histories.
04881ef3b8
...
de3bd90822
|
|
@ -51,27 +51,24 @@ namespace Learn.VideoAnalysis.Expand
|
||||||
},
|
},
|
||||||
OnAuthenticationFailed = context =>
|
OnAuthenticationFailed = context =>
|
||||||
{
|
{
|
||||||
// 可选:标记一下是否过期
|
context.Response.StatusCode = 403;
|
||||||
if (context.Exception!=null)
|
|
||||||
context.Response.Headers["Token-Expired"] = context.Exception.Message;
|
|
||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
},
|
},
|
||||||
OnChallenge = context =>
|
OnChallenge = context =>
|
||||||
{
|
{
|
||||||
if (context.Response.Headers.ContainsKey("Token-Expired"))
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
context.HandleResponse();
|
context.HandleResponse();
|
||||||
context.Response.StatusCode = 401;
|
if (context.Response.StatusCode == 403)
|
||||||
context.Response.ContentType = "application/json";
|
|
||||||
context.Response.Headers["Access-Control-Allow-Origin"] = "*"; // ✅ 补这个
|
|
||||||
var data = new
|
|
||||||
{
|
{
|
||||||
Code = 401,
|
var data1 = new { Code = 403, Message = context.Error + context.AuthenticateFailure?.Message };
|
||||||
Message = context.Error + context.AuthenticateFailure?.Message
|
context.Response.WriteAsync(data1.ToJson());
|
||||||
};
|
return Task.CompletedTask;
|
||||||
return context.Response.WriteAsync(data.ToJson());
|
}
|
||||||
|
context.Response.Clear();
|
||||||
|
context.Response.ContentType = "application/json";
|
||||||
|
context.Response.StatusCode = 401;
|
||||||
|
var data = new { Code = 401, Message = context.Error + context.AuthenticateFailure?.Message };
|
||||||
|
context.Response.WriteAsync(data.ToJson());
|
||||||
|
return Task.CompletedTask;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -53,13 +53,9 @@ namespace Learn.VideoAnalysis
|
||||||
builder.AddAppConfig(args);
|
builder.AddAppConfig(args);
|
||||||
//初始化 插件
|
//初始化 插件
|
||||||
builder.Services.AddEndpointsApiExplorer();
|
builder.Services.AddEndpointsApiExplorer();
|
||||||
//swagger
|
|
||||||
builder.Services.AddSwaggerExpand("AI视频分析");
|
builder.Services.AddSwaggerExpand("AI视频分析");
|
||||||
//鉴权
|
|
||||||
builder.Services.AddPermissionAuthentication();
|
builder.Services.AddPermissionAuthentication();
|
||||||
//数据库
|
|
||||||
builder.Services.AddSqlSugarExpand();
|
builder.Services.AddSqlSugarExpand();
|
||||||
//reids
|
|
||||||
builder.Services.AddRedisExpand();
|
builder.Services.AddRedisExpand();
|
||||||
//工作流
|
//工作流
|
||||||
builder.Services.AddSimpleTexOcrClient();
|
builder.Services.AddSimpleTexOcrClient();
|
||||||
|
|
@ -113,8 +109,6 @@ namespace Learn.VideoAnalysis
|
||||||
var app = builder.Build();
|
var app = builder.Build();
|
||||||
|
|
||||||
AppCommon.Services = app.Services;
|
AppCommon.Services = app.Services;
|
||||||
//允许跨域
|
|
||||||
app.UseCorsExpand();
|
|
||||||
app.UseMiddleware<BasicAuthMiddleware>("Swagger");
|
app.UseMiddleware<BasicAuthMiddleware>("Swagger");
|
||||||
// Configure the HTTP request pipeline.
|
// Configure the HTTP request pipeline.
|
||||||
app.UseSwagger();
|
app.UseSwagger();
|
||||||
|
|
@ -139,6 +133,7 @@ namespace Learn.VideoAnalysis
|
||||||
app.MapControllers();
|
app.MapControllers();
|
||||||
|
|
||||||
//自定义 应用
|
//自定义 应用
|
||||||
|
app.UseCorsExpand();
|
||||||
app.UseSqlSugarExpand();
|
app.UseSqlSugarExpand();
|
||||||
app.UseCoravelExpand();
|
app.UseCoravelExpand();
|
||||||
app.UseServiceSystem(() =>
|
app.UseServiceSystem(() =>
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,6 @@ import { useUserStoreHook } from "@/store/modules/user";
|
||||||
import router from "@/router";
|
import router from "@/router";
|
||||||
import { ElMessage } from "element-plus";
|
import { ElMessage } from "element-plus";
|
||||||
import { message } from "../message";
|
import { message } from "../message";
|
||||||
import { useNav } from "@/layout/hooks/useNav";
|
|
||||||
|
|
||||||
/**请求后端的地址 未配置则访问BaseURL */
|
/**请求后端的地址 未配置则访问BaseURL */
|
||||||
const apiServiceConfig = {
|
const apiServiceConfig = {
|
||||||
|
|
@ -204,16 +203,12 @@ class PureHttp {
|
||||||
$error.isCancelRequest = Axios.isCancel($error);
|
$error.isCancelRequest = Axios.isCancel($error);
|
||||||
// 关闭进度条动画
|
// 关闭进度条动画
|
||||||
NProgress.done();
|
NProgress.done();
|
||||||
debugger
|
|
||||||
if (error.response?.status === 403) {
|
if (error.response?.status === 403) {
|
||||||
// 跳转到403页面
|
// 跳转到403页面
|
||||||
router.push({
|
router.push({
|
||||||
path: "/error/403"
|
path: "/error/403"
|
||||||
});
|
});
|
||||||
}else if (error.response?.status === 401) {
|
} else if (error.response?.status !== 200) {
|
||||||
// 跳转到403页面
|
|
||||||
useUserStoreHook().logOut();
|
|
||||||
}else if (error.response?.status !== 200) {
|
|
||||||
ElMessage.warning("请求失败" + $error.message + " ");
|
ElMessage.warning("请求失败" + $error.message + " ");
|
||||||
console.log("请求失败" ,$error);
|
console.log("请求失败" ,$error);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,8 +2,7 @@
|
||||||
"Kestrel": {
|
"Kestrel": {
|
||||||
"Endpoints": {
|
"Endpoints": {
|
||||||
"Http": {
|
"Http": {
|
||||||
//"Url": "http://*:7532"
|
"Url": "http://*:7532"
|
||||||
"Url": "http://*:5238"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -28,7 +28,6 @@ using static System.Net.Mime.MediaTypeNames;
|
||||||
using VideoAnalysisCore.AICore.GPT.DeepSeek;
|
using VideoAnalysisCore.AICore.GPT.DeepSeek;
|
||||||
using VideoAnalysisCore.AICore.GPT.Gemini;
|
using VideoAnalysisCore.AICore.GPT.Gemini;
|
||||||
using static System.Collections.Specialized.BitVector32;
|
using static System.Collections.Specialized.BitVector32;
|
||||||
using UserCenter.Model;
|
|
||||||
|
|
||||||
namespace VideoAnalysisCore.AICore.GPT
|
namespace VideoAnalysisCore.AICore.GPT
|
||||||
{
|
{
|
||||||
|
|
@ -521,7 +520,6 @@ namespace VideoAnalysisCore.AICore.GPT
|
||||||
""";
|
""";
|
||||||
|
|
||||||
var res = await bset_deepSeekClient.ChatAsync<VideoKnowRes>(taskInfo.Id.ToString(), message, "作业布置识别", ChatGPTType.Deepseek_Chat, 8000);
|
var res = await bset_deepSeekClient.ChatAsync<VideoKnowRes>(taskInfo.Id.ToString(), message, "作业布置识别", ChatGPTType.Deepseek_Chat, 8000);
|
||||||
//部分参数 没补全
|
|
||||||
if (res is null)
|
if (res is null)
|
||||||
return null;
|
return null;
|
||||||
if (!string.Equals(res.Stage, "作业布置", StringComparison.OrdinalIgnoreCase))
|
if (!string.Equals(res.Stage, "作业布置", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
@ -847,15 +845,8 @@ namespace VideoAnalysisCore.AICore.GPT
|
||||||
GradeYear = taskInfo.GradeYear,
|
GradeYear = taskInfo.GradeYear,
|
||||||
}).ToList();
|
}).ToList();
|
||||||
//尝试追加 作业布置分段
|
//尝试追加 作业布置分段
|
||||||
if (homework != null && !questionRes.Any(s => s.Stage == StageEnum.作业布置.ToString()))
|
if (homework != null && !questionRes.Any(s => s.Stage == StageEnum.作业布置.ToString()))
|
||||||
{
|
tStage.Add(homework.Adapt<VideoTaskStage>());
|
||||||
var stag = homework.Adapt<VideoTaskStage>();
|
|
||||||
stag.VideoTaskId = taskId;
|
|
||||||
stag.TagId = taskInfo.TagId;
|
|
||||||
stag.Stage = StageEnum.课程总结;
|
|
||||||
stag.CloudSchoolId = taskInfo.CloudSchoolId;
|
|
||||||
tStage.Add(stag);
|
|
||||||
}
|
|
||||||
await videoTaskStageDB.InsertRangeAsync(tStage);
|
await videoTaskStageDB.InsertRangeAsync(tStage);
|
||||||
await videoKonwPointDB.InsertRangeAsync(insertData);
|
await videoKonwPointDB.InsertRangeAsync(insertData);
|
||||||
break;
|
break;
|
||||||
|
|
|
||||||
|
|
@ -32,9 +32,7 @@ namespace VideoAnalysisCore.Common.Expand
|
||||||
// 获取配置文件中的允许跨域的地址
|
// 获取配置文件中的允许跨域的地址
|
||||||
app.UseCors(options =>
|
app.UseCors(options =>
|
||||||
{
|
{
|
||||||
options
|
options.WithOrigins("*") // 允许跨域请求的地址
|
||||||
.WithOrigins("*") // 允许跨域请求的地址
|
|
||||||
.AllowAnyOrigin()
|
|
||||||
.AllowAnyHeader() // 允许的请求标头
|
.AllowAnyHeader() // 允许的请求标头
|
||||||
.AllowAnyMethod(); // 允许跨域请求的类型 (GET,POST等)
|
.AllowAnyMethod(); // 允许跨域请求的类型 (GET,POST等)
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -401,14 +401,14 @@ namespace VideoAnalysisCore.Controllers.Dto
|
||||||
public class VideoTaskStageRes
|
public class VideoTaskStageRes
|
||||||
{
|
{
|
||||||
|
|
||||||
///// <summary>
|
/// <summary>
|
||||||
///// 视频封面地址
|
/// 视频封面地址
|
||||||
///// </summary>
|
/// </summary>
|
||||||
//public string PreviewUrl { get; set; }
|
public string PreviewUrl { get; set; }
|
||||||
///// <summary>
|
/// <summary>
|
||||||
///// 视频地址
|
/// 视频地址
|
||||||
///// </summary>
|
/// </summary>
|
||||||
//public string PlayUrl { get; set; }
|
public string PlayUrl { get; set; }
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// id
|
/// id
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
@ -419,13 +419,10 @@ namespace VideoAnalysisCore.Controllers.Dto
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public long VideoTaskId { get; set; }
|
public long VideoTaskId { get; set; }
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 年份
|
/// 自定义Id [任务视频自定义id]
|
||||||
|
/// <see cref="VideoTask.TagId"/>
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string? GradeYear { get; set; }
|
public string? TagId { get; set; }
|
||||||
/// <summary>
|
|
||||||
/// 年份
|
|
||||||
/// </summary>
|
|
||||||
public string? GradeId { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 开始时间
|
/// 开始时间
|
||||||
|
|
@ -446,7 +443,7 @@ namespace VideoAnalysisCore.Controllers.Dto
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 课程阶段
|
/// 课程阶段
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public virtual string? Stage { get; set; }
|
public virtual StageEnum? Stage { get; set; }
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 视频所属云校ID
|
/// 视频所属云校ID
|
||||||
/// <para><see cref="UserCenter.Model.CloudSchool"/> 用户中心的云校id</para>
|
/// <para><see cref="UserCenter.Model.CloudSchool"/> 用户中心的云校id</para>
|
||||||
|
|
|
||||||
|
|
@ -123,12 +123,12 @@ namespace VideoAnalysisCore.Controllers
|
||||||
VideoUrl = s.VideoUrl,
|
VideoUrl = s.VideoUrl,
|
||||||
CourseType = s.CourseType,
|
CourseType = s.CourseType,
|
||||||
CallBackUrl = s.CallBackUrl,
|
CallBackUrl = s.CallBackUrl,
|
||||||
CloudSchoolId = s.UserCenterCloudSchoolId,
|
CloudSchoolId =s.UserCenterCloudSchoolId,
|
||||||
Area = s.Area,
|
Area = s.Area,
|
||||||
HostIP = s.HostIP,
|
HostIP = s.HostIP,
|
||||||
StageId = s.StageId,
|
StageId = s.StageId,
|
||||||
GradeId = s.GradeId,
|
GradeId = s.GradeId,
|
||||||
GradeYear = s.Trem == 0 ? null : s.Trem,
|
GradeYear = s.Trem==0?null : s.Trem,
|
||||||
GradeSemester = s.GradeSemester,
|
GradeSemester = s.GradeSemester,
|
||||||
TextBookVersionId = s.TextBookVersionId,
|
TextBookVersionId = s.TextBookVersionId,
|
||||||
};
|
};
|
||||||
|
|
@ -151,8 +151,8 @@ namespace VideoAnalysisCore.Controllers
|
||||||
VideoType = s.CourseType,
|
VideoType = s.CourseType,
|
||||||
CloudSchoolId = s.UserCenterCloudSchoolId,
|
CloudSchoolId = s.UserCenterCloudSchoolId,
|
||||||
TextBookVersionId = s.TextBookVersionId,
|
TextBookVersionId = s.TextBookVersionId,
|
||||||
GradeSemester = s.GradeSemester,
|
GradeSemester =s .GradeSemester,
|
||||||
CourseLevel = s.CourseLevel,
|
CourseLevel =s.CourseLevel,
|
||||||
GradeId = s.GradeId,
|
GradeId = s.GradeId,
|
||||||
GradeYear = np.GradeYear,
|
GradeYear = np.GradeYear,
|
||||||
});
|
});
|
||||||
|
|
@ -207,7 +207,7 @@ namespace VideoAnalysisCore.Controllers
|
||||||
/// <param name="taskId">自定义id</param>
|
/// <param name="taskId">自定义id</param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
[HttpGet(Name = "TaskKnowInfo")]
|
[HttpGet(Name = "TaskKnowInfo")]
|
||||||
public async Task<IActionResult> TaskKnowInfo(string? tagId, string? taskId)
|
public async Task<IActionResult> TaskKnowInfo(string? tagId , string? taskId)
|
||||||
{
|
{
|
||||||
if (string.IsNullOrEmpty(tagId) && !string.IsNullOrEmpty(taskId))
|
if (string.IsNullOrEmpty(tagId) && !string.IsNullOrEmpty(taskId))
|
||||||
tagId = taskId;
|
tagId = taskId;
|
||||||
|
|
@ -261,12 +261,12 @@ namespace VideoAnalysisCore.Controllers
|
||||||
Theme = s.Theme,
|
Theme = s.Theme,
|
||||||
Know = videoKnowDic.ContainsKey(s.Id)
|
Know = videoKnowDic.ContainsKey(s.Id)
|
||||||
? videoKnowDic[s.Id]?.Select(x => new TaskKnowInfo()
|
? videoKnowDic[s.Id]?.Select(x => new TaskKnowInfo()
|
||||||
{
|
{
|
||||||
Id = x.Id,
|
Id = x.Id,
|
||||||
KnowPoint = x.KnowPoint,
|
KnowPoint = x.KnowPoint,
|
||||||
KnowPointId = x.KnowPointId,
|
KnowPointId = x.KnowPointId,
|
||||||
KnowWeight = x.KnowPointWeight ?? 0f,
|
KnowWeight = x.KnowPointWeight??0f,
|
||||||
})?.ToArray()
|
})?.ToArray()
|
||||||
: null
|
: null
|
||||||
}).ToArray()
|
}).ToArray()
|
||||||
};
|
};
|
||||||
|
|
@ -312,11 +312,11 @@ namespace VideoAnalysisCore.Controllers
|
||||||
stageQuery = stageQuery.WhereIF(!string.IsNullOrWhiteSpace(req.Content), s => s.Content.Contains(req.Content));
|
stageQuery = stageQuery.WhereIF(!string.IsNullOrWhiteSpace(req.Content), s => s.Content.Contains(req.Content));
|
||||||
|
|
||||||
var pageIndex = req.PageIndex < 0 ? 0 : req.PageIndex;
|
var pageIndex = req.PageIndex < 0 ? 0 : req.PageIndex;
|
||||||
var pageSize = req.PageSize <= 0 ? 50 : req.PageSize > 100 ? 100 : req.PageSize;
|
var pageSize = req.PageSize <= 0 ? 50 : req.PageSize > 100 ?100 : req.PageSize;
|
||||||
string[]? knowArr = null;
|
string[]? knowArr = null;
|
||||||
if (req.KnowPointStrArr is not null && req.KnowPointStrArr.Length > 0)
|
if (req.KnowPointStrArr is not null && req.KnowPointStrArr.Length > 0)
|
||||||
{
|
{
|
||||||
knowArr = req.KnowPointStrArr.Where(s => !string.IsNullOrWhiteSpace(s)).Select(s => s.Trim()).Distinct().ToArray();
|
knowArr = req.KnowPointStrArr.Where(s => !string.IsNullOrWhiteSpace(s)).Select(s=>s.Trim()).Distinct().ToArray();
|
||||||
if (knowArr.Length > 0)
|
if (knowArr.Length > 0)
|
||||||
{
|
{
|
||||||
stageQuery = stageQuery.Where(s => SqlFunc.Subqueryable<VideoKonwPoint>()
|
stageQuery = stageQuery.Where(s => SqlFunc.Subqueryable<VideoKonwPoint>()
|
||||||
|
|
@ -333,7 +333,7 @@ namespace VideoAnalysisCore.Controllers
|
||||||
var taskIdArr = stagePageArr.Select(s => s.VideoTaskId).ToArray();
|
var taskIdArr = stagePageArr.Select(s => s.VideoTaskId).ToArray();
|
||||||
var kpQuery = videoKonwPointDB.AsQueryable()
|
var kpQuery = videoKonwPointDB.AsQueryable()
|
||||||
.Where(s => taskIdArr.Contains(s.VideoTaskId) && s.KnowPointId != null);
|
.Where(s => taskIdArr.Contains(s.VideoTaskId) && s.KnowPointId != null);
|
||||||
if (knowArr != null && knowArr.Length > 0)
|
if (knowArr !=null && knowArr.Length > 0)
|
||||||
kpQuery = kpQuery.Where(s => knowArr.Contains(s.KnowPointId));
|
kpQuery = kpQuery.Where(s => knowArr.Contains(s.KnowPointId));
|
||||||
|
|
||||||
var kpArr = await kpQuery
|
var kpArr = await kpQuery
|
||||||
|
|
@ -353,13 +353,12 @@ namespace VideoAnalysisCore.Controllers
|
||||||
{
|
{
|
||||||
Id = s.Id,
|
Id = s.Id,
|
||||||
VideoTaskId = s.VideoTaskId,
|
VideoTaskId = s.VideoTaskId,
|
||||||
|
TagId = s.TagId,
|
||||||
StartTime = s.StartTime,
|
StartTime = s.StartTime,
|
||||||
EndTime = s.EndTime,
|
EndTime = s.EndTime,
|
||||||
Theme = s.Theme,
|
Theme = s.Theme,
|
||||||
CloudSchoolId = s.CloudSchoolId,
|
CloudSchoolId = s.CloudSchoolId,
|
||||||
Stage = s.Stage.ToString(),
|
Stage=s.Stage,
|
||||||
GradeId = s.GradeId.ToString(),
|
|
||||||
GradeYear = s.GradeYear?.ToString(),
|
|
||||||
//PreviewUrl= videoInfoRes.ContainsKey(s.VideoTaskId.ToString())? videoInfoRes[] :
|
//PreviewUrl= videoInfoRes.ContainsKey(s.VideoTaskId.ToString())? videoInfoRes[] :
|
||||||
KnowPoints = kpDic.ContainsKey(s.Id) ? kpDic[s.Id] : []
|
KnowPoints = kpDic.ContainsKey(s.Id) ? kpDic[s.Id] : []
|
||||||
}).ToArray();
|
}).ToArray();
|
||||||
|
|
@ -382,31 +381,23 @@ namespace VideoAnalysisCore.Controllers
|
||||||
[HttpGet(Name = "GetVideoURL")]
|
[HttpGet(Name = "GetVideoURL")]
|
||||||
public async Task<IActionResult> GetVideoURL(long videoTaskId)
|
public async Task<IActionResult> GetVideoURL(long videoTaskId)
|
||||||
{
|
{
|
||||||
if (videoTaskId == 0)
|
if (videoTaskId ==0)
|
||||||
return BadRequest("参数不能为空");
|
return BadRequest("参数不能为空");
|
||||||
var task = await videoTaskDB.GetByIdAsync(videoTaskId);
|
var task =await videoTaskDB.GetByIdAsync(videoTaskId);
|
||||||
if (task is null)
|
if (task is null)
|
||||||
return BadRequest("参数无效");
|
return BadRequest("参数无效");
|
||||||
try
|
|
||||||
|
var videoInfo = await vodClient.GetPlayInfoAsync(new GetPlayInfoRequest()
|
||||||
{
|
{
|
||||||
var videoInfo = await vodClient.GetPlayInfoAsync(new GetPlayInfoRequest()
|
VideoId = task.TagId,
|
||||||
{
|
Formats = "mp4",
|
||||||
VideoId = task.TagId,
|
OutputType = "cdn",
|
||||||
Formats = "mp4",
|
AuthTimeout = 3600 * 24 * 12,
|
||||||
OutputType = "cdn",
|
});
|
||||||
AuthTimeout = 3600 * 24 * 12,
|
if (videoInfo is null || videoInfo.StatusCode != 200 && !videoInfo.Body.PlayInfoList.PlayInfo.Any())
|
||||||
});
|
return BadRequest("获取存储的视频信息失败!");
|
||||||
if (videoInfo is null || videoInfo.StatusCode != 200 && !videoInfo.Body.PlayInfoList.PlayInfo.Any())
|
|
||||||
return BadRequest("获取存储的视频信息失败!");
|
|
||||||
return Ok(videoInfo.Body.PlayInfoList.PlayInfo.First().PlayURL);
|
|
||||||
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
|
|
||||||
return BadRequest("获取存储的视频信息失败!" + ex.Message);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
return Ok(videoInfo.Body.PlayInfoList.PlayInfo.First().PlayURL);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue