/** * 实现对应用所有配置项(key/value)的管理: * 1. 用户需要把初始的配置项保存在项目的 src/config.json ,配置文件的格式请保留key/value格式(支持注释),value只能是字符串和数字类型,例如: * { * //mqtt相关配置 * "mqtt.ip":"192.168.2.3", * "mqtt.port":6199, * } * 2. 也支持自定义配置文件,初始化可以传递自定义配置文件的路径和标识,后续读写数据都需要传递这个标识 * 3. 用户在应用中第一次使用这个组件,需要先初始化 init,初始化会把 config.json 的数据保存到内存里,以后每次获取都是从内存获取 * 4. 用户可以在任何地方都可以通过 get 和 set 来读写配置 * 5. 如果修改配置项的 value 同时需要保存到配置文件(保证重启后新配置生效),使用 setAndSave * 6. 如果需要恢复所有默认配置,使用 reset */ import * as os from 'os'; import dxMap from './dxMap.js' import common from './dxCommon.js' import logger from './dxLogger.js' import std from './dxStd.js' const map = dxMap.get("default") const config = {} const DEFALUT_OPTIONS = { path: '/app/code/src/config.json', savePath: '/app/data/config/config.json', flag: '___config.' } /** * 初始化会把 config.json 或自定义的配置文件的数据保存到内存里,以后每次获取都是从内存获取 * @param {object} custom 非必填,自定义的配置文件 * @param {string} custom.path 自定义的配置文件完整路径 * @param {string} custom.flag 自定义配置文件的标识,注意如果有多个自定义配置文件,这个标识不要重复 */ config.init = function (custom) { if (custom) { if (!custom.path || !custom.flag) { throw new Error('The path and flag for the custom configuration file cannot be empty.') } } let flag = custom ? DEFALUT_OPTIONS.flag + custom.flag + '.' : DEFALUT_OPTIONS.flag; const isInited = map.get('___inited' + flag) if (isInited) {//只初始化一次 return } let path = custom ? custom.path : DEFALUT_OPTIONS.path let savePath = custom ? '/app/data/config/config' + custom.flag + '.json' : DEFALUT_OPTIONS.savePath if (!std.exist(path)) { throw new Error('The config file not existed:' + path) } let existed = std.exist(savePath) let content = existed ? std.parseExtJSON(std.loadFile(savePath)) : std.parseExtJSON(std.loadFile(path)) if (!existed) { std.saveFile(savePath, JSON.stringify(content)) } for (let [key, value] of Object.entries(content)) { map.put(flag + key, value) } map.put('___inited' + flag, 'ok') } /** * 获取所有配置项 * @param {string} flag 自定义的配置文件标识,可以为空,为空则返回缺省config.json里所有内容 * @returns json对象 */ config.getAll = function (flag) { let _flag = _getFlag(flag) let configInfo = {} let keys = map.keys().filter(k => k.startsWith(_flag)) keys.forEach(k => { let key = k.substring(_flag.length) let val = map.get(k) configInfo[key] = val }) return configInfo } /** * 获取配置,只从map获取 * 如果配置项为空,返回所有所有数据; * @param {string} key 配置项 * @param {string} flag 自定义的配置文件标识,可以为空,为空则返回缺省config.json里的配置值 * @returns */ config.get = function (key, flag) { if (!key) { return this.getAll(flag); } let _flag = _getFlag(flag) return map.get(_flag + key) } /** * 更新配置,只修改map * @param {string} key 配置项 * @param {string} value 配置值 * @param {string} flag 自定义的配置文件标识,可以为空,为空则指向缺省config.json里的配置值 */ config.set = function (key, value, flag) { if (!key || value == null || value == undefined) { throw new Error("key or value should not be empty") } let _flag = _getFlag(flag) map.put(_flag + key, value) } /** * 将map中的数据持久化到本地 * @param {string} flag 自定义的配置文件标识,可以为空,为空则指向缺省config.json里的配置值 */ config.save = function (flag) { //保存 std.saveFile(_getSavePath(flag), JSON.stringify(this.getAll(flag))) } /** * 更新配置,修改map且持久化本地 * @param {string} key 配置项 * @param {string} value 配置值 * @param {string} flag 自定义的配置文件标识,可以为空,为空则指向缺省config.json里的配置值 */ config.setAndSave = function (key, value, flag) { this.set(key, value, flag) //保存 std.saveFile(_getSavePath(flag), JSON.stringify(this.getAll(flag))) } /** * 重置,重置后请重启动设备 * @param {string} flag 自定义的配置文件标识,可以为空,为空则指向缺省config.json里的配置值 */ config.reset = function (flag) { common.systemBrief('rm -rf ' + _getSavePath(flag)) } //-------------------private------------------------------- function _getFlag(flag) { return flag ? DEFALUT_OPTIONS.flag + flag + '.' : DEFALUT_OPTIONS.flag } function _getSavePath(flag) { return flag ? '/app/data/config/config' + flag + '.json' : DEFALUT_OPTIONS.savePath } export default config;