Commit 0863e0ba authored by liuzheng712's avatar liuzheng712 Committed by i317280

feat: update

parent 8a3ae051
......@@ -17,21 +17,21 @@ server.run = function (options) {
// create shell process
term = pty.fork(
process.env.SHELL || 'sh',
[],
{
name: require('fs').existsSync('/usr/share/terminfo/x/xterm-256color')
? 'xterm-256color'
: 'xterm',
cols: 80,
rows: 24,
cwd: process.env.HOME
}
process.env.SHELL || 'sh',
[],
{
name: require('fs').existsSync('/usr/share/terminfo/x/xterm-256color')
? 'xterm-256color'
: 'xterm',
cols: 80,
rows: 24,
cwd: process.env.HOME
}
);
//
// // store term's output into buffer or emit through socket
term.on('data', function (data) {
return !socket ? buff.push(data) : socket.emit('data', data);
return !socket ? buff.push(data) : socket.emit('data', data);
});
// console.log('Created shell with pty master/slave pair (master: %d, pid: %d)', term.fd, term.pid);
......@@ -47,9 +47,9 @@ server.run = function (options) {
apis.route('/browser')
.post(function (req, res) {
console.log(req);
res.string('');
// res.json({verified: true, csrf: "liuzheng"})
// console.log(req);
// res.string('');
res.json({verified: true, csrf: "liuzheng"})
});
apis.route('/checklogin')
.post(function (req, res) {
......
......@@ -390,12 +390,6 @@
"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",
......@@ -851,43 +845,49 @@
"dev": true
},
"body-parser": {
"version": "1.17.2",
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.17.2.tgz",
"integrity": "sha1-+IkqvI+eYn1Crtr7yma/WrmRBO4=",
"dev": true,
"version": "1.18.2",
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz",
"integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=",
"requires": {
"bytes": "2.4.0",
"content-type": "1.0.2",
"debug": "2.6.7",
"bytes": "3.0.0",
"content-type": "1.0.4",
"debug": "2.6.9",
"depd": "1.1.1",
"http-errors": "1.6.2",
"iconv-lite": "0.4.15",
"iconv-lite": "0.4.19",
"on-finished": "2.3.0",
"qs": "6.4.0",
"raw-body": "2.2.0",
"qs": "6.5.1",
"raw-body": "2.3.2",
"type-is": "1.6.15"
},
"dependencies": {
"bytes": {
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/bytes/-/bytes-2.4.0.tgz",
"integrity": "sha1-fZcZb51br39pNeJZhVSe3SpsIzk=",
"dev": true
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
"integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg="
},
"content-type": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
"integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
},
"debug": {
"version": "2.6.7",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.7.tgz",
"integrity": "sha1-krrR9tBbu2u6Isyoi80OyJTChh4=",
"dev": true,
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"requires": {
"ms": "2.0.0"
}
},
"iconv-lite": {
"version": "0.4.15",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.15.tgz",
"integrity": "sha1-/iZaIYrGpXz+hUkn6dBMGYJe3es=",
"dev": true
"version": "0.4.19",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz",
"integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ=="
},
"qs": {
"version": "6.5.1",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz",
"integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A=="
}
}
},
......@@ -1371,20 +1371,6 @@
"integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
"dev": true
},
"codelyzer": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-3.1.2.tgz",
"integrity": "sha1-n/HwQfubXuXb60W6hm368EmDrwQ=",
"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",
......@@ -1763,15 +1749,6 @@
"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",
......@@ -1958,8 +1935,7 @@
"depd": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz",
"integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=",
"dev": true
"integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k="
},
"des.js": {
"version": "1.0.0",
......@@ -2165,8 +2141,7 @@
"ee-first": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
"integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=",
"dev": true
"integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
},
"electron-to-chromium": {
"version": "1.3.18",
......@@ -4352,7 +4327,6 @@
"version": "1.6.2",
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz",
"integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=",
"dev": true,
"requires": {
"depd": "1.1.1",
"inherits": "2.0.3",
......@@ -4544,8 +4518,7 @@
"inherits": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
"dev": true
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
},
"ini": {
"version": "1.3.4",
......@@ -5239,7 +5212,7 @@
"dev": true,
"requires": {
"bluebird": "3.5.0",
"body-parser": "1.17.2",
"body-parser": "1.18.2",
"chokidar": "1.7.0",
"colors": "1.1.2",
"combine-lists": "1.0.1",
......@@ -5804,8 +5777,7 @@
"media-typer": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
"integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=",
"dev": true
"integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
},
"mem": {
"version": "1.1.0",
......@@ -6380,7 +6352,6 @@
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
"integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
"dev": true,
"requires": {
"ee-first": "1.1.1"
}
......@@ -7566,27 +7537,25 @@
"dev": true
},
"raw-body": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.2.0.tgz",
"integrity": "sha1-mUl2z2pQlqQRYoQEkvC9xdbn+5Y=",
"dev": true,
"version": "2.3.2",
"resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz",
"integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=",
"requires": {
"bytes": "2.4.0",
"iconv-lite": "0.4.15",
"bytes": "3.0.0",
"http-errors": "1.6.2",
"iconv-lite": "0.4.19",
"unpipe": "1.0.0"
},
"dependencies": {
"bytes": {
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/bytes/-/bytes-2.4.0.tgz",
"integrity": "sha1-fZcZb51br39pNeJZhVSe3SpsIzk=",
"dev": true
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
"integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg="
},
"iconv-lite": {
"version": "0.4.15",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.15.tgz",
"integrity": "sha1-/iZaIYrGpXz+hUkn6dBMGYJe3es=",
"dev": true
"version": "0.4.19",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz",
"integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ=="
}
}
},
......@@ -8095,15 +8064,6 @@
"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.15.4",
"resolved": "https://registry.npmjs.org/send/-/send-0.15.4.tgz",
......@@ -8181,8 +8141,7 @@
"setprototypeof": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz",
"integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=",
"dev": true
"integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ="
},
"sha.js": {
"version": "2.4.8",
......@@ -8547,8 +8506,7 @@
"statuses": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz",
"integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=",
"dev": true
"integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4="
},
"stdout-stream": {
"version": "1.4.0",
......@@ -9119,7 +9077,6 @@
"version": "1.6.15",
"resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz",
"integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA=",
"dev": true,
"requires": {
"media-typer": "0.3.0",
"mime-types": "2.1.16"
......@@ -9248,8 +9205,7 @@
"unpipe": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
"integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=",
"dev": true
"integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
},
"upper-case": {
"version": "1.1.3",
......
......@@ -22,6 +22,7 @@
"@angular/platform-browser-dynamic": "^4.2.4",
"@angular/router": "^4.2.4",
"angular2-logger": "^0.6.0",
"body-parser": "^1.18.2",
"bootstrap": "^4.0.0-alpha.6",
"clipboard": "^1.7.1",
"core-js": "^2.4.1",
......@@ -31,9 +32,9 @@
"pty.js": "^0.3.1",
"rxjs": "^5.4.2",
"socket.io": "^2.0.3",
"ssh-keygen": "^0.4.1",
"tether": "^1.4.0",
"xterm": "^2.9.2",
"ssh-keygen": "^0.4.1",
"zone.js": "^0.8.14"
},
"devDependencies": {
......@@ -43,7 +44,6 @@
"@types/jasmine": "~2.5.53",
"@types/jasminewd2": "~2.0.2",
"@types/node": "~6.0.60",
"codelyzer": "~3.1.1",
"jasmine-core": "~2.6.2",
"jasmine-spec-reporter": "~4.1.0",
"karma": "~1.7.0",
......
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { FooterComponent } from './footer.component';
describe('FooterComponent', () => {
let component: FooterComponent;
let fixture: ComponentFixture<FooterComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ FooterComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(FooterComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should be created', () => {
expect(component).toBeTruthy();
});
});
/**
* Created by liuzheng on 2017/8/30.
*/
import {Component} from '@angular/core';
import {Component, OnInit} from '@angular/core';
import {Logger} from 'angular2-logger/core';
import {AppService, DataStore, User} from '../app.service';
import {AppService, DataStore, User} from '../../app.service';
@Component({
selector: 'app-footer',
templateUrl: './footer.html',
templateUrl: './footer.component.html',
styleUrls: ['./footer.component.css'],
providers: [AppService]
})
})
export class FooterComponent implements OnInit {
export class FooterComponent {
DataStore = DataStore;
User = User;
......@@ -25,4 +20,7 @@ export class FooterComponent {
// this._appService.getnav()
}
ngOnInit() {
}
}
/* login form */
form {
top: 80px;
position: relative;
width: 300px;
margin: auto;
......@@ -77,12 +78,6 @@ form button[type=submit] {
cursor: pointer;
}
canvas {
position: fixed;
top: 0;
z-index: 5;
}
.form {
z-index: 9;
}
......
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { LoginComponent } from './login.component';
describe('LoginComponent', () => {
let component: LoginComponent;
let fixture: ComponentFixture<LoginComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ LoginComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(LoginComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should be created', () => {
expect(component).toBeTruthy();
});
});
/**
* Created by liuzheng on 2017/9/16.
*/
import {Component, OnInit} from '@angular/core';
import {Logger} from 'angular2-logger/core';
import {AppService, DataStore, User} from '../app.service';
import {AppService, DataStore, User} from '../../app.service';
import {NgForm} from '@angular/forms';
declare let jQuery: any;
@Component({
selector: 'app-root',
templateUrl: './login.html',
styleUrls: ['./login.css'],
selector: 'app-login',
templateUrl: './login.component.html',
styleUrls: ['./login.component.css'],
providers: [AppService]
})
// ToDo: ngEnter and redirect to default page
export class LoginComponent implements OnInit {
DataStore = DataStore;
User = User;
......@@ -40,49 +34,5 @@ export class LoginComponent implements OnInit {
jQuery('#form').fadeIn('slow');
// this._router.navigate(['login']);
// jQuery('nav').hide();
const vm = this;
window.onresize = function () {
if (!User.logined) {
vm.background();
}
};
this.timer();
}
timer() {
if (DataStore.windowsize[0] !== document.documentElement.clientWidth ||
DataStore.windowsize[1] !== document.documentElement.clientHeight &&
!User.logined) {
jQuery(window).trigger('resize');
DataStore.windowsize = [document.documentElement.clientWidth, document.documentElement.clientHeight];
}
setTimeout(() => {
this.timer();
}, 33);
}
background() {
const q = jQuery('#q')[0];
const width = q.width = document.documentElement.clientWidth;
const height = q.height = document.documentElement.clientHeight;
const letters = [];
for (let i = 0; i < 256; i++) {
letters.push(Math.round(Math.random() * i * 33));
}
const draw = function () {
q.getContext('2d').fillStyle = 'rgba(0,0,0,.05)';
q.getContext('2d').fillRect(0, 0, width, height);
q.getContext('2d').fillStyle = '#0F0';
letters.map(function (y_pos, index) {
const text = String.fromCharCode(65 + Math.random() * 26);
const x_pos = index * 10;
q.getContext('2d').fillText(text, x_pos, y_pos);
letters[index] = (y_pos > 758 + Math.random() * 1e4) ? 0 : y_pos + 10;
});
};
setInterval(draw, 33);
}
}
/**
* Created by liuzheng on 2017/8/30.
*/
import {Component} from '@angular/core';
import {Logger} from 'angular2-logger/core';
// declare var Clipboard: any;
// declare var layer: any;
import {AppService, DataStore, User} from '../app.service';
//noinspection TypeScriptValidateTypes
@Component({
selector: 'app-nav',
templateUrl: './nav.html',
// directives: [NgClass]
})
export class NavComponent {
DataStore = DataStore;
User = User;
constructor(private _appService: AppService,
private _logger: Logger) {
this._logger.log('nav.ts:NavComponent');
// this._appService.getnav()
}
// ngOnInit() {
//
// }
//
// click(event) {
// this._logger.debug('nav.ts:NavComponent,click', event);
// if (event === 'ReloadLeftbar') {
// this._appService.ReloadLeftbar();
// } else if (event === 'HideLeft') {
// this._appService.HideLeft();
// } else if (event === 'ShowLeft') {
// this._appService.ShowLeft();
// } else if (event === 'Copy') {
// this._appService.copy();
// } else if (event === 'Disconnect') {
// this._appService.TerminalDisconnect(DataStore.termActive);
// } else if (event === 'DisconnectAll') {
// this._appService.TerminalDisconnectAll();
// } else if (event === 'Website') {
// window.open('http://www.jumpserver.org');
// } else if (event === 'BBS') {
// window.open('http://bbs.jumpserver.org');
// } else if (event === 'EnterLicense') {
// this.EnterLicense();
// }
// }
//
// EnterLicense() {
// layer.prompt({
// formType: 2,
// maxlength: 500,
// title: 'Please Input Code',
// scrollbar: false,
// area: ['400px', '300px'],
// moveOut: true,
// moveType: 1
// }, function (value, index) {
// DataStore.socket.emit('key', value);
// // layer.msg(value); //得到value
// layer.close(index);
//
// });
// }
}
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { NavComponent } from './nav.component';
describe('NavComponent', () => {
let component: NavComponent;
let fixture: ComponentFixture<NavComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ NavComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(NavComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should be created', () => {
expect(component).toBeTruthy();
});
});
/**
* Created by liuzheng on 2017/8/30.
*/
import {Component} from '@angular/core';
import {Component, OnInit} from '@angular/core';
import {Logger} from 'angular2-logger/core';
import {AppService, DataStore} from '../app.service';
import {AppService, DataStore, User} from '../../app.service';
//noinspection TypeScriptValidateTypes
@Component({
selector: 'app-leftbar',
templateUrl: './leftbar.html',
// directives: [NgClass]
selector: 'app-nav',
templateUrl: './nav.component.html',
styleUrls: ['./nav.component.css']
})
export class LeftbarComponent {
// DataStore = DataStore;
export class NavComponent implements OnInit {
DataStore = DataStore;
User = User;
constructor(private _appService: AppService,
private _logger: Logger) {
......@@ -25,4 +18,7 @@ export class LeftbarComponent {
// this._appService.getnav()
}
ngOnInit() {
}
}
/**
* filetree.css
* */
:root {
font-family: "Hiragino Kaku Gothic ProN", Meiryo, sans-serif;
}
.filetree input[type="checkbox"] {
display: none;
}
.filetree ul {
height: 0;
overflow: hidden;
}
.filetree > li input:checked ~ ul {
height: auto;
}
.filetree li {
list-style: none;
}
.filetree label {
padding-left: 33px;
line-height: 33px;
display: inline-block;
}
/**
* Icon
* */
.filetree label {
background-image: url('./icon.png');
background-repeat: no-repeat;
}
.filetree input[type="checkbox"] + label {
background-position: 0 0;
width: 100%;
height: 33px;
}
.filetree input[type="checkbox"]:checked + label {
background-position: 0 -33px;
width: 100%;
height: 30px;
}
@media screen and (-webkit-min-device-pixel-ratio: 1.0), screen and (min--moz-device-pixel-ratio: 1.0), screen and (-o-min-device-pixel-ratio: 100/100), screen and (min-device-pixel-ratio: 1.0), screen and (min-resolution: 1.0dppx) {
filetree label {
background-image: url('./icon.png');
-webkit-background-size: 33px 63px;
-moz-background-size: 33px 63px;
background-size: 33px 63px;
}
}
<div id="sidebar">
<app-search></app-search>
<ul class="filetree">
<li *ngFor="let hostGroup of HostGroups">
<input type="checkbox" id="level1-1">
<label for="level1-1">{{hostGroup.name}}</label>
<ul>
<li *ngFor="let host of hostGroup.children" (click)="TerminalConnect()">{{host.name}}</li>
<li *ngFor="let host of hostGroup.children" (click)="Connect(host)">{{host.name}}</li>
</ul>
</li>
</ul>
......
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { CleftbarComponent } from './cleftbar.component';
describe('CleftbarComponent', () => {
let component: CleftbarComponent;
let fixture: ComponentFixture<CleftbarComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ CleftbarComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(CleftbarComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should be created', () => {
expect(component).toBeTruthy();
});
});
import {Component} from '@angular/core';
import {Component, OnInit} from '@angular/core';
import {Logger} from 'angular2-logger/core';
import {AppService, DataStore} from '../app.service';
import {TerminalComponent} from './terminal';
import {AppService, DataStore} from '../../app.service';
import {SshComponent} from '../console/ssh/ssh.component';
//noinspection TypeScriptValidateTypes
@Component({
selector: 'term-leftbar',
templateUrl: './leftbar.html',
styleUrls: ['../../../node_modules/filetree-css/filetree.css', './leftbar.css'],
providers: [TerminalComponent]
})
selector: 'app-cleftbar',
templateUrl: './cleftbar.component.html',
styleUrls: ['./cleftbar.component.css'],
providers: [SshComponent]
export class TermLeftBar {
})
export class CleftbarComponent implements OnInit {
DataStore = DataStore;
HostGroups = [
{
......@@ -23,20 +21,33 @@ export class TermLeftBar {
children: [
{
name: "ops-redis",
id: "xxxx"
uuid: "xxxx",
type: "ssh"
}, {
name: "ops-win",
uuid: "win-aasdf",
type: "rdp"
}
],
}];
constructor(private _appService: AppService,
private _term: TerminalComponent,
private _term: SshComponent,
private _logger: Logger) {
this._logger.log('nav.ts:NavComponent');
// this._appService.getnav()
}
TerminalConnect() {
this._term.TerminalConnect("sss");
ngOnInit() {
}
Connect(host) {
if (host.type === 'ssh') {
this._term.TerminalConnect(host.uuid);
} else {
}
}
}
<app-consolenav></app-consolenav>
<app-ssh></app-ssh>
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { ConsoleComponent } from './console.component';
describe('ConsoleComponent', () => {
let component: ConsoleComponent;
let fixture: ComponentFixture<ConsoleComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ ConsoleComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(ConsoleComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should be created', () => {
expect(component).toBeTruthy();
});
});
import {Component, OnInit} from '@angular/core';
export class Term {
nick: string;
edit: boolean;
machine: string;
connected: boolean;
closed: boolean;
socket: any;
term: any;
hide: boolean;
}
export let NavList: {
term: Array<Term>;
termlist: Array<string>;
termActive: number;
} = {
term: [new Term()],
termlist: [],
termActive: 0,
};
@Component({
selector: 'app-console',
templateUrl: './console.component.html',
styleUrls: ['./console.component.css']
})
export class ConsoleComponent implements OnInit {
constructor() {
}
ngOnInit() {
}
}
......@@ -83,60 +83,3 @@
height: 18px;
border-bottom: 3px solid #7f3f98 !important;
}
#term {
width: 100%;
height: 100%;
}
#term > div {
border-left: 10px solid black;
border-top: 10px solid black;
background-color: black;
height:100%;
}
.terminal {
border: #000 solid 5px;
color: #f0f0f0;
box-shadow: rgba(0, 0, 0, 0.8) 2px 2px 20px;
white-space: nowrap;
display: inline-block;
width: 100%;
height: 100%;
background-color: black;
}
#term .terminal div span {
min-width: 12px;
}
.reverse-video {
color: #000;
background: #f0f0f0;
}
.termChangBar {
line-height: 1;
margin: 0 auto;
border: 1px solid #ffffff;
color: #fff;
background-color: #ffffff;
position: fixed;
right: 0;
top: 0;
}
.hidden {
display: none;
}
#liuzheng {
position: fixed;
top: 0;
left: 0;
z-index: -1;
font-size: 11px !important;
padding-bottom: 16px !important;
font-family: 'Monaco', iosevka !important;
}
<div id="tabs">
<ul>
<li *ngFor="let m of TermStore.term;let i = index"
[ngClass]="{'active':i==TermStore.termActive,'disconnected':!m.connected, 'hidden': m.closed != false}"
<li *ngFor="let m of NavList.term;let i = index"
[ngClass]="{'active':i==NavList.termActive,'disconnected':!m.connected, 'hidden': m.closed != false}"
id="termnav-{{i}}" (click)="setActive(i)">
<span *ngIf="!m.edit" (dblclick)="m.edit=true;setActive(i)">{{m.nick}}</span>
<input *ngIf="m.edit" [(ngModel)]="m.nick" autofocus (blur)="m.edit=false" (keyup.enter)="m.edit=false"/>
......@@ -9,12 +9,3 @@
</li>
</ul>
</div>
<div id="term">
<!--<div-->
<!--[ngClass]="{'disconnected':!DataStore.term[0].connected, 'hidden': i!=DataStore.termActive || DataStore.term[0].closed}"-->
<!--id="term-0"></div>-->
<div *ngFor="let m of TermStore.term;let i=index"
[ngClass]="{'disconnected':!m.connected,'hidden': m.hide}" id="term-{{i}}">
</div>
</div>
<span id="liuzheng">liuzheng</span>
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { ConsolenavComponent } from './consolenav.component';
describe('ConsolenavComponent', () => {
let component: ConsolenavComponent;
let fixture: ComponentFixture<ConsolenavComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ ConsolenavComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(ConsolenavComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should be created', () => {
expect(component).toBeTruthy();
});
});
import {Component, OnInit} from '@angular/core';
import {NavList} from '../console.component'
@Component({
selector: 'app-consolenav',
templateUrl: './consolenav.component.html',
styleUrls: ['./consolenav.component.css']
})
export class ConsolenavComponent implements OnInit {
setActive = ConsolenavComponent.setActive;
NavList = NavList;
constructor() {
}
ngOnInit() {
}
static checkActive(index) {
let len = NavList.term.length;
if (len == 1) {
// 唯一一个
NavList.termActive = 0;
} else if (len - 1 == index) {
// 删了最后一个
NavList.termActive = len - 2;
} else {
NavList.termActive = index;
}
ConsolenavComponent.setActive(NavList.termActive)
}
static setActive(index) {
for (let m in NavList.term) {
NavList.term[m].hide = true;
}
NavList.term[index].hide = false;
NavList.termActive = index;
}
}
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { RdpComponent } from './rdp.component';
describe('RdpComponent', () => {
let component: RdpComponent;
let fixture: ComponentFixture<RdpComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ RdpComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(RdpComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should be created', () => {
expect(component).toBeTruthy();
});
});
import { Component, OnInit } from '@angular/core';
@Component({
selector: 'app-rdp',
templateUrl: './rdp.component.html',
styleUrls: ['./rdp.component.css']
})
export class RdpComponent implements OnInit {
constructor() { }
ngOnInit() {
}
}
#term {
width: 100%;
height: 100%;
padding: 15px;
}
#term > div {
height:100%;
}
.terminal {
border: #000 solid 5px;
color: #f0f0f0;
box-shadow: rgba(0, 0, 0, 0.8) 2px 2px 20px;
white-space: nowrap;
display: inline-block;
width: 100%;
height: 100%;
background-color: black;
}
#term .terminal div span {
min-width: 12px;
}
.reverse-video {
color: #000;
background: #f0f0f0;
}
.termChangBar {
line-height: 1;
margin: 0 auto;
border: 1px solid #ffffff;
color: #fff;
background-color: #ffffff;
position: fixed;
right: 0;
top: 0;
}
.hidden {
display: none;
}
#liuzheng {
position: fixed;
top: 0;
left: 0;
z-index: -1;
font-size: 11px !important;
padding-bottom: 16px !important;
font-family: 'Monaco', iosevka !important;
}
<div id="term">
<!--<div-->
<!--[ngClass]="{'disconnected':!DataStore.term[0].connected, 'hidden': i!=DataStore.termActive || DataStore.term[0].closed}"-->
<!--id="term-0"></div>-->
<div *ngFor="let m of NavList.term;let i=index"
[ngClass]="{'disconnected':!m.connected,'hidden': m.hide}" id="term-{{i}}">
</div>
</div>
<span id="liuzheng">liuzheng</span>
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { SshComponent } from './ssh.component';
describe('SshComponent', () => {
let component: SshComponent;
let fixture: ComponentFixture<SshComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ SshComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(SshComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should be created', () => {
expect(component).toBeTruthy();
});
});
......@@ -5,108 +5,24 @@ import {Cookie} from 'ng2-cookies/ng2-cookies';
declare let jQuery: any;
declare let Terminal: any;
import {AppService, DataStore} from '../../../app.service';
import {NavList, Term} from '../console.component';
import {AppService, DataStore} from '../app.service';
import {logger} from "codelyzer/util/logger";
export class Term {
nick: string;
edit: boolean;
machine: string;
connected: boolean;
closed: boolean;
socket: any;
term: any;
hide: boolean;
}
export let TermStore: {
term: Array<Term>;
termlist: Array<string>;
termActive: number;
} = {
term: [new Term()],
termlist: [],
termActive: 0,
};
@Component({
selector: 'term-body',
templateUrl: './terminal.html',
styleUrls: ['./terminal.css'],
// directives: [NgClass]
selector: 'app-ssh',
templateUrl: './ssh.component.html',
styleUrls: ['./ssh.component.css']
})
export class TerminalComponent implements OnInit {
DataStore = DataStore;
TermStore = TermStore;
export class SshComponent implements OnInit {
NavList = NavList;
constructor(private _appService: AppService,
private _logger: Logger) {
this._logger.log('TermComponent.ts:TermComponent');
this._logger.log('ConsoleComponent.ts:ConsoleComponent');
}
ngOnInit() {
//TermStore.term[0]["term"].open(document.getElementById("term-0"))
this.timer();
}
ngAfterViewInit() {
// this._appService.TerminalConnect({});
//this._logger.debug("term width ", jQuery("#term").width());
//this._logger.debug("term height", jQuery("#term").height());
}
timer() {
if (TermStore.termlist.length > 0) {
for (let i in TermStore.termlist) {
this.TerminalConnect(TermStore.termlist[i]);
}
TermStore.termlist = []
}
jQuery(window).trigger('resize');
setTimeout(() => {
this.timer()
}, 0)
}
close(i) {
this._logger.debug(i);
TerminalComponent.TerminalDisconnect(i);
TermStore.term[i].hide = true;
TermStore.term[i].closed = true;
TermStore.term[i].term.destroy();
TermStore.term.splice(i, 1);
TerminalComponent.checkActive(i);
}
static checkActive(index) {
let len = TermStore.term.length;
if (len == 1) {
// 唯一一个
TermStore.termActive = 0;
} else if (len - 1 == index) {
// 删了最后一个
TermStore.termActive = len - 2;
} else {
TermStore.termActive = index;
}
TerminalComponent.setActive(TermStore.termActive)
}
setActive = TerminalComponent.setActive;
static setActive(index) {
for (let m in TermStore.term) {
TermStore.term[m].hide = true;
}
TermStore.term[index].hide = false;
TermStore.termActive = index;
}
dblclick() {
console.log(TermStore.term)
}
TerminalConnect(uuid) {
......@@ -123,46 +39,46 @@ export class TerminalComponent implements OnInit {
Cookie.set('rows', rows, 99, '/', document.domain);
let id = TermStore.term.length - 1;
TermStore.term[id].machine = 'localhost';
TermStore.term[id].nick = 'localhost';
TermStore.term[id].connected = true;
TermStore.term[id].socket = socket;
TermStore.term[id].edit = false;
TermStore.term[id].closed = false;
TermStore.term[id].term = new Terminal({
let id = NavList.term.length - 1;
NavList.term[id].machine = 'localhost';
NavList.term[id].nick = 'localhost';
NavList.term[id].connected = true;
NavList.term[id].socket = socket;
NavList.term[id].edit = false;
NavList.term[id].closed = false;
NavList.term[id].term = new Terminal({
cols: cols,
rows: rows,
useStyle: true,
screenKeys: true,
});
TermStore.term.push(new Term());
for (let m in TermStore.term) {
TermStore.term[m].hide = true;
NavList.term.push(new Term());
for (let m in NavList.term) {
NavList.term[m].hide = true;
}
TermStore.term[id].hide = false;
NavList.term[id].hide = false;
TermStore.termActive = id;
NavList.termActive = id;
// TermStore.term[id]['term'].on('title', function (title) {
// document.title = title;
// });
TermStore.term[id].term.open(document.getElementById('term-' + id), true);
NavList.term[id].term.open(document.getElementById('term-' + id), true);
TermStore.term[id].term.write('\x1b[31mWelcome to Jumpserver!\x1b[m\r\n');
NavList.term[id].term.write('\x1b[31mWelcome to Jumpserver!\x1b[m\r\n');
socket.on('connect', function () {
socket.emit('machine', uuid);
TermStore.term[id].term.on('data', function (data) {
NavList.term[id].term.on('data', function (data) {
socket.emit('data', data);
});
socket.on('data', function (data) {
TermStore.term[id].term.write(data);
NavList.term[id].term.write(data);
});
socket.on('disconnect', function () {
......@@ -187,10 +103,10 @@ export class TerminalComponent implements OnInit {
if (row < 24) row = 24;
if (cols == col && row == rows) {
} else {
for (let tid in TermStore.term) {
if (TermStore.term[tid].connected) {
TermStore.term[tid].socket.emit('resize', [col, row]);
TermStore.term[tid].term.resize(col, row);
for (let tid in NavList.term) {
if (NavList.term[tid].connected) {
NavList.term[tid].socket.emit('resize', [col, row]);
NavList.term[tid].term.resize(col, row);
}
}
Cookie.set('cols', String(col), 99, '/', document.domain);
......@@ -202,15 +118,15 @@ export class TerminalComponent implements OnInit {
}
static 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');
NavList.term[i].connected = false;
NavList.term[i].socket.destroy();
NavList.term[i].term.write('\r\n\x1b[31mBye Bye!\x1b[m\r\n');
}
static TerminalDisconnectAll() {
alert("TerminalDisconnectAll");
for (let i in TermStore.term) {
TerminalComponent.TerminalDisconnect(i);
for (let i in NavList.term) {
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');
......
......@@ -6,4 +6,15 @@ div, term-leftbar, term-body {
div {
top: 55px;
background-color: black;
margin: 0;
}
app-cleftbar {
background-color: white;
padding: 0;
}
app-console {
padding: 0;
}
<div class="container-fluid row">
<app-cleftbar class="col-md-2" ></app-cleftbar>
<app-console class="col-md-10" ></app-console>
</div>
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { ConsolePageComponent } from './consolepage.component';
describe('ConsolePageComponent', () => {
let component: ConsolePageComponent;
let fixture: ComponentFixture<ConsolePageComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ ConsolePageComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(ConsolePageComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should be created', () => {
expect(component).toBeTruthy();
});
});
/**
* Created by liuzheng on 2017/8/31.
*/
import {Component, OnInit} from '@angular/core';
import {AppService, DataStore, User} from '../app.service';
@Component({
selector: 'app-root',
templateUrl: './main.html',
styleUrls: ['./main.css'],
providers: [AppService],
})
selector: 'app-consolepage',
templateUrl: './consolepage.component.html',
styleUrls: ['./consolepage.component.css'],
providers: [AppService]
export class TermPage {
})
export class ConsolePageComponent implements OnInit {
DataStore = DataStore;
User = User;
// DataStore = DataStore;
constructor() {
}
ngOnInit() {
}
}
.left-search {
padding-left: 14px;
width: 100%;
border: none;
}
<input class="left-search" placeholder=" Search ..." maxlength="2048" name="q" autocomplete="off"
title="Search"
type="text" tabindex="1" spellcheck="false" autofocus [(ngModel)]="q" (keyup.enter)="search()"
(ngModelChange)="modelChange($event)">
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { SearchComponent } from './search.component';
describe('SearchComponent', () => {
let component: SearchComponent;
let fixture: ComponentFixture<SearchComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ SearchComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(SearchComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should be created', () => {
expect(component).toBeTruthy();
});
});
import {Component, OnChanges, Input} from '@angular/core';
import {Logger} from 'angular2-logger/core';
import {AppService, DataStore} from '../../app.service';
@Component({
selector: 'app-search',
templateUrl: './search.component.html',
styleUrls: ['./search.component.css']
})
export class SearchComponent implements OnChanges {
@Input() input;
q: string;
constructor(private _appService: AppService,
private _logger: Logger) {
this._logger.log('LeftbarComponent.ts:SearchBar');
}
ngOnChanges(changes) {
this.q = changes.input.currentValue;
}
modelChange($event) {
this._appService.Search(this.q)
}
search() {
this._appService.Search(this.q)
}
}
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { IleftbarComponent } from './ileftbar.component';
describe('IleftbarComponent', () => {
let component: IleftbarComponent;
let fixture: ComponentFixture<IleftbarComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ IleftbarComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(IleftbarComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should be created', () => {
expect(component).toBeTruthy();
});
});
import {Component, OnInit} from '@angular/core';
import {Logger} from 'angular2-logger/core';
import {AppService, DataStore} from '../../app.service';
@Component({
selector: 'app-ileftbar',
templateUrl: './ileftbar.component.html',
styleUrls: ['./ileftbar.component.css']
})
export class IleftbarComponent implements OnInit {
constructor(private _appService: AppService,
private _logger: Logger) {
this._logger.log('nav.ts:NavComponent');
// this._appService.getnav()
}
ngOnInit() {
}
}
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { IndexPageComponent } from './index-page.component';
describe('IndexPageComponent', () => {
let component: IndexPageComponent;
let fixture: ComponentFixture<IndexPageComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ IndexPageComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(IndexPageComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should be created', () => {
expect(component).toBeTruthy();
});
});
import {Component, OnInit} from '@angular/core';
import {AppService, User} from '../app.service';
@Component({
selector: 'app-index-page',
templateUrl: './index-page.component.html',
styleUrls: ['./index-page.component.css'],
providers: [AppService]
})
export class IndexPageComponent implements OnInit {
User = User;
constructor() {
}
ngOnInit() {
}
}
/**
* Created by liuzheng on 2017/8/31.
*/
import {Component} from '@angular/core';
import {AppService, User} from '../app.service';
@Component({
templateUrl: './welcome.html',
providers: [AppService]
// directives: [LeftbarComponent, TermComponent]
})
export class WelcomeComponent {
// DataStore = DataStore;
User = User;
// DataStore = DataStore;
}
.filetree > li {
width: 200px;
}
.filetree li > input[type="checkbox"] + label {
width: 100px;
}
div {
height: 100%;
}
<div class="container-fluid row">
<term-leftbar class="col-md-2" ></term-leftbar>
<term-body class="col-md-10" ></term-body>
</div>
......@@ -5,16 +5,16 @@ import {NgModule} from '@angular/core';
import {RouterModule, Routes} from '@angular/router';
import {environment} from '../environments/environment';
import {WelcomeComponent} from './IndexPage/welcome.component';
import {IndexPageComponent} from './IndexPage/index-page.component';
import {PageNotFoundComponent} from './BasicPage/not-found.component';
import {LoginComponent} from './BasicPage/login.component';
import {TermPage} from './TerminalPage/main';
import {LoginComponent} from './BasicPage/login/login.component';
import {ConsolePageComponent} from './ConsolePage/consolepage.component';
const appRoutes: Routes = [
// { path: 'crisis-center', component: CrisisListComponent },
{path: 'welcome', component: WelcomeComponent}, // <-- delete this line
{path: 'welcome', component: IndexPageComponent}, // <-- delete this line
{path: 'login', component: LoginComponent},
{path: 'term', component: TermPage},
{path: 'term', component: ConsolePageComponent},
{path: '', redirectTo: '/welcome', pathMatch: 'full'},
{path: '**', component: PageNotFoundComponent}
];
......
......@@ -12,17 +12,20 @@ import {AppRoutingModule} from './app-routing.module';
import {AppComponent} from './app.component';
import {WelcomeComponent} from './IndexPage/welcome.component';
import {LeftbarComponent} from './IndexPage/leftbar.component';
import {NavComponent} from './BasicPage/nav.component';
import {FooterComponent} from './BasicPage/footer.component';
import {NavComponent} from './BasicPage/nav/nav.component';
import {LoginComponent} from './BasicPage/login/login.component';
import {FooterComponent} from './BasicPage/footer/footer.component';
import {PageNotFoundComponent} from './BasicPage/not-found.component';
import {LoginComponent} from './BasicPage/login.component';
import {TermPage} from './TerminalPage/main';
import {TermLeftBar} from './TerminalPage/leftbar';
import {TerminalComponent} from './TerminalPage/terminal';
import {SearchComponent} from './ConsolePage/search/search.component';
import {IleftbarComponent} from './IndexPage/ileftbar/ileftbar.component';
import {CleftbarComponent} from './ConsolePage/cleftbar/cleftbar.component';
import {ConsoleComponent} from './ConsolePage/console/console.component';
import {ConsolenavComponent} from './ConsolePage/console/consolenav/consolenav.component';
import {RdpComponent} from './ConsolePage/console/rdp/rdp.component';
import {SshComponent} from './ConsolePage/console/ssh/ssh.component';
import {ConsolePageComponent} from './ConsolePage/consolepage.component';
import {IndexPageComponent} from './IndexPage/index-page.component';
@NgModule({
......@@ -34,16 +37,20 @@ import {TerminalComponent} from './TerminalPage/terminal';
],
declarations: [
AppComponent,
WelcomeComponent,
NavComponent,
LeftbarComponent,
FooterComponent,
PageNotFoundComponent,
NavComponent,
LoginComponent,
FooterComponent,
TermPage,
TermLeftBar,
TerminalComponent
RdpComponent,
SshComponent,
SearchComponent,
IleftbarComponent,
CleftbarComponent,
ConsoleComponent,
ConsolenavComponent,
ConsolePageComponent,
IndexPageComponent
// HeroListComponent,
// CrisisListComponent,
],
......
......@@ -170,7 +170,7 @@ export class HttpService {
@Injectable()
export class AppService {
// user:User = user ;
// searchrequest: any;
searchrequest: any;
constructor(private _http: HttpService,
private _router: Router,
......@@ -304,6 +304,25 @@ export class AppService {
this._http.post('/api/browser', JSON.stringify(Browser)).map(res => res.json()).subscribe()
}
Search(q) {
if (this.searchrequest) {
this.searchrequest.unsubscribe();
}
this.searchrequest = this._http.get('/api/search?q=' + q)
.map(res => res.json())
.subscribe(
data => {
this._logger.log(data);
},
err => {
this._logger.error(err);
},
() => {
}
);
this._logger.log(q)
}
//
//
// HideLeft() {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment