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); } } }