vue+h5仿微信网页版聊天室vueWebChat项目

栏目: JavaScript · 发布时间: 5年前

内容简介:很早之前就有使用html5技术开发过一个

很早之前就有使用html5技术开发过一个 web版仿微信、微博聊天 ,后来想着用vue技术开发一版,后面由于各种事情,一直没能落定。最近有些空闲就使用vue开发了一个 vueWechat聊天室IM 项目。 基于Vue2.5.6+Vuex+vue-router+vue-gemini-scrollbar+swiper+elementUI等技术开发,实现了发送消息、表情(动图),图片、视频预览,仿微信右键菜单、网页截图可直接粘贴至编辑框发送。 

vue技术选型

  • MVVM框架:Vue2.5.6
  • 状态管理:Vuex
  • 页面路由:Vue-router
  • iconfont图标:阿里巴巴字体图标库
  • 自定义滚动条:vue-gemini-scrollbar
  • 弹窗组件:element-ui(饿了么前端UI库)
  • 环境配置:node.js + cnpm + webpack
  • 高德地图:vue-amap
  • 图片预览:vue-photo-preview

项目预览图

vue+h5仿微信网页版聊天室vueWebChat项目

vue+h5仿微信网页版聊天室vueWebChat项目

vue+h5仿微信网页版聊天室vueWebChat项目

vue+h5仿微信网页版聊天室vueWebChat项目

vue+h5仿微信网页版聊天室vueWebChat项目

vue+h5仿微信网页版聊天室vueWebChat项目

vue+h5仿微信网页版聊天室vueWebChat项目

vue+h5仿微信网页版聊天室vueWebChat项目

vue+h5仿微信网页版聊天室vueWebChat项目

vue+h5仿微信网页版聊天室vueWebChat项目

vue+h5仿微信网页版聊天室vueWebChat项目

vue+h5仿微信网页版聊天室vueWebChat项目

vue+h5仿微信网页版聊天室vueWebChat项目

主页面app.vue模板

<template>  <div id="app">    <div class="vChat-wrapper flexbox flex-alignc">      <div class="vChat-panel" style="background-image: url(src/assets/img/placeholder/vchat__panel-bg01.jpg);">        <div class="vChat-inner flexbox">          <!-- //顶部按钮(最大、最小、关闭) -->          <win-bar></win-bar>
          <!-- //侧边栏 -->          <side-bar></side-bar>
          <keep-alive>            <router-view class="flex1 flexbox"></router-view>          </keep-alive>
        </div>      </div>    </div>  </div></template>复制代码

公共模块插件引入

/*    引入公共及全局组件配置    Q:282310962    https://www.cnblogs.com/xiaoyan2017*/ 
// 引入侧边栏及联系人import winBar from './components/winbar'import sideBar from './components/sidebar'import recordList from './components/recordList'import contactList from './components/contact'
// 引入jqueryimport $ from 'jquery'
// 引入wcPop弹窗插件import wcPop from './assets/js/wcPop/wcPop'import './assets/js/wcPop/skin/wcPop.css'
// 引入饿了么pc端UI库import elementUI from 'element-ui'import 'element-ui/lib/theme-chalk/index.css'
// 引入图片预览插件import photoPreview from 'vue-photo-preview'import 'vue-photo-preview/dist/skin.css'
// 引入自定义滚动条插件import geminiScrollbar from 'vue-gemini-scrollbar'
// 引入加载更多插件import infiniteLoading from 'vue-infinite-scroll'
// 引入高德地图import vueAMap from 'vue-amap'

const install = Vue => {    // 注册组件    Vue.component('win-bar', winBar)    Vue.component('side-bar', sideBar)    Vue.component('record-list', recordList)    Vue.component('contact-list', contactList)
    // 应用实例    Vue.use(elementUI)    Vue.use(photoPreview, {        loop: false,        fullscreenEl: true, //是否全屏        arrowEl: true, //左右按钮    });    Vue.use(geminiScrollbar)    Vue.use(infiniteLoading)    Vue.use(vueAMap)    vueAMap.initAMapApiLoader({        key: "e1dedc6bdd765d46693986ff7ff969f4",        plugin: [            "AMap.Autocomplete", //输入提示插件            "AMap.PlaceSearch", //POI搜索插件            "AMap.Scale", //右下角缩略图插件 比例尺            "AMap.OverView", //地图鹰眼插件            "AMap.ToolBar", //地图 工具 条            "AMap.MapType", //类别切换控件,实现默认图层与卫星图、实施交通图层之间切换的控制            "AMap.PolyEditor", //编辑 折线多,边形            "AMap.CircleEditor", //圆形编辑器插件            "AMap.Geolocation" //定位控件,用来获取和展示用户主机所在的经纬度位置        ],        uiVersion: "1.0"    });
}
export default install复制代码

