1. 程式人生 > >X-Admin&ABP框架開發-設定管理

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,望技術有成後能回來看見自己的腳步