using System; using System.Threading.Tasks; using Microsoft.AspNetCore.Cors; using Microsoft.AspNetCore.Mvc; using System.IO; using System.Reflection; using Rhea.Common; using Tiger.IBusiness; using System.Threading; using System.Linq; using Tiger.Model; using System.Xml.Linq; using System.ComponentModel; namespace Tiger.Api.Controllers.Base { /// /// Api系统服务 /// [EnableCors("Any")] [ApiController] public partial class SystemController : ControllerBase { /// /// 获取Api的电脑时间 /// /// [HttpGet] [Route("System/Base/[action]")] public IActionResult GetApiTimeAsync() { return Ok(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss.fff")); } /// /// 获取Api版本 /// /// [HttpGet] [Route("System/Base/[action]")] public IActionResult GetVersion() { return Ok(Assembly.GetExecutingAssembly().GetName().Version.ToString()); } /// /// 获取Api公司 /// /// [HttpGet] [Route("System/Base/[action]")] public IActionResult GetCompany() { return Ok((Attribute.GetCustomAttribute(Assembly.GetExecutingAssembly(), typeof(AssemblyCompanyAttribute)) as AssemblyCompanyAttribute).Company); } /// /// 获取Api版权 /// /// [HttpGet] [Route("System/Base/[action]")] public IActionResult GetCopyright() { return Ok((Attribute.GetCustomAttribute(Assembly.GetExecutingAssembly(), typeof(AssemblyCopyrightAttribute)) as AssemblyCopyrightAttribute).Copyright); } /// /// 获取Api说明 /// /// [HttpGet] [Route("System/Base/[action]")] public IActionResult GetDescription() { return Ok((Attribute.GetCustomAttribute(Assembly.GetExecutingAssembly(), typeof(AssemblyDescriptionAttribute)) as AssemblyDescriptionAttribute).Description); } /// /// 获取Api产品 /// /// [HttpGet] [Route("System/Base/[action]")] public IActionResult GetProduct() { return Ok((Attribute.GetCustomAttribute(Assembly.GetExecutingAssembly(), typeof(AssemblyProductAttribute)) as AssemblyProductAttribute).Product); } /// /// 获取Api产品 /// /// [HttpGet] [Route("System/Base/[action]")] public IActionResult GetMachineCode() { return Ok(DI.Resolve().GetMachineCode()); } /// /// 获取Api产品 /// /// [HttpGet] [Route("System/Entitys/Get")] public IActionResult GetEntitys(string? Namespace, string? StartWith) { Assembly assembly = Assembly.Load("Tiger.Model"); Type[] types = assembly.GetTypes(); var entitys = types.Where(q => q.IsClass && q.GetInterfaces().Contains(typeof(Model.iEntity)) //&& q.Namespace != "Tiger.Model.Minsun" && (Namespace.IsNullOrEmpty() || q.Namespace == Namespace) && (StartWith.IsNullOrEmpty() || q.Name.StartsWith(StartWith)) && !q.GetCustomAttributes(typeof(EntityBase), false).Any()).ToList(); var data = new { Total = entitys.Count, Data = entitys.Select(q => new { q.FullName, q.Namespace, q.Name, DisplayName = (q.GetCustomAttribute(typeof(DisplayNameAttribute)) as DisplayNameAttribute)?.DisplayName, Properties = q.GetProperties().Select(p => new { p.Name, DisplayName = (p.GetCustomAttribute(typeof(DisplayNameAttribute)) as DisplayNameAttribute)?.DisplayName, Type = p.PropertyType.Name }).ToList() }) }; return Ok(data); } /// /// GetCertification(ApiAction) /// 在注册表HKEY_LOCAL_MACHINE\SOFTWARE\TigerClouds节点中读取密钥证书 /// /// /// [HttpPost] [Route("System/Authorization/[action]")] public IActionResult GetCertification([FromBody] ApiAction action) { ApiAction response; try { var cer = DI.Resolve().GetTigerActive().GetCertification(); response = action.GetResponse(new ApiAction(cer.IsNullOrEmpty() ? "未找到密钥证书" : "获取密钥证书成功", cer)); } catch (System.Exception ex) { response = action.GetResponse().CatchExceptionWithLog(ex, "获取密钥证书异常", null); } return Ok(response); } /// /// SetCertification(ApiAction(Data:key)) /// 在注册表HKEY_LOCAL_MACHINE\SOFTWARE\TigerClouds节点中写入密钥证书 /// /// /// [HttpPost] [Route("System/Authorization/[action]")] public IActionResult SetCertification([FromBody] ApiAction action) { ApiAction response; try { DI.Resolve().GetTigerActive().SetCertification(action.Data?.ToString()); response = action.GetResponse(new ApiAction("写入密钥证书成功")); } catch (System.Exception ex) { response = action.GetResponse().CatchExceptionWithLog(ex, "写入密钥证书异常", null); } return Ok(response); } /// /// GetActivationCode(ApiAction) /// 在注册表HKEY_LOCAL_MACHINE\SOFTWARE\TigerClouds节点中读取激活码 /// /// /// [HttpPost] [Route("System/Authorization/[action]")] public IActionResult GetActivationCode([FromBody] ApiAction action) { ApiAction response; try { var cer = DI.Resolve().GetTigerActive().GetActivationCode(); response = action.GetResponse(new ApiAction(cer.IsNullOrEmpty() ? "未找到激活码" : "获取激活码成功", cer)); } catch (System.Exception ex) { response = action.GetResponse().CatchExceptionWithLog(ex, "获取激活码异常", null); } return Ok(response); } /// /// SetActivationCode(ApiAction(Data:code)) /// 在注册表HKEY_LOCAL_MACHINE\SOFTWARE\TigerClouds节点中写入激活码 /// /// /// [HttpPost] [Route("System/Authorization/[action]")] public IActionResult SetActivationCode([FromBody] ApiAction action) { ApiAction response; try { DI.Resolve().GetTigerActive().SetActivationCode(action.Data?.ToString()); response = action.GetResponse(new ApiAction("写入激活码成功")); } catch (System.Exception ex) { response = action.GetResponse().CatchExceptionWithLog(ex, "写入激活码异常", null); } return Ok(response); } /// /// GetCurLicense(ApiAction) /// 获取许可信息 /// /// /// [HttpPost] [Route("System/Authorization/[action]")] public IActionResult GetCurLicense([FromBody] ApiAction action) { ApiAction response; try { response = action.GetResponse("获取许可信息成功", data: DI.Resolve().GetTigerActive().GetCurLicense()); } catch (System.Exception ex) { response = action.GetResponse().CatchExceptionWithLog(ex, "获取许可信息异常", null); } return Ok(response); } /// /// Active(ApiAction(Data:activationCode)) /// 激活Api /// /// /// [HttpPost] [Route("System/Authorization/[action]")] public IActionResult Active([FromBody] ApiAction action) { ApiAction response; try { response = action.GetResponse(DI.Resolve().GetTigerActive().Active(action.Data?.ToString())); } catch (System.Exception ex) { response = action.GetResponse().CatchExceptionWithLog(ex, "激活Api异常"); } return Ok(response); } /// /// Verify(ApiAction) /// 验证Api是否已激活 /// /// /// [HttpPost] [Route("System/Authorization/[action]")] public IActionResult Verify([FromBody] ApiAction action) { ApiAction response; try { response = action.GetResponse(DI.Resolve().GetTigerActive().Verify()); } catch (System.Exception ex) { response = action.GetResponse().CatchExceptionWithLog(ex, "验证Api是否已激活异常"); } return Ok(response); } #region Function /// /// 获取到文件流结果 /// /// FileInfo文件 /// 返回FileStreamResult private async Task GetFileStreamResultAsync(FileInfo fileInfo) { if (fileInfo == null) return NotFound(); var memoryStream = new MemoryStream(); using (var stream = new FileStream(fileInfo.FullName, FileMode.Open)) { await stream.CopyToAsync(memoryStream); } memoryStream.Seek(0, SeekOrigin.Begin); //文件名必须编码,否则会有特殊字符(如中文)无法在此下载。 string encodeFilename = System.Net.WebUtility.UrlEncode(fileInfo.Name); Response.Headers.Add("Content-Disposition", "attachment; filename=" + encodeFilename); return new FileStreamResult(memoryStream, "application/octet-stream");//文件流方式,指定文件流对应的ContenType。 } /// /// 获取到文件流结果 /// /// FileInfo文件 /// 返回FileStreamResult private IActionResult GetFileStreamResult(FileInfo fileInfo) { if (fileInfo == null) return NotFound(); var memoryStream = new MemoryStream(); using (var stream = new FileStream(fileInfo.FullName, FileMode.Open)) { stream.CopyTo(memoryStream); } memoryStream.Seek(0, SeekOrigin.Begin); //文件名必须编码,否则会有特殊字符(如中文)无法在此下载。 string encodeFilename = System.Net.WebUtility.UrlEncode(fileInfo.Name); Response.Headers.Add("Content-Disposition", "attachment; filename=" + encodeFilename); return new FileStreamResult(memoryStream, "application/octet-stream");//文件流方式,指定文件流对应的ContenType。 } /// /// 分段下载数据 /// /// FileInfo文件 /// 返回响应结果 private async Task SegmentDownloadFileAsync(FileInfo fileInfo) { if (fileInfo == null) return NotFound(); int index = 0; using (FileStream fs = new FileStream(fileInfo.FullName, FileMode.Open)) { if (fs.Length <= 0) { return Ok(new { code = -1, msg = "文件尚未处理" }); } int shardSize = 1 * 1024 * 1024;//一次1M int count = (int)(fs.Length / shardSize); if ((fs.Length % shardSize) > 0) { count += 1; } if (index > count - 1) { return Ok(new { code = -1, msg = "无效的下标" }); } fs.Seek(index * shardSize, SeekOrigin.Begin); if (index == count - 1) { //最后一片 = 总长 - (每次片段大小 * 已下载片段个数) shardSize = (int)(fs.Length - (shardSize * index)); } byte[] datas = new byte[shardSize]; await fs.ReadAsync(datas.AsMemory(0, datas.Length)); return File(datas, "application/octet-stream"); } } /// /// 分段下载数据 /// /// FileInfo文件 /// 返回响应结果 private IActionResult SegmentDownloadFile(FileInfo fileInfo) { if (fileInfo == null) return NotFound(); int index = 0; using (FileStream fs = new FileStream(fileInfo.FullName, FileMode.Open)) { if (fs.Length <= 0) { return Ok(new { code = -1, msg = "文件尚未处理" }); } int shardSize = 1 * 1024 * 1024;//一次1M int count = (int)(fs.Length / shardSize); if ((fs.Length % shardSize) > 0) { count += 1; } if (index > count - 1) { return Ok(new { code = -1, msg = "无效的下标" }); } fs.Seek(index * shardSize, SeekOrigin.Begin); if (index == count - 1) { //最后一片 = 总长 - (每次片段大小 * 已下载片段个数) shardSize = (int)(fs.Length - (shardSize * index)); } byte[] datas = new byte[shardSize]; fs.Read(datas, 0, datas.Length); return File(datas, "application/octet-stream"); } } #endregion }//endClass }