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

豆子域名管家是一款基于 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 进阶实战:基于 Go 语言实现 frp 自动化管理客户端的代码深度解析

一、 项目设计核心思想 本项目的核心定位是内网穿透的一键化管理。参考 ngrok 的服务模式,通过自建 frp 服务器 提供稳定中转,将复杂的配置封装在 Wails 客户端中。 商业闭环:通过微信小程序激励视频获取连接权限(2小时有效期)。 用户体验:一键连接、自动分配二级域名、配置持久化。 二、 前端架构:原生 JS 的三维交互 为了保持轻量,前端放弃了重量级框架,采用原生 JS 与 Wails 运行时通信。 控制面板 (Dashboard):状态驱动 UI。涉及扫码弹窗逻辑、广告验证状态机。 配置页面 (Settings):表单处理。重点在于 Local Port 的保存与通过 Wails Bind 将数据下发给 Go 后端。 运行日志 (Logs):虚拟黑屏终端。难点在于实时流式展示后端 frpc 吐出的日志。 三、 后端核心技术要点 将按照应用生命周期逻辑,对以下模块进行深度归纳: a. 应用原生窗口定义 结构化管理:AppManager 模式 // AppManager 统一管理应用和窗口 type AppManager struct { App *application.App MainWindow application.Window } var manager = &AppManager{} 采用了 AppManager 结构体来统一持有 App 实例和 MainWindow 实例。 知识点:在 Wails 3 中,不再像 v2 那样通过上下文(ctx)传递,而是鼓励通过对象持有的方式管理窗口引用。这方便了后续在任何 Service 中通过 manager.MainWindow 直接操控窗口(如置顶、隐藏、发送事件)。 ...

2026-02-11 · 6 min · Eagle

网络协议新纪元:基于 Go 语言实现支持 Ed25519 加密的 QUIC 高性能通信实战

1. 为什么是 QUIC?从 TCP 的瓶颈说起 手机在 Wi-Fi 和 4G/5G 之间切换(即“切网”)导致 TCP 连接断开,是移动互联网开发中的经典痛点。 TCP 连接是基于源 IP、源端口、目的 IP、目的端口这“四元组”来标识的。当你从 Wi-Fi 切换到 5G 时,手机的 IP 地址发生了变化,旧的四元组立即失效,TCP 必须重新进行三次握手建立新连接,正在传输的数据(如视频缓冲、下载)就会中断。 QUIC 引入了 Connection ID 的概念。它不依赖于底层 IP 地址。只要 CID 不变,即便你的 IP 从 A 变成了 B,服务端依然能通过 CID 认出:“噢,你还是刚才那个客户端!”。这样对于业务层完全无感知,数据传输无缝继续。这就是所谓的 “连接迁移 (Connection Migration)”。 除了切网,QUIC 在弱网(丢包率高、延迟高)下更强的原因在于: 改进的拥塞控制: QUIC 在应用层实现,可以更激进地进行丢包恢复。 无队头阻塞: 在 TCP 中,丢一个包全家等死;在 QUIC 中,你刷朋友圈的图丢了一个包,不会影响你接收聊天消息的流。 2. go 库quic-go 简介 这是Go的库,在 Go 语言世界里,quic-go 是事实上的标准实现。它不仅完整实现了 IETF QUIC 协议,还提供了类标准库 net 的简洁接口。 Connection (连接): 代表两个端点之间的 UDP 隧道。 Stream (流): 连接内部的逻辑通道,双向且独立。 3. 证书准备:使用 OpenSSL 生成 Ed25519 证书 为了极致的性能与安全,弃用了传统的 RSA,选择 Ed25519 算法。它的签名速度更快,密钥更短。 ...

2026-02-10 · 2 min · Eagle

全栈实战:基于 Go + 小程序构建“口袋指令中心”,实现远程发布控制

