国庆期间爆肝升级,新款跨平台tauri2.12+vue3+pinia4仿微信/QQ界面聊天实例~
技术栈
- 开发工具:VScode
- 跨平台框架:Tauri2.12.0
- 前端技术框架:vite^8.3.4+vue^3.5.43+vue-router^5.4.0
- 状态管理:pinia^4.0.3
- 本地存储:pinia-plugin-persistedstate^4.7.1
- 组件库:element-plus^2.14.7
- 富文本编辑器:@vueup/vue-quill^1.5.5
- 样式管理:sass^1.105.0
- 短视频滑动组件:swiper^14.3.0
项目结构目录
tauri2-vue3chat基于最新跨平台框架tauri2.12+vite8.3构建项目模板。
taurichat实现类似QQ登录/主窗口切换,支持主题壁纸、自定义最大化/最小化/关闭按钮,新窗口打开朋友圈/短视频。聊天模块支持新开窗口预览图片/视频、拖拽图片到聊天区域。
项目布局结构
<template>
<div class="vu__chatbox">
<template v-if="!route?.meta?.isNewWin">
<div
class="vu__container flexbox flex-alignc flex-justifyc"
:style="{'--themeSkin': appstate.config.skin}"
>
<div class="vu__layout flexbox flex-col">
<div class="vu__layout-body flex1 flexbox" @contextmenu.prevent>
<!-- 菜单栏 -->
<slot v-if="!route?.meta?.hideMenuBar" name="menubar">
<MenuBar />
</slot>
<!-- 侧边栏 -->
<div v-if="route?.meta?.showSideBar" class="vu__layout-sidebar flexbox">
<aside class="vu__layout-sidebar__body flexbox flex-col">
<slot name="sidebar">
<SideBar />
</slot>
</aside>
</div>
<!-- 主内容区 -->
<div class="vu__layout-main flex1 flexbox flex-col">
<ToolBar v-if="!route?.meta?.hideToolBar" />
<router-view v-slot="{ Component, route }">
<keep-alive>
<component :is="Component" :key="route.path" />
</keep-alive>
</router-view>
</div>
</div>
</div>
</div>
</template>
<template v-else>
<WinLayout />
</template>
</div>
</template>
项目入口配置
import { createApp } from 'vue'
import './style.scss'
import App from './App.vue'
// 引入组件库
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
// 引入路由/状态配置
import Router from './router'
import Pinia from './pinia'
createApp(App)
.use(ElementPlus)
.use(Router)
.use(Pinia)
.mount('#app')
tauri2+vue3无边框阴影窗口
<!-- 自定义系统导航条 -->
<script setup>
import { ref } from 'vue'
import { isTrue } from '@/utils'
import { winSet } from '@/windows/actions'
import Winbtns from './btns.vue'
const props = defineProps({
// 标题
title: {type: String, default: ''},
// 标题颜色
color: String,
// 背景色
background: String,
// 标题是否居中
center: {type: [Boolean, String], default: false},
// 是否固定
fixed: {type: [Boolean, String], default: false},
// 背景是否镂空
transparent: {type: [Boolean, String], default: false},
// 层级
zIndex: {type: [Number, String], default: 2024},
/* 控制Winbtn参数 */
// 窗口是否可最小化
minimizable: {type: [Boolean, String], default: true},
// 窗口是否可最大化
maximizable: {type: [Boolean, String], default: true},
// 窗口是否可关闭
closable: {type: [Boolean, String], default: true},
// 关闭前回调,会暂停实例关闭 function(done),done用于关闭
beforeClose: Function
})
</script>
<template>
<div class="ev__winbar" :class="{'fixed': fixed || transparent, 'transparent': transparent}">
<div class="ev__winbar-wrap flexbox flex-alignc vu__drag">
<div class="ev__winbar-body flex1 flexbox flex-alignc">
<!-- 左侧区域 -->
<div class="ev__winbar-left"><slot name="left" /></div>
<!-- 标题 -->
<div class="ev__winbar-title" :class="{'center': center}">
<slot name="title">{{title}}</slot>
</div>
<!-- 右侧附加区域 -->
<div class="ev__winbar-extra vu__undrag"><slot name="extra" /></div>
</div>
<Winbtns :color="color" :minimizable="minimizable" :maximizable="maximizable" :closable="closable" :zIndex="zIndex" />
</div>
</div>
</template>
tauri+vite新开窗口管理
/**
* 创建新窗口
* @param {object} args 窗口配置参数 {label: 'home', url: '/home', width: 850, height: 610, ...}
*/
export async function winCreate(args) {
await emit('win-create', args)
}
// 主窗口
export async function mainWindow() {
await winCreate({
label: 'main',
url: '/',
title: 'TAURI-WINCHAT',
width: 850,
height: 620,
minWidth: 700,
minHeight: 450
})
}
// 登录窗口
export async function loginWindow() {
await winCreate({
label: 'main-login',
url: '/login',
title: '登录',
width: 320,
height: 420,
resizable: false,
maximizable: false,
alwaysOnTop: true
})
}
// 关于窗口
export async function aboutWindow() {
await winCreate({
label: 'win-about',
url: '/win/about',
title: '关于',
width: 320,
height: 350,
minWidth: 320,
minHeight: 350,
maximizable: false,
alwaysOnTop: true,
})
}
// 设置窗口
export async function settingWindow() {
await winCreate({
label: 'win-setting',
url: '/win/setting',
title: '设置',
width: 550,
height: 470,
resizable: false,
maximizable: false,
})
}
支持如下参数配置:
// 系统窗口参数(与tauri的new WebviewWindow()参数一致)
const windowBaseOptions = {
// 窗口唯一标识label
label: null,
// 窗口标题
title: '',
// 窗口路由地址
url: '',
// 宽度
width: 850,
// 高度
height: 620,
// 最小宽度
minWidth: null,
// 最小高度
minHeight: null,
// 窗口x坐标
x: null,
// 窗口y坐标
y: null,
// 窗口居中显示(当设置x/y,则需要设置为false)
center: true,
// 是否可缩放
resizable: true,
// 是否可最小化
minimizable: true,
// 是否可最大化
maximizable: true,
// 是否可关闭
closable: true,
// 最大化窗口
maximized: false,
// 父窗口句柄label
parent: null,
// 窗口是否置顶
alwaysOnTop: false,
// 是否显示窗口边框(要创建无边框窗口,将decorations参数设置为false)
decorations: false,
// 是否透明窗口
transparent: true,
// 是否显示窗口阴影
shadow: false,
// 创建时是否显示窗口
visible: false,
// 禁止系统拖放
dragDropEnabled: false
}
tauri+vue3自定义托盘/消息提醒
/**
* 自定义托盘图标
*/
use tauri::{
tray::{MouseButton, TrayIconBuilder, TrayIconEvent}, Emitter, Manager, Runtime
};
pub fn tray_create<R: Runtime>(app: &tauri::AppHandle<R>) -> tauri::Result<()> {
let _ = TrayIconBuilder::with_id("tray")
.tooltip("TAURI-WINCHAT")
.icon(app.default_window_icon().unwrap().clone())
.on_tray_icon_event(|tray, event| match event {
TrayIconEvent::Click {
id: _,
position,
rect: _,
button,
button_state: _,
} => match button {
MouseButton::Left {} => {
let windows = tray.app_handle().webview_windows();
for (key, value) in windows {
println!("点击左键: {}", key);
if key == "main-login" || key == "main" {
value.show().unwrap();
value.unminimize().unwrap();
value.set_focus().unwrap();
}
}
}
MouseButton::Right {} => {
println!("点击右键");
tray.app_handle().emit("tray_contextmenu", position).unwrap();
}
_ => {}
},
TrayIconEvent::Enter {
id: _,
position,
rect: _,
} => {
println!("鼠标滑过托盘");
tray.app_handle().emit("tray_mouseenter", position).unwrap();
}
TrayIconEvent::Leave {
id: _,
position,
rect: _,
} => {
println!("鼠标离开托盘");
tray.app_handle().emit("tray_mouseleave", position).unwrap();
}
_ => {}
})
.build(app);
Ok(())
}
Tauri2-Vite7Admin客户端管理后台|tauri2.9+vue3+element-plus后台系统
Tauri2.9+Vue3桌面版OS系统|vite7+tauri2+arcoDesign电脑端os后台模板
Electron38-Wechat电脑端聊天|vite7+electron38仿微信桌面端聊天系统
electron38-admin桌面端后台|Electron38+Vue3+ElementPlus管理系统
Electron38-Vue3OS客户端OS系统|vite7+electron38+arco桌面os后台管理
React19+Electron聊天室|electron41跨平台仿QQ/微信客户端聊天软件
React-WebOS网页版os系统|react19+zustand5+arco搭建web版os管理系统
react19-webai网页版AI模板|DeepSeek-V4+React19+Arco智能ai系统
React19-Admin后台管理系统|vite8+react19+arco+zustand通用后台模板
最新版Flutter3.41+Dart3.11仿写抖音APP直播+短视频+聊天应用程序
Vite8-Vue3-Admin网页版后台模板|vue3.5+pinia3+echarts后台管理系统