Compare commits

...

3 Commits

8 changed files with 94 additions and 57 deletions

View File

@ -51,24 +51,27 @@ 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 =>
{ {
context.HandleResponse(); if (context.Response.Headers.ContainsKey("Token-Expired"))
if (context.Response.StatusCode == 403)
{ {
var data1 = new { Code = 403, Message = context.Error + context.AuthenticateFailure?.Message };
context.Response.WriteAsync(data1.ToJson());
return Task.CompletedTask;
} }
context.Response.Clear(); context.HandleResponse();
context.Response.ContentType = "application/json";
context.Response.StatusCode = 401; context.Response.StatusCode = 401;
var data = new { Code = 401, Message = context.Error + context.AuthenticateFailure?.Message }; context.Response.ContentType = "application/json";
context.Response.WriteAsync(data.ToJson()); context.Response.Headers["Access-Control-Allow-Origin"] = "*"; // ✅ 补这个
return Task.CompletedTask; var data = new
{
Code = 401,
Message = context.Error + context.AuthenticateFailure?.Message
};
return context.Response.WriteAsync(data.ToJson());
} }
}; };
}); });

View File

@ -53,9 +53,13 @@ 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();
@ -109,6 +113,8 @@ 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();
@ -133,7 +139,6 @@ namespace Learn.VideoAnalysis
app.MapControllers(); app.MapControllers();
//自定义 应用 //自定义 应用
app.UseCorsExpand();
app.UseSqlSugarExpand(); app.UseSqlSugarExpand();
app.UseCoravelExpand(); app.UseCoravelExpand();
app.UseServiceSystem(() => app.UseServiceSystem(() =>

View File

@ -17,6 +17,7 @@ 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 = {
@ -203,12 +204,16 @@ 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 !== 200) { }else if (error.response?.status === 401) {
// 跳转到403页面
useUserStoreHook().logOut();
}else if (error.response?.status !== 200) {
ElMessage.warning("请求失败" + $error.message + " "); ElMessage.warning("请求失败" + $error.message + " ");
console.log("请求失败" ,$error); console.log("请求失败" ,$error);
} }

View File

@ -2,7 +2,8 @@
"Kestrel": { "Kestrel": {
"Endpoints": { "Endpoints": {
"Http": { "Http": {
"Url": "http://*:7532" //"Url": "http://*:7532"
"Url": "http://*:5238"
} }
} }
}, },

View File

@ -28,6 +28,7 @@ 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
{ {
@ -520,6 +521,7 @@ 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))
@ -846,7 +848,14 @@ namespace VideoAnalysisCore.AICore.GPT
}).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;

View File

@ -32,7 +32,9 @@ namespace VideoAnalysisCore.Common.Expand
// 获取配置文件中的允许跨域的地址 // 获取配置文件中的允许跨域的地址
app.UseCors(options => app.UseCors(options =>
{ {
options.WithOrigins("*") // 允许跨域请求的地址 options
.WithOrigins("*") // 允许跨域请求的地址
.AllowAnyOrigin()
.AllowAnyHeader() // 允许的请求标头 .AllowAnyHeader() // 允许的请求标头
.AllowAnyMethod(); // 允许跨域请求的类型 (GET,POST等) .AllowAnyMethod(); // 允许跨域请求的类型 (GET,POST等)
}); });

View File

@ -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,10 +419,13 @@ 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? TagId { get; set; } public string? GradeYear { get; set; }
/// <summary>
/// 年份
/// </summary>
public string? GradeId { get; set; }
/// <summary> /// <summary>
/// 开始时间 /// 开始时间
@ -443,7 +446,7 @@ namespace VideoAnalysisCore.Controllers.Dto
/// <summary> /// <summary>
/// 课程阶段 /// 课程阶段
/// </summary> /// </summary>
public virtual StageEnum? Stage { get; set; } public virtual string? Stage { get; set; }
/// <summary> /// <summary>
/// 视频所属云校ID /// 视频所属云校ID
/// <para><see cref="UserCenter.Model.CloudSchool"/> 用户中心的云校id</para> /// <para><see cref="UserCenter.Model.CloudSchool"/> 用户中心的云校id</para>

View File

@ -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,12 +353,13 @@ 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, Stage = s.Stage.ToString(),
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();
@ -381,23 +382,31 @@ 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()
{ {
VideoId = task.TagId, var videoInfo = await vodClient.GetPlayInfoAsync(new GetPlayInfoRequest()
Formats = "mp4", {
OutputType = "cdn", VideoId = task.TagId,
AuthTimeout = 3600 * 24 * 12, Formats = "mp4",
}); OutputType = "cdn",
if (videoInfo is null || videoInfo.StatusCode != 200 && !videoInfo.Body.PlayInfoList.PlayInfo.Any()) AuthTimeout = 3600 * 24 * 12,
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);
} }
} }