@liujitcn/kratos-admin-system 0.0.39 → 0.0.40

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 (39) hide show
  1. package/README.md +22 -0
  2. package/dist/package/declarations/src/api/system/admin/v1/base_config.d.ts +1 -5
  3. package/dist/package/declarations/src/components/DynamicI18nCell.vue.d.ts +2 -8
  4. package/dist/package/declarations/src/components/DynamicI18nEditor.vue.d.ts +20 -3
  5. package/dist/package/declarations/src/components/dynamicI18n.d.ts +2 -2
  6. package/dist/package/declarations/src/locales/generated.d.ts +5797 -5813
  7. package/dist/package/declarations/src/rpc/system/admin/v1/base_config.d.ts +4 -40
  8. package/dist/package/declarations/src/utils/code-gen-progress.d.ts +3 -0
  9. package/dist/package/declarations/src/views/tool/code-gen/components/CodeGenGenerateConfirm.vue.d.ts +11 -0
  10. package/dist/package/declarations/src/views/tool/code-gen/components/CodeGenLocaleEditor.vue.d.ts +5 -9
  11. package/dist/package/declarations/src/views/tool/code-gen/config.d.ts +3 -0
  12. package/dist/package/src/api/system/admin/v1/base_config.ts +0 -20
  13. package/dist/package/src/components/DynamicI18nCell.vue +55 -220
  14. package/dist/package/src/components/DynamicI18nEditor.vue +150 -146
  15. package/dist/package/src/components/dynamicI18n.ts +10 -6
  16. package/dist/package/src/config/index.ts +1 -3
  17. package/dist/package/src/locales/en-US.json +1430 -1434
  18. package/dist/package/src/locales/ja-JP.json +1430 -1434
  19. package/dist/package/src/locales/zh-CN.json +1429 -1433
  20. package/dist/package/src/locales/zh-TW.json +1429 -1433
  21. package/dist/package/src/module.ts +0 -1
  22. package/dist/package/src/rpc/system/admin/v1/base_config.ts +3 -43
  23. package/dist/package/src/utils/code-gen-progress.ts +15 -0
  24. package/dist/package/src/views/base/config/index.vue +183 -48
  25. package/dist/package/src/views/base/dict/index.vue +6 -9
  26. package/dist/package/src/views/base/dict/item.vue +6 -15
  27. package/dist/package/src/views/base/job/index.vue +16 -17
  28. package/dist/package/src/views/base/menu/index.vue +78 -15
  29. package/dist/package/src/views/tool/code-gen/columns/index.vue +17 -25
  30. package/dist/package/src/views/tool/code-gen/components/CodeGenGenerateConfirm.vue +115 -0
  31. package/dist/package/src/views/tool/code-gen/components/CodeGenLocaleEditor.vue +27 -186
  32. package/dist/package/src/views/tool/code-gen/components/CodeGenProgressDialog.vue +2 -0
  33. package/dist/package/src/views/tool/code-gen/config.ts +15 -1
  34. package/dist/package/src/views/tool/code-gen/table/index.vue +69 -40
  35. package/package.json +3 -2
  36. package/dist/package/declarations/src/config/database-backup.d.ts +0 -12
  37. package/dist/package/declarations/src/views/base/runtime-config/index.vue.d.ts +0 -3
  38. package/dist/package/src/config/database-backup.ts +0 -57
  39. package/dist/package/src/views/base/runtime-config/index.vue +0 -479
@@ -1,3 +1,5 @@
1
+ import { getEditableLanguageOptions } from "@liujitcn/kratos-admin-system/components/dynamicI18n";
2
+ import type { CodeGenLocaleConfig } from "@liujitcn/kratos-admin-system/rpc/system/admin/v1/base_i18n";
1
3
  import type { FormRules } from "element-plus";
2
4
  import { t } from "@liujitcn/kratos-admin-core";
3
5
  import type { ProFormComponentType, ProFormOption } from "@liujitcn/kratos-admin-core/components/ProForm/interface";
@@ -122,7 +124,9 @@ export function codeGenTableRules(): FormRules {
122
124
  { required: true, type: "number", min: 1, message: t("system.code.gen.validation.parent_menu_required"), trigger: "change" }
123
125
  ],
