X-Admin&ABP框架開發-設置管理
- 2019 年 10 月 3 日
- 筆記
在網站開發中,設置是不可缺少的一環,如用戶設置、系統設置、甚至是租戶設置等。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,望技術有成後能回來看見自己的腳步