.Net之创建简单系统配置界面

前言

当公司因为各种各样原因没有接入统一的配置中心,并且系统比较繁多的时候,这个时候配置存储就比较烦人了,每次新开一个项目就需要写一次系统配置相关的页面,所以这就是本文的缘由之一,但是本文主要只是想介绍通过安装一个Nuget包并简单配置以后后端项目就可以出来配置维护界面的功能。.

注意:本文并没有发布nuget包,本文的代码也没有在生产环境使用(思路上了生产)

功能介绍

如果将该项目引用后,通过简单的对接,会自动生成配置表以及配置版本表用来存储系统配置,配置的版本跟着项目版本走,每次项目升级如果涉及配置更新都是添加配置,不对老配置做修改等操作(防止删除客户自定义的配置),默认启用最新版本的配置,客户可以自行比对进行个性化配置(虽然这样子也不太好,有好的想法请私信一下)

  • • 个性化配置

    • • 页面标题自定义

    • • 路由自定义

  • • 系统配置界面

    • • 启用指定版本

    • • 列表展示以及搜索

    • • 配置编辑

    • • 配置删除

    • • 版本列表

  • • 存储

    • • pgsql存储

  • • 对接系统

    • • 项目中查询(默认配置了内存缓存)

界面

界面是使用html+bootstrap+layui进行编写的(应该使用Blazor也可以),好久不写前端所以时间主要就是花在页面上,界面虽然难看但能用,如果后面有机会就用Masa Blazor做一个好看的界面去(https://www.masastack.com/blazor)

列表界面

.Net之创建简单系统配置界面

配置编辑

.Net之创建简单系统配置界面

版本列表

.Net之创建简单系统配置界面

删除配置确认弹框

.Net之创建简单系统配置界面

接入方案

首先需要引用项目或者发布成Nuget包引用,然后进行注入配置

builder.Services.AddSettingConfig(options =>
{
    options.DbConnection = conn;
    options.PageTitle = "系统配置";
    options.PageDescription = "说明";
    options.RoutePrefix = "systemconfig";// 页面路由
    options.DbSchema = "sample";
});

使用UI界面

app.UseSettingUI();

主要思路就是通过中间件来拦截配置的路由,将自定义的页面加入到内嵌的资源中,然后在请求配置页面路由的时候响应Html内容(学习自Swashbuckle.AspNetCore.SwaggerUI),主要代码是

/// <summary>
/// 响应Html内容
/// </summary>
/// <param name="response"></param>
private async Task RespondWithIndexHtml(HttpResponse response)
{
    response.StatusCode = 200;
    response.ContentType = "text/html;charset=utf-8";

    await using var stream = _settingUiOptions.IndexStream(); // 内嵌的资源文件
    using var reader = new StreamReader(stream);

    var htmlBuilder = new StringBuilder(await reader.ReadToEndAsync());
    // 替换页面的占位符显示个性化内容
    foreach (var entry in GetIndexArguments())
    {
        htmlBuilder.Replace(entry.Key, entry.Value);
    }

    await response.WriteAsync(htmlBuilder.ToString(), Encoding.UTF8);
}

上面配置就结束了,那么当在项目中需要去读取配置,那么就可以直接通过注入服务IConfigSettingService来读取配置

var aa = await _configSettingService.GetConfigContentAsync("aaa");
// 或者
var aa = await _configSettingService.GetConfigAsync<List<string>>("aaa");

如果需要替换存储方案,那么就可以去继承IDataSourceProvider进行实现并替换,如果需要替换缓存,那么就可以直接继承IDistributedCache进行实现并替换

本文的完整源码可以去看:https://github.com/azrng/dotnet-sample/tree/main/src/SettingConfig