提交 a8ac574d 编写于 作者: J Jason

将XORM改为zgwit/storm,删除了swaggo,体积减小了10MB,更轻量(为了嵌入式)

上级 5de14f8b
......@@ -25,7 +25,7 @@ type _users map[string]string
type _baseAuth struct {
Desc string `yaml:"desc"`
Enable bool `yaml:"disabled"`
Enable bool `yaml:"enable"`
Users _users `yaml:"users"`
}
......
......@@ -2,7 +2,7 @@ package db
import (
"github.com/zgwit/dtu-admin/conf"
"github.com/zgwit/storm"
"github.com/zgwit/storm/v3"
"log"
"os"
"path/filepath"
......
package db
import (
_ "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/model"
"log"
"xorm.io/xorm"
)
var Engine *xorm.Engine
func Open() error {
if Engine != nil {
return nil
}
cfg := conf.Config.Database
var err error
Engine, err = xorm.NewEngine(cfg.Type, cfg.Url)
if err != nil {
return err
}
Engine.ShowSQL(cfg.Debug)
//同步表
err = Engine.Sync2(model.Channel{}, model.User{}, model.Link{}, model.Plugin{})
if err != nil {
return err
}
initial()
return nil
}
func initial() {
var u model.User
has, err := Engine.Where("username=?", "admin").Exist(&u)
if err != nil {
log.Println("query user", err)
return
}
if !has {
u.Username = "admin"
u.Password = "123456"
u.Name = "管理员"
_, _ = Engine.Insert(u)
}
}
......@@ -27,7 +27,7 @@ func (p *Plugin) Handle(msg *packet.Packet) {
func (p *Plugin) handleTransfer(msg *packet.Packet) {
//TODO 找到对应链接,发送之
//TODO 使用 int64 还是 int32
//TODO 使用 int 还是 int32
//p.link.Send(msg.Data[8:])
}
// GENERATED BY THE COMMAND ABOVE; DO NOT EDIT
// This file was generated by swaggo/swag
package docs
import (
"bytes"
"encoding/json"
"strings"
"github.com/alecthomas/template"
"github.com/swaggo/swag"
)
var doc = `{
"schemes": {{ marshal .Schemes }},
"swagger": "2.0",
"info": {
"description": "{{.Description}}",
"title": "{{.Title}}",
"termsOfService": "http://swagger.io/terms/",
"contact": {
"name": "API Support",
"url": "http://www.zgwit.com/support",
"email": "jason@zgwit.com"
},
"license": {
"name": "Apache 2.0",
"url": "http://www.apache.org/licenses/LICENSE-2.0.html"
},
"version": "{{.Version}}"
},
"host": "{{.Host}}",
"basePath": "{{.BasePath}}",
"paths": {}
}`
type swaggerInfo struct {
Version string
Host string
BasePath string
Schemes []string
Title string
Description string
}
// SwaggerInfo holds exported Swagger Info so clients can modify it
var SwaggerInfo = swaggerInfo{
Version: "1.0",
Host: "127.0.0.1",
BasePath: "/open",
Schemes: []string{},
Title: "DTU manager API",
Description: "This is a sample server Petstore server.",
}
type s struct{}
func (s *s) ReadDoc() string {
sInfo := SwaggerInfo
sInfo.Description = strings.Replace(sInfo.Description, "\n", "\\n", -1)
t, err := template.New("swagger_info").Funcs(template.FuncMap{
"marshal": func(v interface{}) string {
a, _ := json.Marshal(v)
return string(a)
},
}).Parse(doc)
if err != nil {
return doc
}
var tpl bytes.Buffer
if err := t.Execute(&tpl, sInfo); err != nil {
return doc
}
return tpl.String()
}
func init() {
swag.Register(swag.Name, &s{})
}
{
"swagger": "2.0",
"info": {
"description": "This is a sample server Petstore server.",
"title": "DTU manager API",
"termsOfService": "http://swagger.io/terms/",
"contact": {
"name": "API Support",
"url": "http://www.zgwit.com/support",
"email": "jason@zgwit.com"
},
"license": {
"name": "Apache 2.0",
"url": "http://www.apache.org/licenses/LICENSE-2.0.html"
},
"version": "1.0"
},
"host": "127.0.0.1",
"basePath": "/open",
"paths": {}
}
\ No newline at end of file
basePath: /open
host: 127.0.0.1
info:
contact:
email: jason@zgwit.com
name: API Support
url: http://www.zgwit.com/support
description: This is a sample server Petstore server.
license:
name: Apache 2.0
url: http://www.apache.org/licenses/LICENSE-2.0.html
termsOfService: http://swagger.io/terms/
title: DTU manager API
version: "1.0"
paths: {}
swagger: "2.0"
......@@ -7,6 +7,8 @@ import (
"fmt"
"github.com/zgwit/dtu-admin/db"
"github.com/zgwit/dtu-admin/model"
"github.com/zgwit/storm/v3"
"github.com/zgwit/storm/v3/q"
"log"
"net"
"regexp"
......@@ -17,7 +19,7 @@ import (
type Channel interface {
Open() error
Close() error
GetLink(id int64) (*Link, error)
GetLink(id int) (*Link, error)
GetChannel() *model.Channel
}
......@@ -66,12 +68,12 @@ func (c *baseChannel) GetChannel() *model.Channel {
func (c *baseChannel) storeLink(l *Link) {
//保存链接
if l.Id > 0 {
_, err := db.Engine.ID(l.Id).Cols("addr", "error", "online", "online_at").Update(&l.Link)
err := db.DB("link").Update(&l.Link)
if err != nil {
log.Println(err)
}
} else {
_, err := db.Engine.Insert(&l.Link)
err := db.DB("link").Save(&l.Link)
if err != nil {
log.Println(err)
}
......@@ -83,11 +85,9 @@ func (c *baseChannel) storeLink(l *Link) {
func (c *baseChannel) storeError(err error) error {
c.Error = err.Error()
_, err = db.Engine.ID(c.Id).Cols("error").Update(&c.Channel)
return err
return db.DB("channel").UpdateField(&c.Channel, "error", c.Error)
}
func (c *baseChannel) checkRegister(buf []byte) (string, error) {
n := len(buf)
if n < c.RegisterMin {
......@@ -143,7 +143,7 @@ func (c *Client) Close() error {
return nil
}
func (c *Client) GetLink(id int64) (*Link, error) {
func (c *Client) GetLink(id int) (*Link, error) {
return c.client, nil
}
......@@ -157,12 +157,13 @@ func (c *Client) receive(conn net.Conn) {
c.client = client
var link model.Link
has, err := db.Engine.Where("channel_id=?", c.Id).And("role=?", "client").Get(&link)
if err != nil {
err := db.DB("link").Select(q.Eq("channel_id", c.Id), q.Eq("role", "client")).First(&link)
if err != storm.ErrNotFound {
//找不到
} else if err != nil {
log.Println(err)
return
}
if has {
} else {
//复用连接,更新地址,状态,等
c.client.Id = link.Id
}
......@@ -250,7 +251,7 @@ func (c *Server) Close() error {
return nil
}
func (c *Server) GetLink(id int64) (*Link, error) {
func (c *Server) GetLink(id int) (*Link, error) {
v, ok := c.clients.Load(id)
if !ok {
return nil, errors.New("连接不存在")
......@@ -294,13 +295,15 @@ func (c *Server) receive(conn net.Conn) {
//查找数据库同通道,同序列号链接,更新数据库中 addr online
var lnk model.Link
has, err := db.Engine.Where("channel_id=?", c.Id).And("serial=?", serial).Get(&lnk)
if err != nil {
err = db.DB("link").Select(q.Eq("channel_id", c.Id), q.Eq("serial", serial)).First(&link)
if err != storm.ErrNotFound {
//找不到
} else if err != nil {
_, _ = link.Send([]byte("数据库异常"))
log.Println(err)
return
}
if has {
} else {
//复用连接,更新地址,状态,等
l, _ := c.GetLink(lnk.Id)
if l != nil {
//如果同序号连接还在正常通讯,则关闭当前连接
......@@ -320,10 +323,8 @@ func (c *Server) receive(conn net.Conn) {
link.Id = lnk.Id
link.Name = lnk.Name
//link.Serial = lnk.Serial
}
//处理剩余内容
if c.RegisterMax > 0 && n > c.RegisterMax {
link.onData(buf[c.RegisterMax:])
......@@ -333,7 +334,6 @@ func (c *Server) receive(conn net.Conn) {
//保存链接
c.storeLink(link)
for link.conn != nil {
n, e := conn.Read(buf)
if e != nil {
......@@ -398,7 +398,7 @@ func (c *PacketServer) Close() error {
return nil
}
func (c *PacketServer) GetLink(id int64) (*Link, error) {
func (c *PacketServer) GetLink(id int) (*Link, error) {
v, ok := c.clients.Load(id)
if !ok {
return nil, errors.New("连接不存在")
......@@ -458,13 +458,15 @@ func (c *PacketServer) receive() {
//查找数据库同通道,同序列号链接,更新数据库中 addr online
var lnk model.Link
has, err := db.Engine.Where("channel_id=?", c.Id).And("serial=?", serial).Get(&lnk)
if err != nil {
err = db.DB("link").Select(q.Eq("channel_id", c.Id), q.Eq("serial", serial)).First(&link)
if err != storm.ErrNotFound {
//找不到
} else if err != nil {
_, _ = link.Send([]byte("数据库异常"))
log.Println(err)
return
}
if has {
} else {
l, _ := c.GetLink(lnk.Id)
if l != nil {
//如果同序号连接还在正常通讯,则关闭当前连接
......@@ -483,10 +485,8 @@ func (c *PacketServer) receive() {
link.Id = lnk.Id
link.Name = lnk.Name
//link.Serial = lnk.Serial
}
//处理剩余内容
if c.RegisterMax > 0 && n > c.RegisterMax {
link.onData(buf[c.RegisterMax:])
......
......@@ -23,7 +23,7 @@ func Channels() []Channel {
func Recovery() error {
var cs []model.Channel
err := db.Engine.Find(&cs)
err := db.DB("channel").All(&cs)
if err != nil {
return err
}
......@@ -54,7 +54,7 @@ func StartChannel(c *model.Channel) (Channel, error) {
return channel, err
}
func DeleteChannel(id int64) error {
func DeleteChannel(id int) error {
v, ok := channels.Load(id)
if !ok {
return errors.New("通道不存在")
......@@ -63,7 +63,7 @@ func DeleteChannel(id int64) error {
return v.(Channel).Close()
}
func GetChannel(id int64) (Channel, error) {
func GetChannel(id int) (Channel, error) {
v, ok := channels.Load(id)
if !ok {
return nil, errors.New("通道不存在")
......@@ -71,7 +71,7 @@ func GetChannel(id int64) (Channel, error) {
return v.(Channel), nil
}
func GetLink(channelId, linkId int64) (*Link, error) {
func GetLink(channelId, linkId int) (*Link, error) {
channel, err := GetChannel(channelId)
if err != nil {
return nil, err
......
......@@ -103,8 +103,8 @@ func (l *Link) Close() error {
return err
}
l.Online = false
_, err = db.Engine.ID(l.Id).Cols("online").Update(&l.Link)
err = db.DB("link").UpdateField(&l.Link, "online", false)
//TODO 数据库中,不应该保存是否在线的状态
l.reportMonitor("close", nil)
return err
......@@ -142,8 +142,8 @@ func (l *Link) reportMonitor(typ string, data []byte) {
func (l *Link) storeError(err error) error {
l.Error = err.Error()
_, err = db.Engine.ID(l.Id).Cols("error").Update(&l.Link)
return err
//_, err = db.Engine.ID(l.Id).Cols("error").Update(&l.Link)
return db.DB("link").UpdateField(&l.Link, "error", l.Error)
}
func newLink(ch Channel, conn net.Conn) *Link {
......
......@@ -3,32 +3,18 @@ module github.com/zgwit/dtu-admin
go 1.13
require (
github.com/DataDog/zstd v1.4.5 // indirect
github.com/Sereal/Sereal v0.0.0-20200820125258-a016b7cda3f3 // indirect
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751
github.com/asdine/storm v2.1.2+incompatible // indirect
github.com/boltdb/bolt v1.3.1 // indirect
github.com/denisbrodbeck/machineid v1.0.1
github.com/gin-contrib/cors v1.3.1
github.com/gin-contrib/sessions v0.0.3
github.com/gin-gonic/gin v1.6.3
github.com/go-openapi/spec v0.19.9 // indirect
github.com/go-openapi/swag v0.19.9 // indirect
github.com/go-sql-driver/mysql v1.5.0
github.com/golang/snappy v0.0.1 // indirect
github.com/gorilla/websocket v1.4.2
github.com/mailru/easyjson v0.7.6 // indirect
github.com/swaggo/gin-swagger v1.2.0
github.com/swaggo/swag v1.6.7
github.com/vmihailenco/msgpack v4.0.4+incompatible // indirect
github.com/zgwit/storm v1.1.0
github.com/zgwit/swagger-files v0.0.0-20200904001329-458bab32e74c
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.1 // indirect
github.com/stretchr/testify v1.6.1 // indirect
github.com/zgwit/storm/v3 v3.2.4
go.etcd.io/bbolt v1.3.5 // indirect
golang.org/x/net v0.0.0-20200822124328-c89045814202
golang.org/x/sys v0.0.0-20200831180312-196b9ba8737a // indirect
golang.org/x/tools v0.0.0-20200828161849-5deb26317202 // indirect
google.golang.org/protobuf v1.25.0 // indirect
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect
golang.org/x/sys v0.0.0-20200908134130-d2e65c121b96 // indirect
gopkg.in/yaml.v2 v2.3.0
xorm.io/xorm v1.0.4
gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 // indirect
)
此差异已折叠。
......@@ -3,7 +3,6 @@ package main
import (
"github.com/denisbrodbeck/machineid"
"github.com/zgwit/dtu-admin/conf"
"github.com/zgwit/dtu-admin/db"
"github.com/zgwit/dtu-admin/dbus"
"github.com/zgwit/dtu-admin/dtu"
"github.com/zgwit/dtu-admin/flag"
......@@ -35,19 +34,20 @@ func main() {
id, err := machineid.ID()
if err != nil {
log.Println("ID错误:", err)
log.Println("获取ID错误:", err)
return
}
log.Println("Machine ID:", id)
log.Println("Machine Id:", id)
err = db.Open()
if err != nil {
log.Println("数据库错误:", err)
return
}
//
//err = db.Open()
//if err != nil {
// log.Println("数据库错误:", err)
// return
//}
//启动总线 TODO 添加配置
err = dbus.Start(":1843")
//启动总线
err = dbus.Start(conf.Config.DBus.Addr)
if err != nil {
log.Println("总线启动失败:", err)
return
......
......@@ -3,28 +3,27 @@ package model
import "time"
type Channel struct {
Id int64 `json:"id"`
Name string `json:"name" xorm:"varchar(64)"`
Error string `json:"error" xorm:"varchar(256)"`
Id int `json:"id" storm:"id,increment"`
Name string `json:"name"`
Error string `json:"error"`
Disabled bool `json:"disabled" xorm:"default 0"` //此处 禁用 直接放到顶级,Update无效
Role string `json:"role" xorm:"varchar(16) notnull"`
Net string `json:"net" xorm:"varchar(16) notnull"`
Addr string `json:"addr" xorm:"varchar(128) notnull"`
Disabled bool `json:"disabled"` //此处 禁用 直接放到顶级,Update无效
Role string `json:"role"`
Net string `json:"net"`
Addr string `json:"addr"`
Timeout int `json:"timeout"`
RegisterEnable bool `json:"register_enable" xorm:"default 0"`
RegisterRegex string `json:"register_regex" xorm:"varchar(128)"`
RegisterEnable bool `json:"register_enable"`
RegisterRegex string `json:"register_regex"`
RegisterMin int `json:"register_min"`
RegisterMax int `json:"register_max"`
HeartBeatEnable bool `json:"heart_beat_enable" xorm:"default 0"`
HeartBeatEnable bool `json:"heart_beat_enable"`
HeartBeatInterval int `json:"heart_beat_interval"`
HeartBeatContent string `json:"heart_beat_content" xorm:"varchar(256)"`
HeartBeatIsHex bool `json:"heart_beat_is_hex" xorm:"default 0"`
HeartBeatContent string `json:"heart_beat_content"`
HeartBeatIsHex bool `json:"heart_beat_is_hex"`
PluginId int64 `json:"plugin_id"`
PluginId int `json:"plugin_id"`
//Creator int `json:"creator"`
CreatedAt time.Time `json:"created_at" xorm:"created"`
CreatedAt time.Time `json:"created_at"`
}
......@@ -5,16 +5,16 @@ import (
)
type Link struct {
Id int64 `json:"id"`
Name string `json:"name" xorm:"varchar(64)"`
Error string `json:"error" xorm:"varchar(256)"`
Serial string `json:"serial" xorm:"varchar(128)"`
Role string `json:"role" xorm:"varchar(16) notnull"`
Net string `json:"net" xorm:"varchar(16) notnull"`
Addr string `json:"addr" xorm:"varchar(128) notnull"`
ChannelId int64 `json:"channel_id"`
PluginId int64 `json:"plugin_id"` //插件ID
Id int `json:"id" storm:"id,increment"`
Name string `json:"name"`
Error string `json:"error"`
Serial string `json:"serial" storm:"index"`
Role string `json:"role"`
Net string `json:"net"`
Addr string `json:"addr"`
ChannelId int `json:"channel_id"`
PluginId int `json:"plugin_id"` //插件ID
Online bool `json:"online"`
OnlineAt time.Time `json:"online_at"`
CreatedAt time.Time `json:"created_at" xorm:"created"`
CreatedAt time.Time `json:"created_at"`
}
......@@ -3,10 +3,10 @@ package model
import "time"
type Plugin struct {
Id int64 `json:"id" storm:"increment"`
Name string `json:"name" xorm:"varchar(64)"`
AppKey string `json:"app_key" xorm:"varchar(64)"`
AppSecret string `json:"app_secret" xorm:"varchar(64)"`
Id int `json:"id" storm:"id,increment"`
Name string `json:"name"`
AppKey string `json:"app_key" store:"index"`
AppSecret string `json:"app_secret"`
ExpireAt time.Time `json:"expire_at"`
CreatedAt time.Time `json:"created_at" xorm:"created"`
CreatedAt time.Time `json:"created_at"`
}
package model
import "time"
type User struct {
//Id,自增
Id int64 `json:"id"`
//用户名
Username string `json:"username" xorm:"varchar(64) notnull unique"`
//密码 MD5加密
Password string `json:"password" xorm:"varchar(64) notnull"`
//姓名
Name string `json:"name" xorm:"varchar(64)"`
//是否禁用
Disabled bool `json:"disabled,omitempty" xorm:"default 0"`
//创建时间
CreatedAt time.Time `json:"created_at" xorm:"created"`
}
......@@ -9,7 +9,7 @@
</div>
<div nz-row>
<div nz-row [nzGutter]="10">
<div nz-col nzSpan="12">
<div class="title">
数据接收
......
package api
import (
"github.com/gin-contrib/sessions"
"github.com/gin-gonic/gin"
"github.com/zgwit/dtu-admin/db"
"github.com/zgwit/dtu-admin/model"
)
type loginObj struct {
Username string `json:"username"`
Password string `json:"password"`
Remember bool `json:"remember"`
}
func authLogin(ctx *gin.Context) {
session := sessions.Default(ctx)
var obj loginObj
err := ctx.ShouldBindJSON(&obj)
if err != nil {
replyFail(ctx, "参数解析错误"+err.Error())
return
}
var user model.User
has, err := db.Engine.Where("username=?", obj.Username).Get(&user)
if err != nil {
replyError(ctx, err)
return
}
if !has {
replyFail(ctx, "无此用户")
return
}
if obj.Password != user.Password {
replyFail(ctx, "密码错误")
return
}
session.Set("user", user)
_ = session.Save()
replyOk(ctx, user)
}
func authLogout(ctx *gin.Context) {
}
func authPassword(ctx *gin.Context) {
}
......@@ -5,6 +5,7 @@ import (
"github.com/zgwit/dtu-admin/db"
"github.com/zgwit/dtu-admin/dtu"
"github.com/zgwit/dtu-admin/model"
"github.com/zgwit/storm/v3/q"
"log"
"net/http"
)
......@@ -19,33 +20,38 @@ func channels(ctx *gin.Context) {
return
}
//op := db.Engine.Where("type=?", body.Net)
op := db.Engine.NewSession()
cond := make([]q.Matcher, 0)
//过滤条件
for _, filter := range body.Filters {
if len(filter.Value) > 0 {
if len(filter.Value) == 1 {
op.And(filter.Key+"=?", filter.Value[0])
} else {
op.In(filter.Key, filter.Value)
}
}
cond = append(cond, q.In(filter.Key, filter.Value))
}
//关键字
if body.Keyword != "" {
kw := "%" + body.Keyword + "%"
op.And("name like ? or addr like ?", kw, kw)
cond = append(cond, q.Re("name", body.Keyword), q.Re("addr", body.Keyword))
}
query := db.DB("channel").Select(cond...)
cnt, err := query.Count(&cs)
if err != nil {
replyError(ctx, err)
return
}
op.Limit(body.Length, body.Offset)
//分页
query = query.Skip(body.Offset).Limit(body.Length)
//排序
if body.SortKey != "" {
if body.SortOrder == "desc" {
op.Desc(body.SortKey)
query = query.OrderBy(body.SortKey).Reverse()
} else {
op.Asc(body.SortKey)
query = query.OrderBy(body.SortKey)
}
} else {
op.Desc("id")
query = query.OrderBy("id").Reverse()
}
cnt, err := op.FindAndCount(&cs)
err = query.Find(&cs)
if err != nil {
replyError(ctx, err)
return
......@@ -66,13 +72,11 @@ func channelCreate(ctx *gin.Context) {
return
}
_, err := db.Engine.Insert(&channel)
err := db.DB("channel").Save(&channel)
if err != nil {
replyError(ctx, err)
return
}
//获取完整内容
_, _ = db.Engine.ID(channel.Id).Get(&channel)
replyOk(ctx, channel)
//启动服务
......@@ -91,7 +95,7 @@ func channelDelete(ctx *gin.Context) {
return
}
_, err := db.Engine.ID(pid.Id).Get(&model.Channel{})
err := db.DB("channel").DeleteStruct(&model.Link{Id: pid.Id})
if err != nil {
replyError(ctx, err)
return
......@@ -128,12 +132,7 @@ func channelModify(ctx *gin.Context) {
}
//log.Println("update", channel)
_, err := db.Engine.ID(pid.Id).
Cols("name", "disabled",
"type", "addr", "role", "timeout",
"register_enable", "register_regex",
"heart_beat_enable", "heart_beat_interval", "heart_beat_content", "heart_beat_is_hex",
"plugin_id").Update(&channel)
err := db.DB("channel").Update(&channel)
if err != nil {
replyError(ctx, err)
return
......@@ -157,24 +156,32 @@ func channelModify(ctx *gin.Context) {
}()
}
func channelGet(ctx *gin.Context) {
func getChannelFromUri(ctx *gin.Context) (*model.Channel, error) {
var pid paramId
if err := ctx.BindUri(&pid); err != nil {
replyError(ctx, err)
return
return nil, err
}
var channel model.Channel
has, err := db.Engine.ID(pid.Id).Get(&channel)
err := db.DB("channel").One("id", pid.Id, &channel)
if err != nil {
return nil, err
}
return &channel, nil
}
func channelGet(ctx *gin.Context) {
var pid paramId
if err := ctx.BindUri(&pid); err != nil {
replyError(ctx, err)
return
}
if !has {
replyFail(ctx, "找不到通道")
var channel model.Channel
err := db.DB("channel").One("id", pid.Id, &channel)
if err != nil {
replyError(ctx, err)
return
}
replyOk(ctx, channel)
}
......
......@@ -7,6 +7,7 @@ import (
"github.com/zgwit/dtu-admin/db"
"github.com/zgwit/dtu-admin/dtu"
"github.com/zgwit/dtu-admin/model"
"github.com/zgwit/storm/v3/q"
"log"
"net/http"
)
......@@ -21,33 +22,40 @@ func links(ctx *gin.Context) {
return
}
//op := db.Engine.Where("type=?", body.Net)
op := db.Engine.NewSession()
cond := make([]q.Matcher, 0)
//过滤条件
for _, filter := range body.Filters {
if len(filter.Value) > 0 {
if len(filter.Value) == 1 {
op.And(filter.Key+"=?", filter.Value[0])
} else {
op.In(filter.Key, filter.Value)
}
}
cond = append(cond, q.In(filter.Key, filter.Value))
}
//关键字
if body.Keyword != "" {
kw := "%" + body.Keyword + "%"
op.And("name like ? or serial like ? or addr like ?", kw, kw, kw)
cond = append(cond, q.Re("name", body.Keyword), q.Re("serial", body.Keyword), q.Re("addr", body.Keyword))
}
query := db.DB("channel").Select(cond...)
//计算总数
cnt, err := query.Count(&ls)
if err != nil {
replyError(ctx, err)
return
}
op.Limit(body.Length, body.Offset)
//分页
query = query.Skip(body.Offset).Limit(body.Length)
//排序
if body.SortKey != "" {
if body.SortOrder == "desc" {
op.Desc(body.SortKey)
query = query.OrderBy(body.SortKey).Reverse()
} else {
op.Asc(body.SortKey)
query = query.OrderBy(body.SortKey)
}
} else {
op.Desc("id")
query = query.OrderBy("id").Reverse()
}
cnt, err := op.FindAndCount(&ls)
err = query.Find(&ls)
if err != nil {
replyError(ctx, err)
return
......@@ -69,18 +77,14 @@ func linkDelete(ctx *gin.Context) {
}
var link model.Link
has, err := db.Engine.ID(pid.Id).Get(&link)
err := db.DB("link").DeleteStruct(&model.Link{Id: pid.Id})
if err != nil {
replyError(ctx, err)
return
}
if !has {
replyFail(ctx, "记录不存在")
return
}
replyOk(ctx, nil)
//删除服务
go func() {
c, err := dtu.GetChannel(link.ChannelId)
if err != nil {
......@@ -111,11 +115,12 @@ func linkModify(ctx *gin.Context) {
return
}
_, err := db.Engine.ID(pid.Id).Cols("name", "serial", "addr", "channel_id", "plugin_id").Update(&link)
err := db.DB("link").Update(&link)
if err != nil {
replyError(ctx, err)
return
}
replyOk(ctx, link)
//TODO 重新启动服务
......@@ -130,15 +135,11 @@ func linkGet(ctx *gin.Context) {
}
var link model.Link
has, err := db.Engine.ID(pid.Id).Get(&link)
err := db.DB("link").One("id", pid.Id, &link)
if err != nil {
replyError(ctx, err)
return
}
if !has {
replyFail(ctx, "找不到通道")
return
}
replyOk(ctx, link)
}
......@@ -157,15 +158,11 @@ func linkMonitor(ctx *gin.Context) {
}
var link model.Link
has, err := db.Engine.ID(pid.Id).Get(&link)
err := db.DB("link").One("id", pid.Id, &link)
if err != nil {
replyError(ctx, err)
return
}
if !has {
replyFail(ctx, "找不到通道")
return
}
lnk, err := dtu.GetLink(link.ChannelId, link.Id)
if err != nil {
......@@ -209,15 +206,11 @@ func linkSend(ctx *gin.Context) {
}
var link model.Link
has, err := db.Engine.ID(pid.Id).Get(&link)
err = db.DB("link").One("id", pid.Id, &link)
if err != nil {
replyError(ctx, err)
return
}
if !has {
replyFail(ctx, "找不到通道")
return
}
lnk, err := dtu.GetLink(link.ChannelId, link.Id)
if err != nil {
......
......@@ -3,6 +3,7 @@ package api
import (
"github.com/gin-contrib/sessions"
"github.com/gin-gonic/gin"
"github.com/zgwit/dtu-admin/conf"
"net/http"
)
......@@ -21,17 +22,28 @@ type paramSearch struct {
}
type paramId struct {
Id int64 `uri:"id"`
Id int `uri:"id"`
}
type paramId2 struct {
Id int64 `uri:"id"`
Id2 int64 `uri:"id2"`
Id int `uri:"id"`
Id2 int `uri:"id2"`
}
func mustLogin(c *gin.Context) {
session := sessions.Default(c)
if user := session.Get("user"); user != nil {
authorized := false
if conf.Config.SysAdmin.Enable {
session := sessions.Default(c)
if user := session.Get("user"); user != nil {
authorized = true
}
} else if conf.Config.BaseAuth.Enable {
_, authorized = c.Get(gin.AuthUserKey)
} else {
authorized = true
}
if authorized {
c.Next()
} else {
c.JSON(http.StatusUnauthorized, gin.H{"ok": false, "error": "Unauthorized"})
......@@ -41,12 +53,11 @@ func mustLogin(c *gin.Context) {
func RegisterRoutes(app *gin.RouterGroup) {
//app.POST("/login", authLogin)
//app.DELETE("/logout", authLogout)
//app.POST("/password", authPassword)
//检查 session,必须登录
app.Use(mustLogin) //TODO 返回前端静态文件,如果找不到,
app.Use(mustLogin)
//TODO 转移至子目录,并使用中间件,检查session及权限
app.POST("/channels", channels)
......
......@@ -4,14 +4,10 @@ import (
"github.com/gin-contrib/sessions"
"github.com/gin-contrib/sessions/memstore"
"github.com/gin-gonic/gin"
//"github.com/swaggo/files"
"github.com/swaggo/gin-swagger"
"github.com/zgwit/dtu-admin/conf"
_ "github.com/zgwit/dtu-admin/docs"
"github.com/zgwit/dtu-admin/web/api"
"github.com/zgwit/dtu-admin/web/open"
wwwFiles "github.com/zgwit/dtu-admin/www"
swaggerFiles "github.com/zgwit/swagger-files"
"log"
"net/http"
)
......@@ -26,7 +22,7 @@ func Serve() {
//加入swagger会增加10MB多体积,使用github.com/zgwit/swagger-files,去除Map文件,可以节省7MB左右
//Swagger文档,需要先执行swag init生成文档
app.GET("/docs/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))
//app.GET("/docs/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))
open.RegisterRoutes(app.Group("/open"))
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册