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
|
{
|
/// <summary>
|
/// Api系统服务
|
/// </summary>
|
[EnableCors("Any")]
|
[ApiController]
|
public partial class SystemController : ControllerBase
|
{
|
/// <summary>
|
/// 获取Api的电脑时间
|
/// </summary>
|
/// <returns></returns>
|
[HttpGet]
|
[Route("System/Base/[action]")]
|
public IActionResult GetApiTimeAsync()
|
{
|
return Ok(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss.fff"));
|
}
|
|
/// <summary>
|
/// 获取Api版本
|
/// </summary>
|
/// <returns></returns>
|
[HttpGet]
|
[Route("System/Base/[action]")]
|
public IActionResult GetVersion()
|
{
|
return Ok(Assembly.GetExecutingAssembly().GetName().Version.ToString());
|
}
|
|
/// <summary>
|
/// 获取Api公司
|
/// </summary>
|
/// <returns></returns>
|
[HttpGet]
|
[Route("System/Base/[action]")]
|
public IActionResult GetCompany()
|
{
|
return Ok((Attribute.GetCustomAttribute(Assembly.GetExecutingAssembly(), typeof(AssemblyCompanyAttribute)) as AssemblyCompanyAttribute).Company);
|
}
|
|
/// <summary>
|
/// 获取Api版权
|
/// </summary>
|
/// <returns></returns>
|
[HttpGet]
|
[Route("System/Base/[action]")]
|
public IActionResult GetCopyright()
|
{
|
return Ok((Attribute.GetCustomAttribute(Assembly.GetExecutingAssembly(), typeof(AssemblyCopyrightAttribute)) as AssemblyCopyrightAttribute).Copyright);
|
}
|
|
/// <summary>
|
/// 获取Api说明
|
/// </summary>
|
/// <returns></returns>
|
[HttpGet]
|
[Route("System/Base/[action]")]
|
public IActionResult GetDescription()
|
{
|
return Ok((Attribute.GetCustomAttribute(Assembly.GetExecutingAssembly(), typeof(AssemblyDescriptionAttribute)) as AssemblyDescriptionAttribute).Description);
|
}
|
|
/// <summary>
|
/// 获取Api产品
|
/// </summary>
|
/// <returns></returns>
|
[HttpGet]
|
[Route("System/Base/[action]")]
|
public IActionResult GetProduct()
|
{
|
return Ok((Attribute.GetCustomAttribute(Assembly.GetExecutingAssembly(), typeof(AssemblyProductAttribute)) as AssemblyProductAttribute).Product);
|
}
|
|
/// <summary>
|
/// 获取Api产品
|
/// </summary>
|
/// <returns></returns>
|
[HttpGet]
|
[Route("System/Base/[action]")]
|
public IActionResult GetMachineCode()
|
{
|
return Ok(DI.Resolve<IBizContext>().GetMachineCode());
|
}
|
|
/// <summary>
|
/// 获取Api产品
|
/// </summary>
|
/// <returns></returns>
|
[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);
|
}
|
|
/// <summary>
|
/// GetCertification(ApiAction)
|
/// 在注册表HKEY_LOCAL_MACHINE\SOFTWARE\TigerClouds节点中读取密钥证书
|
/// </summary>
|
/// <param name="action"></param>
|
/// <returns></returns>
|
[HttpPost]
|
[Route("System/Authorization/[action]")]
|
public IActionResult GetCertification([FromBody] ApiAction action)
|
{
|
ApiAction response;
|
try
|
{
|
var cer = DI.Resolve<IBizContext>().GetTigerActive().GetCertification();
|
response = action.GetResponse(new ApiAction(cer.IsNullOrEmpty() ? "未找到密钥证书" : "获取密钥证书成功", cer));
|
}
|
catch (System.Exception ex)
|
{
|
response = action.GetResponse().CatchExceptionWithLog(ex, "获取密钥证书异常", null);
|
}
|
return Ok(response);
|
}
|
|
/// <summary>
|
/// SetCertification(ApiAction(Data:key))
|
/// 在注册表HKEY_LOCAL_MACHINE\SOFTWARE\TigerClouds节点中写入密钥证书
|
/// </summary>
|
/// <param name="action"></param>
|
/// <returns></returns>
|
[HttpPost]
|
[Route("System/Authorization/[action]")]
|
public IActionResult SetCertification([FromBody] ApiAction action)
|
{
|
ApiAction response;
|
try
|
{
|
DI.Resolve<IBizContext>().GetTigerActive().SetCertification(action.Data?.ToString());
|
response = action.GetResponse(new ApiAction("写入密钥证书成功"));
|
}
|
catch (System.Exception ex)
|
{
|
response = action.GetResponse().CatchExceptionWithLog(ex, "写入密钥证书异常", null);
|
}
|
return Ok(response);
|
}
|
|
/// <summary>
|
/// GetActivationCode(ApiAction)
|
/// 在注册表HKEY_LOCAL_MACHINE\SOFTWARE\TigerClouds节点中读取激活码
|
/// </summary>
|
/// <param name="action"></param>
|
/// <returns></returns>
|
[HttpPost]
|
[Route("System/Authorization/[action]")]
|
public IActionResult GetActivationCode([FromBody] ApiAction action)
|
{
|
ApiAction response;
|
try
|
{
|
var cer = DI.Resolve<IBizContext>().GetTigerActive().GetActivationCode();
|
response = action.GetResponse(new ApiAction(cer.IsNullOrEmpty() ? "未找到激活码" : "获取激活码成功", cer));
|
}
|
catch (System.Exception ex)
|
{
|
response = action.GetResponse().CatchExceptionWithLog(ex, "获取激活码异常", null);
|
}
|
return Ok(response);
|
}
|
|
/// <summary>
|
/// SetActivationCode(ApiAction(Data:code))
|
/// 在注册表HKEY_LOCAL_MACHINE\SOFTWARE\TigerClouds节点中写入激活码
|
/// </summary>
|
/// <param name="action"></param>
|
/// <returns></returns>
|
[HttpPost]
|
[Route("System/Authorization/[action]")]
|
public IActionResult SetActivationCode([FromBody] ApiAction action)
|
{
|
ApiAction response;
|
try
|
{
|
DI.Resolve<IBizContext>().GetTigerActive().SetActivationCode(action.Data?.ToString());
|
response = action.GetResponse(new ApiAction("写入激活码成功"));
|
}
|
catch (System.Exception ex)
|
{
|
response = action.GetResponse().CatchExceptionWithLog(ex, "写入激活码异常", null);
|
}
|
return Ok(response);
|
}
|
|
/// <summary>
|
/// GetCurLicense(ApiAction)
|
/// 获取许可信息
|
/// </summary>
|
/// <param name="action"></param>
|
/// <returns></returns>
|
[HttpPost]
|
[Route("System/Authorization/[action]")]
|
public IActionResult GetCurLicense([FromBody] ApiAction action)
|
{
|
ApiAction response;
|
try
|
{
|
response = action.GetResponse("获取许可信息成功", data: DI.Resolve<IBizContext>().GetTigerActive().GetCurLicense());
|
}
|
catch (System.Exception ex)
|
{
|
response = action.GetResponse().CatchExceptionWithLog(ex, "获取许可信息异常", null);
|
}
|
return Ok(response);
|
}
|
|
/// <summary>
|
/// Active(ApiAction(Data:activationCode))
|
/// 激活Api
|
/// </summary>
|
/// <param name="action"></param>
|
/// <returns></returns>
|
[HttpPost]
|
[Route("System/Authorization/[action]")]
|
public IActionResult Active([FromBody] ApiAction action)
|
{
|
ApiAction response;
|
try
|
{
|
response = action.GetResponse(DI.Resolve<IBizContext>().GetTigerActive().Active(action.Data?.ToString()));
|
}
|
catch (System.Exception ex)
|
{
|
response = action.GetResponse().CatchExceptionWithLog(ex, "激活Api异常");
|
}
|
return Ok(response);
|
}
|
|
/// <summary>
|
/// Verify(ApiAction)
|
/// 验证Api是否已激活
|
/// </summary>
|
/// <param name="action"></param>
|
/// <returns></returns>
|
[HttpPost]
|
[Route("System/Authorization/[action]")]
|
public IActionResult Verify([FromBody] ApiAction action)
|
{
|
ApiAction response;
|
try
|
{
|
response = action.GetResponse(DI.Resolve<IBizContext>().GetTigerActive().Verify());
|
}
|
catch (System.Exception ex)
|
{
|
response = action.GetResponse().CatchExceptionWithLog(ex, "验证Api是否已激活异常");
|
}
|
return Ok(response);
|
}
|
|
#region Function
|
/// <summary>
|
/// 获取到文件流结果
|
/// </summary>
|
/// <param name="fileInfo">FileInfo文件</param>
|
/// <returns>返回FileStreamResult</returns>
|
private async Task<IActionResult> 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。
|
}
|
|
/// <summary>
|
/// 获取到文件流结果
|
/// </summary>
|
/// <param name="fileInfo">FileInfo文件</param>
|
/// <returns>返回FileStreamResult</returns>
|
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。
|
}
|
|
/// <summary>
|
/// 分段下载数据
|
/// </summary>
|
/// <param name="fileInfo">FileInfo文件</param>
|
/// <returns>返回响应结果</returns>
|
private async Task<IActionResult> 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");
|
}
|
}
|
|
/// <summary>
|
/// 分段下载数据
|
/// </summary>
|
/// <param name="fileInfo">FileInfo文件</param>
|
/// <returns>返回响应结果</returns>
|
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
|
}
|