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


Posted in Javascript onApril 30, 2019

一、项目介绍

基于Vue2.5.6+Vuex+vue-cli+vue-router+vue-gemini-scrollbar+swiper+elementUI等技术混合架构开发的仿微信web端聊天室——vueWebChat,实现了发送消息、表情(动图),图片、视频预览,右键菜单、截屏、截图可直接粘贴至文本框进行发送。

二、技术框架

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

◆ 点击右上角最大化按钮,可以进行全屏切换

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

◆ 引入公共及全局组件配置components.js

/*
 引入公共及全局组件配置
*/ 
// 引入侧边栏及联系人
import winBar from './components/winbar'
import sideBar from './components/sidebar'
import recordList from './components/recordList'
import contactList from './components/contact'
// 引入jquery
import $ 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

◆ 主页面模板

<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>
<script>
export default {
 name: 'app',
 data () {
 return {
 }
 },
 methods: {
 },
}
</script>
<style>
/* 引入公共样式 */
@import './assets/fonts/iconfont.css';
@import './assets/css/reset.css';
@import './assets/css/layout.css';
</style>

◆ 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切换模块】--------------------------
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+web端仿微信网页版聊天室功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
一个简单的js鼠标划过切换效果
Jun 30 Javascript
兼容主流浏览器的iframe自适应高度js脚本
Jan 10 Javascript
javascript学习笔记(三)BOM和DOM详解
Sep 30 Javascript
最精简的JavaScript实现鼠标拖动效果的方法
May 11 Javascript
js实现网站最上边可关闭的浮动广告条代码
Sep 04 Javascript
实践中学习AngularJS表单
Mar 21 Javascript
JS实现左右无缝轮播图代码
May 01 Javascript
JS数组操作(数组增加、删除、翻转、转字符串、取索引、截取(切片)slice、剪接splice、数组合并)
May 20 Javascript
Angular中$cacheFactory的作用和用法实例详解
Aug 19 Javascript
详解使用grunt完成requirejs的合并压缩和js文件的版本控制
Mar 02 Javascript
深入理解Angular4订阅(Subscribe)与取消
Nov 22 Javascript
JS实现秒杀倒计时特效
Jan 02 Javascript
JSON是什么?有哪些优点?JSON和XML的区别?
Apr 29 #Javascript
详解iframe跨域的几种常用方法(小结)
Apr 29 #Javascript
详解JS实现系统登录页的登录和验证
Apr 29 #Javascript
实例详解vue中的$root和$parent
Apr 29 #Javascript
微信网页登录逻辑与实现方法
Apr 29 #Javascript
vue和better-scroll实现列表左右联动效果详解
Apr 29 #Javascript
Vue 引入AMap高德地图的实现代码
Apr 29 #Javascript
You might like
PHP新手上路(四)
2006/10/09 PHP
PHP 循环列出目录内容的函数代码
2010/05/26 PHP
mongo Table类文件 获取MongoCursor(游标)的实现方法分析
2013/07/01 PHP
PHP封装的一个支持HTML、JS、PHP重定向的多功能跳转函数
2014/06/19 PHP
yii分页组件用法实例分析
2015/12/28 PHP
node.js中的fs.link方法使用说明
2014/12/15 Javascript
jQuery中focus事件用法实例
2014/12/26 Javascript
Javascript基础教程之比较操作符
2015/01/18 Javascript
JavaScript中实现Map的示例代码
2015/09/09 Javascript
纯js代码实现简单计算器
2015/12/02 Javascript
巧用数组制作图片切换js代码
2016/11/29 Javascript
详解使用mpvue开发github小程序总结
2018/07/25 Javascript
jQuery+PHP实现上传裁剪图片
2020/06/29 jQuery
灵活使用console让js调试更简单的方法步骤
2019/04/23 Javascript
vue实现一个获取按键展示快捷键效果的Input组件
2021/01/13 Vue.js
[03:11]2014DOTA2国际邀请赛-VG掉入败者组 独家专访357
2014/07/19 DOTA
python算法学习之计数排序实例
2013/12/18 Python
Python进行数据提取的方法总结
2016/08/22 Python
HTML中使用python屏蔽一些基本功能的方法
2017/07/07 Python
浅谈用VSCode写python的正确姿势
2017/12/16 Python
使用Python爬了4400条淘宝商品数据,竟发现了这些“潜规则”
2018/03/23 Python
Python实现批量读取图片并存入mongodb数据库的方法示例
2018/04/02 Python
Python+selenium实现自动循环扔QQ邮箱漂流瓶
2018/05/29 Python
python中文编码与json中文输出问题详解
2018/08/24 Python
详解django中使用定时任务的方法
2018/09/27 Python
python实现大量图片重命名
2020/03/23 Python
python程序需要编译吗
2020/06/19 Python
如何使用Python进行PDF图片识别OCR
2021/01/22 Python
里程积分管理买卖交换平台:Points.com
2017/01/13 全球购物
大韩航空官方网站:Korean Air
2017/10/25 全球购物
linux面试题参考答案(11)
2016/11/26 面试题
委托书范本
2014/04/02 职场文书
团支部建设方案
2014/05/02 职场文书
酒店管理毕业生自荐信
2014/05/25 职场文书
给老婆的检讨书
2015/01/27 职场文书
2015年社区反邪教工作总结
2015/10/14 职场文书