Wails实现桌面番茄钟应用

news2024/11/23 16:14:03

0.项目背景

最近在优化自己的工作流,在工作方法上开始使用番茄钟来实现时间控制,一直觉得番茄钟的方式有点silly,直到自己用过之后才发现,番茄钟是真的好用,它不止是工作的方法,更是休息的艺术,让我们在完成工作的过程中不至于那么累,保证一直有充足的经历完成工作。有点扯远了,价值观的输出就到这里吧。

使用番茄钟首先要有个计时工具,在搜索了实体商品之后,感觉都差点意思,重要的是怕这东西成为桌面的累赘,本着如无必要,勿增实体的原则,决定还是使用应用程序来实现。

搜索了一圈网上的番茄钟,虽然有好多,但是有些感觉太重了,有些跟其他软件集成,用起来并没有那么方便。本着开源拿来即用的原则,我开始在github上找想要的东西,发现一个叫tomodoro的软件挺适合的,这个软件是用网页端的方式实现的,可以直接使用链接来使用,唯一不方便的就是这个东西没有办法脱离浏览器使用。
在这里插入图片描述

1.初探Wails

为了解决程序无法脱离浏览器使用的问题,我开始寻找怎么将网页应用打包成桌面端应用程序的方法,参照这篇文章,我最终选择了Wails来实现这个想法。

Wails自己的简介:

Wails 是一个可让您使用 Go 和 Web 技术编写桌面应用的项目。

将它看作为 Go 的快并且轻量的 Electron 替代品。 您可以使用 Go 的灵活性和强大功能,结合丰富的现代前端,轻松的构建应用程序。

Wails依赖Node环境和Go环境,我们依照文档来进行安装。

1.1安装Wails

在安装完Go环境和Node环境之后,我们可以通过下面的命令来确认有没有安装完成,打开cmd

go version
node -v

如果都能运行,恭喜你,可以进行安装了,不过在安装之前,最好给Go添加一下国内镜像源,防止因为网络问题导致的安装失败,镜像源我这边选择七牛云的地址,为什么不用阿里云的镜像,是因为阿里云镜像上的Wails版本比较老,导致项目编译时报错,这个问题折腾了我大半天,特此说明一下。

Go设置国内镜像源

go env -w GOPROXY=https://goproxy.cn,direct

然后就可以执行安装命令了

go install github.com/wailsapp/wails/v2/cmd/wails@latest

当前最新版本是2.9.1,可以参考下

1.2检测Wails运行环境

Windows版使用的是WebView2的方式来进行网页的处理,所以要检测当前环境有没有符合Wails运行条件,主要就是检查Go、WebViews2、Node环境,Wails提供wails doctor命令来实现检查

wails doctor

在这里插入图片描述
可以看到前三个是正常的,就可以进行下面的开发了

1.3初始化Wails项目

wails自己的文档已经写得很详细了,我不再狗尾续貂了,我这边只记录下自己实现的过程。
wails init命令用来初始化项目,因为我们用的项目是原生js项目,所以选择下面的模板

wails init -n myproject -t vanilla

执行完毕会生成如下项目结构,frontend就是存放前端的文件夹

在这里插入图片描述

2.集成tomodoro项目

因为这个项目是原生js项目,没有应用前端框架,我们可以直接将项目文件放到frontend目录下的dist目录,让Wails在打包的时候直接将该项目打包进去。
tomodoro项目文件
Wails项目默认使用Vite进行打包,如果将前端代码放在src目录,后续打包还要修改js文件等引入方式,这个就比较麻烦了,对于我一个后端开发来说,成本比较高,我这边就采用了这种处理方式,如果其他项目有类似情况,也可以直接将项目打包后的dist文件丢进来,在Wails编译的时候选择跳过前端编译就可以,具体的命令就是wails build -s,这里的“-s”就是跳过前端打包的参数。
然后就可以愉快的进行打包应用了,打包之后的运行程序在项目build/bin目录下。

3.一些小改动

tomodoro项目支持pip的形式用来独立展现在桌面上,打包之后我们不需要这部分了,可以将相应的按钮隐藏掉,同时,我们希望程序能够始终展示在最前端,这个可以用修改main.go中的配置来进行操作。

package main

