X-Admin&ABP框架开发-设置管理

  在网站开发中,设置是不可缺乏的一环,如用户设置、系统设置、甚至是租户设置等。ABP对于设置的管理已经作了很好的处理,咱们能够借助巨人的力量来完成咱们的冒险。java

  ABP官网地址:https://aspnetboilerplate.com/git

 

1、设置的层级划分

  ABP中提供了三种类型的设置,用户级别、应用级别、租户级别,针对于不一样级别有着不一样的侧重点,好比用户级别,针对于用户的一些设置,如主题设置,接收通知设置等;针对应用级别,该级别也能在用户层级上进行影响,比如如设置统一的主题皮肤,而它主要体如今整个应用程序上的一些设置,如业务开发中用到的流水号自定义等,在应用程序级别进行配置;而针对租户级别,能够为特定租户完成设置(租户级别我的暂没有涉及到)。json

  

 

2、定义设置

一、先得定义设置才能使用设置,首先建立一个类并继承SettingProvider类,ABP已经在Core层建立了一个AppSettingProvider类,直接使用该类便可,若是须要在其它模块中(ABP是模块化的)定义设置,能够直接参照这个类,而且在模块中注册便可。app

/// <summary>
/// 设置命名 /// </summary>
public static class AppSettingNames { /// <summary>
    /// 系统管理 /// </summary>
    public static class HostManagement { public const string CompanyName = "App.CompanyName"; public const string CompanyAddress = "App.CompanyAddress"; } public const string UiTheme = "App.UiTheme"; }

  为保证后期业务上的设置不产生影响,仍是先进行区分好了,创建一个系统设置来维护一些相对于用户和租户而言独立的应用层级的设置。async

 

二、开始定义设置项信息,从ABP官网文档中看到有一个SettingDefinition类,用于定义设置项信息,查看该类建立时须要的参数ide

  • name:命名 (必填),命名必须系统内惟一,建议是用常量字符串;
  • defaultValue:默认值(选填),能为null或空字符串;
  • displayName:显示名称(选填),UI呈现上显示的名称;
  • group:分组(选填),可对同一类别的设置进行分组,用于UI上分组展现;
  • description: 设置项描述(选填),UI上呈现该设置项的描述信息;
  • scopes:设置范围(默认是应用层级),用于定义该设置项是用于哪一层级,该设置范围能够归属多个层级;
  • isVisibleToClients:客户端是否可见(默认false), 客户端可否看见该设置及设置项值;
  • isInherited: 是否从父级设置项继承(默认为true),当取值时能够从设置范围上进行层级获取;
  • customData: 自定义数据(选填),对于设置项设置自定义格式的数据;
  • clientVisibilityProvider:客户端可见方式(默认不可见);
/// <summary>
/// 获取系统管理设置 /// </summary>
/// <returns></returns>
private IEnumerable<SettingDefinition> GetHostSettings() { return new[] { new SettingDefinition( AppSettingNames.HostManagement.CompanyName, "星城科技" ), new SettingDefinition( AppSettingNames.HostManagement.CompanyAddress, "湖南长沙" ), }; }

   首先来定义两个简单的设置项,其中默认值直接写死了,这种作法显得太low了,通常来说,是须要写到配置文件中的,所以对这一块进行改造,增长从配置文件中根据设置项名称读取默认值的功能,参照Abp Zero中的一些代码,CV操做到Abp中,新增一个接口IAppConfigurationAccessor并增长一个实现AppConfigurationAccessor。模块化

public class AppConfigurationAccessor : IAppConfigurationAccessor, ISingletonDependency { public IConfigurationRoot Configuration { get; } public AppConfigurationAccessor() { Configuration = AppConfigurations.Get(Directory.GetCurrentDirectory()); } }

   而后在定义设置类中引入对配置文件的操做,若是给定的设置项名称存在于配置文件中(appsetting.json或其它环境下的该文件),那么先读取配置文件中的值,读取不到使用默认值。网站

private string GetFromAppSettings(string name, string defaultValue = null) { return GetFromSettings("App:" + name, defaultValue); } private string GetFromSettings(string name, string defaultValue = null) { return _appConfiguration[name] ?? defaultValue; }

   改造设置定义部分,使用从配置文件中读取的形式,此处能够给定默认值(选填)。spa

private IEnumerable<SettingDefinition> GetHostSettings() { return new[] { new SettingDefinition( AppSettingNames.HostManagement.CompanyName, GetFromSettings(AppSettingNames.HostManagement.CompanyName) ), new SettingDefinition( AppSettingNames.HostManagement.CompanyAddress, GetFromSettings(AppSettingNames.HostManagement.CompanyAddress) ), }; }

 

3、封装服务

  ABP在应用层已经封装了一些设置的经常使用操做,咱们须要作的只是在这基础上,扩展加入的设置项,在IConfigurationAppService中添加获取系统设置及更新系统设置的方法声明,并在ConfigurationAppService中给与实现,而且配置好相关的权限设置。code

[AbpAuthorize(PermissionNames.Pages_HostSettings)] public async Task<HostSettingsEditDto> GetAllHostSettings() { return new HostSettingsEditDto { CompanySettingsEditDto = await GetCompanySettingsAsync() }; } [AbpAuthorize(PermissionNames.Pages_HostSettings)] public async Task UpdateAllHostSettings(HostSettingsEditDto input) { await UpdateCompanySettingsAsync(input.CompanySettingsEditDto); }

   此处对于设置的管理是将所有设置读出,并所有写入完成更新,而不是采用单个更新形式,固然也能改为一个一个配置,可是操做上相对繁琐,针对设置的更新,ABP给出了三个方法,直接调用便可,三个方法针对三个层级,按照实际使用调用便可。

  • ChangeSettingForApplicationAsync
  • ChangeSettingForTenantAsync
  • ChangeSettingForUserAsync

  在MVC层增长系统设置控制器,并完成系统设置的读取和更新操做。

/// <summary>
/// 系统设置控制器 /// </summary>
[AbpMvcAuthorize] public class HostSettingsController : SurroundControllerBase { private readonly IConfigurationAppService _configurationAppService; public HostSettingsController(IConfigurationAppService configurationAppService) { _configurationAppService = configurationAppService; } /// <summary>
    /// 系统设置首页 /// </summary>
    /// <returns></returns>
    public async Task<IActionResult> Index() { var settings = await _configurationAppService.GetAllHostSettings(); return View(settings); } /// <summary>
    /// 更新系统设置 /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
 [HttpPost] public async Task UpdateAllSettings([FromBody]HostSettingsEditDto input) { await _configurationAppService.UpdateAllHostSettings(input); } }

   增长视图文件并在页面上经过tab完成对设置类型的区分,初次进入页面加载的是从appsetting.json中配置的默认值,其次更改保存后,即是新的设置项值了。

  

  在网站主页作了一次读取设置项中的值,直接读取的是更新后的公司名和公司地址了。

@using Partner.Surround.Configuration @{ var companyName = await SettingManager.GetSettingValueForApplicationAsync(AppSettingNames.HostManagement.CompanyName); var companyAddress = await SettingManager.GetSettingValueForApplicationAsync(AppSettingNames.HostManagement.CompanyAddress); }

  至此,设置管理的页面配置完成了,当前设置主要是对应用层级的设置,对用户这一级没有作太多展现,可是原理是同样的,对于像分组设置,设置项描述等信息,能够在此基础上进行扩展,毕竟身后有巨人

  代码地址:https://gitee.com/530521314/Partner.Surround.git

 

2019-08-11,望技术有成后能回来看见本身的脚步
相关文章
相关标签/搜索