using Hangfire;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.SignalR;
using Microsoft.Extensions.Localization;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Yi.Framework.Common.Attribute;
using Yi.Framework.Common.Const;
using Yi.Framework.Common.Models;
using Yi.Framework.Core;
using Yi.Framework.Interface;
using Yi.Framework.Job;
using Yi.Framework.Language;
using Yi.Framework.Model.Models;
using Yi.Framework.Repository;
using Yi.Framework.WebCore;
using Yi.Framework.WebCore.AttributeExtend;
using Yi.Framework.WebCore.AuthorizationPolicy;
using Yi.Framework.WebCore.DbExtend;
using Yi.Framework.WebCore.SignalRHub;
namespace Yi.Framework.ApiMicroservice.Controllers
{
///
/// 测试控制器
///
[ApiController]
[Route("api/[controller]/[action]")]
public class TestController : ControllerBase
{
private IStringLocalizer _local;
private IUserService _iUserService;
private IRoleService _iRoleService;
private QuartzInvoker _quartzInvoker;
private IHubContext _hub;
private ThumbnailSharpInvoer _thumbnailSharpInvoer;
private CacheInvoker _cacheDb;
private ILogger _logger;
[Autowired]
public CacheInvoker CacheInvoker { get; set; }
//你可以依赖注入服务层各各接口,也可以注入其他仓储层,怎么爽怎么来!
///
/// 依赖注入,优雅写法
///
///
///
///
///
///
///
///
///
public TestController(IHubContext hub,
ILogger logger,
IRoleService iRoleService,
IUserService iUserService,
IStringLocalizer local,
QuartzInvoker quartzInvoker,
ThumbnailSharpInvoer thumbnailSharpInvoer,
CacheInvoker cacheInvoker) =>
(_logger,_iUserService, _iRoleService, _quartzInvoker, _hub, _local, _thumbnailSharpInvoer, _cacheDb) =
(logger, iUserService, iRoleService, quartzInvoker, hub, local, thumbnailSharpInvoer, cacheInvoker);
///
/// swagger跳转
///
///
[HttpGet]
[Route("/")]
public IActionResult Swagger()
{
return Redirect("/Swagger");
}
///
/// 仓储上下文对象测试
///
///
[HttpGet]
// 特点:化繁为简!意框架仓储代理上下文对象,用起来就是爽,但最好按规范来爽!
// 规范:控制器严禁使用DB上下文对象,其它怎么爽怎么来!
public async Task DbTest()
{
//非常好,使用UserService的特有方法
await _iUserService.DbTest();
//非常好,依赖注入使用其他Service的特有方法
await _iRoleService.DbTest();
//很核理,使用仓储的通用方法
await _iUserService._repository.GetListAsync();
//挺不错,依赖注入其他仓储
await _iRoleService._repository.GetListAsync();
//还行,直接切换其他仓储,怎么爽怎么来
await _iUserService._repository.ChangeRepository>().GetListAsync();
//最好不要在控制器直接操作Db对象
await _iUserService._repository._Db.Queryable().ToListAsync();
await _iUserService._repository._DbQueryable.ToListAsync();
return Result.Success().SetData(await _iUserService.DbTest());
}
///
/// 执行Sql返回
///
///
[HttpGet]
//简单语句不推荐使用sql!
public async Task SqlTest()
{
return Result.Success().SetData(await _iUserService._repository.UseSqlAsync("select * from User"));
}
///
/// 国际化测试
///
///
[HttpGet]
//根据浏览器语言设置来切换输出
public Result LocalTest()
{
return Result.Success().SetData(_local["succeed"]);
}
///
/// 权限测试
///
///
[HttpGet]
[Permission("user:get:test")]
public Result PermissionTest()
{
return Result.Success();
}
///
/// 策略授权测试
///
///
[HttpGet]
[Authorize(PolicyName.Sid)]
public Result AuthTest()
{
return Result.Success();
}
///
/// 异步事务测试
///
///
[HttpGet]
//注册一个用户获取它的信息之后再更新它,但是这个年龄可能会报错
//如果一个事务中有任何一个错误,将会把所有执行过的操作进行回滚,确保数据的原子性
public async Task TranTest()
{
UserEntity user = new() { UserName = $"杰哥{DateTime.Now}", Password = "5201314", Age = 99 };
var res = await _iUserService._repository.UseTranAsync(async () =>
{
await _iUserService.Register(user, (o) => user = o);
user.Age = 18 / (new Random().Next(0, 2));
await _iUserService._repository.UpdateAsync(user);
});
if (res)
{
return Result.Success("执行成功!");
}
else
{
return Result.Error("发生错误,插入已回滚!");
}
}
///
/// 极爽导航属性
///
///
[HttpGet]
//Sqlsugar精髓之一!必学!最新版本
public async Task IncludeTest()
{
return Result.Success().SetData(await _iUserService.GetListInRole());
}
///
/// 启动一个定时任务
///
///
[HttpGet]
//每5秒访问一次百度,可查看控制台
public async Task JobTest()
{
Dictionary data = new Dictionary()
{
{JobConst.method,"get" },
{JobConst.url,"https://www.baidu.com" }
};
await _quartzInvoker.StartAsync("*/5 * * * * ?", "HttpJob", jobName: "test", jobGroup: "my", data: data);
return Result.Success();
}
///
/// 停止任务
///
///
[HttpPut]
public async Task StopJob()
{
await _quartzInvoker.StopAsync(new Quartz.JobKey("test", "my"));
return Result.Success("http://localhost:19001/hangfire");
}
///
/// hangfireJob测试
///
///
[HttpGet]
public Result HangfireStratJobTest()
{
Dictionary data = new Dictionary()
{
{JobConst.method,"get" },
{JobConst.url,"https://www.baidu.com" }
};
RecurringJob.AddOrUpdate(nameof(HttpJob),(Job)=>Job.Execute2(data), "*/5 * * * * ?");
return Result.Success("http://localhost:19001/hangfire");
}
///
/// hangfireJob测试
///
///
[HttpGet]
public Result HangfireStopJobTest()
{
RecurringJob.RemoveIfExists(nameof(HttpJob));
return Result.Success();
}
///
/// 树形结构构建测试
///
///
[HttpGet]
public Result TreeTest()
{
List vueRouterModels = new()
{
new VueRouterModel { Id = 1, OrderNum = 1, ParentId = 0, Name = "001" },
new VueRouterModel { Id = 2, OrderNum = 1, ParentId = 1, Name = "001001" },
new VueRouterModel { Id = 3, OrderNum = 1, ParentId = 1, Name = "001002" }
};
var treeData = Common.Helper.TreeHelper.SetTree(vueRouterModels);
return Result.Success().SetData(treeData);
}
///
/// 授权测试
///
///
[Authorize]
[HttpGet]
public Result AuthorizeTest()
{
return Result.Success();
}
///
/// 清空数据库
///
///
[HttpGet]
public async Task ClearDb()
{
var rep = _iUserService._repository;
return Result.Success().SetStatus(await rep.UseTranAsync(async () =>
{
await rep.DeleteAsync(u => true);
await rep.ChangeRepository>().DeleteAsync(u => true);
await rep.ChangeRepository>().DeleteAsync(u => true);
await rep.ChangeRepository>().DeleteAsync(u => true);
await rep.ChangeRepository>().DeleteAsync(u => true);
await rep.ChangeRepository>().DeleteAsync(u => true);
await rep.ChangeRepository>().DeleteAsync(u => true);
await rep.ChangeRepository>().DeleteAsync(u => true);
await rep.ChangeRepository>().DeleteAsync(u => true);
await rep.ChangeRepository>().DeleteAsync(u => true);
}));
}
///
/// 种子数据
///
///
[HttpGet]
public Result SeedDb()
{
var rep = _iUserService._repository;
return Result.Success().SetStatus(DbSeedExtend.DataInvoer(rep._Db));
}
///
/// 操作日志测试
///
///
///
[HttpPost]
[Log("测试模块", Common.Enum.OperEnum.Insert)]
public Result LogTest(List par)
{
return Result.Success().SetData(par);
}
///
/// Signalr实时推送测试
///
///
///
[HttpGet]
public async Task SignalrTest(int msg)
{
await _hub.Clients.All.SendAsync("onlineNum", msg);
return Result.Success("向所有连接客户端发送一个消息");
}
//job任务与公告管理
///
/// 缩略图测试,需要生成前及生成后的路径
///
///
[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();
}
///
/// 缓存测试
///
///
[HttpGet]
public Result CacheDBTest()
{
var key = "Yi:Test";
var item = "你好世界";
_cacheDb.Set(key, item);
var data = _cacheDb.Get(key);
return Result.Success().SetData(data);
}
///
/// 自定义日志
///
///
[HttpGet]
public Result CustomLogTest()
{
_logger.LogWarning("输出一条日志");
return Result.Success();
}
///
/// 属性注入测试
///
///
[HttpGet]
public Result PropertyTest()
{
return Result.Success().SetStatus(CacheInvoker is not null);
}
}
}