融雲web即時通信

前言由於我是業餘的前端,因此在作融雲web通訊的時候遇到了不少問題,可能站在前端的角度,我解決的辦法不是很完美,因此我但願若是有人看到了多給我一些提點 謝謝!javascript

我不是標題黨,我今天要說的就是基於融雲的web開發簡單的文字通訊。  要了解必定php js java 頁面之間的參數傳遞我是在php環境完成的 註冊是在java 這種java和php之間的轉換也是很簡單的php

若是要作到兩個界面之間互發消息還能查詢歷史消息,就必須開通公有云專業版後,開啓單羣聊消息雲存儲。若是是本身娛樂我以爲不必去開通,由於實在是太貴了(我作的時候用的是公司給的帳號)。這個先跳過進入正題html

 

1、註冊融雲的帳號 (註冊帳號放在後臺會比前端安全,若是放在前端註冊,一些懂程序的會盜取你的appKey和appSecret) 前端

/**
 * 註冊rongCloud帳號
 * @param agent
 * string userModel.id  惟一標識,最大長度 30 個字符,建議使用 英文字母、數字 混排
 * string userModel.name  名稱,最大長度 60 個字符
 * string userModel.portrait  合法的頭像地址,最大長度 800 個字符
 * @return
 * "code": 200,
 * "userId": 
 * "token": 
 */
@PostMapping("/registerUser")
public void registerUser(Agent agent){
    try {
        PrintWriter out = response.getWriter();
        //給jedis賦值
        JedisTest.initJedis();
        if(JedisTest.jedis.get(agent.getAgentId().toString()) != null) {
            System.out.println("----------從緩存獲取用戶token信息"+agent.getAgentId());
            String userInfo = JedisTest.jedis.get(agent.getAgentId().toString());
            out.write(userInfo);
            JedisTest.closeJedis();
            return;
        }
     //appKey, appSecret本身註冊融雲後的帳號
        RongCloud rongCloud = RongCloud.getInstance(appKey, appSecret);
        User User = rongCloud.user;
        UserModel user = new UserModel()
                .setId(agent.getAgentId().toString())
                .setName(agent.getAgentName())
                .setPortrait(agent.getAgentAvatar());
        TokenResult result = User.register(user);
        System.out.println("getToken:  " + result.toString());
        //存入到redis緩存
        System.out.println("----------存放用戶信息");
        //setex設置緩存時間
        JedisTest.jedis.setex(agent.getAgentId().toString(),72000,result.toString());
        JedisTest.closeJedis();

        out.write(result.toString());
    }catch (Exception e){
        System.out.println("註冊rongCloud帳號出錯" + e.getMessage());
    }
}

 

直接複製會有jedis報錯,個人jediis代碼就不貼出來了,由於個人jedis服務器搭建在linux系統一兩句在這也說不清  你能夠直接用本身的方式存放就好,緩存能夠避免一直獲取tokenvue

這是rongcloud mavenjarjava

<!--rongcloud通訊jar包-->
<dependency>
<groupId>cn.rongcloud.im</groupId>
<artifactId>server-sdk-java</artifactId>
<version>3.0.1</version>
</dependency>

2、對融雲方法的封裝 (如下代碼是我本身封裝的js文件)
  
function RongCloud(){

}

