huangyan пре 2 месеци
родитељ
комит
ba05126fc6

+ 4 - 2
cmd/server/main.go

@@ -3,7 +3,7 @@ package main
 import (
 	"city_chips/cmd/server/wire"
 	"city_chips/pkg/config"
-	"city_chips/pkg/helper/aes"
+	"city_chips/pkg/helper/hikvision"
 	"city_chips/pkg/http"
 	"city_chips/pkg/log"
 	"fmt"
@@ -20,7 +20,9 @@ func main() {
 	if err != nil {
 		panic(err)
 	}
+	conf.GetString("")
+	//aes.ExampleUsage()
+	hikvision.Hikvision()
 	defer cleanup()
-	aes.ExampleUsage()
 	http.Run(app, fmt.Sprintf(":%d", conf.GetInt("http.port")))
 }

+ 4 - 1
cmd/server/wire/wire.go

@@ -21,19 +21,22 @@ var RepositorySet = wire.NewSet(
 	repository.NewRedis,
 	repository.NewRepository,
 	repository.NewUserRepository,
-	repository.AccessControlRepository,
+	repository.NewAccessControlRepository,
+	repository.NewHikvisionRepository,
 )
 
 var ServiceSet = wire.NewSet(
 	service.NewService,
 	service.NewUserService,
 	service.NewAccessControlService,
+	service.NewHikvisionService,
 )
 
 var HandlerSet = wire.NewSet(
 	handler.NewHandler,
 	handler.NewUserHandler,
 	handler.NewAccessControlHandler,
+	handler.NewHikvisionHandler,
 )
 
 func NewWire(*viper.Viper, *log.Logger) (*gin.Engine, func(), error) {

+ 10 - 7
cmd/server/wire/wire_gen.go

@@ -25,10 +25,13 @@ func NewWire(viperViper *viper.Viper, logger *log.Logger) (*gin.Engine, func(),
 	db := repository.NewDb(viperViper, logger)
 	client := repository.NewRedis(viperViper)
 	repositoryRepository := repository.NewRepository(logger, db, client)
-	userRepository := repository.NewUserRepository(repositoryRepository)
-	userService := service.NewUserService(serviceService, userRepository)
-	userHandler := handler.NewUserHandler(handlerHandler, userService)
-	engine := server.NewServerHTTP(logger, userHandler)
+	accessControlRepository := repository.NewAccessControlRepository(repositoryRepository)
+	accessControlService := service.NewAccessControlService(serviceService, accessControlRepository)
+	accessControlHandler := handler.NewAccessControlHandler(handlerHandler, accessControlService, viperViper)
+	hikvisionRepository := repository.NewHikvisionRepository(repositoryRepository)
+	hikvisionService := service.NewHikvisionService(serviceService, hikvisionRepository, viperViper)
+	hikvisionHandler := handler.NewHikvisionHandler(handlerHandler, hikvisionService, viperViper)
+	engine := server.NewServerHTTP(logger, accessControlHandler, hikvisionHandler)
 	return engine, func() {
 	}, nil
 }
@@ -37,8 +40,8 @@ func NewWire(viperViper *viper.Viper, logger *log.Logger) (*gin.Engine, func(),
 
 var ServerSet = wire.NewSet(server.NewServerHTTP)
 
-var RepositorySet = wire.NewSet(repository.NewDb, repository.NewRedis, repository.NewRepository, repository.NewUserRepository)
+var RepositorySet = wire.NewSet(repository.NewDb, repository.NewRedis, repository.NewRepository, repository.NewUserRepository, repository.NewAccessControlRepository, repository.NewHikvisionRepository)
 
-var ServiceSet = wire.NewSet(service.NewService, service.NewUserService)
+var ServiceSet = wire.NewSet(service.NewService, service.NewUserService, service.NewAccessControlService, service.NewHikvisionService)
 
-var HandlerSet = wire.NewSet(handler.NewHandler, handler.NewUserHandler)
+var HandlerSet = wire.NewSet(handler.NewHandler, handler.NewUserHandler, handler.NewAccessControlHandler, handler.NewHikvisionHandler)

+ 13 - 1
config/local.yml

@@ -31,4 +31,16 @@ lifang:
     Login: "/Login" #账号登录接口
     GetCarCodes: "/GetCarCodes" #模糊查询车牌号接口
     GetCarInfo: "/GetCarInfo" #查询车牌号信息接口
-    GetParkingLotInfo: "/GetParkingLotInfo" #查询车场信息接口
+    GetParkingLotInfo: "/GetParkingLotInfo" #查询车场信息接口
+#海康威视
+hikvision:
+  Ip: ""
+  Port: 0
+  AppKey: ""
+  Secret: ""
+  IsHttps: false
+  api:
+    nodesByParams: "/api/irds/v2/region/nodesByParams" #根据查询条件查询区域列表信息,主要用于区域信息查询过滤。相对V1接口,支持级联场景的区域查询
+    deviceResource: "/api/irds/v2/deviceResource/resources" #根据资源类型分页获取资源列表,主要用于资源信息的全量同步。
+    cameras: "/api/resource/v1/cameras"#分页获取监控点资源获取监控点列表接口可用来全量同步监控点信息,返回结果分页展示。
+    previewURLs: "/api/video/v2/cameras/previewURLs"#获取监控点预览取流URLv2

+ 50 - 2
go.mod

@@ -1,8 +1,9 @@
 module city_chips
 
-go 1.16
+go 1.23
 
 require (
+	github.com/bytedance/sonic v1.9.1
 	github.com/gin-gonic/gin v1.9.1
 	github.com/google/uuid v1.3.0
 	github.com/google/wire v0.5.0
@@ -10,9 +11,56 @@ require (
 	github.com/redis/go-redis/v9 v9.7.3
 	github.com/sony/sonyflake v1.1.0
 	github.com/spf13/viper v1.16.0
-	github.com/zxbit2011/hikvisionOpenAPIGo v0.0.0-20220514130442-6799ebf12cd8 // indirect
+	github.com/tidwall/gjson v1.18.0
+	github.com/zxbit2011/hikvisionOpenAPIGo v0.0.0-20220514130442-6799ebf12cd8
 	go.uber.org/zap v1.24.0
 	gopkg.in/natefinch/lumberjack.v2 v2.2.1
 	gorm.io/driver/mysql v1.5.7
 	gorm.io/gorm v1.25.7
 )
+
+require (
+	github.com/cespare/xxhash/v2 v2.2.0 // indirect
+	github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect
+	github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
+	github.com/fsnotify/fsnotify v1.6.0 // indirect
+	github.com/gabriel-vasile/mimetype v1.4.2 // indirect
+	github.com/gin-contrib/sse v0.1.0 // indirect
+	github.com/go-playground/locales v0.14.1 // indirect
+	github.com/go-playground/universal-translator v0.18.1 // indirect
+	github.com/go-playground/validator/v10 v10.14.0 // indirect
+	github.com/go-sql-driver/mysql v1.7.0 // indirect
+	github.com/goccy/go-json v0.10.2 // indirect
+	github.com/gofrs/uuid v4.2.0+incompatible // indirect
+	github.com/hashicorp/hcl v1.0.0 // indirect
+	github.com/jinzhu/inflection v1.0.0 // indirect
+	github.com/jinzhu/now v1.1.5 // indirect
+	github.com/json-iterator/go v1.1.12 // indirect
+	github.com/klauspost/cpuid/v2 v2.2.4 // indirect
+	github.com/leodido/go-urn v1.2.4 // indirect
+	github.com/magiconair/properties v1.8.7 // indirect
+	github.com/mattn/go-isatty v0.0.19 // indirect
+	github.com/mitchellh/mapstructure v1.5.0 // indirect
+	github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
+	github.com/modern-go/reflect2 v1.0.2 // indirect
+	github.com/pelletier/go-toml/v2 v2.0.8 // indirect
+	github.com/spf13/afero v1.9.5 // indirect
+	github.com/spf13/cast v1.5.1 // indirect
+	github.com/spf13/jwalterweatherman v1.1.0 // indirect
+	github.com/spf13/pflag v1.0.5 // indirect
+	github.com/subosito/gotenv v1.4.2 // indirect
+	github.com/tidwall/match v1.1.1 // indirect
+	github.com/tidwall/pretty v1.2.0 // indirect
+	github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
+	github.com/ugorji/go/codec v1.2.11 // indirect
+	go.uber.org/atomic v1.9.0 // indirect
+	go.uber.org/multierr v1.8.0 // indirect
+	golang.org/x/arch v0.3.0 // indirect
+	golang.org/x/crypto v0.9.0 // indirect
+	golang.org/x/net v0.10.0 // indirect
+	golang.org/x/sys v0.8.0 // indirect
+	golang.org/x/text v0.9.0 // indirect
+	google.golang.org/protobuf v1.30.0 // indirect
+	gopkg.in/ini.v1 v1.67.0 // indirect
+	gopkg.in/yaml.v3 v3.0.1 // indirect
+)

Разлика између датотеке није приказан због своје велике величине
+ 0 - 814
go.sum


+ 45 - 6
internal/handler/accesscontrol.go

@@ -2,24 +2,63 @@ package handler
 
 import (
 	"city_chips/internal/service"
+	"encoding/json"
+	"fmt"
 	"github.com/gin-gonic/gin"
+	"github.com/spf13/viper"
+	"time"
 )
 
 type AccessControlHandler struct {
 	*Handler
 	accessControlService service.AccessControlService
+	conf                 *viper.Viper
 }
 
-func NewAccessControlHandler(
-	handler *Handler,
-	accessControlService service.AccessControlService,
-) *AccessControlHandler {
+func NewAccessControlHandler(handler *Handler, accessControlService service.AccessControlService, conf *viper.Viper) *AccessControlHandler {
 	return &AccessControlHandler{
 		Handler:              handler,
 		accessControlService: accessControlService,
+		conf:                 conf,
 	}
 }
 
-func (h *AccessControlHandler) GetAccessControl(ctx *gin.Context) {
-
+// GetAccessControl SSE实时推送消息
+func (h *AccessControlHandler) GetAccessControl(c *gin.Context) {
+	// 设置响应头
+	c.Header("Content-Type", "text/event-stream")
+	c.Header("Cache-Control", "no-cache")
+	c.Header("Connection", "keep-alive")
+	// 监听客户端断开连接
+	conn := true
+	notify := c.Writer.CloseNotify()
+	type Response struct {
+		RequestId string `protobuf:"bytes,1,opt,name=requestId,proto3" json:"requestId,omitempty"`
+		Code      int32  `protobuf:"varint,2,opt,name=code,proto3" json:"code,omitempty"`
+		Msg       string `protobuf:"bytes,3,opt,name=msg,proto3" json:"msg,omitempty"`
+		Data      any    `json:"data"`
+	}
+	var response Response
+	count := 0
+	for conn {
+		select {
+		case <-notify:
+			conn = false
+			fmt.Println("断开连接")
+			return
+		default:
+			count = count + 1
+			sprintf := fmt.Sprintf("循环次数%v", count)
+			response.Code = 200
+			response.Msg = "查询成功"
+			response.Data = sprintf
+			res, _ := json.Marshal(&response)
+			fmt.Fprintf(c.Writer, "data: %s\n\n", string(res))
+			c.Writer.Flush()
+			time.Sleep(5 * time.Second)
+		}
+		getString := h.conf.GetString("lifang.baseUrl.Login")
+		h.logger.Info("测试配置文件")
+		fmt.Println(getString)
+	}
 }

+ 2 - 3
internal/handler/user.go

@@ -5,7 +5,6 @@ import (
 	"city_chips/pkg/helper/resp"
 	"github.com/gin-gonic/gin"
 	"go.uber.org/zap"
-	"net/http"
 )
 
 func NewUserHandler(handler *Handler, userService service.UserService) *UserHandler {
@@ -25,14 +24,14 @@ func (h *UserHandler) GetUserById(ctx *gin.Context) {
 		Id int64 `form:"id" binding:"required"`
 	}
 	if err := ctx.ShouldBind(&params); err != nil {
-		resp.HandleError(ctx, http.StatusBadRequest, 1, err.Error(), nil)
+		resp.HandleError(ctx, 1, err.Error(), nil)
 		return
 	}
 
 	user, err := h.userService.GetUserById(params.Id)
 	h.logger.Info("GetUserByID", zap.Any("user", user))
 	if err != nil {
-		resp.HandleError(ctx, http.StatusInternalServerError, 1, err.Error(), nil)
+		resp.HandleError(ctx, 1, err.Error(), nil)
 		return
 	}
 	resp.HandleSuccess(ctx, user)

+ 3 - 7
internal/repository/accesscontrol.go

@@ -2,16 +2,13 @@ package repository
 
 import (
 	"city_chips/internal/model"
-	
 )
 
 type AccessControlRepository interface {
-	GetAccessControl(ctx context.Context, id int64) (*model.AccessControl, error)
+	GetAccessControl(id int64) (*model.AccessControl, error)
 }
 
-func NewAccessControlRepository(
-	repository *Repository,
-) AccessControlRepository {
+func NewAccessControlRepository(repository *Repository) AccessControlRepository {
 	return &accessControlRepository{
 		Repository: repository,
 	}
@@ -21,8 +18,7 @@ type accessControlRepository struct {
 	*Repository
 }
 
-func (r *accessControlRepository) GetAccessControl(ctx context.Context, id int64) (*model.AccessControl, error) {
+func (r *accessControlRepository) GetAccessControl(id int64) (*model.AccessControl, error) {
 	var accessControl model.AccessControl
-
 	return &accessControl, nil
 }

+ 20 - 1
internal/repository/repository.go

@@ -8,6 +8,8 @@ import (
 	"github.com/spf13/viper"
 	"gorm.io/driver/mysql"
 	"gorm.io/gorm"
+	"gorm.io/gorm/logger"
+	"runtime"
 	"time"
 )
 
@@ -26,7 +28,24 @@ func NewRepository(logger *log.Logger, db *gorm.DB, rdb *redis.Client) *Reposito
 }
 func NewDb(conf *viper.Viper, l *log.Logger) *gorm.DB {
 	// TODO: init db
-	db, err := gorm.Open(mysql.Open(conf.GetString("data.mysql.user")), &gorm.Config{})
+	sysType := runtime.GOOS
+	config := gorm.Config{}
+	if sysType == "windows" {
+		config.Logger = logger.Default.LogMode(logger.Info)
+		config.DisableForeignKeyConstraintWhenMigrating = true
+	} else if sysType == "linux" {
+		config.DisableForeignKeyConstraintWhenMigrating = true
+	}
+	db, err := gorm.Open(mysql.Open(conf.GetString("data.mysql.user")), &config)
+	sqlDB, err := db.DB()
+	// 设置最大连接数
+	sqlDB.SetMaxOpenConns(20) // 设置最大打开连接数
+
+	// 设置空闲连接数
+	sqlDB.SetMaxIdleConns(200) // 设置最大空闲连接数
+
+	// 设置连接的最大存活时间
+	sqlDB.SetConnMaxLifetime(time.Hour) // 设置连接的最大存活时间为1小时
 	if err != nil {
 		panic(err)
 	}

+ 11 - 8
internal/server/http.go

@@ -3,23 +3,26 @@ package server
 import (
 	"city_chips/internal/handler"
 	"city_chips/internal/middleware"
-	"city_chips/pkg/helper/resp"
 	"city_chips/pkg/log"
 	"github.com/gin-gonic/gin"
 )
 
-func NewServerHTTP(logger *log.Logger, userHandler *handler.UserHandler) *gin.Engine {
+func NewServerHTTP(logger *log.Logger, accessHandler *handler.AccessControlHandler, hikvision *handler.HikvisionHandler) *gin.Engine {
 	gin.SetMode(gin.ReleaseMode)
 	r := gin.Default()
 	r.Use(
 		middleware.CORSMiddleware(),
 	)
-	r.GET("/", func(ctx *gin.Context) {
-		resp.HandleSuccess(ctx, map[string]interface{}{
-			"say": "Hi Nunu!",
-		})
-	})
-	r.GET("/user", userHandler.GetUserById)
+	//出入口控制系统
+	Access := r.Group("/Access")
+	{
+		Access.GET("/test", accessHandler.GetAccessControl)
+	}
+	//海康威视
+	Hikvision := r.Group("/Hikvision")
+	{
+		Hikvision.GET("/getMonitoring", hikvision.GetHikvisionMonitoring)
+	}
 
 	return r
 }

+ 4 - 8
internal/service/accesscontrol.go

@@ -3,17 +3,13 @@ package service
 import (
 	"city_chips/internal/model"
 	"city_chips/internal/repository"
-	"context"
 )
 
 type AccessControlService interface {
-	GetAccessControl(ctx context.Context, id int64) (*model.AccessControl, error)
+	GetAccessControl(id int64) (*model.AccessControl, error)
 }
 
-func NewAccessControlService(
-	service *Service,
-	accessControlRepository repository.AccessControlRepository,
-) AccessControlService {
+func NewAccessControlService(service *Service, accessControlRepository repository.AccessControlRepository) AccessControlService {
 	return &accessControlService{
 		Service:                 service,
 		accessControlRepository: accessControlRepository,
@@ -25,6 +21,6 @@ type accessControlService struct {
 	accessControlRepository repository.AccessControlRepository
 }
 
-func (s *accessControlService) GetAccessControl(ctx context.Context, id int64) (*model.AccessControl, error) {
-	return s.accessControlRepository.GetAccessControl(ctx, id)
+func (s *accessControlService) GetAccessControl(id int64) (*model.AccessControl, error) {
+	return s.accessControlRepository.GetAccessControl(id)
 }

+ 79 - 0
pkg/helper/hikvision/HttpUtil.h

@@ -0,0 +1,79 @@
+#ifndef HIK_HTTPUTIL_H
+#define HIK_HTTPUTIL_H
+
+#if (defined(WIN32) || defined(WIN64))
+	#ifdef HTTPUTIL_EXPORTS
+		#define HTTPUTIL_API extern "C" _declspec(dllexport)
+	#else
+		#define HTTPUTIL_API extern "C" _declspec(dllimport)
+	#endif
+#else  // LINUX
+	#define HTTPUTIL_API extern "C"
+#endif
+
+namespace httpUtil
+{
+	// ״̬Â붨Òå: 
+	// 0 ±íʾ³É¹¦
+	// 10000~20000 ±íʾ¾ßÌåµÄ´íÎóÂë. 
+	// СÓÚ10000´óÓÚ0 ±íʾHTTP״̬Â루Èç404£©£¬HTTP״̬ÂëÇë×ÔÐвéÔÄHTTP״̬Â붨Òå
+	const int  HTTPUTIL_ERR_SUCCESS = 0;                                   // ³É¹¦
+	const int  HTTPUTIL_ERR_BASE = 10000;                                  // ´íÎóÂë»ù×¼
+	const int  HTTPUTIL_ERR_PARAM = (HTTPUTIL_ERR_BASE + 1);               // ²ÎÊý´íÎó£¬Èç´«Èë¿ÕÖ¸Õë¡¢³¬Ê±Ê±¼ä²»¶Ô
+	const int  HTTPUTIL_ERR_ALLOC_SESSION = (HTTPUTIL_ERR_BASE + 2);       // HTTPÇëÇó·ÖÅäsessionʧ°Ü
+	const int  HTTPUTIL_ERR_SET_HEADER_FIELD = (HTTPUTIL_ERR_BASE + 3);    // Í·ÓòÉèÖÃʧ°Ü
+	const int  HTTPUTIL_ERR_SEND_REQUEST = (HTTPUTIL_ERR_BASE + 4);        // HTTPÇëÇóʧ°Ü
+	const int  HTTPUTIL_ERR_ALLOC_MEM = (HTTPUTIL_ERR_BASE + 5);           // ·ÖÅäÄÚ´æ´íÎó
+	const int  HTTPUTIL_ERR_GET_REDIRECT_URL = (HTTPUTIL_ERR_BASE + 6);    // »ñÈ¡ÖØ¶¨ÏòUrlʧ°Ü
+	const int  HTTPUTIL_ERR_OTHER = (HTTPUTIL_ERR_BASE + 10000);           // ÆäËü´íÎó
+
+	// HTTP POST
+	// url: url
+	// body: body
+	// appkey: APIÍø¹ØÌṩµÄAPPKey
+	// secret: APIÍø¹ØÌṩµÄAPPSecret
+	// timeout: Ãë¼¶³¬Ê±Ê±¼ä£¨ÄÚ²¿·Ö±ðʹÓô˳¬Ê±Ê±¼äÉèÖý¨Á¢Á¬½Ó¡¢ÇëÇó·¢ËÍ¡¢µÈ´ý»Ø¸´³¬Ê±Ê±¼ä£©
+	// dataLen: ÏìÓ¦Êý¾Ý³¤¶È£¬Èç¹ûÈ·¶¨·µ»ØµÄÄÚÈÝÊÇ×Ö·û´®£¬¿ÉÒÔÖ¸¶¨NULL
+	// return: HTTPÇëÇóÏìÓ¦£¬Èç¹ûÊǶþ½øÖÆ£¬Çë½áºÏdataLen»ñÈ¡Êý¾Ý¡£Ê§°Ü·µ»ØNULL£¬¿ÉʹÓÃHTTPUTIL_GetLastStatus»ñȡ״̬Âë¡£³É¹¦ÐèʹÓÃHTTPUTIL_FreeÊÍ·ÅÄÚ´æ
+	HTTPUTIL_API char* HTTPUTIL_Post(const char* url, const char* body, const char* appkey, const char* secret, int timeout, int* dataLen);
+
+	// HTTP GET
+	// url: url
+	// appkey: APIÍø¹ØÌṩµÄAPPKey
+	// secret: APIÍø¹ØÌṩµÄAPPSecret
+	// timeout: Ãë¼¶³¬Ê±Ê±¼ä£¨ÄÚ²¿·Ö±ðʹÓô˳¬Ê±Ê±¼äÉèÖý¨Á¢Á¬½Ó¡¢ÇëÇó·¢ËÍ¡¢µÈ´ý»Ø¸´³¬Ê±Ê±¼ä£©
+	// dataLen: ÏìÓ¦Êý¾Ý³¤¶È£¬Èç¹ûÈ·¶¨·µ»ØµÄÄÚÈÝÊÇ×Ö·û´®£¬¿ÉÒÔÖ¸¶¨NULL
+	// return: HTTPÇëÇóÏìÓ¦£¬Èç¹ûÊǶþ½øÖÆ£¬Çë½áºÏdataLen»ñÈ¡Êý¾Ý¡£Ê§°Ü·µ»ØNULL£¬¿ÉʹÓÃHTTPUTIL_GetLastStatus»ñȡ״̬Âë¡£³É¹¦ÐèʹÓÃHTTPUTIL_FreeÊÍ·ÅÄÚ´æ
+	HTTPUTIL_API char* HTTPUTIL_Get(const char* url, const char* appkey, const char* secret, int timeout, int* dataLen);
+
+	// ÊÍ·ÅÄÚ´æ
+	// buffer: pHTTPUTIL_GetºÍHTTPUTIL_Post·µ»ØµÄ·Ç¿ÕÖ¸Õë
+	HTTPUTIL_API void HTTPUTIL_Free(char* buffer);
+
+	// »ñȡ״̬Â룬±ØÐëÔÚµ÷HTTPUTIL_Post»òHTTPUTIL_GetËùÔÚÏß³ÌÖе÷´Ë½Ó¿Ú
+	// return: ״̬Âë, Ïê¼ûHTTPUTIL_ERR_*»ò×ÔÐвéÔÄHTTP״̬Âë
+	HTTPUTIL_API int HTTPUTIL_GetLastStatus();
+
+	// HTTP POST
+	// url: url
+	// body: body
+	// appkey: APIÍø¹ØÌṩµÄAPPKey
+	// secret: APIÍø¹ØÌṩµÄAPPSecret
+	// timeout: Ãë¼¶³¬Ê±Ê±¼ä£¨ÄÚ²¿·Ö±ðʹÓô˳¬Ê±Ê±¼äÉèÖý¨Á¢Á¬½Ó¡¢ÇëÇó·¢ËÍ¡¢µÈ´ý»Ø¸´³¬Ê±Ê±¼ä£©
+	// dataLen: ÏìÓ¦Êý¾Ý³¤¶È£¬Èç¹ûÈ·¶¨·µ»ØµÄÄÚÈÝÊÇ×Ö·û´®£¬¿ÉÒÔÖ¸¶¨NULL
+	// language: ÓïÑÔ»·¾³£¬¿ÉÑ¡zh_CN£¨ÖÐÎÄ£©en_US£¨Ó¢ÎÄ£©
+	// return: HTTPÇëÇóÏìÓ¦£¬Èç¹ûÊǶþ½øÖÆ£¬Çë½áºÏdataLen»ñÈ¡Êý¾Ý¡£Ê§°Ü·µ»ØNULL£¬¿ÉʹÓÃHTTPUTIL_GetLastStatus»ñȡ״̬Âë¡£³É¹¦ÐèʹÓÃHTTPUTIL_FreeÊÍ·ÅÄÚ´æ
+	HTTPUTIL_API char* HTTPUTIL_PostWithLanguage(const char* url, const char* body, const char* appkey, const char* secret, int timeout, int* dataLen, const char* language = "zh_CN");
+
+
+	// HTTP GET
+	// url: url
+	// appkey: APIÍø¹ØÌṩµÄAPPKey
+	// secret: APIÍø¹ØÌṩµÄAPPSecret
+	// timeout: Ãë¼¶³¬Ê±Ê±¼ä£¨ÄÚ²¿·Ö±ðʹÓô˳¬Ê±Ê±¼äÉèÖý¨Á¢Á¬½Ó¡¢ÇëÇó·¢ËÍ¡¢µÈ´ý»Ø¸´³¬Ê±Ê±¼ä£©
+	// dataLen: ÏìÓ¦Êý¾Ý³¤¶È£¬Èç¹ûÈ·¶¨·µ»ØµÄÄÚÈÝÊÇ×Ö·û´®£¬¿ÉÒÔÖ¸¶¨NULL
+	// language: ÓïÑÔ»·¾³£¬¿ÉÑ¡zh_CN£¨ÖÐÎÄ£©en_US£¨Ó¢ÎÄ£©
+	// return: HTTPÇëÇóÏìÓ¦£¬Èç¹ûÊǶþ½øÖÆ£¬Çë½áºÏdataLen»ñÈ¡Êý¾Ý¡£Ê§°Ü·µ»ØNULL£¬¿ÉʹÓÃHTTPUTIL_GetLastStatus»ñȡ״̬Âë¡£³É¹¦ÐèʹÓÃHTTPUTIL_FreeÊÍ·ÅÄÚ´æ
+	HTTPUTIL_API char* HTTPUTIL_GetWithLanguage(const char* url, const char* appkey, const char* secret, int timeout, int* dataLen, const char* language = "zh_CN");
+}
+#endif

+ 34 - 0
pkg/helper/hikvision/hikvision.go

@@ -0,0 +1,34 @@
+package hikvision
+
+//
+///*
+//#cgo CFLAGS: -I./include
+//#cgo LDFLAGS: -L./lib -lhcnetsdk
+//#include "HCNetSDK.h"
+//*/
+//import "C"
+//import (
+//	"fmt"
+//)
+//
+//func login(deviceIP string, port int, username string, password string) (int, error) {
+//	var deviceInfo C.NET_DVR_DEVICEINFO_V30
+//	loginHandle := C.NET_DVR_Login_V30(C.CString(deviceIP), C.int(port), C.CString(username), C.CString(password), &deviceInfo)
+//	if loginHandle < 0 {
+//		return 0, fmt.Errorf("login failed, error code: %d", C.NET_DVR_GetLastError())
+//	}
+//	return int(loginHandle), nil
+//}
+//func realPlay(loginHandle int, windowHandle uintptr) (int, error) {
+//	var previewInfo C.NET_DVR_PREVIEWINFO
+//	previewInfo.lChannel = 1     // 默认通道1
+//	previewInfo.dwStreamType = 0 // 主码流
+//	previewInfo.dwLinkMode = 0   // TCP方式
+//	previewInfo.hPlayWnd = C.HWND(windowHandle)
+//	realPlayHandle := C.NET_DVR_RealPlay_V30(C.LONG(loginHandle), &previewInfo, nil, nil)
+//	if realPlayHandle < 0 {
+//		return 0, fmt.Errorf("real play failed, error code: %d", C.NET_DVR_GetLastError())
+//	}
+//
+//	return int(realPlayHandle), nil
+//}

+ 18 - 0
pkg/helper/hikvision/hikvisionCameras.go

@@ -0,0 +1,18 @@
+package hikvision
+
+import (
+	"github.com/zxbit2011/hikvisionOpenAPIGo"
+)
+
+var hkConfig hikvisionOpenAPIGo.HKConfig
+
+func Hikvision() {
+	hkConfig = hikvisionOpenAPIGo.HKConfig{
+		Ip:      "",
+		Port:    0,
+		AppKey:  "",
+		Secret:  "",
+		IsHttps: false,
+	}
+
+}

+ 3 - 3
pkg/helper/resp/resp.go

@@ -15,14 +15,14 @@ func HandleSuccess(ctx *gin.Context, data interface{}) {
 	if data == nil {
 		data = map[string]string{}
 	}
-	resp := response{Code: 0, Message: "success", Data: data}
+	resp := response{Code: 200, Message: "success", Data: data}
 	ctx.JSON(http.StatusOK, resp)
 }
 
-func HandleError(ctx *gin.Context, httpCode, code int, message string, data interface{}) {
+func HandleError(ctx *gin.Context, code int, message string, data interface{}) {
 	if data == nil {
 		data = map[string]string{}
 	}
 	resp := response{Code: code, Message: message, Data: data}
-	ctx.JSON(httpCode, resp)
+	ctx.JSON(http.StatusOK, resp)
 }

+ 51 - 0
pkg/helper/sendPost/sendPost.go

@@ -0,0 +1,51 @@
+package sendPost
+
+import (
+	"bytes"
+	"encoding/json"
+	"errors"
+	"fmt"
+	"github.com/tidwall/gjson"
+	"io"
+	"net/http"
+	"strings"
+)
+
+func SendPostRequest(urls string, payload interface{}) ([]byte, error) {
+	// 将 payload 转换为 JSON 字符串
+	marshal, err := json.Marshal(payload)
+	if err != nil {
+		return nil, errors.New("参数解析失败")
+	}
+
+	// 创建 POST 请求
+	req, err := http.NewRequest("POST", urls, bytes.NewBuffer(marshal))
+	if err != nil {
+		return nil, errors.New("设置请求参数失败")
+	}
+	req.Header.Set("Content-Type", "application/json")
+
+	// 发送请求
+	client := &http.Client{}
+	resp, err := client.Do(req)
+	if err != nil {
+		return nil, errors.New("发送请求失败")
+	}
+	defer resp.Body.Close()
+
+	// 读取响应体
+	all, err := io.ReadAll(resp.Body)
+	if err != nil {
+		return nil, errors.New("读取响应体失败")
+	}
+
+	// 打印原始响应体
+	fmt.Println("原始响应体:", string(all))
+
+	// 检查响应码
+	code := gjson.Get(string(all), "code").String()
+	if !strings.EqualFold(code, "0000") {
+		return nil, fmt.Errorf("响应码不是 0000")
+	}
+	return all, nil
+}

Неке датотеке нису приказане због велике количине промена