From 1758d6f9188e85cb1870396440cffc4564e70c2b Mon Sep 17 00:00:00 2001 From: Syngnat Date: Fri, 20 Mar 2026 16:00:35 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20feat(table-designer):=20=E8=A1=A5?= =?UTF-8?q?=E5=85=A8=E8=AE=BE=E8=AE=A1=E8=A1=A8=E5=AD=97=E6=AE=B5=E7=B1=BB?= =?UTF-8?q?=E5=9E=8B=E5=88=97=E8=A1=A8=EF=BC=8C=E6=8C=89=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=BA=93=E6=96=B9=E8=A8=80=E5=88=86=E7=BB=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 DB_TYPE_OPTIONS 按 MySQL/PostgreSQL/SQL Server/SQLite/Oracle 分组 - MySQL:补充数值(float/double/smallint/mediumint)、字符串(tinytext/mediumtext/longtext)、 二进制(blob/tinyblob/mediumblob/longblob)、其他(enum/set/bit/year) - PostgreSQL:补充 serial/boolean/timestamptz/jsonb/uuid/inet 等 - SQL Server:补充 float/real/money/nvarchar/datetime2/uniqueidentifier 等 - AutoComplete options 从固定 COMMON_TYPES 改为 DB_TYPE_OPTIONS[getDbType()] 动态获取 - refs #281 --- frontend/src/components/TableDesigner.tsx | 145 +++++++++++++++++++++- 1 file changed, 144 insertions(+), 1 deletion(-) diff --git a/frontend/src/components/TableDesigner.tsx b/frontend/src/components/TableDesigner.tsx index ee2335f..a9f604b 100644 --- a/frontend/src/components/TableDesigner.tsx +++ b/frontend/src/components/TableDesigner.tsx @@ -48,6 +48,7 @@ interface ForeignKeyFormState { refColumnNames: string[]; } +// 通用兜底类型列表 const COMMON_TYPES = [ { value: 'int' }, { value: 'varchar(255)' }, @@ -59,6 +60,148 @@ const COMMON_TYPES = [ { value: 'json' }, ]; +// 按数据库方言分组的完整字段类型列表 +const DB_TYPE_OPTIONS: Record = { + mysql: [ + // 数值 + { value: 'tinyint' }, + { value: 'tinyint(1)' }, + { value: 'smallint' }, + { value: 'mediumint' }, + { value: 'int' }, + { value: 'bigint' }, + { value: 'float' }, + { value: 'double' }, + { value: 'decimal(10,2)' }, + // 字符串 + { value: 'char(50)' }, + { value: 'varchar(255)' }, + { value: 'tinytext' }, + { value: 'text' }, + { value: 'mediumtext' }, + { value: 'longtext' }, + // 二进制 + { value: 'binary(255)' }, + { value: 'varbinary(255)' }, + { value: 'tinyblob' }, + { value: 'blob' }, + { value: 'mediumblob' }, + { value: 'longblob' }, + // 日期时间 + { value: 'date' }, + { value: 'time' }, + { value: 'datetime' }, + { value: 'timestamp' }, + { value: 'year' }, + // 其他 + { value: 'json' }, + { value: 'enum' }, + { value: 'set' }, + { value: 'bit(1)' }, + ], + postgres: [ + // 数值 + { value: 'smallint' }, + { value: 'integer' }, + { value: 'bigint' }, + { value: 'real' }, + { value: 'double precision' }, + { value: 'numeric(10,2)' }, + { value: 'serial' }, + { value: 'bigserial' }, + // 字符串 + { value: 'char(50)' }, + { value: 'varchar(255)' }, + { value: 'text' }, + // 布尔 + { value: 'boolean' }, + // 日期时间 + { value: 'date' }, + { value: 'time' }, + { value: 'timestamp' }, + { value: 'timestamptz' }, + { value: 'interval' }, + // 二进制 + { value: 'bytea' }, + // JSON + { value: 'json' }, + { value: 'jsonb' }, + // 其他 + { value: 'uuid' }, + { value: 'inet' }, + { value: 'cidr' }, + { value: 'macaddr' }, + { value: 'xml' }, + { value: 'int4range' }, + { value: 'tsquery' }, + { value: 'tsvector' }, + ], + sqlserver: [ + // 数值 + { value: 'tinyint' }, + { value: 'smallint' }, + { value: 'int' }, + { value: 'bigint' }, + { value: 'float' }, + { value: 'real' }, + { value: 'decimal(10,2)' }, + { value: 'numeric(10,2)' }, + { value: 'money' }, + { value: 'smallmoney' }, + // 字符串 + { value: 'char(50)' }, + { value: 'varchar(255)' }, + { value: 'varchar(max)' }, + { value: 'nchar(50)' }, + { value: 'nvarchar(255)' }, + { value: 'nvarchar(max)' }, + { value: 'text' }, + { value: 'ntext' }, + // 日期时间 + { value: 'date' }, + { value: 'time' }, + { value: 'datetime' }, + { value: 'datetime2' }, + { value: 'datetimeoffset' }, + { value: 'smalldatetime' }, + // 二进制 + { value: 'binary(255)' }, + { value: 'varbinary(255)' }, + { value: 'varbinary(max)' }, + { value: 'image' }, + // 其他 + { value: 'bit' }, + { value: 'uniqueidentifier' }, + { value: 'xml' }, + ], + sqlite: [ + { value: 'INTEGER' }, + { value: 'REAL' }, + { value: 'TEXT' }, + { value: 'BLOB' }, + { value: 'NUMERIC' }, + ], + oracle: [ + { value: 'NUMBER(10)' }, + { value: 'NUMBER(10,2)' }, + { value: 'FLOAT' }, + { value: 'BINARY_FLOAT' }, + { value: 'BINARY_DOUBLE' }, + { value: 'CHAR(50)' }, + { value: 'VARCHAR2(255)' }, + { value: 'NVARCHAR2(255)' }, + { value: 'CLOB' }, + { value: 'NCLOB' }, + { value: 'BLOB' }, + { value: 'DATE' }, + { value: 'TIMESTAMP' }, + { value: 'TIMESTAMP WITH TIME ZONE' }, + { value: 'RAW(255)' }, + { value: 'LONG RAW' }, + { value: 'XMLTYPE' }, + ], +}; + const COMMON_DEFAULTS = [ { value: 'CURRENT_TIMESTAMP' }, { value: 'NULL' }, @@ -410,7 +553,7 @@ const TableDesigner: React.FC<{ tab: TabData }> = ({ tab }) => { key: 'type', width: 150, render: (text: string, record: EditableColumn) => readOnly ? text : ( - handleColumnChange(record._key, 'type', val)} style={{ width: '100%' }} variant="borderless" /> + handleColumnChange(record._key, 'type', val)} style={{ width: '100%' }} variant="borderless" /> ) }, {