最新版实战vite7.1+vue3+element-plus仿微信web聊天模板

举报
yxybox 发表于 2025/09/06 10:56:58 2025/09/06
【摘要】 基于vite7.1+vue3.5+pinia3+element-plus从0-1仿微信网页版聊天系统模板。

2025最新研发vite7+vue3+element-plus纯手撸开发仿微信网页版聊天系统。实现了聊天、联系人、收藏、朋友圈、小视频、我的等模块。


012360截图20250904001027805.png


使用技术

  • 技术框架:vite7.1+vue3.5+vue-router4.5+pinia3
  • 组件库:element-plus^2.11.1 (饿了么网页端vue3组件库)
  • 状态管理:pinia^3.0.3
  • 视频滑动:swiper^11.2.10
  • 富文本编辑器:wangeditor^4.7.15
  • 样式编译:sass^1.91.0
  • 构建工具:vite^7.1.2


018360截图20250904001549125.png

p2.gif

p3.gif


项目结构框架

使用最新vite7构建工具搭建项目。


360截图20250905073642668.png

011360截图20250903235835045.png

p5.gif



项目入口配置

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

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

// 引入路由/状态管理
import Router from './router'
import Pinia from './pinia'

const app = createApp(App)

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


002360截图20250903225137409.png

002360截图20250903232544731.png

002360截图20250903232828291.png

003360截图20250903233033123.png

005360截图20250903233218652.png

005360截图20250903233712315.png


vue3-router路由管理

import { createRouter, createWebHashHistory } from 'vue-router'
import { authState } from '@/pinia/modules/auth'

import Layout from '@/layouts/index.vue'

// 批量导入路由
const modules = import.meta.glob('./modules/*.js', { eager: true })
console.log(modules)
const patchRouters = Object.keys(modules).map(key => modules[key].default).flat()
console.log(patchRouters)

/**
 * meta配置
 * @param meta.requireAuth 需登录验证页面
 * @param meta.hideWinBar 隐藏右上角按钮组
 * @param meta.hideMenuBar 隐藏菜单栏
 * @param meta.showSideBar 显示侧边栏
 * @param meta.canGoBack 是否可回退上一页
 */
const routes = [
  ...patchRouters,
  // 错误模块
  {
    path: '/:pathMatch(.*)*',
    redirect: '/404',
    component: Layout,
    meta: {
      title: '404error',
      hideMenuBar: true,
      hideWinBar: true,
    },
    children: [
      {
        path: '404',
        component: () => import('@/views/error/404.vue'),
      }
    ]
  },
]

const router = createRouter({
  history: createWebHashHistory(),
  routes,
})

// 全局路由钩子拦截
router.beforeEach((to, from) => {
  const authstate = authState()
  if(to?.meta?.requireAuth && !authstate.authorization) {
    return {
      path: '/login'
    }
  }
})

router.afterEach((to, from) => {
  // 阻止浏览器回退
  if(to?.meta?.canGoBack == false && from.path != null) {
    history.pushState(history.state, '', document.URL)
  }
})

router.onError(error => {
  console.warn('[Router Error]', error)
})

export default router


010360截图20250903235718188.png

011360截图20250903235921902.png

011360截图20250904000235421.png

011360截图20250904000428421.png

013360截图20250904001118030.png

014360截图20250904001148829.png

015360截图20250904001225078.png


项目布局模板

<script setup>
  import { useRoute } from 'vue-router'
  import { appState } from '@/pinia/modules/app'

  import MenuBar from './components/menubar/index.vue'
  import SideBar from './components/sidebar/index.vue'
  import Winbtn from './components/winbtn.vue'

  const route = useRoute()
  const appstate = appState()
</script>

<template>
  <div class="vu__container" :class="{'fullscreen': appstate.config.fullscreen}" :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" :class="{'hidden': appstate.config.collapsed}">
          <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">
          <Winbtn v-if="!route?.meta?.hideWinBar" />
          <router-view v-slot="{ Component, route }">
            <keep-alive>
              <component :is="Component" :key="route.path" />
            </keep-alive>
          </router-view>
        </div>
      </div>
    </div>
  </div>
</template>

018360截图20250904001657318.png


感谢小伙伴的阅读与支持,后续还会继续分享更多优质项目。

最新版uni-app+vue3+uvui跨三端手机桌面OA管理系统

Flutter3.32实战桌面端OS系统|flutter3仿macOS桌面

flutter3.27跨平台仿微信客户端聊天Exe程序|朋友圈|短视频

原创uniapp+vite5+vue3+uv-ui跨三端短视频+直播+聊天app应用

uni-app+deepseek-v3跨三端ai流式输出对话模板

flutter3+deepseek手机端ai流式输出聊天模板

实战跨平台Electron35+DeepSeek-V3搭建客户端AI模板

deepseek-v3+vue3.5网页版webai流式对话模板

Flutter3.27跨平台仿抖音商城|flutter3.x实战短视频+直播+聊天程序

原创tauri2.0+vue3.5+element-plus桌面版后台管理系统

Electron32-Vite5-OS跨平台os模板|electron32+vue3通用os系统

Electron31_Vite5_Wechat跨平台聊天实例|electron31仿微信实战

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。