前言

今年二月份的时候,我提了下准备逐渐不用 Fyne ,换一种方式来做 GUI (见这篇文末:Golang 从零开始搭建自动部署平台,一键部署基础服务

Golang 生态的 GUI 路线主要有三种

  • 我正在用的,基于 OpenGL 的 Fyne 库,实现了一套自绘引擎,纯写 Go
  • 用的比较多的,以 Wails 为代表的传统前端 GUI 方案,套皮 Chrome 类,需要会 html + js + css 三件套
  • 基于 Qt 写 GUI ,最早从 C 那边出来的

准备换的原因,主要是 Fyne 无法应对复杂界面绘制,加上远程桌面默认的 OpenGL 版本很低,程序会跑不起来

基于此,我能选的只有 Wails 为代表的传统前端 GUI 方案。所以我就去稍微看了看前端。我之前也学过一点点前端,博客的主题切换,以及博客 V2 的 dark-mode 都是我写的,也能稍微写一点点,但是每次看前端的时候,那感觉就像上高数课一样,看着看着就要睡着了!说好的前端简单呢😡

因为不知道为什么,前端的内容是一点儿都看不进去,这次看也是越看越困,所以只能放弃这个方案,Qt 那套东西太费劲了。但是该解决的问题还是得解决,那么就得从这个圈子跳出来想解决方案,也试了试 Godot 做界面,感觉做的也很累。也稍微试了试 C# 的 Avalonia ,xml 这玩意儿真的爱不起来。

于是准备戴上耳机听歌摆起来!然后,突然想到,我听歌的 App 是用 Flutter 自己写的!为什么我不用 Go + Flutter 来搞捏?去年上班之前,在热心开罗老哥的帮助下,用他的 abdelaziz-mahdy/flutter_meedu_videoplayer: Cross-Platform Video Player for flutter (github.com) 这个库做了个音乐播放器 -> luckykeeper/OAPlayer: Flutter 练手小工具,一个视频播放器,连续播放列表中的视频(从网络源获取),适合白嫖网络免费存储听OP/ED (github.com)

Flutter 是个好东西,只要你不用平台特定库,你可以写一次代码,把 Web & Android & iOS & MacOS & Windows & Linux 六端一网打尽,不过当时没有仔细学,东拼西凑加找开罗老哥帮忙才搞了出来,所以这次就得正经的学一下了

感谢谷歌,让小的能有个饭碗(doge),是的,Flutter 和 Golang 一样,都是狗哥家的好东西

一如既往,我上手起手式肯定是先来一个 Mini-Project ,改造一下之前用 Fyne 写的应用,于是有了这个:luckykeeper/yuuka_downloader_flutter: (YuukaDownloader Flutter 重制版) 优香酱系列小工具——快速解析初音站(yngal/fufugal/ffgal)链接并送Aria2下载 (github.com)

小试了一下 Realm ,感觉并不好用,不如用 SQLite ,小试完了,自然就要准备上项目了

界面展示

说到 Flutter ,首先就不得不提下状态管理,感觉国内用 GetX 的好像蛮多的,那会儿先看了官方推荐的 provider 之后,看到说它的作者做了个 Riverpod ,字母组成和 provider 一样,但是更好用,于是就去学了 Riverpod

那么接下来就来康康界面吧,可以和之前 Golang 版的对比下:Golang 搞定 k8s 应用无网自动化滚动升级

这次要稍微复杂一点点,原先的是服务器端和客户端,现在在客户端这边分成了用户界面(Flutter)和后端(Golang),原因很简单,操作 docker 镜像的库没有 dart 版本的,docker 是 go 写的,所以库也是 go 写的,这很合鲤

交互逻辑上尽量是做的相似,主要考虑是减少同事使用的学习成本

后端

Golang 写的后端,打了 Windows 、MacOS 和 Linux 的包,用的 GIN 起的 http 服务器,和 Flutter 的界面交互,只允许了本地 IP 请求,别的 IP 请求不响应,所有的文件操作都由它来进行,虽然 dart 也能操作本地文件,但是在 Windows 上,它用的是 CreateFile2 函数 (fileapi.h) ,所以不能在 Win7 和 WinServer 2008 运行,之前见过极个别学校提供的是这种远程机器,为了能在这些机器也能跑起来,于是就把所有的文件操作给到了后端去做

image-20240609224614774

首屏

是不是有一种手机(或者叫做 pad 更贴切) App 的感觉😂,Flutter 作为主推移动端的框架,设计上更偏向移动端,m3 标准,看起来还是挺赏心悦目的,同样都是 Marital Design ,感觉比 Fyne 好看很多, 我在各端做了无边框设计,双击可以最大/小化,拖边框可以放大缩小,无边框设计感觉要更好看些,启动的时候会做系统检测,如果是 Win8 以下系统的话,就不会去写日志,原因是上面提到的 CreateFile2 函数的问题,另外 Win8 及以上系统,可以自定义后端端口,Flutter 可以从后端配置读取打开,但是 Win8 以下的话,就是固定 44443 端口咯

image-20240609225126068

小抽屉

几个菜单,镜像仓管理拉取镜像使用的凭据,容器管理是对应的 K8s 的应用负载管理,系统配置是新增功能,可以管理 ConfigMap 了,网关配置和之前一样,用途是选择要操作的用户

image-20240609225925909

网关配置

这里是管理用户和选择要操作用户的地方

image-20240609230222183

配置网关

和之前一致,但是改进了操作逻辑,可以自动刷新了,所有的交互逻辑,都不再需要手动一遍遍去点刷新啦

image-20240609230429805

选择用户

选择要操作的平台,然后上面的状态就会更新

image-20240609230936723

镜像仓

也是和之前一样,设置镜像仓的凭据,拉取镜像使用,但是操作逻辑改善了

image-20240609231420436

容器管理

首屏

新增了一些功能,可以查看,搜索应用负载,一键筛选异常的应用负载,查看应用负载使用的镜像,以及删除应用负载,左侧点进去,可以管理应用负载

image-20240609231827544 image-20240609231918769

应用负载管理

同样也是加了不少功能,页面比较长,开头和尾巴有一点点没截上,不过不打紧,主要的功能都在里面了

可以伸缩应用负载,调整资源限制,查看容器镜像和拉取策略,查看容器组状态,查看容器组环境变量

image-20240609232219198

升级应用负载

这是小助手的要解决的原始需求啦,在 harbor 搭配镜像加速服务,提升多架构容器分发效率 之后,现在支持了多架构容器镜像的升级,添加了使用华为和阿里仓更新的功能,也加上了本地文件选择器,不需要手动去敲路径了

image-20240609232704742

编辑应用负载

这次新增的功能,我认为非常有看点,用 Fyne 是很难实现这么好的效果的,实现了一个支持数十种语言语法高亮、支持数十种主题的编辑器,可以编辑应用负载的 Yaml 了

image-20240609232941888

容器组管理

和之前相比,加了个追踪日志的功能,整体速度提升了很多。追踪日志做了颜色渲染,更加容易看出不同等级的日志了

image-20240609233723194 image-20240609234435205

系统配置

新增的功能,可以直接修改 ConfigMap 了

image-20240609233425093 image-20240609233539030

结语

大前端时代,如果你也是写后端的同学,同时啃不动前端的话,不妨试试用 Flutter 写程序 / Web ,做起来真的爽,从此自己前后端一把梭,接口想怎么定就怎么定,赢麻了