2025最新版Tauri2.8+Vite7.1+Vue3+ElementPlus客户端聊天软件Exe

175 阅读2分钟

经过两周爆肝开发,新版tauri2.8+vite7+vue3跨平台仿微信电脑端聊天系统正式完结了。

360截图20251021233301426.png

360截图20251021223625471.png

运用技术

  • 开发工具:VScode
  • 跨平台框架:Tauri2.8
  • 前端技术框架:vite^7.1.10+vue^3.5.22+vue-router^4.6.3
  • 状态管理:pinia^3.0.3
  • 本地存储:pinia-plugin-persistedstate^4.5.0
  • 组件库:element-plus^2.11.5
  • 富文本编辑器:@vueup/vue-quill^1.2.0
  • 样式预处理:sass^1.93.2
  • 短视频滑动插件:swiper^12.0.2

p2.gif

p3.gif

项目结构框架目录

基于最新跨平台技术Tauri2.8结合Vite7.1搭建项目模板,采用vue3 setup语法糖编码开发。

360截图20251021221317391.png

360截图20251021225246968.png

入口文件main.js

引入路由/状态管理,公共组件配置。

import { createApp } from 'vue'
import './style.scss'
import App from './App.vue'

// 引入组件库
import VEPlus from 've-plus'
import 've-plus/dist/ve-plus.css'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'

// 引入路由/状态配置
import Router from './router'
import Pinia from './pinia'

createApp(App)
.use(VEPlus)
.use(ElementPlus)
.use(Router)
.use(Pinia)
.mount('#app')

360截图20251021225652352.png

项目公共布局模板

ffda48ad34b665a9df18e0a15911beac_1289798-20251022100625641-451414564.png

如下图:整体布局分为左侧菜单栏、侧边栏、主内容区三个大板块。

1e1c17c26b800e9c431aa91f636b599b_1289798-20251022100450393-1367708418.png

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

360截图20251021221317398.png

360截图20251021222634106.png

360截图20251021224438242.png

360截图20251021224712920.png

360截图20251021230007463.png

001360截图20251021234042701.png

002360截图20251021234640542.png

003360截图20251021235056245.png

003360截图20251021235423515.png

004360截图20251021235656902.png

004360截图20251022000224472.png

005360截图20251022000737083.png

005360截图20251022000944690.png

006360截图20251022001924526.png

007360截图20251022002253010.png

008360截图20251022002911608.png

008360截图20251022003016872.png

008360截图20251022003420305.png

008360截图20251022003858382.png

008360截图20251022005139749.png

008360截图20251022005409707.png

008360截图20251022005500412.png

009360截图20251022072109849.png

011360截图20251022072827066.png

vue3+tauri2自定义无边框阴影圆角窗体|系统导航条

image.png

bc3c16d4f624980b49c9701f3c41c33c_1289798-20251022103143509-1312140525.png

<!-- 自定义系统导航条 -->

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

tauri2.x创建多窗体管理

013360截图20251022074406464.png

/**
 * 创建新窗口
 * @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,
  })
}

001360截图20251021234207684.png

002360截图20251021234307824.png

007360截图20251022002335064.png

010360截图20251022072550552.png

tauri2+vue3自定义系统托盘|消息闪烁|右键菜单

p7.gif

501e62318f6793ca130f46bb470ee16a_1289798-20251022104040740-431127253.png

/**
 * 自定义托盘图标
 */

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

2025最新款Electron38+Vite7+Vue3+ElementPlus电脑端后台admin系统

基于electron38+vite7+vue3 setup+elementPlus电脑端仿微信/QQ聊天软件

electron38.2-vue3os系统|Vite7+Electron38+Pinia3+ArcoDesign桌面版OS管理系统

最新版Vite7+Vue3+Pinia3+ArcoDesign网页版webos后台管理系统

基于uniapp+vue3+uvue仿抖音app短视频+聊天+直播app系统

Flutter3.x深度融合短视频+直播+聊天app实例

基于uniapp+vue3+deepseek+markdown搭建app版流式输出AI模板

vue3.5+deepseek+arco+markdown搭建web版流式输出AI模板

unios-admin手机版后台|uniapp+vue3全端admin管理系统

基于flutter3.32+window_manager仿macOS/Wins风格桌面os系统

flutter3.27+bitsdojo_window电脑端仿微信Exe应用

自研tauri2.0+vite6.x+vue3+rust+arco-design桌面版os管理系统Tauri2-ViteOS

基于uni-app+vue3+uvui跨三端仿微信app聊天模板