为豆子域名管家实现版本检测功能的技术实践

豆子域名管家是一款基于 Wails 3 开发的超轻量级单文件客户端。它不仅拥有 Naive UI 打造的精致界面,更集成了强大的域名监控能力: 全方位监测:主面板表格直观展示域名列表、SSL 证书剩余天数、Whois 到期时间。 智能告警:支持自定义告警阈值,状态(正常/警告/错误)一目了然。 多渠道通知:深度集成钉钉与企业微信,支持配置调度时间与通知频次,确保告警不漏报、不打扰。 静默守护:支持随系统自动启动,后台默默守护您的域名安全。 为什么需要版本提醒,为什么不是自动更新? 在开发 豆子域名管家 时,Wails 3 就提供了自动集成的更新方案,但经过深思熟虑,我选择了“版本提醒 + 手动覆盖”的策略:主要考虑到个人服务器的带宽限制,避免高并发下载造成服务器宕机。单文件二进制直接覆盖即可完成升级,无需复杂的安装程序。 在之前的版本中,我主要通过公众号发布新版本并提供下载链接进行手动升级。它的问题是用户需要关注公众号并手动前往蓝奏云下载。为了进一步优化体验,我决定在新版本中引入版本对比提醒: 红点微标提醒:客户端启动后会自动对比本地与云端版本号。若有新版,左下角版本号将出现灵动的红点徽标,提醒而不打扰。 交互式遮罩弹窗:点击徽标即可弹出基于 Naive UI 开发的漂亮窗口,清晰展示: 当前版本 vs 最新版本 详细的更新日志 保姆级使用方法说明 极简升级路径:点击“复制下载链接”,直接在浏览器中下载最新的二进制文件,覆盖旧文件即可完成升级。 版本检测核心实现思路 这不仅仅是一个简单的弹窗,背后凝聚了对安全和灵活性的思考。为了确保版本检测既高效又安全,我们采用了以下技术路径: 1,我没有在前端 JS 中硬编码版本号。使用了Go 后端驱动,客户端通过 Wails 3 的原生桥接功能,调用后端 Go 方法获取本地编译时的版本标识。 2,防爬虫机制:在向云端请求最新版本信息时,配置了特定的 Custom Header 校验,有效拦截恶意脚本和不必要的扫描,保护服务器资源。 3,设计了灵活的云端数据结构。我们的版本接口不只是返回一个数字,而是返回一个包含三个核心维度的 JSON 对象: 最新版本号:用于精准比对。 下载地址:支持动态变更下载镜像,防止因链接失效导致的无法更新。 更新日志:让用户第一时间了解修复了哪些 Bug 或新增了哪些功能。 4,极致的 UI 交互(基于 Naive UI) 当本地版本低于云端时,左下角会亮起精美的红点徽标。点击后的交互逻辑非常人性化: 信息全透明:对比当前版本与新版本,展示完整的更新列表和使用指南。 尊重用户选择:弹窗配备了清晰的“取消/稍后再说”按钮,绝不强制升级。 快捷操作:提供“复制下载链接”按钮,点击后自动写入剪切板。用户只需打开浏览器粘贴,即可从蓝奏云等高速渠道下载,覆盖即升级。免去了前期的复杂步骤。 界面功能效果预览 徽标提示 弹窗说明 工具如何开始使用? 无论您是拥有几十个域名的运维大拿,还是只有几个小站的个人玩家,豆子域名管家都是您的不二之选。 ...

2026-03-17 · 1 min · Eagle

为豆子域名管家实现Windows开机自启动功能的技术实践

