使用Tauri+vite+koa2+mysql开发了一款待办效率应用

🎉使用Tauri+vite+koa2+mysql开发了一款待办效率应用

📝项目概述

这是一个基于tauri+vite的应用,它采用了一些最新的前端技术,包括 Tauri、Vue3、Vite5、koa2 和 mysql。它提供了丰富的效率管理工具。

应用地址:https://kestrel-task.cn

喜欢的可以试试哦,🙏🙏🙏

🏆项目预览

💻技术栈

  • Tauri: Tauri是一个用于构建现代桌面应用程序的工具,结合了Rust、Vue.js和Web技术,提供了强大的跨平台能力。
  • Vue3: Vue3是流行的JavaScript框架Vue.js的最新版本,具有更好的性能、更好的TypeScript支持和更多的特性。
  • Vite5: Vite是一个现代化的构建工具,Vite5是其最新版本,具有快速的冷启动、热模块替换和原生ES模块支持。
  • Koa2: Koa2是一个基于Node.js的轻量级Web框架,使用异步函数处理中间件,提供了简洁而强大的Web开发体验。
  • MySQL: MySQL是一个流行的关系型数据库管理系统,具有高性能、可靠性和广泛的应用领域,适用于各种规模的应用程序。

主要包括的功能点实现

🔔图标生成

在项目根目录,放上图片为 app-icon.png的图片
然后执行。就能看到图标已经生成了。

npm run tauri icon

📢配置应用系统托盘

新建tray.rs,编写托盘事件。内容如下。

use tauri::{AppHandle, CustomMenuItem, SystemTray, SystemTrayEvent, SystemTrayMenu, SystemTrayMenuItem
};
use tauri::Manager;// 托盘菜单
pub fn menu() -> SystemTray {let quit = CustomMenuItem::new("quit".to_string(), "退出");let show = CustomMenuItem::new("show".to_string(), "显示");let hide = CustomMenuItem::new("hide".to_string(), "隐藏");let tray_menu = SystemTrayMenu::new().add_native_item(SystemTrayMenuItem::Separator).add_item(hide).add_item(show).add_native_item(SystemTrayMenuItem::Separator).add_item(quit);SystemTray::new().with_menu(tray_menu)
}// 托盘事件
pub fn handler(app: &AppHandle, event: SystemTrayEvent) {let window = app.get_window("main").unwrap();match event {SystemTrayEvent::MenuItemClick { id, .. } => match id.as_str() {"quit" => {std::process::exit(0);}"show" => {window.show().unwrap();}"hide" => {window.hide().unwrap();}_ => {}},_ => {}}
}

在main.rs中使用

use std::{thread,time};
mod tray;fn main() {let context = tauri::generate_context!();tauri::Builder::default()// .menu(tauri::Menu::os_default(&context.package_info().name)) //配置界面菜单.system_tray(tray::menu()) // ✅ 将 `tauri.conf.json` 上配置的图标添加到系统托盘.on_system_tray_event(tray::handler) // ✅ 注册系统托盘事件处理程序.invoke_handler(tauri::generate_handler![my_custom_command, init_process,close_splashscreen]).run(context).expect("error while running tauri application");
}

🎛️ 接口封装请求

Tauri 是一个框架,它允许开发者使用 Rust 语言来构建轻量级的桌面应用程序,Tauri 提供了一套 API,其中包括了用于处理 HTTP 请求的 http 模块。
tauri.conf.json 文件中进行配置:

{"tauri": {"allowlist": {"http": {"all": true,"request": true,"scope":["http://**","https://**"]}}}
}

🎵基于API的封装

// http.jsimport { fetch, ResponseType, Body } from '@tauri-apps/api/http'// https://tauri.app/zh-cn/v1/api/js/http#fetch
export const http = (opts = {}) => {return new Promise((resolve, reject) => {const { url, method, query, data, headers, callback } = optsfetch(url, {method: method || 'GET',headers: {'content-type': 'application/json',...headers,},responseType: ResponseType.JSON,timeout: 60000,query: query,body: Body.json({...data,}),}).then((res) => {callback && callback(res)resolve(res)}).catch((e) => {reject(e)})})
}

😄获取版本号

这个函数通常用于获取应用程序的版本信息