import (
	"embed"

	"github.com/wailsapp/wails/v2"
	"github.com/wailsapp/wails/v2/pkg/options"
	"github.com/wailsapp/wails/v2/pkg/options/assetserver"
)

//go:embed all:frontend/dist
var assets embed.FS

func main() {
	// Create an instance of the app structure
	app := NewApp()

	// Create application with options
	err := wails.Run(&options.App{
		Title:  "TomatoClock",
		Width:  512,
		Height: 384,
		AssetServer: &assetserver.Options{
			Assets: assets,
		},
		BackgroundColour: &options.RGBA{R: 27, G: 38, B: 54, A: 1},
		OnStartup:        app.startup,
		Bind: []interface{}{
			app,
		},
		//Frameless: true, //无边框
		AlwaysOnTop: true, //最上层

	})

	if err != nil {
		println("Error:", err.Error())
	}
}

这里的AlwaysOnTop配置就可以实现我们的需求。其他需求可以通过参数选项文档来进行配置

本文代码及应用文件(去掉链接中中文)
链接:https://pan.b分aidu.com/s/1G享AsrqfmVWTLizU链LawIHBtg?pwd=zq1j 接

参考:
tomodoro项目地址:https://github.com/lazy-guy/tomodoro
wails文档:https://wails.io/zh-Hans/docs/next/introduction

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2082949.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

流程图还不会画?这个AI工具一键出图,还有上万模版库可选

我是娜姐 迪娜学姐 ,一个SCI医学期刊编辑,探索用AI工具提效论文写作和发表。 流程图的绘制在工作中很常见。大家在写论文、课题申请等经常会用到需要绘制技术路线、工作流程、病人筛选流程等。 有没有AI工具能够根据我们的描述文字,一键生成流…

aspeed2600 openbmc对mctp over pcie的支持分析(支持mctp over pcie)

遍搜全网,竟然关于openbmc mctp over pcie的支持说明情况了无文章,这不是一个艰难的问题,服务器BMC也不是一个超级精尖的产品,想当年分享stm32资料,都是满天飞。可能服务器市场大家对于文章上的分享并无兴趣。 此篇文…

网络安全总结②

上一篇:网络安全总结① 下一篇: 传统防火墙 传统防火墙 技术:访问控制、代理技术、会话机制 工作层次:应用层一下 防御模式:通过防御设备划分边界,基于IP/端口和特征进行判断;以隔离为基础&am…

【Spring Boot 3】自定义拦截器

【Spring Boot 3】自定义拦截器 背景介绍开发环境开发步骤及源码工程目录结构总结背景 软件开发是一门实践性科学,对大多数人来说,学习一种新技术不是一开始就去深究其原理,而是先从做出一个可工作的DEMO入手。但在我个人学习和工作经历中,每次学习新技术总是要花费或多或…

茶余饭后(六)

有人孤立你,证明你强大;有人嫉妒你,证明你出众;有人诋毁你,证明你有能力;有人议论你,证明你有价值;有人利用你,证明你有能力。所以原谅那些诋毁你的人,至少他…

到处在裁员,这个行业却在疯狂招人!

1.裁员浪潮不断 8月26日,IBM中国方面确认了将关闭中国研发部门的消息,这一决策涉及员工数量超过1000人。技术迭代浪潮前,哪怕是名企,攻守防退之间的转换也只在一瞬间。AI引发大裁员?这表明IBM正在积极适应技术变革&am…

win10配置adb环境变量

初始状态: 最简单的配置方案,直接复制adb所在路径: 粘贴进来确定即可: 然后打开 cmd 查看已经配置成功了:

MATLAB 手写Ply文件点云读取类(86)

MATLAB 手写Ply文件点云读取类(86) 一、算法介绍二、算法实现1.PLYReader.m 类文件2.可视化一、算法介绍 PLY是一种常见的点云文件格式,这里尝试手写一个读点云的类,查看是否能正常读取,结果将可视化,具体代码如下: 二、算法实现 1.PLYReader.m 类文件 classdef PLYR…

优秀的开源项目

目录 热key 多线程并行 秒级百G级日志工具 ES操作工具 消息推送平台 HTTP 客户端 业务层的分布式限流组件 企业级微服务解决方案 热key hotkey: 京东App后台中间件,毫秒级探测热点数据,毫秒级推送至服务器集群内存,大幅降低热key对数…

MinIo - java代码 实现图片上传至Minio桶

