// Admin.NET 项目的版æƒã€å•†æ ‡ã€ä¸“利和其他相关æƒåˆ©å‡å—ç›¸åº”æ³•å¾‹æ³•è§„çš„ä¿æŠ¤ã€‚ä½¿ç”¨æœ¬é¡¹ç›®åº”éµå®ˆç›¸å…³æ³•律法规和许å¯è¯çš„è¦æ±‚。 // // 本项目主è¦éµå¾ª MIT 许å¯è¯å’Œ Apache 许å¯è¯ï¼ˆç‰ˆæœ¬ 2.0)进行分å‘和使用。许å¯è¯ä½äºŽæºä»£ç æ ‘æ ¹ç›®å½•ä¸çš„ LICENSE-MIT å’Œ LICENSE-APACHE 文件。 // // ä¸å¾—利用本项目从事å±å®³å›½å®¶å®‰å…¨ã€æ‰°ä¹±ç¤¾ä¼šç§©åºã€ä¾µçŠ¯ä»–äººåˆæ³•æƒç›Šç‰æ³•å¾‹æ³•è§„ç¦æ¢çš„æ´»åЍï¼ä»»ä½•基于本项目二次开å‘è€Œäº§ç”Ÿçš„ä¸€åˆ‡æ³•å¾‹çº çº·å’Œè´£ä»»ï¼Œæˆ‘ä»¬ä¸æ‰¿æ‹…ä»»ä½•è´£ä»»ï¼ namespace Admin.NET.Core.Service; /// <summary> /// ç³»ç»ŸåŠ¨æ€æ’ä»¶æœåŠ¡ 🧩 /// </summary> [ApiDescriptionSettings(Order = 245)] public class SysPluginService : IDynamicApiController, ITransient { private readonly IDynamicApiRuntimeChangeProvider _provider; private readonly SqlSugarRepository<SysPlugin> _sysPluginRep; public SysPluginService(IDynamicApiRuntimeChangeProvider provider, SqlSugarRepository<SysPlugin> sysPluginRep) { _provider = provider; _sysPluginRep = sysPluginRep; } /// <summary> /// 获å–åŠ¨æ€æ’件列表 🧩 /// </summary> /// <param name="input"></param> /// <returns></returns> [DisplayName("获å–åŠ¨æ€æ’件列表")] public async Task<SqlSugarPagedList<SysPlugin>> Page(PagePluginInput input) { return await _sysPluginRep.AsQueryable() .WhereIF(!string.IsNullOrWhiteSpace(input.Name), u => u.Name.Contains(input.Name)) .OrderBy(u => new { u.OrderNo, u.Id }) .ToPagedListAsync(input.Page, input.PageSize); } /// <summary> /// å¢žåŠ åŠ¨æ€æ’ä»¶ 🧩 /// </summary> /// <param name="input"></param> /// <returns></returns> [ApiDescriptionSettings(Name = "Add"), HttpPost] [DisplayName("å¢žåŠ åŠ¨æ€æ’ä»¶")] public async Task AddPlugin(AddPluginInput input) { var isExist = await _sysPluginRep.IsAnyAsync(u => u.Name == input.Name || u.AssemblyName == input.AssemblyName); if (isExist) throw Oops.Oh(ErrorCodeEnum.D1900); // æ·»åŠ åŠ¨æ€ç¨‹åºé›†/æŽ¥å£ input.AssemblyName = CompileAssembly(input.CsharpCode, input.AssemblyName); await _sysPluginRep.InsertAsync(input.Adapt<SysPlugin>()); } /// <summary> /// æ›´æ–°åŠ¨æ€æ’ä»¶ 🧩 /// </summary> /// <param name="input"></param> /// <returns></returns> [ApiDescriptionSettings(Name = "Update"), HttpPost] [DisplayName("æ›´æ–°åŠ¨æ€æ’ä»¶")] public async Task UpdatePlugin(UpdatePluginInput input) { var isExist = await _sysPluginRep.IsAnyAsync(u => (u.Name == input.Name || u.AssemblyName == input.AssemblyName) && u.Id != input.Id); if (isExist) throw Oops.Oh(ErrorCodeEnum.D1900); // å…ˆç§»é™¤å†æ·»åŠ åŠ¨æ€ç¨‹åºé›†/æŽ¥å£ RemoveAssembly(input.AssemblyName); input.AssemblyName = CompileAssembly(input.CsharpCode); await _sysPluginRep.AsUpdateable(input.Adapt<SysPlugin>()).IgnoreColumns(true).ExecuteCommandAsync(); } /// <summary> /// åˆ é™¤åŠ¨æ€æ’ä»¶ 🧩 /// </summary> /// <param name="input"></param> /// <returns></returns> [ApiDescriptionSettings(Name = "Delete"), HttpPost] [DisplayName("åˆ é™¤åŠ¨æ€æ’ä»¶")] public async Task DeletePlugin(DeletePluginInput input) { var plugin = await _sysPluginRep.GetByIdAsync(input.Id); if (plugin == null) return; // 移除动æ€ç¨‹åºé›†/æŽ¥å£ RemoveAssembly(plugin.AssemblyName); await _sysPluginRep.DeleteAsync(u => u.Id == input.Id); } /// <summary> /// æ·»åŠ åŠ¨æ€ç¨‹åºé›†/æŽ¥å£ ðŸ§© /// </summary> /// <param name="csharpCode"></param> /// <param name="assemblyName">程åºé›†åç§°</param> /// <returns></returns> [DisplayName("æ·»åŠ åŠ¨æ€ç¨‹åºé›†/接å£")] public string CompileAssembly([FromBody] string csharpCode, [FromQuery] string assemblyName = default) { // 编译 C# 代ç 并返回动æ€ç¨‹åºé›† var dynamicAssembly = App.CompileCSharpClassCode(csharpCode, assemblyName); // 将程åºé›†æ·»åŠ è¿›åŠ¨æ€ WebAPI 应用部件 _provider.AddAssembliesWithNotifyChanges(dynamicAssembly); // 返回动æ€ç¨‹åºé›†åç§° return dynamicAssembly.GetName().Name; } /// <summary> /// 移除动æ€ç¨‹åºé›†/æŽ¥å£ ðŸ§© /// </summary> [ApiDescriptionSettings(Name = "RemoveAssembly"), HttpPost] [DisplayName("移除动æ€ç¨‹åºé›†/接å£")] public void RemoveAssembly(string assemblyName) { _provider.RemoveAssembliesWithNotifyChanges(assemblyName); } }