nsgm-cli 2.1.19 → 2.1.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) hide show
  1. package/client/components/Button.tsx +3 -3
  2. package/client/components/ClientProviders.tsx +12 -12
  3. package/client/components/LanguageSwitcher.tsx +26 -26
  4. package/client/components/SSRSafeAntdProvider.tsx +7 -7
  5. package/client/components/SuppressHydrationWarnings.tsx +30 -30
  6. package/client/components/__tests__/Button.test.tsx +12 -12
  7. package/client/layout/index.tsx +124 -124
  8. package/client/redux/reducers.ts +2 -2
  9. package/client/redux/store.ts +24 -24
  10. package/client/redux/template/manage/actions.ts +40 -40
  11. package/client/redux/template/manage/reducers.ts +32 -32
  12. package/client/redux/template/manage/types.ts +19 -19
  13. package/client/service/template/manage.ts +29 -29
  14. package/client/styled/common.ts +6 -6
  15. package/client/styled/layout/index.ts +17 -17
  16. package/client/styled/template/manage.ts +19 -19
  17. package/client/utils/common.ts +54 -54
  18. package/client/utils/cookie.ts +30 -30
  19. package/client/utils/fetch.ts +111 -111
  20. package/client/utils/i18n.ts +41 -41
  21. package/client/utils/menu.tsx +12 -12
  22. package/client/utils/navigation.ts +22 -22
  23. package/client/utils/sso.ts +124 -124
  24. package/client/utils/suppressWarnings.ts +17 -17
  25. package/generation/prettierrc +6 -0
  26. package/lib/args.js +19 -19
  27. package/lib/cli/app.d.ts +1 -1
  28. package/lib/cli/app.js +2 -2
  29. package/lib/cli/commands/build.d.ts +1 -1
  30. package/lib/cli/commands/build.js +9 -9
  31. package/lib/cli/commands/create.d.ts +1 -1
  32. package/lib/cli/commands/create.js +36 -36
  33. package/lib/cli/commands/delete.d.ts +1 -1
  34. package/lib/cli/commands/delete.js +55 -55
  35. package/lib/cli/commands/export.d.ts +1 -1
  36. package/lib/cli/commands/export.js +12 -12
  37. package/lib/cli/commands/help.d.ts +1 -1
  38. package/lib/cli/commands/help.js +29 -29
  39. package/lib/cli/commands/init.d.ts +1 -1
  40. package/lib/cli/commands/init.js +31 -31
  41. package/lib/cli/commands/server.d.ts +1 -1
  42. package/lib/cli/commands/server.js +12 -12
  43. package/lib/cli/commands/upgrade.d.ts +1 -1
  44. package/lib/cli/commands/upgrade.js +13 -13
  45. package/lib/cli/commands/version.d.ts +1 -1
  46. package/lib/cli/commands/version.js +7 -7
  47. package/lib/cli/index.d.ts +13 -13
  48. package/lib/cli/parser.d.ts +1 -1
  49. package/lib/cli/parser.js +12 -12
  50. package/lib/cli/registry.d.ts +1 -1
  51. package/lib/cli/types.d.ts +2 -2
  52. package/lib/cli/utils/console.d.ts +2 -2
  53. package/lib/cli/utils/console.js +22 -22
  54. package/lib/cli/utils/index.d.ts +2 -2
  55. package/lib/cli/utils/prompt.d.ts +1 -1
  56. package/lib/cli/utils/prompt.js +98 -98
  57. package/lib/constants.js +28 -28
  58. package/lib/generate.d.ts +2 -2
  59. package/lib/generate.js +19 -19
  60. package/lib/generate_create.d.ts +1 -1
  61. package/lib/generate_create.js +38 -38
  62. package/lib/generate_delete.js +63 -63
  63. package/lib/generate_init.js +94 -94
  64. package/lib/generators/base-generator.d.ts +1 -1
  65. package/lib/generators/base-generator.js +23 -23
  66. package/lib/generators/file-generator.js +15 -15
  67. package/lib/generators/generator-factory.d.ts +5 -5
  68. package/lib/generators/i18n-generator.d.ts +1 -1
  69. package/lib/generators/i18n-generator.js +127 -127
  70. package/lib/generators/page-generator.d.ts +1 -1
  71. package/lib/generators/page-generator.js +25 -25
  72. package/lib/generators/resolver-generator.d.ts +1 -1
  73. package/lib/generators/resolver-generator.js +27 -27
  74. package/lib/generators/schema-generator.d.ts +1 -1
  75. package/lib/generators/schema-generator.js +4 -4
  76. package/lib/generators/service-generator.d.ts +1 -1
  77. package/lib/generators/service-generator.js +29 -29
  78. package/lib/generators/sql-generator.d.ts +1 -1
  79. package/lib/generators/sql-generator.js +10 -10
  80. package/lib/index.js +23 -23
  81. package/lib/server/csrf.d.ts +3 -3
  82. package/lib/server/csrf.js +20 -20
  83. package/lib/server/db.d.ts +1 -1
  84. package/lib/server/db.js +21 -21
  85. package/lib/server/graphql.js +26 -26
  86. package/lib/server/plugins/date.d.ts +1 -1
  87. package/lib/server/plugins/date.js +6 -6
  88. package/lib/server/utils/graphql-cache.js +5 -5
  89. package/lib/tsconfig.build.tsbuildinfo +1 -1
  90. package/lib/utils/project-config.d.ts +1 -1
  91. package/lib/utils/project-config.js +20 -20
  92. package/lib/utils.js +3 -3
  93. package/package.json +1 -1
  94. package/pages/_app.tsx +62 -62
  95. package/pages/_document.tsx +15 -15
  96. package/pages/_error.tsx +26 -26
  97. package/pages/index.tsx +48 -48
  98. package/pages/login.tsx +64 -64
  99. package/pages/template/manage.tsx +175 -175
