You've already forked iFlow-Settings-Editor-GUI
文档 完善项目文档结构和功能说明
This commit is contained in:
114
main.js
114
main.js
@@ -1,20 +1,14 @@
|
||||
const { app, BrowserWindow, ipcMain, dialog } = require('electron')
|
||||
const path = require('path')
|
||||
const fs = require('fs')
|
||||
|
||||
console.log('main.js loaded')
|
||||
console.log('app.getPath("home"):', app.getPath('home'))
|
||||
|
||||
const SETTINGS_FILE = path.join(app.getPath('home'), '.iflow', 'settings.json')
|
||||
console.log('SETTINGS_FILE:', SETTINGS_FILE)
|
||||
|
||||
let mainWindow
|
||||
|
||||
const isDev = process.argv.includes('--dev')
|
||||
|
||||
function createWindow() {
|
||||
console.log('Creating window...')
|
||||
|
||||
mainWindow = new BrowserWindow({
|
||||
width: 1100,
|
||||
height: 750,
|
||||
@@ -32,7 +26,6 @@ function createWindow() {
|
||||
webSecurity: false,
|
||||
},
|
||||
})
|
||||
|
||||
console.log('Loading index.html...')
|
||||
if (isDev) {
|
||||
mainWindow.loadURL('http://localhost:5173')
|
||||
@@ -40,39 +33,31 @@ function createWindow() {
|
||||
mainWindow.loadFile(path.join(__dirname, 'dist', 'index.html'))
|
||||
}
|
||||
console.log('index.html loading initiated')
|
||||
|
||||
mainWindow.webContents.on('did-fail-load', (event, errorCode, errorDescription) => {
|
||||
console.error('Failed to load:', errorCode, errorDescription)
|
||||
})
|
||||
|
||||
mainWindow.webContents.on('console-message', (event, level, message, line, sourceId) => {
|
||||
console.log('Console [' + level + ']:', message)
|
||||
})
|
||||
|
||||
mainWindow.once('ready-to-show', () => {
|
||||
console.log('Window ready to show')
|
||||
mainWindow.show()
|
||||
})
|
||||
|
||||
mainWindow.on('closed', () => {
|
||||
mainWindow = null
|
||||
})
|
||||
}
|
||||
|
||||
app.whenReady().then(createWindow)
|
||||
|
||||
app.on('window-all-closed', () => {
|
||||
if (process.platform !== 'darwin') {
|
||||
app.quit()
|
||||
}
|
||||
})
|
||||
|
||||
app.on('activate', () => {
|
||||
if (mainWindow === null) {
|
||||
createWindow()
|
||||
}
|
||||
})
|
||||
|
||||
// Window controls
|
||||
ipcMain.on('window-minimize', () => mainWindow.minimize())
|
||||
ipcMain.on('window-maximize', () => {
|
||||
@@ -83,12 +68,9 @@ ipcMain.on('window-maximize', () => {
|
||||
}
|
||||
})
|
||||
ipcMain.on('window-close', () => mainWindow.close())
|
||||
|
||||
ipcMain.handle('is-maximized', () => mainWindow.isMaximized())
|
||||
|
||||
// API 配置相关的字段
|
||||
const API_FIELDS = ['selectedAuthType', 'apiKey', 'baseUrl', 'modelName', 'searchApiKey', 'cna']
|
||||
|
||||
// 读取设置文件
|
||||
function readSettings() {
|
||||
if (!fs.existsSync(SETTINGS_FILE)) {
|
||||
@@ -97,7 +79,6 @@ function readSettings() {
|
||||
const data = fs.readFileSync(SETTINGS_FILE, 'utf-8')
|
||||
return JSON.parse(data)
|
||||
}
|
||||
|
||||
// 写入设置文件
|
||||
function writeSettings(data) {
|
||||
if (fs.existsSync(SETTINGS_FILE)) {
|
||||
@@ -106,7 +87,6 @@ function writeSettings(data) {
|
||||
}
|
||||
fs.writeFileSync(SETTINGS_FILE, JSON.stringify(data, null, 2), 'utf-8')
|
||||
}
|
||||
|
||||
// 获取 API 配置列表
|
||||
ipcMain.handle('list-api-profiles', async () => {
|
||||
try {
|
||||
@@ -114,28 +94,24 @@ ipcMain.handle('list-api-profiles', async () => {
|
||||
if (!settings) {
|
||||
return { success: true, profiles: [{ name: 'default', isDefault: true }], currentProfile: 'default' }
|
||||
}
|
||||
|
||||
const profiles = settings.apiProfiles || {}
|
||||
// 确保至少有 default 配置
|
||||
if (Object.keys(profiles).length === 0) {
|
||||
profiles.default = {}
|
||||
}
|
||||
|
||||
const profileList = Object.keys(profiles).map(name => ({
|
||||
name,
|
||||
isDefault: name === 'default'
|
||||
isDefault: name === 'default',
|
||||
}))
|
||||
|
||||
return {
|
||||
success: true,
|
||||
profiles: profileList,
|
||||
currentProfile: settings.currentApiProfile || 'default'
|
||||
return {
|
||||
success: true,
|
||||
profiles: profileList,
|
||||
currentProfile: settings.currentApiProfile || 'default',
|
||||
}
|
||||
} catch (error) {
|
||||
return { success: false, error: error.message, profiles: [{ name: 'default', isDefault: true }], currentProfile: 'default' }
|
||||
}
|
||||
})
|
||||
|
||||
// 切换 API 配置
|
||||
ipcMain.handle('switch-api-profile', async (event, profileName) => {
|
||||
try {
|
||||
@@ -143,12 +119,10 @@ ipcMain.handle('switch-api-profile', async (event, profileName) => {
|
||||
if (!settings) {
|
||||
return { success: false, error: '配置文件不存在' }
|
||||
}
|
||||
|
||||
const profiles = settings.apiProfiles || {}
|
||||
if (!profiles[profileName]) {
|
||||
return { success: false, error: `配置 "${profileName}" 不存在` }
|
||||
}
|
||||
|
||||
// 保存当前配置到 apiProfiles(如果当前配置存在)
|
||||
const currentProfile = settings.currentApiProfile || 'default'
|
||||
if (profiles[currentProfile]) {
|
||||
@@ -160,7 +134,6 @@ ipcMain.handle('switch-api-profile', async (event, profileName) => {
|
||||
}
|
||||
profiles[currentProfile] = currentConfig
|
||||
}
|
||||
|
||||
// 从 apiProfiles 加载新配置到主字段
|
||||
const newConfig = profiles[profileName]
|
||||
for (const field of API_FIELDS) {
|
||||
@@ -168,18 +141,14 @@ ipcMain.handle('switch-api-profile', async (event, profileName) => {
|
||||
settings[field] = newConfig[field]
|
||||
}
|
||||
}
|
||||
|
||||
settings.currentApiProfile = profileName
|
||||
settings.apiProfiles = profiles
|
||||
|
||||
writeSettings(settings)
|
||||
|
||||
return { success: true, data: settings }
|
||||
} catch (error) {
|
||||
return { success: false, error: error.message }
|
||||
}
|
||||
})
|
||||
|
||||
// 创建新的 API 配置
|
||||
ipcMain.handle('create-api-profile', async (event, name) => {
|
||||
try {
|
||||
@@ -187,7 +156,6 @@ ipcMain.handle('create-api-profile', async (event, name) => {
|
||||
if (!settings) {
|
||||
return { success: false, error: '配置文件不存在' }
|
||||
}
|
||||
|
||||
if (!settings.apiProfiles) {
|
||||
settings.apiProfiles = { default: {} }
|
||||
// 初始化 default 配置
|
||||
@@ -197,11 +165,9 @@ ipcMain.handle('create-api-profile', async (event, name) => {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (settings.apiProfiles[name]) {
|
||||
return { success: false, error: `配置 "${name}" 已存在` }
|
||||
}
|
||||
|
||||
// 复制当前配置到新配置
|
||||
const newConfig = {}
|
||||
for (const field of API_FIELDS) {
|
||||
@@ -210,15 +176,12 @@ ipcMain.handle('create-api-profile', async (event, name) => {
|
||||
}
|
||||
}
|
||||
settings.apiProfiles[name] = newConfig
|
||||
|
||||
writeSettings(settings)
|
||||
|
||||
return { success: true }
|
||||
} catch (error) {
|
||||
return { success: false, error: error.message }
|
||||
}
|
||||
})
|
||||
|
||||
// 删除 API 配置
|
||||
ipcMain.handle('delete-api-profile', async (event, name) => {
|
||||
try {
|
||||
@@ -226,19 +189,15 @@ ipcMain.handle('delete-api-profile', async (event, name) => {
|
||||
if (!settings) {
|
||||
return { success: false, error: '配置文件不存在' }
|
||||
}
|
||||
|
||||
if (name === 'default') {
|
||||
return { success: false, error: '不能删除默认配置' }
|
||||
}
|
||||
|
||||
const profiles = settings.apiProfiles || {}
|
||||
if (!profiles[name]) {
|
||||
return { success: false, error: `配置 "${name}" 不存在` }
|
||||
}
|
||||
|
||||
delete profiles[name]
|
||||
settings.apiProfiles = profiles
|
||||
|
||||
// 如果删除的是当前配置,切换到 default
|
||||
if (settings.currentApiProfile === name) {
|
||||
settings.currentApiProfile = 'default'
|
||||
@@ -250,121 +209,64 @@ ipcMain.handle('delete-api-profile', async (event, name) => {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
writeSettings(settings)
|
||||
|
||||
return { success: true, data: settings }
|
||||
} catch (error) {
|
||||
return { success: false, error: error.message }
|
||||
}
|
||||
})
|
||||
|
||||
// 重命名 API 配置
|
||||
|
||||
ipcMain.handle('rename-api-profile', async (event, oldName, newName) => {
|
||||
|
||||
try {
|
||||
|
||||
const settings = readSettings()
|
||||
|
||||
if (!settings) {
|
||||
|
||||
return { success: false, error: '配置文件不存在' }
|
||||
|
||||
}
|
||||
|
||||
if (oldName === 'default') {
|
||||
|
||||
return { success: false, error: '不能重命名默认配置' }
|
||||
|
||||
}
|
||||
|
||||
const profiles = settings.apiProfiles || {}
|
||||
|
||||
if (!profiles[oldName]) {
|
||||
|
||||
return { success: false, error: `配置 "${oldName}" 不存在` }
|
||||
|
||||
}
|
||||
|
||||
if (profiles[newName]) {
|
||||
|
||||
return { success: false, error: `配置 "${newName}" 已存在` }
|
||||
|
||||
}
|
||||
|
||||
profiles[newName] = profiles[oldName]
|
||||
|
||||
delete profiles[oldName]
|
||||
|
||||
settings.apiProfiles = profiles
|
||||
|
||||
if (settings.currentApiProfile === oldName) {
|
||||
|
||||
settings.currentApiProfile = newName
|
||||
|
||||
}
|
||||
|
||||
writeSettings(settings)
|
||||
|
||||
return { success: true }
|
||||
|
||||
} catch (error) {
|
||||
|
||||
return { success: false, error: error.message }
|
||||
|
||||
}
|
||||
|
||||
})
|
||||
|
||||
|
||||
|
||||
// 复制 API 配置
|
||||
|
||||
ipcMain.handle('duplicate-api-profile', async (event, sourceName, newName) => {
|
||||
|
||||
try {
|
||||
|
||||
const settings = readSettings()
|
||||
|
||||
if (!settings) {
|
||||
|
||||
return { success: false, error: '配置文件不存在' }
|
||||
|
||||
}
|
||||
|
||||
const profiles = settings.apiProfiles || {}
|
||||
|
||||
if (!profiles[sourceName]) {
|
||||
|
||||
return { success: false, error: `配置 "${sourceName}" 不存在` }
|
||||
|
||||
}
|
||||
|
||||
if (profiles[newName]) {
|
||||
|
||||
return { success: false, error: `配置 "${newName}" 已存在` }
|
||||
|
||||
}
|
||||
|
||||
// 深拷贝配置
|
||||
|
||||
profiles[newName] = JSON.parse(JSON.stringify(profiles[sourceName]))
|
||||
|
||||
settings.apiProfiles = profiles
|
||||
|
||||
writeSettings(settings)
|
||||
|
||||
return { success: true }
|
||||
|
||||
} catch (error) {
|
||||
|
||||
return { success: false, error: error.message }
|
||||
|
||||
}
|
||||
|
||||
})
|
||||
|
||||
// IPC Handlers
|
||||
ipcMain.handle('load-settings', async () => {
|
||||
try {
|
||||
@@ -378,7 +280,6 @@ ipcMain.handle('load-settings', async () => {
|
||||
return { success: false, error: error.message, data: null }
|
||||
}
|
||||
})
|
||||
|
||||
ipcMain.handle('save-settings', async (event, data) => {
|
||||
try {
|
||||
// 保存时同步更新 apiProfiles 中的当前配置
|
||||
@@ -386,7 +287,6 @@ ipcMain.handle('save-settings', async (event, data) => {
|
||||
if (!data.apiProfiles) {
|
||||
data.apiProfiles = {}
|
||||
}
|
||||
|
||||
// 更新当前配置到 apiProfiles
|
||||
const currentConfig = {}
|
||||
for (const field of API_FIELDS) {
|
||||
@@ -395,14 +295,12 @@ ipcMain.handle('save-settings', async (event, data) => {
|
||||
}
|
||||
}
|
||||
data.apiProfiles[currentProfile] = currentConfig
|
||||
|
||||
writeSettings(data)
|
||||
return { success: true }
|
||||
} catch (error) {
|
||||
return { success: false, error: error.message }
|
||||
}
|
||||
})
|
||||
|
||||
ipcMain.handle('show-message', async (event, { type, title, message }) => {
|
||||
return dialog.showMessageBox(mainWindow, { type, title, message })
|
||||
})
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user