vue+element+electron仿微信实现代码

目录
  • 一.仿得太像了有木有~
    • 1.登录窗口
    • 2.主窗口
  • 二.构思,以微信设计布局构思
  • 三.构建项目
  • 四.总结

一.仿得太像了有木有~

1.登录窗口

2.主窗口

二.构思,以微信设计布局构思

  • 以微信布局构思,参考element提供的组件;
  • element提供的tabs标签页刚好能实现切换效果,element tabs 标签页
  • element tabs标签页虽然能达到切换效果,但是样式是在差异较大,所以需要自主编写样式覆盖element tabs标签页默认样式,以达到微信ui的样式效果,毫无疑问这是最大挑战,也是最核心的工作了;
  • 右边的内容都由左边的tab切换而来,所以最左边是一个tabs列表,最右边消息窗口和发送窗口由每一个不同的会话点击切换而来,所以消息会话列表也决定用tabs标签页来实现;
  • 登录窗口和主窗口采用同一个窗口,主要是考虑到vue项目主骨架一体的问题,为了简单方便,当然也可以创建不同的窗口来实现,问题不大;
  • 整体构思完整,可以动手了。

三.构建项目

当然这里不会详细真的手把手教你创建项目,因为官方文档都很详细,不做多余的工作哈~

直接看官方文档,收益更大:

electron官方文档

1.可以理解electron为我们提供一个应用的盒子,盒子里面还是与普通网页、网站实现一样,同时提供应用特有的功能,能与网页进行通讯和交互

electron主脚本与vue不一样,electron的是background.js,vue的是main.js,两者不冲突,可以理解为两个不同的框架

2.创建登录窗口:

win = new BrowserWindow({
    width: 230,
    height: 350,
    maximizable: false,
    minimizable: true,
    center: true,
    title: "爱芳芳防微信",
    icon: winIcon, // sets window icon
   //menu: null,
    resizable: false,
    frame: false,
    webPreferences: {
      nodeIntegration: process.env.ELECTRON_NODE_INTEGRATION,
      webviewTag: false,
      webSecurity: false,
      plugins: true,
    },
  });
  win.on("move", (arg1) => {
    return;
  });

  win.setAlwaysOnTop(true);
  if (process.env.WEBPACK_DEV_SERVER_URL) {
    let startPage = process.env.WEBPACK_DEV_SERVER_URL + "/index.html";
    //win.loadURL(website.appUrl);
    win.loadURL(startPage);
    console.info("[win]当前访问地址:" + startPage);
    win.webContents.openDevTools();
    //win.webContents.openDevTools();
  } else {
    createProtocol("app");
    //win.loadURL(website.appUrl);
    win.loadURL(`file://${__dirname}/index.html`);
    console.info(
      "[win][index]当前访问地址:" + process.env.WEBPACK_DEV_SERVER_URL
    );
  }

3.登录完成创建主窗口,不如说是变化窗口大小,跳转到主页面:

function initHomeWin(){//设置窗口
  win.webContents.send('homeWin');
  win.hide();
  //延时居中窗口
  setTimeout(function(){
    win.setSize(1000, 600, true);
    win.center();
    win.show();
  },1000);
}

4.首页tabs,覆盖element默认样式:

