Angular.js ve SignalR ile gerçek zamanlı mesajlaşma

Merhaba. Asp.net MVC’de Angular.js ve SignalR teknolojilerini kullanarak basit bir gerçek zamanlı mesajlaşma entegresini gerçekleştireceğiz. Ayrıca karşı taraftan mesaj alındığında bir mesaj sesi de eklemiş bulunmaktayız.

Uygulama örneği için http://seize-theday.com web sayfama üye olup daha sonra portal sayfasındaki mesajlaşma entegresini görebilirsiniz.

Github hesabımdan örnek projeyi indirebilirsiniz. Veritabanı işlemleri için benimle iletişime geçin, zira projede Mysql veri tabanı kullandım.

SeizeTheDay is a forum web site that has been developed by using AngularJS, Asp.Net Mvc and Web API. In this website, there are so many exciting tools like TinyMCE, TinyMCE Youtube Plugin. The admin panel of this web site has been developed totally by using Angular.JS.
https://github.com/dogaanismail/SeizeTheDay
3 forks.
3 stars.
33 open issues.

Recent commits:

Öncelikle angular.js ve signalR kütüphanelerinin doğru şekilde indirildiğini varsayıyoruz. Bu iki kütüphanenin gerekli javascript linkleri Layout sayfanızda doğru şekilde sıralanmalıdır.

1.ADIM LİNKLERİ AYARLAMA

Tabi en üstteki Jquery kütüphanesinin en güncel linklini kullanabilirsiniz, benim ki öyle kalmış...

2.ADIM VERİ TABANI TABLOSU

Ben veri tabanı olarak mysql kullanmış bulunmaktayım, mssql kullananlar için bir farklılık yok zaten, tablo bu şekildedir.

3.ADIM ANGULAR KODLARINI YAZMAK

Angular’a geçiş için app.js ve controller.js adlarında 2 tane angular javascript dosyası oluşturmamız gerekiyor.

  • Scripts
    • controller
      • controller.js
      • app.js

şeklinde olmalıdır. App.js’in içinde sadece ufak bir tanımlama yapmamız yeterlidir.

var app = angular.module("startupController"]);

controller.js içinde bir controller oluşturmamız gerekiyor. Mesajlaşmayı hangi sayfada yapmak istiyorsanız o sayfanın adını vermek makul olabilir siz bilirsiniz tabi. controller.js kodları da şu şekildedir. Bu orada kodlara geçmeden öncede gerekli mesajları sql tarafından çekmek için ben angular.js’de birde web api kullandım, web api sayesinde daha hızlı çalıştığına inanmaktayım.

Gördüğünüz gibi controller oluşturmuş bulunmaktayım, görmeniz açısından kodların ekran görüntüsünü aldım, kodların tümünü aşağıdan bulabilirsiniz.
//Portal Controller
app.controller('PortalCtrl', function ($scope, $http) {
    $('#chat-box').animate({ scrollTop: $('#chat-box').prop("scrollHeight") }, 50);
    $scope.userName = null;
    $scope.chatHub = null; // holds the reference to hub
    $scope.soundObject = null;

    $scope.chatHub = $.connection.chatHub; // initializes hub
    $.connection.hub.start(); // starts hub

    // register a client method on hub to be invoked by the server
    $scope.chatHub.client.addNewMessage = function (name, message) {
        $scope.playSound();
        $scope.getAllPortalMessages();
        $scope.$apply();
    };

    $scope.createMessage = function (obj) {
        // sends a new message to the server
        var text = $('input[name="text-message"]').val();
        $scope.userName = obj;
        $scope.chatHub.server.send($scope.userName, text);
    };

    $scope.init = function () {

        $scope.model = {
            MessageID: 0,
            PortalMessageUserID: '',
            TextMessage: '',
            SendDate: null,
            UserID: '',
            UserName: '',
            PhotoPath: '',
            TagUserName: '',
            TagColor: ''
        };
        //for display message
        $scope.flgMessage = false;
        //for message
        $scope.message = "";
        $scope.getAllPortalMessages();     
    };

    //Hide alert message
    $scope.hideMessage = function () {
        //make message flg false for hide message
        $scope.flgMessage = false;
        $("#message").removeClass("alert alert-success").removeClass("alert alert-danger");
        $("#icon").removeClass("fa-check").removeClass("fa-ban");
    };

    $scope.getAllPortalMessages = function () {
        $http.get("/api/PortalMessages").then(function (result) {           
            $('input[name="text-message"]').val("");
            $scope.lstMessages = result.data;
            $('#chat-box').animate({ scrollTop: $('#chat-box').prop("scrollHeight") }, 50);
        });
    };

    $scope.playSound = function () {
        var media = document.getElementById("play");
        media.pause();
        const playPromise = media.play();
        if (playPromise !== null) {
            playPromise.catch(() => { media.play(); })
        }
    };

    //if the user presses enter button from a keyboard
    $scope.keyDown = function (obj,userName) {
        if (obj.keyCode == 13) {
            $scope.createMessage(userName);
        }
    };

    $scope.deleteMessage = function (obj) {
        console.log(obj);  //not completed yet
    };

    //Reset data
    $scope.reset = function () {
        $scope.model = {
            MessageID: 0,
            PortalMessageUserID: '',
            TextMessage: '',
            SendDate: null,
            UserID: '',
            UserName: '',
            PhotoPath: '',
            TagUserName: '',
            TagColor: ''
        };
    };

    $scope.init();

});