RongCloud.prototype = {
    constructor: RongCloud,
    /**
     * 初始化融雲服務,並啓動消息監聽
     * @param appkey app的惟一標識
     */
    initRong: function (appkey) {
        RongIMClient.init(appkey); //appkey
        // 設置鏈接監聽狀態 ( status 標識當前鏈接狀態)
        // 鏈接狀態監聽器
        RongIMClient.setConnectionStatusListener({
            onChanged: function (status) {
                switch (status) {
                    //連接成功
                    case RongIMLib.ConnectionStatus.CONNECTED:
                        console.log('連接成功');
                        break;
                    //正在連接
                    case RongIMLib.ConnectionStatus.CONNECTING:
                        console.log('正在連接');
                        break;
                    //從新連接
                    case RongIMLib.ConnectionStatus.DISCONNECTED:
                        console.log('斷開鏈接');
                        break;
                    //其餘設備登陸
                    case RongIMLib.ConnectionStatus.KICKED_OFFLINE_BY_OTHER_CLIENT:
                        console.log('其餘設備登陸');
                        break;
                    //網絡不可用
                    case RongIMLib.ConnectionStatus.NETWORK_UNAVAILABLE:
                        console.log('網絡不可用');
                        break;
                }
            }
        });
        this.monitor();
    },

    /**
     * 用戶用token鏈接融雲服務器
     * @param token 用戶的聊天token
     */
    connectSession: function (callback,token) {
        // 鏈接融雲服務器。
        RongIMClient.connect(token, {
            onSuccess: function (userId) {
                console.log("Login successfully." + userId);
                callback  && callback(true, userId);
            },
            onTokenIncorrect: function () {
                console.log('token無效' + userId);
                callback  && callback(false, userId);
            },
            onError: function (errorCode) {
                var info = '';
                switch (errorCode) {
                    case RongIMLib.ErrorCode.TIMEOUT:
                        info = '超時';
                        break;
                    case RongIMLib.ErrorCode.UNKNOWN_ERROR:
                        info = '未知錯誤';
                        break;
                    case RongIMLib.ErrorCode.UNACCEPTABLE_PaROTOCOL_VERSION:
                        info = '不可接受的協議版本';
                        break;
                    case RongIMLib.ErrorCode.IDENTIFIER_REJECTED:
                        info = 'appkey不正確';
                        break;
                    case RongIMLib.ErrorCode.SERVER_UNAVAILABLE:
                        info = '服務器不可用';
                        break;
                }
                console.log(errorCode);
            }
        });
    },

    /**
     * 消息監聽
     */
    monitor:function (){
        // 消息監聽器
        RongIMClient.setOnReceiveMessageListener({
            // 接收到的消息
            onReceived: function (message) {
                // 判斷消息類型
                switch (message.messageType) {
                    case RongIMClient.MessageType.TextMessage:
                        // 發送的消息內容將會被打印
                        console.log("message.content.content------" + JSON.stringify(message.content.content));
                        console.log('收到發送的消息');
                        if(typeof writeInContent != 'undefined'){ //在聊天頁面才寫入數據
                            writeInContent(1,message.content.content,message.senderUserId,'');//給接收者寫入最新數據
                        }
                        break;
                    case RongIMClient.MessageType.VoiceMessage:
                        // 對聲音進行預加載
                        // message.content.content 格式爲 AMR 格式的 base64 碼
                        RongIMLib.RongIMVoice.preLoaded(message.content.content);
                        break;
                    case RongIMClient.MessageType.ImageMessage:
                        // do something...
                        break;
                    case RongIMClient.MessageType.DiscussionNotificationMessage:
                        // do something...
                        break;
                    case RongIMClient.MessageType.LocationMessage:
                        // do something...
                        break;
                    case RongIMClient.MessageType.RichContentMessage:
                        // do something...
                        break;
                    case RongIMClient.MessageType.DiscussionNotificationMessage:
                        // do something...
                        break;
                    case RongIMClient.MessageType.InformationNotificationMessage:
                        // do something...
                        console.log('收到小灰條信息')
                        break;
                    case RongIMClient.MessageType.ContactNotificationMessage:
                        // do something...
                        break;
                    case RongIMClient.MessageType.ProfileNotificationMessage:
                        // do something...
                        break;
                    case RongIMClient.MessageType.CommandNotificationMessage:
                        // do something...
                        break;
                    case RongIMClient.MessageType.CommandMessage:
                        // do something...
                        break;
                    case RongIMClient.MessageType.UnknownMessage:
                        // do something...
                        break;
                    case RongIMClient.RegisterMessage.PersonMessage:
                        // do something...
                        break;
                    default:
                    // 自定義消息
                    // do something...

                }
            }
        });
    },

    /**
     * 獲取會話列表
     * @param callback 消息回調參數
     * @return boolean 是否成功的狀態碼
     * @return list 會話列表集合
     */
    getSessionList: function (callback) {
        RongIMClient.getInstance().getConversationList({
            onSuccess: function(list) {
                console.log("會話列表--"+ JSON.stringify(list))
                callback  && callback(true, list);
            },
            onError: function(error) {
                // do something...r
                result = "獲取會話列表失敗!"
                callback  && callback(false, result);
            }
        },null);
    },

    /**
     * 獲取指定的會話
     * @param callback 消息回調參數
     * @return boolean 是否成功的狀態碼
     * @return list 會話列表集合
     */
    getSessionListBytargetId: function(callback, targetId) {
        var conversationType = RongIMLib.ConversationType.PRIVATE;
        RongIMLib.RongIMClient.getInstance().getUnreadCount(conversationType,targetId,{
            onSuccess:function(count){
                // count => 指定會話的總未讀數。
                callback  && callback(true, count);
            },
            onError:function(){
                result = "獲取會話列表失敗!"
                callback  && callback(false, result);
            }
        });
    },

    /**
     * 清空和莫我的的未讀消息數
     * @param callback 消息回調參數
     * @param targetId 要清楚和誰的會話消息數
     */
    cleanMessageCount: function (targetId) {
        var conversationType = RongIMLib.ConversationType.PRIVATE;
        RongIMClient.getInstance().clearUnreadCount(conversationType,targetId,{
            onSuccess:function(){
                console.log("清除未讀消息數成功!");
            },
            onError:function(error){
                console.log("清除未讀消息數錯誤!"+ error);
            }
        });
    },

    /**
     * 獲取本身和莫我的的聊天記錄
     * @param callback 消息回調參數
     * @param conversationType 私聊,其餘會話選擇相應的消息類型便可。
     * @param targetId 想獲取本身和誰的歷史消息,targetId 賦值爲對方的 Id。
     * @param timestrap  默認傳 null,若從頭開始獲取歷史消息,請賦值爲 0 ,timestrap = 0;
     * @param count 每次獲取的歷史消息條數,範圍 0-20 條,能夠屢次獲取。
     * @return list 聊天數據集合
     * @return hasMag 是否還有歷史記錄 有位true
     */
    getHistoryById: function (callback,conversationType,targetId,timestrap,count) {
        RongIMLib.RongIMClient.getInstance().getHistoryMessages(conversationType, targetId, timestrap, count, {
            onSuccess: function(list, hasMsg) {
                // list => Message 數組。
                // hasMsg => 是否還有歷史消息能夠獲取。
                // console.log("targetId------" + targetId);
                // console.log("GetHistoryMessages:list" + JSON.stringify(list));
                callback && callback(hasMsg, list);
            },
            onError: function(error) {
                console.log("獲取歷史" , error);
                callback && callback(false, error);
            }
        });
    },

    sendMessage :function(targetId,content,extra) {
        var msg = new RongIMLib.TextMessage({content:content,extra:extra});
        var conversationtype = RongIMLib.ConversationType.PRIVATE; // 單聊,其餘會話選擇相應的消息類型便可。
        var targetId = targetId; // 目標 Id
        RongIMClient.getInstance().sendMessage(conversationtype, targetId, msg, {
                onSuccess: function (message) {
                    //message 爲發送的消息對象而且包含服務器返回的消息惟一Id和發送消息時間戳
                    console.log("Send successfully");
                },
                onError: function (errorCode,message) {
                    var info = '';
                    switch (errorCode) {
                        case RongIMLib.ErrorCode.TIMEOUT:
                            info = '超時';
                            break;
                        case RongIMLib.ErrorCode.UNKNOWN_ERROR:
                            info = '未知錯誤';
                            break;
                        case RongIMLib.ErrorCode.REJECTED_BY_BLACKLIST:
                            info = '在黑名單中,沒法向對方發送消息';
                            break;
                        case RongIMLib.ErrorCode.NOT_IN_DISCUSSION:
                            info = '不在討論組中';
                            break;
                        case RongIMLib.ErrorCode.NOT_IN_GROUP:
                            info = '不在羣組中';
                            break;
                        case RongIMLib.ErrorCode.NOT_IN_CHATROOM:
                            info = '不在聊天室中';
                            break;
                        default :
                            info = x;
                            break;
                    }
                    console.log('發送失敗:' + info);
                }
            }
        );
    }
}

 