我日常涉及 Hugo 博客发布、客户端打包、Nginx 运维等多种重复性脚本。每次都要 SSH 连服务器并执行命令,操作链过长,也不方便,特别是在身边没有电脑的情况。所以我就想构建一个通用的执行引擎,通过小程序远程触发,且具备零前端修改的扩展能力。 系统架构设计 为了实现“明天增加脚本,小程序不发版”的目标,采用了“配置驱动” 模式。即“配置在云端,指令在指尖”。通过将业务逻辑(脚本路径与名称)完全从前端小程序中解耦,实现一套代码支持无限扩展的运维能力。 核心流程 后端 (Go):维护一个脚本配置列表(数据库或配置文件)。 前端 (小程序):启动时请求后端接口,拉取可用脚本列表。 触发:使用时选择脚本名称,点击执行。 鉴权:后端校验小程序 OpenID,仅允许本人指令生效。 技术实现 系统分为三层,确保安全性与扩展性的统一: 配置层 (Go Config):在服务器端定义脚本的 ID、名称和实际路径。 鉴权层 (WeChat Auth):利用微信小程序 OpenID 建立强一致性的身份白名单。 展示层 (Mini Program UI):动态拉取后端配置,仅负责“展示列表”与“触发指令”。 技术实现方案 A. 后端:动态脚本引擎 (Go) 后端不再硬编码脚本路径,而是定义一个结构体: // 脚本任务定义 type ScriptTask struct { ID string `json:"id"` // 前端传递的任务标识 Name string `json:"name"` // 小程序界面显示的文字 Command string `json:"-"` // 实际执行的脚本路径 (对前端保密) } // 示例配置(可存放在 JSON 文件或数据库中) var tasks = []ScriptTask{ {ID: "hugo-post", Name: "发布 Hugo 文章", Command: "/scripts/deploy_hugo.sh"}, {ID: "build-client", Name: "构建客户端", Command: "/scripts/build_mole_go.sh"}, {ID: "nginx-restart", Name: "重启 Nginx 服务", Command: "systemctl restart nginx"}, } 对外接口定义: ...

2026-02-04 · 3 min · Eagle

Go 语言进阶实战:编写高性能 Windows DLL 动态链接库并供第三方多语言调用

我使用go写了一个http转WebSocket服务,这是一个命令行程序,双击可以直接运行,今天,有个新的需求,需要将这个命令行程序转为dll,然后供第三方使用。 1,改造程序 这个命令行程序很小,核心逻辑就是启动了一个HTTP服务,然后接收连接,然后通过WebSocket将内容转发出去。所以,在调整为dll时,仅仅需要导出两个函数即可。 1,StartServer,启动http服务,监听端口地址。因为不能阻塞,所以需要在监听服务时使用go方法启动一个携程。 2,StopServer,关闭http服务,需要提供给第三方,当它关闭时,需要调用它,释放监听地址等资源。 下面开始改造代码: package main import "C" // 必须导入 C 包 import ( // ... 原有导入 ... ) // 保持原有的全局变量和函数逻辑 (例如transDataGet, connWs 等) // 需要注意下面的//export这中间不能有空格,否则无法导出头文件 //export StartServer func StartServer() { // 将原本 main 函数里的逻辑放在这里 gin.SetMode(gin.ReleaseMode) r := gin.New() // ... 注册路由 ... r.Run("127.0.0.1:9988") } // 必须保留一个空的 main 函数 func main() {} // 其它参考StartServer,如果需要导出,一定要添加//export 2,编译命令 我是在windows环境,需要安装cgo环境,我安装了Mingw-w64支持C编译环境,执行以下命令: go build -buildmode=c-shared -o trans.dll main.go 执行后会生成trans.h和trans.dll两个文件。 3,验证dll 除了一些可以查看dll的工具外,还可以使用第三方语言进行测试。例如我这里使用Python。 import ctypes import time lib = ctypes.CDLL("./trans.dll") lib.StartServer() print("服务已在后台启动...") time.sleep(10) # 模拟第三方程序运行 lib.StopServer() print("服务已关闭") 4,再次优化代码 当实际测试的时候,我发现它会阻塞调用者,为了解决这个问题,我们需要再次改造程序。将启动服务改为非阻塞模式。将Gin的启动逻辑放入协程,并利用http.Server提供的Shutdown方法来实现优雅退出。 ...

2026-01-29 · 5 min · Eagle

告别域名过期焦虑:基于 Go + Wails 3 开发“豆子域名管家”,实现批量监测与企微钉钉预警

