提交 5382ea64 编写于 作者: J Jason

将通道改好了

上级 bf868b0e
...@@ -2,6 +2,8 @@ package db ...@@ -2,6 +2,8 @@ package db
import ( import (
_ "github.com/go-sql-driver/mysql" _ "github.com/go-sql-driver/mysql"
//_ "github.com/lib/pq" //PostgreSQL
//_ "github.com/mattn/go-sqlite3" //需要GCC并且启用CGO
"github.com/zgwit/dtu-admin/conf" "github.com/zgwit/dtu-admin/conf"
"github.com/zgwit/dtu-admin/model" "github.com/zgwit/dtu-admin/model"
"log" "log"
......
...@@ -11,15 +11,14 @@ import ( ...@@ -11,15 +11,14 @@ import (
"time" "time"
) )
type Channel struct { type Channel struct {
model.Channel model.Channel
Error string Error string
listener net.Listener listener net.Listener
packetConn net.PacketConn packetConn net.PacketConn
packetIndexes sync.Map //<Link> packetIndexes sync.Map //<Link>
...@@ -33,15 +32,18 @@ func NewChannel(channel *model.Channel) *Channel { ...@@ -33,15 +32,18 @@ func NewChannel(channel *model.Channel) *Channel {
} }
func (c *Channel) Open() error { func (c *Channel) Open() error {
if c.IsServer { switch c.Role {
case "server":
return c.Listen() return c.Listen()
} else { case "client":
return c.Dial() return c.Dial()
default:
return errors.New("未知角色")
} }
} }
func (c *Channel) Dial() error { func (c *Channel) Dial() error {
conn, err := net.Dial(c.Type, c.Addr) conn, err := net.Dial(c.Net, c.Addr)
if err != nil { if err != nil {
return err return err
} }
...@@ -55,16 +57,16 @@ func (c *Channel) Dial() error { ...@@ -55,16 +57,16 @@ func (c *Channel) Dial() error {
func (c *Channel) Listen() error { func (c *Channel) Listen() error {
var err error var err error
switch c.Type { switch c.Net {
case "tcp", "tcp4", "tcp6", "unix": case "tcp", "tcp4", "tcp6", "unix":
c.listener, err = net.Listen(c.Type, c.Addr) c.listener, err = net.Listen(c.Net, c.Addr)
if err != nil { if err != nil {
return err return err
} }
go c.accept() go c.accept()
case "udp", "udp4", "udp6", "unixgram": case "udp", "udp4", "udp6", "unixgram":
c.packetConn, err = net.ListenPacket(c.Type, c.Addr) c.packetConn, err = net.ListenPacket(c.Net, c.Addr)
if err != nil { if err != nil {
return err return err
...@@ -131,12 +133,12 @@ func (c *Channel) receive(conn net.Conn) { ...@@ -131,12 +133,12 @@ func (c *Channel) receive(conn net.Conn) {
} }
func (c *Channel) storeLink(conn *Link) { func (c *Channel) storeLink(conn *Link) {
lnk := model.Link{ lnk := model.Link{
Addr: conn.RemoteAddr.String(), Addr: conn.RemoteAddr.String(),
ChannelId: c.Id, ChannelId: c.Id,
Created: time.Now(), Created: time.Now(),
} }
//storage.DB("link").Save(&lnk) //storage.DB("link").Save(&lnk)
......
...@@ -8,9 +8,9 @@ type Channel struct { ...@@ -8,9 +8,9 @@ type Channel struct {
//Tags string `json:"tags" xorm:"varchar(256)"` //Tags string `json:"tags" xorm:"varchar(256)"`
Disabled bool `json:"disabled" xorm:"default 0"` //此处 禁用 直接放到顶级,Update无效 Disabled bool `json:"disabled" xorm:"default 0"` //此处 禁用 直接放到顶级,Update无效
Type string `json:"type" xorm:"varchar(16) notnull"` Role string `json:"role" xorm:"varchar(16) notnull"`
Net string `json:"net" xorm:"varchar(16) notnull"`
Addr string `json:"addr" xorm:"varchar(128) notnull"` Addr string `json:"addr" xorm:"varchar(128) notnull"`
IsServer bool `json:"is_server" xorm:"default 0"`
Timeout int `json:"timeout"` //TODO 改为秒 Timeout int `json:"timeout"` //TODO 改为秒
RegisterEnable bool `json:"register_enable" xorm:"default 0"` RegisterEnable bool `json:"register_enable" xorm:"default 0"`
......
...@@ -30,15 +30,16 @@ export class ApiService { ...@@ -30,15 +30,16 @@ export class ApiService {
} }
return of({error: err.message}); return of({error: err.message});
}), }),
// 统一错误处理 // 统一错误处理,阻断 complete
map((ret: any) => { // map((ret: any) => {
if (ret && ret.error) { // if (ret && ret.error) {
// 有错误统一显示并不是好的做法 // // 有错误统一显示并不是好的做法
this.message.create('error', ret.error); // this.message.create('error', ret.error);
throw new Error(ret.error); // throw new Error(ret.error);
} // }
return ret; // return ret;
})); // })
);
} }
get(uri: string, params?: { [k: string]: any }): Observable<any> { get(uri: string, params?: { [k: string]: any }): Observable<any> {
......
...@@ -13,11 +13,11 @@ ...@@ -13,11 +13,11 @@
</div> </div>
<div nz-col nzSpan="20"> <div nz-col nzSpan="20">
<nz-input-group style="display: flex"> <nz-input-group style="display: flex">
<nz-select [(ngModel)]="channel.is_server"> <nz-select [(ngModel)]="channel.role">
<nz-option nzLabel="服务端" [nzValue]="true"></nz-option> <nz-option nzLabel="服务端" nzValue="server"></nz-option>
<nz-option nzLabel="客户端" [nzValue]="false"></nz-option> <nz-option nzLabel="客户端" nzValue="client"></nz-option>
</nz-select> </nz-select>
<nz-select [(ngModel)]="channel.type" style="width:80px;"> <nz-select [(ngModel)]="channel.net" style="width:80px;">
<nz-option nzLabel="TCP" nzValue="tcp"></nz-option> <nz-option nzLabel="TCP" nzValue="tcp"></nz-option>
<nz-option nzLabel="UDP" nzValue="udp"></nz-option> <nz-option nzLabel="UDP" nzValue="udp"></nz-option>
</nz-select> </nz-select>
......
<nz-space> <nz-space>
<nz-space-item> <nz-space-item>
<button nz-button (click)="load()"> <button nz-button (click)="load()" [nzLoading]="loading">
<i nz-icon nzType="reload"></i> <i nz-icon nzType="reload"></i>
刷新 刷新
</button> </button>
...@@ -11,24 +11,35 @@ ...@@ -11,24 +11,35 @@
创建 创建
</button> </button>
</nz-space-item> </nz-space-item>
<nz-space-item>TODO: 按名称搜索,标签筛选,状态筛选等,以及排序,后台翻页</nz-space-item> <nz-space-item>
<nz-input-group nzSearch nzCompact [nzAddOnAfter]="suffixButton">
<input type="text" nz-input [(ngModel)]="keyword" placeholder="名称、地址"/>
</nz-input-group>
<ng-template #suffixButton>
<button nz-button nzSearch (click)="search()">搜索</button>
</ng-template>
</nz-space-item>
</nz-space> </nz-space>
<nz-table #basicTable [nzData]="channels"> <nz-table #tbl [nzData]="channels" nzTableLayout="fixed" [nzFrontPagination]="false" [nzPageSize]="pageSize"
[nzPageIndex]="pageIndex" [nzTotal]="total" [nzLoading]="loading" (nzQueryParams)="onTableQuery($event)">
<thead> <thead>
<tr> <tr>
<th>ID</th> <th>ID</th>
<th>名称</th> <th>名称</th>
<th>网络</th> <th nzColumnKey="role" nzShowFilter [nzFilterFn]="true" [nzFilters]="roleFilters">角色</th>
<th>状态</th> <th nzColumnKey="net" nzShowFilter [nzFilterFn]="true" [nzFilters]="netFilters">网络</th>
<th>创建时间</th> <th nzColumnKey="status" nzShowFilter [nzFilterFn]="true" [nzFilters]="statusFilters">状态</th>
<th nzColumnKey="created" nzColumnKey="created" [nzSortFn]="true">创建时间</th>
<th></th> <th></th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<tr *ngFor="let data of basicTable.data"> <tr *ngFor="let data of tbl.data">
<td>{{ data.id }}</td> <td>{{ data.id }}</td>
<td>{{ data.name }}</td> <td>{{ data.name }}</td>
<td>{{ data.is_server ? '服务端':'客户端' }} {{data.type}} {{data.addr}}</td> <td>{{ data.role }}</td>
<td>{{data.net}} {{data.addr}}</td>
<td> <td>
{{data.disabled ? '禁用' : ''}} {{data.disabled ? '禁用' : ''}}
<a>启动/停止</a> <a>启动/停止</a>
......
import {Component, OnInit, ViewContainerRef} from '@angular/core'; import {Component, OnInit, ViewContainerRef} from '@angular/core';
import {ApiService} from '../../api.service'; import {ApiService} from '../../api.service';
import {ChannelEditComponent} from '../channel-edit/channel-edit.component'; import {ChannelEditComponent} from '../channel-edit/channel-edit.component';
import {NzDrawerService, NzModalService} from 'ng-zorro-antd'; import {NzDrawerService, NzModalService, NzTableQueryParams} from 'ng-zorro-antd';
import {ChannelDetailComponent} from "../channel-detail/channel-detail.component"; import {ChannelDetailComponent} from "../channel-detail/channel-detail.component";
@Component({ @Component({
...@@ -12,22 +12,70 @@ import {ChannelDetailComponent} from "../channel-detail/channel-detail.component ...@@ -12,22 +12,70 @@ import {ChannelDetailComponent} from "../channel-detail/channel-detail.component
export class ChannelComponent implements OnInit { export class ChannelComponent implements OnInit {
channels: []; channels: [];
total = 0;
pageIndex = 1;
pageSize = 10;
sortField = null;
sortOrder = null;
filters = [];
keyword = '';
loading = false;
constructor(private as: ApiService, private modal: NzModalService, private viewContainerRef: ViewContainerRef, private drawer: NzDrawerService) { roleFilters = [{text: '服务器', value: true}, {text: '客户端', value: false}];
netFilters = [{text: 'TCP', value: 'tcp'}, {text: 'UDP', value: 'udp'}];
statusFilters = [{text: '启动', value: 1}];
constructor(private as: ApiService, private modal: NzModalService, private viewContainerRef: ViewContainerRef,
private drawer: NzDrawerService) {
} }
ngOnInit(): void { ngOnInit(): void {
this.loadFilters();
}
reload(): void {
this.pageIndex = 1;
this.keyword = '';
this.load(); this.load();
} }
load(): void { load(): void {
this.as.get('channels').subscribe(res => { this.loading = true;
if (res.ok) { this.as.post('channels', {
this.channels = res.data; offset: (this.pageIndex - 1) * this.pageSize,
} length: this.pageSize,
sortKey: this.sortField,
sortOrder: this.sortOrder,
filters: this.filters,
keyword: this.keyword,
}).subscribe(res => {
console.log('res', res);
this.channels = res.data;
this.total = res.total;
}, error => {
console.log('error', error);
}, () => {
this.loading = false;
}); });
} }
loadFilters(): void {
// this.as.get('distinct/copy/host').subscribe(res => {
// console.log('res', res);
// this.hosts = res.data.map(h => {
// return {
// text: h.host,
// value: h.host
// };
// });
// }, error => {
// console.log('error', error);
// });
}
edit(c?): void { edit(c?): void {
this.drawer.create({ this.drawer.create({
nzTitle: c ? '编辑' : '创建', nzTitle: c ? '编辑' : '创建',
...@@ -35,7 +83,7 @@ export class ChannelComponent implements OnInit { ...@@ -35,7 +83,7 @@ export class ChannelComponent implements OnInit {
nzWidth: 500, nzWidth: 500,
nzContent: ChannelEditComponent, nzContent: ChannelEditComponent,
nzContentParams: { nzContentParams: {
channel: c || {} channel: c || {net: 'tcp', addr: ':1843', is_server: true}
} }
}); });
} }
...@@ -51,4 +99,19 @@ export class ChannelComponent implements OnInit { ...@@ -51,4 +99,19 @@ export class ChannelComponent implements OnInit {
}); });
} }
onTableQuery(params: NzTableQueryParams): void {
const {pageSize, pageIndex, sort, filter} = params;
this.pageSize = pageSize;
this.pageIndex = pageIndex;
const currentSort = sort.find(item => item.value !== null);
this.sortField = (currentSort && currentSort.key) || null;
this.sortOrder = (currentSort && currentSort.value) || null;
this.filters = filter;
this.load();
}
search(): void {
this.pageIndex = 1;
this.load();
}
} }
...@@ -11,7 +11,7 @@ import ( ...@@ -11,7 +11,7 @@ import (
) )
func channels(ctx *gin.Context) { func channels(ctx *gin.Context) {
var cs []model.Channel cs := make([]model.Channel, 0)
var body paramSearch var body paramSearch
err := ctx.ShouldBind(&body) err := ctx.ShouldBind(&body)
...@@ -20,7 +20,7 @@ func channels(ctx *gin.Context) { ...@@ -20,7 +20,7 @@ func channels(ctx *gin.Context) {
return return
} }
//op := db.Engine.Where("type=?", body.Type) //op := db.Engine.Where("type=?", body.Net)
op := db.Engine.NewSession() op := db.Engine.NewSession()
for _, filter := range body.Filters { for _, filter := range body.Filters {
if len(filter.Value) > 0 { if len(filter.Value) > 0 {
...@@ -33,7 +33,7 @@ func channels(ctx *gin.Context) { ...@@ -33,7 +33,7 @@ func channels(ctx *gin.Context) {
} }
if body.Keyword != "" { if body.Keyword != "" {
kw := "%" + body.Keyword + "%" kw := "%" + body.Keyword + "%"
op.And("name like ? or type like ? or addr like ?", kw, kw, kw) op.And("name like ? or addr like ?", kw, kw)
} }
op.Limit(body.Length, body.Offset) op.Limit(body.Length, body.Offset)
...@@ -134,7 +134,7 @@ func channelModify(ctx *gin.Context) { ...@@ -134,7 +134,7 @@ func channelModify(ctx *gin.Context) {
//log.Println("update", channel) //log.Println("update", channel)
_, err := db.Engine.ID(pid.Id). _, err := db.Engine.ID(pid.Id).
Cols("name", "disabled", Cols("name", "disabled",
"type", "addr", "is_server", "timeout", "type", "addr", "role", "timeout",
"register_enable", "register_regex", "register_enable", "register_regex",
"heart_beat_enable", "heart_beat_interval", "heart_beat_content", "heart_beat_is_hex", "heart_beat_enable", "heart_beat_interval", "heart_beat_content", "heart_beat_is_hex",
"plugin_id").Update(&channel) "plugin_id").Update(&channel)
......
...@@ -17,7 +17,7 @@ func links(ctx *gin.Context) { ...@@ -17,7 +17,7 @@ func links(ctx *gin.Context) {
return return
} }
//op := db.Engine.Where("type=?", body.Type) //op := db.Engine.Where("type=?", body.Net)
op := db.Engine.NewSession() op := db.Engine.NewSession()
for _, filter := range body.Filters { for _, filter := range body.Filters {
if len(filter.Value) > 0 { if len(filter.Value) > 0 {
......
...@@ -55,8 +55,7 @@ func RegisterRoutes(app *gin.RouterGroup) { ...@@ -55,8 +55,7 @@ func RegisterRoutes(app *gin.RouterGroup) {
app.POST("/password", authPassword) app.POST("/password", authPassword)
//TODO 转移至子目录,并使用中间件,检查session及权限 //TODO 转移至子目录,并使用中间件,检查session及权限
app.GET("/channels", channels) app.POST("/channels", channels)
//app.POST("/channels")
app.POST("/channel", channelCreate) app.POST("/channel", channelCreate)
app.DELETE("/channel/:id", channelDelete) app.DELETE("/channel/:id", channelDelete)
app.PUT("/channel/:id", channelModify) app.PUT("/channel/:id", channelModify)
...@@ -70,7 +69,7 @@ func RegisterRoutes(app *gin.RouterGroup) { ...@@ -70,7 +69,7 @@ func RegisterRoutes(app *gin.RouterGroup) {
app.GET("/channel/:id/link/:id2/statistic") app.GET("/channel/:id/link/:id2/statistic")
app.GET("/channel/:id/link/:id2/pipe") //转Websocket透传 app.GET("/channel/:id/link/:id2/pipe") //转Websocket透传
app.GET("/links", links) app.POST("/links", links)
app.DELETE("/link/:id", linkDelete) app.DELETE("/link/:id", linkDelete)
app.PUT("/link/:id", linkModify) app.PUT("/link/:id", linkModify)
app.GET("/link/:id", linkGet) app.GET("/link/:id", linkGet)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册