auto-gen-crud 0.1.0
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/API.md +130 -0
- package/README.md +234 -0
- package/dist/adapters/ant-design-vue.d.ts +8 -0
- package/dist/adapters/element-plus.d.ts +8 -0
- package/dist/adapters/index.d.ts +4 -0
- package/dist/adapters/index.js +7 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/naive.d.ts +8 -0
- package/dist/adapters/types.d.ts +162 -0
- package/dist/components/AutoCrud.vue.d.ts +398 -0
- package/dist/components/CopyText.vue.d.ts +6 -0
- package/dist/components/CrudModal.vue.d.ts +47 -0
- package/dist/components/DecodeText.vue.d.ts +8 -0
- package/dist/components/DynamicForm.vue.d.ts +63 -0
- package/dist/components/DynamicFormItem.vue.d.ts +20 -0
- package/dist/components/DynamicTable.vue.d.ts +30 -0
- package/dist/context.d.ts +36 -0
- package/dist/core/date-format-utils.d.ts +8 -0
- package/dist/core/form-runtime-cache.d.ts +27 -0
- package/dist/core/form-utils.d.ts +51 -0
- package/dist/core/object-utils.d.ts +43 -0
- package/dist/core/table-utils.d.ts +19 -0
- package/dist/core/types.d.ts +443 -0
- package/dist/generator/fields.d.ts +27 -0
- package/dist/generator/index.d.ts +14 -0
- package/dist/generator/index.js +740 -0
- package/dist/generator/index.js.map +1 -0
- package/dist/generator/openapi.d.ts +10 -0
- package/dist/generator/operations.d.ts +8 -0
- package/dist/generator/schema.d.ts +32 -0
- package/dist/generator/string-utils.d.ts +11 -0
- package/dist/generator/templates.d.ts +6 -0
- package/dist/generator/types.d.ts +185 -0
- package/dist/generator/writer.d.ts +8 -0
- package/dist/hooks/index.d.ts +3 -0
- package/dist/hooks/index.js +7 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/useModalForm.d.ts +11 -0
- package/dist/hooks/useSearchForm.d.ts +10 -0
- package/dist/hooks/useTable.d.ts +11 -0
- package/dist/index-Dc-solHn.js +299 -0
- package/dist/index-Dc-solHn.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.js +985 -0
- package/dist/index.js.map +1 -0
- package/dist/plugin.d.ts +17 -0
- package/dist/style.css +1 -0
- package/dist/useTable-BwDSqD1q.js +214 -0
- package/dist/useTable-BwDSqD1q.js.map +1 -0
- package/dist/utils/clipboard.d.ts +16 -0
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/index.js +532 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/message.d.ts +9 -0
- package/dist/utils/request.d.ts +8 -0
- package/dist/utils/sm4-core.d.ts +12 -0
- package/dist/utils/sm4.d.ts +29 -0
- package/docs/AI_AGENT_GUIDE.md +210 -0
- package/mcp/auto-crud-mcp.mjs +502 -0
- package/mcp/auto-gen-crud-mcp.mjs +586 -0
- package/package.json +93 -0
- package/skills/auto-gen-crud-agent/SKILL.md +114 -0
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { CrudFormComponent, CrudFormItem, CrudFormRule, CrudOption } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* 将 options 归一化为数组。
|
|
4
|
+
*
|
|
5
|
+
* 支持两种常见写法:
|
|
6
|
+
* - 数组:`[{ label: "启用", value: 1 }]`
|
|
7
|
+
* - 对象:`{ 1: "启用", 0: "禁用" }`
|
|
8
|
+
*/
|
|
9
|
+
export declare function normalizeOptions(options: unknown, formData?: Record<string, unknown>, item?: CrudFormItem): CrudOption[];
|
|
10
|
+
/** 判断当前组件是否属于输入类,用于自动生成 placeholder 和校验 trigger。 */
|
|
11
|
+
export declare function isInputComponent(component: string): boolean;
|
|
12
|
+
/** 判断当前组件是否通常使用数组值,用于初始化默认值和必填规则类型。 */
|
|
13
|
+
export declare function isArrayComponent(component: string): boolean;
|
|
14
|
+
/** 判断当前组件是否通常使用数字值。 */
|
|
15
|
+
export declare function isNumberComponent(component: string): boolean;
|
|
16
|
+
/**
|
|
17
|
+
* 生成字段默认值。
|
|
18
|
+
*
|
|
19
|
+
* 目的:业务无需给每个字段都手写初始值;新增弹窗和搜索重置都可以复用这套规则。
|
|
20
|
+
*/
|
|
21
|
+
export declare function getDefaultValue(component: CrudFormComponent | string, value?: unknown): unknown;
|
|
22
|
+
/**
|
|
23
|
+
* 根据 columns 和外部初始 data 构建完整表单数据。
|
|
24
|
+
*
|
|
25
|
+
* 这个函数是新包状态初始化的核心:
|
|
26
|
+
* - 搜索表单用它生成初始搜索条件。
|
|
27
|
+
* - 新增弹窗用它重建干净表单,避免残留上一次编辑的数据。
|
|
28
|
+
*/
|
|
29
|
+
export declare function createFormData(columns: CrudFormItem[], data?: Record<string, unknown>): Record<string, unknown>;
|
|
30
|
+
/** 判断表单项是否应该显示。 */
|
|
31
|
+
export declare function shouldShowFormItem(item: CrudFormItem, formData: Record<string, unknown>): boolean;
|
|
32
|
+
/** 判断表单项是否应该禁用。 */
|
|
33
|
+
export declare function shouldDisableFormItem(item: CrudFormItem, formData: Record<string, unknown>, forceDisabled?: boolean): boolean;
|
|
34
|
+
/** 获取表单项 label,兼容函数写法。 */
|
|
35
|
+
export declare function getFormItemLabel(item: CrudFormItem, formData: Record<string, unknown>): string;
|
|
36
|
+
/**
|
|
37
|
+
* 生成默认 placeholder。
|
|
38
|
+
*
|
|
39
|
+
* 输入类组件使用“请输入”,选择类组件使用“请选择”。
|
|
40
|
+
*/
|
|
41
|
+
export declare function getPlaceholder(item: CrudFormItem, formData: Record<string, unknown>): string;
|
|
42
|
+
/**
|
|
43
|
+
* 生成字段校验规则。
|
|
44
|
+
*
|
|
45
|
+
* 规则来源有两类:
|
|
46
|
+
* - `required/isReq` 自动生成必填规则。
|
|
47
|
+
* - `rules` 追加业务自定义规则。
|
|
48
|
+
*/
|
|
49
|
+
export declare function createRules(item: CrudFormItem, formData: Record<string, unknown>): CrudFormRule[];
|
|
50
|
+
/** 为整个表单生成 rules 对象。 */
|
|
51
|
+
export declare function createFormRules(columns: CrudFormItem[], formData: Record<string, unknown>): Record<string, CrudFormRule[]>;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { CrudFormItem } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* 深度克隆任意数据。
|
|
4
|
+
*
|
|
5
|
+
* 使用场景:
|
|
6
|
+
* - 搜索表单保存初始快照,重置时避免引用同一个对象。
|
|
7
|
+
* - 弹窗编辑行数据时避免直接修改表格行对象。
|
|
8
|
+
*
|
|
9
|
+
* 说明:这里故意不依赖 lodash,方便学习递归克隆的核心思路。
|
|
10
|
+
*/
|
|
11
|
+
export declare function deepClone<T>(value: T): T;
|
|
12
|
+
/**
|
|
13
|
+
* 按点路径读取对象值。
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```ts
|
|
17
|
+
* getByPath({ user: { name: "张三" } }, "user.name") // "张三"
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
export declare function getByPath(source: unknown, path: string): unknown;
|
|
21
|
+
/**
|
|
22
|
+
* 按点路径写入对象值。
|
|
23
|
+
*
|
|
24
|
+
* 这让表单字段可以声明 `user.name`,而不是只能声明一层字段。
|
|
25
|
+
*/
|
|
26
|
+
export declare function setByPath(target: Record<string, unknown>, path: string, value: unknown): void;
|
|
27
|
+
/**
|
|
28
|
+
* 执行“值或函数”配置。
|
|
29
|
+
*
|
|
30
|
+
* 很多配置项都支持静态值和函数,例如:
|
|
31
|
+
* - `show: true`
|
|
32
|
+
* - `show: formData => formData.type === 1`
|
|
33
|
+
*
|
|
34
|
+
* 这个工具统一处理两种写法。
|
|
35
|
+
*/
|
|
36
|
+
export declare function resolveValue<T, Args extends unknown[]>(value: T | ((...args: Args) => T), ...args: Args): T;
|
|
37
|
+
/**
|
|
38
|
+
* 获取字段实际组件类型。
|
|
39
|
+
*
|
|
40
|
+
* 新包推荐使用 `component`,但为了保留旧 auto-gen-crud 的学习迁移价值,
|
|
41
|
+
* 这里兼容旧字段 `valueKey`。
|
|
42
|
+
*/
|
|
43
|
+
export declare function getFormComponent(item: CrudFormItem): string;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { CrudImageOptions, CrudTableAction, CrudTableColumn } from './types';
|
|
2
|
+
/** 获取列字段路径,兼容新字段 `field` 和旧字段 `key`。 */
|
|
3
|
+
export declare function getColumnField<T extends Record<string, unknown>>(column: CrudTableColumn<T>): string;
|
|
4
|
+
/** 获取行数据中的单元格值,支持点路径。 */
|
|
5
|
+
export declare function getCellValue<T extends Record<string, unknown>>(row: T, column: CrudTableColumn<T>): unknown;
|
|
6
|
+
/** 判断列是否显示。 */
|
|
7
|
+
export declare function shouldShowColumn<T extends Record<string, unknown>>(column: CrudTableColumn<T>, data: T[], index: number): boolean;
|
|
8
|
+
/** 获取实际操作按钮列表,兼容旧字段 buttons。 */
|
|
9
|
+
export declare function getColumnActions<T extends Record<string, unknown>>(column: CrudTableColumn<T>): CrudTableAction<T>[];
|
|
10
|
+
/** 判断操作按钮是否显示。 */
|
|
11
|
+
export declare function shouldShowAction<T>(row: T, action: CrudTableAction<T>): boolean;
|
|
12
|
+
/** 获取操作按钮文案,兼容函数写法。 */
|
|
13
|
+
export declare function getActionLabel<T>(row: T, action: CrudTableAction<T>): string;
|
|
14
|
+
/** 获取确认文案,未配置时给出通用中文提示。 */
|
|
15
|
+
export declare function getActionConfirmText<T>(row: T, action: CrudTableAction<T>): string;
|
|
16
|
+
/** 格式化日期列。 */
|
|
17
|
+
export declare function formatDateTime(value: unknown, format?: boolean | string): string;
|
|
18
|
+
/** 归一化图片列配置。 */
|
|
19
|
+
export declare function normalizeImageOptions(image: boolean | CrudImageOptions | undefined): Required<CrudImageOptions>;
|
|
@@ -0,0 +1,443 @@
|
|
|
1
|
+
import { App, Plugin, VNodeChild } from 'vue';
|
|
2
|
+
/**
|
|
3
|
+
* 新包支持的内置 UI 名称。
|
|
4
|
+
*
|
|
5
|
+
* 设计目的:
|
|
6
|
+
* - 使用者只需要在初始化 `createAutoCrud({ ui })` 时选择一次 UI。
|
|
7
|
+
* - 页面里的表单、表格、弹窗配置保持中立,不需要区分 Naive UI / Element Plus / Ant Design Vue。
|
|
8
|
+
* - 不传时默认使用 `element-plus`,符合本包的默认定位。
|
|
9
|
+
*/
|
|
10
|
+
export type CrudUIName = "element-plus" | "naive" | "ant-design-vue";
|
|
11
|
+
/**
|
|
12
|
+
* 表单字段支持的中立组件类型。
|
|
13
|
+
*
|
|
14
|
+
* 这些名称不是具体 UI 库组件名,而是业务语义:
|
|
15
|
+
* - `input` 最终可能渲染为 `ElInput`、`NInput` 或 `AInput`。
|
|
16
|
+
* - `datePicker` 最终可能渲染为 `ElDatePicker`、`NDatePicker` 或 `ADatePicker`。
|
|
17
|
+
* - 具体映射由当前初始化时选择的 UI Adapter 决定。
|
|
18
|
+
*/
|
|
19
|
+
export type CrudFormComponent = "input" | "textarea" | "select" | "multipleSelect" | "radio" | "checkbox" | "inputNumber" | "datePicker" | "timePicker" | "switch" | "cascader" | "slider";
|
|
20
|
+
/**
|
|
21
|
+
* 表单、表格、tabs 等场景通用的选项结构。
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```ts
|
|
25
|
+
* const statusOptions: CrudOption[] = [
|
|
26
|
+
* { label: "启用", value: 1 },
|
|
27
|
+
* { label: "禁用", value: 0 },
|
|
28
|
+
* ];
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
export interface CrudOption {
|
|
32
|
+
/** 选项展示文案。 */
|
|
33
|
+
label: string;
|
|
34
|
+
/** 选项真实值,提交给业务接口时使用。 */
|
|
35
|
+
value: unknown;
|
|
36
|
+
/** 是否禁用该选项。 */
|
|
37
|
+
disabled?: boolean;
|
|
38
|
+
/** 级联组件的子选项。 */
|
|
39
|
+
children?: CrudOption[];
|
|
40
|
+
/** 允许业务保留额外字段,渲染时会原样透传给当前 UI。 */
|
|
41
|
+
[key: string]: unknown;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* 表单、表格、tabs映射结构。
|
|
45
|
+
*/
|
|
46
|
+
export interface CrudMap {
|
|
47
|
+
[key: string]: unknown;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* 表单校验规则的中立描述。
|
|
51
|
+
*
|
|
52
|
+
* 说明:三套 UI 的规则对象大体相似但并不完全一致,本包只约定常见字段,
|
|
53
|
+
* 其它字段允许通过索引签名透传给当前 UI 的 Form 校验能力。
|
|
54
|
+
*/
|
|
55
|
+
export interface CrudFormRule {
|
|
56
|
+
/** 是否必填。 */
|
|
57
|
+
required?: boolean;
|
|
58
|
+
/** 校验失败提示文案。 */
|
|
59
|
+
message?: string;
|
|
60
|
+
/** 触发时机,如 `blur`、`change`。 */
|
|
61
|
+
trigger?: string | string[];
|
|
62
|
+
/** 值类型,常用于数组、多选、数字等字段。 */
|
|
63
|
+
type?: string;
|
|
64
|
+
/** 自定义校验函数,签名兼容常见 UI 库规则。 */
|
|
65
|
+
validator?: (...args: unknown[]) => boolean | Error | Promise<void> | void;
|
|
66
|
+
/** 允许透传当前 UI 支持但中立类型没有显式声明的规则字段。 */
|
|
67
|
+
[key: string]: unknown;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* 表单字段事件上下文。
|
|
71
|
+
*
|
|
72
|
+
* 设计目的:
|
|
73
|
+
* - 业务在字段事件里通常不只需要当前值,还需要知道“哪个字段触发了事件”。
|
|
74
|
+
* - 字段联动时可以通过 setFieldValue 修改其它字段,避免业务直接操作嵌套对象路径。
|
|
75
|
+
* - 三套 UI 的原生事件参数不一致,但上下文结构保持稳定。
|
|
76
|
+
*/
|
|
77
|
+
export interface CrudFormFieldEventContext {
|
|
78
|
+
/** 当前触发事件的字段路径。 */
|
|
79
|
+
prop: string;
|
|
80
|
+
/** 当前字段完整配置,方便业务读取 options、component、扩展字段等信息。 */
|
|
81
|
+
item: CrudFormItem;
|
|
82
|
+
/** 当前字段使用的中立组件类型。 */
|
|
83
|
+
component: CrudFormComponent;
|
|
84
|
+
/** 当前表单数据;onChange 触发时这里已经是更新后的数据。 */
|
|
85
|
+
formData: Record<string, unknown>;
|
|
86
|
+
/** 事件触发前的字段旧值,常用于比较本次是否真的发生业务变化。 */
|
|
87
|
+
oldValue: unknown;
|
|
88
|
+
/** 按字段路径写入表单值,用于开始时间清空结束时间这类字段联动。 */
|
|
89
|
+
setFieldValue: (prop: string, value: unknown) => void;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* 表单字段配置。
|
|
93
|
+
*
|
|
94
|
+
* 它是搜索表单和弹窗表单的核心 schema。业务只描述字段是什么,
|
|
95
|
+
* 不描述要用 `ElInput` 还是 `NInput`,具体组件由初始化时选择的 Adapter 决定。
|
|
96
|
+
*/
|
|
97
|
+
export interface CrudFormItem {
|
|
98
|
+
/** 字段标签,用于 FormItem 的 label。 */
|
|
99
|
+
label: string | ((formData: Record<string, unknown>, item: CrudFormItem) => string);
|
|
100
|
+
/** 字段路径,支持 `user.name` 这种点路径。 */
|
|
101
|
+
prop: string;
|
|
102
|
+
/**
|
|
103
|
+
* 动态配置依赖的字段路径。
|
|
104
|
+
*
|
|
105
|
+
* 说明:当 show/disabled/required/rules/options/label/placeholder 使用函数时,
|
|
106
|
+
* 可声明它们依赖哪些字段。组件会基于这些字段值缓存计算结果,避免无关字段变化时重复执行动态函数。
|
|
107
|
+
*/
|
|
108
|
+
deps?: string[];
|
|
109
|
+
/** 推荐的新字段:声明当前字段使用的中立组件类型。 */
|
|
110
|
+
component?: CrudFormComponent;
|
|
111
|
+
/** 兼容旧 auto-gen-crud 的字段名;如果同时存在,优先使用 `component`。 */
|
|
112
|
+
valueKey?: CrudFormComponent;
|
|
113
|
+
/** 初始值;如果未传,会根据组件类型生成空数组、false 或 null。 */
|
|
114
|
+
value?: unknown;
|
|
115
|
+
/** 下拉、单选、多选、级联等组件的选项,支持函数形式动态返回。 */
|
|
116
|
+
options?: CrudOption[] | Record<string, unknown> | ((formData: Record<string, unknown>, item: CrudFormItem) => CrudOption[] | Record<string, unknown>);
|
|
117
|
+
/** 是否必填;支持函数形式,用于根据其它字段动态决定。 */
|
|
118
|
+
required?: boolean | ((formData: Record<string, unknown>, item: CrudFormItem) => boolean);
|
|
119
|
+
/** 兼容旧字段 `isReq`。新代码推荐使用 `required`。 */
|
|
120
|
+
isReq?: boolean | ((formData: Record<string, unknown>, item: CrudFormItem) => boolean);
|
|
121
|
+
/** 自定义校验规则;支持函数形式动态生成。 */
|
|
122
|
+
rules?: CrudFormRule[] | ((formData: Record<string, unknown>, item: CrudFormItem) => CrudFormRule[]);
|
|
123
|
+
/** 占位文案;不传时本包会根据输入类/选择类自动生成。 */
|
|
124
|
+
placeholder?: string | ((formData: Record<string, unknown>, item: CrudFormItem) => string);
|
|
125
|
+
/** 是否显示该字段;用于复杂表单中的联动显隐。 */
|
|
126
|
+
show?: boolean | ((formData: Record<string, unknown>, item: CrudFormItem) => boolean);
|
|
127
|
+
/** 是否禁用该字段;查看模式会在组件层统一追加禁用。 */
|
|
128
|
+
disabled?: boolean | ((formData: Record<string, unknown>, item: CrudFormItem) => boolean);
|
|
129
|
+
/** 当前字段在表单栅格中占几份;默认 1,最大不超过 layout.columns。 */
|
|
130
|
+
colSpan?: number;
|
|
131
|
+
/** 表单项容器属性,如 labelWidth、required 等,会传给当前 UI 的 FormItem。 */
|
|
132
|
+
formItemProps?: Record<string, unknown>;
|
|
133
|
+
/** 当前控件的通用透传属性;不会区分三套 UI,因为 UI 在初始化时已经确定。 */
|
|
134
|
+
props?: Record<string, unknown>;
|
|
135
|
+
/** 兼容旧字段 `componentProps`。新代码推荐使用 `props`。 */
|
|
136
|
+
componentProps?: Record<string, unknown>;
|
|
137
|
+
/**
|
|
138
|
+
* 字段值变化事件。
|
|
139
|
+
*
|
|
140
|
+
* 这是本包推荐的业务事件写法:组件内部会先完成表单值更新,再触发该回调。
|
|
141
|
+
* 如果需要使用某个 UI 库独有的原生事件,仍可以写在 props 里透传。
|
|
142
|
+
*/
|
|
143
|
+
onChange?: (value: unknown, context: CrudFormFieldEventContext) => void | Promise<void>;
|
|
144
|
+
/** 字段失焦事件,适合做格式化、轻量校验或提示收起。 */
|
|
145
|
+
onBlur?: (event: unknown, context: CrudFormFieldEventContext) => void | Promise<void>;
|
|
146
|
+
/** 字段聚焦事件,适合做提示展示、远程选项预加载等交互。 */
|
|
147
|
+
onFocus?: (event: unknown, context: CrudFormFieldEventContext) => void | Promise<void>;
|
|
148
|
+
/** 是否在提交前加密该字段。加密函数由内置 SM4 工具或用户注入能力提供。 */
|
|
149
|
+
encrypt?: boolean;
|
|
150
|
+
/** 字段说明,组件可以渲染为 tooltip 或普通提示。 */
|
|
151
|
+
tips?: string;
|
|
152
|
+
/** 自定义渲染;优先级高于 `component`,用于特殊业务字段。 */
|
|
153
|
+
render?: (formData: Record<string, unknown>, item: CrudFormItem) => VNodeChild;
|
|
154
|
+
/** 允许业务扩展字段,工具函数会尽量保持原样。 */
|
|
155
|
+
[key: string]: unknown;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* 表单布局配置。
|
|
159
|
+
*
|
|
160
|
+
* 默认搜索表单会使用响应式列数,弹窗表单默认一列。
|
|
161
|
+
* 如果业务明确传入 columns,则按业务传入值渲染。
|
|
162
|
+
*/
|
|
163
|
+
export interface CrudFormLayout {
|
|
164
|
+
/** 每行列数。 */
|
|
165
|
+
columns?: number;
|
|
166
|
+
/** 横向间距,单位 px。 */
|
|
167
|
+
gapX?: number;
|
|
168
|
+
/** 纵向间距,单位 px。 */
|
|
169
|
+
gapY?: number;
|
|
170
|
+
}
|
|
171
|
+
/** 搜索表单 hook 入参。 */
|
|
172
|
+
export interface UseSearchFormOptions<T extends Record<string, unknown> = Record<string, unknown>> {
|
|
173
|
+
/** 搜索字段配置。 */
|
|
174
|
+
columns: CrudFormItem[];
|
|
175
|
+
/** 初始搜索数据;未包含的字段会按 columns 默认值补齐。 */
|
|
176
|
+
data?: Partial<T>;
|
|
177
|
+
/** 搜索提交回调,只负责返回搜索条件,不直接约束列表请求。 */
|
|
178
|
+
onSubmit?: (data: T) => void | Promise<void>;
|
|
179
|
+
/** 重置回调,重置后会返回恢复后的搜索条件。 */
|
|
180
|
+
onReset?: (data: T) => void | Promise<void>;
|
|
181
|
+
/** 是否显示默认新增按钮。 */
|
|
182
|
+
addButton?: boolean;
|
|
183
|
+
/** 默认新增按钮文案。 */
|
|
184
|
+
addButtonText?: string;
|
|
185
|
+
/** 点击默认新增按钮后的额外回调。 */
|
|
186
|
+
onAddClick?: () => void;
|
|
187
|
+
/** 搜索按钮区域栅格跨度。 */
|
|
188
|
+
searchButtonSpan?: number;
|
|
189
|
+
/** 搜索表单布局。 */
|
|
190
|
+
layout?: CrudFormLayout;
|
|
191
|
+
}
|
|
192
|
+
/** 搜索表单 hook 返回值,也是 AutoCrud 的 searchFormConfig。 */
|
|
193
|
+
export interface CrudSearchFormConfig<T extends Record<string, unknown> = Record<string, unknown>> {
|
|
194
|
+
columns: CrudFormItem[];
|
|
195
|
+
/** 搜索表单响应式数据,泛型 T 用于让业务页安全读取查询字段。 */
|
|
196
|
+
data: T;
|
|
197
|
+
addButton: boolean;
|
|
198
|
+
addButtonText: string;
|
|
199
|
+
searchButtonSpan?: number;
|
|
200
|
+
layout?: CrudFormLayout;
|
|
201
|
+
submit: (data?: T) => Promise<void>;
|
|
202
|
+
reset: () => Promise<T>;
|
|
203
|
+
onAddClick?: () => void;
|
|
204
|
+
}
|
|
205
|
+
/** 弹窗表单模式。 */
|
|
206
|
+
export type CrudModalMode = "add" | "edit" | "view";
|
|
207
|
+
/** 弹窗展示形态。 */
|
|
208
|
+
export type CrudModalType = "drawer" | "modal";
|
|
209
|
+
/** 弹窗表单 hook 入参。 */
|
|
210
|
+
export interface UseModalFormOptions<T extends Record<string, unknown> = Record<string, unknown>> {
|
|
211
|
+
/** 弹窗表单字段配置。 */
|
|
212
|
+
columns: CrudFormItem[];
|
|
213
|
+
/** 初始表单数据,新增时会以它和 columns 默认值共同生成数据。 */
|
|
214
|
+
data?: Partial<T>;
|
|
215
|
+
/** 默认弹窗显示状态。 */
|
|
216
|
+
visible?: boolean;
|
|
217
|
+
/** 默认模式。 */
|
|
218
|
+
mode?: CrudModalMode;
|
|
219
|
+
/** 弹窗形态,默认 drawer。 */
|
|
220
|
+
modalType?: CrudModalType;
|
|
221
|
+
/** 提交回调。 */
|
|
222
|
+
onSubmit?: (data: T, mode: CrudModalMode) => void | Promise<void>;
|
|
223
|
+
/** 关闭回调,内部 close 后会继续调用它。 */
|
|
224
|
+
onClose?: () => void;
|
|
225
|
+
/** 弹窗标题映射。 */
|
|
226
|
+
titleMap?: Partial<Record<CrudModalMode, string>>;
|
|
227
|
+
/** 弹窗按钮文案映射。 */
|
|
228
|
+
buttonTextMap?: Partial<Record<CrudModalMode, {
|
|
229
|
+
submit?: string;
|
|
230
|
+
cancel?: string;
|
|
231
|
+
}>>;
|
|
232
|
+
/** 表单布局。 */
|
|
233
|
+
layout?: CrudFormLayout;
|
|
234
|
+
}
|
|
235
|
+
/** 弹窗表单 hook 返回值,也是 AutoCrud 的 modalFormConfig。 */
|
|
236
|
+
export interface CrudModalFormConfig<T extends Record<string, unknown> = Record<string, unknown>> {
|
|
237
|
+
columns: CrudFormItem[];
|
|
238
|
+
data: T;
|
|
239
|
+
visible: boolean;
|
|
240
|
+
mode: CrudModalMode;
|
|
241
|
+
modalType: CrudModalType;
|
|
242
|
+
titleMap?: Partial<Record<CrudModalMode, string>>;
|
|
243
|
+
buttonTextMap?: Partial<Record<CrudModalMode, {
|
|
244
|
+
submit?: string;
|
|
245
|
+
cancel?: string;
|
|
246
|
+
}>>;
|
|
247
|
+
layout?: CrudFormLayout;
|
|
248
|
+
submit: (data?: T) => Promise<void>;
|
|
249
|
+
close: () => void;
|
|
250
|
+
openAdd: (data?: Partial<T>) => void;
|
|
251
|
+
openEdit: (row: T) => void;
|
|
252
|
+
openView: (row: T) => void;
|
|
253
|
+
setFormData: (prop: string, value: unknown) => void;
|
|
254
|
+
}
|
|
255
|
+
/** 表格分页中立结构。 */
|
|
256
|
+
export interface CrudPagination {
|
|
257
|
+
/** 当前页,从 1 开始。 */
|
|
258
|
+
page: number;
|
|
259
|
+
/** 每页条数。 */
|
|
260
|
+
pageSize: number;
|
|
261
|
+
/** 总条数。 */
|
|
262
|
+
total: number;
|
|
263
|
+
/** 可选分页条数。 */
|
|
264
|
+
pageSizes?: number[];
|
|
265
|
+
/** 是否显示 pageSize 选择器。 */
|
|
266
|
+
showSizePicker?: boolean;
|
|
267
|
+
/** 是否显示快速跳页。 */
|
|
268
|
+
showQuickJumper?: boolean;
|
|
269
|
+
}
|
|
270
|
+
/** 表格操作按钮类型。 */
|
|
271
|
+
export type CrudButtonType = "default" | "primary" | "success" | "warning" | "danger" | "info" | "text" | "link";
|
|
272
|
+
/** 表格操作按钮尺寸。 */
|
|
273
|
+
export type CrudButtonSize = "small" | "medium" | "large";
|
|
274
|
+
/** 表格操作列按钮配置。 */
|
|
275
|
+
export interface CrudTableAction<T> {
|
|
276
|
+
/** 操作唯一标识。 */
|
|
277
|
+
key: string;
|
|
278
|
+
/** 操作文案,支持根据行数据动态生成。 */
|
|
279
|
+
label: string | ((row: T, action: CrudTableAction<T>) => string);
|
|
280
|
+
/** 操作按钮类型,adapter 会映射成当前 UI 的按钮语义。 */
|
|
281
|
+
type?: CrudButtonType;
|
|
282
|
+
/** 操作按钮尺寸。 */
|
|
283
|
+
size?: CrudButtonSize;
|
|
284
|
+
/** 是否需要二次确认。 */
|
|
285
|
+
confirm?: boolean;
|
|
286
|
+
/** 兼容旧字段 `isConfirm`。 */
|
|
287
|
+
isConfirm?: boolean;
|
|
288
|
+
/** 确认文案。 */
|
|
289
|
+
confirmText?: string | ((row: T, action: CrudTableAction<T>) => string);
|
|
290
|
+
/** 取消文案。 */
|
|
291
|
+
cancelText?: string;
|
|
292
|
+
/** 是否显示该操作。 */
|
|
293
|
+
show?: boolean | ((row: T, action: CrudTableAction<T>) => boolean);
|
|
294
|
+
/** 点击回调。 */
|
|
295
|
+
onClick: (row: T, event?: MouseEvent) => void | Promise<void>;
|
|
296
|
+
}
|
|
297
|
+
/** 图片列配置。 */
|
|
298
|
+
export interface CrudImageOptions {
|
|
299
|
+
width?: number;
|
|
300
|
+
height?: number;
|
|
301
|
+
objectFit?: "cover" | "contain" | "fill" | "none" | "scale-down";
|
|
302
|
+
preview?: boolean;
|
|
303
|
+
}
|
|
304
|
+
/** 表格列配置。 */
|
|
305
|
+
export interface CrudTableColumn<T extends Record<string, unknown> = Record<string, unknown>> {
|
|
306
|
+
/** 表头文案。 */
|
|
307
|
+
title: string;
|
|
308
|
+
/** 字段路径,支持 `user.name`。 */
|
|
309
|
+
field?: keyof T | string;
|
|
310
|
+
/** 兼容旧 auto-gen-crud 的 `key` 字段;新代码推荐使用 `field`。 */
|
|
311
|
+
key?: keyof T | string | ((row: T) => string);
|
|
312
|
+
/** 列宽。 */
|
|
313
|
+
width?: number | string;
|
|
314
|
+
/** 固定列。 */
|
|
315
|
+
fixed?: "left" | "right";
|
|
316
|
+
/** 对齐方式。 */
|
|
317
|
+
align?: "left" | "center" | "right";
|
|
318
|
+
/** 是否显示该列。 */
|
|
319
|
+
show?: boolean | ((column: CrudTableColumn<T>, data: T[], index: number) => boolean);
|
|
320
|
+
/** 自定义单元格渲染。 */
|
|
321
|
+
render?: (row: T, column: CrudTableColumn<T>, index: number) => VNodeChild;
|
|
322
|
+
/** 操作列配置;语义上替代旧包 buttons。 */
|
|
323
|
+
actions?: CrudTableAction<T>[];
|
|
324
|
+
/** 兼容旧包 buttons 字段。 */
|
|
325
|
+
buttons?: CrudTableAction<T>[];
|
|
326
|
+
/** 是否渲染复制能力。 */
|
|
327
|
+
copy?: boolean;
|
|
328
|
+
/** 是否渲染敏感信息解密能力。 */
|
|
329
|
+
decode?: boolean;
|
|
330
|
+
/** 是否按图片列渲染。 */
|
|
331
|
+
image?: boolean | CrudImageOptions;
|
|
332
|
+
/** 是否格式化为日期时间;字符串时表示 dayjs 格式。 */
|
|
333
|
+
dateTime?: boolean | string;
|
|
334
|
+
/** 当前列透传给 UI 表格列的属性。 */
|
|
335
|
+
props?: Record<string, unknown>;
|
|
336
|
+
}
|
|
337
|
+
/** Tabs 配置项。 */
|
|
338
|
+
export interface CrudTabOption {
|
|
339
|
+
label: string;
|
|
340
|
+
value: string | number;
|
|
341
|
+
disabled?: boolean;
|
|
342
|
+
}
|
|
343
|
+
/** 表格 tabs 配置。 */
|
|
344
|
+
export interface CrudTabsConfig {
|
|
345
|
+
options: CrudTabOption[];
|
|
346
|
+
value: string | number;
|
|
347
|
+
onChange?: (value: string | number) => void | Promise<void>;
|
|
348
|
+
}
|
|
349
|
+
/** 表格滚动配置。 */
|
|
350
|
+
export interface CrudTableScroll {
|
|
351
|
+
/**
|
|
352
|
+
* 表格纵向滚动高度。
|
|
353
|
+
*
|
|
354
|
+
* - true:默认值,组件根据当前视口、表格位置、分页高度自动计算。
|
|
355
|
+
* - false:关闭动态高度,表格恢复自然高度。
|
|
356
|
+
* - number/string:使用业务显式传入的高度。
|
|
357
|
+
*/
|
|
358
|
+
height?: boolean | number | string;
|
|
359
|
+
/** 横向滚动宽度,主要用于 Ant Design Vue scroll.x 和 Naive UI scrollX。 */
|
|
360
|
+
x?: number | string;
|
|
361
|
+
}
|
|
362
|
+
/** 表格 hook 入参。 */
|
|
363
|
+
export interface UseTableOptions<T extends Record<string, unknown> = Record<string, unknown>> {
|
|
364
|
+
columns: CrudTableColumn<T>[];
|
|
365
|
+
data?: T[];
|
|
366
|
+
/** 是否显示分页;只控制分页组件显隐,不改变 pagination 对象类型。 */
|
|
367
|
+
showPagination?: boolean;
|
|
368
|
+
/**
|
|
369
|
+
* 分页配置。
|
|
370
|
+
*
|
|
371
|
+
* 推荐只传分页对象;为了兼容旧版本,传 false 时等价于 showPagination: false。
|
|
372
|
+
*/
|
|
373
|
+
pagination?: Partial<CrudPagination> | false;
|
|
374
|
+
tabs?: CrudTabsConfig;
|
|
375
|
+
rowKey?: string | ((row: T) => string | number);
|
|
376
|
+
immediate?: boolean;
|
|
377
|
+
/** 表格滚动配置;默认开启自动高度。 */
|
|
378
|
+
scroll?: CrudTableScroll | boolean;
|
|
379
|
+
/** 列表请求函数;请求完成后由业务自行写入 table.data 和 table.pagination.total。 */
|
|
380
|
+
getDataList?: () => void | Promise<void>;
|
|
381
|
+
}
|
|
382
|
+
/** 表格 hook 返回值,也是 AutoCrud 的 tableConfig。 */
|
|
383
|
+
export interface CrudTableConfig<T extends Record<string, unknown> = Record<string, unknown>> {
|
|
384
|
+
columns: CrudTableColumn<T>[];
|
|
385
|
+
data: T[];
|
|
386
|
+
/** 是否显示分页组件;业务开关与分页数据分离,避免 pagination 出现 false 联合类型。 */
|
|
387
|
+
showPagination: boolean;
|
|
388
|
+
/** 分页状态对象,始终可直接读写 page/pageSize/total。 */
|
|
389
|
+
pagination: CrudPagination;
|
|
390
|
+
tabs?: CrudTabsConfig;
|
|
391
|
+
loading: boolean;
|
|
392
|
+
rowKey?: string | ((row: T) => string | number);
|
|
393
|
+
/** 是否由 AutoCrud 挂载后自动加载首屏数据。 */
|
|
394
|
+
immediate?: boolean;
|
|
395
|
+
/** 表格滚动配置,默认 `{ height: true }`。 */
|
|
396
|
+
scroll: CrudTableScroll;
|
|
397
|
+
load: () => Promise<void>;
|
|
398
|
+
reset: () => Promise<void>;
|
|
399
|
+
setPage: (page: number) => Promise<void>;
|
|
400
|
+
setPageSize: (pageSize: number) => Promise<void>;
|
|
401
|
+
setTabsValue: (value: string | number) => Promise<void>;
|
|
402
|
+
}
|
|
403
|
+
/** AutoCrud 容器组件 Props。 */
|
|
404
|
+
export interface AutoCrudProps<T extends Record<string, unknown> = Record<string, unknown>, TSearch extends Record<string, unknown> = Record<string, unknown>> {
|
|
405
|
+
title?: string;
|
|
406
|
+
rowKey?: string | ((row: T) => string | number);
|
|
407
|
+
searchFormConfig?: CrudSearchFormConfig<TSearch>;
|
|
408
|
+
tableConfig?: CrudTableConfig<T>;
|
|
409
|
+
modalFormConfig?: CrudModalFormConfig<T>;
|
|
410
|
+
}
|
|
411
|
+
/** 请求函数配置。 */
|
|
412
|
+
export interface CrudRequestOptions {
|
|
413
|
+
url: string;
|
|
414
|
+
method?: "GET" | "POST" | "PUT" | "PATCH" | "DELETE";
|
|
415
|
+
data?: unknown;
|
|
416
|
+
params?: Record<string, unknown>;
|
|
417
|
+
headers?: Record<string, string>;
|
|
418
|
+
}
|
|
419
|
+
/** 用户可注入的请求函数类型。 */
|
|
420
|
+
export type CrudRequestHandler = <T = unknown>(options: CrudRequestOptions) => Promise<T>;
|
|
421
|
+
/** 敏感信息解密函数类型。 */
|
|
422
|
+
export type CrudDecodeHandler = (value: unknown, row?: Record<string, unknown>) => Promise<string> | string;
|
|
423
|
+
/** 敏感信息查看日志函数类型。 */
|
|
424
|
+
export type CrudDecodeLogHandler = (value: unknown, row?: Record<string, unknown>) => Promise<void> | void;
|
|
425
|
+
/** 全局初始化配置。 */
|
|
426
|
+
export interface AutoCrudInstallOptions {
|
|
427
|
+
/** 初始化时选择的 UI,"element-plus" | "naive" | "ant-design-vue",默认 `element-plus`。 */
|
|
428
|
+
ui?: CrudUIName;
|
|
429
|
+
/** 高级自定义 adapter;传入后优先级高于 ui。 */
|
|
430
|
+
adapter?: unknown;
|
|
431
|
+
/** 自定义请求函数,供 decode、日志等内置工具使用。 */
|
|
432
|
+
request?: CrudRequestHandler;
|
|
433
|
+
/** 自定义敏感信息解密函数。 */
|
|
434
|
+
decode?: CrudDecodeHandler;
|
|
435
|
+
/** 自定义敏感信息查看日志函数。 */
|
|
436
|
+
decodeLog?: CrudDecodeLogHandler;
|
|
437
|
+
/** SM4 默认密钥;未传时只使用工具函数调用时的显式 key。 */
|
|
438
|
+
sm4Key?: string;
|
|
439
|
+
}
|
|
440
|
+
/** createAutoCrud 返回的 Vue 插件类型。 */
|
|
441
|
+
export type AutoCrudPlugin = Plugin & {
|
|
442
|
+
install: (app: App, options?: AutoCrudInstallOptions) => void;
|
|
443
|
+
};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { GeneratedEnum, GeneratedField, NormalizedOperation, OpenApiDocument } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* 生成搜索表单字段。
|
|
4
|
+
*
|
|
5
|
+
* 搜索字段来自列表接口的 query 参数;分页字段和公共业务字段会被过滤掉,
|
|
6
|
+
* 因为分页由 table.pagination 管,traceLogId/operator 这类公共参数应由请求封装统一补齐。
|
|
7
|
+
*/
|
|
8
|
+
export declare function buildSearchFields(document: OpenApiDocument, operation: NormalizedOperation, enums: Map<string, GeneratedEnum>): GeneratedField[];
|
|
9
|
+
/**
|
|
10
|
+
* 生成弹窗表单字段。
|
|
11
|
+
*
|
|
12
|
+
* 新增和编辑接口都可能提供字段,这里合并两边字段,并保留 required 信息;
|
|
13
|
+
* id 默认不进入表单,因为新增时通常没有 id,编辑时 id 会随 row 数据一起提交。
|
|
14
|
+
*/
|
|
15
|
+
export declare function buildModalFields(document: OpenApiDocument, operations: Array<NormalizedOperation | undefined>, enums: Map<string, GeneratedEnum>): GeneratedField[];
|
|
16
|
+
/** 表格列字段来自列表接口响应里的 records/items schema。 */
|
|
17
|
+
export declare function buildTableFields(document: OpenApiDocument, operation: NormalizedOperation, enums: Map<string, GeneratedEnum>): GeneratedField[];
|
|
18
|
+
/**
|
|
19
|
+
* 收集所有接口里出现过的枚举。
|
|
20
|
+
*
|
|
21
|
+
* Apifox 会把枚举中文名放在 x-apifox-enum 中,生成器优先使用它;
|
|
22
|
+
* 如果没有 x-apifox-enum,则退回 OpenAPI 标准 enum 值。
|
|
23
|
+
*/
|
|
24
|
+
export declare function collectEnumsFromOperations(document: OpenApiDocument, operations: NormalizedOperation[]): Map<string, GeneratedEnum>;
|
|
25
|
+
export declare function isPaginationField(name: string): boolean;
|
|
26
|
+
export declare function getPageParamName(operation: NormalizedOperation): string;
|
|
27
|
+
export declare function getPageSizeParamName(operation: NormalizedOperation): string;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { GenerateCrudPageOptions, GenerateCrudPageResult } from './types';
|
|
2
|
+
export type { CrudOperationKind, GenerateCrudPageOptions, GenerateCrudPageResult, GeneratedFile, OpenApiDocument, RequestAdapterOptions, RequestRenderContext, } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* 根据 OpenAPI 3.1 文档生成一个可二次开发的 CRUD 页面目录。
|
|
5
|
+
*
|
|
6
|
+
* 使用方式:
|
|
7
|
+
* - 最简单:`generateCrudPage(openapiUrl)`,生成器自动识别 tag、标题、实体名和输出目录。
|
|
8
|
+
* - 进阶:`generateCrudPage({ openapi, outDir, operationMap })`,当接口文档不够规范时手动覆盖关键推断。
|
|
9
|
+
*
|
|
10
|
+
* 这里是生成器总编排层,只负责串起“读取文档 -> 推断模型 -> 渲染文件 -> 写入磁盘”四步,
|
|
11
|
+
* 具体推断规则分散在 operations/fields/schema/templates 中,避免入口函数变成难维护的大杂烩。
|
|
12
|
+
*/
|
|
13
|
+
export declare function generateCrudPage(openapi: string): Promise<GenerateCrudPageResult>;
|
|
14
|
+
export declare function generateCrudPage(options: GenerateCrudPageOptions): Promise<GenerateCrudPageResult>;
|