import React from 'react';
// ─── 公共接口 ───────────────────────────────────────────────
export interface DbIconProps {
size?: number;
color?: string;
}
const IconFrame: React.FC<{
size: number;
children: React.ReactNode;
}> = ({ size, children }) => (
{children}
);
// ─── 默认色表 ───────────────────────────────────────────────
const DB_DEFAULT_COLORS: Record = {
mysql: '#00758F',
mariadb: '#003545',
oceanbase: '#0052CC',
postgres: '#336791',
redis: '#DC382D',
mongodb: '#47A248',
elasticsearch: '#FEC514',
jvm: '#1677FF',
kingbase: '#1890FF',
dameng: '#E6002D',
oracle: '#F80000',
sqlserver: '#CC2927',
clickhouse: '#FFBF00',
sqlite: '#003B57',
duckdb: '#FFC107',
vastbase: '#0066CC',
opengauss: '#2446A8',
gaussdb: '#0B7FAB',
goldendb: '#D97706',
highgo: '#00A86B',
iris: '#1F6FEB',
tdengine: '#2962FF',
iotdb: '#0F766E',
rocketmq: '#EA580C',
mqtt: '#0EA5A4',
kafka: '#F97316',
rabbitmq: '#FF6B35',
chroma: '#7C3AED',
qdrant: '#DC244C',
diros: '#0050B3',
starrocks: '#00A6A6',
sphinx: '#2F5D62',
custom: '#888888',
};
export const getDbDefaultColor = (type: string): string =>
DB_DEFAULT_COLORS[type?.toLowerCase()] || DB_DEFAULT_COLORS.custom;
type BrandAssetConfig = {
background?: string;
borderColor?: string;
iconScale?: number;
src: string;
};
// ─── 官方品牌资源(文件在 /db-icons/ 下) ────────────────────
const BRAND_ASSET_CONFIGS: Record = {
mysql: { src: '/db-icons/mysql.svg' },
mariadb: { src: '/db-icons/mariadb.svg' },
oceanbase: { src: '/db-icons/oceanbase.png', iconScale: 0.72 },
postgres: { src: '/db-icons/postgres.svg' },
redis: { src: '/db-icons/redis.svg' },
mongodb: { src: '/db-icons/mongodb.svg' },
elasticsearch: { src: '/db-icons/elasticsearch.svg' },
jvm: { src: '/db-icons/jvm.ico', iconScale: 0.72 },
kingbase: { src: '/db-icons/kingbase.ico', iconScale: 0.72 },
dameng: { src: '/db-icons/dameng.png', iconScale: 0.72 },
oracle: { src: '/db-icons/oracle.ico', iconScale: 0.72 },
sqlserver: { src: '/db-icons/sqlserver.svg' },
clickhouse: { src: '/db-icons/clickhouse.svg' },
sqlite: { src: '/db-icons/sqlite.svg' },
duckdb: { src: '/db-icons/duckdb.svg' },
vastbase: { src: '/db-icons/vastbase.svg', iconScale: 0.84 },
opengauss: { src: '/db-icons/opengauss.ico', iconScale: 0.72 },
gaussdb: { src: '/db-icons/gaussdb.ico', iconScale: 0.72 },
goldendb: { src: '/db-icons/goldendb.ico', iconScale: 0.72 },
highgo: { src: '/db-icons/highgo.ico', iconScale: 0.72 },
iris: { src: '/db-icons/iris.png', iconScale: 0.72 },
tdengine: { src: '/db-icons/tdengine.ico', iconScale: 0.72 },
iotdb: {
src: '/db-icons/iotdb.svg',
background: '#0F766E',
borderColor: '#0F766E',
iconScale: 0.82,
},
rocketmq: {
src: '/db-icons/rocketmq.png',
background: '#0F172A',
borderColor: '#EA580C',
iconScale: 0.84,
},
mqtt: {
src: '/db-icons/mqtt.svg',
background: '#0F172A',
borderColor: '#0EA5A4',
iconScale: 0.84,
},
kafka: { src: '/db-icons/kafka.png', iconScale: 0.8 },
rabbitmq: { src: '/db-icons/rabbitmq.svg', iconScale: 0.74 },
chroma: { src: '/db-icons/chroma.svg', iconScale: 0.9 },
qdrant: { src: '/db-icons/qdrant.svg', iconScale: 0.74 },
diros: { src: '/db-icons/diros.svg' },
starrocks: {
src: '/db-icons/starrocks.png',
background: '#0B1021',
borderColor: '#00A6A6',
iconScale: 0.84,
},
sphinx: { src: '/db-icons/sphinx.svg' },
};
const BRAND_ASSET_TYPES = new Set(Object.keys(BRAND_ASSET_CONFIGS));
/** 品牌图标:用
加载官方 svg/png/ico 资源 */
const BrandAssetIcon: React.FC<{ type: string; size: number; color?: string }> = ({ type, size, color }) => {
const config = BRAND_ASSET_CONFIGS[type.toLowerCase()];
const bgColor = color || config?.borderColor || getDbDefaultColor(type);
const iconScale = config?.iconScale ?? 0.64;
return (
);
};
// ─── 各数据库图标 ───────────────────────────────────────────
// 有品牌官方资源的数据库
const MySQLIcon: React.FC = ({ size = 16, color }) => (
);
const MariaDBIcon: React.FC = ({ size = 16, color }) => (
);
const OceanBaseIcon: React.FC = ({ size = 16, color }) => (
);
const PostgresIcon: React.FC = ({ size = 16, color }) => (
);
const RedisIcon: React.FC = ({ size = 16, color }) => (
);
const MongoDBIcon: React.FC = ({ size = 16, color }) => (
);
const ClickHouseIcon: React.FC = ({ size = 16, color }) => (
);
const SQLiteIcon: React.FC = ({ size = 16, color }) => (
);
const OracleIcon: React.FC = ({ size = 16, color }) => (
);
const SQLServerIcon: React.FC = ({ size = 16, color }) => (
);
const DorisIcon: React.FC = ({ size = 16, color }) => (
);
const StarRocksIcon: React.FC = ({ size = 16, color }) => (
);
const SphinxIcon: React.FC = ({ size = 16, color }) => (
);
const DuckDBIcon: React.FC = ({ size = 16, color }) => (
);
const KingBaseIcon: React.FC = ({ size = 16, color }) => (
);
const DamengIcon: React.FC = ({ size = 16, color }) => (
);
const VastBaseIcon: React.FC = ({ size = 16, color }) => (
);
const OpenGaussIcon: React.FC = ({ size = 16, color }) => (
);
const GaussDBIcon: React.FC = ({ size = 16, color }) => (
);
const GoldenDBIcon: React.FC = ({ size = 16, color }) => (
);
const HighGoIcon: React.FC = ({ size = 16, color }) => (
);
const IrisIcon: React.FC = ({ size = 16, color }) => (
);
const TDengineIcon: React.FC = ({ size = 16, color }) => (
);
const IoTDBIcon: React.FC = ({ size = 16, color }) => (
);
const RocketMQIcon: React.FC = ({ size = 16, color }) => (
);
const MQTTIcon: React.FC = ({ size = 16, color }) => (
);
const KafkaIcon: React.FC = ({ size = 16, color }) => (
);
const RabbitMQIcon: React.FC = ({ size = 16, color }) => (
);
const ChromaIcon: React.FC = ({ size = 16, color }) => (
);
const QdrantIcon: React.FC = ({ size = 16, color }) => (
);
const JVMIcon: React.FC = ({ size = 16, color }) => (
);
const ElasticsearchIcon: React.FC = ({ size = 16, color }) => (
);
/** Custom — 齿轮图标 */
const CustomIcon: React.FC = ({ size = 16, color }) => {
const c = color || DB_DEFAULT_COLORS.custom;
return (
);
};
// ─── 图标注册表 ─────────────────────────────────────────────
const DB_ICON_MAP: Record> = {
mysql: MySQLIcon,
mariadb: MariaDBIcon,
oceanbase: OceanBaseIcon,
diros: DorisIcon,
starrocks: StarRocksIcon,
sphinx: SphinxIcon,
postgres: PostgresIcon,
redis: RedisIcon,
mongodb: MongoDBIcon,
jvm: JVMIcon,
kingbase: KingBaseIcon,
dameng: DamengIcon,
oracle: OracleIcon,
sqlserver: SQLServerIcon,
clickhouse: ClickHouseIcon,
sqlite: SQLiteIcon,
duckdb: DuckDBIcon,
vastbase: VastBaseIcon,
opengauss: OpenGaussIcon,
gaussdb: GaussDBIcon,
goldendb: GoldenDBIcon,
highgo: HighGoIcon,
iris: IrisIcon,
tdengine: TDengineIcon,
iotdb: IoTDBIcon,
rocketmq: RocketMQIcon,
mqtt: MQTTIcon,
kafka: KafkaIcon,
rabbitmq: RabbitMQIcon,
chroma: ChromaIcon,
qdrant: QdrantIcon,
elasticsearch: ElasticsearchIcon,
custom: CustomIcon,
};
/** 可选图标类型列表(用于图标选择器 UI) */
export const DB_ICON_TYPES: string[] = [
'mysql', 'mariadb', 'oceanbase', 'postgres', 'redis', 'mongodb', 'jvm',
'oracle', 'sqlserver', 'sqlite', 'duckdb', 'clickhouse', 'starrocks',
'kingbase', 'dameng', 'vastbase', 'opengauss', 'gaussdb', 'goldendb', 'highgo', 'iris', 'tdengine', 'iotdb', 'rocketmq', 'mqtt', 'kafka', 'rabbitmq', 'chroma', 'qdrant', 'elasticsearch', 'custom',
];
/** 该类型是否有品牌图标资源 */
export const hasBrandSvg = (type: string): boolean => BRAND_ASSET_TYPES.has(type?.toLowerCase());
/** 获取数据库图标 React 节点 */
export const getDbIcon = (type: string, color?: string, size?: number): React.ReactNode => {
const key = (type || 'custom').toLowerCase();
const Component = DB_ICON_MAP[key] || CustomIcon;
return ;
};
/** 获取数据库图标显示名称(中文) */
export const getDbIconLabel = (type: string): string => {
const labels: Record = {
mysql: 'MySQL', mariadb: 'MariaDB', oceanbase: 'OceanBase', postgres: 'PostgreSQL',
redis: 'Redis', mongodb: 'MongoDB', jvm: 'JVM',
oracle: 'Oracle',
sqlserver: 'SQL Server', clickhouse: 'ClickHouse', sqlite: 'SQLite',
starrocks: 'StarRocks',
duckdb: 'DuckDB', kingbase: '金仓', dameng: '达梦',
vastbase: 'VastBase', opengauss: 'OpenGauss', gaussdb: 'GaussDB', goldendb: 'GoldenDB', highgo: '瀚高', iris: 'InterSystems IRIS', tdengine: 'TDengine', iotdb: 'Apache IoTDB', rocketmq: 'RocketMQ', mqtt: 'MQTT', kafka: 'Kafka', rabbitmq: 'RabbitMQ',
chroma: 'Chroma',
qdrant: 'Qdrant',
elasticsearch: 'Elasticsearch',
custom: '自定义',
};
return labels[type?.toLowerCase()] || type;
};
/** 预设颜色列表 */
export const PRESET_ICON_COLORS: string[] = [
'#336791', '#00758F', '#DC382D', '#47A248', '#F80000',
'#CC2927', '#1890FF', '#E6002D', '#FFBF00', '#2962FF',
'#00A86B', '#0066CC', '#FF6B35', '#7C3AED',
];