lqq 8 år sedan
förälder
incheckning
5c2b6eb809

+ 1 - 0
.gitignore

@@ -7,5 +7,6 @@ dist/settingview
 dist/smsChart
 dist/talkview
 dist/userview
+dist/peer
 temp
 templates.js

BIN
dist/img/remote.png


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 0 - 1
dist/peer/app-15f81cd38d.css


+ 0 - 278
dist/peer/app-9a1ffb26eb.js

@@ -1,278 +0,0 @@
-/**
- * Make sure the charset of the page using this script is
- * set to utf-8 or you will not get the correct results.
- */
-var utf8 = (function () {
-    var highSurrogateMin = 0xd800,
-        highSurrogateMax = 0xdbff,
-        lowSurrogateMin  = 0xdc00,
-        lowSurrogateMax  = 0xdfff,
-        surrogateBase    = 0x10000;
-    
-    function isHighSurrogate(charCode) {
-        return highSurrogateMin <= charCode && charCode <= highSurrogateMax;
-    }
-    
-    function isLowSurrogate(charCode) {
-        return lowSurrogateMin <= charCode && charCode <= lowSurrogateMax;
-    }
-    
-    function combineSurrogate(high, low) {
-        return ((high - highSurrogateMin) << 10) + (low - lowSurrogateMin) + surrogateBase;
-    }
-    
-    /**
-     * Convert charCode to JavaScript String
-     * handling UTF16 surrogate pair
-     */
-    function chr(charCode) {
-        var high, low;
-        
-        if (charCode < surrogateBase) {
-            return String.fromCharCode(charCode);
-        }
-        
-        // convert to UTF16 surrogate pair
-        high = ((charCode - surrogateBase) >> 10) + highSurrogateMin,
-        low  = (charCode & 0x3ff) + lowSurrogateMin;
-        
-        return String.fromCharCode(high, low);
-    }
-    
-    /**
-     * Convert JavaScript String to an Array of
-     * UTF8 bytes
-     * @export
-     */
-    function stringToBytes(str) {
-        var bytes = [],
-            strLength = str.length,
-            strIndex = 0,
-            charCode, charCode2;
-        
-        while (strIndex < strLength) {
-            charCode = str.charCodeAt(strIndex++);
-            
-            // handle surrogate pair
-            if (isHighSurrogate(charCode)) {
-                if (strIndex === strLength) {
-                    throw new Error('Invalid format');
-                }
-                
-                charCode2 = str.charCodeAt(strIndex++);
-                
-                if (!isLowSurrogate(charCode2)) {
-                    throw new Error('Invalid format');
-                }
-                
-                charCode = combineSurrogate(charCode, charCode2);
-            }
-            
-            // convert charCode to UTF8 bytes
-            if (charCode < 0x80) {
-                // one byte
-                bytes.push(charCode);
-            }
-            else if (charCode < 0x800) {
-                // two bytes
-                bytes.push(0xc0 | (charCode >> 6));
-                bytes.push(0x80 | (charCode & 0x3f));
-            }
-            else if (charCode < 0x10000) {
-                // three bytes
-                bytes.push(0xe0 | (charCode >> 12));
-                bytes.push(0x80 | ((charCode >> 6) & 0x3f));
-                bytes.push(0x80 | (charCode & 0x3f));
-            }
-            else {
-                // four bytes
-                bytes.push(0xf0 | (charCode >> 18));
-                bytes.push(0x80 | ((charCode >> 12) & 0x3f));
-                bytes.push(0x80 | ((charCode >> 6) & 0x3f));
-                bytes.push(0x80 | (charCode & 0x3f));
-            }
-        }
-        
-        return bytes;
-    }
-
-    /**
-     * Convert an Array of UTF8 bytes to
-     * a JavaScript String
-     * @export
-     */
-    function bytesToString(bytes) {
-        var str = '',
-            length = bytes.length,
-            index = 0,
-            byte,
-            charCode;
-        
-        while (index < length) {
-            // first byte
-            byte = bytes[index++];
-            
-            if (byte < 0x80) {
-                // one byte
-                charCode = byte;
-            }
-            else if ((byte >> 5) === 0x06) {
-                // two bytes
-                charCode = ((byte & 0x1f) << 6) | (bytes[index++] & 0x3f);
-            }
-            else if ((byte >> 4) === 0x0e) {
-                // three bytes
-                charCode = ((byte & 0x0f) << 12) | ((bytes[index++] & 0x3f) << 6) | (bytes[index++] & 0x3f);
-            }
-            else {
-                // four bytes
-                charCode = ((byte & 0x07) << 18) | ((bytes[index++] & 0x3f) << 12) | ((bytes[index++] & 0x3f) << 6) | (bytes[index++] & 0x3f);
-            }
-            
-            str += chr(charCode);
-        }
-        
-        return str;
-    }
-    
-    return {
-        stringToBytes: stringToBytes,
-        bytesToString: bytesToString
-    };
-}());
-
-'use strict';
-
-var app = angular.module('app', [
-    'ui.router',
-    'templatescache',
-    'ngAnimate'
-    ]);
-angular.module('app').run(['$rootScope', '$state', '$stateParams',
-    function($rootScope, $state, $stateParams) {
-        $rootScope.$state = $state;
-        $rootScope.$stateParams = $stateParams;
-    }
-]).config(['$stateProvider', '$urlRouterProvider',
-    function($stateProvider, $urlRouterProvider) {
-        $urlRouterProvider.otherwise('/peer'); //
-        $stateProvider.state('peer', {
-                url: '/peer',
-                templateUrl: 'templates/peer.html',
-                controller: 'PeerController'
-            });
-    }
-])
-angular.module('templatescache', []).run(['$templateCache', function($templateCache) {$templateCache.put('templates/peer.html','<div style="margin:5px">\n\n</div>');}]);
-'use strict';
-
-angular.module('app').controller('PeerController', ['$scope', '$state', '$timeout', function ($scope, $state, $timeout) {
-
-    lxtalkClient.Invoke('{C62F6059-7741-4AC1-8B8F-97EB5F7C116C}', '_Register', '', $scope);
-    var onConnected = function (c) {
-        c.on('data', function (data) {
-            // console.log('接收数据:', data.byteLength);
-            lxtalkClient.Invoke('{C62F6059-7741-4AC1-8B8F-97EB5F7C116C}', 'OnRecv', data, $scope);
-        });
-        c.on('close', function () {
-            delete $scope.connectedPeers[c.peer];
-        });
-        $scope.connectedPeers[c.peer] = 1;
-        lxtalkClient.Invoke('{C62F6059-7741-4AC1-8B8F-97EB5F7C116C}', 'OnConnected', '{"loginName":"'+c.peer+'"}', $scope);
-    };
-    $scope.options = {
-        host: '120.26.136.253',
-        port: 9000,
-        debug: 3,
-        config: {
-            'iceServers': [{
-                    'url': 'stun:lqq@59.110.63.164',
-                    "credential": "123456"
-                },
-                {
-                    "url": "turn:lqq@59.110.63.164",
-                    "credential": "123456"
-                }
-            ]
-        },
-        key: 'peerjs',
-        logFunction: function () {
-            var copy = Array.prototype.slice.call(arguments).join(' ');
-            console.info(copy);
-        }
-    }
-
-    $scope.init = function (jsonStr) {
-        console.log(jsonStr);
-        var data = JSON.parse(jsonStr);
-        $scope.loginName = data.loginName;
-        $scope.peer = new Peer(
-            $scope.loginName,
-            $scope.options
-        );
-        $scope.connectedPeers = {};
-        $scope.peer.on('open', function (id) {
-            console.log(id);
-        });
-        $scope.peer.on('connection', function(c){
-            c.on('open', function () {
-                onConnected(c);
-            });
-        });
-        $scope.peer.on('error', function (err) {
-            $timeout(function () {
-                $scope.init(jsonStr);
-            }, 50000);
-        });
-    };
-
-    $scope.connect = function (jsonStr) {
-        var data = JSON.parse(jsonStr);
-        data =  _.assign(data, {
-            label: 'file',
-            serialization:'binary'
-        });
-        console.info(data);
-        if (!$scope.connectedPeers[data.loginName]) {
-            var c = $scope.peer.connect(data.loginName, data);
-            c.on('open', function () {
-                onConnected(c);
-            });
-            c.on('error', function (err) {
-                console.log(err);
-                lxtalkClient.Invoke('{C62F6059-7741-4AC1-8B8F-97EB5F7C116C}', 'OnDisconnected', '{"loginName":"'+c.peer+'"}', $scope);
-            });
-            $scope.connectedPeers[data.loginName] = 1;
-        }
-    };
-
-    $scope.send = function (jsonStr, data) {
-        var param = JSON.parse(jsonStr);
-        data = data.slice(0);
-        // console.log('发送数据:', data.byteLength);
-        var c = $scope.peer.connections[param.loginName];
-        if (c && c[0]) {
-            c[0].send(data);
-        }
-        else{
-            lxtalkClient.Invoke('{C62F6059-7741-4AC1-8B8F-97EB5F7C116C}', 'OnDisconnected', '{"loginName":"'+param.loginName+'"}', $scope);
-        }
-    };
-
-    $scope.close = function (jsonStr) {
-        var c = $scope.peer.connections[param.loginName];
-        if (c) {
-            c.close();
-        }
-    };
-
-    $scope.closeAll = function (jsonStr) {
-        _.forEach($scope.peer.connections, function (c) {
-            c.close();
-        });
-    };
-
-    $scope.destroy = function (jsonStr) {
-        $scope.peer.destroy();
-    };
-}]);

