我 Vibe Coding 了一个校园网登录程序(工程版解析)
这几天在折腾校园网,A 下来费也不是很贵,就是总是会掉线,而且他这个认证后台网页是 http 的,偶尔弹偶尔不弹出认证页面。并且与网络代理起冲突,为了拒绝这个问题,用 Vibe Coding 的方式制作了这个软件,这期就会从我的第一视角解释 DGCU-Net-Portal 这个项目,当然后面我会出个面对学校用户的视频博客,敬请期待。
介绍一下:DGCU-Net-Portal https://github.com/miaoermua/DGCU-Net-Portal 是我做的一款东莞城市学院校园网的认证客户端,且完全免费开源使用 GPL-3.0-only 的自由软件。
首先要考虑跨平台,因为我是 Windows 和 Mac 双持,而且学校里面大部分人都应该是用的 Windows,并且我在上学之前使用的 Archlinux 所以考虑。
程序核心使用 Rust,考虑到用户和我个人我选择使用 Tauri 2 作为 GUI,Rust 下的原生界面也不太完善,而且我看上了一个叫 Miuix 的主题,恰好他有有前端 Miuix-vue https://yukonga.github.io/miuix-vue/ 。
最初和骨架
最初的想法我只想做一个很简单的界面,就像点一下就连接的软件一样(不可言传),然后配一个设置界面设置账号密码什么的,然后还要能满足我的需求,能够跳过我长期打开的 Proxy。
也好久没用中转站了,当时刚刚好发布了 GPT 6 Astra 这应该是目前最强的大模型,但可能不是 coding 最好,而是他越来越全能了,想着他应该能胜任这个任务,而我美美在后面玩手机偶尔提出几个需求让他帮忙实现。
还是骚扰了神秘 api 商人核桃,花了点时间搞上中转站,折腾客户端就搞了半天,最后发现是他每一次对话都锁定一个配置,而新建全新一个对话就没事了。
这里为了双开,另外下了个 codebuddy 他设置的则是 deepseek v4.1 flash 这个模型响应很快,基本上可以在 GPT 卡住的时候让他把其他功能做起来,并发处理。(有点烧心)
最开始的 portal 界面是完完全全符合刻板印象的 AI 味,一个菜单黑底再加上一个彩色渐变图标,我不喜欢这样的风格,太冲了,底线还是在的。
还是又花时间摸摸打磨了,当时最慢的就是 GPT 6 Astra,经常就是重试很多次,最多一个小时都在重试。
认证协议
这里处理 Portal 协议本来想着能让 Agent 开个浏览器自己摸索,但是这样的话会没有网络给他尝试,好在浏览器开发者里面可以导出 Har,里面包含完整的认证细节,当然也有敏感信息,密码后续可以改但是学号是真真实实报了上去了。
我手动按照原来的方式在后台登录完成了所有需要登录的流程,交给 AI 处理,发现好像和平时少了一步,就是代播。
开始找资料,在认证页面发现服务提供商的信息,发现服务商还挺用心专门有个文档介绍,我将文档内容让 AI 分析,AI 甚至以为我要把整个后端啃下来。
我认为如果他提供文档说不定可以让结构化更好,而不是四处碰壁,他甚至以为我要做服务端,确实是少了一步“代播”。
账号还没到期释放,时间紧任务重,这里经得允许借了个普本 xdx 的号,手动在浏览器中按照流程登录采集 Har。
这次终于出现了代播接着让 AI 分析,至写出了完整的认证协议后面再也没碰过认证协议了。很强,非常强,这下不得不服 Astra。
系统差异和服务
在处理好 Portal 协议以后就开始处理烂摊子,协议既然能跑了现有的结构不一定是最好的,代码结构是可以调的,至少我觉得还可以,开始重构代码结构……
最后选择调一下 CLI 的参数命令和代码结构,我觉得已经不是人能够脱离 GUI 能用的,起码得更便捷,后续能够使用在纯 CLI 使用的场景例如 OpenWRT。
从这样的语义开始打架非常重叠,不像是人用的。
connect / login / disconnect → up / down
sessions → sessions
discover → diagnose
(无) → run --daemon
(无) → status / logs / config / service0.3 开始变成了这种规范的 CLI 参数,更加符合现代参数,不再是以前的长动词看着就只有 IPC 使用一样不考虑人使用,以及考虑来在 OpenWRT 上到使用(portal-cli)可能性。
因为 Vibe Coding 的环境在 macOS,在 mac 上运行意外的好,基本上一次过没有出现问题,例如:系统服务和系统凭证。
pub enum CredentialStore {
#[default]
System, // 走系统钥匙串
File, // 明文
Memory, // 凭据临时
}假期回家把电脑修好了 Windows 行为又可以测试了,下载好了程序,没想到第一个跨平台需要处理的事,还要处理申请写计划任务的权限,不然导致一直报错无法开机自启,这里要用 UAC 所以又捣鼓了一阵子
https://github.com/miaoermua/DGCU-Net-Portal/issues/1
/// 用户在 UAC 弹窗点"否"时 Start-Process 抛异常,用 ERROR_CANCELLED 原样回传。
const USER_CANCELLED: i32 = 1223;
/// 包进 PowerShell 单引号字符串,撇号按 PowerShell 规则写两遍。
fn quote(value: &str) -> String {
format!("'{}'", value.replace('\'', "''"))
}设计
Agent 一开始设计是那种 AI 味很重的 UI,非常经典的渐变色黑底,相信有 vibe coding 经历的都知道,在我一番查找下使用了一个前端 UI 框架 miuix-vue,之前看到 miuix 在手机上运用在 Kernel SU 和 Lsposed 上被惊艳到了,所以采用他。
在人机交互上,我选择了 PC 平台上常用的似乎不太常用的导航,从代码上看这个就是仿的 Gnome 的顶部导航,而不是侧边菜单,因为功能我需要极度极简实用为主优先,但是受限于跨平台不能吧这个 Mac 的顶栏菜单隐藏掉,也许可以但我没研究。
我额外尝试使用了 miuix-vue 提供的底部导航,这种就太手机了,没必要,这里放截图对比一下。

