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;
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/Base/[action]")]
public IActionResult GetEntitys()
{
Assembly assembly = Assembly.Load("Tiger.Model");
Type[] types = assembly.GetTypes();
var entitys = types.Where(q => q.GetInterfaces().Contains(typeof(Model.iEntity)) && q.IsClass).ToList();
var data = entitys.Select(q => new
{
q.Namespace,
q.FullName,
Properties = q.GetProperties().Select(p => new { p.Name, 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
}