124
126
  page_type: [{ required: true, max: 32, message: t("system.code.gen.validation.page_type_required"), trigger: "change" }],
125
- parent_column: [{ required: true, max: 64, message: t("system.code.gen.validation.parent_column_required"), trigger: "change" }],
127
+ parent_column: [
128
+ { required: true, max: 64, message: t("system.code.gen.validation.parent_column_required"), trigger: "change" }
129
+ ],
126
130
  tree_label_column: [
127
131
  { required: true, max: 64, message: t("system.code.gen.validation.tree_label_required"), trigger: "change" }
128
132
  ],
@@ -213,3 +217,13 @@ export function createDefaultCodeGenOptionConfig(): CodeGenColumnOptionConfig {
213
217
  lazy: false
214
218
  };
215
219
  }
220
+
221
+ /** 保存代码生成配置时,以原值补齐尚未填写的启用语言描述。 */
222
+ export function withCodeGenLocaleDefaults(values: Map<string, CodeGenLocaleConfig>, comment: string, leftTreeComment = "") {
223
+ const result = new Map(values);
224
+ for (const { value } of getEditableLanguageOptions()) {
225
+ const current = values.get(value);
226
+ result.set(value, { comment: current?.comment || comment, left_tree_comment: current?.left_tree_comment || leftTreeComment });
227
+ }
228
+ return result;
229
+ }
@@ -30,11 +30,16 @@
30
30
  >
31
31
  <template #tableI18nConfig>
32
32
  <CodeGenLocaleEditor
33
- class="code-gen-table-locales"
34
33
  :model-value="formData.i18n_config"
35
34
  :source-comment="formData.comment"
36
- :show-left-tree-comment="formData.page_type === 'left_tree'"
37
- :source-left-tree-comment="formData.left_tree_config?.comment"
35
+ @update:model-value="value => (formData.i18n_config = value)"
36
+ />
37
+ </template>
38
+ <template #leftTreeI18nConfig>
39
+ <CodeGenLocaleEditor
40
+ :model-value="formData.i18n_config"
41
+ :source-comment="formData.left_tree_config?.comment"
42
+ field="left_tree_comment"
38
43
  @update:model-value="value => (formData.i18n_config = value)"
39
44
  />
40
45
  </template>
@@ -51,7 +56,7 @@
51
56
  </template>
52
57
 
53
58
  <script setup lang="ts">
54
- import { computed, nextTick, reactive, ref } from "vue";
59
+ import { computed, h, onBeforeUnmount, nextTick, reactive, ref } from "vue";
55
60
  import { useRouter } from "vue-router";
