vue仿微信網頁版|vue+web端聊天室|仿微信客戶端vue版

来源:https://www.cnblogs.com/xiaoyan2017/archive/2019/04/30/10793728.html
-Advertisement-
Play Games

一、項目介紹 基於Vue2.5.6+Vuex+vue-cli+vue-router+vue-gemini-scrollbar+swiper+elementUI等技術混合架構開發的仿微信web端聊天室——vueWebChat,實現了發送消息、表情(動圖),圖片、視頻預覽,右鍵菜單、截屏、截圖可直接粘貼 ...


一、項目介紹

基於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

 ◆ 點擊右上角最大化按鈕,可以進行全屏切換

◆ 引入公共及全局組件配置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);
            })
        }
    });
});

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Centos7.6 部署3個Mariadb 實例 ...
  • 環境介紹:操作系統為Centos7.1;測試設備全部為內網設備,不通公網,所以需要配置本地yum源; 首先安裝ansible工具,用來批量安裝ambari、java以及基礎的一些配置; 一、 免密鑰登錄: *註:所有的設備均可以通過root直連 ssh-keygen -t rsa 相關命令: scp ...
  • 在我的上一篇博文當中闡述了我們如何使用shape標簽進行自定義控制項,這裡對shape控制項的屬性進行闡述,不知道如何使用這些屬性的可以參見我的上一篇博文(自定義Button):https://www.cnblogs.com/geeksongs/p/10789671.html 在Android Stud ...
  • 版權聲明:本文為HaiyuKing原創文章,轉載請註明出處! 前言 嘗試的方案包括以下幾種: freemarker 只能在java項目上運行,無法在Android項目上運行; 參考資料:《FreemarkerJavaDemo【Android將表單數據生成Word文檔的方案之一(基於freemarke ...
  • Hi3559AV100 DDR4 驅動配置說明 Hi3559AV100 DDR4 驅動配置說明 1.1 Hi3559AV100 DDR4 CLK/AC 驅動配置方法 1.1 Hi3559AV100 DDR4 CLK/AC 驅動配置方法 寄存器地址 寄存器地址 DDR PHY0:0x1206d0bc ...
  • 不管是系統開發還是應用開發,ANR 一直是揮之不去的存在!本文從 ANR 的觸發機制以及一個簡單的範例來探討 ANR 的原理和處理方法! ...
  • 在筆者本人看了很多博客和書之後,發現很少博主對於自定義控制項能夠進行一個比較全面的思路講解,大多數都是只講了一些細節,但並沒有講如何把代碼進行整體的實現。因此這裡講講整體的自定義button實現的詳細過程,其餘的細節則可以查看其他博主的博客即可,也可以參考《Android開發藝術探索》這本書的第六章, ...
  • AndroidStduio3.0使用gradle將module打包jar文件,首先需要安裝gradle。 打開控制台輸入 open -e .bash_profile 命令,就可以打開配置文件的文本,在裡面添加 然後進行保存。在輸入 source .bash_profile 命令保存你的設置。 在控制 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...