Затем откройте public/js/controllers.js
и обновите AppCtrl
как показано ниже:
ngAuth.controller('AppCtrl', function($rootScope, $scope, $window, $firebaseSimpleLogin) { $rootScope.URL = 'https://nwkchatapp.firebaseio.com/'; var ref = new Firebase($rootScope.URL); $rootScope.authClient = $firebaseSimpleLogin(ref); $rootScope.redirect = function(user) { if ($window.location.href.indexOf('home') < 0) $window.location.assign('http://localhost:3000/#home'); if (user.provider == 'password') { user.name = user.email; user.img = '/img/user.png' } else if (user.provider == 'facebook') { user.name = user.displayName; user.img = user.thirdPartyUserData.picture.data.url; } else if (user.provider == 'twitter') { user.name = user.displayName; user.img = user.thirdPartyUserData.profile_image_url; } else if (user.provider == 'google') { user.name = user.displayName; user.img = user.thirdPartyUserData.picture; } $rootScope.user = user; }; $rootScope.$on('$firebaseSimpleLogin:login', function(e, user) { if (user) { $rootScope.redirect(user); } }); } )
В этом коде есть два изменения. Сначала мы переместили URL-адрес Firebase в переменную. Во-вторых, мы объединили имя пользователя и изображение объекта пользователя для нескольких поставщиков услуг. Вы можете скачать изображение пользователя здесь .
Далее мы переместим функцию выхода из системы в контроллер Toolbar
. Обновите контроллер Toolbar
в public/js/controllers.js
следующим образом:
controller('Toolbar', ['$rootScope', '$scope', 'Window', function($rootScope, $scope, Window) { $scope.minimize = function() { Window.minimize(); }; $scope.toggleFullscreen = function() { Window.toggleKioskMode(); }; $scope.close = function() { Window.close(); }; $scope.logoutUser = function() { $rootScope.user = ''; $rootScope.authClient.$logout(); }; } ])
из controller('Toolbar', ['$rootScope', '$scope', 'Window', function($rootScope, $scope, Window) { $scope.minimize = function() { Window.minimize(); }; $scope.toggleFullscreen = function() { Window.toggleKioskMode(); }; $scope.close = function() { Window.close(); }; $scope.logoutUser = function() { $rootScope.user = ''; $rootScope.authClient.$logout(); }; } ])
Если вы перезапустите приложение сейчас, после входа в систему вы увидите, что выход logout
перемещен вверх. В центре страницы вы также увидите выход из системы, с которым мы вскоре разберемся.
Теперь мы будем работать на домашней странице. Когда пользователь входит в vTak, мы показываем ему список комнат чата, и мы предоставляем возможность создать одну из своих комнат. Мы обновим разметку public/partials/home.html
как показано ниже:
<div class="container" ng-controller="HomeCtrl"> <label class="pull-right welcome-panel" ng-show="user"> Welcome, <u> <span id="email">{{user.name}}</span></u> <img class="prof-img" ng-src="{{user.img}}" width="39" /> </label> <br/> <h3 class="room-head">Chat Rooms <a href="javascript:" class="btn btn-xs btn-primary" ng-hide="isNew == true" ng-click="isNew = true; roomName = ''; ">New Room</a> <input ng-show="isNew == true" class="input-sm form-control cust-text" type="text" ng-model="roomName" placeholder="Room Name" /> <a href="javascript:" ng-disabled="!roomName" ng-show="isNew == true" class="btn btn-xs btn-info" ng-click="newRoom()">Create</a> </h3> <input type="text" class="form-control" placeholder="Search Rooms" ng-model="search"> <div class="rooms"> <div ng-repeat="item in rooms | filter:search" class="room"> <h3>{{item.roomname}}</h3>By : {{item.createdby}} <a class="btn btn-primary btn-xs pull-right join-room" href="javascript:" ng-click="joinChat($index)">Join</a> <a class="btn btn-danger btn-xs pull-right" ng-show="user.name == item.createdby" ng-click="deleteRoom($index)">Delete</a> </div> <div class="room" ng-show="rooms.length == 0"> <h3>No Rooms Available. Create your own!</h3> </div> </div> </div>
- В одной строке 2 мы показываем отображаемое имя пользователя и изображение профиля. Мы собрали эту информацию в
AppCtrl
только пользователь вошел в систему.
- В строке 8 мы предоставляем кнопку для создания новой комнаты. Когда пользователь нажимает на нее, мы скрываем кнопку создания, отображаем текстовое поле и кнопку сохранения. Как только пользователь сохранит комнату, он появится в списке, заполненном в строке 16.
- В строке 14 у нас есть панель поиска, где пользователь может искать доступные номера.
- Также обратите внимание на строку 19. Если текущий зарегистрированный пользователь совпадает с пользователем, который создал комнату, мы показываем кнопку удаления.
HomeCtrl
внимание, что весь связанный код JavaScript будет обрабатываться в HomeCtrl
. Откройте public/js/controllers.js
и перейдите в самый низ, чтобы найти HomeCtrl
. Обновите его, как показано ниже:
.controller('HomeCtrl', function($rootScope, $scope, $firebase, $location) { var ref = new Firebase($rootScope.URL + 'chatRooms'); var sync = $firebase(ref); $scope.rooms = sync.$asArray(); $scope.newRoom = function() { sync.$push({ createdby: $rootScope.user.name, roomname: $scope.roomName, createddate: Date.now() }); $scope.isNew = false; }; $scope.deleteRoom = function(room) { sync.$remove($scope.rooms[room].$id); }; $scope.joinChat = function(room) { $location.path('/chat/' + $scope.rooms[room].$id); }; })
- Строка 2 — Мы создаем новую ссылку на
chatRooms
и синхронизируем ее в строке 3.
- Строка 4 — Мы запрашиваем хранилище данных Firebase и заполняем все комнаты, перечисленные в
chatRooms
в виде массива.
- Строка 8 — Когда пользователь создает новую комнату, мы используем метод push, чтобы сохранить необходимые данные.
- Строка 15 — когда пользователь удаляет комнату
- Строка 19 — Когда пользователь хочет присоединиться к комнате, мы перенаправляем его на новый путь. ( который мы скоро создадим )
Наконец, добавьте необходимые стили. Откройте public/css/app.css
и добавьте следующие классы:
body { overflow-x: hidden; } .room-head { margin-top: -35px; border-bottom: 2px solid #CCC; padding: 20px 20px 8px; } .prof-img { vertical-align: bottom; } .welcome-panel { padding-right: 20px; } .cust-text { width: 22%; display: initial; vertical-align: middle; margin-left: 11px; } .rooms,.messages { border: 1px solid #e8e7e8; margin: 20px; } .room { border: 1px solid #c7c7c7; margin-bottom: -1px; background: #fff; -webkit-transition: background .5s; padding: 10px; } .room:hover { background: #e6e6e6; } .join-room { margin-left: 5px; } .messages { height: 377px; overflow: auto; border: 1px solid #e8e7e8; } .message { border-bottom: 1px solid #c7c7c7; background: #fff; height: 75px; -webkit-transition: background .5s; padding: 3px 3px 3px 10px; } .message img { vertical-align: baseline; margin-right: 9px; } .chat-input { position: absolute; bottom: 0; width: 93%; text-align: center; margin-bottom: 14px; padding-left: 8px; } .back-btn { vertical-align: bottom; margin-left: 20px; }
Сохраните все файлы и перезапустите приложение. Если вы не вышли из системы в последний раз, наша логика аутентификации позаботится о перенаправлении на домашнюю страницу. Вы можете нажать кнопку «Новая комната» button and create a new room
. Недавно созданная комната автоматически появится в списке ниже.
Если вы хотите отладить приложение, вы можете установить для toolbar
и frame
значение true
в package.json
.
Теперь, когда мы создали новую комнату, давайте напишем логику, чтобы присоединиться к комнате и начать общаться со всеми пользователями в ней. Для этого мы создадим новый маршрут. Откройте public/js/app.js
и добавьте следующий маршрут:
$routeProvider.when('/chat/:roomid', { templateUrl: 'partials/chat.html', controller: 'ChatCtrl' });
Затем создайте новый файл с именем chat.html
в папке public/partials
. Этот файл имеет шаблон для просмотра чата. Обновите его, как показано ниже:
<div class="container" ng-controller="ChatCtrl"> <label class="pull-right welcome-panel" ng-show="user"> <a href="/#/home" class="btn btn-info btn-xs back-btn">Back</a> Welcome, <u> <span id="email">{{user.name}}</span></u> <img class="prof-img" ng-src="{{user.img}}" width="39" /> </label> <br/> <h3 class="room-head">Welcome to {{roomInfo.roomname}}</h3> <div class="messages" scroll-glue> <div ng-repeat="msgs in chatMessages" class="message"> <h4> <img ng-src="{{msgs.userimg}}" width="20" />{{msgs.message}} </h4> <span>{{msgs.postedby}} <small class="text-muted">{{msgs.posteddate | date:'yyyy-MM-dd HH:mm:ss'}}</small> </span> </div> <div class="message" ng-show="chatMessages && chatMessages.length == 0"> <h4>No message yet!</h4> </div> </div> <div class="chat-input"> <input type="text" class="form-control" placeholder="Send Message" ng-model="message" ng-keypress="sendMessage($event)" autofocus> </div> </div>
На что обратить внимание:
Строка 12 — будет содержать все сообщения. Обратите внимание на директиву scroll-glue
, которая позаботится об автоматической прокрутке панели чата до последнего сообщения. ( Мы добавим и включим эту ссылку через мгновение )
Строка 26 — поле ввода для ввода сообщения.
Теперь загрузите скролл-склейк отсюда и поместите его в папку public/lib
. Затем обновите зависимости модуля public/js/app.js
как показано ниже.
var ngAuth = angular.module('ng-auth', ['ngRoute', 'ngResource', 'firebase', 'luegg.directives']).config(['$routeProvider', function($routeProvider) { $routeProvider.when('/', { templateUrl: 'partials/auth.html', controller: 'AuthCtrl' }); $routeProvider.when('/home', { templateUrl: 'partials/home.html', controller: 'HomeCtrl' }); $routeProvider.when('/chat/:roomid', { templateUrl: 'partials/chat.html', controller: 'ChatCtrl' }); $routeProvider.otherwise({ redirectTo: '/' }); } ]);
Обновите views/index.ejs
для включения scrollglue.js
:
<script type="text/javascript" src="lib/scrollglue.js"></script>
В public/js/controllers.js
мы добавим логику для управления чатом. Добавьте следующий код в конец всех контроллеров:
.controller('ChatCtrl', function($rootScope, $scope, $firebase, $routeParams) {
На что обратить внимание:
Строка 3 — мы создаем новую ссылку Firebase на чат
Строки 4 и 5 — мы создаем ссылку AngularFire и затем синхронизируем ее как объект
Строка 7 — мы создаем ссылку на объект чата внутри чата
Строка 8 — мы синхронизируем / выбираем все сообщения
Строка 14 — мы отправляем сообщение чата на сервер с некоторыми дополнительными данными.
Сохраните все файлы и запустите приложение. Теперь, когда вы нажмете на кнопку «Присоединиться», вы увидите новое созданное нами представление. Добавьте новое сообщение, и вы увидите обновление окна чата. Если вы хотите проверить чат, ( с запущенным приложением vTak ) откройте браузер и перейдите по http://localhost:3000
. Войдите с поставщиком услуг, таким же или отличным от того, который вы уже вошли, и вы можете общаться с самим собой.
Просто и легко!
Распространение приложения
Вы можете создавать собственные установщики и распространять приложение. Выполните следующую команду для сборки установщика OSX:
$ gulp build-osx
Или создайте установщик Windows с помощью следующей команды:
$ gulp build-win
Или создайте установщик Linux с помощью следующей команды:
$ gulp build-linux
Вывод
Надеюсь, у вас есть основная идея о том, как создать комплексное приложение, используя node-webkit и Firebase. Вы можете найти полный код этой статьи на GitHub .
Спасибо за прочтение. Комментарии приветствуются.