+ 0 - 26
dist/peer/index.html

@@ -1,26 +0,0 @@
-<!DOCTYPE html>
-<html>
-
-<head>
-    <title>chat view</title>
-    <meta charset="utf-8" />
-    <!-- 新 Bootstrap 核心 CSS 文件 -->
-    <link rel="stylesheet" href="../bower_components/bootstrap/dist/css/bootstrap.min.css">
-    <link rel="stylesheet" href="../bower_components/animate.css/animate.min.css">
-    <link rel="stylesheet" href="app-15f81cd38d.css">
-</head>
-
-<body ng-app="app" >
-    <ui-view></ui-view>
-    <!-- jQuery文件。务必在bootstrap.min.js 之前引入 -->
-    <script src="../bower_components/lodash/dist/lodash.js"></script>
-    <script src="../bower_components/peerjs/peer.min.js"></script>
-    <script src="../bower_components/jquery/dist/jquery.min.js"></script>
-    <script src="../bower_components/jquery-qrcode/jquery.qrcode.min.js"></script>
-    <script src="../bower_components/angular/angular.min.js"></script>
-    <script src="../bower_components/angular-ui-router/release/angular-ui-router.min.js"></script>
-    <script src="../bower_components/angular-animate/angular-animate.min.js"></script>
-    <script src="app-9a1ffb26eb.js"></script>
-</body>
-
-</html>

