diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md
index 7864017..94f5569 100644
--- a/docs/CHANGELOG.md
+++ b/docs/CHANGELOG.md
@@ -4,6 +4,32 @@
---
+## v1.1.0(2026-10-14)
+
+### ✨ 新增功能
+
+- **系统托盘**:新增常驻系统托盘图标与菜单(**显示窗口 / 启动穿透 / 停止穿透 / 退出**)。
+ - 左键单击托盘图标直接显示并聚焦主窗口,右键单击弹出菜单;
+ - 「启动穿透」「停止穿透」与仪表盘的一键启动 / 停止共用同一套逻辑,并随运行状态联动:未运行时禁用「停止穿透」;启动成功后自动禁用「启动穿透」、启用「停止穿透」,停止后恢复;
+ - 「退出」会在停止正在运行的穿透后再退出整个软件;
+ - 托盘菜单文案随语言切换同步更新。
+- **关闭确认对话框**:点击标题栏关闭按钮(Windows 关闭按钮 / macOS 红绿灯)不再直接退出,改为先弹出对话框,提供两个选项:
+ - **最小化到系统托盘**:隐藏窗口、保持程序后台运行,可从托盘随时恢复;
+ - **直接退出**:停止穿透并完全退出软件;
+ - Windows 与 macOS 行为一致,同时拦截 `Alt+F4` 等系统原生关闭,一并走确认流程。
+
+### 🎨 优化
+
+- **更新提示**:顶部栏「检查更新」按钮新增「有新版本」圆点徽标;关闭更新弹窗后保留已检测到的版本,再次点击即可重新打开,避免重复联网检查。
+- **标题栏**:以应用图标替换原先的文字 / 渐变方块 Logo。
+- **macOS 窗口**:适配无边框窗口的圆角与透明背景,消除首帧方角闪烁;窗口失焦时红绿灯自动置灰。
+
+### 🧱 工程
+
+- 应用版本升级至 **v1.1.0**;`tauri` 启用 `tray-icon` 特性,capabilities 新增 `core:app:allow-default-window-icon` 权限。
+- 更新端点增加 GitHub 直连作为镜像备用;修正应用名称与标识符大小写(统一为 `Frpilot`)。
+- 重写 README,并补充仪表盘 / 服务器 / 隧道 / 下载 / 设置等页面的界面截图。
+
## v1.0.0(2026-10-14)
### 🎉 首个正式版本发布!
diff --git a/docs/Frpilot开发提示词.md b/docs/Frpilot开发提示词.md
index 8bd8660..c001f20 100644
--- a/docs/Frpilot开发提示词.md
+++ b/docs/Frpilot开发提示词.md
@@ -127,3 +127,15 @@ Layout布局content区域的磨砂玻璃卡片圆角样式我要改动一下:
开发过程中使用到的组件尽可能全部使用Antdv库里面的,另外我引入的有tailwindcss原子化组件、auto-import和components依赖可以简化引入,开发之前尽可能先阅读一下package.json,看一下有哪些依赖可以简化代码开发
+#### 3.7 系统托盘功能开发
+
+- 这是Tauri2文档里面关于系统托盘的指示:https://tauri.app/zh-cn/learn/system-tray/
+- 使用文档中前端的方式开发系统托盘+托盘图标
+- 托盘菜单内容暂定四项,显示窗口、启动穿透、停止穿透、退出。
+- 点击显示窗口,窗口显示
+- 穿透未启动时,停止穿透禁止操作,点击启动穿透,同步仪表盘页面的一键启动操作,启动成功后,启动穿透禁止操作,停止穿透允许操作
+- 穿透启动时,启动穿透禁止操作,停止穿透允许操作,点击停止穿透,同步仪表盘页面的停止操作,停止后,启动穿透允许操作,暂停穿透禁止操作
+- 点击退出,整个程序退出,如果穿透正在启动运行,一并停止并退出软件
+- 点击Header栏里面的关闭按钮,目前是直接退出整个程序,现在改成先出现一个对话框,对话框内有两个单选项分别是最小化到系统托盘、直接退出,如果选择最小化到系统托盘,则保持程序运行状态,隐藏到系统托盘,如果是直接退出,则停止穿透并退出软件(Mac和Windows同步)
+
+开发过程中使用到的组件尽可能全部使用Antdv库里面的,另外我引入的有tailwindcss原子化组件、auto-import和components依赖可以简化引入,开发之前尽可能先阅读一下package.json,看一下有哪些依赖可以简化代码开发
\ No newline at end of file
diff --git a/package.json b/package.json
index 54dce3e..beb5c14 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
{
"name": "frpilot",
"private": true,
- "version": "0.9.0",
+ "version": "1.1.0",
"type": "module",
"scripts": {
"dev": "vite",
diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml
index a91a4a6..a91c0dd 100644
--- a/src-tauri/Cargo.toml
+++ b/src-tauri/Cargo.toml
@@ -22,7 +22,7 @@ tauri-build = { version = "2", features = [] }
tauri-helper = "0.2.1"
[dependencies]
-tauri = { version = "2", features = [] }
+tauri = { version = "2", features = ["tray-icon"] }
tauri-plugin-opener = "2"
serde = { version = "1", features = ["derive"] }
serde_json = "1"
diff --git a/src-tauri/capabilities/default.json b/src-tauri/capabilities/default.json
index 8a40cb6..ed0013a 100644
--- a/src-tauri/capabilities/default.json
+++ b/src-tauri/capabilities/default.json
@@ -18,6 +18,7 @@
"core:window:allow-close",
"core:window:allow-hide",
"core:window:allow-show",
- "core:window:allow-set-focus"
+ "core:window:allow-set-focus",
+ "core:app:allow-default-window-icon"
]
}
diff --git a/src/App.vue b/src/App.vue
index 135f8cf..4ef9a93 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -8,9 +8,12 @@
import { theme as antdTheme } from "ant-design-vue"
import { useAppStore } from "@/stores/app"
import { useFrpcStore } from "@/stores/frpc"
+import { useWindowStore } from "@/stores/window"
+import { initTray } from "@/composables/useTray"
const appStore = useAppStore()
const frpcStore = useFrpcStore()
+const windowStore = useWindowStore()
/** 跟随明暗主题切换 Ant Design Vue 的算法 */
const themeConfig = computed(() => ({
@@ -24,6 +27,9 @@ const themeConfig = computed(() => ({
// 应用根组件初始化一次:订阅 frpc 日志/退出事件,离开仪表盘后仍持续收集
onMounted(() => {
frpcStore.init()
+ // 系统托盘(前端 API 方式)与窗口关闭拦截
+ initTray()
+ windowStore.init()
})
diff --git a/src/components/CloseConfirmModal.vue b/src/components/CloseConfirmModal.vue
new file mode 100644
index 0000000..800d517
--- /dev/null
+++ b/src/components/CloseConfirmModal.vue
@@ -0,0 +1,100 @@
+
+
+
+
+ {{ t("closeDialog.tray") }}
+ {{ t("closeDialog.trayDesc") }}
+
+
+ {{ t("closeDialog.exit") }}
+ {{ t("closeDialog.exitDesc") }}
+
+
+
+
+
+ {{ t("common.cancel") }}
+
+
+ {{ t("common.confirm") }}
+
+
+
+
+
+
+
+
diff --git a/src/components/MacTitleBar.vue b/src/components/MacTitleBar.vue
index 18a603e..c14129c 100644
--- a/src/components/MacTitleBar.vue
+++ b/src/components/MacTitleBar.vue
@@ -10,7 +10,7 @@
class="traffic-light bg-[#ff5f57]"
:class="{ 'traffic-light--idle': !focused }"
:title="t('titlebar.close')"
- @click="closeWindow()"
+ @click="windowStore.requestClose()"
>