先給你們拜個晚年,祝你們身體健康,遠離肺炎~前端
NetModular開源已有一年,在這一年收到了不少建議,框架也變得愈來愈完善。此次更新包括了從去年年尾到如今所作的更改,感受更改的內容仍是蠻多的,因此記錄一下並提供一個升級指南供你們參考~git
老規矩,先上地址~github
GitHub:https://github.com/iamoldli/NetModular
碼雲:https://gitee.com/laoli/NetModular數據庫
歡迎star~json
Demo:https://demo.17mkh.com/
帳戶:admin
密碼:admin緩存
0、添加緩存管理功能,當沒法鏈接緩存服務器時,可在後臺對緩存進行清除管理服務器
一、實現 Token 自動刷新功能,系統設置頁面可設置
RefreshToken
的有效期app
二、實現單帳戶登陸功能,同一個帳戶只能同時登陸一個,該功能可在系統配置頁面進行關閉或啓用框架
三、從原來的帳戶服務
IAccountService
中剝離出身份認證服務IAuthService
四、修改模塊配置管理功能,統一管理全部模塊的配置項,移除原來的
module.json
配置文件
你們應該都遇到過這樣一個場景:項目經理提出一個新的需求,該需求須要作到靈活可配置的,大部分人都會選擇在配置文件中添加一個配置項來解決此問題,那麼問題來了,這個配置可能會常常修改,每次修改都要鏈接服務器修改配置文件,項目經理一定會找你來該,若是此時你正忙於其它事情,必定會感受很煩躁~而後你會考慮把配置放到數據庫中,在後臺提供頁面進行修改,那麼問題又來了,爲了一兩個配置建立一張表而且還要開發頁面,是否是很麻煩~因此便有了模塊配置管理這個功能
只須要按照約定,頂一個配置類,不須要關係存儲和更新,直接在用到的地方注入你定義的配置類就能使用~
五、調整模塊發現註冊機制
原來是從模塊的Infrastructure
程序集中,讀取_module.json 文件來發現模塊並註冊,如今調整爲從應用根目錄的_modules
目錄下發現_module.json 文件,這次更改是爲了之後開發模塊熱插拔功能作準備
六、調整模塊生成 NuGet 包的機制
如今編譯生成 NuGet 包時候,會自動生成_modules 目錄以及_module.json 文件,並自動將該文件打包進Infrastructure
和Web
對應的 NuGet 包中,當在模塊中安裝Infrastructure
和Web
包時,會自動把_module.json 文件複製到輸出模塊,而後模塊就能被發現註冊了
七、新增模塊業務服務注入
IModuleServicesConfigurator
接口
原來模塊須要注入特有服務的時候,只能經過實現IModuleInitializer
接口的方式,可是這個方式有一個弊端,只能用於 Web 應用,沒有辦法在控制檯應用中使用,因此新增了一個IModuleServicesConfigurator
接口,該接口包含一個Configure
方法,專門用於注入模塊業務相關的服務
/// <summary> /// 配置 /// </summary> /// <param name="services">服務集合</param> /// <param name="modules">模塊列表</param> /// <param name="env">環境變量</param> void Configure(IServiceCollection services, IModuleCollection modules, IHostEnvironment env);
這裏有一個約定,IModuleServicesConfigurator
接口用於注入當前模塊業務相關的服務,IModuleInitializer
接口用於注入與 Web 功能有關的服務,好比Admin
模塊中
public class ModuleServicesConfigurator : IModuleServicesConfigurator { public void Configure(IServiceCollection services, IModuleCollection modules, IHostEnvironment env) { //密碼處理服務 services.AddSingleton<IPasswordHandler, Md5PasswordHandler>(); //加載系統配置 var systemConfig = services.BuildServiceProvider().GetService<SystemConfigResolver>().Load().Result; services.AddSingleton(systemConfig); //模塊配置項存儲處理程序 services.AddSingleton<IModuleOptionsStorageProvider, ModuleOptionsStorageProvider>(); } }
public class ModuleInitializer : IModuleInitializer { public void ConfigureServices(IServiceCollection services, IModuleCollection modules, IHostEnvironment env) { //審計日誌服務 services.AddSingleton<IAuditingHandler, AuditingHandler>(); //權限驗證服務 services.AddScoped<IPermissionValidateHandler, PermissionValidateHandler>(); //單帳戶登陸處理服務 services.AddScoped<ISingleAccountLoginHandler, SingleAccountLoginHandler>(); } ...其它代碼... }
上面的,密碼處理服務、系統配置加載、模塊配置存儲等服務,都屬於業務相關,而審計日期、權限認證、單帳戶登陸等都跟 Web 有關,由於控制檯應用中是不包含這些的
八、調整了
IModuleInitializer
中注入服務方法ConfigureServices
中的參數,添加了IModuleCollection
參數,方便訪問其餘模塊中的信息
/// <summary> /// 注入服務 /// <para>此方法用於注入與Web相關的服務,不然請經過IModuleServicesConfigurator接口註冊</para> /// </summary> /// <param name="services"></param> /// <param name="modules">模塊集合</param> /// <param name="env">環境變量</param> void ConfigureServices(IServiceCollection services, IModuleCollection modules, IHostEnvironment env);
九、新增自動建立數據庫後初始化數據功能
若是您想在系統自動建立數據庫後,初始化一些數據,可在db.json
文件中,添加InitData
屬性,設置爲 true 便可,他會在系統啓動時而且建立數據庫後初始化數據(前提是對應模塊包含了初始化數據)
若是您但願模塊建立數據庫後能夠初始化數據,只須要要數據庫腳本放到 WebHost 中的_modules 目錄中,以 Admin 爲例
腳本會自動打包進 NuGet 包中,安裝後會自動輸出到數據路徑~
九、我的精力有限,代碼不在兼容.Net Core2.2 版本,望諒解~
十、代碼優化~
0、列表頁組件(nm-list)新增
reset
事件以及不顯示重置按鈕的屬性no-reset
一、修復下拉框組件
checked-first
屬性不生效的 bug
二、修復列表頁組件當查詢欄不顯示時,爲判斷 querybar 對象是否存在而致使查詢異常的 bug
三、調整身份認證相關的功能,以適配後端所作的調整,如單帳戶登陸等功能
四、調整系統配置頁面
0、調整全部模塊代碼,以便支持新的框架中的功能調整,好比配置管理的功能
一、優化了代碼生成器模塊,修復了打開實體列表時偶發性出現接口錯誤的 bug
二、代碼生成器模塊支持單個實體代碼生成,生成的文件中只包含實體有關的,生成後可直接 copy 到項目中
因爲本次更新較大,須要修改多個地方,包括項目文件等,因此提供一個指南方便你們操做,若有疑問,可參考 Common 模塊~
0、修改 Directory.Build.props 文件
新增一個Icon
屬性,用於指定模塊的展現圖標,目前該圖標只在配置管理中用到~
一、由於模塊信息添加了一個圖標屬性,因此對應的表
ModuleInfo
須要添加一個列Icon
二、修改
module.build.targets
文件
該文件用於編譯時自動生成_module.json
文件,你可直接複製下面代碼覆蓋
<Project> <PropertyGroup> <ModulesDir>_modules\$(Id)</ModulesDir> <ModuleName>$(ModulesDir)\_module.json</ModuleName> <ModuleInfo>{"Id": "$(Id)","Name":"$(Name)","Icon":"$(Icon)","Version":"$(Version)"}</ModuleInfo> </PropertyGroup> <Target Name="ModulesBuild" AfterTargets="Build"> <!--建立modules目錄--> <MakeDir Directories="$(ModulesDir)"/> <!--生成module.json文件,Note:項目須要生成兩次,不然Nuget包中的文件不是最新的--> <WriteLinesToFile File="$(ModuleName)" Overwrite="true" Lines="$(ModuleInfo)" /> </Target> </Project>
三、修改
Infrastructure
的項目文件
移除了導入module.build.targets
文件的代碼,添加了將_modules 目錄打包進 NuGet 包的代碼
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>netstandard2.0</TargetFramework> </PropertyGroup> <ItemGroup> <PackageReference Include="HtmlAgilityPack" Version="1.11.18" /> <PackageReference Include="NetModular.Lib.Options.Abstraction" Version="1.7.2" /> <PackageReference Include="NetModular.Module.Admin.Domain" Version="1.7.2" /> <PackageReference Include="NPinyin.Core" Version="3.0.0" /> </ItemGroup> <ItemGroup> <ProjectReference Include="..\Domain\Domain.csproj" /> </ItemGroup> <!--打包模塊相關文件到NuGet包中,此功能須要編譯兩次項目才行,由於打包操做在建立_module.json文件以前執行的--> <ItemGroup> <Content Include="$(SolutionDir)\src\WebHost\_modules*\**\*.*" PackagePath="contentFiles\any\any"> <Pack>true</Pack> <PackageCopyToOutput>true</PackageCopyToOutput> </Content> </ItemGroup> </Project>
四、修改
Web
的項目文件
添加了將_modules 目錄打包進 NuGet 包的代碼
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>netcoreapp3.1</TargetFramework> <GenerateDocumentationFile>false</GenerateDocumentationFile> </PropertyGroup> <ItemGroup> <PackageReference Include="NetModular.Lib.Auth.Web" Version="1.7.2" /> <PackageReference Include="NetModular.Lib.Module.AspNetCore" Version="1.7.2" /> <PackageReference Include="NetModular.Lib.Utils.Mvc" Version="1.7.2" /> </ItemGroup> <ItemGroup> <ProjectReference Include="..\Library\Application\Application.csproj" /> </ItemGroup> <!--打包模塊相關文件到NuGet包中,此功能須要編譯兩次項目才行,由於打包操做在建立_module.json文件以前執行的--> <ItemGroup> <Content Include="$(SolutionDir)\src\WebHost\_modules*\**\*.*" PackagePath="contentFiles\any\any"> <Pack>true</Pack> <PackageCopyToOutput>true</PackageCopyToOutput> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> </ItemGroup> </Project>
五、修改
WebHost
的項目文件
導入module.build.targets
文件,添加複製_modules 目錄到輸出目錄的代碼
<Project Sdk="Microsoft.NET.Sdk.Web"> <PropertyGroup> <TargetFramework>netcoreapp3.1</TargetFramework> <!--複製本地鎖定的程序集到輸出目錄--> <CopyLocalLockFileAssemblies>false</CopyLocalLockFileAssemblies> <RunAnalyzersDuringBuild>false</RunAnalyzersDuringBuild> <RunAnalyzersDuringLiveAnalysis>false</RunAnalyzersDuringLiveAnalysis> </PropertyGroup> <ItemGroup> <PackageReference Include="NetModular.Lib.Cache.MemoryCache" Version="1.7.2" /> <PackageReference Include="NetModular.Lib.Data.MySql" Version="1.7.2" /> <PackageReference Include="NetModular.Lib.Data.SQLite" Version="1.7.2" /> <PackageReference Include="NetModular.Lib.Data.SqlServer" Version="1.7.2" /> <PackageReference Include="NetModular.Lib.Excel.EPPlus" Version="1.7.2" /> <PackageReference Include="NetModular.Lib.Host.Web" Version="1.7.2" /> <PackageReference Include="NetModular.Module.Admin.Web" Version="1.7.2" /> </ItemGroup> <ItemGroup> <ProjectReference Include="..\Web\Web.csproj" /> </ItemGroup> <Import Project="..\..\build\module.build.targets" /> <ItemGroup> <!--複製配置文件到輸出目錄--> <None Update="config\**\*.*"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> <!--複製模塊相關文件到輸出路徑中--> <None Update="_modules\**\*.*"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> </ItemGroup> </Project>
六、修改
Web
中的ModuleInitializer.cs
類
IModuleInitializer
接口中的ConfigureServices
方法添加了IModuleCollection
參數,須要補上
/// <summary> /// 注入服務 /// </summary> /// <param name="services"></param> /// <param name="modules"></param> /// <param name="env"></param> public void ConfigureServices(IServiceCollection services, IModuleCollection modules, IHostEnvironment env) { }
七、移除兼容.Net Standard 2.0 版本的代碼
八、剩下的根據異常信息調試吧~