using JNPF.Common.Const; using JNPF.Common.Core.Manager; using JNPF.Common.Enums; using JNPF.Common.Filter; using JNPF.Common.Manager; using JNPF.Common.Models.User; using JNPF.DependencyInjection; using JNPF.DynamicApiController; using JNPF.FriendlyException; using JNPF.Message.Interfaces; using JNPF.Systems.Entitys.Dto.SysCache; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; namespace JNPF.Systems; /// /// 缓存管理 /// 版 本:V3.2 /// 版 权:拓通智联科技有限公司(http://www.tuotong-tech.com) /// 日 期:2021-06-01. /// [ApiDescriptionSettings(Tag = "System", Name = "CacheManage", Order = 100)] [Route("api/system/[controller]")] public class SysCacheService : IDynamicApiController, ITransient { /// /// IM消息中心服务. /// private readonly IImReplyService _imReplyService; /// /// 缓存管理器. /// private readonly ICacheManager _cacheManager; /// /// 用户管理. /// private readonly IUserManager _userManager; private readonly IHttpContextAccessor _httpContextAccessor; /// /// 初始化一个类型的新实例. /// public SysCacheService( ICacheManager cacheManager, IHttpContextAccessor httpContextAccessor, IUserManager userManager, IImReplyService imReplyService) { _imReplyService = imReplyService; _cacheManager = cacheManager; _userManager = userManager; _httpContextAccessor = httpContextAccessor; } #region GET /// /// 列表. /// /// 请求参数. /// [HttpGet("")] public async Task GetList([FromQuery] KeywordInput input) { var tenantId = _userManager.TenantId; var keys = _cacheManager.GetAllCacheKeys().FindAll(q => q.Contains(tenantId)); var output = new List(); foreach (var key in keys) { var model = new CacheListOutput(); model.name = key; model.overdueTime = _cacheManager.GetCacheOutTime(model.name); model.cacheSize = await RedisHelper.StrLenAsync(key); output.Add(model); } if (!string.IsNullOrEmpty(input.keyword)) output = output.FindAll(x => x.name.Contains(input.keyword)); return new { list = output.OrderBy(o => o.overdueTime) }; } /// /// 信息. /// /// 缓存名称. [HttpGet("{name}")] public async Task GetInfo(string name) { var strJson = await _cacheManager.GetAsync(name); var cacheInfoOutput = new CacheInfoOutput(); cacheInfoOutput.name = name; cacheInfoOutput.value = strJson; return cacheInfoOutput; } #endregion #region POST /// /// 清空单个缓存. /// /// name. /// [HttpDelete("{name}")] public async Task Clear(string name) { if (!await _cacheManager.DelAsync(name)) throw Oops.Oh(ErrorCode.D1700); } /// /// 清空所有缓存. /// /// [HttpPost("Actions/ClearAll")] public async Task ClearAll() { var tenantId = _userManager.TenantId; var httpContext = _httpContextAccessor.HttpContext; httpContext.SignoutToSwagger(); // 清除IM中的webSocket var list = await GetOnlineUserList(tenantId); var user = list.Find(it => it.tenantId == tenantId && it.userId == _userManager.UserId); if (user != null) { _imReplyService.ForcedOffline(user.connectionId); await DelOnlineUser(tenantId, user.userId); await DelUserInfo(tenantId, user.userId); } var keys = _cacheManager.GetAllCacheKeys().FindAll(q => q.Contains(tenantId)); var isOk = await _cacheManager.DelAsync(keys.ToArray()); if (!isOk) throw Oops.Oh(ErrorCode.D1700); } #endregion /// /// 获取在线用户列表. /// /// 租户ID. /// private async Task> GetOnlineUserList(string tenantId) { var cacheKey = string.Format("{0}{1}", CommonConst.CACHEKEYONLINEUSER, tenantId); return await _cacheManager.GetAsync>(cacheKey); } /// /// 删除在线用户ID. /// /// 租户ID. /// 用户ID. /// private async Task DelOnlineUser(string tenantId, string userId) { var cacheKey = string.Format("{0}{1}", CommonConst.CACHEKEYONLINEUSER, tenantId); var list = await _cacheManager.GetAsync>(cacheKey); var online = list.Find(it => it.userId == userId); list.RemoveAll((x) => x.connectionId == online.connectionId); return await _cacheManager.SetAsync(cacheKey, list); } /// /// 删除用户登录信息缓存. /// /// 租户ID. /// 用户ID. /// private async Task DelUserInfo(string tenantId, string userId) { var cacheKey = string.Format("{0}{1}_{2}", CommonConst.CACHEKEYUSER, tenantId, userId); return await _cacheManager.DelAsync(cacheKey); } }