在PC客户端开发中,开机自启动是提升用户体验的重要功能之一。豆子域名管家作为一款Windows平台下的域名管理工具,近期添加了随系统启动功能。本文将详细介绍从技术选型到最终实现的全过程,重点阐述在跨平台库适配失败后,如何针对Windows系统特性实现简洁可靠的自启动方案。 一、技术选型与挑战 1.1 初始方案:跨平台库的尝试 项目初期采用了go-autostart这一流行的Go语言跨平台自启动库。该库设计优雅,理论上支持Windows、macOS、Linux三大主流操作系统。然而在实际集成到wails3项目中时,遇到了编译问题: sslchecker .\domainservice.go:1453:11: app.Enable undefined (type *autostart.App has no field or method Enable) .\domainservice.go:1455:11: app.Disable undefined (type *autostart.App has no field or method Disable) 经过排查,发现虽然能定位到源码,但由于系统配置或依赖管理问题,无法正确调用库方法。这种问题在Go模块化开发中并不少见,特别是涉及CGO或系统特定依赖时。 1.2 平台限制的现实考量 进一步分析发现,即使解决编译问题,跨平台方案仍面临以下限制: macOS的签名要求:自macOS Catalina以来,苹果加强了应用安全策略。无签名的应用在开机自启动时会被Gatekeeper拦截,除非用户手动进入系统设置>安全性与隐私>通用中点击"仍要打开"。 Linux的碎片化:不同桌面环境(GNOME、KDE、XFCE等)的自启动机制存在差异,需要适配多种配置方式。 维护成本:跨平台库在提供便利的同时,也引入了额外的依赖和潜在的兼容性问题。 考虑到豆子域名管家主要用户群体为Windows用户,且无macOS开发者证书,决定采用专注Windows的轻量化方案。 二、Windows自启动实现方案 2.1 技术原理 Windows开机自启动主要通过注册表实现。当前用户的自启动项位于: HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run 系统级的自启动项(需要管理员权限)位于: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run 对于大多数桌面应用,使用用户级注册表即可满足需求,且无需提权操作。 2.2 核心实现代码 // auto_start_windows.go // +build windows package main import ( "errors" "os" "path/filepath" "strings" "golang.org/x/sys/windows/registry" ) // AutoStartManager Windows自启动管理器 type AutoStartManager struct { appName string exePath string regPath string } // NewAutoStartManager 创建自启动管理器实例 func NewAutoStartManager(appName string) (*AutoStartManager, error) { exePath, err := os.Executable() if err != nil { return nil, errors.New("获取可执行文件路径失败") } // 转换为绝对路径并处理空格 absPath, _ := filepath.Abs(exePath) if strings.Contains(absPath, " ") { absPath = `"` + absPath + `"` } return &AutoStartManager{ appName: appName, exePath: absPath, regPath: `Software\Microsoft\Windows\CurrentVersion\Run`, }, nil } // IsAutoStartEnabled 检查是否已启用开机自启动 func (m *AutoStartManager) IsAutoStartEnabled() (bool, error) { key, err := registry.OpenKey(registry.CURRENT_USER, m.regPath, registry.QUERY_VALUE) if err != nil { return false, err } defer key.Close() value, _, err := key.GetStringValue(m.appName) if err != nil { if err == registry.ErrNotExist { return false, nil } return false, err } // 对比路径,处理可能的引号差异 current := strings.Trim(m.exePath, `"`) stored := strings.Trim(value, `"`) return strings.EqualFold(filepath.Clean(current), filepath.Clean(stored)), nil } // SetAutoStart 设置或取消开机自启动 func (m *AutoStartManager) SetAutoStart(enable bool) error { key, err := registry.OpenKey(registry.CURRENT_USER, m.regPath, registry.QUERY_VALUE|registry.SET_VALUE) if err != nil { return err } defer key.Close() if enable { return key.SetStringValue(m.appName, m.exePath) } else { err = key.DeleteValue(m.appName) if err == registry.ErrNotExist { return nil // 键不存在不算错误 } return err } } 2.3 关键实现细节 路径处理:使用os.Executable()获取可执行文件绝对路径,确保在不同工作目录下都能正确运行。 ...

2026-03-01 · 3 min · Eagle

基于 Wails 3 和微信小程序的一次frp 智能管理实战

FRP Manager 是一款基于 Wails 3 开发的跨平台 frp 管理客户端。它不仅解决了 frp 配置繁琐的痛点,更探索出了一种“桌面工具 + 小程序生态”的全新闭环模式。 🌟 核心业务流程 Mole 的核心逻辑在于其自动化配置流与激励机制的融合: 1. 智能激励连接 (One-Click Connect) 当用户点击“一键连接”时,客户端会启动一套自动验证逻辑: 广告触发:系统检查用户当前状态。若未满足条件,则弹出动态窗口显示专属小程序码。 多端协同:用户扫码后进入微信小程序观看激励视频。 自动握手:用户观看完毕后,小程序通过后端指令反馈给 Mole 客户端。 静默取消:客户端接收指令后自动关闭弹窗,进入连接阶段。 2. 云端配置自动下发 Mole 不再需要用户手动编辑复杂的 TOML 文件: 动态获取:从服务器端安全获取分配的随机子域名和 frp 配置 Token。 本地注入:Go 后端自动将配置写入内置的 frpc.toml。 二进制调用:自动调用内嵌的 frpc 核心组件启动服务。 3. 全链路事件反馈 利用 Wails 3 的高效事件机制,实现深度的 UI 反馈: 实时日志:Go 后端捕获 frpc 的标准输出,通过事件流(Events)实时推送到前端页面,用户可以清晰看到连接建立过程。 状态监控:实时反馈隧道运行状态,确保连接稳定性。 🛠️ 板块功能详情 连接控制台:一键启停,集成小程序激励流程。 端口配置页:灵活配置本地服务端口(如 8080, 3000 等),满足开发者调试需求。 实时日志页:直观展示 frp 运行日志,方便故障排查。 帮助中心:详尽的操作指南,降低内网穿透的使用门槛。 技术结缘 (About & Support): 集成优质云服务器推广(为用户提供可靠的 frp 服务端选择)。 扫码直达开发笔记,分享 Wails 3 与 Go 的底层实战。 👀 软件界面概览 1. 软件主界面 ...

2025-12-02 · 4 min · Eagle