代碼太多不過要解釋的只有一個地方:
  在消息監聽的那個方法中我作了一個if判斷若是當前在聊天頁面,那麼我就把收到的消息寫入到聊天頁面。


其實走到這一步就得靠本身的邏輯去完成了
要聊天首先得要有兩個頁面 會話頁面 和 消息頁面由於是web端的因此每一個頁面都得調用初始化融雲服務和登陸融雲 (具體實現方法「參照」三四)三四隻能參照

1.用註冊的帳號去發送消息給另外一個帳號產生一個會話(至關於qq的加好友) 發送消息的是註冊融雲的id(是本身手動輸入的註冊融雲的那個值)


3、會話頁面(這個我是在php的環境下完成的)

 

 

<!DOCTYPE html>
<head>
    <meta charset="utf-8" />
    <title>會話</title>
    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
    <meta content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no" name="viewport">
    <!-- Mobile Devices Support @begin -->
    <meta content="application/xhtml+xml;charset=UTF-8" http-equiv="Content-Type">
    <meta content="telephone=no, address=no" name="format-detection">
    <meta name="apple-mobile-web-app-capable" content="yes" />
    <!-- apple devices fullscreen -->
    <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
<head>
<style>
    *{
        padding: 0px;
        margin: 0px;
        outline: 0;
        list-style:none;
        box-sizing: border-box;
        -moz-box-sizing: border-box; /* Firefox */
        -webkit-box-sizing: border-box; /* Safari */
    }
    #main{
        width: 100%;
        height: 100%;
    }
    .sessionData{
        width: 100%;
        height: 70px;
        border-bottom: 1px #999999 solid;
    }
    .imgDiv{
        float:left; width: 50px;
        height: 50px;
        margin-left:30px;
        margin-top:10px;
        border-radius: 100%;
        -moz-border-radius: 100%;
        -webkit-border-radius: 100%;
        border:solid 2px #FFFFFF;
    }
    .nameAndMessage{
        float:left;
        width: 50%;
        height: 50px;
        margin-left:10px;
        margin-top:10px;
        font-size: 12px
    }
    .agentName{
        margin: 0;
        padding: 0;
        height: 25px;
        width: 50%;
        line-height: 28px;
        overflow:hidden
    }
    .message{
        margin: 0;
        padding: 0;
        height: 25px;
        width: 50%;
        line-height: 22px;
        overflow:hidden
    }
    .date{
        float:right;
        margin: 0;
        margin-left: 20px;
        padding: 0;
        height: 70px;
        width: 50px;
        line-height: 70px;
        font-size: 12px
    }
    .count{
        float:right;
        margin-top: 25px;
        margin-right: 20px;
        height: 20px;
        width: 20px;
        line-height: 20px;
        text-align: center;
        font-size: 12px;
        background: red;
        color: #FFFFFF;
        border-radius: 100%;
        -moz-border-radius: 100%;
        -webkit-border-radius: 100%;
    }
    /*加載數據時隱藏源代碼*/
    [v-cloak] {
        display: none;
    }
    a {
        text-decoration:none;
        out-line: none;
        color: #000000;
    }