域名过期导致业务中断、流量缺失、品牌受损的案例比比皆是。手动记录域名的到期时间?是否会忘记,漏看? 我以前曾介绍过,我在微信小程序实现了域名证书监控功能。但是担心隐私,功能限制。这次我带来了豆子域名管家,本地化运行。 经过数月的规划和开发测试,豆子域名管家终于可以使用了。这是一款完全本地运行、支持批量导入管理以及可以企微和钉钉通知的域名证书检测工具。旨在解决域名过期监控难题。 特性 传统方式 豆子域名管家 运行方式 依赖云端服务 纯本地运行,数据不出本地 批量处理 手动逐个查询 一键导入,批量删除 通知渠道 单一(邮件/短信) 钉钉+企微双通道,支持Markdown格式 自定义提醒 固定时间提醒 可配置通知时间,提前预警天数 系统集成 无 系统托盘常驻,后台静默运行 隐私安全 数据上传第三方 域名数据和配置数据存本地 技术架构亮点: 工具基于Wails3框架构建,采用Vue3+NaiveUI前端技术栈,确保界面简洁美观,交互流畅,支持暗黑/浅色两种主题。 本地证书检测引擎,直接调用系统网络库进行TLS检测,无需依赖外部API。 多线程并发处理,使用go的特性批量进行域名检测。 跨平台兼容:支持Windows、macOS、Linux系统。 配置持久化,所有配置本地存储,重启后自动恢复。 支持域名证书检测,域名到期时间检测。 软件运行界面预览: 控制面板 配置页面 基本操作指南: 1,导入域名我们需要把要监控的域名按行录入到txt文档中,可以在软件配置界面下载示例模板,当准备完成后,选择刚才的文件,然后验证。没有问题后,点击确认导入即可。 2,配置机器人目前工具支持钉钉机器人和企业微信机器人,支持Markdown格式消息,可以查点击推送预览效果按钮查看推送效果。当输入机器人配置后,可以验证测试,当收到消息后说明配置成功,点击保存即可。可以同时配置企微和钉钉。这样会同时推送两份通知。 3,配置推送通知策略目前工具扫描调度间隔固定24小时,可以配置通知时间,和告警天数间隔。在通知时间,系统会将当天扫描的结果报表推送到机器人。如果用户更新某些域名证书后,可以在监控面板进行手动刷新。想查看效果,可以把通知时间设置为当前时间加几分钟,当到达时间后,将推送报表。确认无误后,可以调整为真正的推送时间。 4,系统托盘运行当完成域名导入和机器人以及通知策略配置后,可以关闭窗口,工具将自动缩放到系统托盘。如果需要退出,需要右键系统托盘退出。注意,如果退出工具,将不能监控域名,因为这是一个本地工具。所以需要工具长期运行。 5,监控面板监控面板的仪表板显示你的域名配置项统计信息,表格显示监视的域名列表。域名可以搜索,刷新以及删除。域名按照过期、告警、正常顺序排序。请查看最前面域名并及时处理。 工具按照自己的真实需求开发,如果你需要尝试,可以通过下方下载链接。目前仅提供了Windows版本。 https://91demo.top/b011 如果您有任何问题和建议,欢迎反馈和交流。

2026-01-28 · 1 min · Eagle

深度解析:基于 Asterisk 与 SIP 协议的私有化语音验证码呼叫原理