vue截图文本框粘贴发送

// 【截图粘贴图片】
document.getElementById('J__wcEditor').addEventListener('paste',function(e){
    var cbd = e.clipboardData;
    var ua = window.navigator.userAgent;
    // 没有数据
    if (!(e.clipboardData && e.clipboardData.items)) {
        return;
    }
    // Mac平台下Chrome49版本以下 复制Finder中的文件的Bug Hack掉
    if(cbd.items && cbd.items.length === 2 && cbd.items[0].kind === "string" && cbd.items[1].kind === "file" &&
        cbd.types && cbd.types.length === 2 && cbd.types[0] === "text/plain" && cbd.types[1] === "Files" &&
        ua.match(/Macintosh/i) && Number(ua.match(/Chrome\/(\d{2})/i)[1]) < 49){
        return;
    }
    for(var i = 0; i < cbd.items.length; i++){
        var item = cbd.items[i];
        console.log(item);
        console.log(item.kind);
        if(item.kind == "file"){
            var blob = item.getAsFile();
            if(blob.size === 0){
                return;
            }
            // 插入图片记录
            var reader = new FileReader();
            reader.readAsDataURL(blob);
            reader.onload = function(){
                var _img = this.result;

                var _tpl = [
                    '<li class="me">\
                        <div class="content">\
                            <p class="author">王梅(Fine)</p>\
                            <div class="msg picture"><img class="img__pic" src="'+ _img + '" preview="1" /></div>\
                        </div>\
                        <a class="avatar" href="/contact/uinfo"><img src="src/assets/img/uimg/u__chat-img11.jpg" /></a>\
                    </li>'
                ].join("");
                $("#J__chatMsgList").append(_tpl);

                setTimeout(() => {
                    $("#J__geminiScrollbar .gm-scroll-view").animate({ scrollTop: $("#J__chatMsgList").height() }, 0);
                    $(".fixGeminiscrollHeight").show();
                    setTimeout(() => { $(".fixGeminiscrollHeight").hide();}, 300);
                }, 17);
            }
        }
    }
});
复制代码

表情图swiper处理及视频播放

// >>> 【表情、动图swiper切换模块】--------------------------
var emotionSwiper;
function setEmotionSwiper(tmpl) {
    var _tmpl = tmpl ? tmpl : $("#J__emotionFootTab ul li.cur").attr("tmpl");
    $("#J__swiperEmotion .swiper-container").attr("id", _tmpl);
    $("#J__swiperEmotion .swiper-wrapper").html($("." + _tmpl).html());

    emotionSwiper = new Swiper('#' + _tmpl, {
        // loop: true,
        // autoplay: true,
        // 分页器
        pagination: {
            el: '.pagination-emotion', clickable: true,
        },
    });
}
// 表情模板切换
$("body").on("click", "#J__emotionFootTab ul li.swiperTmpl", function () {
    // 先销毁swiper
    emotionSwiper && emotionSwiper.destroy(true, true);
    var _tmpl = $(this).attr("tmpl");
    $(this).addClass("cur").siblings().removeClass("cur");

    setEmotionSwiper(_tmpl);
});


// >>> 【视频预览模块】--------------------------
$("body").on("click", "#J__chatMsgList li .video", function () {
    var _src = $(this).find("img").attr("videoUrl"), _video;
    var videoIdx = wcPop({
        id: 'wc__previewVideo',
        skin: 'fullscreen',
        // content: '<video id="J__videoPreview" width="100%" height="100%" controls="controls" x5-video-player-type="h5" x5-video-player-fullscreen="true" webkit-playsinline preload="auto"></video>',
        content: '<video id="J__videoPreview" width="100%" height="100%" controls="controls" preload="auto"></video>',
        shade: false,
        xclose: true,
        style: 'background: #000;padding-top:48px;',
        anim: 'scaleIn',
        show: function(){
            _video = document.getElementById("J__videoPreview");
            _video.src = _src;
            if (_video.paused) {
                _video.play();
            } else {
                _video.pause();
            }
            // 播放结束
            _video.addEventListener("ended", function(){
                _video.currentTime = 0;
            });
            // 退出全屏
            _video.addEventListener("x5videoexitfullscreen", function(){
                wcPop.close(videoIdx);
            })
        }
    });
});
复制代码

vue+h5仿微信网页版聊天室vueWebChat项目


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Beginning ASP.NET 4 in C# and Vb

Beginning ASP.NET 4 in C# and Vb

Imar Spaanjaars / Wrox / 2010-3-19 / GBP 29.99

This book is for anyone who wants to learn how to build rich and interactive web sites that run on the Microsoft platform. With the knowledge you gain from this book, you create a great foundation to ......一起来看看 《Beginning ASP.NET 4 in C# and Vb》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具