diff --git a/package-lock.json b/package-lock.json
index 9f1c7458dd634bdb186bc04d5aa1e9dba8cc8d04..e18dd1db7d2f87abdfaf05da396ea15881d22c07 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -517,6 +517,12 @@
         "normalize-path": "2.1.1"
       }
     },
+    "app-root-path": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-2.0.1.tgz",
+      "integrity": "sha1-zWLc+OT9WkF+/GZNLlsQZTxlG0Y=",
+      "dev": true
+    },
     "append-transform": {
       "version": "0.4.0",
       "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz",
@@ -1536,6 +1542,20 @@
       "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
       "dev": true
     },
+    "codelyzer": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-4.0.1.tgz",
+      "integrity": "sha512-MsOcaiLqcBK7hjHbfp9HZrflqWg5tD9A5qVSXkW208OJ8pkf63id8IiOjEiK/XU3o70W8tWbFKi1tAOwiJDMrQ==",
+      "dev": true,
+      "requires": {
+        "app-root-path": "2.0.1",
+        "css-selector-tokenizer": "0.7.0",
+        "cssauron": "1.4.0",
+        "semver-dsl": "1.0.1",
+        "source-map": "0.5.7",
+        "sprintf-js": "1.0.3"
+      }
+    },
     "color": {
       "version": "0.11.4",
       "resolved": "https://registry.npmjs.org/color/-/color-0.11.4.tgz",
@@ -2053,6 +2073,15 @@
       "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=",
       "dev": true
     },
+    "cssauron": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/cssauron/-/cssauron-1.4.0.tgz",
+      "integrity": "sha1-pmAt/34EqDBtwNuaVR6S6LVmKtg=",
+      "dev": true,
+      "requires": {
+        "through": "2.3.8"
+      }
+    },
     "cssesc": {
       "version": "0.1.0",
       "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz",
@@ -12476,6 +12505,15 @@
       "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==",
       "dev": true
     },
+    "semver-dsl": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/semver-dsl/-/semver-dsl-1.0.1.tgz",
+      "integrity": "sha1-02eN5VVeimH2Ke7QJTZq5fJzQKA=",
+      "dev": true,
+      "requires": {
+        "semver": "5.4.1"
+      }
+    },
     "send": {
       "version": "0.16.1",
       "resolved": "https://registry.npmjs.org/send/-/send-0.16.1.tgz",
@@ -13303,6 +13341,12 @@
       "resolved": "https://registry.npmjs.org/tether/-/tether-1.4.0.tgz",
       "integrity": "sha1-D5+hcfdb9YSF2BSelHmdeudNHBo="
     },
