diff --git a/frontend/electron/main.ts b/frontend/electron/main.ts
index 68e5557..c40ad65 100644
--- a/frontend/electron/main.ts
+++ b/frontend/electron/main.ts
@@ -69,6 +69,8 @@ function createWindow() {
minWidth: 800,
minHeight: 600,
icon: path.join(__dirname, '../src/assets/AUTO_MAA.ico'),
+ frame: false, // 去掉系统标题栏
+ titleBarStyle: 'hidden', // 隐藏标题栏
webPreferences: {
preload: path.join(__dirname, 'preload.js'),
nodeIntegration: false,
@@ -109,6 +111,33 @@ ipcMain.handle('open-dev-tools', () => {
}
})
+// 窗口控制
+ipcMain.handle('window-minimize', () => {
+ if (mainWindow) {
+ mainWindow.minimize()
+ }
+})
+
+ipcMain.handle('window-maximize', () => {
+ if (mainWindow) {
+ if (mainWindow.isMaximized()) {
+ mainWindow.unmaximize()
+ } else {
+ mainWindow.maximize()
+ }
+ }
+})
+
+ipcMain.handle('window-close', () => {
+ if (mainWindow) {
+ mainWindow.close()
+ }
+})
+
+ipcMain.handle('window-is-maximized', () => {
+ return mainWindow ? mainWindow.isMaximized() : false
+})
+
ipcMain.handle('select-folder', async () => {
if (!mainWindow) return null
const result = await dialog.showOpenDialog(mainWindow, {
diff --git a/frontend/electron/preload.ts b/frontend/electron/preload.ts
index 7e136fd..6aae513 100644
--- a/frontend/electron/preload.ts
+++ b/frontend/electron/preload.ts
@@ -11,6 +11,12 @@ contextBridge.exposeInMainWorld('electronAPI', {
selectFile: (filters?: any[]) => ipcRenderer.invoke('select-file', filters),
openUrl: (url: string) => ipcRenderer.invoke('open-url', url),
+ // 窗口控制
+ windowMinimize: () => ipcRenderer.invoke('window-minimize'),
+ windowMaximize: () => ipcRenderer.invoke('window-maximize'),
+ windowClose: () => ipcRenderer.invoke('window-close'),
+ windowIsMaximized: () => ipcRenderer.invoke('window-is-maximized'),
+
// 初始化相关API
checkEnvironment: () => ipcRenderer.invoke('check-environment'),
downloadPython: (mirror?: string) => ipcRenderer.invoke('download-python', mirror),
diff --git a/frontend/src/App.vue b/frontend/src/App.vue
index 36e57aa..4b0bcc2 100644
--- a/frontend/src/App.vue
+++ b/frontend/src/App.vue
@@ -4,6 +4,7 @@ import { useRoute } from 'vue-router'
import { ConfigProvider } from 'ant-design-vue'
import { useTheme } from './composables/useTheme.ts'
import AppLayout from './components/AppLayout.vue'
+import TitleBar from './components/TitleBar.vue'
import zhCN from 'ant-design-vue/es/locale/zh_CN'
import { logger } from '@/utils/logger'
@@ -24,8 +25,11 @@ onMounted(() => {
-
-
+
+
@@ -33,4 +37,9 @@ onMounted(() => {
* {
box-sizing: border-box;
}
+
+.app-container {
+ height: 100vh;
+ overflow: hidden;
+}
diff --git a/frontend/src/components/AppLayout.vue b/frontend/src/components/AppLayout.vue
index 76b28c0..f605f22 100644
--- a/frontend/src/components/AppLayout.vue
+++ b/frontend/src/components/AppLayout.vue
@@ -7,14 +7,14 @@
:width="180"
:collapsed-width="60"
:theme="isDark ? 'dark' : 'light'"
- style="height: 100vh; position: fixed; left: 0; top: 0; z-index: 100"
+ style="height: calc(100vh - 32px); position: fixed; left: 0; top: 32px; z-index: 100"
>
-
-
-

-
AUTO_MAA
-
+
+
+
+
+
@@ -61,7 +61,7 @@
:style="{
marginLeft: collapsed ? '60px' : '180px',
transition: 'margin-left 0.2s',
- height: '100vh',
+ height: 'calc(100vh - 32px)',
}"
>
@@ -88,6 +88,8 @@ import {
ControlOutlined,
HistoryOutlined,
SettingOutlined,
+ MenuFoldOutlined,
+ MenuUnfoldOutlined,
} from '@ant-design/icons-vue'
import { ref, computed } from 'vue'
import { useRouter, useRoute } from 'vue-router'
@@ -136,41 +138,33 @@ const toggleCollapse = () => {
padding-bottom: 4px; /* 关键:添加3px底部内边距 */
}
-/* Logo */
-.logo {
+/* 折叠按钮 */
+.collapse-trigger {
height: 42px;
display: flex;
align-items: center;
- padding: 0 12px;
+ justify-content: center;
margin: 4px;
border-radius: 6px;
cursor: pointer;
+ font-size: 16px;
+ transition: background-color 0.2s;
}
-.logo:hover {
- background-color: rgba(255, 255, 255, 0.5);
+.collapse-trigger:hover {
+ background-color: rgba(255, 255, 255, 0.1);
}
-:deep(.ant-layout-sider-light) .logo:hover {
+:deep(.ant-layout-sider-light) .collapse-trigger:hover {
background-color: rgba(0, 0, 0, 0.04);
}
-.logo-image {
- width: 32px;
- height: 32px;
+:deep(.ant-layout-sider-dark) .collapse-trigger {
+ color: #fff;
}
-.logo-text {
- margin-left: 12px;
- font-size: 16px;
- font-weight: bold;
- white-space: nowrap;
- opacity: 1;
- transition: opacity 0.2s ease;
-}
-
-.logo-text.text-hidden {
- opacity: 0;
+:deep(.ant-layout-sider-light) .collapse-trigger {
+ color: rgba(0, 0, 0, 0.88);
}
/* 主菜单容器 */
diff --git a/frontend/src/components/TitleBar.vue b/frontend/src/components/TitleBar.vue
new file mode 100644
index 0000000..6902ee4
--- /dev/null
+++ b/frontend/src/components/TitleBar.vue
@@ -0,0 +1,193 @@
+
+
+
+
+
+

+
AUTO_MAA
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/frontend/src/types/electron.d.ts b/frontend/src/types/electron.d.ts
index 7f2d1b3..33b22c3 100644
--- a/frontend/src/types/electron.d.ts
+++ b/frontend/src/types/electron.d.ts
@@ -4,6 +4,12 @@ export interface ElectronAPI {
selectFile: (filters?: any[]) => Promise
openUrl: (url: string) => Promise<{ success: boolean; error?: string }>
+ // 窗口控制
+ windowMinimize: () => Promise
+ windowMaximize: () => Promise
+ windowClose: () => Promise
+ windowIsMaximized: () => Promise
+
// 初始化相关API
checkEnvironment: () => Promise
downloadPython: (mirror?: string) => Promise
diff --git a/frontend/src/views/History.vue b/frontend/src/views/History.vue
index 576146c..17a266c 100644
--- a/frontend/src/views/History.vue
+++ b/frontend/src/views/History.vue
@@ -98,31 +98,31 @@