以JSON作为配置文件

代码如下

其实我一直有个疑问, 为什么github上很多的配置库基本上都是只读的,并没有提供写配置的方法,因为如果可以实时地修改某个配置项的话就会很方便了。 我这个版本是直接更新整个文件的. 另外CnPack里有个根据Ini配置文件生成读写单元的功能, 但是我认为如果配置文件里需要加入新的配置项的话依然会很不方便(需要重新生成)

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
{*******************************************************}
{                                                       }
{           工程: 短信专业版                             }
{       单元功能: 配置管理                               }
{           作者: Linx                                  }
{           时间: 2017-12-10 17:26:50                   }
{                                                       }
{       版权所有 (C) 2017 soesoft                       }
{                                                       }
{*******************************************************}

unit SMSPro.Base.JSONConfig;

interface

uses
  System.SysUtils,
  SynCommons,
  Vcl.Dialogs;
const
  CONFIG_FILENAME = 'SMS.json';
type
  TParam = record
    name: string;
    description: string;
    field: string;
    hdwms_sms_type: string;
    demo:string;
  end;

  TParamDynArray = array of TParam;

  TTemplate = record
    sms_template_code: string;
  end;

  TSMSConfig = record
    account: record
      username: string;
      password: string;
    end;
    pageSize:Integer;
    log:Boolean;
    api: record
      baseUri: string;
      sendApi: string;
      checkApi: string;
      templatesApi: string;
      templateApi:string;
      listDetail: string;
    end;
    params: array of TParam;
    template: TTemplate;
    procedure LoadFromFile(pvFileName: string = '');
    function SaveToFile(pvFileName: string = ''): Boolean;
    procedure SaveDefaultToFile();
    function DecodeFile(pvFileName: string = ''):Boolean;
    function EncodeFile(pvFileName:string = ''):Boolean;
  end;

procedure LoadConfig;

function Config: TSMSConfig;

var
  SMSConfig: TSMSConfig;

implementation

uses
  System.IOUtils;

procedure LoadConfig;
begin
  SMSConfig.LoadFromFile();
end;

function Config: TSMSConfig;
begin
  Result := SMSConfig;
end;

procedure TSMSConfig.SaveDefaultToFile();
var
  lvFileName: string;
  configContent: RawJSON;
begin
  lvFileName := ExtractFilePath(ParamStr(0)) + CONFIG_FILENAME;
  configContent := RecordSaveJSON(Self, TypeInfo(TSMSConfig));
  TFile.WriteAllText(lvFileName, configContent);
end;


function TSMSConfig.SaveToFile(pvFileName: string = ''): Boolean;
var
  lvFileName: string absolute pvFileName;
  configContent: RawJSON;
  IfSaveBase64:Boolean;
begin
  Result := True;
  try
    if lvFileName = '' then
    begin
      lvFileName := ExtractFilePath(ParamStr(0)) + CONFIG_FILENAME;
    end;
    if not FileExists(lvFileName) then
    begin
      IfSaveBase64 := True;
    end
    else
    begin
      configContent := TFile.ReadAllText(lvFileName);
      IfSaveBase64 := IsBase64(configContent);
    end;

    if IfSaveBase64 then
    begin
      configContent := RecordSaveBase64(Self,TypeInfo(TSMSConfig));
    end
    else
    begin
      configContent := RecordSaveJSON(Self, TypeInfo(TSMSConfig));
    end;

    TFile.WriteAllText(lvFileName, configContent,TEncoding.UTF8);
  except
    Result := False;
  end;

end;

procedure TSMSConfig.LoadFromFile(pvFileName: string = '');
var
  lvFileName: string absolute pvFileName;
  configContent: RawJSON;
begin
  if lvFileName = '' then
  begin
    lvFileName := ExtractFilePath(ParamStr(0)) + CONFIG_FILENAME;
  end;
  if TFile.Exists(lvFileName) then
  begin

    configContent := AnyTextFileToRawUTF8(lvFileName, True);

    if IsBase64(configContent) then
    begin
      if not RecordLoadBase64(PAnsiChar(configContent), Length(configContent), Self,
        TypeInfo(TSMSConfig)) then
      begin
        ShowMessage('读取短信配置失败');
      end;
    end
    else
    begin
      if not RecordLoadJson(Self, configContent, TypeInfo(TSMSConfig)) then
      begin
        ShowMessage('读取短信配置失败');
      end;
    end;
  end
  else
  begin
    ShowMessage('短信配置文件SMSPro.json不存在');
  end;
end;

function TSMSConfig.DecodeFile(pvFileName: string = ''):Boolean;
var
  lvFileName: string absolute pvFileName;
  configContent: RawJSON;
  tmp:TSMSConfig;
begin
  Result := False;
  if lvFileName = '' then
  begin
    lvFileName := ExtractFilePath(ParamStr(0)) + CONFIG_FILENAME;
  end;
  if not FileExists(lvFileName) then
  begin
    Exit;
  end
  else
  begin
    configContent := AnyTextFileToRawUTF8(lvFileName, True);
  end;

  if IsBase64(configContent) then
  begin
    if RecordLoadBase64(PAnsiChar(configContent), Length(configContent), tmp, TypeInfo(TSMSConfig)) then
    begin
      configContent := RecordSaveJSON(tmp, TypeInfo(TSMSConfig));
      Result := True;
    end;
  end
  else
  begin
    Exit(True);
  end;

  TFile.WriteAllText(lvFileName, configContent, TEncoding.UTF8);
end;

function TSMSConfig.EncodeFile(pvFileName:string = ''):Boolean;
var
  lvFileName: string absolute pvFileName;
  configContent: RawJSON;
  tmp:TSMSConfig;
begin
  Result := False;
  if lvFileName = '' then
  begin
    lvFileName := ExtractFilePath(ParamStr(0)) + CONFIG_FILENAME;
  end;
  if not FileExists(lvFileName) then
  begin
    Exit;
  end
  else
  begin
    configContent := AnyTextFileToRawUTF8(lvFileName, True);
  end;

  if not IsBase64(configContent) then
  begin
    if RecordLoadJSON(tmp, configContent, TypeInfo(TSMSConfig)) then
    begin
      configContent := RecordSaveBase64(tmp, TypeInfo(TSMSConfig));
      Result := True;
    end;
  end
  else
  begin
    Exit(Result);
  end;

  TFile.WriteAllText(lvFileName, configContent, TEncoding.UTF8);
end;


initialization
  LoadConfig;

finalization

end.
记录平时瞎折腾遇到的各种问题, 方便查找
使用 Hugo 构建
主题 Stack 3.29.0Jimmy 设计