56
61
  import {
57
62
  CirclePlus,
@@ -90,8 +95,11 @@ import { CodeGenTableStatus } from "@liujitcn/kratos-admin-system/rpc/system/adm
90
95
  import { buildPageRequest, normalizeSelectedIds } from "@liujitcn/kratos-admin-core/table";
91
96
  import { t } from "@liujitcn/kratos-admin-core";
92
97
  import CodeGenProgressDialog from "../components/CodeGenProgressDialog.vue";
98
+ import { loadEnabledBaseLanguages } from "@liujitcn/kratos-admin-system/api/system/admin/v1/base_language";
93
99
  import CodeGenLocaleEditor from "../components/CodeGenLocaleEditor.vue";
100
+ import CodeGenGenerateConfirm from "../components/CodeGenGenerateConfirm.vue";
94
101
  import {
102
+ withCodeGenLocaleDefaults,
95
103
  codeGenPageTypeOptions,
96
104
  codeGenTableRules,
97
105
  createDefaultCodeGenLeftTreeConfig,
@@ -224,20 +232,13 @@ const formFields = computed<ProFormField[]>(() => [
224
232
  },
225
233
  {
226
234
  prop: "comment",
235
+ suffixSlotName: "tableI18nConfig",
227
236
  label: t("system.code.gen.table.field.comment"),
228
237
  component: "input",
229
238
  colSpan: 24,
230
239
  labelTooltip: t("system.code.gen.table.tooltip.comment"),
231
240
  props: { placeholder: t("system.code.gen.table.placeholder.comment") }
232
241
  },
233
- {
234
- prop: "i18n_config",
235
- label: t("system.code.gen.i18n.field.i18ns"),
236
- component: "slot",
237
- slotName: "tableI18nConfig",
238
- colSpan: 24,
239
- labelTooltip: t("system.code.gen.i18n.tooltip.table")
240
- },
241
242
  {
242
243
  prop: "business_module",
243
244
  label: t("system.code.gen.table.field.business_module"),
@@ -315,6 +316,7 @@ const formFields = computed<ProFormField[]>(() => [
315
316
  },
316
317
  {
317
318
  prop: "left_tree_config.comment",
319
+ suffixSlotName: "leftTreeI18nConfig",
318
320
  label: t("system.code.gen.table.field.left_tree_comment"),
319
321
  component: "input",
320
322
  labelTooltip: t("system.code.gen.table.tooltip.left_tree_comment"),
@@ -599,6 +601,37 @@ async function handleOpenCodePreview(tableId: number) {
599
601
  await router.push(`/code/gen/code/preview/${tableId}`);
600
602
  }
601
603
 
604
+ let releaseGenerationHotUpdates: (() => void) | undefined;
605
+
606
+ /** 等待开发服务器暂停热更新,避免生成文件的中间状态反复刷新页面。 */
607
+ async function holdGenerationHotUpdates() {
608
+ const hot = import.meta.hot;
609
+ if (!hot || releaseGenerationHotUpdates) return;
610
+ await new Promise<void>(resolve => {
611
+ const held = () => {
612
+ clearTimeout(timeout);
613
+ hot.off("admin:codegen-held", held);
614
+ releaseGenerationHotUpdates = () => hot.send("admin:codegen-release", {});
615
+ resolve();
616
+ };
617
+ const timeout = setTimeout(() => {
618
+ hot.off("admin:codegen-held", held);
619
+ hot.send("admin:codegen-release", {});
620
+ resolve();
621
+ }, 2000);
622
+ hot.on("admin:codegen-held", held);
623
+ hot.send("admin:codegen-hold", {});
624
+ });
625
+ }
626
+
627
+ /** 任务结束且结果弹窗关闭后恢复开发热更新。 */
628
+ function releaseGenerationUpdates() {
629
+ releaseGenerationHotUpdates?.();
630
+ releaseGenerationHotUpdates = undefined;
631
+ }
632
+
633
+ onBeforeUnmount(releaseGenerationUpdates);
634
+
602
635
  /** 创建单项或批量代码生成任务。 */
603
636
  async function handleGenerate(selected: CodeGenGenerateTarget) {
604
637
  const tables = Array.isArray(selected) ? selected : [selected];
@@ -612,7 +645,7 @@ async function handleGenerate(selected: CodeGenGenerateTarget) {
612
645
  return;
613
646
  }
614
647
  generating.value = true;
615
- let missingI18ns: string[] = [];
648
+ let missingI18ns: Array<{ name: string; items: string[] }> = [];
616
649
  try {
617
650
  const previewEntries = await Promise.all(
618
651
  tables.map(async table => ({
@@ -620,34 +653,31 @@ async function handleGenerate(selected: CodeGenGenerateTarget) {
620
653
  preview: await defCodeGenService.PreviewCodeGen({ table_id: table.id, output_paths: undefined })
621
654
  }))
622
655
  );
623
- missingI18ns = previewEntries.flatMap(({ table, preview }) =>
624
- (preview.missing_i18ns ?? []).map(item => (tables.length === 1 ? item : `${table.name}: ${item}`))
625
- );
656
+ missingI18ns = previewEntries
657
+ .map(({ table, preview }) => ({ name: table.name, items: preview.missing_i18ns ?? [] }))
658
+ .filter(group => group.items.length);
626
659
  } finally {
627
660
  generating.value = false;
628
661
  }
629
- if (missingI18ns.length) {
630
- ElMessage.warning(
631
- t("system.code.gen.preview.message.missing_i18ns", {
632
- items: missingI18ns.join(t("system.code.gen.preview.value.list_separator"))
633
- })
634
- );
635
- }
636
662
  const message =
637
663
  tables.length === 1
638
664
  ? t("system.code.gen.table.dialog.generate_one", { name: tables[0].name })
639
665
  : t("system.code.gen.table.dialog.generate_batch", { count: tables.length });
640
666
  try {
641
- await ElMessageBox.confirm(message, t("common.title.notice"), {
642
- confirmButtonText: t("common.action.confirm"),
667
+ const content = h(CodeGenGenerateConfirm, { message, groups: missingI18ns });
668
+ await ElMessageBox.confirm(content, t("system.code.gen.table.dialog.generate_title"), {
669
+ confirmButtonText: t("system.code.gen.action.generate"),
643
670
  cancelButtonText: t("common.action.cancel"),
644
- type: "warning"
671
+ customClass: "code-gen-generate-confirm",
672
+ showClose: true,
673
+ closeOnClickModal: false
645
674
  });
646
675
  } catch {
647
676
  return;
648
677
  }
649
678
  generating.value = true;
650
679
  try {
680
+ await holdGenerationHotUpdates();
651
681
  const data = await defCodeGenService.StartCodeGenTask({
652
682
  table_ids: tables.map(table => table.id)
653
683
  });
@@ -659,6 +689,7 @@ async function handleGenerate(selected: CodeGenGenerateTarget) {
659
689
  handleProgressDialogVisibleChange(true);
660
690
  } catch (error) {
661
691
  generating.value = false;
692
+ releaseGenerationUpdates();
662
693
  throw error;
663
694
  }
664
695
  }
@@ -704,11 +735,13 @@ function handleProgressDialogVisibleChange(visible: boolean) {
704
735
  return;
705
736
  }
706
737
  window.sessionStorage.removeItem(codeGenProgressDialogVisibleStorageKey);
738
+ if (!generating.value) releaseGenerationUpdates();
707
739
  }
708
740
 
709
741
  /** 生成任务结束后刷新列表。 */
710
742
  function handleProgressCompleted() {
711
743
  generating.value = false;
744
+ if (!progressDialogVisible.value) releaseGenerationUpdates();
712
745
  window.sessionStorage.removeItem(codeGenProgressDialogVisibleStorageKey);
713
746
  progressSelectedTableIds.value = [];
714
747
  proTable.value?.clearSelection();
@@ -746,6 +779,7 @@ function removeProgressSelectedTableIds() {
746
779
 
747
780
  /** 请求代码生成表配置列表。 */
748
781
  async function requestCodeGenTable(params: PageCodeGenTableRequest) {
782
+ await loadEnabledBaseLanguages();
749
783
  const data = await defCodeGenTableService.PageCodeGenTable(buildPageRequest(params));
750
784
  return { data: { ...data, list: data.code_gen_tables ?? [] } };
751
785
  }
@@ -856,7 +890,15 @@ async function handleSubmit() {
856
890
  if (!valid) return;
857
891
  if (!formData.parent_menu_id) return;
858
892
 
859
- const payload: CodeGenTableForm = { ...formData, parent_menu_id: formData.parent_menu_id };
893
+ const payload: CodeGenTableForm = {
894
+ ...formData,
895
+ parent_menu_id: formData.parent_menu_id,
896
+ i18n_config: withCodeGenLocaleDefaults(
897
+ formData.i18n_config,
898
+ formData.comment,
899
+ formData.page_type === "left_tree" ? formData.left_tree_config?.comment : ""
900
+ )
901
+ };
860
902
  saving.value = true;
861
903
  try {
862
904
  if (formData.id) {
@@ -1016,20 +1058,7 @@ function ensureLeftTreeConfig() {
1016
1058
  </script>
1017
1059
 
1018
1060
  <style scoped lang="scss">
1019
- .code-gen-table-locales {
1020
- display: grid;
1021
- grid-template-columns: repeat(auto-fit, minmax(min(100%, 280px), 1fr));
1022
- width: 100%;
1023
- min-width: 0;
1024
- :deep(.el-alert) {
1025
- grid-column: 1 / -1;
1026
- }
1027
- }
1028
-
1029
1061
  @media (max-width: 767px) {
1030
- .code-gen-table-locales {
1031
- grid-template-columns: 1fr;
1032
- }
1033
1062
  :deep(.code-gen-table-form) {
1034
1063
  .el-col {
1035
1064
  flex: 0 0 100%;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@liujitcn/kratos-admin-system",
3
3
  "private": false,
4
- "version": "0.0.39",
4
+ "version": "0.0.40",
5
5
  "type": "module",
6
6
  "description": "kratos-admin system management module",
7
7
  "license": "MIT",
@@ -11,11 +11,12 @@
11
11
  "url": "git@github.com:liujitcn/kratos-admin.git"
12
12
  },
13
13
  "dependencies": {
14
+ "@lucide/vue": "^1.39.0",
14
15
  "@microsoft/fetch-event-source": "^2.0.1",
15
16
  "sortablejs": "^1.15.2",
16
17
  "swagger-ui-dist": "^5.32.9",
17
18
  "vue-element-plus-x": "^2.0.3",
18
- "@liujitcn/kratos-admin-core": "0.0.39"
19
+ "@liujitcn/kratos-admin-core": "0.0.40"
19
20
  },
20
21
  "peerDependencies": {
21
22
  "@element-plus/icons-vue": "^2.3.1",
@@ -1,12 +0,0 @@
1
- import type { RuntimeConfigDefinition } from "./types";
2
- /** 数据库备份配置模型。 */
3
- export interface DatabaseBackupConfig {
4
- enabled: boolean;
5
- integrity_key: string;
6
- encryption_key: string;
7
- directory: string;
8
- gzip: boolean;
9
- retention_count: number;
10
- }
11
- /** 数据库备份配置定义。 */
12
- export declare const databaseBackupConfig: RuntimeConfigDefinition<DatabaseBackupConfig>;
@@ -1,3 +0,0 @@
1
- declare const __VLS_export: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
2
- declare const _default: typeof __VLS_export;
3
- export default _default;
@@ -1,57 +0,0 @@
1
- import { Coin } from "@element-plus/icons-vue";
2
- import type { RuntimeConfigDefinition } from "./types";
3
-
4
- /** 数据库备份配置模型。 */
5
- export interface DatabaseBackupConfig {
6
- enabled: boolean;
7
- integrity_key: string;
8
- encryption_key: string;
9
- directory: string;
10
- gzip: boolean;
11
- retention_count: number;
12
- }
13
-
14
- /** 数据库备份配置定义。 */
15
- export const databaseBackupConfig: RuntimeConfigDefinition<DatabaseBackupConfig> = {
16
- key: "databaseBackup",
17
- titleKey: "system.base.runtime_config.backup.title",
18
- descriptionKey: "system.base.runtime_config.backup.description",
19
- icon: Coin,
20
- createModel: () => ({
21
- enabled: false,
22
- integrity_key: "",
23
- encryption_key: "",
24
- directory: "./backups",
25
- gzip: true,
26
- retention_count: 7
27
- }),
28
- fields: [
29
- { prop: "enabled", labelKey: "system.base.runtime_config.field.enabled", component: "switch" },
30
- {
31
- prop: "integrity_key",
32
- labelKey: "system.base.runtime_config.field.integrity_key",
33
- component: "password",
34
- props: { showPassword: true, autocomplete: "new-password" }
35
- },
36
- {
37
- prop: "encryption_key",
38
- labelKey: "system.base.runtime_config.field.encryption_key",
39
- component: "password",
40
- props: { showPassword: true, autocomplete: "new-password" }
41
- },
42
- {
43
- prop: "directory",
44
- labelKey: "system.base.runtime_config.field.directory",
45
- component: "input",
46
- rules: [{ required: true, messageKey: "system.base.runtime_config.validation.directory", trigger: "blur" }]
47
- },
48
- { prop: "gzip", labelKey: "system.base.runtime_config.field.gzip", component: "switch" },
49
- {
50
- prop: "retention_count",
51
- labelKey: "system.base.runtime_config.field.retention_count",
52
- component: "input-number",
53
- props: { min: 1, max: 1000, controls: true },
54
- rules: [{ type: "number", min: 1, messageKey: "system.base.runtime_config.validation.retention_count", trigger: "blur" }]
55
- }
56
- ]
57
- };