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.
- package/client/components/Button.tsx +3 -3
- package/client/components/ClientProviders.tsx +12 -12
- package/client/components/LanguageSwitcher.tsx +26 -26
- package/client/components/SSRSafeAntdProvider.tsx +7 -7
- package/client/components/SuppressHydrationWarnings.tsx +30 -30
- package/client/components/__tests__/Button.test.tsx +12 -12
- package/client/layout/index.tsx +124 -124
- package/client/redux/reducers.ts +2 -2
- package/client/redux/store.ts +24 -24
- package/client/redux/template/manage/actions.ts +40 -40
- package/client/redux/template/manage/reducers.ts +32 -32
- package/client/redux/template/manage/types.ts +19 -19
- package/client/service/template/manage.ts +29 -29
- package/client/styled/common.ts +6 -6
- package/client/styled/layout/index.ts +17 -17
- package/client/styled/template/manage.ts +19 -19
- package/client/utils/common.ts +54 -54
- package/client/utils/cookie.ts +30 -30
- package/client/utils/fetch.ts +111 -111
- package/client/utils/i18n.ts +41 -41
- package/client/utils/menu.tsx +12 -12
- package/client/utils/navigation.ts +22 -22
- package/client/utils/sso.ts +124 -124
- package/client/utils/suppressWarnings.ts +17 -17
- package/generation/prettierrc +6 -0
- package/lib/args.js +19 -19
- package/lib/cli/app.d.ts +1 -1
- package/lib/cli/app.js +2 -2
- package/lib/cli/commands/build.d.ts +1 -1
- package/lib/cli/commands/build.js +9 -9
- package/lib/cli/commands/create.d.ts +1 -1
- package/lib/cli/commands/create.js +36 -36
- package/lib/cli/commands/delete.d.ts +1 -1
- package/lib/cli/commands/delete.js +55 -55
- package/lib/cli/commands/export.d.ts +1 -1
- package/lib/cli/commands/export.js +12 -12
- package/lib/cli/commands/help.d.ts +1 -1
- package/lib/cli/commands/help.js +29 -29
- package/lib/cli/commands/init.d.ts +1 -1
- package/lib/cli/commands/init.js +31 -31
- package/lib/cli/commands/server.d.ts +1 -1
- package/lib/cli/commands/server.js +12 -12
- package/lib/cli/commands/upgrade.d.ts +1 -1
- package/lib/cli/commands/upgrade.js +13 -13
- package/lib/cli/commands/version.d.ts +1 -1
- package/lib/cli/commands/version.js +7 -7
- package/lib/cli/index.d.ts +13 -13
- package/lib/cli/parser.d.ts +1 -1
- package/lib/cli/parser.js +12 -12
- package/lib/cli/registry.d.ts +1 -1
- package/lib/cli/types.d.ts +2 -2
- package/lib/cli/utils/console.d.ts +2 -2
- package/lib/cli/utils/console.js +22 -22
- package/lib/cli/utils/index.d.ts +2 -2
- package/lib/cli/utils/prompt.d.ts +1 -1
- package/lib/cli/utils/prompt.js +98 -98
- package/lib/constants.js +28 -28
- package/lib/generate.d.ts +2 -2
- package/lib/generate.js +19 -19
- package/lib/generate_create.d.ts +1 -1
- package/lib/generate_create.js +38 -38
- package/lib/generate_delete.js +63 -63
- package/lib/generate_init.js +94 -94
- package/lib/generators/base-generator.d.ts +1 -1
- package/lib/generators/base-generator.js +23 -23
- package/lib/generators/file-generator.js +15 -15
- package/lib/generators/generator-factory.d.ts +5 -5
- package/lib/generators/i18n-generator.d.ts +1 -1
- package/lib/generators/i18n-generator.js +127 -127
- package/lib/generators/page-generator.d.ts +1 -1
- package/lib/generators/page-generator.js +25 -25
- package/lib/generators/resolver-generator.d.ts +1 -1
- package/lib/generators/resolver-generator.js +27 -27
- package/lib/generators/schema-generator.d.ts +1 -1
- package/lib/generators/schema-generator.js +4 -4
- package/lib/generators/service-generator.d.ts +1 -1
- package/lib/generators/service-generator.js +29 -29
- package/lib/generators/sql-generator.d.ts +1 -1
- package/lib/generators/sql-generator.js +10 -10
- package/lib/index.js +23 -23
- package/lib/server/csrf.d.ts +3 -3
- package/lib/server/csrf.js +20 -20
- package/lib/server/db.d.ts +1 -1
- package/lib/server/db.js +21 -21
- package/lib/server/graphql.js +26 -26
- package/lib/server/plugins/date.d.ts +1 -1
- package/lib/server/plugins/date.js +6 -6
- package/lib/server/utils/graphql-cache.js +5 -5
- package/lib/tsconfig.build.tsbuildinfo +1 -1
- package/lib/utils/project-config.d.ts +1 -1
- package/lib/utils/project-config.js +20 -20
- package/lib/utils.js +3 -3
- package/package.json +1 -1
- package/pages/_app.tsx +62 -62
- package/pages/_document.tsx +15 -15
- package/pages/_error.tsx +26 -26
- package/pages/index.tsx +48 -48
- package/pages/login.tsx +64 -64
- 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,
|
|
18
|
+
const fieldTranslations = this.generateFieldTranslations(displayFields, formFields, "zh-CN");
|
|
19
19
|
// 生成占位符翻译
|
|
20
|
-
const placeholderTranslations = this.generatePlaceholderTranslations(formFields,
|
|
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:
|
|
43
|
-
fileSizeLimit:
|
|
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:
|
|
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,
|
|
65
|
+
const fieldTranslations = this.generateFieldTranslations(displayFields, formFields, "en-US");
|
|
66
66
|
// 生成占位符翻译
|
|
67
|
-
const placeholderTranslations = this.generatePlaceholderTranslations(formFields,
|
|
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:
|
|
74
|
-
edit:
|
|
75
|
-
delete:
|
|
76
|
-
search:
|
|
77
|
-
export:
|
|
78
|
-
import:
|
|
79
|
-
batchDelete:
|
|
80
|
-
confirm:
|
|
81
|
-
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:
|
|
86
|
-
confirmBatchDelete:
|
|
87
|
-
uploadSuccess:
|
|
88
|
-
uploadFailed:
|
|
89
|
-
onlyExcel:
|
|
90
|
-
fileSizeLimit:
|
|
91
|
-
noData:
|
|
92
|
-
noDataBatchDelete:
|
|
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:
|
|
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,
|
|
112
|
+
const fieldTranslations = this.generateFieldTranslations(displayFields, formFields, "ja-JP");
|
|
113
113
|
// 生成占位符翻译
|
|
114
|
-
const placeholderTranslations = this.generatePlaceholderTranslations(formFields,
|
|
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:
|
|
137
|
-
fileSizeLimit:
|
|
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:
|
|
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
|
|
177
|
+
case "zh-CN":
|
|
178
178
|
translations[`enter${capitalizedName}`] = `请输入${fieldTranslation}搜索`;
|
|
179
179
|
translations[`input${capitalizedName}`] = `请输入${fieldTranslation}`;
|
|
180
180
|
break;
|
|
181
|
-
case
|
|
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
|
|
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 ===
|
|
198
|
+
if (field.comment && locale === "zh-CN") {
|
|
199
199
|
return field.comment;
|
|
200
200
|
}
|
|
201
201
|
// 根据字段名生成对应语言的翻译
|
|
202
202
|
switch (field.name.toLowerCase()) {
|
|
203
|
-
case
|
|
204
|
-
return
|
|
205
|
-
case
|
|
206
|
-
return locale ===
|
|
207
|
-
case
|
|
208
|
-
return locale ===
|
|
209
|
-
case
|
|
210
|
-
return locale ===
|
|
211
|
-
case
|
|
212
|
-
return locale ===
|
|
213
|
-
case
|
|
214
|
-
return locale ===
|
|
215
|
-
case
|
|
216
|
-
return locale ===
|
|
217
|
-
case
|
|
218
|
-
case
|
|
219
|
-
return locale ===
|
|
220
|
-
case
|
|
221
|
-
case
|
|
222
|
-
return locale ===
|
|
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
|
|
227
|
+
case "zh-CN":
|
|
228
228
|
return field.comment;
|
|
229
|
-
case
|
|
229
|
+
case "en-US":
|
|
230
230
|
// 尝试将中文字段名转换为英文(简单映射)
|
|
231
231
|
return this.translateChineseToEnglish(field.comment) || this.formatFieldName(field.name);
|
|
232
|
-
case
|
|
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
|
|
249
|
-
return
|
|
250
|
-
case
|
|
251
|
-
return
|
|
252
|
-
case
|
|
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
|
|
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,
|
|
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
|
-
用户名:
|
|
271
|
-
用户:
|
|
272
|
-
邮箱:
|
|
273
|
-
电话:
|
|
274
|
-
手机:
|
|
275
|
-
地址:
|
|
276
|
-
描述:
|
|
277
|
-
状态:
|
|
278
|
-
名称:
|
|
279
|
-
标题:
|
|
280
|
-
内容:
|
|
281
|
-
价格:
|
|
282
|
-
数量:
|
|
283
|
-
创建时间:
|
|
284
|
-
更新时间:
|
|
285
|
-
修改时间:
|
|
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
|
}
|
|
@@ -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
|
-
:
|
|
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
|
-
:
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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] ?
|
|
469
|
+
${field === fields[0] ? "autoFocus" : ""}
|
|
470
470
|
onChange={(e) => setModal${capitalizedName}(e.target.value)}
|
|
471
471
|
/>
|
|
472
472
|
</div>`;
|
|
473
473
|
})
|
|
474
|
-
.join(
|
|
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 ===
|
|
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(
|
|
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 ===
|
|
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 ===
|
|
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 ===
|
|
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 ===
|
|
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 ===
|
|
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 ===
|
|
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 +=
|
|
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(
|
|
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 ===
|
|
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(
|
|
575
|
+
return `${validations.join("\n\n")}\n\n`;
|
|
576
576
|
}
|
|
577
577
|
}
|
|
578
578
|
exports.PageGenerator = PageGenerator;
|