import { getVersion } from '@tauri-apps/api/app'
onMounted(async () => {appVersion.value = await getVersion()getNewVersions()
})

🙂检查版本更新

这段代码的作用是导入 Tauri 中的更新模块 @tauri-apps/api/updater 中的 checkUpdate 和 installUpdate 函数。checkUpdate 用于检查是否有可用的应用程序更新,而 installUpdate 用于安装应用程序更新。

import { checkUpdate, installUpdate } from '@tauri-apps/api/updater'
  checkUpdate().then(async (res) => {const { shouldUpdate, manifest } = resif (shouldUpdate) {confirm(`发现新版本:${manifest?.version},是否升级?`, { title: '版本更新', type: 'success' }).then(async (res) => {try {ElMessage.success({message: '正在下载更新...',duration: 3000,})installUpdate().then(async (res) => {await relaunch()}).catch((e) => {})} catch (e) {ElMessage.error({message: '下载更新失败',description: e.toString() || '',})}})} else {await confirm(`当前版本,已经是最新版本`, { title: '检查更新', type: 'success' ,okLabel: '确定',cancelLabel: '取消'})}})

🙃窗口操作

窗口禁用最大化和最小化功能

import { appWindow } from '@tauri-apps/api/window';

🥰禁用最大化和取消禁用

appWindow.setMaximizable(true) //禁用
appWindow.setMaximizable(false) //取消禁用
appWindow.setMinimized(true) //禁用
appWindow.setMinimized(false) //取消禁用

🥰消息提示

Ask弹窗

import { ask } from '@tauri-apps/api/dialog';
const yes = await ask('确定更新该版本?', '发现新版本');
const yes2 = await ask('确定更新该版本?', { title: '发现新版本', type: 'warning' });

如果想要修改按钮的文本,可以使用,okLabel: ‘确定’,cancelLabel: ‘取消’。

😊confirm弹窗

import { confirm } from '@tauri-apps/api/dialog';
const confirmed = await confirm('确定更新该版本?', '发现新版本');
const confirmed2 = await confirm('确定更新该版本?', { title: '发现新版本', type: 'warning',okLabel: '确定',cancelLabel: '取消' });

😝message提示框

import { message } from '@tauri-apps/api/dialog';
await message('确定更新该版本', '发现新版本');
await message('确定更新该版本', { title: '发现新版本', type: 'error',okLabel: '确定',cancelLabel: '取消' });

🤗open 选择文件弹窗

import { open } from '@tauri-apps/api/dialog';
// Open a selection dialog for image files
const selected = await open({multiple: true,filters: [{name: 'Image',extensions: ['png', 'jpeg']}]
});
if (Array.isArray(selected)) {// user selected multiple files
} else if (selected === null) {// user cancelled the selection
} else {// user selected a single file
}

😐save文件保存弹窗

import { save } from '@tauri-apps/api/dialog';
const filePath = await save({filters: [{name: 'Image',extensions: ['png', 'jpeg']}]
});

😁splashscreen页设置

为什么要设置这个呢,因为splashscreen 页面通常用于在应用程序启动时显示一个启动画面或加载动画,以提供用户友好的界面体验。这个页面可以包含应用程序的标志、名称或其他相关信息,帮助用户确认应用程序正在加载。一旦应用程序加载完成,通常会自动关闭 splashscreen 页面并显示应用程序的主界面。

🫠tauri.conf.json配置
    "windows": [{"fullscreen": false,"resizable": true,"title": "微芒计划","width": 1100,"height": 680,"minHeight": 600,"minWidth": 900,"visible": false},{"width": 800,"height": 500,"minHeight": 500,"minWidth": 800,"decorations": false,"url": "splashscreen.html","label": "splashscreen","resizable": true,"fullscreen": false}]

splashscreen.html要放到public下面,为一个html文件,里面可以写开屏的图片动画或者界面。

🙂main.rs编写关闭splashscreen 页面的功能

// Create the command:
// This command must be async so that it doesn't run on the main thread.
#[tauri::command]
async fn close_splashscreen(window: Window) {// Close splashscreenwindow.get_window("splashscreen").expect("no window labeled 'splashscreen' found").close().unwrap();// Show main windowwindow.get_window("main").expect("no window labeled 'main' found").show().unwrap();
}

