+ {sortedFiltered.map(t => (
+
, onClick: () => {
+ addTab({
+ id: `query-${Date.now()}`,
+ title: '新建查询',
+ type: 'query',
+ connectionId: tab.connectionId,
+ dbName: tab.dbName,
+ query: `SELECT * FROM ${t.name};`,
+ });
+ }},
+ { type: 'divider' },
+ { key: 'design-table', label: '设计表', icon:
, onClick: () => openDesign(t.name) },
+ { key: 'copy-structure', label: '复制表结构', icon:
, onClick: () => handleCopyStructure(t.name) },
+ { key: 'backup-table', label: '备份表 (SQL)', icon:
, onClick: () => handleExport(t.name, 'sql') },
+ { key: 'rename-table', label: '重命名表', icon:
, onClick: () => handleRenameTable(t.name) },
+ { key: 'drop-table', label: '删除表', icon:
, danger: true, onClick: () => handleDeleteTable(t.name) },
+ { type: 'divider' },
+ { key: 'export', label: '导出表数据', icon:
, children: [
+ { key: 'export-csv', label: '导出 CSV', onClick: () => handleExport(t.name, 'csv') },
+ { key: 'export-xlsx', label: '导出 Excel (XLSX)', onClick: () => handleExport(t.name, 'xlsx') },
+ { key: 'export-json', label: '导出 JSON', onClick: () => handleExport(t.name, 'json') },
+ { key: 'export-md', label: '导出 Markdown', onClick: () => handleExport(t.name, 'md') },
+ { key: 'export-html', label: '导出 HTML', onClick: () => handleExport(t.name, 'html') },
+ ]},
+ ],
+ }}
+ >
+
openTable(t.name)}
+ style={{
+ background: cardBg,
+ border: `1px solid ${cardBorder}`,
+ borderRadius: 10,
+ padding: '14px 16px',
+ cursor: 'pointer',
+ transition: 'all 0.15s ease',
+ userSelect: 'none',
+ }}
+ onMouseEnter={e => { (e.currentTarget as HTMLDivElement).style.background = cardHoverBg; (e.currentTarget as HTMLDivElement).style.borderColor = accentColor; }}
+ onMouseLeave={e => { (e.currentTarget as HTMLDivElement).style.background = cardBg; (e.currentTarget as HTMLDivElement).style.borderColor = cardBorder; }}
+ >
+
+ {t.comment && (
+
+
+ {t.comment}
+
+
+ )}
+
+ 📊 {formatRows(t.rows)}
+ 💾 {formatSize(t.dataSize)}
+ {t.engine && {t.engine}}
+
+
+
+ ))}
+