+ 7 - 1
talkview/src/js/controller/messageController.js

@@ -40,7 +40,13 @@ angular.module('appMessage').controller('MessageController', ['$scope', '$filter
         };
 
         $scope.getTime = function(item) {
-            return $filter("date")(item.ts, "yyyy-MM-dd HH:mm:ss");
+            var myDate = new Date();
+            var nowDate = $filter("date")(myDate.getTime(), "yyyy-MM-dd");
+            var messageDate = $filter("date")(item.ts, "yyyy-MM-dd");
+            if (messageDate == nowDate)
+                return $filter("date")(item.ts, "HH:mm:ss");
+            else
+                return $filter("date")(item.ts, "yyyy-MM-dd HH:mm:ss");
         };
 
         $scope.getMore = function() {

+ 8 - 14
talkview/src/js/directive/currentmessage.js

@@ -47,10 +47,6 @@
                     return (Math.round(fileSize * 100 / 1024) / 100).toString() + 'KB';
             };
 
-            var getTime = function(item) {
-                return $filter("date")(item.ts, "yyyy-MM-dd HH:mm:ss");
-            };
-
             var getFileInfo = function(item) {
                 var file = '“' + getFileName(item) + '”' + '(' + getFileSize(item) + ')';
                 var fileInfo = new Array('您取消了' + file + '的发送,文件传输失败。', '您取消接收' + file + ',文件传输失败。', '对方取消了' + file + '的发送。', '对方取消接收' + file + ',文件发送失败。', '您终止了' + file + '的发送。', '您终止了' + file + '的接收。', '对方中断了' + file + '的发送。', '对方中断了' + file + '的接收。', '对方取消在线传输,转为发送离线文件' + file + '。');
@@ -84,10 +80,10 @@
                 }
                 //匹配网址
                 var i = 0;
-                var m = content.match(/(((((http|ftp|https|HTTP|FTP|HTTPS):\/\/)[\w\-_]+)|www|WWW|[0-9]+)(\.(?!gif|jpg|png|mp3)[\w\-_]+)+([\w\-\.,@?^=%:/~\+#]*[\w\-\@?^=%/~\+#\r\n]))/ig);
+                var m = content.match(/(((((http|ftp|https|HTTP|FTP|HTTPS):\/\/)[\w\-_]+)|www|WWW)(\.(?!gif|jpg|png|mp3)[\w\-_]+)+([\w\-\.,@?^=%:/~\+#]*[\w\-\@?^=%/~\+#\r\n]))|(([0-9]+)(\.[0-9]+)(\.[0-9]+)(\.[0-9]+)([\/\w\W]*))/ig);
                 if (m == null)
                     return content;
-                content = content.replace(/(((((http|ftp|https|HTTP|FTP|HTTPS):\/\/)[\w\-_]+)|www|WWW|[0-9]+)(\.(?!gif|jpg|png|mp3)[\w\-_]+)+([\w\-\.,@?^=%:/~\+#]*[\w\-\@?^=%/~\+#\r\n]))/ig, function() {
+                content = content.replace(/(((((http|ftp|https|HTTP|FTP|HTTPS):\/\/)[\w\-_]+)|www|WWW)(\.(?!gif|jpg|png|mp3)[\w\-_]+)+([\w\-\.,@?^=%:/~\+#]*[\w\-\@?^=%/~\+#\r\n]))|(([0-9]+)(\.[0-9]+)(\.[0-9]+)(\.[0-9]+)([\/\w\W]*))/ig, function() {
                     var html = '';
                     var g = (/((((http|ftp|https|HTTP|FTP|HTTPS):\/\/)[\w\-_]+)(\.[\w\-_]+)+([\w\-\.,@?^=%:/~\+#]*[\w\-\@?^=%/~\+#\r\n]))/ig).exec(m[i]);
                     if (getUserID()) {
@@ -226,9 +222,9 @@
                         html = '<div class="well m-l-xs m-t-xs fit-content" id="file-error"><span class="glyphicon glyphicon-remove-sign"></span><span>' + getFileInfo(content)[5] + '</span></div>';
                 } else if (ifSelf(content) && content.way == 1) {
                     if (getUserID())
-                        html = '';
+                        html = '<div class="well m-l-xs m-t-xs fit-content" id="file-info"><span class="glyphicon glyphicon-info-sign"></span><span>' + getFileInfo(content)[8] + '</span></div>';
                     else
-                        html = '<div class="well m-l-xs m-t-xs fit-content" id="file-info"><span class="glyphicon glyphicon-remove-sign"></span><span>' + getFileInfo(content)[8] + '</span></div>';
+                        html = '<div class="well m-l-xs m-t-xs fit-content" id="file-info"><span class="glyphicon glyphicon-info-sign"></span><span>' + getFileInfo(content)[8] + '</span></div>';
                 }
             } else if (scope.msg.contentType == 4) {
                 html = '<span class="text-message">' +
@@ -245,18 +241,16 @@
                 var html_g = html;
             } else {
                 if (getUserID()) {
-                    var html_g = '<p><strong>' +
+                    var html_g = '<div><p><strong>' +
                         scope.msg.senderDisplayName +
-                        '</strong><small class="text-muted">-' +
-                        getTime(scope.msg) + '</small></p>' +
+                        '</strong><small class="text-muted"></small></p></div>' +
                         '<div class="wellself m-l-xs m-t-xs fit-content" >' +
                         '<div class="text-point"></div>' + html +
                         '</div>';
                 } else {
-                    var html_g = '<p><strong>' +
+                    var html_g = '<div><p><strong>' +
                         scope.msg.senderDisplayName +
-                        '</strong><small class="text-muted">-' +
-                        getTime(scope.msg) + '</small></p>' +
+                        '</strong><small class="text-muted"></small></p></div>' +
                         '<div class="well m-l-xs m-t-xs fit-content" >' +
                         '<div class="text-point"></div>' + html +
                         '</div>';

+ 8 - 14
talkview/src/js/directive/historymessages.js

@@ -54,10 +54,6 @@
                     return (Math.round(fileSize * 100 / 1024) / 100).toString() + 'KB';
             };
 
-            var getTime = function(item) {
-                return $filter("date")(item.ts, "yyyy-MM-dd HH:mm:ss");
-            };
-
             var getFileInfo = function(item) {
                 var file = '“' + getFileName(item) + '”' + '(' + getFileSize(item) + ')';
                 var fileInfo = new Array('您取消了' + file + '的发送,文件传输失败。', '您取消接收' + file + ',文件传输失败。', '对方取消了' + file + '的发送。', '对方取消接收' + file + ',文件发送失败。', '您终止了' + file + '的发送。', '您终止了' + file + '的接收。', '对方中断了' + file + '的发送。', '对方中断了' + file + '的接收。', '对方取消在线传输,转为发送离线文件' + file + '。');
@@ -91,10 +87,10 @@
                 }
                 //匹配网址
                 var i = 0;
-                var m = content.match(/(((((http|ftp|https|HTTP|FTP|HTTPS):\/\/)[\w\-_]+)|www|WWW|[0-9]+)(\.(?!gif|jpg|png|mp3)[\w\-_]+)+([\w\-\.,@?^=%:/~\+#]*[\w\-\@?^=%/~\+#\r\n]))/ig);
+                var m = content.match(/(((((http|ftp|https|HTTP|FTP|HTTPS):\/\/)[\w\-_]+)|www|WWW)(\.(?!gif|jpg|png|mp3)[\w\-_]+)+([\w\-\.,@?^=%:/~\+#]*[\w\-\@?^=%/~\+#\r\n]))|(([0-9]+)(\.[0-9]+)(\.[0-9]+)(\.[0-9]+)([\/\w\W]*))/ig);
                 if (m == null)
                     return content;
-                content = content.replace(/(((((http|ftp|https|HTTP|FTP|HTTPS):\/\/)[\w\-_]+)|www|WWW|[0-9]+)(\.(?!gif|jpg|png|mp3)[\w\-_]+)+([\w\-\.,@?^=%:/~\+#]*[\w\-\@?^=%/~\+#\r\n]))/ig, function() {
+                content = content.replace(/(((((http|ftp|https|HTTP|FTP|HTTPS):\/\/)[\w\-_]+)|www|WWW)(\.(?!gif|jpg|png|mp3)[\w\-_]+)+([\w\-\.,@?^=%:/~\+#]*[\w\-\@?^=%/~\+#\r\n]))|(([0-9]+)(\.[0-9]+)(\.[0-9]+)(\.[0-9]+)([\/\w\W]*))/ig, function() {
                     var html = '';
                     var g = (/((((http|ftp|https|HTTP|FTP|HTTPS):\/\/)[\w\-_]+)(\.[\w\-_]+)+([\w\-\.,@?^=%:/~\+#]*[\w\-\@?^=%/~\+#\r\n]))/ig).exec(m[i]);
                     if (getUserID()) {
@@ -231,9 +227,9 @@
                         html = '<div class="well m-l-xs m-t-xs fit-content" id="file-error"><span class="glyphicon glyphicon-remove-sign"></span><span>' + getFileInfo(content)[5] + '</span></div>';
                 } else if (ifSelf(content) && content.way == 1) {
                     if (getUserID())
-                        html = '';
+                        html = '<div class="well m-l-xs m-t-xs fit-content" id="file-info"><span class="glyphicon glyphicon-info-sign"></span><span>' + getFileInfo(content)[8] + '</span></div>';
                     else
-                        html = '<div class="well m-l-xs m-t-xs fit-content" id="file-info"><span class="glyphicon glyphicon-remove-sign"></span><span>' + getFileInfo(content)[8] + '</span></div>';
+                        html = '<div class="well m-l-xs m-t-xs fit-content" id="file-info"><span class="glyphicon glyphicon-info-sign"></span><span>' + getFileInfo(content)[8] + '</span></div>';
                 }
             } else if (scope.msg.contentType == 4) {
                 html = '<span class="text-message">' +
@@ -250,18 +246,16 @@
                 var html_g = html;
             } else {
                 if (getUserID()) {
-                    var html_g = '<p><strong>' +
+                    var html_g = '<div><p><strong>' +
                         scope.msg.senderDisplayName +
-                        '</strong><small class="text-muted">-' +
-                        getTime(scope.msg) + '</small></p>' +
+                        '</strong><small class="text-muted"></small></p></div>' +
                         '<div class="wellself m-l-xs m-t-xs fit-content" >' +
                         '<div class="text-point"></div>' + html +
                         '</div>';
                 } else {
-                    var html_g = '<p><strong>' +
+                    var html_g = '<div><p><strong>' +
                         scope.msg.senderDisplayName +
-                        '</strong><small class="text-muted">-' +
-                        getTime(scope.msg) + '</small></p>' +
+                        '</strong><small class="text-muted"></small></p></div>' +
                         '<div class="well m-l-xs m-t-xs fit-content" >' +
                         '<div class="text-point"></div>' + html +
                         '</div>';

+ 72 - 12
talkview/src/less/app.main.less

@@ -27,6 +27,12 @@
     .sendmessage {
         margin-top: -10px;
     }
+    .curTime {
+        text-align: center;
+        font-family: "微软雅黑","宋体";
+        font-size: 12px;
+        margin-bottom: -5px;
+    }
 }
 
 .media-body {
@@ -36,12 +42,12 @@
     max-width: 700px;
     vertical-align: top;
     zoom: 1;
-    >p>strong {
+    p>strong {
         float: left;
-        margin-left: 2px;
+        margin-left: 3px;
         color: #336699;
     }
-    >p>small {
+    p>small {
         margin-left: 4px;
         font-size: 10px;
         vertical-align: bottom;
@@ -62,18 +68,18 @@
         border: none;
         box-shadow: none;
         outline: none;
-        margin-left: 10px;
+        margin-left: 8px;
         margin-top: -2px;
         margin-bottom: 0px;
         margin-right: 20px;
-        padding: 7px 12px;
+        padding: 7px 15px 7px 12px;
         font-size: 12px;
         line-height: 16px;
         .text-point {
             z-index: -99;
             position:absolute;
-            top:-18px;
-            left:8px;
+            top:-17px;
+            left:7px;
             width:0;
             height:0;
             font-size:0;
@@ -96,18 +102,18 @@
         border: none;
         box-shadow: none;
         outline: none;
-        margin-left: 10px;
+        margin-left: 8px;
         margin-top: -2px;
         margin-bottom: 0px;
         margin-right: 20px;
-        padding: 7px 12px;
+        padding: 7px 15px 7px 12px;
         font-size: 12px;
         line-height: 16px;
         .text-point {
             z-index: -99;
             position:absolute;
-            top:-18px;
-            left:8px;
+            top:-17px;
+            left:7px;
             width:0;
             height:0;
             font-size:0;
@@ -288,7 +294,7 @@ body {
 }
 #details-right {
     min-width: 220px;
-    height: 420px;
+    height: 480px;
     margin: auto;
     overflow: hidden;
     text-align: center;
@@ -399,4 +405,58 @@ body {
             box-shadow:0px 0px 1px #ccc;
         }
     }
+    #remote {
+        margin: 5px auto;
+        #backgroundImg {
+            margin: -50px auto -20px;
+            background-image: url(../img/remote.png);
+            height: 200px;
+            .glyphicon {
+                float: right;
+                margin-top: 75px;
+                color: #fff;
+                font-size: 36px;
+                position:relative;
+                animation-name:arrow;
+                animation-duration:1.5s;
+                animation-timing-function:linear;
+                animation-iteration-count:infinite;
+                animation-direction:normal;
+                /* Safari and Chrome: */
+                -webkit-animation-name:arrow;
+                -webkit-animation-duration:1.5s;
+                -webkit-animation-timing-function:linear;
+                -webkit-animation-iteration-count:infinite;
+                -webkit-animation-direction:normal;
+            }
+        }
+        p {
+            margin-top: 10px;
+            font-size: 12px;
+        }
+        button {
+            height: 25px;
+            width: 70px;
+            padding: 0px;
+            margin: 15px 8px;
+        }
+    }
+}
+
+@keyframes arrow
+{
+	0%   {opacity:1;left:50px; top:0px;}
+    
+    50%  {opacity:0.5;left:-50px; top:0px;}
+    
+	100% {opacity:0;left:-150px; top:0px;}
+}
+
+@-webkit-keyframes arrow /* Safari and Chrome */
+{
+	0%   {opacity:1;left:50px; top:0px;}
+    
+    50%  {opacity:0.5;left:-50px; top:0px;}
+    
+	100% {opacity:0;left:-150px; top:0px;}
 }

+ 14 - 1
talkview/src/templates/details-right.html

@@ -21,7 +21,20 @@
         </div>
     </div>
     <div style="border-top:solid 1px #ddd;margin:0px 6px"></div>
-    <div id="userCode">
+    <div id="userCode" ng-show="false">
         <div id="code" qrcode ng-user="user"> </div>
     </div>
+    <div id="remote" ng-show="true">
+        <div id="backgroundImg">
+            <span class="glyphicon glyphicon-arrow-left unConnect"></span>
+        </div>
+        <p class="unConnect" ng-show="true">您正在邀请对方使用远程协助 . . .</p>
+        <button type="button" class="btn btn-warning unConnect" ng-show="true">取消</button>
+        <p class="unConnect" ng-show="false">对方正在邀请您远程控制他的电脑</p>
+        <button type="button" class="btn btn-success unConnect" ng-show="false">接受</button><button type="button" class="btn btn-warning unConnect" ng-show="false">拒绝</button>
+        <p class="inConnect hide" ng-show="true">对方正在控制您的计算机</p>
+        <button type="button" class="btn btn-danger inConnect hide" ng-show="true">断开</button>
+        <p class="inConnect hide" ng-show="false">您正在控制对方的计算机</p>
+        <button type="button" class="btn btn-danger inConnect hide" ng-show="false">断开</button>
+    </div>
 </div>

+ 2 - 0
talkview/src/templates/messages.html

@@ -2,6 +2,7 @@
     <div class="getMore"><a role="button" class="i-More"><small ng-click="getMore()">加载更多消息</small></a><small class="n-More hide">当前没有更多消息</small></div>
     <div class="feed-activity-list p-l-xs p-t-xs p-r-xs loadmore" ng-cloak>
         <div class="feed-element" ng-repeat="item in historymessages | orderBy:item.index:'desc'">
+            <div class="curTime"><small class="text-muted">{{getTime(item)}}</small></div>
             <div class="media-body" ng-history-msg="item" ng-app-content="appContent" ng-count="count" ng-height="height">
                 <!--<p>
                     <strong>{{item.senderDisplayName === undefined || item.senderDisplayName == ''? item.sender : item.senderDisplayName}}</strong><small>-2017-2-6 15:57:17 {{item.ts}}</small>
@@ -14,6 +15,7 @@
     </div>
     <div class="feed-activity-list p-l-xs p-t-xs p-r-xs sendmessage" ng-cloak>
         <div class="feed-element animate" ng-repeat="item in sendmessages track by $index">
+            <div class="curTime"><small class="text-muted">{{getTime(item)}}</small></div>
             <div class="media-body" ng-current-msg="item" ng-app-content="appContent">
                 <!--<p>
                     <strong>{{item.senderDisplayName === undefined || item.senderDisplayName == ''? item.sender : item.senderDisplayName}}</strong><small class="text-muted">-{{getTime(item)}}</small>