v1.1.0: better-sqlite3→sql.js迁移 + 6项UI/代码修复

迁移:
- better-sqlite3(原生C++) → sql.js(WASM纯JS), 兼容Node 24
- database-service.ts: PreparedStatement包装器保持API兼容
- main.ts: initialize()改为async/await
- 移除@electron/rebuild和@types/better-sqlite3依赖
- 新增.npmrc阿里云镜像加速

UI/代码修复(任务1-6):
1. TerminalView: 清理111行调试日志(645→534行)
2. 设计系统: cyan/slate→accent-blue/dark-*颜色统一(FileRow/TransferItem/Breadcrumb/ContextMenu)
3. StatusBar: 重写接入实时连接状态,三区布局
4. SessionDialog: 私钥浏览按钮添加onClick处理
5. WelcomeView: 真实session数据替换硬编码假数据
6. SFTPView: emoji→Lucide图标(FolderOpen/Upload/Download/Trash2)

构建验证: tsc零错误 + vite build成功(Node 24.14.0)
This commit is contained in:
OpsXShell Dev committed 2026-04-18 15:40:19 +08:00
1 parent c5243df040
commit 53274e2291
14 files changed
+1784 -2141

No files matched your search

+40 -22
View File
@@ -1,4 +1,5 @@
import { Terminal, FolderSync, ArrowRightLeft, Globe, Settings, Plus, Zap } from 'lucide-react'
import { Terminal, FolderSync, ArrowRightLeft, Globe, Settings, Plus, Zap, Inbox } from 'lucide-react'
import { useSessionStore } from '../stores'
import { useTabStore } from '../stores/tabStore'
interface WelcomeViewProps {
@@ -8,12 +9,18 @@ interface WelcomeViewProps {
export default function WelcomeView({ onNewSession, onQuickConnect }: WelcomeViewProps) {
const { addTab } = useTabStore()
const sessions = useSessionStore((s) => s.sessions)
const recentConnections = [
{ name: '本地开发服务器', host: '192.168.1.100', lastConnected: '2小时前' },
{ name: '生产环境', host: '10.0.0.1', lastConnected: '1天前' },
{ name: '测试服务器', host: '172.16.0.50', lastConnected: '3天前' },
]
// 取最近 5 个会话作为最近连接
const recentSessions = sessions.slice(-5).reverse()
const handleSessionClick = (session: typeof sessions[number]) => {
addTab({
title: session.name || session.host,
type: 'terminal',
sessionId: session.id,
})
}
return (
<div className="h-full flex flex-col items-center justify-center bg-dark-900 p-8">
@@ -93,23 +100,34 @@ export default function WelcomeView({ onNewSession, onQuickConnect }: WelcomeVie
{/* Recent connections */}
<div className="w-full max-w-2xl">
<h3 className="text-sm font-medium text-gray-400 mb-4">最近连接</h3>
<div className="space-y-2">
{recentConnections.map((conn, index) => (
<button
key={index}
className="w-full flex items-center justify-between p-4 bg-dark-800 hover:bg-dark-700 rounded-lg border border-dark-700 transition-colors"
>
<div className="flex items-center gap-3">
<Globe className="w-5 h-5 text-accent-blue" />
<div className="text-left">
<div className="font-medium text-gray-200">{conn.name}</div>
<div className="text-sm text-gray-500">{conn.host}</div>
{recentSessions.length === 0 ? (
<div className="flex flex-col items-center justify-center py-10 text-gray-500">
<Inbox className="w-10 h-10 mb-3 text-gray-600" />
<p className="text-sm">暂无会话记录</p>
<p className="text-xs mt-1">点击上方「新建会话」创建第一个连接</p>
</div>
) : (
<div className="space-y-2">
{recentSessions.map((session) => (
<button
key={session.id}
onClick={() => handleSessionClick(session)}
className="w-full flex items-center justify-between p-4 bg-dark-800 hover:bg-dark-700 rounded-lg border border-dark-700 hover:border-accent-blue/50 transition-colors"
>
<div className="flex items-center gap-3">
<Globe className="w-5 h-5 text-accent-blue" />
<div className="text-left">
<div className="font-medium text-gray-200">{session.name}</div>
<div className="text-sm text-gray-500">
{session.username}@{session.host}{session.port !== 22 ? `:${session.port}` : ''}
</div>
</div>
</div>
</div>
<span className="text-xs text-gray-500">{conn.lastConnected}</span>
</button>
))}
</div>
<span className="text-xs text-gray-500">--</span>
</button>
))}
</div>
)}
</div>
{/* Shortcuts hint */}