先给你们拜个晚年,祝你们身体健康,远离肺炎~前端
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 版本的代码
八、剩下的根据异常信息调试吧~