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

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

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

一、设置的层级划分

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

  

二、定义设置

1、先得定义设置才能使用设置,首先创建一个类并继承SettingProvider类,ABP已经在Core层创建了一个AppSettingProvider类,直接使用该类即可,如果需要在其它模块中(ABP是模块化的)定义设置,可以直接参照这个类,并且在模块中注册即可。

/// <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";
}

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

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

  • 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;
}

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

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

三、封装服务

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

[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,望技术有成后能回来看见自己的脚步

原文地址:https://www.cnblogs.com/CKExp/p/11323397.html

时间: 2024-11-10 13:51:12

X-Admin&ABP框架开发-设置管理的相关文章

Module Zero模块 [X-Admin&amp;ABP框架开发-RBAC]

在业务系统需求规划过程中,通常对于诸如组织机构.用户和角色等这种基础功能,通常是将这部分功能规划到通用子域中,这也说明了,对于这部分功能来讲,是系统的基石,整个业务体系是建立于这部分基石之上的,当然,还有诸如多语言.设置管理.认证和授权等.对于这部分功能,ABP中存在这些概念,并且通过Module Zero模块完成了这些概念. 一.角色访问控制之RBAC RBAC:Role Based Access Control,基于角色的访问控制,这在目前大多数软件中来讲已经算得上是普遍应用了,最常见的结构

X-Admin&amp;ABP框架开发-版本管理

多租户系统中,针对于不同租户开放不同功能,或是按照不同功能进行收费管理,需要从宿主本身去管理租户的版本信息,如同酒店人员对不同房间收取不同费用,依据房间内部设施,房间大小等设置不同收费标准.Abp系统中默认是多租户的,并且在Zero模块中实现了版本管理功能. 演示地址:http://119.3.138.127/,更改Account/HostLogin进入宿主管理 一.设计前提 基于Abp进行了相关限制,我将多租户变成了单租户,不允许添加新的租户,由于日常接触中,发现除了云平台这种SaaS需要多租

X-Admin&amp;ABP框架开发-代码生成器

在日常开发中,有时会遇到一些相似的代码,甚至是只要CV一次,改几个名称,就可以实现功能了,而且总归起来,都可以由一些公用的页面更改而来,因此,结合我日常开发中使用到的页面,封装一个适合自己的代码生成器,仅处于入门阶段,包括生成的代码结构都仅是把框架展示出来,内部详细暂时没得,针对于应用服务中的接口和实现,相关Dto,MVC中的控制器.视图及视图模型进行了模板制作及生成相关的文件. 一.设计思路 方案一:开始想到的是,搞个控制台,然后给一个.cs文件,然后控制台去解析其中的命名空间,类名,属性,再

ABP开发框架前后端开发系列---(15)ABP框架的服务端和客户端缓存的使用

缓存在一个大型一点的系统里面是必然会涉及到的,合理的使用缓存能够给我们的系统带来更高的响应速度.由于数据提供服务涉及到数据库的相关操作,如果客户端的并发数量超过一定的数量,那么数据库的请求处理则以爆发式增长,如果数据库服务器无法快速处理这些并发请求,那么将会增加客户端的请求时间,严重者可能导致数据库服务或者应用服务直接瘫痪.缓存方案就是为这个而诞生,随着缓存的引入,可以把数据库的IO耗时操作,转换为内存数据的快速响应操作,或者把整个页面缓存到缓存系统里面.本篇随笔主要介绍利用ABP框架的支持实现

&lt;&lt;ABP框架&gt;&gt; 功能管理

文档目录 本节内容: 简介 关于 IFeatureValueStore 功能类型 Boolean 功能 Value 功能 定义功能 基本功能属性 其它功能属性 功能层次 检查功能 使用RequiresFeature特性 RequiresFeature特性注意事项 使用 IFeatureChecker IsEnabled GetValue 客户端 isEnabled getValue 功能管理器 对版本的一个提示 简介 大部分SaaS(多租户)应用有不同功能的版本(包),因此你可以提供不同价格和功

ABP(现代ASP.NET样板开发框架)系列之9、ABP设置管理

点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之9.ABP设置管理 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ABP的官方网站:http://www.aspnetboilerplate.com ABP在Github上的开源项目:https://github.com/aspnetboilerplate 本文由山东-李伟提供翻译 介绍 每个应用程序需要存储一些设置并在应用程序的某个地方使用这些设置.A

ABP框架个人开发实战(1)_环境搭建

前言 之前关注ABP框架有一阵子了,一直没有潜下心来实际研究一下.最近想自己建站,以后有自己的功能开发项目,可以在自己的站点上开发,并一步步的完善,所以找个比较好用的框架迫在眉睫,选来选去,决定用ABP框架.用群里的大大门的话来说,掌握了ABP,基本就可以飞天了~ 先简单介绍下吧(以下部分资料来自群里资料,如有侵权,请告知): ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ASP.NET Boilerplate是一个用最佳实践和流行技术开

详解ABP框架的多租户

(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:ABP框架对多租户场景提供了很好的支持,内建了多租户的处理机制,今天我们来深入解析一下这一特性. 最近在基于ABP框架(ASP.NET Boilerplate)开发了一个SaaS.所以接下来可能会时不时分享一下ABP方面的文章.今天来介绍一下ABP对多租户提供的支持特性. ABP简介 ASP.NET Boilerplate是一个用最佳实践和流行技术开发现代WEB应用程序的新起点,它旨在成为一个

&lt;&lt;ABP框架&gt;&gt; 依赖注入

文档目录 本节内容: 什么时依赖注入 传统方式的问题 解决方案 构造器注入模式 属性注入模式 依赖注入框架 ABP 依赖注入基础 注册依赖 约定注入 辅助接口 自定义/直接 注册 使用IocManager 使用Castle Windsor API 解析 构造器和属性注入 IIocResolver 和 IIocManager 另外 IShouldInitialize 接口 Asp.net Mvc 和 Asp.net Web Api 集成 Asp.net Core 集成 最后提醒 什么是依赖注入 如