<template>
    <div style="" class="menu-tab">
        <div style="width: 55px;height: 50px;position: absolute;top: 30px;z-index: 99;text-align: center;">

            <el-popover
                    placement="right"
                    width="250"
                    trigger="click">
                <div>
                    <div style="display: flex;margin: 10px;overflow: hidden;">
                        <div>
                            <el-image :src="avatar" style="width: 60px;height: 60px; border-radius: 5px;"></el-image>
                        </div>
                        <div style="margin-left: 10px;">
                            <div style="font-size: 16px;color: #000;">
                                爱芳芳
                                <i class="el-icon-s-custom" style="color: #35c4de;"></i>
                            </div>
                            <div style="font-size: 14px;color: gray;">
                                微信号:love_fang
                            </div>
                            <div style="font-size: 14px;color: gray;">
                                地区:北京
                            </div>
                        </div>
                    </div>
                    <div style="text-align: center;border-top: 1px solid #f0f0f0;padding-top: 20px;">
                        <el-button type="success" size="small" style="width: 110px;">发消息</el-button>
                    </div>
                </div>
                <el-image :src="avatar" slot="reference" style="width: 36px;height: 36px; border-radius: 5px;cursor: pointer;"></el-image>
            </el-popover>
        </div>
        <el-tabs tab-position="left" v-model="activeName" @tab-click="loadTab">
            <el-tab-pane label="" name="first" key="first">
                <span slot="label" :class="(menuText==='first'?'menu-active':'menu-icon')">
                    <el-badge :value="unReadNum" :max="99" :hidden="unReadNum === 0" class="item">
                        <i class="el-icon-chat-round"></i>
                    </el-badge>
                </span>
                <menu-chat @refreshUnReadNum="refreshUnReadNum"></menu-chat>
            </el-tab-pane>
            <el-tab-pane label="" name="second" key="second">
                <span slot="label" :class="(menuText==='second'?'menu-active':'menu-icon')"><i class="el-icon-s-check"></i></span>
            </el-tab-pane>
            <el-tab-pane label="" name="third" key="third">
                <span slot="label" :class="(menuText==='third'?'menu-active':'menu-icon')"><i class="el-icon-collection"></i></span>
            </el-tab-pane>
            <el-tab-pane label="" name="fourth" key="fourth">
                <span slot="label" :class="(menuText==='fourth'?'menu-active':'menu-icon')"><i class="el-icon-folder-opened"></i></span>
            </el-tab-pane>
            <el-tab-pane label="" name="fifth" key="fifth">
                <span slot="label" :class="(menuText==='fifth'?'menu-active':'menu-icon')"><i class="el-icon-orange"></i></span>
            </el-tab-pane>
        </el-tabs>
    </div>
</template>

<script>
    import menuChat from '@/views/index/menu_chat/index.vue';
    export default {
        name: "homeWin",
        components:{
            menuChat:menuChat,
        },
        data() {
            return {
                unReadNum: 121,//总未读数量
                activeName:'first',
                menuText: 'first',
                avatar: 'https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fc-ssl.duitang.com%2Fuploads%2Fblog%2F202106%2F22%2F20210622154903_3c36a.thumb.1000_0.jpeg&refer=http%3A%2F%2Fc-ssl.duitang.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1672907135&t=77ba3e01d433d87c1e0ea51f9aa39dd3'
            };
        },
        watch: {
        },
        created() {
        },
        mounted() {

        },
        methods: {
            loadTab(tab, event) {//切换消息列表
                this.menuText = tab.name;
            },
            refreshUnReadNum(subNum){//刷新消息总未读数量
                console.info('subNum=' + subNum);
                if(subNum && subNum > 0){
                    this.unReadNum = this.unReadNum - subNum;
                    if(this.unReadNum < 0){
                        this.unReadNum = 0;
                    }
                }
            }
        }
    };
</script>

<style>
    .menu-tab{
        height: 100%!important;
    }
    .menu-tab>.el-tabs{
        height: 100%!important;
    }
    .menu-tab>.el-tabs>.el-tabs__header{
        height: 100%!important;
    }
    .menu-tab>.el-tabs>.el-tabs__header .el-tabs__nav-wrap{
        height: 100%!important;
    }
    .menu-tab>.el-tabs>.el-tabs__header .el-tabs__nav{
        height: 100%!important;
    }

    .menu-tab>.el-tabs>.el-tabs__header .el-tabs__nav-scroll{
        height: 100%!important;
        background-color: rgb(46,46,46)!important;
    }

    .menu-tab .is-left{
        margin-right: 0!important;
    }
    .menu-tab .el-tabs__active-bar{
        display: none!important;
    }
    .menu-tab>.el-tabs>.el-tabs__header .el-tabs__item{
        width: 55px;
        padding: 0!important;
        text-align: center!important;
    }
    .menu-tab #tab-first{
        margin-top: 60px!important;
    }
    .menu-icon{
        font-size: 20px!important;
        color: #cccccc !important;
    }
    .menu-active{
        font-size: 20px!important;
        color: rgb(7,193,96)!important;
    }
    .menu-tab .el-tabs__content{
        height: 100%!important;
    }
    .menu-tab .el-tab-pane{
        height: 100%!important;
    }
</style>

