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. MSF使用方法

    https://blog.csdn.net/weixin_45588247/article/details/119614618https://github.com/ttonys/Scrapy-CVE- ...

  2. USB总线-Linux内核USB设备驱动ftrace分析(十一)

    1.简介 USB Gadget Driver定义了很多trace event,使用者可以在用户空间通过ftrace接口,追踪USB Gadget Driver的行为. USB设备控制器驱动定义的tra ...

  3. 什么是 Ajax,Ajax 的原理,Ajax 都有哪些优点和缺点

    ajax是异步的js和xml,是一种创建交互式网页的开发技术,是和服务器进行异步通讯的技术 : 核心就是使用XMLHttpRequest向服务器发送请求获取数据 : 优点: 页面不需要刷新,用户体验良 ...

  4. 云原生周刊:使用 ChatGPT 提高安全性

    虽然 ChatGPT 最近因网络犯罪分子使用该技术加强攻击而成为负面新闻,但它也可以成为网络防御的强大资产,帮助公司最大限度地提高安全态势,同时弥合其员工的技能差距. 云安全联盟 (CSA) 最近发布 ...

  5. MYSQL 批量删除以特定前缀开头的表

    前言 这是工作中确实会用到,比如分库分表后有t_order_01.t_order_02.t_order_03...t_order_08 这样的表. 测试过程中造了大量数据进行测试,其中可能含有部分脏数 ...

  6. Invalid default value for prop "value": Props with type Object/Array must use a factory function to return the default value.

    Invalid default value for prop "value": Props with type Object/Array must use a factory fu ...

  7. Java基础完结

    花费了大概一周的时间,看完了韩顺平的Java基础课,不得不说韩老师讲的java基础还是相当仔细的,细节满满,我认为这既是优点也是缺点吧23333333-- 接下来准备看老杜的MySQL,因为没有配套的 ...

  8. AI辅助动画制作,现实到虚拟仅需要一个摄像头。多种AI技术融合赋能传统行业,或是产业趋势?

    图源:youtube authour autodesk media & entertainment 不是元宇宙,是动画. 2024年10.30日.美国加利福尼亚公司 Wonder dynami ...

  9. C++学习——类当中static关键字的作用

    一.类和对象 我们知道类是"行为"和"属性"的集合,我们可以通过类来实例化对象,从而定义对象的"行为"和"属性".比如: ...

  10. 基于surging 的木舟平台如何通过Tcp或者UDP网络组件接入设备

    一.概述 上篇文章介绍了木舟通过HTTP网络组件接入设备,那么此篇文章将介绍如何利用Tcp或者UDP网络组件接入设备. 木舟 (Kayak) 是什么? 木舟(Kayak)是基于.NET6.0软件环境下 ...