🙃main入口提供给前端使用

fn main() {let context = tauri::generate_context!();tauri::Builder::default()// .menu(tauri::Menu::os_default(&context.package_info().name)) //配置界面菜单.system_tray(tray::menu()) // ✅ 将 `tauri.conf.json` 上配置的图标添加到系统托盘.on_system_tray_event(tray::handler) // ✅ 注册系统托盘事件处理程序.invoke_handler(tauri::generate_handler![my_custom_command, init_process,close_splashscreen]).run(context).expect("error while running tauri application");
}

🙃在前端调用splashscreen页面

界面加载完成后,关掉

import { onMounted } from 'vue'
import { invoke } from '@tauri-apps/api/tauri'
onMounted(() => {// window.addEventListener('contextmenu', (e) => e.preventDefault(), false)document.addEventListener('DOMContentLoaded', () => {// This will wait for the window to load, but you could// run this function on whatever trigger you wantsetTimeout(() => {invoke('close_splashscreen')}, 1000)})
})

🎉结语
感兴趣的可以试试,有不清楚的问题,关于tauri开发方面的问题,也可以一起交流。欢迎加我:zhan_1337608148。一起成长,一起进步。

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

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

相关文章

Openldap安装部署及Gitea简单配置使用

Openldap安装部署及Gitea简单配置使用 一.安装Openldap #拉取镜像 docker pull osixia/openldap:latestdocker run \ -d \ -p 389:389 \ -p 636:636 \ -v /home/data/openldap/local:/usr/local/ldap \ -v /home/data/openldap/lib:/var/lib/ldap \ -v /home/data/openldap/s…

OceanBase 列存中多列过滤性能解析

今天有同事问我,列存大宽表场景下,如果在多个列上有等值过滤条件,OceanBase 的性能是不是无法满足要求? Hi 晓楚,帮评估个OTS替换场景 大概1亿大宽表,查询姿势就是任意字段的组合,进行等值查询g…

海外青云私有云:企业的数字化转型得力助手

在全球化日益加深的今天,海外企业对于云计算的需求也愈发迫切。青云(QingCloud)作为一家领先的云计算服务提供商,其私有云产品在海外市场上受到了广泛的关注和认可。那么,海外青云私有云究竟有何用处呢?本文将从多个角度为您科普。 首先&…

Java高级重点知识点-10-Object类

