// Admin.NET 项目的版æƒã€å•†æ ‡ã€ä¸“利和其他相关æƒåˆ©å‡å—ç›¸åº”æ³•å¾‹æ³•è§„çš„ä¿æŠ¤ã€‚ä½¿ç”¨æœ¬é¡¹ç›®åº”éµå®ˆç›¸å…³æ³•律法规和许å¯è¯çš„è¦æ±‚。 // // 本项目主è¦éµå¾ª MIT 许å¯è¯å’Œ Apache 许å¯è¯ï¼ˆç‰ˆæœ¬ 2.0)进行分å‘和使用。许å¯è¯ä½äºŽæºä»£ç æ ‘æ ¹ç›®å½•ä¸çš„ LICENSE-MIT å’Œ LICENSE-APACHE 文件。 // // ä¸å¾—利用本项目从事å±å®³å›½å®¶å®‰å…¨ã€æ‰°ä¹±ç¤¾ä¼šç§©åºã€ä¾µçŠ¯ä»–äººåˆæ³•æƒç›Šç‰æ³•å¾‹æ³•è§„ç¦æ¢çš„æ´»åЍï¼ä»»ä½•基于本项目二次开å‘è€Œäº§ç”Ÿçš„ä¸€åˆ‡æ³•å¾‹çº çº·å’Œè´£ä»»ï¼Œæˆ‘ä»¬ä¸æ‰¿æ‹…ä»»ä½•è´£ä»»ï¼ using Microsoft.AspNetCore.Mvc.ApiExplorer; using Org.BouncyCastle.Crypto.Parameters; using Org.BouncyCastle.Utilities.Encoders; using Swashbuckle.AspNetCore.SwaggerGen; namespace Admin.NET.Core.Service; /// <summary> /// 系统通用æœåŠ¡ 🧩 /// </summary> [ApiDescriptionSettings(Order = 101)] [AllowAnonymous] public class SysCommonService : IDynamicApiController, ITransient { private readonly IApiDescriptionGroupCollectionProvider _apiProvider; public SysCommonService(IApiDescriptionGroupCollectionProvider apiProvider) { _apiProvider = apiProvider; } /// <summary> /// 获å–国密公钥ç§é’¥å¯¹ 🆠/// </summary> /// <returns></returns> [DisplayName("获å–国密公钥ç§é’¥å¯¹")] public SmKeyPairOutput GetSmKeyPair() { var kp = GM.GenerateKeyPair(); var privateKey = Hex.ToHexString(((ECPrivateKeyParameters)kp.Private).D.ToByteArray()).ToUpper(); var publicKey = Hex.ToHexString(((ECPublicKeyParameters)kp.Public).Q.GetEncoded()).ToUpper(); return new SmKeyPairOutput { PrivateKey = privateKey, PublicKey = publicKey, }; } /// <summary> /// èŽ·å–æ‰€æœ‰æŽ¥å£/动æ€API 🔖 /// </summary> /// <returns></returns> [DisplayName("èŽ·å–æ‰€æœ‰æŽ¥å£/动æ€API")] public List<ApiOutput> GetApiList() { var apiList = new List<ApiOutput>(); foreach (var item in _apiProvider.ApiDescriptionGroups.Items) { foreach (var apiDescription in item.Items) { var displayName = apiDescription.TryGetMethodInfo(out MethodInfo apiMethodInfo) ? apiMethodInfo.GetCustomAttribute<DisplayNameAttribute>(true)?.DisplayName : ""; apiList.Add(new ApiOutput { GroupName = item.GroupName, DisplayName = displayName, RouteName = apiDescription.RelativePath }); } } return apiList; } /// <summary> /// ä¸‹è½½æ ‡è®°é”™è¯¯çš„ä¸´æ—¶Excel(全局) /// </summary> /// <returns></returns> [DisplayName("ä¸‹è½½æ ‡è®°é”™è¯¯çš„ä¸´æ—¶Excel(全局)")] public async Task<IActionResult> DownloadErrorExcelTemp([FromQuery] string fileName = null) { var userId = App.User?.FindFirst(ClaimConst.UserId)?.Value; var resultStream = App.GetRequiredService<SysCacheService>().Get<MemoryStream>(CacheConst.KeyExcelTemp + userId); if (resultStream == null) throw Oops.Oh("é”™è¯¯æ ‡è®°æ–‡ä»¶å·²è¿‡æœŸã€‚"); return await Task.FromResult(new FileStreamResult(resultStream, "application/octet-stream") { FileDownloadName = $"{(string.IsNullOrEmpty(fileName) ? "é”™è¯¯æ ‡è®°ï¼¿" + DateTime.Now.ToString("yyyyMMddhhmmss") : fileName)}.xlsx" }); } }