app/assets/tmp/app-data.json 中保存了默认的一些应用配置

  • app 应用配置
  • user 默认用户配置
  • menu 菜单配置信息

在 App.Module 中,使用 APP_INITIALIZER 进行提前加载。

StartupServiceFactory 工厂函数通过调用 StartupService 来实现数据加载。See:https://github.com/ng-alain/delon/blob/master/schematics/application/files/src/app/core/startup/startup.service.tsls

加载的时候,使用 zip 加载了 2 个部分的数据。

const defaultLang = 'en-US';
return zip(this.i18n.loadLangData(defaultLang), this.httpClient.get('assets/tmp/app-data.json'))

之后,映射出来两个对象 langData, appData

map(([langData, appData]: [Record<string, string>, NzSafeAny]) => {

保存到 SettingsService 对象实例中。

// 应用信息:包括站点名、描述、年份
this.settingService.setApp(appData.app);

SettingsService 中保存应用的配置信息

见: https://ng-alain.com/theme/settings/zh

包括:

  • app
  • user
  • layout

它定义在:https://github.com/ng-alain/delon/blob/master/packages/theme/src/services/settings/settings.service.ts

默认保存到 localStorage 中,所使用的键值

export interface SettingsKeys {
/** Layout data specifies the stored key, default: `layout` */
layout: string;
/** User data specifies the stored key, default: `user` */
user: string;
/** App data specifies the stored key, default: `app` */
app: string;
}

然后,尝试加载 JWTTokenModel

        let token: any = this.tokenService.get(JWTTokenModel);
if (token) {
user.name = token.name;
user.email = token.email;
}
this.settingService.setUser(user);
// ACL:设置权限为全量
this.aclService.setFull(true);
// 初始化菜单
this.menuService.add(appData.menu);
// 设置页面标题的后缀
this.titleService.default = '';
this.titleService.suffix = appData.app.name;

i18n.service.cs 中注入了 SettingsService 来获得语言配置信息

if (this.settings.layout.lang) {
return this.settings.layout.lang;
}

在 callback.componet.cs 中,当用户登录之后的回调中,重新设置当前用户信息。

this.settingsSrv.setUser({
...this.settingsSrv.user,
...info
});

需要注意的是,SettingsService 提供了一个 notify 的属性,用来返回一个 Observable 的可观察对象。

  get notify(): Observable<SettingsNotify> {
return this.notify$.asObservable();
}

当重新设置用户的时候,会发射一个通知出来。

  setUser(value: U): void {
this._user = value;
this.setData(this.KEYS.user, value);
this.notify$.next({ type: 'user', value });
}

当访问 user 属性的时候,如果还没有设置用户,会从默认的 localStorage 中读取出来当前用户的数据

  get user(): U {
if (!this._user) {
this._user = { ...this.getData(this.KEYS.user) };
this.setData(this.KEYS.user, this._user);
}
return this._user as U;
}

使用的键值如下:

export interface SettingsKeys {
/** Layout data specifies the stored key, default: `layout` */
layout: string;
/** User data specifies the stored key, default: `user` */
user: string;
/** App data specifies the stored key, default: `app` */
app: string;
}

Alain 配置管理的更多相关文章

  1. sql server 2008 R2配置管理

    安装vs2013后,sql server 2008R2配置管理提示“远程过程调用失败” 这是因为vs2013自带的Microsoft SQL Server 2012Local DB与之冲突. 通过升级 ...

  2. Struts2 源码分析——配置管理之PackageProvider接口

    本章简言 上一章讲到关于ContainerProvider的知识.让我们知道struts2是如何注册相关的数据.也知道如何加载相关的配置信息.本章笔者将讲到如何加载配置文件里面的package元素节点 ...

  3. Struts2 源码分析——配置管理之ContainerProvider接口

    本章简言 上一章笔者讲到关于Dispatcher类的执行action功能,知道了关于执行action需要用到的信息.而本章将会讲到的内容也跟Dispatcher类有关系.那就是配置管理中的Contai ...

  4. 【2016-10-27】【坚持学习】【Day14】【VS 配置管理器 AssemblyInfo 】

    有这样一个需求,不同客户,有不同的逻辑,通过配置管理器和条件编译进行 自动执行正确的代码.

  5. 统一配置管理-百度disconf

    之前一直采用properties文件管理配置信息,若是集群则每个机器上都要拷贝一份,每次修改也需要依次修改.一直在寻找统一修改,实时生效,方便修改,分环境分系统的配置管理,自己也在整理设计,若找不到合 ...

  6. ****CI框架源码阅读笔记7 配置管理组件 Config.php

    http://blog.csdn.net/ohmygirl/article/details/41041597 一个灵活可控的应用程序中,必然会存在大量的可控参数(我们称为配置),例如在CI的主配置文件 ...

  7. 一个简单的配置管理器(SettingManager)

    在很多.net开发的项目中,我们几乎都会使用到一些自定义的参数,比如说第三方的配置参数之类的. 他们的特点是:1.系统全局 2,可以做成键值对(Dictionary). 我们可以将这些参数放到Web. ...

  8. 配置管理服务diamond和disconf横向对比

    Diamond则是淘宝开源的一种分布式配置管理服务的实现 disconf是来自百度的分布式配置管理平台,包括百度.滴滴出行.银联.网易.拉勾网.苏宁易购.顺丰科技 等知名互联网公司正在使用! 对比项目 ...

  9. Winform开发框架之参数配置管理功能实现-基于SettingsProvider.net的构建

    在较早时期,我写过一篇文章<结合Control.FirefoxDialog控件,构造优秀的参数配置管理模块>,介绍过在我的Winform框架基础上集成的参数配置模块功能,但是参数模块的配置 ...

  10. Yii2所提倡的配置管理方案

    无意中看到Yii2提供的高级应用模板,里面将入口文件与环境相关配置项放到独立的目录下的相应文件中.这应该算是一种比较理想的应用配置管理方案了. 以前整理过一种思路:http://www.cnblogs ...

随机推荐

  1. php中的跳转

    php中的跳转 header("refresh:3;url=http://www.baidu.com";); <meta http-equiv='refresh' conte ...

  2. excel江湖异闻录--华麒麟

    认识他应该是在18.19年左右,那时就感觉这也是个高手,同大部分的高手一样,痴迷函数,热衷创造.挑战不规范的数据. 后来他消失了好长一段时间,群里的同学都以为他退圈了,偶有少数的同学想起他,言语都带着 ...

  3. Java日期时间API系列22-----Jdk8中java.time包中的新的日期时间API类,Month月份和DayOfWeek星期的计算。

    Java8中为月份和星期新增的了,Month和DayOfWeek,来处理月份和星期的特殊问题,这2个类都是枚举类,对Month.DayOfWeek源码说明和简单应用,月份英文,月份英文简称,月份中文, ...

  4. C# 新语法 switch 的简单写法

    // C# 中的新语法 switch 的简写 string str = "123"; string res = str switch { "1" => & ...

  5. 17. ES6怎么嵌入变量

    模板字符串 具体操作: 首先 , 使用反引号包裹字符串,然后使用 ${} 嵌入变量 :

  6. SQL Server 安装图解

    此安装步骤适用于首次安装 一.SQL Server 安装 1.双击SQL Server 光盘映像文件,会出现如图所示界面 选择如下图所示的选项 2.输入产品密钥(这里演示密钥进行) 3.配置更新项,检 ...

  7. 动态避障-图扑自动寻路 3D 可视化

    自动寻路是机器人导航的核心技术,其原理主要涉及机器人与环境之间的复杂信息交互与处理.在自动寻路过程中,机器人依靠先进的传感器系统,如高清摄像头.精密激光雷达和灵敏超声波装置,全方位感知周围环境.这些传 ...

  8. 关于C++当中的指针悬空问题

    一.哪里遇到了这个问题 在进行MNN机器学习框架的MFC应用开发的时候遇到了这个问题,在窗口控件代码段 "MNN_Inference_BarCode_MFCDlg.cpp" 当中需 ...

  9. 基于Java+SpringBoot心理测评心理测试系统功能实现七

    一.前言介绍: 1.1 项目摘要 心理测评和心理测试系统在当代社会中扮演着越来越重要的角色.随着心理健康问题日益受到重视,心理测评和心理测试系统作为评估个体心理状态.诊断心理问题.制定心理治疗方案的工 ...

  10. Python爬虫之数据解析

    1.Request库 HTTP测试工具:http://httpbin.org,以下的示例会以此为URL 属于第三方库,需要手动安装 pip install requests 基本用法 import r ...