</style>
</head>
<body>
<div id="main">
    <div id="sessionMain">
        <div class="sessionData" v-for="(item, index) in items" v-cloak>
            <div class="imgDiv">
                <img :src="userInfo[index].headImgUrl" width="50px" height="50px"/>
            </div>
            <a :href="'<?php echo base_url()?>mobile/wx_chat/messagePage?targetId='+item.targetId+'&count='+item.unreadMessageCount">
                <div class="nameAndMessage">
                    <div class="agentName">
                        {{ userInfo[index].nickName }}
                    </div>
                    <div class="message">
                        {{ item.latestMessage.content.content }}
                    </div>
                </div>
            </a>
            <div v-if="item.unreadMessageCount === 0">
                <div class="date">
                    {{ dataStr[index] }}
                </div>
            </div>
            <div v-else>
                <div class="count">
                    {{ item.unreadMessageCount }}
                </div>
            </div>
        </div>
    </div>
</div>
</body>

</html>

<script type="text/javascript" src="/js/chat/dataUtil.js" ></script>
<script type="text/javascript" src="/js/chat/rongCloud.js" ></script>
<script type="text/javascript" src="/js/chat/rongConfig.js" ></script>
<script type="text/javascript" src="/js/jquery-1.7.2.min.js"></script>
<script type="text/javascript" src="/js/vue.min.js"></script>
<script src="https://cdn.ronghub.com/RongIMLib-2.2.5.min.js"></script>
<script type="text/javascript">
    //定義緩存對象
    window.onload = initRong();
    var rongCloud = new RongCloud();
    var dateGS = new DateGS();
    //定義緩存對象
    var userCache = {};

    /**
     * 初始化融雲服務,並啓動消息監聽
     */
    function initRong(){
        var rongCloud = new RongCloud();
        var rongConfig = new RongConfig();
        rongCloud.initRong(rongConfig.getAppkey());
        //用戶登陸rong
        loginRong();
    }

    /**
     * 登陸融雲
     */
    function loginRong() {
        var rongCloud = new RongCloud();
        //獲取用戶token
        var token = "<?php echo  $imToken ?>";
        rongCloud.connectSession(function(status,userId){
            if(status) {
                //把本身的token和userId存放到緩存
                $.data(userCache, 'token', token);
                $.data(userCache, 'userId', userId);
                //獲取會話
                getSessionList();
            }else {
                alert("登陸失敗!");
            }

        },token);
    }

    /**
     * 獲取會話列表
     */
    function getSessionList() {
        if(localStorage.getItem("closeId") != null) {
            closeMessageCount();
        }
        rongCloud.getSessionList(function (status, list) {
            if(status) {
                var targetIds = '';
                for(var i in list){
                    targetIds += list[i].targetId+",";
                }
                targetIds = targetIds.substr(0,targetIds.length-1);
                //先用加姓名頭像 25 24 用戶的
                //targetIds = "oHNCGjmOMyk87ACKZrZ_A1CEiagA,oHNCGjrgAym1xXiAWsPJfXPChTk4";
                // 獲取用戶信息
                $.ajax({
                    type: "get",
                    url: "/api/mobile/agentService/getUserInfoByOpenId",
                    dataType: "text",
                    data: {openIds:targetIds},
                    success: function(ret, err) {
                        var dataStr = [];
                        for(var i in list) {
                            dataStr.push(dateGS.getLocalTime(list[i].sentTime));
                        }
                        //用戶信息
                        ret = $.parseJSON(ret);
                        console.log(JSON.stringify(ret))
                        if(ret.resultCode == 1) {
                            //vue渲染數據到頁面
                            var sessionMain = new Vue({
                                el: '#sessionMain',
                                data: {
                                    token: $.data(userCache, 'token'),
                                    items: list, //融雲放回的數據
                                    dataStr: dataStr, //格式化後的消息發送時間
                                    userInfo: ret.extend, //用戶的集合
                                },
                            })
                        } else {
                            alert("獲取用戶信息失敗!");
                        }
                    },
                    error:function(){
                        $('#content_empty').show();
                    }
                });
            }
        });
    }


    /**
     * 清空消息數 要清空必須得
     * 在這個頁面獲取一下歷史消息才能永久成功
     */
    function closeMessageCount() {
        //緩存有數據就是有清空的數據
        if(localStorage.getItem("closeId") != null) {
            rongCloud.getHistoryById(function (hasMag, list) {
                //清空數據
                rongCloud.cleanMessageCount(localStorage.getItem("closeId"));
                localStorage.removeItem("closeId");
            },RongIMLib.ConversationType.PRIVATE,localStorage.getItem("closeId"), null, 20);
        }
    }