文章目录 Object类(java.lang) Object类(java.lang) Object类是Java语言中的根类,即所有类的父类 重点: public String toString():返回该对象的字符串表示。 public class User {private String username;private String password;public…

地雷数量求解(二维数组)

问题描述 为了保证边境重要的军事基地不会被敌人入侵,我军在敌军的必经之路上埋了 𝑥 颗地雷,已知这片必经之地是 𝑛𝑚 的方阵形状,为了让我们的友军知道哪些地方是有地雷的,我军工兵绘制了一张…

LeetCode刷题之HOT100之乘积最大子数组

2024/6/25 六月也来到了末尾,刷题也刷了一个半月左右。收获还是有的,最起码打字快了哈哈,做题啦! 1、题目描述 2、逻辑分析 一眼动态规划。 解题思路 遍历数组时计算当前最大值,不断更新令nowMax 为当前最大值&…

java的线程

定义:在java中,线程是程序中一个独立的执行流,它拥有自己的核心运行逻辑和状态。在操作系统中,线程是进程的一部分,是程序执行的最小单元。 重要性:多线程使得程序能够更好的利用CPU资源,同时处…

AI大模型企业应用实战:Prompt让LLM理解知识

1 Prompt Prompt 可理解为指导AI模型生成特定类型、主题或格式内容的文本。 NLP中,Prompt 通常由一个问题或任务描述组成,如“给我写一篇有关RAG的文章”,这句话就是Prompt。 Prompt赋予LLM小样本甚至零样本学习的能力: LLM能力…

Linux驱动开发(三)--新字符设备驱动开发 LED驱动开发升级

1、新字符设备驱动原理 使用 register_chrdev 函数注册字符设备的时候只需要给定一个主设备号即可,但是这样会 带来两个问题 需要我们事先确定好哪些主设备号没有使用 会将一个主设备号下的所有次设备号都使用掉,比如现在设置 LED 这个主设备号为200&…

从50分到90分,网站性能优化实践

难以置信: 我可是用尊贵的Vue3Ts开发的呢 (手动狗头). 十分抗拒: 迫于yin威,我给网站做了体检和手术. 体检 – 市面上的体检套餐有很多种,但其实都是换汤不换药.那药(标准)是什么呢?我们会在下面说明.这里我选择了谷歌亲儿子"灯塔"(LightHouse)进行性能体检. 体检…

Scala入门:打造大数据处理的超能力(通俗易懂)

Scala是一门现代的多范式编程语言,它融合了面向对象和函数式编程的特点,被广泛应用于大数据处理领域。本文将详细介绍Scala的基本概念、使用方法、主要作用以及注意事项。 一、Scala简介 1. Scala的起源 Scala由Martin Odersky于2004年创建&#xff0c…

解决 vue 项目一直出现 sockjs-node/info?t=问题

其实如果是在开发环境,应该是开发的时候网络环境变更导致,比如你切换无线网络,导致开发服务器的IP地址换了,这样开发服务器会不知道如何确定访问源。开发环境中关闭npm dev server,然后重新npm run serve重新构建服务环…

探索AI世界系列:俗说AI智能体

AI agent,翻译为中文就是AI智能体。 什么是AI智能体呢? 一,GPT对AI智能体的定义 AI智能体,即人工智能体(Artificial Intelligence Agent),是具有自主性、学习能力和推理能力的计算机程序。 …

聚观早报 | 小鹏MONA M03曝光;iPhone 16系列电池改进

聚观早报每日整理最值得关注的行业重点事件,帮助大家及时了解最新行业动态,每日读报,就读聚观365资讯简报。 整理丨Cutie 6月25日消息 小鹏MONA M03曝光 iPhone 16系列电池改进 一加Ace 3 Pro三款配色 字节跳动与博通合作开发AI芯片 蚂…

【性能优化】Android冷启动优化

文章目录 常见现象APP的启动流程计算启动时间Displayed Timeadb dump 启动优化具体策略总结参考链接 常见现象 各种第三方工具初始化和大量业务逻辑初始化,影响启动时间,导致应用启动延迟、卡顿等现象 APP的启动流程 加载和启动应用程序; …

学习笔记STMF4 TIMER定时器(使用开发板立创天空星STMF4)

目录 #定时器的介绍 #怎么去理解定时器的预分频系数 #使用定时器实现完成触发中断 #定时器触发中断基本函数配置 #在使用TIMER 触发中断的时候为什么不需要配置EXTI中断这个选项 #使用定时器完成输出PWM #PWM基本知识介绍 #函数配置生成PWM 这个系列所有笔记用来记录&#x…

【OnlyOffice】 桌面应用编辑器,版本8.1发布,PDF编辑器、幻灯片版式、改进从右至左显示、新的本地化选项等功能,快来体验吧

继 ONLYOFFICE 文档 8.1 发布后,适用于 Linux、Windows 和 macOS 的 ONLYOFFICE 桌面应用程序最新版本也已推出。它具有在线套件的最主要功能,例如功能齐全的 PDF 编辑器、演示文稿中的幻灯片版式、改进的 RTL 支持、新的本地化选项等。 目录 ONLYOFFICE…

手机看cad图的软件有哪些?软件推荐

手机看cad图的软件有哪些?随着科技的不断发展,CAD图纸在手机上的查看和编辑需求日益增加。为了满足这一需求,市面上涌现出了众多手机CAD看图软件。本文将为大家推荐四款优秀的手机CAD看图软件,并分别介绍它们的功能特点、受众定位…

JavaScript的学习之DOM简介

目录 一、DOM是什么 二、节点是什么(Node) 三、代码示例 一、DOM是什么 DOM全称Document Object Model文档对象模型 文档:表示整个HTML网页文档 对象:表示网页中的每一个部分转换为一个对象 模型:表示对象之间的关系…

LabVIEW开发电气设备检测与管理系统

设计并实现了一个基于LabVIEW的电气设备检测与管理系统,采用了先进的硬件设备(NI PXI-6289数据采集卡、Fluke 434电能质量分析仪和Schneider PM5560电力监控仪),通过实时采集、处理与存储电气设备数据,提高了电气设备的…