4.ADIM HTML KODLARINI HAZIRLAMAK

Mesajlaşma entegresi için ise html ve css ayarlamalarını yapmak bulunmaktayız. Mesajları göstermek için ng-repeat sayesinde mesajları bir nevi bir foreach döngüsü ile çok kolay bir şekilde gösteriyorum.

Maalesef html kodlarını düzenli bir şekilde buraya yerleştiremiyorum, ama ekran görüntüsünde de açıkça kodlar gözükmektedir. Kodların açıklamalarını bana ulaşarak isteyebilirsiniz.

5.ADIM SIGNALR HUB SINIFI OLUŞTURMAK

  • Hubs
    • ChatHub.cs

ChatHub adlı sınıfımız Hubs adlı klasörün içinde olması gerekiyor. Sınıfı oluştururken normal klasik değilde SignalR Hub Class (v2) olması gerekiyor buna dikkat ediniz lütfen

ChatHub sınıfımız bu şekildedir. Hub adlı interface’dan kalıntı alıyoruz. Projede owin kullanığınızı varsayıyorum, keza SignalR, Owin ile birlikte daha verimli çalışmaktadır. Buradaki amaç kullanıcı her yeni mesaj yazdığında bu mesajı veritabanına kaydediyorum. Repository sayesinde bu işlemleri gerçekleştiriyorum.

6.ADIM Web Api Oluşturmak

Veri tabanındaki girilen mesajların listelenmesi için bir web api oluşturuyoruz. Bu web api’yi angular tarafında şu şekilde kullanıyoruz ;

 //web apiden mesajları çekiyoruz.
 $scope.getAllPortalMessages = function () {
        $http.get("/api/PortalMessages").then(function (result) {           
            $('input[name="text-message"]').val("");
            $scope.lstMessages = result.data;
            $('#chat-box').animate({ scrollTop: $('#chat-box').prop("scrollHeight") }, 50);
        });
    };

Yukarı gördüğünüz gibi /api/PortalMessages sayesinde mesajları çekip, $scope.lstMessages = result.data; lstMessages adlı listeye yazıyoruz, ve html tarafında bu listeyi bir foreach olarak kullanıyoruz.

SeizeTheDay.Entities.EntityClasses.MySQL.PortalMessages ise mesajların listelenmesi için bir basit sınıf oluşturdum, aslında direk sınıfı gönderiyorum.

Eğer sorunuz var çekinmeden benimle iletişime geçebilirsiniz. Dediğim gibi takıldığınız yer olursa http://seize-theday.com/ siteye üye olup, portal sayfasındaki uygulama örneğine bakabilirsiniz veya ismaildogaan@gmail.com adlı mail adresime mail atabilirsiniz.

UYGULAMA ÖRNEĞİ

About the author

Add Comment

Bir Cevap Yazın

Blog İstatistikleri

Kategoriler

Arsiv