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 相关文章推荐
JavaScript中的类继承
Nov 25 Javascript
基于jQuery实现的文字按钮表单特效整理
Dec 07 Javascript
JavaScript中神奇的call()方法
Mar 12 Javascript
JScript中的条件注释详解
Apr 24 Javascript
在AngularJS框架中处理数据建模的方式解析
Mar 05 Javascript
bootstrap实现每隔5秒自动轮播效果
Dec 20 Javascript
AngularJS实现路由实例
Feb 12 Javascript
vue实现简单loading进度条
Jun 06 Javascript
vue.js 打包时出现空白页和路径错误问题及解决方法
Jun 26 Javascript
微信小程序webview组件交互,内联h5页面并网页实现微信支付实现解析
Aug 16 Javascript
在Layui 的表格模板中,实现layer父页面和子页面传值交互的方法
Sep 10 Javascript
利用webpack理解CommonJS和ES Modules的差异区别
Jun 16 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数组一对一替换实现代码
2012/08/31 PHP
php实现中文转数字
2016/02/18 PHP
PHP如何使用JWT做Api接口身份认证的实现
2020/02/03 PHP
XP折叠菜单&amp;仿QQ2006菜单
2006/12/16 Javascript
纯js实现瀑布流展现照片(自动适应窗口大小)
2013/04/08 Javascript
页面实时更新时间的JS实例代码
2013/12/18 Javascript
浅谈Javascript如何实现匀速运动
2014/12/19 Javascript
Javascript 计算字符串在localStorage中所占字节数
2015/10/21 Javascript
jquery实现删除一个元素后面的所有元素功能
2015/12/21 Javascript
js实现内容显示并使用json传输数据
2016/03/16 Javascript
jQuery控制li上下循环滚动插件用法实例(附demo源码下载)
2016/05/28 Javascript
微信小程序 教程之小程序配置
2016/10/17 Javascript
nodeJS删除文件方法示例
2016/12/25 NodeJs
jQuery.Form上传文件操作
2017/02/05 Javascript
js实现鼠标拖拽多选功能示例
2017/08/01 Javascript
js实现前端图片上传即时预览功能
2017/08/02 Javascript
Electron autoUpdater实现Windows安装包自动更新的方法
2018/12/24 Javascript
基于layui的table插件进行复选框联动功能的实现方法
2019/09/19 Javascript
p5.js绘制创意自画像
2019/11/04 Javascript
vue实现自定义多选按钮
2020/07/16 Javascript
用Python进行TCP网络编程的教程
2015/04/29 Python
详解字典树Trie结构及其Python代码实现
2016/06/03 Python
如何高效使用Python字典的方法详解
2017/08/31 Python
Django中日期处理注意事项与自定义时间格式转换详解
2018/08/06 Python
Python面向对象之类和实例用法分析
2019/06/08 Python
python自动化UI工具发送QQ消息的实例
2019/08/27 Python
python实现将视频按帧读取到自定义目录
2019/12/10 Python
python中round函数保留两位小数的方法
2020/12/04 Python
家庭睡衣和家庭用品:Little Blue House
2018/03/18 全球购物
英国羊皮鞋类领先品牌:Just Sheepskin
2019/12/12 全球购物
娱乐地球:Entertainment Earth
2020/01/08 全球购物
2014爱耳日宣传教育活动总结
2014/03/09 职场文书
教师对学生的评语
2014/04/28 职场文书
大学生应聘求职信
2014/05/26 职场文书
工作收入证明模板
2014/10/10 职场文书
六种css3实现的边框过渡效果
2021/04/22 HTML / CSS