+    "through": {
+      "version": "2.3.8",
+      "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+      "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
+      "dev": true
+    },
     "through2": {
       "version": "2.0.3",
       "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz",
diff --git a/package.json b/package.json
index f786bbfbca882202b6a7c5d295c709c8cc37b555..5416acfd248ed89082d8a1004660126aa3d0daaf 100644
--- a/package.json
+++ b/package.json
@@ -56,6 +56,7 @@
     "@types/jasmine": "~2.5.53",
     "@types/jasminewd2": "~2.0.2",
     "@types/node": "~6.0.60",
+    "codelyzer": "^4.0.1",
     "jasmine-core": "~2.6.2",
     "jasmine-spec-reporter": "~4.1.0",
     "karma": "~1.7.0",
diff --git a/src/app/BasicPage/not-found/not-found.component.html b/src/app/BasicPage/not-found/not-found.component.html
index 36df63002db354aab26c014b466a3acb3dccabd9..8c186c77bf5bee08dadbc15e48e8f487c9bda450 100644
--- a/src/app/BasicPage/not-found/not-found.component.html
+++ b/src/app/BasicPage/not-found/not-found.component.html
@@ -1 +1,9 @@
-<h2>这个真没有</h2>
+<div class="middle-box text-center animated fadeInDown">
+  <h1>404</h1>
+  <h3 class="font-bold">Page Not Found</h3>
+
+  <div class="error-desc">
+    Sorry, but the page you are looking for has note been found. Try checking the URL for error, then hit the refresh
+    button on your browser or try found something else in our app.
+  </div>
+</div>
diff --git a/src/app/ControlPage/control/ssh/ssh.component.ts b/src/app/ControlPage/control/ssh/ssh.component.ts
index cf028f4295b2a7284d93da46524e7a36d114675f..cfdcf77c765f4f1fdfba4310abde9d6f34676f24 100644
--- a/src/app/ControlPage/control/ssh/ssh.component.ts
+++ b/src/app/ControlPage/control/ssh/ssh.component.ts
@@ -24,6 +24,22 @@ import {NavList, View, Term} from '../control.component';
 export class SshComponent implements OnInit {
   NavList = NavList;
 
+  static TerminalDisconnect(host) {
+    host.connected = false;
+    host.Term.socket.destroy();
+    host.Term.term.write('\r\n\x1b[31mBye Bye!\x1b[m\r\n');
+  }
+
+  static TerminalDisconnectAll() {
+    alert('TerminalDisconnectAll');
+    for (let _i = 0; _i < NavList.List.length; _i++) {
+      SshComponent.TerminalDisconnect(_i);
+      // TermStore.term[i]["connected"] = false;
+      // TermStore.term[i]["socket"].destroy();
+      // TermStore.term[i]["term"].write('\r\n\x1b[31mBye Bye!\x1b[m\r\n');
+    }
+  }
+
   constructor(private _appService: AppService,
               private _logger: Logger) {
     this._logger.log('SshComponent.ts:SshComponent');
@@ -32,8 +48,8 @@ export class SshComponent implements OnInit {
   ngOnInit() {
   }
 
-  TerminalConnect(host,username) {
-    let socket = io.connect();
+  TerminalConnect(host, username) {
+    const socket = io.connect();
     let cols = '80';
     let rows = '24';
     if (Cookie.get('cols')) {
@@ -46,12 +62,12 @@ export class SshComponent implements OnInit {
     Cookie.set('rows', rows, 99, '/', document.domain);
 
 
-    let id = NavList.List.length - 1;
+    const id = NavList.List.length - 1;
     NavList.List[id].nick = host.hostname;
     NavList.List[id].connected = true;
     NavList.List[id].edit = false;
     NavList.List[id].closed = false;
-    NavList.List[id].type = "ssh";
+    NavList.List[id].type = 'ssh';
     NavList.List[id].Term = new Term;
     NavList.List[id].Term.machine = host.uuid;
     NavList.List[id].Term.socket = socket;
@@ -62,10 +78,13 @@ export class SshComponent implements OnInit {
       screenKeys: true,
     });
     NavList.List.push(new View());
-    for (let m in NavList.List) {
-      NavList.List[m].hide = true;
+    for (let _i = 0; _i < NavList.List.length; _i++) {
+      if (id === _i) {
+        NavList.List[id].hide = false;
+      } else {
+        NavList.List[_i].hide = true;
+      }
     }
-    NavList.List[id].hide = false;
 
     NavList.Active = id;
 
@@ -79,7 +98,7 @@ export class SshComponent implements OnInit {
     NavList.List[id].Term.term.write('\x1b[31mWelcome to Jumpserver!\x1b[m\r\n');
 
     socket.on('connect', function () {
-      socket.emit('login', "root");
+      socket.emit('login', 'root');
       socket.emit('machine', host.uuid);
 
       NavList.List[id].Term.term.on('data', function (data) {
@@ -109,14 +128,18 @@ export class SshComponent implements OnInit {
         if (Cookie.get('cols')) {
           cols = parseInt(Cookie.get('cols'));
         }
-        if (col < 80) col = 80;
-        if (row < 24) row = 24;
-        if (cols == col && row == rows) {
+        if (col < 80) {
+          col = 80;
+        }
+        if (row < 24) {
+          row = 24;
+        }
+        if (cols === col && row === rows) {
         } else {
-          for (let tid in NavList.List) {
-            if (NavList.List[tid].connected) {
-              NavList.List[tid].Term.socket.emit('resize', [col, row]);
-              NavList.List[tid].Term.term.resize(col, row);
+          for (let _i = 0; _i < NavList.List.length; _i++) {
+            if (NavList.List[_i].connected) {
+              NavList.List[_i].Term.socket.emit('resize', [col, row]);
+              NavList.List[_i].Term.term.resize(col, row);
             }
           }
           Cookie.set('cols', String(col), 99, '/', document.domain);
@@ -128,19 +151,5 @@ export class SshComponent implements OnInit {
 
   }
 
-  static TerminalDisconnect(host) {
-    host.connected = false;
-    host.Term.socket.destroy();
-    host.Term.term.write('\r\n\x1b[31mBye Bye!\x1b[m\r\n');
-  }
 
-  static TerminalDisconnectAll() {
-    alert("TerminalDisconnectAll");
-    for (let i in NavList.List) {
-      SshComponent.TerminalDisconnect(i);
-      // TermStore.term[i]["connected"] = false;
-      // TermStore.term[i]["socket"].destroy();
-      // TermStore.term[i]["term"].write('\r\n\x1b[31mBye Bye!\x1b[m\r\n');
-    }
-  }
 }
diff --git a/src/app/app.module.ts b/src/app/app.module.ts
index dae62da94b514785c0232f8f67b7663d29a45f1c..e2682157fa9067e285fd92450874a76f696b7850 100644
--- a/src/app/app.module.ts
+++ b/src/app/app.module.ts
@@ -36,6 +36,7 @@ import {NotFoundComponent} from './BasicPage/not-found/not-found.component';
 import {PopupComponent} from './BasicPage/popup/popup.component';
 import { RdppageComponent } from './rdppage/rdppage.component';
 import { TermpageComponent } from './termpage/termpage.component';
+import { ReplayPageComponent } from './replay-page/replay-page.component';
 
 
 @NgModule({
@@ -65,6 +66,7 @@ import { TermpageComponent } from './termpage/termpage.component';
     PopupComponent,
     RdppageComponent,
     TermpageComponent,
+    ReplayPageComponent,
     // HeroListComponent,
     // CrisisListComponent,
   ],
diff --git a/src/app/termpage/termpage.component.html b/src/app/termpage/termpage.component.html
index f309a334755dfda60e36e78dcf154839e58cc88e..94367728d72f13a5cdbd9c5f8da07149d7200cf5 100644
--- a/src/app/termpage/termpage.component.html
+++ b/src/app/termpage/termpage.component.html
@@ -1,2 +1,7 @@
 <span id="liuzheng">liuzheng</span>
+<i class="fa fa-backward" aria-hidden="true"></i>
+<i class="fa fa-play" aria-hidden="true"></i>
+<i class="fa fa-stop" aria-hidden="true"></i>
+<i class="fa fa-pause" aria-hidden="true"></i>
+<i class="fa fa-forward" aria-hidden="true"></i>
 <div id="term"></div>
diff --git a/src/app/termpage/termpage.component.ts b/src/app/termpage/termpage.component.ts
index b9d452a5fb8e5e8f193513091561bf3e2cbcaa89..d532710dc847459a1185284ab175e726977d8b35 100644
--- a/src/app/termpage/termpage.component.ts
+++ b/src/app/termpage/termpage.component.ts
@@ -1,6 +1,6 @@
 import {Component, OnInit} from '@angular/core';
 import {ActivatedRoute, Params} from '@angular/router';
-import {DataStore} from "../app.service";
+import {DataStore} from '../app.service';
 import * as io from 'socket.io-client';
 
 declare let jQuery: any;
@@ -21,15 +21,15 @@ export class TermpageComponent implements OnInit {
     this.activatedRoute.params.subscribe((params: Params) => {
       token = params['token'];
     });
-    let socket = io.connect('/ssh');
+    const socket = io.connect('/ssh');
 
-    let term = new Terminal({
+    const term = new Terminal({
       cols: '80',
       rows: '24',
       useStyle: true,
       screenKeys: true,
     });
-    term.open(document.getElementById('term' ), true);
+    term.open(document.getElementById('term'), true);
 
     socket.on('connect', function () {
       socket.emit('token', token);
@@ -46,22 +46,9 @@ export class TermpageComponent implements OnInit {
       socket.on('disconnect', function () {
         term.destroy();
       });
-
-      window.onresize = function () {
-        let col = Math.floor(jQuery('#term').width() / jQuery('#liuzheng').width() * 8) - 3;
-        let row = Math.floor(jQuery('#term').height() / jQuery('#liuzheng').height()) - 5;
-        let rows = 24;
-        let cols = 80;
-
-
-        if (col < 80) col = 80;
-        if (row < 24) row = 24;
-        if (cols == col && row == rows) {
-        } else {
-          socket.emit('resize', [col, row]);
-          term.resize(col, row);
-        }
-      };
+      socket.on('resize', function (data) {
+        term.resize(data.col, data.row);
+      });
       // jQuery(window).resize();
     });