MinIO是一款开源的高性能、可伸缩、安全的对象存储系统,专为云原生和容器化环境而设计 (基于minio已经集成在服务器中) 第一步,毫无疑问肯定是创建一个桶(用于存放的容器) 这个Name根据自己的需求自定义 然后点击Create Bucket 可以看见新创建的桶已经完成 点击新创建的…

es集群详解

1、集群的介绍: 1.1、单机的elasticsearch做数据存储 必然面临两个问题:海量数据存储问题、单点故障问题。海量数据存储问题:将索引库从逻辑上拆分为N个分片(shard),存储到多个节点。从逻辑上&#xff0c…

docker 镜像仓库的管理

目录 1 docker 镜像仓库介绍 1.1 什么是docker仓库 1.2 docker hub 2 docker仓库的工作原理 2.1 仓库中的三个角色 2.2 pull原理 2.3 push原理 3 使用互联网上提供的托管镜像仓库 3.1 docker hub 镜像仓库 3.1.1 docker hub 镜像仓库介绍 3.1.2 docker hub的使用方法 4 搭建doc…

数据仓库系列11:ETL的主要步骤是什么,它们分别有什么作用?

你是否曾经感觉被海量数据淹没?是否在寻找一种方法来有效地整合、转换和加载这些数据?如果是,那么你来对地方了。今天,我们将深入探讨ETL(Extract, Transform, Load)过程的三个关键步骤,这是每个大数据开发者都应该掌握的核心技能。准备好踏上成为数据整合大师的旅程了吗?让…

Dubbo源码解析之@DubboService、@DubboReference(Dubbo源码一)

更好的阅读体验:Dubbo源码解析之DubboService、DubboReference(Dubbo源码一) 视频讲解:https://www.bilibili.com/video/BV1nBsMejEbL 对于Dubbo用的最多的就是DubboService、DubboReference,与之对应的就是服务的提供…

diskgenuis打开vmdk文件提示读扇区错误

使用DiskGenius_V5_2_x86打开iKuai-0.vmdk 读扇区错误! 磁盘: 起始于 0 扇区 共 1 个扇区。 (Err:0) 读扇区错误! 磁盘: VD0:iKuai-0.vmdk(2GB) 起始于 0 扇区 共 2 个扇区。 (Err:0) 更换官网最新版本 https://www.diskgenius.cn/download.php 可…

一个PPT做3天?有这3个AI做PPT工具再也不发愁!

ppt是什么东西? ppt是英文Powerpoint的缩写,它是微软出品的演示文稿软件,因为其在演示领域的领导地位,也让它成为幻灯片或演示文稿的代名词。 一个完整的ppt,通常包含很多要素,如ppt封面页、ppt目录页、p…

解决Java中Long类型的序列化与JDK8时间的序列化

1.背景 SpringBoot与前端交互 这个场景下Long类型与前端JS交互时会存在精度丢失,根本原因是JS的Number支持不到19位,所以需要后端将Long类型的值转为StringJDK8的时间类 JDK8的时间类比如LocalDateTime、LocalDate 在交互时序列化默认格式是 “yyyy-MM-…

LLM 应用开发入门 - 实现 langchain.js ChatModel 接入火山引擎大模型和实现一个 CLI 聊天机器人(上)

前言 Langchain 是一个大语言模型(LLM)应用开发的框架,提供了 LLM 开发中各个阶段很多非常强大的辅助工具支持。对于进行 LLM 开发是必不可少的工具库。 本文将通过一个实际的开发例子来入门 LLM 开发基础工具链,并实现 langchain.js ChatModel 接入火山引擎大模型和基于…

【Python入门】第4节 函数

📖第4节 函数 ✅函数介绍✅函数的定义✅函数的参数✅函数的返回值🧊None类型的应用场景 ✅函数说明文档✅函数的嵌套调用✅变量的作用域 ✅函数介绍 函数是: 组织好的、可重复使用的、用来实现特定功能的代码段使用函数的好处是:…

erlang学习:用OTP构建系统1

书上案例学习并测试 23.1 通用事件处理 -module(event_handler). %% API -export([make/1, add_handler/2, event/2]).%% 制作一个“什么都不干”的事件处理器Name(一个原子)。这样消息就有地方发送了。 make(Name) ->register(Name, spawn(fun() -…