> For the complete documentation index, see [llms.txt](https://fucloud.gitbook.io/sysu-introducer/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://fucloud.gitbook.io/sysu-introducer/structure/config.md).

# 配置文件

本系统会调用很多外部的 API 或服务， 这些代码秘钥和参数不能硬编码进入代码中， 因此需要使用配置文件统一管理

## 文件结构

系统中各个模块都有其可以配置的参数等配置信息， 且由于每个模块具有不同实现，因此每个实现也就有其配置信息。

配置信息内的结构如下所示， 第一层对应的模块，第二层则对应模块不同的实现类型。 值得注意的是， 如果一个模块只有一种实现，也就是说其实现类型为`basic`， 那么对应的配置信息也为 `basic`。 但如果该模块存在多种实现， 那么`basic`即为多种实现的公共配置信息。

> TODO: 多个实现类型共享一个配置信息暂时未实现...

具体到每个具体实现的配置信息， 其实际存储的是**配置项名称**和**配置项内容**的映射集合。 其中配置项名称应该使用[小驼峰命名法](https://zh.wikipedia.org/wiki/%E9%A7%9D%E5%B3%B0%E5%BC%8F%E5%A4%A7%E5%B0%8F%E5%AF%AB)， 目前每个配置内容项仅支持如上 3 种类型， 而配置项内容目前仅支持 `number`, `string` 和 `boolean` 这 3 中类型， 因此在设计配置项时应该注意这三种类型在 json 中表现差异。

```typescript
// 模块配置项
type ModuleItems = Map<str, number | string | boolean>;

interface ConfigInfo {
    name: ModuleConfig;
}

interface ModuleConfig {
    basic: ModuleItems;
    kind?: ModuleItems;
}
```

## 生命周期

每个模块在启动前都会重新加载配置信息， 也就是说模块在运行过程中配置信息是不会改变的。

> 在目前的实现中，每次启动时只会从内存中的副本中进行读取， 而不是本地的内存文件。 但是通过程序修改配置信息之后，系统会将配置信息重新写会。
