欢迎光临散文网 会员登陆 & 注册

vue聊天IM实例|vue全家桶仿微信

2020-04-26 11:01 作者:xiaoyan2019  | 我要投稿

一、项目简介

基于Vue2.x全家桶技术Vue2.5.6+Vuex+vue-router+webpack+vuePhotoPreview+wcPop等技术架构开发的仿微信界面聊天室vue-chatroom实例,实现了微信聊天下拉刷新、发送消息、表情(动图),图片、视频预览,打赏、红包等功能。

二、技术栈

  • MVVM框架:Vue2.x

  • 状态管理:Vuex

  • 页面路由:Vue-router

  • 弹窗插件:wcPop

  • 打包工具:webpack 2.0

  • 环境配置:node.js + cnpm

  • 图片插件:vue-photo-preview

  • vue自定义导航栏/底部Tabbar模板

<!--顶部模板-->

<template>

    <div class="wcim__topBar" v-show="$route.meta.showHeader">

        <div class="inner flexbox flex-alignc">

            <!-- <a class="linkico wcim__ripple-fff" href="javascript:;" @click="$router.back(-1)"><i class="iconfont icon-back"></i></a> -->

            <h4 class="barTxt flex1">

                <div class="barCell flexbox flex__direction-column"><em class="clamp1">Vue聊天室</em></div>

            </h4>

            <span class="linkico wcim__ripple-fff"><i class="iconfont icon-search"></i></span>

        </div>

    </div>

</template>

<!--底部tabBar模板-->

<template>

    <div class="wcim__tabBar" v-show="$route.meta.showTabBar">

        <div class="bottomfixed wcim__borT">

            <ul class="flexbox flex-alignc">

                <router-link class="flex1" active-class="on" tag="li" to="/" exact><span class="ico"><i class="iconfont icon-tabbar_xiaoxi"></i><em class="wcim__badge">15</em></span><span class="txt">消息</span></router-link>

                <router-link class="flex1" active-class="on" tag="li" to="/contact"><span class="ico"><i class="iconfont icon-tabbar_tongxunlu"></i></span><span class="txt">通讯录</span></router-link>

                <router-link class="flex1" active-class="on" tag="li" to="/ucenter"><span class="ico"><i class="iconfont icon-tabbar_wo"></i></span><span class="txt">我</span></router-link>

            </ul>

        </div>

    </div>

</template>

  • vue页面地址路由/登录验证拦截

import Vue from 'vue'

import _router from 'vue-router'

import store from '../vuex'

Vue.use(_router) //应用路由

const router = new _router({

    routes: [

        // 登录、注册

        {

            path: '/login',

            component: resolve => require(['../views/auth/login'], resolve),

        },

        {

            path: '/register',

            component: resolve => require(['../views/auth/register'], resolve),

        },

        // ...

    ]

})

/* 

@desc 注册全局钩子拦截登录状态    

@about  Q:282310962   

 */

const that = this

router.beforeEach((to, from, next) => {

    const token = store.state.token

    // 判断该路由地址是否需要登录权限

    if(to.meta.requireAuth){

        // 通过vuex state获取当前token是否存在

        if(token){

            next()

        }else{

            // console.log('还未登录授权!')

            next()

            wcPop({

                content: '还未登录授权!', style: 'background:#e03b30;color:#fff;', time: 2,

                end: function(){

                    next({ path: '/login' })

                }

            });

        }

    }else{

        next()

    }

})

  • vue表单验证模块

import { setToken, checkTel } from '../../utils/filters'

export default {

    data () {

        return {

            formObj: {},

            vcodeText: '获取验证码',

            tel: '',

            disabled: false,

            time: 0,

        }

    },

    methods: {

        handleSubmit(){

            var that = this;

            if(!this.formObj.tel){

                wcPop({ content: '手机号不能为空!', style: 'background:#e03b30;color:#fff;', time: 2 });

            }

            //...

        },

        // 60s倒计时

        handleVcode(){

            if(!this.formObj.tel){

                wcPop({ content: '手机号不能为空!', style: 'background:#e03b30;color:#fff;', time: 2 });

            }else if(!checkTel(this.formObj.tel)){

                wcPop({ content: '手机号格式不正确!', style: 'background:#e03b30;color:#fff;', time: 2 });

            }else{

                this.time = 60;

                this.disabled = true;

                this.countDown();

            }

        },

        countDown(){

            if(this.time > 0){

                this.time--;

                this.vcodeText = '获取验证码('+this.time+')';

                setTimeout(this.countDown, 1000);

            }else{

                this.time = 0;

                this.vcodeText = '获取验证码';

                this.disabled = false;

            }

        }

    }

}

  • vue引入公共组件库|第三方插件模板

// >>>引入js

import $ from 'jquery'

import fontsize from './assets/js/fontsize'

// >>>引入弹窗插件

import wcPop from './assets/js/wcPop/wcPop'

import './assets/js/wcPop/skin/wcPop.css'

// >>>引入饿了么移动端vue组件库

import MintUI, { Loadmore } from 'mint-ui'

import 'mint-ui/lib/style.css'

Vue.component(Loadmore.name, Loadmore)

Vue.use(MintUI)

// >>>引入图片预览插件

import photoPreview from 'vue-photo-preview'

import 'vue-photo-preview/dist/skin.css'

Vue.use(photoPreview, {

  loop: false,

  fullscreenEl: false, //是否全屏

  arrowEl: false, //左右按钮

})

// >>>引入地址路由

import router from './router'

import store from './vuex'


ok 今天就分享到这里,希望能喜欢,如果对h5开发聊天感兴趣可以看下面这篇,同时也可以关注前端公众号了解更多前端项目实例开发。


vue聊天IM实例|vue全家桶仿微信的评论 (共 条)

分享到微博请遵守国家法律