feat: v0.3.0 版本 - SSH终端、SFTP、端口转发功能实现

核心功能:
- SSH终端: 密码/密钥认证、XTerm.js终端、多主题配色、IP高亮
- SFTP管理: 双栏文件管理、上传下载、传输队列
- 端口转发: 本地/远程转发、SOCKS5动态代理、规则管理

架构改进:
- 拆分大型组件 (SFTPView/TabBar/Sidebar)
- 添加统一日志和错误处理
- 修复React严格模式下的终端黑屏问题

UI更新:
- 新增端口转发视图
- 更新UI预览文档
- 左侧栏右键菜单支持SFTP快捷打开
This commit is contained in:
Logan.Li committed 2026-04-06 01:20:47 +08:00
1 parent cf1c054381
commit 484d850abd
105 files changed
+25330 -64

No files matched your search

+36
View File
@@ -0,0 +1,36 @@
/**
* SortHeader - 列表排序表头组件
*/
import { ArrowUp, ArrowDown } from 'lucide-react'
import type { SortField, SortOrder } from '../../../shared/types/sftp.types'
interface SortHeaderProps {
onSort: (f: SortField) => void
sortField: SortField
sortOrder: SortOrder
}
export function SortHeader({ onSort, sortField, sortOrder }: SortHeaderProps) {
const fields: { key: SortField; label: string; width: string; align: 'left' | 'right' }[] = [
{ key: 'name', label: '名称', width: 'flex-1', align: 'left' },
{ key: 'modified', label: '修改时间', width: 'w-32', align: 'right' },
{ key: 'size', label: '大小', width: 'w-24', align: 'right' },
{ key: 'type', label: '类型', width: 'w-24', align: 'right' },
]
return (
<div className="h-9 flex items-center px-4 bg-dark-700/50 text-xs text-gray-500 border-b border-dark-700 select-none">
{fields.map(({ key, label, width, align }) => (
<button
key={key}
onClick={() => onSort(key)}
className={`${width} flex items-center justify-${align} gap-1 hover:text-gray-200 transition-colors`}
>
<span>{label}</span>
{sortField === key && (sortOrder === 'asc' ? <ArrowUp className="w-3 h-3" /> : <ArrowDown className="w-3 h-3" />)}
</button>
))}
</div>
)
}