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

很早之前就有使用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

项目预览图














主页面app.vue模板

复制代码

公共模块插件引入

/*    引入公共及全局组件配置    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 = [
                    '
  • \
    \

    王梅(Fine)

    \
    '" preview="1" />
    \
    \ \
  • '
    ].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: '',
            content: '',
            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);
                })
            }
        });
    });
    复制代码


    转载于:https://juejin.im/post/5cc919bbe51d453a7d63b6bf

    你可能感兴趣的:(vue+h5仿微信网页版聊天室vueWebChat项目)