using Admin.NET.Core; using Furion.DependencyInjection; using Furion.DynamicApiController; using Furion.JsonSerialization; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Caching.Distributed; using System.Text; namespace Admin.NET.Application { /// /// 系统缓存服务 /// [ApiDescriptionSettings(Name = "Cache", Order = 100)] [Route("api")] public class SysCacheService : ISysCacheService, IDynamicApiController, ISingleton { private readonly IDistributedCache _cache; /// /// 构造函数 /// /// public SysCacheService(IDistributedCache cache) { _cache = cache; } /// /// 获取数据范围缓存(机构Id集合) /// /// /// [NonAction] public async Task> GetDataScope(long userId) { var cacheKey = CommonConst.CACHE_KEY_DATASCOPE + userId; var res = await _cache.GetStringAsync(cacheKey); return string.IsNullOrWhiteSpace(res) ? null : JSON.Deserialize>(res); } /// /// 缓存数据范围(机构Id集合) /// /// /// /// [NonAction] public async Task SetDataScope(long userId, List dataScopes) { var cacheKey = CommonConst.CACHE_KEY_DATASCOPE + userId; await _cache.SetStringAsync(cacheKey, JSON.Serialize(dataScopes)); await AddCacheKey(cacheKey); } /// /// 获取菜单缓存 /// /// /// /// [NonAction] public async Task> GetMenu(long userId, string appCode) { var cacheKey = CommonConst.CACHE_KEY_MENU + $"{userId}-{appCode}"; var res = await _cache.GetStringAsync(cacheKey); return string.IsNullOrWhiteSpace(res) ? null : JSON.Deserialize>(res); } /// /// 缓存菜单 /// /// /// /// /// [NonAction] public async Task SetMenu(long userId, string appCode, List menus) { var cacheKey = CommonConst.CACHE_KEY_MENU + $"{userId}-{appCode}"; await _cache.SetStringAsync(cacheKey, JSON.Serialize(menus)); await AddCacheKey(cacheKey); } /// /// 获取权限缓存(按钮) /// /// /// [NonAction] public async Task> GetPermission(long userId) { var cacheKey = CommonConst.CACHE_KEY_PERMISSION + userId; var res = await _cache.GetStringAsync(cacheKey); return string.IsNullOrWhiteSpace(res) ? null : JSON.Deserialize>(res); } /// /// 删除权限缓存 /// /// /// [NonAction] public async Task RemovePermission(long userId) { var cacheKey = CommonConst.CACHE_KEY_PERMISSION + userId; await RemoveAsync(cacheKey); } /// /// 缓存权限 /// /// /// /// [NonAction] public async Task SetPermission(long userId, List permissions) { var cacheKey = CommonConst.CACHE_KEY_PERMISSION + userId; await _cache.SetStringAsync(cacheKey, JSON.Serialize(permissions)); await AddCacheKey(cacheKey); } /// /// 获取所有缓存关键字 /// /// [HttpGet("sysCache/keyList")] public async Task> GetAllCacheKeys() { var res = await _cache.GetStringAsync(CommonConst.CACHE_KEY_ALL); return string.IsNullOrWhiteSpace(res) ? null : JSON.Deserialize>(res); } /// /// 删除指定关键字缓存 /// /// /// [HttpGet("sysCache/remove")] public async Task RemoveAsync(string key) { await _cache.RemoveAsync(key); await DelCacheKey(key); } /// /// 删除某特征关键字缓存 /// /// /// [NonAction] public async Task DelByPatternAsync(string key) { var allkeys = await GetAllCacheKeys(); var delAllkeys = allkeys.Where(u => u.Contains(key)).ToList(); // 删除相应的缓存 delAllkeys.ForEach(u => { _cache.Remove(u); }); // 更新所有缓存键 allkeys = allkeys.Where(u => !u.Contains(key)).ToList(); await _cache.SetStringAsync(CommonConst.CACHE_KEY_ALL, JSON.Serialize(allkeys)); } /// /// 设置缓存 /// /// /// /// [NonAction] public async Task SetAsync(string cacheKey, object value) { await _cache.SetAsync(cacheKey, Encoding.UTF8.GetBytes(JSON.Serialize(value))); await AddCacheKey(cacheKey); } /// /// 设置缓存 /// /// /// /// [NonAction] public async Task SetStringAsync(string cacheKey, string value) { await _cache.SetStringAsync(cacheKey, value); await AddCacheKey(cacheKey); } /// /// 获取缓存 /// /// /// [HttpGet("sysCache/detail")] public async Task GetStringAsync(string cacheKey) { return await _cache.GetStringAsync(cacheKey); } /// /// 获取缓存 /// /// /// /// [NonAction] public async Task GetAsync(string cacheKey) { var res = await _cache.GetAsync(cacheKey); return res == null ? default : JSON.Deserialize(Encoding.UTF8.GetString(res)); } /// /// 检查给定 key 是否存在 /// /// 键 /// [NonAction] public bool Exists(string cacheKey) { var res = _cache.GetStringAsync(CommonConst.CACHE_KEY_ALL).GetAwaiter().GetResult(); var allkeys = string.IsNullOrWhiteSpace(res) ? new HashSet() : JSON.Deserialize>(res); return allkeys.Any(_ => _ == cacheKey); } /// /// 增加缓存Key /// /// /// [NonAction] public async Task AddCacheKey(string cacheKey) { var res = await _cache.GetStringAsync(CommonConst.CACHE_KEY_ALL); var allkeys = string.IsNullOrWhiteSpace(res) ? new HashSet() : JSON.Deserialize>(res); if (!allkeys.Any(m => m == cacheKey)) { allkeys.Add(cacheKey); await _cache.SetStringAsync(CommonConst.CACHE_KEY_ALL, JSON.Serialize(allkeys)); } } /// /// /// /// /// [NonAction] public async Task DelCacheKey(string cacheKey) { var res = await _cache.GetStringAsync(CommonConst.CACHE_KEY_ALL); var allkeys = string.IsNullOrWhiteSpace(res) ? new HashSet() : JSON.Deserialize>(res); if (allkeys.Any(m => m == cacheKey)) { allkeys.Remove(cacheKey); await _cache.SetStringAsync(CommonConst.CACHE_KEY_ALL, JSON.Serialize(allkeys)); } } } }