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,望技术有成后能回来看见自己的脚步
X-Admin&ABP框架开发-设置管理的更多相关文章
- X-Admin&ABP框架开发-租户管理
软件即服务概念的推动,定制化到通用化的发展,用一套代码完成适应不同企业的需求,利用多租户技术可以去做到这一点.ABP里提供了多租户这一概念并且也在Zero模块中实现了这一概念. 一.多租户的概念 单部 ...
- X-Admin&ABP框架开发-消息通知
业务型网站使用过程中,消息通知是一个不可或缺的功能,采用站内通知.短信通知.邮件通知.微信通知等等各种方式都有,ABP框架对这部分工作已经封装的很好了,站在巨人的肩膀上,一览全貌,带来的就是心情舒畅. ...
- X-Admin&ABP框架开发-RBAC
在业务系统需求规划过程中,通常对于诸如组织机构.用户和角色等这种基础功能,通常是将这部分功能规划到通用子域中,这也说明了,对于这部分功能来讲,是系统的基石,整个业务体系是建立于这部分基石之上的,当然, ...
- X-Admin&ABP框架开发-版本管理
多租户系统中,针对于不同租户开放不同功能,或是按照不同功能进行收费管理,需要从宿主本身去管理租户的版本信息,如同酒店人员对不同房间收取不同费用,依据房间内部设施,房间大小等设置不同收费标准.Abp系统 ...
- ABP理论学习之设置管理
返回总目录 本篇目录 介绍 定义设置 获取设置值 更改设置 关于缓存 介绍 每个应用程序都需要存储一些设置信息,然后在应用程序中的某个地方使用这些设置.ABP提供了健壮的基础设施来存储或检索服务端和客 ...
- X-Admin&ABP框架开发-系统日志
网站正常运行中有时出现异常在所难免,查看系统运行日志分析问题并能够根据错误信息快速解决问题尤为重要,ABP对于系统运行日志这块已经做了很好的处理,默认采用的Log4Net已经足够满足开发过程中的需要了 ...
- X-Admin&ABP框架开发-代码生成器
在日常开发中,有时会遇到一些相似的代码,甚至是只要CV一次,改几个名称,就可以实现功能了,而且总归起来,都可以由一些公用的页面更改而来,因此,结合我日常开发中使用到的页面,封装一个适合自己的代码生成器 ...
- X-Admin&ABP框架开发-数据字典
在业务型的系统开发中,我们需要维护各种个样的类型,比如客户类型.客户行业.商品类型等等,这些类型往往信息量不多,并且相似度极高,如果采用一类型一表去设计,将会造成极大的工作量,通过将这部分类型的信息进 ...
- abp框架(aspnetboilerplate)设置前端报错显示
abp在后端抛出异常 throw new UserFriendlyException($"抛出一个错误"); 在发布之前,需要设置是否把报错发送给前端 如果将此设置为true,则会 ...
随机推荐
- 分布式事务(2)---TCC理论
分布式事务(2)---TCC理论 上篇讲过有关2PC和3PC理论知识,博客:分布式事务(1)---2PC和3PC理论 我的理解:2PC.3PC还有TCC都蛮相似的.3PC大致是把2PC的第一阶段拆分成 ...
- scrapy基础知识之随机切换fake-useragent 库的使用:
pip install fake-useragent from fake_useragent import UserAgent ua = UserAgent() middlewares.py from ...
- 无法启动iis express web服务器解决
VS2013 .VS2015 .VS2017调试出现无法启动iis express web服务器 最近自己老是遇到这个问题,天天如此,烦死人,网上答案繁多,但是都解决不了,也是由于各种环境不同导致的, ...
- 基于SpringBoot从零构建博客网站 - 设计可扩展上传模块和开发修改头像密码功能
上传模块在web开发中是很常见的功能也是很重要的功能,在web应用中需要上传的可以是图片.pdf.压缩包等其它类型的文件,同时对于图片可能需要回显,对于其它文件要能够支持下载等.在守望博客系统中对于上 ...
- 探寻 webpack_bundle_analyzer 原理
webpack_bundle_analyzer 是什么? 这是webpack官方出品的,对项目中模块依赖关系及体积的分析插件,其界面如下: 问题来了,这是如何来进行统计的? 这里提供一个插件的代码,可 ...
- 【DFS的分支限界】(例题-算式等式)
不知道DFS的请滚去 这里瞅一眼再说. -分支限界- 基本概念: 类似于回溯法,也是一种在问题的解空间树T上搜索问题解的算法.但在一般情况下,分支限界法与回溯法的求解目标不同.回溯法的求解目标是找出T ...
- Edgeboard试用 — 基于CIFAR10分类模型的移植
前言 在上一次的测试中,我们按照官方给的流程,使用EasyDL快速实现了一个具有性别检测功能的人脸识别系统,那么今天,我们将要试一下通过Paddlepaddle从零开始,训练一个自己的多分类模型,并进 ...
- 洛谷:P2952 [USACO09OPEN]牛线Cow Line:题解
题目链接:https://www.luogu.org/problemnew/show/P2952 分析: 这道题非常适合练习deque双端队列,~~既然是是练习的板子题了,建议大家还是练练deque, ...
- RabbitMQ从入门到精通(三)
目录 1. 自定义消费者使用 自定义消费端演示 2.消费端的限流策略 2.1 限流的场景与机制 2.2 限流相关API 2.3 限流演示 3. 消费端ACK与重回队列机制 3.1 ACK与NACK 3 ...
- C#4.0新增功能02 命名实参和可选实参
连载目录 [已更新最新开发文章,点击查看详细] C# 4 介绍命名实参和可选实参. 通过命名实参,你可以为特定形参指定实参,方法是将实参与该形参的名称关联,而不是与形参在形参列表中的位置关联. ...