5.增加头像点击出卡片效果:

6.切换消息会话,每一个消息会话共用一个页面,vue组件思想

更新已读未读消息数量

7.发送信息

四.总结

信息发送内容过大时样式会存在问题后续有更好的实现方式,将优化更换实现方式五.感谢看到这里,需要源码或有什么问题和想说的请私聊!

到此这篇关于vue+element+electron仿微信实现的文章就介绍到这了,更多相关vue+element+electron仿微信内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • vue + electron应用文件读写操作

    目录 vue + electron应用文件读写 正常操作流程 vue + electron应用文件读写 在使用electron制作桌面应用时,基本都会需要数据的存储. 如果要制作的应用并不复杂,完全可以将数据存储在本地文件当中,然后应用就可以通过这些文件进行数据的读写. 因为electron的主进程是支持node的,所以可以通过fs文件系统对文件完成读写操作. 正常操作流程 首先先创建一个vue项目, 可以使用vue cli进行创建 通过yarn serve命令测试是否能否运行成功,界面正常出现

  • vue+electron实现创建多窗口及窗口间的通信(实施方案)

    目录 一.前言 二.实施方案 1.创建多窗口 2.多窗口间的通信 三.后记 一.前言 对于一个桌面应用来说,有时候单独一个窗口用户使用起来会不太方便,比方说写日报或者查看文件等,若是在同一窗口内,我只能做一件事,不能边预览文件,边去查看聊天消息内容等.又或者是多个应用间相互关联的需要同步查看的事件,这都是极其不方便的.因此我们可以将某些集成到electron软件中的应用或者某些界面用单独的窗口打开(以下称为独立窗口). 二.实施方案 1.创建多窗口 首先我们从electron官网中找到创建窗口的

  • vue项目打包成桌面快捷方式(electron)的方法

    网上有很多相关的例子了,所以我只是把自己的问题记录一下. 1.把electron的官方例子clone下来 git clone https://github.com/electron/electron-quick-start 2.进入项目,输入以下命令,运行项目 npm install//下载依赖包 npm start//启动 3.弹出界面 4.接下来将自己的vue项目打包,运行npm run build 5.将打包的项目复制到electron-quick-start的根目录 6.重新运行一下 n

  • 关于electron-vue打包后运行白屏的解决方案

    目录 electron-vue打包后运行白屏的解决 electron-vue打包之后只有空白页问题 原因 electron-vue打包后运行白屏的解决 找到.electron-vue文件夹中的webpack.renderer.config.js文件,注释掉下面这段 然后再重新打包,问题解决. electron-vue打包之后只有空白页问题 原因 使用了history路由导致打包之后 只有空白页面,将路由改成hash之后就有显示了 以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们.

  • 用electron打包vue项目中的报错问题及解决

    目录 1.  首先一定要cd到项目的根目录 2.  接下来运行 如何用electron打包vue项目,请参见我的另一篇文章:如何用electron打包vue项目为桌面应用文件exe 这里,也要提到实际项目中的问题,可能有同志的目录结构和内容有些许差别,就我刚刚遇到的问题来说,常见的问题的有几个问题,以及解决办法如下: 1.  首先一定要cd到项目的根目录 (我这里是app)里面才能运行项目,再重新npm run build,不然的话很有可能出现 “ 系统找不到路径的问题 ”,成功的话会出现下面绿

  • vue+element+electron仿微信实现代码

    目录 一.仿得太像了有木有~ 1.登录窗口 2.主窗口 二.构思,以微信设计布局构思 三.构建项目 四.总结 一.仿得太像了有木有~ 1.登录窗口 2.主窗口 二.构思,以微信设计布局构思 以微信布局构思,参考element提供的组件: element提供的tabs标签页刚好能实现切换效果,element tabs 标签页: element tabs标签页虽然能达到切换效果,但是样式是在差异较大,所以需要自主编写样式覆盖element tabs标签页默认样式,以达到微信ui的样式效果,毫无疑问这

  • vue+web端仿微信网页版聊天室功能

    一.项目介绍 基于Vue2.5.6+Vuex+vue-cli+vue-router+vue-gemini-scrollbar+swiper+elementUI等技术混合架构开发的仿微信web端聊天室--vueWebChat,实现了发送消息.表情(动图),图片.视频预览,右键菜单.截屏.截图可直接粘贴至文本框进行发送. 二.技术框架 •MVVM框架:Vue2.5.6 •状态管理:Vuex •页面路由:Vue-router •iconfont图标:阿里巴巴字体图标库 •自定义滚动条:vue-gemi

  • laravel5.4+vue+element简单搭建的示例代码

    如今laravel来到5.4版本,更方便引入vue了,具体步骤如下: 1.下载laravel5.4,这边是下载地址(里面的配置文件都写得差不多了)! 2.打开package.json 内容如下 { "private": true, "scripts": { "dev": "node node_modules/cross-env/bin/cross-env.js NODE_ENV=development node_modules/webp

  • Vue.js仿微信聊天窗口展示组件功能

    源码:https://github.com/doterlin/vue-wxChat 演示地址:https://doterlin.github.io/vue-wxChat/ 运行 # install dependencies npm install # serve with hot reload at localhost:8080 npm run dev # build for production with minification npm run build 介绍 支持文本和图片的展示(后续将

  • Vue仿微信app页面跳转动画效果

    10:14:11独立开发者在开发移动端产品时,为了更高效,通常会使用Web技术来开发移动端项目,可以同时适配Android.iOS.H5,稍加改动还可适配微信小程序. 在使用Vue.js开发移动端页面的时候,默认的组件转场效果过于生硬,根本就没有动画效果.于是我用Vue提供的组件过渡功能,写了个仿微信app页面跳转的动画,以提高用户体验. 废话不多说,直接上图 在600元骁龙632安卓测试机效果流畅. 代码量很少,已上传至GitHub https://github.com/YellowDoing

  • react native 仿微信聊天室实例代码

    一.前言 9月,又到开学的季节.为每个一直默默努力的自己点赞!最近都沉浸在react native原生app开发中,之前也有使用vue/react/angular等技术开发过聊天室项目,另外还使用RN技术做了个自定义模态弹窗rnPop组件. 一.项目简述 基于react+react-native+react-navigation+react-redux+react-native-swiper+rnPop等技术开发的仿微信原生App界面聊天室--RN_ChatRoom,实现了原生app启动页.As

  • uniapp 仿微信的右边下拉选择弹出框的实现代码

    在百度找了很多 没有找到满意的 这里根据自己的需求 抽取一个组件 这个组件主要是包括搜索框和右边菜单点击弹出一个下拉筛选菜单 这里首先用一个单独的页面存放这个组件 <template> //这里是搜索框的输入框 不需要的可以删掉 <view> <view class="arrivalSearch"> <view class="arrivalSmallsearch"> <view class="arriv

  • vue swipeCell滑动单元格(仿微信)的实现示例

    抽离Vant weapp滑动单元格代码改造而成 带有拉动弹性回弹效果 demo展示:https://littaotao.github.io/me/index(切换为浏览器调试的手机模式并且再次刷新一次) <template> <div class="cell_container" @touchstart v-click-outside="handleClickOutside" @click="getClickHandler('cell')

  • iOS高仿微信表情输入功能代码分享

    最近项目需求,要实现一个类似微信的的表情输入,于是把微信的表情扒拉出来,实现了一把.可以从这里下载源码.看起来表情输入没有多少东西,不外乎就是用NSTextAttachment来实现图文混排,结果在实现的过程中遇到了很多小问题,接下来会一一介绍遇到过的坑.先上一张效果图: 一.实现表情选择View(WKExpressionView) 具体的实现就不细说了,主要功能就是点击表情时,将对应表情的图片名称通知给delegate. 二.实现表情textView(WKExpressionTextView)

  • iOS仿微信图片分享界面实现代码

    分享功能目前几乎已成为很多app的标配了,其中微信,微博等app的图片分享界面设计的很棒,不仅能够展示缩略图,还可以预览删除.最近我在做一款社交分享app,其中就要实现图文分享功能,于是试着自行实现仿微信分享风格的功能. 核心思想: 主要是使用UICollectionView来动态加载分享图片内容,配合预览页面,实现动态添加和预览删除图片效果. 实现效果: 核心代码如下: 分享界面: // // PostTableViewController.h // NineShare // // Creat

随机推荐