123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238 |
- using IES.ExamLib.Models;
- using IES.ExamServer.DI;
- using IES.ExamServer.DI.SignalRHost;
- using IES.ExamServer.Filters;
- using IES.ExamServer.Helper;
- using IES.ExamServer.Models;
- using Microsoft.AspNetCore.Mvc;
- using Microsoft.Extensions.Caching.Memory;
- using Microsoft.Extensions.Configuration;
- using System.Linq.Expressions;
- using System.Net.Http;
- using System.Text.Json;
- using System.Text.Json.Nodes;
- namespace IES.ExamServer.Controllers
- {
- [ApiController]
- [Route("manage")]
- public class ManageController:BaseController
- {
- private readonly IConfiguration _configuration;
- private readonly IHttpClientFactory _httpClientFactory;
- private readonly IMemoryCache _memoryCache;
- private readonly ILogger<ManageController> _logger;
- private readonly LiteDBFactory _liteDBFactory;
- private readonly DataCenterConnectionService _connectionService;
- private readonly int DelayMicro = 10;//微观数据延迟
- private readonly int DelayMacro = 100;//宏观数据延迟
- private readonly SignalRExamServerHub _signalRExamServerHub;
- public ManageController(LiteDBFactory liteDBFactory,ILogger<ManageController> logger, IConfiguration configuration,
- IHttpClientFactory httpClientFactory, IMemoryCache memoryCache, DataCenterConnectionService connectionService,SignalRExamServerHub signalRExamServerHub)
- {
- _logger = logger;
- _configuration=configuration;
- _httpClientFactory=httpClientFactory;
- _memoryCache=memoryCache;
- _liteDBFactory=liteDBFactory;
- _connectionService=connectionService;
- _signalRExamServerHub=signalRExamServerHub;
- }
- [HttpPost("download-package")]
- [AuthToken("admin","teacher")]
- public async Task<IActionResult> DownloadPackage(JsonNode json)
- {
-
- //C#.NET 6 后端与前端流式通信
- //https://www.doubao.com/chat/collection/687687510791426?type=Thread
- //下载日志记录:1.步骤,检查,2.获取描述信息,3.分类型,4下载文件,5.前端处理,6.返回结果 , 正在下载...==> [INFO]https://www.doubao.com/chat/collection/687687510791426?type=Thread [Size=180kb] Ok...
- //进度条 展示下载文件总大小和已下载,末尾展示 文件总个数和已下载个数
- return Ok();
- }
- [HttpPost("check-short-code")]
- public async Task<IActionResult> CheckShortCode(JsonNode json)
- {
-
- string shortCode = $"{json["shortCode"]}";
- string evaluationId = $"{json["evaluationId"]}";
- Expression<Func<EvaluationClient, bool>> predicate = x => true;
- if (!string.IsNullOrEmpty(shortCode))
- {
- var codePredicate = ExpressionHelper.Or<EvaluationClient>(
- x => !string.IsNullOrWhiteSpace(x.shortCode) && x.shortCode == shortCode,
- x => !string.IsNullOrWhiteSpace(x.password) && x.password == shortCode
- );
- predicate= predicate.And(codePredicate);
- }
- else {
- return Ok(new { code = 400,msg="必须输入开卷码" });
- }
- if (!string.IsNullOrWhiteSpace(evaluationId))
- {
- predicate= predicate.And(x => x.id!.Equals(evaluationId));
- }
- IEnumerable<EvaluationClient> evaluationClients = _liteDBFactory.GetLiteDatabase().GetCollection<EvaluationClient>().Find(predicate);
- EvaluationClient? evaluationLocal = null;
- EvaluationClient? evaluationCloud = null;
- if (evaluationClients.Count()>0)
- {
- evaluationLocal= evaluationClients.First();
- }
- //如果要访问中心,则需要教师登录联网。
- var token = GetAuthTokenInfo();
- if (token.scope.Equals(ExamConstant.ScopeTeacher))
- {
- if ( _connectionService.dataCenterIsConnected)
- {
- Teacher teacher= _liteDBFactory.GetLiteDatabase().GetCollection<Teacher>().FindOne(x => x.id!.Equals(token.id));
- string? CenterUrl = _configuration.GetValue<string>("ExamServer:CenterUrl");
- var client = _httpClientFactory.CreateClient();
- if (client.DefaultRequestHeaders.Contains(Constant._X_Auth_AuthToken))
- {
- client.DefaultRequestHeaders.Remove(Constant._X_Auth_AuthToken);
- }
- client.DefaultRequestHeaders.Add(Constant._X_Auth_AuthToken, teacher.x_auth_token);
- HttpResponseMessage message = await client.PostAsJsonAsync($"{CenterUrl}/evaluation-sync/find-sync-info",new { shortCode, evaluationId });
- if (message.IsSuccessStatusCode)
- {
- string content = await message.Content.ReadAsStringAsync();
- JsonNode? jsonNode =JsonSerializer.Deserialize<JsonNode>(content);
- if (jsonNode!=null)
- {
- evaluationCloud= JsonSerializer.Deserialize<EvaluationClient>(jsonNode["evaluation"]);
- }
- }
- }
- }
- //数据,文件,页面 0 没有更新,1 有更新
- int data = 0,blob=0,webview=0,status=0;
- long dataSize = 0, blobSize=0 , webviewSize=0;
- if (evaluationLocal== null && evaluationCloud==null)
- {
- //线上线下没有数据
- status=1;
-
- }
- else if (evaluationLocal!=null && evaluationCloud!=null)
- {
- //线上线下有数据
- status = 2;
- if ((!string.IsNullOrWhiteSpace(evaluationLocal.blobHash) && !evaluationLocal.blobHash.Equals(evaluationCloud.blobHash))
- ||(evaluationLocal.blobTime<evaluationCloud.blobTime)
- ||(evaluationLocal.blobCount!= evaluationCloud.blobCount)
- ||(evaluationLocal.blobSize!= evaluationCloud.blobSize))
- {
- blob=1;
- blobSize=evaluationCloud.blobSize;
- }
- if ((evaluationLocal.dataTime<evaluationCloud.dataTime)
- ||(evaluationLocal.dataSize!=evaluationCloud.dataSize))
- {
- data=1;
- dataSize=evaluationCloud.dataSize;
- }
- if ((evaluationLocal.webviewCount!=evaluationCloud.webviewCount)
- ||(evaluationLocal.webviewSize!= evaluationCloud.webviewSize)
- ||(evaluationLocal.webviewTime!= evaluationCloud.webviewTime)
- ||(!string.IsNullOrWhiteSpace(evaluationLocal.webviewPath)&& !evaluationLocal.webviewPath.Equals(evaluationCloud.webviewPath)))
- {
- webview=1;
- webviewSize=evaluationCloud.webviewSize;
- }
- }
- else if (evaluationLocal!=null && evaluationCloud==null)
- {
- //线下有数据,线上没有数据,可能没联网。
- status = 3;
- }
- else if (evaluationLocal==null && evaluationCloud!=null)
- {
- //线下没有数据,线上有数据
- evaluationLocal= evaluationCloud;
- blob=1;
- data=1;
- webview=1;
- blobSize=evaluationCloud.blobSize;
- dataSize=evaluationCloud.dataSize;
- webviewSize=evaluationCloud.webviewSize;
- status = 4;
- _liteDBFactory.GetLiteDatabase().GetCollection<EvaluationClient>().Insert(evaluationLocal);
- }
- List<int> file_intact = new List<int>();
- if (evaluationLocal!=null)
- {
- //校验本地文件数据
- string packagePath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "package");
- if (!Directory.Exists(packagePath))
- Directory.CreateDirectory(packagePath);
- string evaluationPath = Path.Combine(packagePath, evaluationLocal.id!);
- await Task.Delay(DelayMacro);
- if (!System.IO.File.Exists(Path.Combine(evaluationPath, "evaluation.json")))
- {
- file_intact.Add(0);
- }
- await Task.Delay(DelayMacro);
- if (!System.IO.File.Exists(Path.Combine(evaluationPath, "groupList.json")))
- {
- file_intact.Add(0);
- }
- await Task.Delay(DelayMacro);
- if (!System.IO.File.Exists(Path.Combine(evaluationPath, "source.json")))
- {
- file_intact.Add(0);
- }
- await Task.Delay(DelayMacro);
- }
- return Ok(new {code=200, evaluation= evaluationLocal,data,blob,webview,dataSize,blobSize,webviewSize,status });
- }
- /// <summary>
- /// 激活考试
- /// </summary>
- /// <param name="json"></param>
- /// <returns></returns>
- [HttpPost("activate-evaluation")]
- public IActionResult ActivateEvaluation(JsonNode json)
- {
- string id = $"{json["id"]}";
- string shortCode = $"{json["shortCode"]}";
- if (!string.IsNullOrWhiteSpace(id) && !string.IsNullOrWhiteSpace(shortCode))
- {
- EvaluationClient evaluationClient = _liteDBFactory.GetLiteDatabase().GetCollection<EvaluationClient>().FindOne(x => x.id!.Equals(id) && !string.IsNullOrWhiteSpace(x.shortCode) && x.shortCode.Equals(shortCode));
- if (evaluationClient != null)
- {
- }
- }
- return Ok();
- }
- /// <summary>
- /// 加载本地的活动列表
- /// </summary>
- /// <param name="json"></param>
- /// <returns></returns>
- [HttpPost("list-local-evaluation")]
- public IActionResult ListLocalEvaluation(JsonNode json)
- {
- IEnumerable<EvaluationClient> evaluationClients = _liteDBFactory.GetLiteDatabase().GetCollection<EvaluationClient>().FindAll().OrderByDescending(x=>x.activate).ThenByDescending(x=>x.stime);
- var result = evaluationClients.Select(client =>
- {
- var properties = client.GetType().GetProperties();
- var anonymousObject = new Dictionary<string, object?>();
- foreach (var property in properties)
- {
- if (!property.Name .Equals("password") && !property.Name.Equals("shortCode"))
- {
- anonymousObject[property.Name] = property.GetValue(client);
- }
- }
- return anonymousObject;
- });
- return Ok(new {code=200, evaluation= result });
- }
- }
- }
|