feat(log): 实现日志文件持久化和全局进度条

- 新增日志文件保存和加载功能
- 实现全局进度条组件
- 优化初始化界面布局
- 更新设置界面,增加系统日志查看按钮
This commit is contained in:
2025-08-07 00:51:29 +08:00
parent ae151a9311
commit 161dc478ae
8 changed files with 212 additions and 43 deletions

View File

@@ -1,5 +1,6 @@
import { app, BrowserWindow, ipcMain, dialog } from 'electron'
import * as path from 'path'
import * as fs from 'fs'
import { getAppRoot, checkEnvironment } from './services/environmentService'
import { setMainWindow as setDownloadMainWindow } from './services/downloadService'
import { setMainWindow as setPythonMainWindow, downloadPython, installDependencies, startBackend } from './services/pythonService'
@@ -108,6 +109,44 @@ ipcMain.handle('update-backend', async (event, repoUrl = 'https://github.com/DLm
return cloneBackend(appRoot, repoUrl) // 使用相同的逻辑会自动判断是pull还是clone
})
// 日志文件操作
ipcMain.handle('save-logs-to-file', async (event, logs: string) => {
try {
const appRoot = getAppRoot()
const logsDir = path.join(appRoot, 'logs')
// 确保logs目录存在
if (!fs.existsSync(logsDir)) {
fs.mkdirSync(logsDir, { recursive: true })
}
const logFilePath = path.join(logsDir, 'app.log')
fs.writeFileSync(logFilePath, logs, 'utf8')
console.log(`日志已保存到: ${logFilePath}`)
} catch (error) {
console.error('保存日志文件失败:', error)
throw error
}
})
ipcMain.handle('load-logs-from-file', async () => {
try {
const appRoot = getAppRoot()
const logFilePath = path.join(appRoot, 'logs', 'app.log')
if (fs.existsSync(logFilePath)) {
const logs = fs.readFileSync(logFilePath, 'utf8')
console.log(`从文件加载日志: ${logFilePath}`)
return logs
}
return null
} catch (error) {
console.error('加载日志文件失败:', error)
return null
}
})
// 应用生命周期
app.whenReady().then(createWindow)

View File

@@ -19,6 +19,10 @@ contextBridge.exposeInMainWorld('electronAPI', {
updateBackend: (repoUrl?: string) => ipcRenderer.invoke('update-backend', repoUrl),
startBackend: () => ipcRenderer.invoke('start-backend'),
// 日志文件操作
saveLogsToFile: (logs: string) => ipcRenderer.invoke('save-logs-to-file', logs),
loadLogsFromFile: () => ipcRenderer.invoke('load-logs-from-file'),
// 监听下载进度
onDownloadProgress: (callback: (progress: any) => void) => {
ipcRenderer.on('download-progress', (_, progress) => callback(progress))