在实现了使用VOIP客户端拨打8000号码后,播报语音验证码的功能后,我发现了一个最大的缺点,就是这需要用户主动去操作。这对于想使用API集成无法实现。 在思考之后,我决定使用一个可以调用API就呼叫VOIP客户端,当用户接通后,播报语音验证码的功能。当实现这个功能后,它的好处是显而易见的。比如,可以集成到嵌入式,集成到第三方网站。 那么该如何实现它呢? 一、 系统原理 传统的拨号方案(Dialplan)是静态的,而 ARI 允许我们动态控制。整个“API 触发呼叫并播报”的流程如下: 触发阶段:第三方系统通过 API 向 Go 服务发送呼叫请求(包含目标 ID 和验证码)。 呼叫发起(Originate):Go 服务调用 Asterisk ARI 的 /channels 接口。此时 Asterisk 会尝试向 PJSIP 终端(或通过中继向手机)发起呼叫。 接通监听(Stasis Start):一旦用户接起电话,该通道会被移交给一个名为 Stasis 的应用。此时 Go 服务会收到一个“通道已接通”的 WebSocket 事件。 语音合成与播放:Go 服务识别到接通后,调用播报指令(可以播放预录音文件,或对接 TTS 引擎生成的语音流)。 挂断处理:播报完毕后,服务发送挂断指令,释放资源。 二、系统架构 [第三方API] --> [Go 后端服务] --(REST API)--> [Asterisk ARI] | | (WebSocket) (PJSIP/IMS) | | [接通状态回调] <--- [用户终端接听] 三、 核心代码实现 (Golang) 假设你使用了 GitHub 上的 go-ari 库。 1. 初始化 ARI 客户端 import ( "github.com/v5" "github.com/v5/client/native" ) // 连接到 Asterisk ARI cl, err := native.Connect(&native.Options{ Application: "voice-verify", // 必须与 asterisk.conf 配置一致 Username: "admin", Password: "password", URL: "http://localhost:8088/ari", }) 2. 实现呼叫并播报逻辑 这是核心逻辑:接收参数 -> 发起呼叫 -> 监听接通 -> 播放语音。 ...

2026-01-13 · 3 min · Eagle

深度实战:基于 Wails v3 与 Go 打造跨平台 FRP 桌面客户端 Mole-go 的技术架构与原理

一、 缘起:为什么需要 mole-go? 在开发微信公众号、调试支付接口、以及演示本地开发网站时,或由于服务器资源限制需要在本地部署服务时,frp 是不可或缺的内网穿透神器。然而,原生的 frpc 存在几个显著的痛点: 运行隐形性差:必须开启命令行窗口,一旦误关服务即中断。 配置门槛高:新手难以记忆复杂的 .toml 参数。 为了解决这些问题,我开发了 mole-go。它是一个轻量级、跨平台的桌面客户端,旨在实现 frp 的配置、启动与监控一体化。我选择 Wails v3 则是看中了其原生渲染、系统托盘支持、Go 强力后端以及极小的打包体积。 二、 核心架构:Go + Wails v3 的化学反应 mole-go 采用了经典的“UI-Backend-Service”三层架构: Wails UI:负责前端展示,通过事件驱动(Event-Driven)与后端交互。 Go Backend:核心大脑,负责业务逻辑、进程管理与系统级 API 调用。 frpc 二进制:底层服务,通过 Go 的 embed 特性内嵌到二进制文件中。 三、 关键实现细节:从命令行到图形化的进化 前端:从“面条代码”到模块化数据驱动 早期版本中,我直接采用 window.startFrp,window.stopFrp这样的写法,导致代码碎片化严重,以及管理app运行状态不方便。在 mole-go 的正式版中,我将其重构为数据驱动模式,类似Vue,由数据驱动界面: 模块化封装:定义全局 window.App 对象,将数据状态与行为(Methods)统一封装,使代码结构清晰。 动态 UI 组件:针对 HTTP、TCP、UDP 等不同代理模型,不再机械地堆砌 HTML 片段,而是通过逻辑判断实现“按需渲染”,大大精简了 DOM 结构。 后端:全局实例与事件机制 为了保证服务层(Service)能随时与 UI 通信,我设计了一个全局 App 实例,这样可以方便得调用和管理。 状态约定:前后端约定一套状态码,通过 Wails v3 的 Events 机制,后端可以主动向前端推送 frpc 的运行状态、日志等信息。 独立服务层:将 frp 相关逻辑抽离到专门的文件中,通过 Wails 的 Binding 暴露给前端,保持代码的解耦。 系统深度集成 系统托盘(System Tray):利用 Wails v3 原生的托盘支持,实现了“关闭即隐藏”逻辑。 外部链接调用:使用 wails3自带的 Browser.OpenURL 方法,确保点击文档链接时能正确唤起系统浏览器。 可参考项目源码。 ...

2026-01-10 · 1 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