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

本文涉及的产品
应用实时监控服务-应用监控,每月50GB免费额度
云原生网关 MSE Higress,422元/月
应用实时监控服务-用户体验监控,每月100OCU免费额度
简介: 这是一个基于tauri+vite的应用,它采用了一些最新的前端技术,包括 Tauri、Vue3、Vite5、koa2 和 mysql。它提供了丰富的效率管理工具。

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


## 📝项目概述


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


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


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


## 🏆项目预览


![](https://files.mdnice.com/user/1378/751284ec-d4ab-4f7d-be24-9ef68fcd6c7e.png)


![](https://files.mdnice.com/user/1378/865aa7fe-8bc8-4a80-8456-71621e6349fb.png)


![](https://files.mdnice.com/user/1378/1d5ee010-6b62-4194-8697-fe10da4b9aa3.png)


![](https://files.mdnice.com/user/1378/429f947d-afe6-48e4-8f2e-77aaf80fb0f4.png)


![](https://files.mdnice.com/user/1378/377a053c-43e0-4d08-b8a3-308bade71ab4.png)


![](https://files.mdnice.com/user/1378/dfdd94ed-6ecc-4806-8c78-eb998bb15e03.png)


![](https://files.mdnice.com/user/1378/20b13b32-ff27-48db-9c9c-5ff4ee4525be.png)


![](https://files.mdnice.com/user/1378/bb8bc480-6cca-41dc-9782-4cc49d722f14.png)


![](https://files.mdnice.com/user/1378/7817598e-7213-4b2c-91ef-51c01079e218.png)


## 💻技术栈

- **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的图片

然后执行。就能看到图标已经生成了。

```json

npm run tauri icon

```


## 📢配置应用系统托盘

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

```rust

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中使用

```rust

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 文件中进行配置:

```json

{

 "tauri": {

   "allowlist": {

     "http": {

       "all": true,

       "request": true,

       "scope":[

         "http://**",

         "https://**"

       ]

     }

   }

 }

}

```

## 🎵基于API的封装

```js

// http.js


import { 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 } = opts

   fetch(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)

   })

 })

}

```


## 😄获取版本号

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

```js

import { getVersion } from '@tauri-apps/api/app'

```

```js

onMounted(async () => {

 appVersion.value = await getVersion()

 getNewVersions()

})

```


## 🙂检查版本更新

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


![](https://files.mdnice.com/user/1378/129e7a70-4520-4219-8629-81f934da8165.png)



```js

import { checkUpdate, installUpdate } from '@tauri-apps/api/updater'

```

```js

 checkUpdate().then(async (res) => {

   const { shouldUpdate, manifest } = res

   if (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: '取消'})

   }

 })

```

## 🙃窗口操作

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

```json

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

```

## 🥰禁用最大化和取消禁用


![](https://files.mdnice.com/user/1378/3383c156-d04b-41af-a4d4-fcf4fda9cfa2.png)


```js

appWindow.setMaximizable(true) //禁用

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

```

```js

appWindow.setMinimized(true) //禁用

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

```

## 🥰消息提示

### Ask弹窗


![](https://files.mdnice.com/user/1378/a28ccf9c-bee8-4700-aff1-a5f2f3a346aa.png)


![](https://files.mdnice.com/user/1378/0abc8f2b-0afe-4e94-b30b-261a345621cd.png)



![](https://files.mdnice.com/user/1378/0abc8f2b-0afe-4e94-b30b-261a345621cd.png)


```js

import { ask } from '@tauri-apps/api/dialog';

const yes = await ask('确定更新该版本?', '发现新版本');

const yes2 = await ask('确定更新该版本?', { title: '发现新版本', type: 'warning' });

```

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


## 😊confirm弹窗


![](https://files.mdnice.com/user/1378/e40ca1d1-1524-4acf-9a47-01d8eaa93607.png)


![](https://files.mdnice.com/user/1378/1e55b937-0f50-4f73-9434-85dcc083450b.png)


```json

import { confirm } from '@tauri-apps/api/dialog';

const confirmed = await confirm('确定更新该版本?', '发现新版本');

const confirmed2 = await confirm('确定更新该版本?', { title: '发现新版本', type: 'warning',okLabel: '确定',cancelLabel: '取消' });

```


## 😝message提示框


![](https://files.mdnice.com/user/1378/fb895d27-9c31-4d02-ae42-13b45e3c4042.png)


![](https://files.mdnice.com/user/1378/b31d92fe-11ba-4971-b6eb-affca3ed7572.png)



```js

import { message } from '@tauri-apps/api/dialog';

await message('确定更新该版本', '发现新版本');

await message('确定更新该版本', { title: '发现新版本', type: 'error',okLabel: '确定',cancelLabel: '取消' });

```


## 🤗open 选择文件弹窗


![](https://files.mdnice.com/user/1378/3a394be3-4732-4664-90ba-3a71285a60cd.png)


```js

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文件保存弹窗


![](https://files.mdnice.com/user/1378/a64b89b9-5b8c-475e-9531-ac4a9236520f.png)


```js

import { save } from '@tauri-apps/api/dialog';

const filePath = await save({

 filters: [{

   name: 'Image',

   extensions: ['png', 'jpeg']

 }]

});


```

## 😁splashscreen页设置

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


#### 🫠tauri.conf.json配置

```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 页面的功能

```rust

// 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 splashscreen

 window.get_window("splashscreen").expect("no window labeled 'splashscreen' found").close().unwrap();

 // Show main window

 window.get_window("main").expect("no window labeled 'main' found").show().unwrap();

}

```


### 🙃main入口提供给前端使用

```rust

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页面

界面加载完成后,关掉

```rust

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 want

   setTimeout(() => {

     invoke('close_splashscreen')

   }, 1000)

 })

})

```


🎉结语

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















相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2月前
|
存储 关系型数据库 MySQL
MySQL在企业内部应用场景有哪些
【10月更文挑战第17天】MySQL在企业内部应用场景有哪些
81 0
|
2月前
|
存储 关系型数据库 MySQL
介绍一下MySQL的一些应用场景
【10月更文挑战第17天】介绍一下MySQL的一些应用场景
303 0
|
3月前
|
canal 消息中间件 关系型数据库
Canal作为一款高效、可靠的数据同步工具,凭借其基于MySQL binlog的增量同步机制,在数据同步领域展现了强大的应用价值
【9月更文挑战第1天】Canal作为一款高效、可靠的数据同步工具,凭借其基于MySQL binlog的增量同步机制,在数据同步领域展现了强大的应用价值
809 4
|
4月前
|
SQL 关系型数据库 MySQL
【MySQL】根据binlog日志获取回滚sql的一个开发思路
【MySQL】根据binlog日志获取回滚sql的一个开发思路
|
14天前
|
JavaScript 安全 Java
java版药品不良反应智能监测系统源码,采用SpringBoot、Vue、MySQL技术开发
基于B/S架构,采用Java、SpringBoot、Vue、MySQL等技术自主研发的ADR智能监测系统,适用于三甲医院,支持二次开发。该系统能自动监测全院患者药物不良反应,通过移动端和PC端实时反馈,提升用药安全。系统涵盖规则管理、监测报告、系统管理三大模块,确保精准、高效地处理ADR事件。
|
25天前
|
关系型数据库 MySQL Java
MySQL索引优化与Java应用实践
【11月更文挑战第25天】在大数据量和高并发的业务场景下,MySQL数据库的索引优化是提升查询性能的关键。本文将深入探讨MySQL索引的多种类型、优化策略及其在Java应用中的实践,通过历史背景、业务场景、底层原理的介绍,并结合Java示例代码,帮助Java架构师更好地理解并应用这些技术。
25 2
|
1月前
|
监控 前端开发 Java
【技术开发】接口管理平台要用什么技术栈?推荐:Java+Vue3+Docker+MySQL
该文档介绍了基于Java后端和Vue3前端构建的管理系统的技术栈及功能模块,涵盖管理后台的访问、登录、首页概览、API接口管理、接口权限设置、接口监控、计费管理、账号管理、应用管理、数据库配置、站点配置及管理员个人设置等内容,并提供了访问地址及操作指南。
|
2月前
|
SQL JavaScript 关系型数据库
node博客小项目:接口开发、连接mysql数据库
【10月更文挑战第14天】node博客小项目:接口开发、连接mysql数据库
|
2月前
|
架构师 关系型数据库 MySQL
MySQL最左前缀优化原则:深入解析与实战应用
【10月更文挑战第12天】在数据库架构设计与优化中,索引的使用是提升查询性能的关键手段之一。其中,MySQL的最左前缀优化原则(Leftmost Prefix Principle)是复合索引(Composite Index)应用中的核心策略。作为资深架构师,深入理解并掌握这一原则,对于平衡数据库性能与维护成本至关重要。本文将详细解读最左前缀优化原则的功能特点、业务场景、优缺点、底层原理,并通过Java示例展示其实现方式。
115 1
|
2月前
|
SQL 关系型数据库 MySQL
PHP与MySQL协同工作的艺术:开发高效动态网站
在这个后端技术迅速迭代的时代,PHP和MySQL的组合仍然是创建动态网站和应用的主流选择之一。本文将带领读者深入理解PHP后端逻辑与MySQL数据库之间的协同工作方式,包括数据的检索、插入、更新和删除操作。文章将通过一系列实用的示例和最佳实践,揭示如何充分利用这两种技术的优势,构建高效、安全且易于维护的动态网站。