模板代码改造

This commit is contained in:
madao
2024-12-13 20:58:31 +08:00
parent d736efa05f
commit 737cfdf948
23 changed files with 485 additions and 951 deletions

View File

@@ -9,8 +9,8 @@ import (
"github.com/deepch/vdk/av"
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/flvadmin/fileflvmanager/fileflvwriter"
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/utils"
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/dao/entity"
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/service"
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/common"
base_service "github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/service/base"
)
type FileFlvManager struct {
@@ -55,7 +55,8 @@ func NewFileFlvManager(pktStream <-chan av.Packet, code string, codecs []av.Code
code: code,
codecs: codecs,
}
camera, err := service.CameraSelectOne(entity.Camera{Code: code})
condition := common.GetEqualCondition("code", code)
camera, err := base_service.CameraFindOneByCondition(condition)
if err != nil {
logs.Error("query camera error : %v", err)
return ffm

View File

@@ -13,8 +13,8 @@ import (
"github.com/deepch/vdk/av"
"github.com/deepch/vdk/format/flv"
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/utils"
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/dao/entity"
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/service"
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/common"
base_service "github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/service/base"
)
type IFileFlvManager interface {
@@ -81,7 +81,8 @@ func NewFileFlvWriter(
isStart: false,
ffm: ffm,
}
camera, err := service.CameraSelectOne(entity.Camera{Code: code})
condition := common.GetEqualCondition("code", code)
camera, err := base_service.CameraFindOneByCondition(condition)
if err != nil {
logs.Error("query camera error : %v", err)
return ffw

View File

@@ -10,8 +10,8 @@ import (
"github.com/deepch/vdk/av"
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/flvadmin/httpflvmanage/httpflvwriter"
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/utils"
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/dao/entity"
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/service"
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/common"
base_service "github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/service/base"
)
type HttpFlvManager struct {
@@ -55,7 +55,8 @@ func NewHttpFlvManager(pktStream <-chan av.Packet, code string, codecs []av.Code
code: code,
codecs: codecs,
}
camera, err := service.CameraSelectOne(entity.Camera{Code: code})
condition := common.GetEqualCondition("code", code)
camera, err := base_service.CameraFindOneByCondition(condition)
if err != nil {
logs.Error("query camera error : %v", err)
return hfm

View File

@@ -9,8 +9,8 @@ import (
"github.com/deepch/vdk/av"
"github.com/deepch/vdk/format/flv"
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/utils"
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/dao/entity"
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/service"
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/common"
base_service "github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/service/base"
)
type IHttpFlvManager interface {
@@ -82,7 +82,8 @@ func NewHttpFlvWriter(
start: false,
}
camera, err := service.CameraSelectOne(entity.Camera{Code: code})
condition := common.GetEqualCondition("code", code)
camera, err := base_service.CameraFindOneByCondition(condition)
if err != nil {
logs.Error("query camera error : %v", err)
return hfw

View File

@@ -8,8 +8,8 @@ import (
"github.com/deepch/vdk/av"
"github.com/deepch/vdk/format/rtmp"
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/utils"
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/dao/entity"
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/service"
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/common"
base_service "github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/service/base"
)
type IRtmpFlvManager interface {
@@ -75,9 +75,8 @@ func (rfw *RtmpFlvWriter) StopWrite() {
}
func (rfw *RtmpFlvWriter) createConn() error {
var camera entity.Camera
camera.Code = rfw.code
camera, err := service.CameraSelectOne(camera)
condition := common.GetEqualCondition("code", rfw.code)
camera, err := base_service.CameraFindOneByCondition(condition)
if err != nil {
logs.Error("not found camera : %s", rfw.code)
return err
@@ -100,9 +99,8 @@ func (rfw *RtmpFlvWriter) flvWrite() {
}
}()
var camera entity.Camera
camera.Code = rfw.code
camera, err := service.CameraSelectOne(camera)
condition := common.GetEqualCondition("code", rfw.code)
camera, err := base_service.CameraFindOneByCondition(condition)
if err != nil {
logs.Error("not found camera : %s", rfw.code)
return

View File

@@ -10,9 +10,9 @@ import (
"github.com/deepch/vdk/format/rtspv2"
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/rtspclient"
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/utils"
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/controllers"
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/dao/entity"
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/service"
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/common"
ext_controller "github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/controllers/ext"
base_service "github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/service/base"
)
var rcmInstance *RtspClientManager
@@ -32,7 +32,7 @@ func GetSingleRtspClientManager() *RtspClientManager {
func (rs *RtspClientManager) StartClient() {
go rs.startConnections()
go rs.stopConn(controllers.CodeStream())
go rs.stopConn(ext_controller.CodeStream())
}
func (rc *RtspClientManager) ExistsPublisher(code string) bool {
@@ -76,7 +76,8 @@ func (s *RtspClientManager) startConnections() {
logs.Error("rtspManager panic %v", r)
}
}()
es, err := service.CameraSelectAll()
condition := common.GetEmptyCondition()
es, err := base_service.CameraFindCollectionByCondition(condition)
if err != nil {
logs.Error("camera list query error: %s", err)
return
@@ -85,7 +86,8 @@ func (s *RtspClientManager) startConnections() {
for {
timeNow := time.Now()
if timeNow.After(timeTemp.Add(30 * time.Second)) {
es, err = service.CameraSelectAll()
condition := common.GetEmptyCondition()
es, err = base_service.CameraFindCollectionByCondition(condition)
if err != nil {
logs.Error("camera list query error: %s", err)
return
@@ -118,8 +120,8 @@ func (s *RtspClientManager) connRtsp(code string) {
}()
//放置信息表示已经开始
s.rcs.Store(code, struct{}{})
q := entity.Camera{Code: code}
c, err := service.CameraSelectOne(q)
condition := common.GetEqualCondition("code", code)
c, err := base_service.CameraFindOneByCondition(condition)
if err != nil {
logs.Error("find camera [%s] error : %v", code, err)
return
@@ -141,7 +143,7 @@ func (s *RtspClientManager) connRtsp(code string) {
logs.Error("camera [%s] conn : %v", c.Code, err)
c.OnlineStatus = 0
if c.OnlineStatus == 1 {
service.CameraUpdate(c)
base_service.CameraUpdateById(c)
}
return
}
@@ -149,7 +151,7 @@ func (s *RtspClientManager) connRtsp(code string) {
// logs.Warn("camera: %s codecs: %v", code, session.CodecData)
c.OnlineStatus = 1
service.CameraUpdate(c)
base_service.CameraUpdateById(c)
done := make(chan int)
//添加缓冲,缓解前后速率不一致问题,但是如果收包平均速率大于消费平均速率,依然会导致丢包
@@ -207,12 +209,12 @@ Loop:
}
//offline camera
camera, err := service.CameraSelectOne(q)
camera, err := base_service.CameraFindOneByCondition(condition)
if err != nil {
logs.Error("no camera error : %s", code)
} else {
camera.OnlineStatus = 0
service.CameraUpdate(camera)
base_service.CameraUpdateById(camera)
}
logs.Error("camera: %s session Close", code)

View File

@@ -1,5 +1,10 @@
package common
func GetEmptyCondition() (condition AqCondition) {
condition = AqCondition{}
return
}
func GetEqualCondition(fieldName string, value interface{}) (condition AqCondition) {
filterNode := AqFilterNode{}
filterNode.OperatorCode = OPERATOR_CODE_EQUAL
@@ -25,3 +30,25 @@ func GetInCondition(fieldName string, values []interface{}) (condition AqConditi
condition = AqCondition{LogicNode: &logicNode}
return
}
type EqualFilter struct {
Name string
Value interface{}
}
func GetEqualConditions(equalFilters []EqualFilter) (condition AqCondition) {
var filters = []AqFilterNode{}
for _, equalFilter := range equalFilters {
filterNode := AqFilterNode{}
filterNode.OperatorCode = OPERATOR_CODE_EQUAL
filterNode.Name = equalFilter.Name
filterNode.FilterParams = []interface{}{equalFilter.Value}
filters = append(filters, filterNode)
}
logicNode := AqLogicNode{}
logicNode.LogicOperatorCode = LOGIC_OPERATOR_CODE_AND
logicNode.FilterNodes = filters
condition = AqCondition{LogicNode: &logicNode}
return
}

View File

@@ -1,16 +1,5 @@
package common
type Page struct {
Total int `json:"total"`
Page interface{} `json:"page"`
}
type Result struct {
Code int `json:"code"`
Msg string `json:"msg"`
Data interface{} `json:"data"`
}
type AppResult struct {
Status uint32 `json:"status"`
Message string `json:"message"`

View File

@@ -1,373 +0,0 @@
package controllers
import (
"net/http"
"time"
"github.com/beego/beego/v2/core/logs"
"github.com/gin-gonic/gin"
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/flvadmin"
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/utils"
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/common"
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/dao/entity"
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/service"
)
func CameraList(c *gin.Context) {
c.Writer.Header().Set("Access-Control-Allow-Origin", "*")
r := common.Result{Code: 1, Msg: ""}
cameras, err := service.CameraSelectAll()
if err != nil {
logs.Error("no camera found : %v", err)
r.Code = 0
r.Msg = "no camera found"
c.JSON(http.StatusOK, r)
return
}
page := common.Page{Total: len(cameras), Page: cameras}
r.Data = page
c.JSON(http.StatusOK, r)
}
func CameraDetail(c *gin.Context) {
c.Writer.Header().Set("Access-Control-Allow-Origin", "*")
r := common.Result{Code: 1, Msg: ""}
cameraId := c.Query("id")
if cameraId == "" {
logs.Error("no cameraId found")
r.Code = 0
r.Msg = "no cameraId found"
c.JSON(http.StatusOK, r)
return
}
camera, err := service.CameraSelectById(cameraId)
if err != nil {
logs.Error("no camera found : %v", err)
r.Code = 0
r.Msg = "no camera found"
c.JSON(http.StatusOK, r)
return
}
r.Data = camera
c.JSON(http.StatusOK, r)
}
func CameraEdit(c *gin.Context) {
c.Writer.Header().Set("Access-Control-Allow-Origin", "*")
r := common.Result{
Code: 1,
Msg: "",
}
q := entity.Camera{}
err := c.BindJSON(&q)
if err != nil {
logs.Error("param error : %v", err)
r.Code = 0
r.Msg = "param error"
c.JSON(http.StatusOK, r)
return
}
if q.Id == "" || len(q.Id) == 0 {
id, _ := utils.UUID()
count, err := service.CameraCountByCode(q.Code)
if err != nil {
logs.Error("check camera is exist error : %v", err)
r.Code = 0
r.Msg = "check camera is exist"
c.JSON(http.StatusOK, r)
return
}
if count > 0 {
logs.Error("camera code is exist error : %v", err)
r.Code = 0
r.Msg = "camera code is exist"
c.JSON(http.StatusOK, r)
return
}
q.Id = id
q.Created = time.Now()
playAuthCode, _ := utils.UUID()
q.PlayAuthCode = playAuthCode
_, err = service.CameraInsert(q)
if err != nil {
logs.Error("camera insert error : %v", err)
r.Code = 0
r.Msg = "camera insert error"
c.JSON(http.StatusOK, r)
return
}
c.JSON(http.StatusOK, r)
return
}
count, err := service.CameraCountByCode(q.Code)
if err != nil {
logs.Error("check camera is exist error : %v", err)
r.Code = 0
r.Msg = "check camera is exist"
c.JSON(http.StatusOK, r)
return
}
if count > 1 {
logs.Error("camera code is exist error : %v", err)
r.Code = 0
r.Msg = "camera code is exist"
c.JSON(http.StatusOK, r)
return
}
camera, _ := service.CameraSelectById(q.Id)
camera.Code = q.Code
camera.RtspUrl = q.RtspUrl
camera.RtmpUrl = q.RtmpUrl
// camera.Enabled = q.Enabled
_, err = service.CameraUpdate(camera)
if err != nil {
logs.Error("camera insert error : %v", err)
r.Code = 0
r.Msg = "camera insert error"
c.JSON(http.StatusOK, r)
return
}
c.JSON(http.StatusOK, r)
}
func CameraDelete(c *gin.Context) {
c.Writer.Header().Set("Access-Control-Allow-Origin", "*")
r := common.Result{Code: 1, Msg: ""}
id, b := c.Params.Get("id")
if !b {
r.Code = 0
r.Msg = "id is null"
c.JSON(http.StatusOK, r)
return
}
camera := entity.Camera{Id: id}
_, err := service.CameraDelete(camera)
if err != nil {
logs.Error("delete camera error : %v", err)
r.Code = 0
r.Msg = "delete camera error"
c.JSON(http.StatusOK, r)
return
}
//close camera conn
select {
case codeStream <- camera.Code:
case <-time.After(1 * time.Second):
}
c.JSON(http.StatusOK, r)
}
func CameraEnabled(c *gin.Context) {
c.Writer.Header().Set("Access-Control-Allow-Origin", "*")
r := common.Result{Code: 1, Msg: ""}
q := entity.Camera{}
err := c.BindJSON(&q)
if err != nil {
logs.Error("param error : %v", err)
r.Code = 0
r.Msg = "param error"
c.JSON(http.StatusOK, r)
return
}
camera, err := service.CameraSelectById(q.Id)
if err != nil {
logs.Error("query camera error : %v", err)
r.Code = 0
r.Msg = "query camera error"
c.JSON(http.StatusOK, r)
return
}
camera.Enabled = q.Enabled
if q.Enabled != 1 {
camera.OnlineStatus = 0
}
_, err = service.CameraUpdate(camera)
if err != nil {
logs.Error("enabled camera status %d error : %v", camera.Enabled, err)
r.Code = 0
r.Msg = "enabled camera status %d error"
c.JSON(http.StatusOK, r)
return
}
if q.Enabled != 1 {
logs.Debug("close camera conn: %s", camera.Code)
select {
case codeStream <- camera.Code:
case <-time.After(1 * time.Second):
}
}
c.JSON(http.StatusOK, r)
}
func RtmpPushChange(c *gin.Context) {
c.Writer.Header().Set("Access-Control-Allow-Origin", "*")
r := common.Result{Code: 1, Msg: ""}
q := entity.Camera{}
err := c.BindJSON(&q)
if err != nil {
logs.Error("param error : %v", err)
r.Code = 0
r.Msg = "param error"
c.JSON(http.StatusOK, r)
return
}
camera, err := service.CameraSelectById(q.Id)
if err != nil {
logs.Error("query camera error : %v", err)
r.Code = 0
r.Msg = "query camera error"
c.JSON(http.StatusOK, r)
return
}
camera.RtmpPushStatus = q.RtmpPushStatus
_, err = service.CameraUpdate(camera)
if err != nil {
logs.Error("RtmpPushEnabled camera status %d error : %v", camera.Enabled, err)
r.Code = 0
r.Msg = "RtmpPushEnabled camera status %d error"
c.JSON(http.StatusOK, r)
return
}
switch {
case q.RtmpPushStatus != 1:
logs.Info("camera [%s] stop push rtmp", q.Code)
flvadmin.GetSingleRtmpFlvAdmin().StopWrite(q.Code)
case q.RtmpPushStatus == 1:
flvadmin.GetSingleRtmpFlvAdmin().StartWrite(q.Code)
logs.Info("camera [%s] start push rtmp", q.Code)
}
c.JSON(http.StatusOK, r)
}
func CameraSaveVideoChange(c *gin.Context) {
c.Writer.Header().Set("Access-Control-Allow-Origin", "*")
r := common.Result{Code: 1, Msg: ""}
q := entity.Camera{}
err := c.BindJSON(&q)
if err != nil {
logs.Error("param error : %v", err)
r.Code = 0
r.Msg = "param error"
c.JSON(http.StatusOK, r)
return
}
camera, err := service.CameraSelectById(q.Id)
if err != nil {
logs.Error("query camera error : %v", err)
r.Code = 0
r.Msg = "query camera error"
c.JSON(http.StatusOK, r)
return
}
camera.SaveVideo = q.SaveVideo
_, err = service.CameraUpdate(camera)
if err != nil {
logs.Error("SaveVideo camera status %d error : %v", camera.SaveVideo, err)
r.Code = 0
r.Msg = "SaveVideo camera status %d error"
c.JSON(http.StatusOK, r)
return
}
switch {
case q.SaveVideo != 1:
logs.Info("camera [%s] stop save video", q.Code)
flvadmin.GetSingleFileFlvAdmin().StopWrite(q.Code)
case q.SaveVideo == 1:
flvadmin.GetSingleFileFlvAdmin().StartWrite(q.Code)
logs.Info("camera [%s] start save video", q.Code)
}
c.JSON(http.StatusOK, r)
}
func CameraLiveChange(c *gin.Context) {
c.Writer.Header().Set("Access-Control-Allow-Origin", "*")
r := common.Result{Code: 1, Msg: ""}
q := entity.Camera{}
err := c.BindJSON(&q)
if err != nil {
logs.Error("param error : %v", err)
r.Code = 0
r.Msg = "param error"
c.JSON(http.StatusOK, r)
return
}
camera, err := service.CameraSelectById(q.Id)
if err != nil {
logs.Error("query camera error : %v", err)
r.Code = 0
r.Msg = "query camera error"
c.JSON(http.StatusOK, r)
return
}
camera.Live = q.Live
_, err = service.CameraUpdate(camera)
if err != nil {
logs.Error("Live camera status %d error : %v", camera.Live, err)
r.Code = 0
r.Msg = "Live camera status %d error"
c.JSON(http.StatusOK, r)
return
}
switch {
case q.Live != 1:
flvadmin.GetSingleHttpFlvAdmin().StopWrite(q.Code)
case q.Live == 1:
flvadmin.GetSingleHttpFlvAdmin().StartWrite(q.Code)
}
c.JSON(http.StatusOK, r)
}
func CameraPlayAuthCodeReset(c *gin.Context) {
c.Writer.Header().Set("Access-Control-Allow-Origin", "*")
r := common.Result{Code: 1, Msg: ""}
q := entity.Camera{}
err := c.BindJSON(&q)
if err != nil {
logs.Error("param error : %v", err)
r.Code = 0
r.Msg = "param error"
c.JSON(http.StatusOK, r)
return
}
camera, err := service.CameraSelectById(q.Id)
if err != nil {
logs.Error("query camera error : %v", err)
r.Code = 0
r.Msg = "query camera error"
c.JSON(http.StatusOK, r)
return
}
playAuthCode, _ := utils.UUID()
camera.PlayAuthCode = playAuthCode
_, err = service.CameraUpdate(camera)
if err != nil {
logs.Error("PlayAuthCode camera status %d error : %v", camera.PlayAuthCode, err)
r.Code = 0
r.Msg = "PlayAuthCode camera status %d error"
c.JSON(http.StatusOK, r)
return
}
flvadmin.GetSingleHttpFlvAdmin().StopWrite(q.Code)
flvadmin.GetSingleHttpFlvAdmin().StartWrite(q.Code)
c.JSON(http.StatusOK, r)
}
var codeStream = make(chan string)
func CodeStream() <-chan string {
return codeStream
}

View File

@@ -1,153 +0,0 @@
package controllers
import (
"net/http"
"time"
"github.com/beego/beego/v2/core/logs"
"github.com/gin-gonic/gin"
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/utils"
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/common"
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/dao/entity"
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/service"
)
func CameraShareList(c *gin.Context) {
c.Writer.Header().Set("Access-Control-Allow-Origin", "*")
r := common.Result{Code: 1, Msg: ""}
cameraId := c.Query("cameraId")
if cameraId == "" {
logs.Error("no cameraId found")
r.Code = 0
r.Msg = "no cameraId found"
c.JSON(http.StatusOK, r)
return
}
cameraShares, err := service.CameraShareSelectByCameraId(cameraId)
if err != nil {
logs.Error("no camerashare found : %v", err)
r.Code = 0
r.Msg = "no camerashare found"
c.JSON(http.StatusOK, r)
return
}
page := common.Page{Total: len(cameraShares), Page: cameraShares}
r.Data = page
c.JSON(http.StatusOK, r)
}
func CameraShareEdit(c *gin.Context) {
c.Writer.Header().Set("Access-Control-Allow-Origin", "*")
r := common.Result{
Code: 1,
Msg: "",
}
q := entity.CameraShare{}
err := c.BindJSON(&q)
if err != nil {
logs.Error("param error : %v", err)
r.Code = 0
r.Msg = "param error"
c.JSON(http.StatusOK, r)
return
}
_, err = service.CameraSelectById(q.CameraId)
if err != nil {
logs.Error("not fount camera : %v", err)
r.Code = 0
r.Msg = "not fount camera"
c.JSON(http.StatusOK, r)
return
}
if q.Id == "" || len(q.Id) == 0 {
id, _ := utils.UUID()
q.Id = id
q.Created = time.Now()
playAuthCode, _ := utils.UUID()
q.AuthCode = playAuthCode
_, err = service.CameraShareInsert(q)
if err != nil {
logs.Error("camerashare insert error : %v", err)
r.Code = 0
r.Msg = "camerashare insert error"
c.JSON(http.StatusOK, r)
return
}
c.JSON(http.StatusOK, r)
return
}
cameraShare, _ := service.CameraShareSelectById(q.Id)
cameraShare.Name = q.Name
cameraShare.StartTime = q.StartTime
cameraShare.Deadline = q.Deadline
// camera.Enabled = q.Enabled
_, err = service.CameraShareUpdate(cameraShare)
if err != nil {
logs.Error("camerashare insert error : %v", err)
r.Code = 0
r.Msg = "camerashare insert error"
c.JSON(http.StatusOK, r)
return
}
c.JSON(http.StatusOK, r)
}
func CameraShareDelete(c *gin.Context) {
c.Writer.Header().Set("Access-Control-Allow-Origin", "*")
r := common.Result{Code: 1, Msg: ""}
id, b := c.Params.Get("id")
if !b {
r.Code = 0
r.Msg = "id is null"
c.JSON(http.StatusOK, r)
return
}
camera := entity.CameraShare{Id: id}
_, err := service.CameraShareDelete(camera)
if err != nil {
logs.Error("delete camerashare error : %v", err)
r.Code = 0
r.Msg = "delete camerashare error"
c.JSON(http.StatusOK, r)
return
}
c.JSON(http.StatusOK, r)
}
func CameraShareEnabled(c *gin.Context) {
c.Writer.Header().Set("Access-Control-Allow-Origin", "*")
r := common.Result{Code: 1, Msg: ""}
q := entity.CameraShare{}
err := c.BindJSON(&q)
if err != nil {
logs.Error("param error : %v", err)
r.Code = 0
r.Msg = "param error"
c.JSON(http.StatusOK, r)
return
}
camera, err := service.CameraShareSelectById(q.Id)
if err != nil {
logs.Error("query camerashare error : %v", err)
r.Code = 0
r.Msg = "query camerashare error"
c.JSON(http.StatusOK, r)
return
}
camera.Enabled = q.Enabled
_, err = service.CameraShareUpdate(camera)
if err != nil {
logs.Error("enabled camerashare status %d error : %v", camera.Enabled, err)
r.Code = 0
r.Msg = "enabled camerashare status %d error"
c.JSON(http.StatusOK, r)
return
}
c.JSON(http.StatusOK, r)
}

View File

@@ -0,0 +1,212 @@
package controllers
import (
"fmt"
"net/http"
"time"
"github.com/beego/beego/v2/core/logs"
"github.com/gin-gonic/gin"
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/flvadmin"
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/utils"
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/common"
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/dao/entity"
bas_service "github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/service/base"
)
func CameraEnabled(ctx *gin.Context) {
ctx.Writer.Header().Set("Access-Control-Allow-Origin", "*")
q := entity.Camera{}
err := ctx.BindJSON(&q)
if err != nil {
logs.Error("param error : %v", err)
result := common.ErrorResult(fmt.Sprintf("param error : %v", err))
ctx.JSON(http.StatusOK, result)
return
}
camera, err := bas_service.CameraSelectById(q.Id)
if err != nil {
logs.Error("query camera error : %v", err)
result := common.ErrorResult("internal error")
ctx.JSON(http.StatusOK, result)
return
}
camera.Enabled = q.Enabled
if q.Enabled != 1 {
camera.OnlineStatus = 0
}
_, err = bas_service.CameraUpdateById(camera)
if err != nil {
logs.Error("enabled camera status %d error : %v", camera.Enabled, err)
result := common.ErrorResult("internal error")
ctx.JSON(http.StatusOK, result)
return
}
if q.Enabled != 1 {
logs.Debug("close camera conn: %s", camera.Code)
select {
case codeStream <- camera.Code:
case <-time.After(1 * time.Second):
}
}
result := common.SuccessResultWithMsg("succss", camera)
ctx.JSON(http.StatusOK, result)
}
func RtmpPushChange(ctx *gin.Context) {
ctx.Writer.Header().Set("Access-Control-Allow-Origin", "*")
q := entity.Camera{}
err := ctx.BindJSON(&q)
if err != nil {
logs.Error("param error : %v", err)
result := common.ErrorResult(fmt.Sprintf("param error : %v", err))
ctx.JSON(http.StatusOK, result)
return
}
camera, err := bas_service.CameraSelectById(q.Id)
if err != nil {
logs.Error("query camera error : %v", err)
result := common.ErrorResult("internal error")
ctx.JSON(http.StatusOK, result)
return
}
camera.RtmpPushStatus = q.RtmpPushStatus
_, err = bas_service.CameraUpdateById(camera)
if err != nil {
logs.Error("RtmpPushEnabled camera status %d error : %v", camera.Enabled, err)
result := common.ErrorResult("internal error")
ctx.JSON(http.StatusOK, result)
return
}
switch {
case q.RtmpPushStatus != 1:
logs.Info("camera [%s] stop push rtmp", q.Code)
flvadmin.GetSingleRtmpFlvAdmin().StopWrite(q.Code)
case q.RtmpPushStatus == 1:
flvadmin.GetSingleRtmpFlvAdmin().StartWrite(q.Code)
logs.Info("camera [%s] start push rtmp", q.Code)
}
result := common.SuccessResultWithMsg("succss", camera)
ctx.JSON(http.StatusOK, result)
}
func CameraSaveVideoChange(ctx *gin.Context) {
ctx.Writer.Header().Set("Access-Control-Allow-Origin", "*")
q := entity.Camera{}
err := ctx.BindJSON(&q)
if err != nil {
logs.Error("param error : %v", err)
result := common.ErrorResult(fmt.Sprintf("param error : %v", err))
ctx.JSON(http.StatusOK, result)
return
}
camera, err := bas_service.CameraSelectById(q.Id)
if err != nil {
logs.Error("query camera error : %v", err)
result := common.ErrorResult("internal error")
ctx.JSON(http.StatusOK, result)
return
}
camera.SaveVideo = q.SaveVideo
_, err = bas_service.CameraUpdateById(camera)
if err != nil {
logs.Error("SaveVideo camera status %d error : %v", camera.SaveVideo, err)
result := common.ErrorResult("internal error")
ctx.JSON(http.StatusOK, result)
return
}
switch {
case q.SaveVideo != 1:
logs.Info("camera [%s] stop save video", q.Code)
flvadmin.GetSingleFileFlvAdmin().StopWrite(q.Code)
case q.SaveVideo == 1:
flvadmin.GetSingleFileFlvAdmin().StartWrite(q.Code)
logs.Info("camera [%s] start save video", q.Code)
}
result := common.SuccessResultWithMsg("succss", camera)
ctx.JSON(http.StatusOK, result)
}
func CameraLiveChange(ctx *gin.Context) {
ctx.Writer.Header().Set("Access-Control-Allow-Origin", "*")
q := entity.Camera{}
err := ctx.BindJSON(&q)
if err != nil {
logs.Error("param error : %v", err)
result := common.ErrorResult(fmt.Sprintf("param error : %v", err))
ctx.JSON(http.StatusOK, result)
return
}
camera, err := bas_service.CameraSelectById(q.Id)
if err != nil {
logs.Error("query camera error : %v", err)
result := common.ErrorResult("internal error")
ctx.JSON(http.StatusOK, result)
return
}
camera.Live = q.Live
_, err = bas_service.CameraUpdateById(camera)
if err != nil {
logs.Error("Live camera status %d error : %v", camera.Live, err)
result := common.ErrorResult("internal error")
ctx.JSON(http.StatusOK, result)
return
}
switch {
case q.Live != 1:
flvadmin.GetSingleHttpFlvAdmin().StopWrite(q.Code)
case q.Live == 1:
flvadmin.GetSingleHttpFlvAdmin().StartWrite(q.Code)
}
result := common.SuccessResultWithMsg("succss", camera)
ctx.JSON(http.StatusOK, result)
}
func CameraPlayAuthCodeReset(ctx *gin.Context) {
ctx.Writer.Header().Set("Access-Control-Allow-Origin", "*")
q := entity.Camera{}
err := ctx.BindJSON(&q)
if err != nil {
logs.Error("param error : %v", err)
result := common.ErrorResult(fmt.Sprintf("param error : %v", err))
ctx.JSON(http.StatusOK, result)
return
}
camera, err := bas_service.CameraSelectById(q.Id)
if err != nil {
logs.Error("query camera error : %v", err)
result := common.ErrorResult("internal error")
ctx.JSON(http.StatusOK, result)
return
}
playAuthCode, _ := utils.UUID()
camera.PlayAuthCode = playAuthCode
_, err = bas_service.CameraUpdateById(camera)
if err != nil {
logs.Error("PlayAuthCode camera status %d error : %v", camera.PlayAuthCode, err)
result := common.ErrorResult("internal error")
ctx.JSON(http.StatusOK, result)
return
}
flvadmin.GetSingleHttpFlvAdmin().StopWrite(q.Code)
flvadmin.GetSingleHttpFlvAdmin().StartWrite(q.Code)
result := common.SuccessResultWithMsg("succss", camera)
ctx.JSON(http.StatusOK, result)
}
var codeStream = make(chan string)
func CodeStream() <-chan string {
return codeStream
}

View File

@@ -0,0 +1,43 @@
package controllers
import (
"fmt"
"net/http"
"github.com/beego/beego/v2/core/logs"
"github.com/gin-gonic/gin"
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/common"
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/dao/entity"
base_service "github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/service/base"
)
func CameraShareEnabled(ctx *gin.Context) {
ctx.Writer.Header().Set("Access-Control-Allow-Origin", "*")
q := entity.CameraShare{}
err := ctx.BindJSON(&q)
if err != nil {
logs.Error("param error : %v", err)
result := common.ErrorResult(fmt.Sprintf("param error : %v", err))
ctx.JSON(http.StatusOK, result)
return
}
cameraShare, err := base_service.CameraShareSelectById(q.Id)
if err != nil {
logs.Error("query camerashare error : %v", err)
result := common.ErrorResult("internal error")
ctx.JSON(http.StatusOK, result)
return
}
cameraShare.Enabled = q.Enabled
_, err = base_service.CameraShareUpdateById(cameraShare)
if err != nil {
logs.Error("enabled camerashare status %d error : %v", cameraShare.Enabled, err)
result := common.ErrorResult("internal error")
ctx.JSON(http.StatusOK, result)
return
}
result := common.SuccessResultWithMsg("succss", cameraShare)
ctx.JSON(http.StatusOK, result)
}

View File

@@ -0,0 +1,89 @@
package controllers
import (
"fmt"
"net/http"
"runtime/debug"
"strings"
"time"
"github.com/beego/beego/v2/core/logs"
"github.com/gin-gonic/gin"
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/flvadmin"
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/common"
base_service "github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/service/base"
)
func HttpFlvPlay(ctx *gin.Context) {
defer func() {
if result := recover(); result != nil {
logs.Error("system painc : %v \nstack : %v", result, string(debug.Stack()))
}
}()
ctx.Writer.Header().Set("Access-Control-Allow-Origin", "*")
ctx.Writer.Header().Set("Connection", "keep-alive")
uri := strings.TrimSuffix(strings.TrimLeft(ctx.Request.RequestURI, "/"), ".flv")
uris := strings.Split(uri, "/")
if len(uris) < 3 || uris[0] != "live" {
http.Error(ctx.Writer, "invalid path", http.StatusBadRequest)
return
}
method := uris[1]
code := uris[2]
authCode := uris[3]
conditon := common.GetEqualCondition("code", code)
camera, err := base_service.CameraFindOneByCondition(conditon)
if err != nil {
logs.Error("camera query error : %v", err)
result := common.ErrorResult("internal error")
ctx.JSON(http.StatusBadRequest, result)
return
}
if !(method == "temp" || method == "permanent") {
logs.Error("method error : %s", method)
result := common.ErrorResult("internal error")
ctx.JSON(http.StatusBadRequest, result)
return
}
if method == "temp" {
var filters = []common.EqualFilter{{Name: "cameraId", Value: camera.Id}, {Name: "authCode", Value: authCode}}
condition := common.GetEqualConditions(filters)
cs, err := base_service.CameraShareFindOneByCondition(condition)
if err != nil {
logs.Error("CameraShareSelectOne error : %v", err)
result := common.ErrorResult("internal error")
ctx.JSON(http.StatusBadRequest, result)
return
}
if time.Now().Before(cs.StartTime) || time.Now().After(cs.Deadline) {
logs.Error("camera [%s] AuthCodeTemp expired : %s", camera.Code, authCode)
result := common.ErrorResult(fmt.Sprintf("auth error"))
ctx.JSON(http.StatusBadRequest, result)
return
}
}
if method == "permanent" && authCode != camera.PlayAuthCode {
logs.Error("AuthCodePermanent error : %s", authCode)
result := common.ErrorResult(fmt.Sprintf("auth error"))
ctx.JSON(http.StatusBadRequest, result)
return
}
logs.Info("player [%s] addr [%s] connecting", code, ctx.Request.RemoteAddr)
//管理员可以主动中断播放
playerDone := make(chan int)
defer close(playerDone)
const timeout = 10 * time.Second
flvPlayerDone, err := flvadmin.GetSingleHttpFlvAdmin().AddHttpFlvPlayer(playerDone, timeout/2, code, ctx.Writer)
if err != nil {
logs.Error("camera [%s] add player error : %s", code, err)
result := common.ErrorResult("internal error")
ctx.JSON(http.StatusBadRequest, result)
return
}
<-flvPlayerDone
logs.Info("player [%s] addr [%s] exit", code, ctx.Request.RemoteAddr)
}

View File

@@ -1,96 +0,0 @@
package controllers
import (
"net/http"
"runtime/debug"
"strings"
"time"
"github.com/beego/beego/v2/core/logs"
"github.com/gin-gonic/gin"
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/flvadmin"
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/common"
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/dao/entity"
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/service"
)
func HttpFlvPlay(c *gin.Context) {
defer func() {
if r := recover(); r != nil {
logs.Error("system painc : %v \nstack : %v", r, string(debug.Stack()))
}
}()
c.Writer.Header().Set("Access-Control-Allow-Origin", "*")
c.Writer.Header().Set("Connection", "keep-alive")
uri := strings.TrimSuffix(strings.TrimLeft(c.Request.RequestURI, "/"), ".flv")
uris := strings.Split(uri, "/")
if len(uris) < 3 || uris[0] != "live" {
http.Error(c.Writer, "invalid path", http.StatusBadRequest)
return
}
method := uris[1]
code := uris[2]
authCode := uris[3]
r := common.Result{
Code: 1,
Msg: "",
}
q := entity.Camera{Code: code}
camera, err := service.CameraSelectOne(q)
if err != nil {
logs.Error("camera query error : %v", err)
r.Code = 0
r.Msg = "camera query error"
c.JSON(http.StatusBadRequest, r)
return
}
if !(method == "temp" || method == "permanent") {
logs.Error("method error : %s", method)
r.Code = 0
r.Msg = "method error"
c.JSON(http.StatusBadRequest, r)
return
}
if method == "temp" {
csq := entity.CameraShare{CameraId: camera.Id, AuthCode: authCode}
cs, err := service.CameraShareSelectOne(csq)
if err != nil {
logs.Error("CameraShareSelectOne error : %v", err)
r.Code = 0
r.Msg = "system error"
c.JSON(http.StatusBadRequest, r)
return
}
if time.Now().Before(cs.StartTime) || time.Now().After(cs.Deadline) {
logs.Error("camera [%s] AuthCodeTemp expired : %s", camera.Code, authCode)
r.Code = 0
r.Msg = "authCode expired"
c.JSON(http.StatusBadRequest, r)
return
}
}
if method == "permanent" && authCode != camera.PlayAuthCode {
logs.Error("AuthCodePermanent error : %s", authCode)
r.Code = 0
r.Msg = "authCode error"
c.JSON(http.StatusBadRequest, r)
return
}
logs.Info("player [%s] addr [%s] connecting", code, c.Request.RemoteAddr)
//管理员可以主动中断播放
playerDone := make(chan int)
defer close(playerDone)
const timeout = 10 * time.Second
flvPlayerDone, err := flvadmin.GetSingleHttpFlvAdmin().AddHttpFlvPlayer(playerDone, timeout/2, code, c.Writer)
if err != nil {
logs.Error("camera [%s] add player error : %s", code, err)
r.Code = 0
r.Msg = "add player error"
c.JSON(http.StatusBadRequest, r)
return
}
<-flvPlayerDone
logs.Info("player [%s] addr [%s] exit", code, c.Request.RemoteAddr)
}

View File

@@ -0,0 +1,34 @@
package dyn_query
import (
"fmt"
)
func (builder QuerySqlBuilder) GetCountSql() (sqlStr string, params []interface{}, err error) {
sqlStr, params, err = builder.dynQuery.BuildCountSql()
if err != nil {
err = fmt.Errorf("makeSqlByCondition error: %v", err)
return
}
return
}
func (builder QuerySqlBuilder) GetSql() (sqlStr string, params []interface{}, err error) {
sqlStr, params, err = builder.dynQuery.BuildSql(false)
if err != nil {
err = fmt.Errorf("makeSqlByCondition error: %v", err)
return
}
return
}
func (builder QuerySqlBuilder) GetPageSql(
pageIndex uint64, pageSize uint64,
) (sqlStr string, params []interface{}, err error) {
sqlStr, params, err = builder.dynQuery.BuildPageSql(pageIndex, pageSize)
if err != nil {
err = fmt.Errorf("makeSqlByCondition error: %v", err)
return
}
return
}

View File

@@ -47,7 +47,7 @@ func getJoinNamesFromOrders(
orders []common.AqOrder,
) map[string]uint32 {
for _, order := range orders {
var names []string = strings.Split(order.Property, ",")
var names []string = strings.Split(order.Property, ".")
if len(names) > 1 {
names = names[:len(names)-1]
result_map[strings.Join(names, ".")] = 1
@@ -629,8 +629,8 @@ func NewQuerySqlBuilder(
err = fmt.Errorf("makeSqlByCondition error: %v", err)
return
}
selectStatemet.SqlWhere = &conditionExpr
}
selectStatemet.SqlWhere = &conditionExpr
var orderExprs = make([]OrderExpr, 0)
orderExprs, err = makeColumnOrderBy(orders, main_entity_name, main_table_alias)
@@ -652,35 +652,6 @@ func NewQuerySqlBuilder(
return
}
func (builder QuerySqlBuilder) GetCountSql() (sqlStr string, params []interface{}, err error) {
sqlStr, params, err = builder.dynQuery.BuildCountSql()
if err != nil {
err = fmt.Errorf("makeSqlByCondition error: %v", err)
return
}
return
}
func (builder QuerySqlBuilder) GetSql() (sqlStr string, params []interface{}, err error) {
sqlStr, params, err = builder.dynQuery.BuildSql(false)
if err != nil {
err = fmt.Errorf("makeSqlByCondition error: %v", err)
return
}
return
}
func (builder QuerySqlBuilder) GetPageSql(
pageIndex uint64, pageSize uint64,
) (sqlStr string, params []interface{}, err error) {
sqlStr, params, err = builder.dynQuery.BuildPageSql(pageIndex, pageSize)
if err != nil {
err = fmt.Errorf("makeSqlByCondition error: %v", err)
return
}
return
}
type ByLength []string
func (s ByLength) Len() int { return len(s) }

View File

@@ -1,105 +0,0 @@
package service
import (
"github.com/beego/beego/v2/client/orm"
"github.com/beego/beego/v2/core/logs"
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/dao/entity"
)
func CameraInsert(e entity.Camera) (i int64, err error) {
o := orm.NewOrm()
i, err = o.Insert(&e)
if err != nil && err != orm.ErrLastInsertIdUnavailable {
logs.Error("camera insert error : %v", err)
return i, err
}
return i, nil
}
func CameraDelete(e entity.Camera) (i int64, err error) {
o := orm.NewOrm()
i, err = o.Delete(&e)
if err != nil {
logs.Error("camera delete error : %v", err)
return 0, err
}
return i, nil
}
func CameraUpdate(e entity.Camera) (i int64, err error) {
o := orm.NewOrm()
i, err = o.Update(&e)
if err != nil {
logs.Error("camera update error : %v", err)
return 0, err
}
return i, nil
}
func CameraSelectById(id string) (e entity.Camera, err error) {
o := orm.NewOrm()
e = entity.Camera{Id: id}
err = o.Read(&e)
if err == orm.ErrNoRows {
logs.Error("查询不到")
return e, err
} else if err == orm.ErrMissPK {
logs.Error("找不到主键")
return e, err
} else if err != nil {
logs.Error("错误: %v", err)
return e, err
} else {
return e, nil
}
}
func CameraSelectOne(q entity.Camera) (e entity.Camera, err error) {
o := orm.NewOrm()
err = o.QueryTable(new(entity.Camera)).Filter("code", q.Code).One(&e)
if err != nil {
logs.Error("查询出错:%v", err)
return e, err
}
return e, nil
}
func CameraCountByCode(code string) (count int64, err error) {
o := orm.NewOrm()
count, err = o.QueryTable(new(entity.Camera)).Filter("code", code).Count()
if err != nil {
logs.Error("查询出错:%v", err)
return count, err
}
return count, nil
}
func CameraSelectAll() (es []entity.Camera, err error) {
o := orm.NewOrm()
// num, err := o.QueryTable(new(entity.Camera)).All(&es)
qb, _ := orm.NewQueryBuilder("postgres")
// Construct query object
qb.Select("*").
From("camera").
LeftJoin("camera_share").On("camera_share.camera_id = camera.id").
Where("camera.code like ?").
// OrderBy("camera.id").Desc().
Limit(1000).Offset(0)
// export raw query string from QueryBuilder object
sql := qb.String()
// execute the raw query string
o.Raw(sql, "%%").QueryRows(&es)
if err != nil {
logs.Error("查询出错:%v", err)
return es, err
}
logs.Debug("查询到%d条记录", 20)
return es, nil
}

View File

@@ -1,99 +0,0 @@
package service
import (
"github.com/beego/beego/v2/client/orm"
"github.com/beego/beego/v2/core/logs"
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/dao/entity"
)
func CameraShareInsert(e entity.CameraShare) (i int64, err error) {
o := orm.NewOrm()
i, err = o.Insert(&e)
if err != nil && err != orm.ErrLastInsertIdUnavailable {
logs.Error("camera insert error : %v", err)
return i, err
}
return i, nil
}
func CameraShareDelete(e entity.CameraShare) (i int64, err error) {
o := orm.NewOrm()
i, err = o.Delete(&e)
if err != nil {
logs.Error("camera delete error : %v", err)
return 0, err
}
return i, nil
}
func CameraShareUpdate(e entity.CameraShare) (i int64, err error) {
o := orm.NewOrm()
i, err = o.Update(&e)
if err != nil {
logs.Error("camera update error : %v", err)
return 0, err
}
return i, nil
}
func CameraShareSelectById(id string) (e entity.CameraShare, err error) {
o := orm.NewOrm()
e = entity.CameraShare{Id: id}
err = o.Read(&e)
if err == orm.ErrNoRows {
logs.Error("查询不到")
return e, err
} else if err == orm.ErrMissPK {
logs.Error("找不到主键")
return e, err
} else if err != nil {
logs.Error("错误: %v", err)
return e, err
} else {
return e, nil
}
}
func CameraShareSelectOne(q entity.CameraShare) (e entity.CameraShare, err error) {
o := orm.NewOrm()
err = o.QueryTable(new(entity.CameraShare)).Filter("CameraId", q.CameraId).Filter("AuthCode", q.AuthCode).One(&e)
if err != nil {
logs.Error("查询出错:%v", err)
return e, err
}
return e, nil
}
func CameraShareCountByCode(code string) (count int64, err error) {
o := orm.NewOrm()
count, err = o.QueryTable(new(entity.CameraShare)).Filter("code", code).Count()
if err != nil {
logs.Error("查询出错:%v", err)
return count, err
}
return count, nil
}
func CameraShareSelectAll() (es []entity.CameraShare, err error) {
o := orm.NewOrm()
num, err := o.QueryTable(new(entity.CameraShare)).All(&es)
if err != nil {
logs.Error("查询出错:%v", err)
return es, err
}
logs.Debug("查询到%d条记录", num)
return es, nil
}
func CameraShareSelectByCameraId(cameraId string) (es []entity.CameraShare, err error) {
o := orm.NewOrm()
num, err := o.QueryTable(new(entity.CameraShare)).Filter("CameraId", cameraId).All(&es)
if err != nil {
logs.Error("查询出错:%v", err)
return es, err
}
logs.Info("查询到%d条记录", num)
return es, nil
}

View File

@@ -0,0 +1 @@
package service

View File

@@ -0,0 +1 @@
package service

View File

@@ -7,7 +7,8 @@ import (
"github.com/beego/beego/v2/core/logs"
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/rtspclientmanager"
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web"
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/service"
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/common"
base_service "github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/service/base"
)
var taskInstance *task
@@ -47,7 +48,8 @@ func (t *task) offlineCamera() {
}
}()
for {
css, err := service.CameraSelectAll()
condition := common.GetEmptyCondition()
css, err := base_service.CameraFindCollectionByCondition(condition)
if err != nil {
logs.Error("query camera error : %v", err)
}
@@ -57,7 +59,7 @@ func (t *task) offlineCamera() {
}
if exists := rtspclientmanager.GetSingleRtspClientManager().ExistsPublisher(cs.Code); !exists {
cs.OnlineStatus = 0
service.CameraUpdate(cs)
base_service.CameraUpdateById(cs)
}
}
<-time.After(10 * time.Minute)

View File

@@ -13,8 +13,8 @@ import (
"github.com/gin-gonic/gin"
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/utils"
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/common"
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/controllers"
base_controller "github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/controllers/base"
ext_controller "github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/controllers/ext"
)
var tokens sync.Map
@@ -52,8 +52,8 @@ func (w *web) StartWeb() {
func (w *web) webRun() {
defer func() {
if r := recover(); r != nil {
logs.Error("system painc : %v \nstack : %v", r, string(debug.Stack()))
if result := recover(); result != nil {
logs.Error("system painc : %v \nstack : %v", result, string(debug.Stack()))
}
}()
router := gin.Default()
@@ -62,7 +62,7 @@ func (w *web) webRun() {
router.POST("/system/login", login)
router.GET("/live/:method/:code/:authCode.flv", controllers.HttpFlvPlay)
router.GET("/live/:method/:code/:authCode.flv", ext_controller.HttpFlvPlay)
// camera
router.POST("/camera/add", base_controller.CameraAdd)
router.POST("/camera/update", base_controller.CameraUpdate)
@@ -80,20 +80,20 @@ func (w *web) webRun() {
router.POST("/cameraShare/aq", base_controller.CameraShareAq)
router.POST("/cameraShare/aqPage", base_controller.CameraShareAqPage)
router.GET("/camera/list", controllers.CameraList)
router.GET("/camera/detail", controllers.CameraDetail)
router.POST("/camera/edit", controllers.CameraEdit)
router.POST("/camera/delete/:id", controllers.CameraDelete)
router.POST("/camera/enabled", controllers.CameraEnabled)
router.POST("/camera/rtmppushchange", controllers.RtmpPushChange)
router.POST("/camera/savevideochange", controllers.CameraSaveVideoChange)
router.POST("/camera/livechange", controllers.CameraLiveChange)
router.POST("/camera/playauthcodereset", controllers.CameraPlayAuthCodeReset)
// router.GET("/camera/list", ext_controller.CameraList)
// router.GET("/camera/detail", ext_controller.CameraDetail)
// router.POST("/camera/edit", ext_controller.CameraEdit)
// router.POST("/camera/delete/:id", ext_controller.CameraDelete)
router.POST("/camera/enabled", ext_controller.CameraEnabled)
router.POST("/camera/rtmpPushChange", ext_controller.RtmpPushChange)
router.POST("/camera/saveVideoChange", ext_controller.CameraSaveVideoChange)
router.POST("/camera/liveChange", ext_controller.CameraLiveChange)
router.POST("/camera/playAuthCodeReset", ext_controller.CameraPlayAuthCodeReset)
router.GET("/camerashare/list", controllers.CameraShareList)
router.POST("/camerashare/edit", controllers.CameraShareEdit)
router.POST("/camerashare/delete/:id", controllers.CameraShareDelete)
router.POST("/camerashare/enabled", controllers.CameraShareEnabled)
// router.GET("/camerashare/list", ext_controller.CameraShareList)
// router.POST("/camerashare/edit", ext_controller.CameraShareEdit)
// router.POST("/camerashare/delete/:id", ext_controller.CameraShareDelete)
router.POST("/cameraShare/enabled", ext_controller.CameraShareEnabled)
staticPath, err := config.String("server.http.static.path")
if err != nil {
@@ -165,34 +165,27 @@ func Validate() gin.HandlerFunc {
ctx.Next()
return
}
r := common.Result{
Code: 1,
Msg: "",
}
token := ctx.Request.Header.Get("token")
if len(token) == 0 {
logs.Error("token is null")
r.Code = 0
r.Msg = "token is null"
ctx.JSON(http.StatusUnauthorized, r)
logs.Error("token is empty")
result := common.ErrorResult("token is empty")
ctx.JSON(http.StatusUnauthorized, result)
ctx.Abort()
return
}
tokenTime, b := tokens.Load(token)
if !b {
logs.Error("token error")
r.Code = 0
r.Msg = "token error"
ctx.JSON(http.StatusUnauthorized, r)
result := common.ErrorResult("token error")
ctx.JSON(http.StatusUnauthorized, result)
ctx.Abort()
return
}
timeout := time.Now().After(tokenTime.(time.Time).Add(30 * time.Minute))
if timeout {
logs.Error("token is timeout")
r.Code = 0
r.Msg = "token is timeout"
ctx.JSON(http.StatusUnauthorized, r)
result := common.ErrorResult("token is timeout")
ctx.JSON(http.StatusUnauthorized, result)
ctx.Abort()
return
}
@@ -201,18 +194,13 @@ func Validate() gin.HandlerFunc {
}
}
func login(c *gin.Context) {
r := common.Result{
Code: 1,
Msg: "",
}
func login(ctx *gin.Context) {
params := make(map[string]interface{})
err := c.BindJSON(&params)
err := ctx.BindJSON(&params)
if err != nil {
logs.Error("param error : %v", err)
r.Code = 0
r.Msg = "param error"
c.JSON(http.StatusOK, r)
result := common.ErrorResult("internal error")
ctx.JSON(http.StatusOK, result)
return
}
userNameParam := params["userName"].(string)
@@ -221,21 +209,20 @@ func login(c *gin.Context) {
password := config.DefaultString("server.user.password", "")
if userNameParam == "" || passwordParam == "" || userNameParam != userName || passwordParam != password {
logs.Error("userName : %s , password : %s error", userNameParam, passwordParam)
r.Code = 0
r.Msg = "userName or password error ! "
c.JSON(http.StatusOK, r)
result := common.ErrorResult("userName or password error")
ctx.JSON(http.StatusOK, result)
return
}
logs.Info("用户[%s]登录成功!", userName)
token, err := utils.NextToke()
if err != nil {
logs.Error("create token fail")
r.Code = 0
r.Msg = "create token fail"
c.JSON(http.StatusOK, r)
result := common.ErrorResult("internal error")
ctx.JSON(http.StatusOK, result)
return
}
r.Data = map[string]string{"token": token}
result := common.SuccessResultWithMsg("succss", map[string]string{"token": token})
tokens.Store(token, time.Now())
c.JSON(http.StatusOK, r)
ctx.JSON(http.StatusOK, result)
}