</script>

 



解釋一下吧會話頁面是經過php控制器跳轉的,沒有任何的參數。
appkey我也是封裝到js裏面的由於一些隱私問題我不能把這個js提供出來,你若是註冊了融雲那麼就直接把appkey替換就行
在頁面中我用一個ajax去註冊融雲用戶獲得返回的token再登陸融雲,而後再查詢會話列表,有些圖像用戶名稱的我是查詢的表數據,因此這一步是不能複製粘貼的


4、消息頁面 (這個我是在php的環境下完成的)

 



<!DOCTYPE html>
<head>
    <meta charset="utf-8" />
    <!-- 移動設備支持 -->
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"/>
    <meta name="apple-mobile-web-app-capable" content="yes"/>
    <meta name="apple-mobile-web-app-status-bar-style" content="black"/>
</head>

<style>
    /**重置標籤默認樣式*/
    * {
        margin: 0;
        padding: 0;
        list-style: none;
        font-family: '微軟雅黑'
    }
    #container {
        width: 100%;
        height: 100%;
        background: #eee;
        position: relative;
    }
    .header {
        width: 100%;
        height: 50px;
        color: #fff;
        background: #999999;
        line-height: 50px;
        font-size: 20px;
        position: fixed;
        padding: 0 100px 0px 0px;
        top: 0px;
    }
    .footer {
        width: 100%;
        height: 50px;
        background: #999999;
        position: fixed;
        bottom: 0;
        padding-top: 10px;
        padding-bottom: 10px;
    }
    .footer input {
        width: 75%;
        height: 45px;
        outline: none;
        font-size: 20px;
        text-indent: 10px;
        position: absolute;
        border-radius: 6px;
        left:3%;
    }
    .footer span {
        display: inline-block;
        width: 15%;
        height: 48px;
        background: #ccc;
        font-weight: 900;
        line-height: 45px;
        cursor: pointer;
        text-align: center;
        position: absolute;
        right: 3%;
        border-radius: 6px;
    }

    .content {
        font-size: 20px;
        width: 100%;
        overflow: auto;
        margin-top:50px;
        margin-bottom: 70px;
    }
    .content li {
        margin-top: 10px;
        width: 100%;
        display: block;
        clear: both;
        overflow: hidden;
    }
    .content li span{
        background: #7cfc00;
        padding: 10px;
        border-radius: 10px;
        margin: 6px 10px 0 10px;
        max-width: 310px;
        border: 1px solid #ccc;
        box-shadow: 0 0 3px #ccc;
    }
    .imgleft {
        float: left;
        margin-left: 5px;
    }
    .imgright {
        float: right;
        margin-right: 5px;
    }
    .spanleft{
        float: left;
        background: #fff;
    }
    .spanright {
        float: right;
        background: #7cfc00;
    }
    /*加載數據時隱藏源代碼*/
    [v-cloak] {
        display: none;
    }