@@ -15,41 +15,41 @@ class I18nGenerator extends base_generator_1.BaseGenerator {
15
15
  const formFields = this.getFormFields();
16
16
  const displayFields = this.getDisplayFields();
17
17
  // 生成字段翻译
18
- const fieldTranslations = this.generateFieldTranslations(displayFields, formFields, 'zh-CN');
18
+ const fieldTranslations = this.generateFieldTranslations(displayFields, formFields, "zh-CN");
19
19
  // 生成占位符翻译
20
- const placeholderTranslations = this.generatePlaceholderTranslations(formFields, 'zh-CN');
20
+ const placeholderTranslations = this.generatePlaceholderTranslations(formFields, "zh-CN");
21
21
  return JSON.stringify({
22
22
  [this.controller]: {
23
23
  title: `${capitalizedController} 管理`,
24
24
  fields: fieldTranslations,
25
25
  buttons: {
26
- add: '新增',
27
- edit: '修改',
28
- delete: '删除',
29
- search: '搜索',
30
- export: '导出',
31
- import: '导入',
32
- batchDelete: '批量删除',
33
- confirm: '确认',
34
- cancel: '取消',
26
+ add: "新增",
27
+ edit: "修改",
28
+ delete: "删除",
29
+ search: "搜索",
30
+ export: "导出",
31
+ import: "导入",
32
+ batchDelete: "批量删除",
33
+ confirm: "确认",
34
+ cancel: "取消",
35
35
  },
36
36
  placeholders: placeholderTranslations,
37
37
  messages: {
38
- confirmDelete: '确认删除吗',
39
- confirmBatchDelete: '确认批量删除吗',
40
- uploadSuccess: '文件上传成功',
41
- uploadFailed: '文件上传失败',
42
- onlyExcel: '只能上传 Excel 文件!',
43
- fileSizeLimit: '文件大小不能超过 2MB!',
44
- noData: '没有数据无需导出',
45
- noDataBatchDelete: '没有数据不能批量删除',
38
+ confirmDelete: "确认删除吗",
39
+ confirmBatchDelete: "确认批量删除吗",
40
+ uploadSuccess: "文件上传成功",
41
+ uploadFailed: "文件上传失败",
42
+ onlyExcel: "只能上传 Excel 文件!",
43
+ fileSizeLimit: "文件大小不能超过 2MB!",
44
+ noData: "没有数据无需导出",
45
+ noDataBatchDelete: "没有数据不能批量删除",
46
46
  },
47
47
  modal: {
48
48
  addTitle: `新增 ${capitalizedController}`,
49
49
  editTitle: `修改 ${capitalizedController}`,
50
50
  },
51
51
  pagination: {
52
- total: '共 {{total}} 条记录',
52
+ total: "共 {{total}} 条记录",
53
53
  },
54
54
  },
55
55
  }, null, 2);
@@ -62,41 +62,41 @@ class I18nGenerator extends base_generator_1.BaseGenerator {
62
62
  const formFields = this.getFormFields();
63
63
  const displayFields = this.getDisplayFields();
64
64
  // 生成字段翻译
65
- const fieldTranslations = this.generateFieldTranslations(displayFields, formFields, 'en-US');
65
+ const fieldTranslations = this.generateFieldTranslations(displayFields, formFields, "en-US");
66
66
  // 生成占位符翻译
67
- const placeholderTranslations = this.generatePlaceholderTranslations(formFields, 'en-US');
67
+ const placeholderTranslations = this.generatePlaceholderTranslations(formFields, "en-US");
68
68
  return JSON.stringify({
69
69
  [this.controller]: {
70
70
  title: `${capitalizedController} Management`,
71
71
  fields: fieldTranslations,
72
72
  buttons: {
73
- add: 'Add',
74
- edit: 'Edit',
75
- delete: 'Delete',
76
- search: 'Search',
77
- export: 'Export',
78
- import: 'Import',
79
- batchDelete: 'Batch Delete',
80
- confirm: 'Confirm',
81
- cancel: 'Cancel',
73
+ add: "Add",
74
+ edit: "Edit",
75
+ delete: "Delete",
76
+ search: "Search",
77
+ export: "Export",
78
+ import: "Import",
79
+ batchDelete: "Batch Delete",
80
+ confirm: "Confirm",
81
+ cancel: "Cancel",
82
82
  },
83
83
  placeholders: placeholderTranslations,
84
84
  messages: {
85
- confirmDelete: 'Are you sure to delete?',
86
- confirmBatchDelete: 'Are you sure to batch delete?',
87
- uploadSuccess: 'File uploaded successfully',
88
- uploadFailed: 'File upload failed',
89
- onlyExcel: 'Only Excel files are allowed!',
90
- fileSizeLimit: 'File size cannot exceed 2MB!',
91
- noData: 'No data to export',
92
- noDataBatchDelete: 'No data to batch delete',
85
+ confirmDelete: "Are you sure to delete?",
86
+ confirmBatchDelete: "Are you sure to batch delete?",
87
+ uploadSuccess: "File uploaded successfully",
88
+ uploadFailed: "File upload failed",
89
+ onlyExcel: "Only Excel files are allowed!",
90
+ fileSizeLimit: "File size cannot exceed 2MB!",
91
+ noData: "No data to export",
92
+ noDataBatchDelete: "No data to batch delete",
93
93
  },
94
94
  modal: {
95
95
  addTitle: `Add ${capitalizedController}`,
96
96
  editTitle: `Edit ${capitalizedController}`,
97
97
  },
98
98
  pagination: {
99
- total: 'Total {{total}} records',
99
+ total: "Total {{total}} records",
100
100
  },
101
101
  },
102
102
  }, null, 2);
@@ -109,41 +109,41 @@ class I18nGenerator extends base_generator_1.BaseGenerator {
109
109
  const formFields = this.getFormFields();
110
110
  const displayFields = this.getDisplayFields();
111
111
  // 生成字段翻译
112
- const fieldTranslations = this.generateFieldTranslations(displayFields, formFields, 'ja-JP');
112
+ const fieldTranslations = this.generateFieldTranslations(displayFields, formFields, "ja-JP");
113
113
  // 生成占位符翻译
114
- const placeholderTranslations = this.generatePlaceholderTranslations(formFields, 'ja-JP');
114
+ const placeholderTranslations = this.generatePlaceholderTranslations(formFields, "ja-JP");
115
115
  return JSON.stringify({
116
116
  [this.controller]: {
117
117
  title: `${capitalizedController}管理`,
118
118
  fields: fieldTranslations,
119
119
  buttons: {
120
- add: '追加',
121
- edit: '編集',
122
- delete: '削除',
123
- search: '検索',
124
- export: 'エクスポート',
125
- import: 'インポート',
126
- batchDelete: '一括削除',
127
- confirm: '確認',
128
- cancel: 'キャンセル',
120
+ add: "追加",
121
+ edit: "編集",
122
+ delete: "削除",
123
+ search: "検索",
124
+ export: "エクスポート",
125
+ import: "インポート",
126
+ batchDelete: "一括削除",
127
+ confirm: "確認",
128
+ cancel: "キャンセル",
129
129
  },
130
130
  placeholders: placeholderTranslations,
131
131
  messages: {
132
- confirmDelete: '削除してもよろしいですか?',
133
- confirmBatchDelete: '一括削除してもよろしいですか?',
134
- uploadSuccess: 'ファイルのアップロードが成功しました',
135
- uploadFailed: 'ファイルのアップロードが失敗しました',
136
- onlyExcel: 'Excelファイルのみアップロード可能です!',
137
- fileSizeLimit: 'ファイルサイズは2MBを超えることはできません!',
138
- noData: 'エクスポートするデータがありません',
139
- noDataBatchDelete: '一括削除するデータがありません',
132
+ confirmDelete: "削除してもよろしいですか?",
133
+ confirmBatchDelete: "一括削除してもよろしいですか?",
134
+ uploadSuccess: "ファイルのアップロードが成功しました",
135
+ uploadFailed: "ファイルのアップロードが失敗しました",
136
+ onlyExcel: "Excelファイルのみアップロード可能です!",
137
+ fileSizeLimit: "ファイルサイズは2MBを超えることはできません!",
138
+ noData: "エクスポートするデータがありません",
139
+ noDataBatchDelete: "一括削除するデータがありません",
140
140
  },
141
141
  modal: {
142
142
  addTitle: `${capitalizedController}を追加`,
143
143
  editTitle: `${capitalizedController}を編集`,
144
144
  },
145
145
  pagination: {
146
- total: '合計 {{total}} 件',
146
+ total: "合計 {{total}} 件",
147
147
  },
148
148
  },
149
149
  }, null, 2);
@@ -174,15 +174,15 @@ class I18nGenerator extends base_generator_1.BaseGenerator {
174
174
  const capitalizedName = fieldName.charAt(0).toUpperCase() + fieldName.slice(1);
175
175
  const fieldTranslation = this.getFieldTranslation(field, locale);
176
176
  switch (locale) {
177
- case 'zh-CN':
177
+ case "zh-CN":
178
178
  translations[`enter${capitalizedName}`] = `请输入${fieldTranslation}搜索`;
179
179
  translations[`input${capitalizedName}`] = `请输入${fieldTranslation}`;
180
180
  break;
181
- case 'en-US':
181
+ case "en-US":
182
182
  translations[`enter${capitalizedName}`] = `Enter ${fieldTranslation.toLowerCase()} to search`;
183
183
  translations[`input${capitalizedName}`] = `Enter ${fieldTranslation.toLowerCase()}`;
184
184
  break;
185
- case 'ja-JP':
185
+ case "ja-JP":
186
186
  translations[`enter${capitalizedName}`] = `${fieldTranslation}を入力して検索`;
187
187
  translations[`input${capitalizedName}`] = `${fieldTranslation}を入力`;
188
188
  break;
@@ -195,41 +195,41 @@ class I18nGenerator extends base_generator_1.BaseGenerator {
195
195
  */
196
196
  getFieldTranslation(field, locale) {
197
197
  // 如果字段有注释且是中文环境,直接使用注释
198
- if (field.comment && locale === 'zh-CN') {
198
+ if (field.comment && locale === "zh-CN") {
199
199
  return field.comment;
200
200
  }
201
201
  // 根据字段名生成对应语言的翻译
202
202
  switch (field.name.toLowerCase()) {
203
- case 'id':
204
- return 'ID';
205
- case 'name':
206
- return locale === 'zh-CN' ? '名称' : locale === 'en-US' ? 'Name' : '名前';
207
- case 'email':
208
- return locale === 'zh-CN' ? '邮箱' : locale === 'en-US' ? 'Email' : 'メール';
209
- case 'phone':
210
- return locale === 'zh-CN' ? '电话' : locale === 'en-US' ? 'Phone' : '電話';
211
- case 'address':
212
- return locale === 'zh-CN' ? '地址' : locale === 'en-US' ? 'Address' : '住所';
213
- case 'description':
214
- return locale === 'zh-CN' ? '描述' : locale === 'en-US' ? 'Description' : '説明';
215
- case 'status':
216
- return locale === 'zh-CN' ? '状态' : locale === 'en-US' ? 'Status' : 'ステータス';
217
- case 'created_at':
218
- case 'create_date':
219
- return locale === 'zh-CN' ? '创建时间' : locale === 'en-US' ? 'Created At' : '作成日時';
220
- case 'updated_at':
221
- case 'update_date':
222
- return locale === 'zh-CN' ? '更新时间' : locale === 'en-US' ? 'Updated At' : '更新日時';
203
+ case "id":
204
+ return "ID";
205
+ case "name":
206
+ return locale === "zh-CN" ? "名称" : locale === "en-US" ? "Name" : "名前";
207
+ case "email":
208
+ return locale === "zh-CN" ? "邮箱" : locale === "en-US" ? "Email" : "メール";
209
+ case "phone":
210
+ return locale === "zh-CN" ? "电话" : locale === "en-US" ? "Phone" : "電話";
211
+ case "address":
212
+ return locale === "zh-CN" ? "地址" : locale === "en-US" ? "Address" : "住所";
213
+ case "description":
214
+ return locale === "zh-CN" ? "描述" : locale === "en-US" ? "Description" : "説明";
215
+ case "status":
216
+ return locale === "zh-CN" ? "状态" : locale === "en-US" ? "Status" : "ステータス";
217
+ case "created_at":
218
+ case "create_date":
219
+ return locale === "zh-CN" ? "创建时间" : locale === "en-US" ? "Created At" : "作成日時";
220
+ case "updated_at":
221
+ case "update_date":
222
+ return locale === "zh-CN" ? "更新时间" : locale === "en-US" ? "Updated At" : "更新日時";
223
223
  default:
224
224
  // 如果有中文注释,根据语言环境处理
225
225
  if (field.comment) {
226
226
  switch (locale) {
227
- case 'zh-CN':
227
+ case "zh-CN":
228
228
  return field.comment;
229
- case 'en-US':
229
+ case "en-US":
230
230
  // 尝试将中文字段名转换为英文(简单映射)
231
231
  return this.translateChineseToEnglish(field.comment) || this.formatFieldName(field.name);
232
- case 'ja-JP':
232
+ case "ja-JP":
233
233
  // 尝试将中文字段名转换为日文(简单映射)
234
234
  return this.translateChineseToJapanese(field.comment) || this.formatFieldName(field.name);
235
235
  default:
@@ -245,14 +245,14 @@ class I18nGenerator extends base_generator_1.BaseGenerator {
245
245
  */
246
246
  getActionsTranslation(locale) {
247
247
  switch (locale) {
248
- case 'zh-CN':
249
- return '操作';
250
- case 'en-US':
251
- return 'Actions';
252
- case 'ja-JP':
253
- return '操作';
248
+ case "zh-CN":
249
+ return "操作";
250
+ case "en-US":
251
+ return "Actions";
252
+ case "ja-JP":
253
+ return "操作";
254
254
  default:
255
- return 'Actions';
255
+ return "Actions";
256
256
  }
257
257
  }
258
258
  /**
@@ -260,29 +260,29 @@ class I18nGenerator extends base_generator_1.BaseGenerator {
260
260
  */
261
261
  formatFieldName(fieldName) {
262
262
  // 将下划线转换为空格并首字母大写
263
- return fieldName.replace(/_/g, ' ').replace(/\b\w/g, (l) => l.toUpperCase());
263
+ return fieldName.replace(/_/g, " ").replace(/\b\w/g, (l) => l.toUpperCase());
264
264
  }
265
265
  /**
266
266
  * 简单的中文到英文翻译映射
267
267
  */
268
268
  translateChineseToEnglish(chinese) {
269
269
  const translations = {
270
- 用户名: 'Username',
271
- 用户: 'User',
272
- 邮箱: 'Email',
273
- 电话: 'Phone',
274
- 手机: 'Mobile',
275
- 地址: 'Address',
276
- 描述: 'Description',
277
- 状态: 'Status',
278
- 名称: 'Name',
279
- 标题: 'Title',
280
- 内容: 'Content',
281
- 价格: 'Price',
282
- 数量: 'Quantity',
283
- 创建时间: 'Created At',
284
- 更新时间: 'Updated At',
285
- 修改时间: 'Modified At',
270
+ 用户名: "Username",
271
+ 用户: "User",
272
+ 邮箱: "Email",
273
+ 电话: "Phone",
274
+ 手机: "Mobile",
275
+ 地址: "Address",
276
+ 描述: "Description",
277
+ 状态: "Status",
278
+ 名称: "Name",
279
+ 标题: "Title",
280
+ 内容: "Content",
281
+ 价格: "Price",
282
+ 数量: "Quantity",
283
+ 创建时间: "Created At",
284
+ 更新时间: "Updated At",
285
+ 修改时间: "Modified At",
286
286
  };
287
287
  return translations[chinese] || null;
288
288
  }
@@ -291,22 +291,22 @@ class I18nGenerator extends base_generator_1.BaseGenerator {
291
291
  */
292
292
  translateChineseToJapanese(chinese) {
293
293
  const translations = {
294
- 用户名: 'ユーザー名',
295
- 用户: 'ユーザー',
296
- 邮箱: 'メール',
297
- 电话: '電話',
298
- 手机: '携帯電話',
299
- 地址: '住所',
300
- 描述: '説明',
301
- 状态: 'ステータス',
302
- 名称: '名前',
303
- 标题: 'タイトル',
304
- 内容: '内容',
305
- 价格: '価格',
306
- 数量: '数量',
307
- 创建时间: '作成日時',
308
- 更新时间: '更新日時',
309
- 修改时间: '変更日時',
294
+ 用户名: "ユーザー名",
295
+ 用户: "ユーザー",
296
+ 邮箱: "メール",
297
+ 电话: "電話",
298
+ 手机: "携帯電話",
299
+ 地址: "住所",
300
+ 描述: "説明",
301
+ 状态: "ステータス",
302
+ 名称: "名前",
303
+ 标题: "タイトル",
304
+ 内容: "内容",
305
+ 价格: "価格",
306
+ 数量: "数量",
307
+ 创建时间: "作成日時",
308
+ 更新时间: "更新日時",
309
+ 修改时间: "変更日時",
310
310
  };
311
311
  return translations[chinese] || null;
312
312
  }
@@ -1,4 +1,4 @@
1
- import { BaseGenerator } from './base-generator';
1
+ import { BaseGenerator } from "./base-generator";
2
2
  /**
3
3
  * 页面生成器
4
4
  * 基于现有的 pages/template/manage.tsx 模板生成页面组件
@@ -65,7 +65,7 @@ const Page = ({ ${this.controller} }) => {
65
65
  const dispatch = useDispatch<AppDispatch>()
66
66
  const [isModalVisiable, setIsModalVisible] = useState(false)
67
67
  const [modalId, setModalId] = useState(0)
68
- ${this.generateModalStates()}${mainSearchField ? `\n const [search${mainSearchField.name.charAt(0).toUpperCase() + mainSearchField.name.slice(1)}, setSearch${mainSearchField.name.charAt(0).toUpperCase() + mainSearchField.name.slice(1)}] = useState('')` : ''}
68
+ ${this.generateModalStates()}${mainSearchField ? `\n const [search${mainSearchField.name.charAt(0).toUpperCase() + mainSearchField.name.slice(1)}, setSearch${mainSearchField.name.charAt(0).toUpperCase() + mainSearchField.name.slice(1)}] = useState('')` : ""}
69
69
  const [batchDelIds, setBatchDelIds] = useState([])
70
70
 
71
71
  const keyTitles = {
@@ -192,7 +192,7 @@ ${this.generateClientValidation()}
192
192
  const doSearch = () => {
193
193
  ${mainSearchField
194
194
  ? `const searchData = { ${mainSearchField.name}: handleXSS(search${mainSearchField.name.charAt(0).toUpperCase() + mainSearchField.name.slice(1)}) }`
195
- : 'const searchData = {}'}
195
+ : "const searchData = {}"}
196
196
  dispatch(search${capitalizedController}(0, pageSize, searchData))
197
197
  }
198
198
 
@@ -298,7 +298,7 @@ ${this.generateExcelColumns()}
298
298
  onChange={(e) => setSearch${mainSearchField.name.charAt(0).toUpperCase() + mainSearchField.name.slice(1)}(e.target.value)}
299
299
  onPressEnter={doSearch}
300
300
  />`
301
- : ''}
301
+ : ""}
302
302
  <StyledButton type="primary" onClick={doSearch} $primary>
303
303
  <IconWrapper className="fa fa-search"></IconWrapper>
304
304
  {t('${this.controller}:${this.controller}.buttons.search')}
@@ -337,7 +337,7 @@ ${this.generateExcelColumns()}
337
337
  onChange: (page, pageSize) => {
338
338
  ${mainSearchField
339
339
  ? `const searchData = { ${mainSearchField.name}: handleXSS(search${mainSearchField.name.charAt(0).toUpperCase() + mainSearchField.name.slice(1)}) }`
340
- : 'const searchData = {}'}
340
+ : "const searchData = {}"}
341
341
  dispatch(search${capitalizedController}(page - 1, pageSize, searchData))
342
342
  },
343
343
  className: 'styled-pagination'
@@ -400,7 +400,7 @@ export default Page`;
400
400
  .map((field) => {
401
401
  return ` ${field.name}: t('${this.controller}:${this.controller}.fields.${field.name}')`;
402
402
  })
403
- .join(',\n');
403
+ .join(",\n");
404
404
  }
405
405
  /**
406
406
  * 生成模态框状态变量
@@ -411,14 +411,14 @@ export default Page`;
411
411
  const capitalizedName = field.name.charAt(0).toUpperCase() + field.name.slice(1);
412
412
  return ` const [modal${capitalizedName}, setModal${capitalizedName}] = useState('')`;
413
413
  })
414
- .join('\n');
414
+ .join("\n");
415
415
  }
416
416
  /**
417
417
  * 生成记录解构
418
418
  */
419
419
  generateRecordDestructuring() {
420
420
  const fields = this.getFormFields().map((field) => field.name);
421
- return fields.length > 0 ? `, ${fields.join(', ')}` : '';
421
+ return fields.length > 0 ? `, ${fields.join(", ")}` : "";
422
422
  }
423
423
  /**
424
424
  * 生成模态框重置状态
@@ -429,7 +429,7 @@ export default Page`;
429
429
  const capitalizedName = field.name.charAt(0).toUpperCase() + field.name.slice(1);
430
430
  return ` setModal${capitalizedName}('')`;
431
431
  })
432
- .join('\n');
432
+ .join("\n");
433
433
  }
434
434
  /**
435
435
  * 生成模态框设置状态
@@ -440,7 +440,7 @@ export default Page`;
440
440
  const capitalizedName = field.name.charAt(0).toUpperCase() + field.name.slice(1);
441
441
  return ` setModal${capitalizedName}(${field.name})`;
442
442
  })
443
- .join('\n');
443
+ .join("\n");
444
444
  }
445
445
  /**
446
446
  * 生成模态框对象
@@ -451,7 +451,7 @@ export default Page`;
451
451
  const capitalizedName = field.name.charAt(0).toUpperCase() + field.name.slice(1);
452
452
  return ` ${field.name}: handleXSS(modal${capitalizedName})`;
453
453
  })
454
- .join(',\n');
454
+ .join(",\n");
455
455
  }
456
456
  /**
457
457
  * 生成模态框字段
@@ -466,12 +466,12 @@ export default Page`;
466
466
  value={modal${capitalizedName}}
467
467
  placeholder={t('${this.controller}:${this.controller}.placeholders.input${capitalizedName}')}
468
468
  allowClear
469
- ${field === fields[0] ? 'autoFocus' : ''}
469
+ ${field === fields[0] ? "autoFocus" : ""}
470
470
  onChange={(e) => setModal${capitalizedName}(e.target.value)}
471
471
  />
472
472
  </div>`;
473
473
  })
474
- .join('\n');
474
+ .join("\n");
475
475
  }
476
476
  /**
477
477
  * 生成Excel列配置
@@ -480,40 +480,40 @@ export default Page`;
480
480
  const displayFields = this.getDisplayFields();
481
481
  return displayFields
482
482
  .map((field, index) => {
483
- const width = field.type === 'text' ? 50 : field.type === 'integer' ? 15 : 30;
483
+ const width = field.type === "text" ? 50 : field.type === "integer" ? 15 : 30;
484
484
  return ` { header: '${(field.comment || field.name).toUpperCase()}', key: 'header${index + 1}', width: ${width} }`;
485
485
  })
486
- .join(',\n');
486
+ .join(",\n");
487
487
  }
488
488
  generateTableColumns(fields) {
489
489
  const columns = fields.map((field, index) => {
490
490
  let column = ` {\n title: t('${this.controller}:${this.controller}.fields.${field.name}'),\n dataIndex: '${field.name}',\n key: '${field.name}'`;
491
491
  // 添加排序功能
492
- if (field.type === 'integer') {
492
+ if (field.type === "integer") {
493
493
  column += `,\n sorter: (a: any, b: any) => a.${field.name} - b.${field.name}`;
494
494
  }
495
- else if (field.type === 'varchar' || field.type === 'text') {
495
+ else if (field.type === "varchar" || field.type === "text") {
496
496
  column += `,\n sorter: (a: any, b: any) => a.${field.name}.length - b.${field.name}.length`;
497
497
  }
498
498
  // 添加排序方向和提示
499
- if (field.type === 'integer' || field.type === 'varchar' || field.type === 'text') {
499
+ if (field.type === "integer" || field.type === "varchar" || field.type === "text") {
500
500
  column += `,\n sortDirections: ['descend', 'ascend'],\n showSorterTooltip: false`;
501
501
  }
502
502
  // 根据字段类型设置特定属性
503
- if (field.type === 'timestamp' || field.type === 'date' || field.type === 'datetime') {
503
+ if (field.type === "timestamp" || field.type === "date" || field.type === "datetime") {
504
504
  column += `,\n render: (text: string) => text ? new Date(text).toLocaleString() : '-'`;
505
505
  }
506
- else if (field.type === 'integer' || field.type === 'decimal') {
506
+ else if (field.type === "integer" || field.type === "decimal") {
507
507
  column += `,\n align: 'center' as const`;
508
508
  }
509
509
  // 设置宽度
510
- if (field.name === 'id') {
510
+ if (field.name === "id") {
511
511
  column += `,\n width: '15%',\n align: 'center' as const`;
512
512
  }
513
513
  else if (index === fields.length - 1) {
514
514
  column += `,\n width: '60%',\n ellipsis: true`;
515
515
  }
516
- column += '\n }';
516
+ column += "\n }";
517
517
  return column;
518
518
  });
519
519
  // 添加操作列
@@ -548,15 +548,15 @@ export default Page`;
548
548
  )
549
549
  }
550
550
  }`;
551
- return [...columns, actionColumn].join(',\n');
551
+ return [...columns, actionColumn].join(",\n");
552
552
  }
553
553
  /**
554
554
  * 生成客户端验证逻辑
555
555
  */
556
556
  generateClientValidation() {
557
- const integerFields = this.getFormFields().filter((field) => field.type === 'integer');
557
+ const integerFields = this.getFormFields().filter((field) => field.type === "integer");
558
558
  if (integerFields.length === 0) {
559
- return '';
559
+ return "";
560
560
  }
561
561
  const validations = integerFields.map((field) => {
562
562
  const fieldName = field.name;
@@ -572,7 +572,7 @@ export default Page`;
572
572
  modalObj.${fieldName} = parsed${capitalizedName}
573
573
  }`;
574
574
  });
575
- return `${validations.join('\n\n')}\n\n`;
575
+ return `${validations.join("\n\n")}\n\n`;
576
576
  }
577
577
  }
578
578
  exports.PageGenerator = PageGenerator;
@@ -1,4 +1,4 @@
1
- import { BaseGenerator } from './base-generator';
1
+ import { BaseGenerator } from "./base-generator";
2
2
  /**
3
3
  * Resolver生成器
4
4
  */