添加缩略图同步功能
This commit is contained in:
@@ -270,29 +270,37 @@
|
|||||||
文件
|
文件
|
||||||
</summary>
|
</summary>
|
||||||
</member>
|
</member>
|
||||||
<member name="M:Yi.Framework.ApiMicroservice.Controllers.FileController.#ctor(Yi.Framework.Interface.IFileService,Microsoft.Extensions.Hosting.IHostEnvironment)">
|
<member name="M:Yi.Framework.ApiMicroservice.Controllers.FileController.#ctor(Yi.Framework.Interface.IFileService,Microsoft.Extensions.Hosting.IHostEnvironment,Yi.Framework.Core.ThumbnailSharpInvoer)">
|
||||||
<summary>
|
<summary>
|
||||||
文件上传下载
|
文件上传下载
|
||||||
</summary>
|
</summary>
|
||||||
<param name="iFileService"></param>
|
<param name="iFileService"></param>
|
||||||
<param name="env"></param>
|
<param name="env"></param>
|
||||||
|
<param name="thumbnailSharpInvoer"></param>
|
||||||
</member>
|
</member>
|
||||||
<member name="M:Yi.Framework.ApiMicroservice.Controllers.FileController.Get(System.Int64)">
|
<member name="M:Yi.Framework.ApiMicroservice.Controllers.FileController.Get(System.Int64,System.Nullable{System.Boolean})">
|
||||||
<summary>
|
<summary>
|
||||||
文件下载,只需用文件code即可
|
文件下载,只需用文件code即可,可选择是否为缩略图
|
||||||
</summary>
|
</summary>
|
||||||
<param name="code"></param>
|
<param name="code"></param>
|
||||||
|
<param name="isThumbnail"></param>
|
||||||
<returns></returns>
|
<returns></returns>
|
||||||
</member>
|
</member>
|
||||||
<member name="M:Yi.Framework.ApiMicroservice.Controllers.FileController.Upload(System.String,Microsoft.AspNetCore.Http.IFormFileCollection,System.String)">
|
<member name="M:Yi.Framework.ApiMicroservice.Controllers.FileController.Upload(System.String,Microsoft.AspNetCore.Http.IFormFileCollection,System.String)">
|
||||||
<summary>
|
<summary>
|
||||||
多文件上传,type可空,默认上传至File文件夹下,swagger返回雪花id精度是有问题的
|
多文件上传,type可空,默认上传至File文件夹下,swagger返回雪花id精度是有问题的,同时如果时图片类型,还需要进行缩略图制作
|
||||||
</summary>
|
</summary>
|
||||||
<param name="type">文件类型,可空</param>
|
<param name="type">文件类型,可空</param>
|
||||||
<param name="file">多文件表单</param>
|
<param name="file">多文件表单</param>
|
||||||
<param name="remark">描述</param>
|
<param name="remark">描述</param>
|
||||||
<returns></returns>
|
<returns></returns>
|
||||||
</member>
|
</member>
|
||||||
|
<member name="M:Yi.Framework.ApiMicroservice.Controllers.FileController.ThumbnailSync">
|
||||||
|
<summary>
|
||||||
|
一键同步图片到缩略图
|
||||||
|
</summary>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
<member name="M:Yi.Framework.ApiMicroservice.Controllers.LogController.Add">
|
<member name="M:Yi.Framework.ApiMicroservice.Controllers.LogController.Add">
|
||||||
<summary>
|
<summary>
|
||||||
自动分表,日志添加
|
自动分表,日志添加
|
||||||
@@ -438,7 +446,7 @@
|
|||||||
测试控制器
|
测试控制器
|
||||||
</summary>
|
</summary>
|
||||||
</member>
|
</member>
|
||||||
<member name="M:Yi.Framework.ApiMicroservice.Controllers.TestController.#ctor(Microsoft.AspNetCore.SignalR.IHubContext{Yi.Framework.WebCore.SignalRHub.MainHub},Microsoft.Extensions.Logging.ILogger{Yi.Framework.Model.Models.UserEntity},Yi.Framework.Interface.IRoleService,Yi.Framework.Interface.IUserService,Microsoft.Extensions.Localization.IStringLocalizer{Yi.Framework.Language.LocalLanguage},Yi.Framework.Core.QuartzInvoker)">
|
<member name="M:Yi.Framework.ApiMicroservice.Controllers.TestController.#ctor(Microsoft.AspNetCore.SignalR.IHubContext{Yi.Framework.WebCore.SignalRHub.MainHub},Microsoft.Extensions.Logging.ILogger{Yi.Framework.Model.Models.UserEntity},Yi.Framework.Interface.IRoleService,Yi.Framework.Interface.IUserService,Microsoft.Extensions.Localization.IStringLocalizer{Yi.Framework.Language.LocalLanguage},Yi.Framework.Core.QuartzInvoker,Yi.Framework.Core.ThumbnailSharpInvoer)">
|
||||||
<summary>
|
<summary>
|
||||||
依赖注入
|
依赖注入
|
||||||
</summary>
|
</summary>
|
||||||
@@ -448,6 +456,7 @@
|
|||||||
<param name="iUserService"></param>
|
<param name="iUserService"></param>
|
||||||
<param name="local"></param>
|
<param name="local"></param>
|
||||||
<param name="quartzInvoker"></param>
|
<param name="quartzInvoker"></param>
|
||||||
|
<param name="thumbnailSharpInvoer"></param>
|
||||||
</member>
|
</member>
|
||||||
<member name="M:Yi.Framework.ApiMicroservice.Controllers.TestController.Swagger">
|
<member name="M:Yi.Framework.ApiMicroservice.Controllers.TestController.Swagger">
|
||||||
<summary>
|
<summary>
|
||||||
@@ -547,6 +556,12 @@
|
|||||||
<param name="msg"></param>
|
<param name="msg"></param>
|
||||||
<returns></returns>
|
<returns></returns>
|
||||||
</member>
|
</member>
|
||||||
|
<member name="M:Yi.Framework.ApiMicroservice.Controllers.TestController.ThumbnailTest">
|
||||||
|
<summary>
|
||||||
|
缩略图测试,需要生成前及生成后的路径
|
||||||
|
</summary>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
<member name="T:Yi.Framework.ApiMicroservice.Controllers.UserController">
|
<member name="T:Yi.Framework.ApiMicroservice.Controllers.UserController">
|
||||||
<summary>
|
<summary>
|
||||||
用户管理
|
用户管理
|
||||||
|
|||||||
@@ -11,7 +11,9 @@ using System.Linq;
|
|||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Yi.Framework.Common.Const;
|
using Yi.Framework.Common.Const;
|
||||||
using Yi.Framework.Common.Enum;
|
using Yi.Framework.Common.Enum;
|
||||||
|
using Yi.Framework.Common.Helper;
|
||||||
using Yi.Framework.Common.Models;
|
using Yi.Framework.Common.Models;
|
||||||
|
using Yi.Framework.Core;
|
||||||
using Yi.Framework.Interface;
|
using Yi.Framework.Interface;
|
||||||
using Yi.Framework.Model.Models;
|
using Yi.Framework.Model.Models;
|
||||||
using Yi.Framework.WebCore;
|
using Yi.Framework.WebCore;
|
||||||
@@ -27,26 +29,30 @@ namespace Yi.Framework.ApiMicroservice.Controllers
|
|||||||
{
|
{
|
||||||
private IFileService _iFileService;
|
private IFileService _iFileService;
|
||||||
private readonly IHostEnvironment _env;
|
private readonly IHostEnvironment _env;
|
||||||
|
private ThumbnailSharpInvoer _thumbnailSharpInvoer;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 文件上传下载
|
/// 文件上传下载
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="iFileService"></param>
|
/// <param name="iFileService"></param>
|
||||||
/// <param name="env"></param>
|
/// <param name="env"></param>
|
||||||
public FileController(IFileService iFileService, IHostEnvironment env)
|
/// <param name="thumbnailSharpInvoer"></param>
|
||||||
|
public FileController(IFileService iFileService, IHostEnvironment env, ThumbnailSharpInvoer thumbnailSharpInvoer)
|
||||||
{
|
{
|
||||||
_iFileService = iFileService;
|
_iFileService = iFileService;
|
||||||
_env = env;
|
_env = env;
|
||||||
|
_thumbnailSharpInvoer = thumbnailSharpInvoer;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 文件下载,只需用文件code即可
|
/// 文件下载,只需用文件code即可,可选择是否为缩略图
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="code"></param>
|
/// <param name="code"></param>
|
||||||
|
/// <param name="isThumbnail"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
[Route("/api/file/{code}")]
|
[Route("/api/file/{code}/{isThumbnail?}")]
|
||||||
[HttpGet]
|
[HttpGet]
|
||||||
public async Task<IActionResult> Get(long code)
|
public async Task<IActionResult> Get(long code, bool? isThumbnail)
|
||||||
{
|
{
|
||||||
var file = await _iFileService._repository.GetByIdAsync(code);
|
var file = await _iFileService._repository.GetByIdAsync(code);
|
||||||
if (file is null)
|
if (file is null)
|
||||||
@@ -55,6 +61,11 @@ namespace Yi.Framework.ApiMicroservice.Controllers
|
|||||||
}
|
}
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
//如果为缩略图
|
||||||
|
if (isThumbnail is true)
|
||||||
|
{
|
||||||
|
file.FilePath = PathEnum.Thumbnail.ToString();
|
||||||
|
}
|
||||||
//路径为: 文件路径/文件id+文件扩展名
|
//路径为: 文件路径/文件id+文件扩展名
|
||||||
var path = Path.Combine($"{PathConst.wwwroot}/{file.FilePath}", file.Id.ToString() + Path.GetExtension(file.FileName));
|
var path = Path.Combine($"{PathConst.wwwroot}/{file.FilePath}", file.Id.ToString() + Path.GetExtension(file.FileName));
|
||||||
var stream = System.IO.File.OpenRead(path);
|
var stream = System.IO.File.OpenRead(path);
|
||||||
@@ -68,7 +79,7 @@ namespace Yi.Framework.ApiMicroservice.Controllers
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 多文件上传,type可空,默认上传至File文件夹下,swagger返回雪花id精度是有问题的
|
/// 多文件上传,type可空,默认上传至File文件夹下,swagger返回雪花id精度是有问题的,同时如果时图片类型,还需要进行缩略图制作
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="type">文件类型,可空</param>
|
/// <param name="type">文件类型,可空</param>
|
||||||
/// <param name="file">多文件表单</param>
|
/// <param name="file">多文件表单</param>
|
||||||
@@ -117,10 +128,30 @@ namespace Yi.Framework.ApiMicroservice.Controllers
|
|||||||
{
|
{
|
||||||
Directory.CreateDirectory(typePath);
|
Directory.CreateDirectory(typePath);
|
||||||
}
|
}
|
||||||
using (var stream = new FileStream(Path.Combine(typePath, filename), FileMode.CreateNew, FileAccess.Write))
|
|
||||||
|
//生成文件
|
||||||
|
using (var stream = new FileStream(Path.Combine(typePath, filename), FileMode.CreateNew, FileAccess.ReadWrite))
|
||||||
{
|
{
|
||||||
await f.CopyToAsync(stream);
|
await f.CopyToAsync(stream);
|
||||||
}
|
|
||||||
|
//如果是图片类型,还需要生成缩略图
|
||||||
|
if (PathEnum.Image.ToString().Equals(type))
|
||||||
|
{
|
||||||
|
//保存至缩略图路径
|
||||||
|
var result = _thumbnailSharpInvoer.CreateThumbnailBytes(thumbnailSize: 300,
|
||||||
|
imageStream: stream,
|
||||||
|
imageFormat: Format.Jpeg);
|
||||||
|
string thumbnailPath = $"{PathConst.wwwroot}/{PathEnum.Thumbnail}";
|
||||||
|
if (!Directory.Exists(thumbnailPath))
|
||||||
|
{
|
||||||
|
Directory.CreateDirectory(thumbnailPath);
|
||||||
|
}
|
||||||
|
await System.IO.File.WriteAllBytesAsync(Path.Combine(thumbnailPath, filename), result);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
//将文件信息添加到数据库
|
//将文件信息添加到数据库
|
||||||
datas.Add(data);
|
datas.Add(data);
|
||||||
codes.Add(data.Id);
|
codes.Add(data.Id);
|
||||||
@@ -132,5 +163,44 @@ namespace Yi.Framework.ApiMicroservice.Controllers
|
|||||||
return Result.Error();
|
return Result.Error();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 一键同步图片到缩略图
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
[HttpGet]
|
||||||
|
public async Task<Result> ThumbnailSync()
|
||||||
|
{
|
||||||
|
string typePath = $"{PathConst.wwwroot}/{PathEnum.Image}";
|
||||||
|
string thumbnailPath = $"{PathConst.wwwroot}/{PathEnum.Thumbnail}";
|
||||||
|
List<string> fileNames =FileHelper. GetAllFileNames(typePath);
|
||||||
|
foreach (var filename in fileNames)
|
||||||
|
{
|
||||||
|
if (System.IO.File.Exists(Path.Combine(thumbnailPath, filename)))
|
||||||
|
{
|
||||||
|
//如果缩略图存在,直接跳过
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (!Directory.Exists(typePath))
|
||||||
|
{
|
||||||
|
Directory.CreateDirectory(typePath);
|
||||||
|
}
|
||||||
|
using (var stream = new FileStream(Path.Combine(typePath, filename), FileMode.Open, FileAccess.ReadWrite))
|
||||||
|
{
|
||||||
|
//保存至缩略图路径
|
||||||
|
var result = _thumbnailSharpInvoer.CreateThumbnailBytes(thumbnailSize: 300,
|
||||||
|
imageStream: stream,
|
||||||
|
imageFormat: Format.Jpeg);
|
||||||
|
|
||||||
|
if (!Directory.Exists(thumbnailPath))
|
||||||
|
{
|
||||||
|
Directory.CreateDirectory(thumbnailPath);
|
||||||
|
}
|
||||||
|
await System.IO.File.WriteAllBytesAsync(Path.Combine(thumbnailPath, filename), result);
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
return Result.Success();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ namespace Yi.Framework.ApiMicroservice.Controllers
|
|||||||
private IRoleService _iRoleService;
|
private IRoleService _iRoleService;
|
||||||
private QuartzInvoker _quartzInvoker;
|
private QuartzInvoker _quartzInvoker;
|
||||||
private IHubContext<MainHub> _hub;
|
private IHubContext<MainHub> _hub;
|
||||||
|
private ThumbnailSharpInvoer _thumbnailSharpInvoer;
|
||||||
//你可以依赖注入服务层各各接口,也可以注入其他仓储层,怎么爽怎么来!
|
//你可以依赖注入服务层各各接口,也可以注入其他仓储层,怎么爽怎么来!
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 依赖注入
|
/// 依赖注入
|
||||||
@@ -45,13 +46,15 @@ namespace Yi.Framework.ApiMicroservice.Controllers
|
|||||||
/// <param name="iUserService"></param>
|
/// <param name="iUserService"></param>
|
||||||
/// <param name="local"></param>
|
/// <param name="local"></param>
|
||||||
/// <param name="quartzInvoker"></param>
|
/// <param name="quartzInvoker"></param>
|
||||||
public TestController(IHubContext<MainHub> hub , ILogger<UserEntity> logger, IRoleService iRoleService, IUserService iUserService, IStringLocalizer<LocalLanguage> local, QuartzInvoker quartzInvoker)
|
/// <param name="thumbnailSharpInvoer"></param>
|
||||||
|
public TestController(IHubContext<MainHub> hub, ILogger<UserEntity> logger, IRoleService iRoleService, IUserService iUserService, IStringLocalizer<LocalLanguage> local, QuartzInvoker quartzInvoker, ThumbnailSharpInvoer thumbnailSharpInvoer)
|
||||||
{
|
{
|
||||||
_iUserService = iUserService;
|
_iUserService = iUserService;
|
||||||
_iRoleService = iRoleService;
|
_iRoleService = iRoleService;
|
||||||
_quartzInvoker = quartzInvoker;
|
_quartzInvoker = quartzInvoker;
|
||||||
_hub = hub;
|
_hub = hub;
|
||||||
_local = local;
|
_local = local;
|
||||||
|
_thumbnailSharpInvoer = thumbnailSharpInvoer;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -266,7 +269,7 @@ namespace Yi.Framework.ApiMicroservice.Controllers
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
[HttpGet]
|
[HttpGet]
|
||||||
public Result SeedDb()
|
public Result SeedDb()
|
||||||
{
|
{
|
||||||
var rep = _iUserService._repository;
|
var rep = _iUserService._repository;
|
||||||
return Result.Success().SetStatus(DbSeedExtend.Invoer(rep._Db));
|
return Result.Success().SetStatus(DbSeedExtend.Invoer(rep._Db));
|
||||||
@@ -290,11 +293,33 @@ namespace Yi.Framework.ApiMicroservice.Controllers
|
|||||||
/// <param name="msg"></param>
|
/// <param name="msg"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
[HttpGet]
|
[HttpGet]
|
||||||
public async Task<Result> SignalrTest(int msg)
|
public async Task<Result> SignalrTest(int msg)
|
||||||
{
|
{
|
||||||
await _hub.Clients.All.SendAsync("onlineNum", msg);
|
await _hub.Clients.All.SendAsync("onlineNum", msg);
|
||||||
return Result.Success("向所有连接客户端发送一个消息");
|
return Result.Success("向所有连接客户端发送一个消息");
|
||||||
}
|
}
|
||||||
//job任务与公告管理
|
//job任务与公告管理
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 缩略图测试,需要生成前及生成后的路径
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
[HttpGet]
|
||||||
|
public Result ThumbnailTest()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var path = @"D:\App\test11.jpg";
|
||||||
|
var result = _thumbnailSharpInvoer.CreateThumbnailBytes(thumbnailSize: 300,
|
||||||
|
imageStream: new FileStream(path, FileMode.Open, FileAccess.ReadWrite),
|
||||||
|
imageFormat: Format.Jpeg);
|
||||||
|
System.IO.File.WriteAllBytes(@"D:\App\test222.jpg", result);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
return Result.Error(ex.Message);
|
||||||
|
}
|
||||||
|
return Result.Success();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -137,8 +137,11 @@ builder.Services.AddHeiCaptcha();
|
|||||||
#region
|
#region
|
||||||
//<2F><><EFBFBD><EFBFBD>Http<74><70><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
//<2F><><EFBFBD><EFBFBD>Http<74><70><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
builder.Services.AddHttpContextAccessor();
|
builder.Services.AddHttpContextAccessor();
|
||||||
|
#region
|
||||||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ
|
||||||
|
#endregion
|
||||||
|
builder.Services.AddSingleton<ThumbnailSharpInvoer>();
|
||||||
//-----------------------------------------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------------------------------------
|
||||||
var app = builder.Build();
|
var app = builder.Build();
|
||||||
#region
|
#region
|
||||||
|
|||||||
Binary file not shown.
|
After Width: | Height: | Size: 30 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 153 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 10 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 10 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 6.4 KiB |
Binary file not shown.
@@ -11,6 +11,7 @@ namespace Yi.Framework.Common.Enum
|
|||||||
Excel,
|
Excel,
|
||||||
File,
|
File,
|
||||||
Image,
|
Image,
|
||||||
|
Thumbnail,
|
||||||
Temp
|
Temp
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
@@ -10,6 +11,8 @@ namespace Yi.Framework.Common.Helper
|
|||||||
|
|
||||||
private bool _alreadyDispose = false;
|
private bool _alreadyDispose = false;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#region 构造函数
|
#region 构造函数
|
||||||
public FileHelper()
|
public FileHelper()
|
||||||
{
|
{
|
||||||
@@ -391,5 +394,19 @@ namespace Yi.Framework.Common.Helper
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取目录下全部文件名
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="path"></param>
|
||||||
|
/// <param name="pattern"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static List<string> GetAllFileNames(string path, string pattern = "*")
|
||||||
|
{
|
||||||
|
List<FileInfo> folder = new DirectoryInfo(path).GetFiles(pattern).ToList();
|
||||||
|
|
||||||
|
return folder.Select(x => x.Name).ToList();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ using CSRedis;
|
|||||||
|
|
||||||
namespace Yi.Framework.Core
|
namespace Yi.Framework.Core
|
||||||
{
|
{
|
||||||
public class CacheClientDB
|
public class CacheInvoker
|
||||||
{
|
{
|
||||||
|
|
||||||
public delegate T MyAction<T>(CSRedisClient client);
|
public delegate T MyAction<T>(CSRedisClient client);
|
||||||
@@ -22,7 +22,7 @@ namespace Yi.Framework.Core
|
|||||||
private CSRedisClient Client { get; set; }
|
private CSRedisClient Client { get; set; }
|
||||||
|
|
||||||
public CSRedisClient _Db { get { return Client; } set { } }
|
public CSRedisClient _Db { get { return Client; } set { } }
|
||||||
public CacheClientDB(IOptionsMonitor<RedisConnOptions> redisConnOptions)
|
public CacheInvoker(IOptionsMonitor<RedisConnOptions> redisConnOptions)
|
||||||
{
|
{
|
||||||
this._RedisOptions = redisConnOptions.CurrentValue;
|
this._RedisOptions = redisConnOptions.CurrentValue;
|
||||||
Client = new CSRedisClient($"{_RedisOptions.Host}:{_RedisOptions.Prot},password={_RedisOptions.Password},defaultDatabase ={ _RedisOptions.DB }");
|
Client = new CSRedisClient($"{_RedisOptions.Host}:{_RedisOptions.Prot},password={_RedisOptions.Password},defaultDatabase ={ _RedisOptions.DB }");
|
||||||
410
Yi.Framework.Net6/Yi.Framework.Core/ThumbnailSharpInvoer.cs
Normal file
410
Yi.Framework.Net6/Yi.Framework.Core/ThumbnailSharpInvoer.cs
Normal file
@@ -0,0 +1,410 @@
|
|||||||
|
/*MIT License
|
||||||
|
|
||||||
|
Copyright(c) 2017 Mirza Ghulam Rasyid
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Drawing;
|
||||||
|
using System.Drawing.Drawing2D;
|
||||||
|
using System.Drawing.Imaging;
|
||||||
|
using System.IO;
|
||||||
|
using System.Net.Http;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace Yi.Framework.Core
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Image format to use when creating a thumbnail.
|
||||||
|
/// </summary>
|
||||||
|
public enum Format
|
||||||
|
{
|
||||||
|
Jpeg,
|
||||||
|
Bmp,
|
||||||
|
Png,
|
||||||
|
Gif,
|
||||||
|
Tiff
|
||||||
|
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// Thumbnail class that holds various methods to create an image thumbnail.
|
||||||
|
/// </summary>
|
||||||
|
public class ThumbnailSharpInvoer
|
||||||
|
{
|
||||||
|
private Bitmap CreateBitmapThumbnail(uint thumbnailSize, string imageFileLocation)
|
||||||
|
{
|
||||||
|
Bitmap bitmap = null;
|
||||||
|
Image image = null;
|
||||||
|
float actualHeight = default(float);
|
||||||
|
float actualWidth = default(float);
|
||||||
|
uint thumbnailHeight = default(uint);
|
||||||
|
uint thumbnailWidth = default(uint);
|
||||||
|
try
|
||||||
|
{
|
||||||
|
image = Image.FromFile(imageFileLocation);
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
if (image != null)
|
||||||
|
image = null;
|
||||||
|
}
|
||||||
|
if (image != null)
|
||||||
|
{
|
||||||
|
actualHeight = image.Height;
|
||||||
|
actualWidth = image.Width;
|
||||||
|
if (actualHeight > actualWidth)
|
||||||
|
{
|
||||||
|
if ((uint)actualHeight <= thumbnailSize)
|
||||||
|
throw new Exception("Thumbnail size must be less than actual height (portrait image)");
|
||||||
|
thumbnailHeight = thumbnailSize;
|
||||||
|
thumbnailWidth = (uint)((actualWidth / actualHeight) * thumbnailSize);
|
||||||
|
}
|
||||||
|
else if (actualWidth > actualHeight)
|
||||||
|
{
|
||||||
|
|
||||||
|
if ((uint)actualWidth <= thumbnailSize)
|
||||||
|
throw new Exception("Thumbnail size must be less than actual width (landscape image)");
|
||||||
|
thumbnailWidth = thumbnailSize;
|
||||||
|
thumbnailHeight = (uint)((actualHeight / actualWidth) * thumbnailSize);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ((uint)actualWidth <= thumbnailSize)
|
||||||
|
throw new Exception("Thumbnail size must be less than image's size");
|
||||||
|
thumbnailWidth = thumbnailSize;
|
||||||
|
thumbnailHeight = thumbnailSize;
|
||||||
|
}
|
||||||
|
try
|
||||||
|
{
|
||||||
|
|
||||||
|
bitmap = new Bitmap((int)thumbnailWidth, (int)thumbnailHeight);
|
||||||
|
Graphics resizedImage = Graphics.FromImage(bitmap);
|
||||||
|
resizedImage.InterpolationMode = InterpolationMode.HighQualityBicubic;
|
||||||
|
resizedImage.CompositingQuality = CompositingQuality.HighQuality;
|
||||||
|
resizedImage.SmoothingMode = SmoothingMode.HighQuality;
|
||||||
|
resizedImage.DrawImage(image, 0, 0, thumbnailWidth, thumbnailHeight);
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
if (bitmap != null)
|
||||||
|
bitmap = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return bitmap;
|
||||||
|
}
|
||||||
|
private Bitmap CreateBitmapThumbnail(uint thumbnailSize, Stream imageStream)
|
||||||
|
{
|
||||||
|
Bitmap bitmap = null;
|
||||||
|
Image image = null;
|
||||||
|
float actualHeight = default(float);
|
||||||
|
float actualWidth = default(float);
|
||||||
|
uint thumbnailHeight = default(uint);
|
||||||
|
uint thumbnailWidth = default(uint);
|
||||||
|
try
|
||||||
|
{
|
||||||
|
image = Image.FromStream(imageStream);
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
if (image != null)
|
||||||
|
image = null;
|
||||||
|
}
|
||||||
|
if (image != null)
|
||||||
|
{
|
||||||
|
actualHeight = image.Height;
|
||||||
|
actualWidth = image.Width;
|
||||||
|
if (actualHeight > actualWidth)
|
||||||
|
{
|
||||||
|
if ((uint)actualHeight <= thumbnailSize)
|
||||||
|
throw new Exception("Thumbnail size must be less than actual height (portrait image)");
|
||||||
|
thumbnailHeight = thumbnailSize;
|
||||||
|
thumbnailWidth = (uint)((actualWidth / actualHeight) * thumbnailSize);
|
||||||
|
}
|
||||||
|
else if (actualWidth > actualHeight)
|
||||||
|
{
|
||||||
|
|
||||||
|
if ((uint)actualWidth <= thumbnailSize)
|
||||||
|
throw new Exception("Thumbnail size must be less than actual width (landscape image)");
|
||||||
|
thumbnailWidth = thumbnailSize;
|
||||||
|
thumbnailHeight = (uint)((actualHeight / actualWidth) * thumbnailSize);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ((uint)actualWidth <= thumbnailSize)
|
||||||
|
throw new Exception("Thumbnail size must be less than image's size");
|
||||||
|
thumbnailWidth = thumbnailSize;
|
||||||
|
thumbnailHeight = thumbnailSize;
|
||||||
|
}
|
||||||
|
try
|
||||||
|
{
|
||||||
|
bitmap = new Bitmap((int)thumbnailWidth, (int)thumbnailHeight);
|
||||||
|
Graphics resizedImage = Graphics.FromImage(bitmap);
|
||||||
|
resizedImage.InterpolationMode = InterpolationMode.HighQualityBicubic;
|
||||||
|
resizedImage.CompositingQuality = CompositingQuality.HighQuality;
|
||||||
|
resizedImage.SmoothingMode = SmoothingMode.HighQuality;
|
||||||
|
resizedImage.DrawImage(image, 0, 0, thumbnailWidth, thumbnailHeight);
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
if (bitmap != null)
|
||||||
|
bitmap = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return bitmap;
|
||||||
|
}
|
||||||
|
private ImageFormat GetImageFormat(Format format)
|
||||||
|
{
|
||||||
|
switch (format)
|
||||||
|
{
|
||||||
|
case Format.Jpeg:
|
||||||
|
return ImageFormat.Jpeg;
|
||||||
|
case Format.Bmp:
|
||||||
|
return ImageFormat.Bmp;
|
||||||
|
case Format.Png:
|
||||||
|
return ImageFormat.Png;
|
||||||
|
case Format.Gif:
|
||||||
|
return ImageFormat.Gif;
|
||||||
|
default:
|
||||||
|
return ImageFormat.Tiff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private async Task<Stream> GetImageStreamFromUrl(Uri urlAddress)
|
||||||
|
{
|
||||||
|
Stream result = null;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
byte[] bytes = await GetImageBytesFromUrl(urlAddress);
|
||||||
|
result = new MemoryStream(bytes);
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
result = null;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
private async Task<byte[]> GetImageBytesFromUrl(Uri urlAddress)
|
||||||
|
{
|
||||||
|
byte[] buffer = null;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
using (HttpClient client = new HttpClient())
|
||||||
|
{
|
||||||
|
buffer = await client.GetByteArrayAsync(urlAddress);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
buffer = null;
|
||||||
|
}
|
||||||
|
return buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Create a thumbnail from file and returns as stream.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="thumbnailSize">Thumbnail size. For portrait image, thumbnail size must be less than its height.
|
||||||
|
/// For landscape image, thumbnail size must be less than its width. For the same size image (Proportional), thumbnail size must be less than its width and height.</param>
|
||||||
|
/// <param name="imageFileLocation">Correct image file location.</param>
|
||||||
|
/// <param name="imageFormat">Image format to use.</param>
|
||||||
|
/// <returns>A thumbnail image as stream. Returns null if it fails.</returns>
|
||||||
|
/// <exception cref="ArgumentNullException">'imageFileLocation' is null.</exception>
|
||||||
|
/// <exception cref="FileNotFoundException">'imageFileLocation' does not exist.</exception>
|
||||||
|
public Stream CreateThumbnailStream(uint thumbnailSize, string imageFileLocation, Format imageFormat)
|
||||||
|
{
|
||||||
|
if (String.IsNullOrEmpty(imageFileLocation))
|
||||||
|
throw new ArgumentNullException(nameof(imageFileLocation), "'imageFileLocation' cannot be null");
|
||||||
|
if (!File.Exists(imageFileLocation))
|
||||||
|
throw new FileNotFoundException($"'{imageFileLocation}' cannot be found");
|
||||||
|
Bitmap bitmap = CreateBitmapThumbnail(thumbnailSize, imageFileLocation);
|
||||||
|
if (bitmap != null)
|
||||||
|
{
|
||||||
|
MemoryStream stream = new MemoryStream();
|
||||||
|
bitmap.Save(stream, GetImageFormat(imageFormat));
|
||||||
|
stream.Position = 0;
|
||||||
|
return stream;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// Create a thumbnail from image stream and returns as stream.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="thumbnailSize">Thumbnail size. For portrait image, thumbnail size must be less than its height.
|
||||||
|
/// For landscape image, thumbnail size must be less than its width. For the same size image (Proportional), thumbnail size must be less than its width and height.</param>
|
||||||
|
/// <param name="imageStream">Valid image stream object.</param>
|
||||||
|
/// <param name="imageFormat">Image format to use.</param>
|
||||||
|
/// <returns>A thumbnail image as stream. Returns null if it fails.</returns>
|
||||||
|
/// <exception cref="ArgumentNullException">'imageStream' is null.</exception>
|
||||||
|
public Stream CreateThumbnailStream(uint thumbnailSize, Stream imageStream, Format imageFormat)
|
||||||
|
{
|
||||||
|
if (imageStream == null)
|
||||||
|
throw new ArgumentNullException(nameof(imageStream), "'imageStream' cannot be null");
|
||||||
|
Bitmap bitmap = CreateBitmapThumbnail(thumbnailSize, imageStream);
|
||||||
|
if (bitmap != null)
|
||||||
|
{
|
||||||
|
MemoryStream stream = new MemoryStream();
|
||||||
|
bitmap.Save(stream, GetImageFormat(imageFormat));
|
||||||
|
stream.Position = 0;
|
||||||
|
return stream;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// Create a thumbnail from image in bytes and returns as stream.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="thumbnailSize">Thumbnail size. For portrait image, thumbnail size must be less than its height.
|
||||||
|
/// For landscape image, thumbnail size must be less than its width. For the same size image (Proportional), thumbnail size must be less than its width and height.</param>
|
||||||
|
/// <param name="imageBytes">Valid image bytes array.</param>
|
||||||
|
/// <param name="imageFormat">Image format to use.</param>
|
||||||
|
/// <returns>A thumbnail image as stream. Returns null if it fails.</returns>
|
||||||
|
/// <exception cref="ArgumentNullException">'imageBytes' is null.</exception>
|
||||||
|
public Stream CreateThumbnailStream(uint thumbnailSize, byte[] imageBytes, Format imageFormat)
|
||||||
|
{
|
||||||
|
if (imageBytes == null)
|
||||||
|
throw new ArgumentNullException(nameof(imageBytes), "'imageStream' cannot be null");
|
||||||
|
Bitmap bitmap = CreateBitmapThumbnail(thumbnailSize, new MemoryStream(imageBytes));
|
||||||
|
if (bitmap != null)
|
||||||
|
{
|
||||||
|
MemoryStream stream = new MemoryStream();
|
||||||
|
bitmap.Save(stream, GetImageFormat(imageFormat));
|
||||||
|
stream.Position = 0;
|
||||||
|
return stream;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// Create a thumbnail from file and returns as bytes.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="thumbnailSize">Thumbnail size. For portrait image, thumbnail size must be less than its height.
|
||||||
|
/// For landscape image, thumbnail size must be less than its width. For the same size image (Proportional), thumbnail size must be less than its width and height.</param>
|
||||||
|
/// <param name="imageFileLocation">Correct image file location.</param>
|
||||||
|
/// <param name="imageFormat">Image format to use.</param>
|
||||||
|
/// <returns>A thumbnail image as bytes. Returns null if it fails.</returns>
|
||||||
|
/// <exception cref="ArgumentNullException">'imageFileLocation' is null.</exception>
|
||||||
|
/// <exception cref="FileNotFoundException">'imageFileLocation' does not exist.</exception>
|
||||||
|
public byte[] CreateThumbnailBytes(uint thumbnailSize, string imageFileLocation, Format imageFormat)
|
||||||
|
{
|
||||||
|
if (String.IsNullOrEmpty(imageFileLocation))
|
||||||
|
throw new ArgumentNullException(nameof(imageFileLocation), "'imageFileLocation' cannot be null");
|
||||||
|
if (!File.Exists(imageFileLocation))
|
||||||
|
throw new FileNotFoundException($"'{imageFileLocation}' cannot be found");
|
||||||
|
Stream stream = CreateThumbnailStream(thumbnailSize, imageFileLocation, imageFormat);
|
||||||
|
if (stream != null)
|
||||||
|
{
|
||||||
|
byte[] streamBytes = new byte[stream.Length];
|
||||||
|
stream.Read(streamBytes, 0, streamBytes.Length);
|
||||||
|
return streamBytes;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// Create a thumbnail from image stream and returns as bytes.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="thumbnailSize">Thumbnail size. For portrait image, thumbnail size must be less than its height.
|
||||||
|
/// For landscape image, thumbnail size must be less than its width. For the same size image (Proportional), thumbnail size must be less than its width and height.</param>
|
||||||
|
/// <param name="imageStream">Valid image stream object.</param>
|
||||||
|
/// <param name="imageFormat">Image format to use.</param>
|
||||||
|
/// <returns>A thumbnail image as bytes. Returns null if it fails.</returns>
|
||||||
|
/// <exception cref="ArgumentNullException">'imageStream' is null.</exception>
|
||||||
|
public byte[] CreateThumbnailBytes(uint thumbnailSize, Stream imageStream, Format imageFormat)
|
||||||
|
{
|
||||||
|
if (imageStream == null)
|
||||||
|
throw new ArgumentNullException(nameof(imageStream), "'imageStream' cannot be null");
|
||||||
|
|
||||||
|
Stream stream = CreateThumbnailStream(thumbnailSize, imageStream, imageFormat);
|
||||||
|
if (stream != null)
|
||||||
|
{
|
||||||
|
byte[] streamBytes = new byte[stream.Length];
|
||||||
|
stream.Read(streamBytes, 0, streamBytes.Length);
|
||||||
|
return streamBytes;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// Create a thumbnail from image in bytes and returns as bytes.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="thumbnailSize">Thumbnail size. For portrait image, thumbnail size must be less than its height.
|
||||||
|
/// For landscape image, thumbnail size must be less than its width. For the same size image (Proportional), thumbnail size must be less than its width and height.</param>
|
||||||
|
/// <param name="imageBytes">Valid image bytes array.</param>
|
||||||
|
/// <param name="imageFormat">Image format to use.</param>
|
||||||
|
/// <returns>A thumbnail image as bytes. Returns null if it fails.</returns>
|
||||||
|
/// <exception cref="ArgumentNullException">'imageBytes' is null.</exception>
|
||||||
|
public byte[] CreateThumbnailBytes(uint thumbnailSize, byte[] imageBytes, Format imageFormat)
|
||||||
|
{
|
||||||
|
if (imageBytes == null)
|
||||||
|
throw new ArgumentNullException(nameof(imageBytes), "'imageStream' cannot be null");
|
||||||
|
Stream stream = CreateThumbnailStream(thumbnailSize, imageBytes, imageFormat);
|
||||||
|
if (stream != null)
|
||||||
|
{
|
||||||
|
byte[] streamBytes = new byte[stream.Length];
|
||||||
|
stream.Read(streamBytes, 0, streamBytes.Length);
|
||||||
|
return streamBytes;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Create a thumbnail from valid image url asynchronously.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="thumbnailSize">Thumbnail size. For portrait image, thumbnail size must be less than its height.
|
||||||
|
/// For landscape image, thumbnail size must be less than its width. For the same size image (Proportional), thumbnail size must be less than its width and height.</param>
|
||||||
|
/// <param name="urlAddress">Valid absolute url address with proper scheme.</param>
|
||||||
|
/// <param name="imageFormat">Image format to use.</param>
|
||||||
|
/// <returns>A thumbnail image as stream. Returns null if it fails.</returns>
|
||||||
|
/// <exception cref="ArgumentNullException">'urlAddress' is null.</exception>
|
||||||
|
public async Task<Stream> CreateThumbnailStreamAsync(uint thumbnailSize, Uri urlAddress, Format imageFormat)
|
||||||
|
{
|
||||||
|
if (urlAddress == null)
|
||||||
|
throw new ArgumentNullException(nameof(urlAddress), "'urlAddress' cannot be null");
|
||||||
|
Stream result = null;
|
||||||
|
Stream stream = await GetImageStreamFromUrl(urlAddress);
|
||||||
|
if (stream != null)
|
||||||
|
{
|
||||||
|
result = CreateThumbnailStream(thumbnailSize, stream, imageFormat);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Create a thumbnail from valid image url asynchronously.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="thumbnailSize">Thumbnail size. For portrait image, thumbnail size must be less than its height.
|
||||||
|
/// For landscape image, thumbnail size must be less than its width. For the same size image (Proportional), thumbnail size must be less than its width and height.</param>
|
||||||
|
/// <param name="urlAddress">Valid absolute url address with proper scheme.</param>
|
||||||
|
/// <param name="imageFormat">Image format to use.</param>
|
||||||
|
/// <returns>A thumbnail image as bytes. Returns null if it fails.</returns>
|
||||||
|
/// <exception cref="ArgumentNullException">'urlAddress' is null.</exception>
|
||||||
|
public async Task<byte[]> CreateThumbnailBytesAsync(uint thumbnailSize, Uri urlAddress, Format imageFormat)
|
||||||
|
{
|
||||||
|
if (urlAddress == null)
|
||||||
|
throw new ArgumentNullException(nameof(urlAddress), "'urlAddress' cannot be null");
|
||||||
|
byte[] result = null;
|
||||||
|
byte[] imageBytes = await GetImageBytesFromUrl(urlAddress);
|
||||||
|
if (imageBytes != null)
|
||||||
|
{
|
||||||
|
result = CreateThumbnailBytes(thumbnailSize, imageBytes, imageFormat);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,109 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using Yi.Framework.Model.Models;
|
|
||||||
|
|
||||||
namespace Yi.Framework.Core
|
|
||||||
{
|
|
||||||
public static class TreeMenuBuild
|
|
||||||
{
|
|
||||||
// /// <summary>
|
|
||||||
// /// 过滤所有已经删除的菜单
|
|
||||||
// /// </summary>
|
|
||||||
// /// <param name="menu_data"></param>
|
|
||||||
// /// <returns></returns>
|
|
||||||
// public static menu Normal(menu menu_data)
|
|
||||||
// {
|
|
||||||
// for (int i = menu_data.children.Count() - 1; i >= 0; i--)
|
|
||||||
// {
|
|
||||||
// if (menu_data.children[i].is_delete == (short)Common.Enum.DelFlagEnum.Deleted)
|
|
||||||
// {
|
|
||||||
// menu_data.children.Remove(menu_data.children[i]);
|
|
||||||
// }
|
|
||||||
// else if (menu_data.children[i] != null)
|
|
||||||
// {
|
|
||||||
// Normal(menu_data.children[i]);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// return menu_data;
|
|
||||||
// }
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// public static menu ShowFormat(menu menu_data, List<int> allMenuIds)
|
|
||||||
// {
|
|
||||||
// return Format(Show(menu_data, allMenuIds));
|
|
||||||
// }
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// /// <summary>
|
|
||||||
// /// 过滤用户不展示及已删除及未拥有的菜单
|
|
||||||
// /// </summary>
|
|
||||||
// /// <param name="menu_data"></param>
|
|
||||||
// /// <param name="allMenuIds"></param>
|
|
||||||
// /// <returns></returns>
|
|
||||||
// private static menu Show(menu menu_data, List<int> allMenuIds)
|
|
||||||
// {
|
|
||||||
// for (int i = menu_data.children.Count() - 1; i >= 0; i--)
|
|
||||||
// {
|
|
||||||
// if (!allMenuIds.Contains(menu_data.children[i].id) || menu_data.children[i].is_delete == (short)Common.Enum.DelFlagEnum.Deleted || menu_data.children[i].is_show == (short)Common.Enum.ShowFlagEnum.NoShow)
|
|
||||||
// {
|
|
||||||
// menu_data.children.Remove(menu_data.children[i]);
|
|
||||||
// }
|
|
||||||
// else
|
|
||||||
// {
|
|
||||||
// Show(menu_data.children[i], allMenuIds);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// return menu_data;
|
|
||||||
// }
|
|
||||||
|
|
||||||
// /// <summary>
|
|
||||||
// /// 为了匹配前端格式,通常和show方法一起
|
|
||||||
// /// </summary>
|
|
||||||
// /// <param name="menu_data"></param>
|
|
||||||
// /// <returns></returns>
|
|
||||||
// private static menu Format(menu menu_data)
|
|
||||||
// {
|
|
||||||
// for (int i = menu_data.children.Count() - 1; i >= 0; i--)
|
|
||||||
// {
|
|
||||||
// if (menu_data.children[i].icon == null)
|
|
||||||
// {
|
|
||||||
// menu_data.children[i].icon = "mdi-view-dashboard";
|
|
||||||
// }
|
|
||||||
// if (menu_data.children != null || menu_data.children.Count() != 0)
|
|
||||||
// {
|
|
||||||
// Format(menu_data.children[i]);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// if (menu_data.children.Count() == 0)
|
|
||||||
// {
|
|
||||||
// menu_data.children = null;
|
|
||||||
// }
|
|
||||||
|
|
||||||
// return menu_data;
|
|
||||||
// }
|
|
||||||
|
|
||||||
// public static menu Sort(menu menu_data)
|
|
||||||
// {
|
|
||||||
// if (menu_data.children != null)
|
|
||||||
// {
|
|
||||||
// for (int i = menu_data.children.Count() - 1; i >= 0; i--)
|
|
||||||
// {
|
|
||||||
// menu_data.children = menu_data.children.AsEnumerable().OrderByDescending(u => u.sort).ToList();
|
|
||||||
|
|
||||||
// if (menu_data.children != null || menu_data.children.Count() != 0)
|
|
||||||
// {
|
|
||||||
// Sort(menu_data.children[i]);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// return menu_data;
|
|
||||||
// }
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net6.0</TargetFramework>
|
<TargetFramework>net6.0</TargetFramework>
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ namespace Yi.Framework.OcelotGateway.Builder
|
|||||||
|
|
||||||
public HttpContext? Context { get; set; }
|
public HttpContext? Context { get; set; }
|
||||||
|
|
||||||
public CacheClientDB? DB { get; set; }
|
public CacheInvoker? DB { get; set; }
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,8 +12,8 @@ namespace Yi.Framework.OcelotGateway.WebCore
|
|||||||
public class OcelotMiddleware
|
public class OcelotMiddleware
|
||||||
{
|
{
|
||||||
private readonly RequestDelegate next;
|
private readonly RequestDelegate next;
|
||||||
private CacheClientDB _cacheClientDB;
|
private CacheInvoker _cacheClientDB;
|
||||||
public OcelotMiddleware(RequestDelegate next, CacheClientDB cacheClientDB)
|
public OcelotMiddleware(RequestDelegate next, CacheInvoker cacheClientDB)
|
||||||
{
|
{
|
||||||
this.next = next;
|
this.next = next;
|
||||||
this._cacheClientDB = cacheClientDB;
|
this._cacheClientDB = cacheClientDB;
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ namespace Yi.Framework.Core
|
|||||||
|
|
||||||
//这里可以优化一下
|
//这里可以优化一下
|
||||||
//根据缓存获取全部用户信息
|
//根据缓存获取全部用户信息
|
||||||
var userRoleMenu = ServiceLocator.Instance.GetService<CacheClientDB>().Get<UserRoleMenuDto>("用户id");
|
var userRoleMenu = ServiceLocator.Instance.GetService<CacheInvoker>().Get<UserRoleMenuDto>("用户id");
|
||||||
|
|
||||||
|
|
||||||
var roles = userRoleMenu.Roles;
|
var roles = userRoleMenu.Roles;
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ namespace Yi.Framework.WebCore.MiddlewareExtend
|
|||||||
if (Appsettings.appBool("Redis_Enabled"))
|
if (Appsettings.appBool("Redis_Enabled"))
|
||||||
{
|
{
|
||||||
services.Configure<RedisConnOptions>(Appsettings.appConfiguration("RedisConnOptions"));
|
services.Configure<RedisConnOptions>(Appsettings.appConfiguration("RedisConnOptions"));
|
||||||
services.AddSingleton<CacheClientDB>();
|
services.AddSingleton<CacheInvoker>();
|
||||||
}
|
}
|
||||||
return services;
|
return services;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ namespace Yi.Framework.WebCore.MiddlewareExtend
|
|||||||
|
|
||||||
if (Appsettings.appBool("RedisSeed_Enabled"))
|
if (Appsettings.appBool("RedisSeed_Enabled"))
|
||||||
{
|
{
|
||||||
var _cacheClientDB = app.ApplicationServices.GetService<CacheClientDB>();
|
var _cacheClientDB = app.ApplicationServices.GetService<CacheInvoker>();
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
round
|
round
|
||||||
:width="width"
|
:width="width"
|
||||||
:height="height"
|
:height="height"
|
||||||
:src="url+(src??'0')"
|
:src="url+(src??'0')+'/true'"
|
||||||
/>
|
/>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
|||||||
@@ -36,7 +36,7 @@
|
|||||||
fit="cover"
|
fit="cover"
|
||||||
width="100%"
|
width="100%"
|
||||||
height="7rem"
|
height="7rem"
|
||||||
:src="url + image"
|
:src="url + image+'/true'"
|
||||||
radius="5"
|
radius="5"
|
||||||
/>
|
/>
|
||||||
<template v-slot:loading>
|
<template v-slot:loading>
|
||||||
|
|||||||
Reference in New Issue
Block a user