Browse Source

feat: 添加存储目录管理功能,支持选择和打开存储路径

master
cles 7 days ago
parent
commit
618e434cb1
  1. 37
      src/main/ipcRouter.js
  2. 25
      src/preload/index.js
  3. 76
      src/renderer/src/components/SystemSettings/SystemSettings.jsx

37
src/main/ipcRouter.js

@ -1,4 +1,5 @@
import { ipcMain } from 'electron'
import { dialog, shell } from 'electron'
import dgram from 'dgram'
import net from 'net'
import { IPC_EVENT } from '../renderer/src/common/ipcEvents.js'
@ -187,6 +188,9 @@ export function registerIpRouter() {
ipcMain.handle(IPC_EVENT.INVALID_DATA_COUNT_SET, invalidDataCountSet)
ipcMain.handle(IPC_EVENT.IMAGE_SEND_ENABLED, imageSendEnabledSet)
ipcMain.handle(IPC_EVENT.IS_CLEAR_ZERO, isClearZeroSet)
// 存储目录相关处理
ipcMain.handle('open-directory', openDirectory)
ipcMain.handle('select-directory', selectDirectory)
}
// 搜索设备
const searchDevice = (event) => {
@ -1446,3 +1450,36 @@ const stopHeartbeatCheck = (ip) => {
lastHeartbeatTime.delete(ip)
log.info(`Stopped heartbeat check for ${ip}`)
}
// 存储目录相关处理函数
const openDirectory = async (event, path) => {
try {
await shell.openPath(path)
log.info(`Opened directory: ${path}`)
return { success: true }
} catch (error) {
log.error('Failed to open directory:', error)
return { success: false, error: error.message }
}
}
const selectDirectory = async (event, options) => {
try {
const result = await dialog.showOpenDialog({
title: options.title || '选择目录',
properties: ['openDirectory', 'createDirectory'],
defaultPath: options.defaultPath
})
if (result.canceled) {
return { success: false, canceled: true }
}
const selectedPath = result.filePaths[0]
log.info(`Directory selected: ${selectedPath}`)
return { success: true, path: selectedPath }
} catch (error) {
log.error('Failed to select directory:', error)
return { success: false, error: error.message }
}
}

25
src/preload/index.js

@ -1,7 +1,30 @@
import { contextBridge } from 'electron'
import { electronAPI } from '@electron-toolkit/preload'
import { join } from 'path'
import { homedir } from 'os'
import { existsSync, mkdirSync } from 'fs'
import log from 'electron-log'
const api = {}
const api = {
// 获取用户主目录
getHomeDir: () => homedir(),
// 获取默认存储目录
getDefaultStoragePath: () => {
const defaultPath = join(homedir(), 'FlexometerSetup', 'data')
// 检查目录是否存在,不存在则创建
try {
if (!existsSync(defaultPath)) {
mkdirSync(defaultPath, { recursive: true })
log.info('Created default storage directory at:', defaultPath)
}
} catch (error) {
log.error('Error creating default storage directory:', error)
return homedir() // 出错时返回用户主目录
}
return defaultPath
}
}
if (process.contextIsolated) {
try {

76
src/renderer/src/components/SystemSettings/SystemSettings.jsx

@ -20,6 +20,7 @@ function SystemSettings() {
const [settingLoading, setSettingLoading] = useState(false)
const [imageControlLoading, setImageControlLoading] = useState(false)
const [clearZeroLoading, setClearZeroLoading] = useState(false)
const [storagePath, setStoragePath] = useState('')
//
const connectedDevice = useDeviceStore((state) => state.connectedDevice)
@ -64,6 +65,60 @@ function SystemSettings() {
}
}, [setReconnecting])
//
useEffect(() => {
const savedPath = localStorage.getItem('storagePath')
if (savedPath) {
setStoragePath(savedPath)
} else {
// 使 API
const defaultPath = window.api.getDefaultStoragePath()
setStoragePath(defaultPath)
localStorage.setItem('storagePath', defaultPath)
}
}, [])
//
const handleOpenStoragePath = async () => {
if (!storagePath) {
message.warning('存储路径未设置')
return
}
try {
// 使 IPC
const result = await window.electron.ipcRenderer.invoke('open-directory', storagePath)
if (!result.success) {
message.error(`打开目录失败:${result.error}`)
}
} catch (error) {
console.error('打开存储目录失败:', error)
message.error(`打开目录失败:${error.message}`)
}
}
//
const handleSelectStoragePath = async () => {
try {
// 使 IPC
const result = await window.electron.ipcRenderer.invoke('select-directory', {
title: '选择存储目录',
defaultPath: storagePath
})
if (result.success && result.path) {
setStoragePath(result.path)
localStorage.setItem('storagePath', result.path)
message.success('存储目录设置成功!')
} else if (!result.canceled) {
message.error(`选择目录失败:${result.error}`)
}
} catch (error) {
console.error('选择存储目录失败:', error)
message.error(`选择目录失败:${error.message}`)
}
}
//
const handleReadParam = async () => {
if (!selectedParam) {
@ -444,13 +499,28 @@ function SystemSettings() {
存储目录
</div>
<div>
<Button icon={<EyeOutlined />} type="text" disabled={!connectedDevice}></Button>
<Button icon={<EditOutlined />} type="text" disabled={!connectedDevice}></Button>
<Button
icon={<EyeOutlined />}
type="text"
onClick={handleOpenStoragePath}
title="打开存储目录"
/>
<Button
icon={<EditOutlined />}
type="text"
onClick={handleSelectStoragePath}
title="选择存储目录"
/>
</div>
</Flex>
<Flex align="center" gap={8} className={styles.storageInputRow}>
<Input className={styles.storageInput} disabled={!connectedDevice} />
<Input
className={styles.storageInput}
value={storagePath}
readOnly
placeholder="存储目录路径"
/>
</Flex>
<Checkbox className={styles.checkboxRight} disabled={!connectedDevice}>
实时数据

Loading…
Cancel
Save