localSettings.js 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. 'use strict';
  2. import { getDataDir } from 'ee-core/ps';
  3. import { logger } from 'ee-core/log';
  4. import path from 'node:path';
  5. import fs from 'node:fs';
  6. /**
  7. * 本机(客户端)设置:落盘在应用数据目录下的 local-settings.json。
  8. *
  9. * <p>与后端 {@code QingJian/conf/c5e503ad.json} 无关:这些是「这台机器上的客户端」的偏好,
  10. * 例如离线地图目录 —— 后端可能部署在别的机器上,服务端路径对客户端没有意义。
  11. */
  12. class LocalSettingsService {
  13. get filePath() {
  14. return path.join(getDataDir(), 'local-settings.json');
  15. }
  16. readAll() {
  17. try {
  18. const file = this.filePath;
  19. if (!fs.existsSync(file)) return {};
  20. const parsed = JSON.parse(fs.readFileSync(file, 'utf8'));
  21. return parsed && typeof parsed === 'object' && !Array.isArray(parsed) ? parsed : {};
  22. } catch (e) {
  23. logger.warn('[localSettings] 读取失败:', e instanceof Error ? e.message : String(e));
  24. return {};
  25. }
  26. }
  27. /** 读一个字符串设置;没有或类型不对返回空串 */
  28. get(key) {
  29. const value = this.readAll()[key];
  30. return typeof value === 'string' ? value : '';
  31. }
  32. /** 写一个设置;传空则删除该键 */
  33. set(key, value) {
  34. const all = this.readAll();
  35. const text = typeof value === 'string' ? value.trim() : '';
  36. if (text) {
  37. all[key] = text;
  38. } else {
  39. delete all[key];
  40. }
  41. const file = this.filePath;
  42. fs.mkdirSync(path.dirname(file), { recursive: true });
  43. fs.writeFileSync(file, `${JSON.stringify(all, null, 2)}\n`, 'utf8');
  44. return text;
  45. }
  46. }
  47. export const localSettingsService = new LocalSettingsService();