</style>
<html>
<body>
    <div id="container">
        <div class="header">
            <span onclick="jump()" style="float:left;width: 12%"><img src="/image/left.png" style="height: 50px;"/></span>
            <div id="targetId" style="float:left;text-align: center;line-height: 50px;width: 76%;" v-cloak>{{ targetName }}</div>
            <div style="float:left;width: 12%;height: 50px;"></div>
        </div>
        <ul class="content">
            <li style=""></li>
        </ul>
        <div class="footer">
            <input id="text" type="text" placeholder="說點什麼吧...">
            <span id="btn">發送</span>
        </div>
    </div>
</body>

</html>

<script type="text/javascript" src="/js/chat/dataUtil.js" ></script>
<script type="text/javascript" src="/js/chat/rongCloud.js" ></script>
<script type="text/javascript" src="/js/chat/rongConfig.js" ></script>
<script type="text/javascript" src="/js/jquery-1.7.2.min.js"></script>
<script type="text/javascript" src="/js/vue.min.js"></script>
<script src="https://cdn.ronghub.com/RongIMLib-2.2.5.min.js"></script>
<script type="text/javascript">
    window.onload = initRong();
    var rongCloud = new RongCloud();
    //初始化融雲服務,並啓動消息監聽
    function initRong(){
        var rongCloud = new RongCloud();
        var rongConfig = new RongConfig();
        rongCloud.initRong(rongConfig.getAppkey());
        //用戶登陸rong
        loginRong();
        getUserInfo();
        //初始化頁面
        pageInit();
        //把要清空的對象id存放到緩存
        localStorage.setItem("closeId","<?php echo $targetId ?>");
    }

    /**
     * 把用戶頭像姓名存放到緩存
     */
    function getUserInfo() {
        //獲取對方的id和本身的id
        var targetIdAndSendId = localStorage.getItem("userId") + "," + "<?php echo  $targetId?>";
        //先用加姓名頭像 25 24 用戶的  25 是本身的id 24使目標id
        //var targetIdAndSendId = "oHNCGjmOMyk87ACKZrZ_A1CEiagA,oHNCGjrgAym1xXiAWsPJfXPChTk4";
        // 獲取用戶信息
        $.ajax({
            type: "get",
            url: "/api/mobile/agentService/getUserInfoByOpenId",
            dataType: "text",
            data: {openIds:targetIdAndSendId},
            success: function(ret, err) {
                //用戶信息
                ret = $.parseJSON(ret);
                if(ret.resultCode == 1) {
                    //vue渲染數據到頁面
                    var header = new Vue({
                        el: '.header',
                        data: {
                            targetName: ret.extend[1].nickName,
                        },
                    })
                    //把用戶頭像存放到緩存
                    localStorage.setItem("userImgUrl", ret.extend[0].headImgUrl);
                    localStorage.setItem("targetImgUrl",ret.extend[1].headImgUrl);

                } else {
                    alert("獲取用戶頭像失敗!");
                }
            },
            error:function(){
                $('#content_empty').show();
            }
        });
    }

    /**
     * 登陸時獲取歷史消息
     */
    function loginRong() {
        //獲取用戶token
        var token = "<?php echo $token ?>";
        var rongCloud = new RongCloud();
        rongCloud.connectSession(function(status,userId){
            if(status) {
                //把本身的token和userId存放到緩存
                localStorage.setItem("token", token);
                localStorage.setItem("userId",userId);
                //初始化時獲取用戶歷史消息3-10條
                var targetIdPar = "<?php echo $targetId ?>";
                var countPar = "<?php echo $count ?>";
                getHistory(targetIdPar,parseInt(countPar),0);
            }else {
                alert("登陸失敗!");
            }

        },token);
    }

    /**
     * 初始化融雲 和 頁面數據渲染
     */
    //定義本身的頭像地址 和 別人的頭像存放
    function pageInit(){
        var userInfo = {};
        var btn = document.getElementById('btn');
        var text = document.getElementById('text');
        var content = document.getElementsByTagName('ul')[0];

        //必定要設置高度才能把數據實時的放在最下面 高度爲屏幕分辨率的高減去上下div的高度 上50px 下70px
        //還要減去減去初始化3條信息的高度150 網頁才能兼容  ix下面會多出一部分不兼容
        content.style.height=window.screen.height-120+"px";
        btn.onclick = function(){
            if(text.value.replace(/\s+/g,"") == '') {
                alert("不能發送空白消息");
                text.value = '';
                return;
            }else {
                writeInContent(0,text.value,"<?php echo $targetId?>",'');
                // 內容過多時,將滾動條放置到最底端
                content.scrollTop = content.scrollHeight;
                //sendGroupChat(text.value);
                sendMessage("<?php echo  $targetId?>", text.value);
                text.value = '';
            }
        }
    }

    /**
     * 寫入數據到content
     * writeFormat 寫入在左仍是右 0右 1左
     * contentText 寫入內容
     * list 爲空表示是單條插入到最底部,爲集合表示多條插入到最頂部
     */
    function writeInContent(num,contentText,closeId,list) {
        var content = document.getElementsByTagName('ul')[0];
        var str = '';
        for(var i in list) {
            //若是發送人時本身那麼就顯示到右邊
            if (list[i].senderUserId == localStorage.getItem("userId")) {
                str += '<li><img class="imgright" src="'+localStorage.getItem('userImgUrl')+'" width="50px" height="50px"><span class="spanright">'+list[i].content.content+'</span></li>';
            } else {
                str += '<li><img class="imgleft" src="'+localStorage.getItem('targetImgUrl')+'" width="50px" height="50px"><span class="spanleft">'+list[i].content.content+'</span></li>';
            }
        }
        if(list == '') {
            if(num==0){
                str = '<li><img class="imgright" src="'+localStorage.getItem("userImgUrl")+'" width="50px" height="50px"><span class="spanright">'+contentText+'</span></li>';
            }else {
                str = '<li><img class="imgleft" src="'+localStorage.getItem("targetImgUrl")+'" width="50px" height="50px"><span class="spanleft">'+contentText+'</span></li>';
            }
            content.innerHTML += str;
        }else {
            $(content).prepend(str);
        }
    }

    //var xfjApiUrl = '<?php echo WX_XFJ_API_URL ?>';
    function sendMessage(targetId,contentText) {
        rongCloud.sendMessage(targetId,contentText,"");

        /*//發送消息
        var agentId = localStorage.getItem("userId");
        agentId = agentId+"";
        targetId = targetId+"";
        $.ajax({
            type: "post"
            ,url:xfjApiUrl+"/mobile/wx_chat/publishMessage"
            //,url:"http://192.168.10.181:9091/api/mobile/chatService/publishMessage"
            ,data: {fromUserId:agentId,toUserId:targetId,content:contentText}
            ,datatype:'text'
            ,success:function(data){
                //發送成功後...
            }

            ,timeout:20000
        })*/
    }



    /**
     * 獲取和莫我的的聊天記錄 並調用寫入數據到congten得方法
     * @param targetIdPar 和誰的記錄
     * @param countPar 查詢幾條
     * @param mode 方式 1 爲點擊加載更多 0爲初始化查詢
     * @return hasMag 真表示還有數據
     */
    function getHistory(targetIdPar,countPar,mode){
        if (mode == 1) { //點擊獲取歷史消息的時候刪除一下加載更多這幾個字
            $(".jzgd").empty();
        }
        var rongCloud = new RongCloud();
        var conversationType = RongIMLib.ConversationType.PRIVATE; //私聊,其餘會話選擇相應的消息類型便可。
        var targetId= targetIdPar+""; // 想獲取本身和誰的歷史消息,targetId 賦值爲對方的 Id。 字符串類型
        var timestrap = null; // 默認傳 null,若從頭開始獲取歷史消息,請賦值爲 0 ,timestrap = 0; int
        var count = parseInt(countPar); // 每次獲取的歷史消息條數,範圍 0-20 條,能夠屢次獲取。 int性
        if(1 >= count){ //小於等於1報錯 仿qq0的時候查3條
            count = 3;
        }
        if(count >= 20) { //超過二十報錯 那麼就不讓他超過20條
            count = 20;
        }

        rongCloud.getHistoryById(function (hasMag, list) {
            writeInContent('','',"<?php echo $targetId ?>",list);
            if(parseInt(countPar) != 4 ) { //第一次獲取的歷史消息數和傳過來的未讀消息數相同是hasMag仍是爲true

            }
                if(hasMag){
                var rowsDisplayed = 10; //查詢歷史消息每次多加載十條數據
                //加載更多 //onclick=\"getHistory("+targetIdPar+","+null+","+20+")\"
                targetIdPar = "'"+targetIdPar+"'";
                var jzgd = "<li class='jzgd' onclick=\"getHistory("+targetIdPar+","+rowsDisplayed+","+1+")\" style='text-align: center;font-size: 16px;color:#4EA9E9'>查看更多消息</li>";
                $(".content").prepend(jzgd);
            }

        },conversationType,targetId, timestrap, count);
    }

    /**
     * 清空消息數 要清空必須得
     * 在這個頁面獲取一下歷史消息才能永久成功
     */
    function closeMessageCount(closeId) {
        var rongCloud = new RongCloud();
        rongCloud.getHistoryById(function (hasMag, list) {
            //清空數據
            rongCloud.cleanMessageCount(localStorage.getItem("closeId"));
        },RongIMLib.ConversationType.PRIVATE,localStorage.getItem("closeId"), null, 20);
    }

    /**
     * 跳轉到會話頁面
     */
    function jump(){
        window.location.href = "/mobile/wx_chat/conversationPage";
    }
</script>

 


解釋一下
1.封裝的融雲js文件中有個地方依賴這個頁面(就是以前提到的監聽消息的那段) 若是監聽到有消息那麼就調用這個頁面的寫入方法----writeInContent
2.?targetId=971b90fa-bcce-48bb-864c-79c784889e1d&count=0 經過控制器跳轉的時候要傳兩個參數一 targetId:你要查詢你和誰的聊天 count:第一次你要查詢幾條消息

會話頁面和聊天頁面只能做爲參照
複製無效!
但願能幫到你,或者你能幫到我!
相關文章
相關標籤/搜索