在不同系统的托盘行为还不一样,macOS 这里生成好的 icon 能完美显示在启动台和托盘中,但是到 Windows 便是糊的一逼。
于是把第一版的 icon 进行了重绘,兼顾了其他平台没有裁剪应用圆角边框的问题,这里套了大果 Apple 的应用 icon 底框,本来想着用小米那种圆角的不知道可不可行,想了想算了。
![]()
在前面在铺垫最重要协议和认证,后续实现新功能的时候发现他并不是完全按照 miuix-vue 里面的样例来走的,而是完全自己写的……就开始让他指定用哪些地方使用 UI 库的现成组件,比如按钮是以文字来的,我就得在 miuix-vue 上面给他挑个图标套上,一点一点把样式修改,从一开始的原生选择框,到后面的 miuix-vue 逐渐完善。

在 About 页新增了更新,用的 GitHub Rust API 查 Releases 的 URL,并且改成了类似于西米露的那种 About 页布局,将品牌版本居中布置,也同时兼顾了用户手动调整窗口大小。
用户体验优化
将体验贯彻到底,从用户中来到用户中去。作为首席用户,第一关注是软件够不够傻瓜,默认选项是否合理,软件随便操作不会崩溃(鲁棒性),要将核心功能做到足够冗余足够的傻瓜,即便这个问题可能 100 次会遇到一次问的,绝大多数可能就将就打开“自适应模式”亦或者放弃使用这个软件了。
一开始软件需要手动保存,遇到问题还需要关掉认证重新开一遍才能进行保存,到现在非 portal-cli 运行的配置都可以实时保存,且支持自动保存不需要手动点击保存。
Windows 原本没有 installer 的需要自行解包 zip 安装到自定义目录,到 actions 打包好 setup 安装,使用的 NSIS 安装程序制作工具。
macOS 版本是比 Windows 早做到安装器,这里没用 pkg 安装,是抄的 canmi/rdm 的 DMG 安装模版。
尾巴
这个项目花费了我大量时间和 Token,也从中学习到跨平台、Rust、系统服务,算是一个不错的开发经历,所以这个工程版是面对开发者或者使用 Vibe Coding 但是没有方向的小白。
目前项目基本上开发完毕,如果没有大变动未来就是维护模式,不再添加随意新功能,最多优化一下代码潜在问题,用户反馈以及后续发版引来的各种用户问题优化,这些都需要时间证明。
有什么问题可以在评论提出,程序问题可以在 issues 上填写。