1、前端对接后的调整
This commit is contained in:
		
							parent
							
								
									5e18926f02
								
							
						
					
					
						commit
						12d6ea7afc
					
				|  | @ -99,7 +99,7 @@ func NewStartCmd() *cobra.Command { | ||||||
| 				consulCfg.ServiceDeregister() | 				consulCfg.ServiceDeregister() | ||||||
| 				signal.Notify(c, syscall.SIGINT, syscall.SIGTERM) | 				signal.Notify(c, syscall.SIGINT, syscall.SIGTERM) | ||||||
| 			}(exitChannel) | 			}(exitChannel) | ||||||
| 			router := router2.InitRouter(logger, model.DB) | 			router := router2.InitRouter(cfg, logger, model.DB) | ||||||
| 			// start http service
 | 			// start http service
 | ||||||
| 			go func() { | 			go func() { | ||||||
| 				fmt.Printf("Http Server start at port %d \n", cfg.Port) | 				fmt.Printf("Http Server start at port %d \n", cfg.Port) | ||||||
|  |  | ||||||
|  | @ -13,6 +13,12 @@ logging: | ||||||
|   maxBackups: 3000 |   maxBackups: 3000 | ||||||
|   maxAge: 30 |   maxAge: 30 | ||||||
|   development: true |   development: true | ||||||
|  | mineData: | ||||||
|  |   accessKey: f0bda738033e47ffbfbd5d3f865c19e1 | ||||||
|  | minio: | ||||||
|  |   endpoint: 192.168.0.200:9000 | ||||||
|  |   accessKeyId: root | ||||||
|  |   secretAccessKey: OIxv7QptYBO3 | ||||||
| consul: | consul: | ||||||
|   host: http://consul.hpds.cc |   host: http://consul.hpds.cc | ||||||
|   port: 80 |   port: 80 | ||||||
|  |  | ||||||
|  | @ -20,6 +20,8 @@ type WebConfig struct { | ||||||
| 	Db       DbConfig       `yaml:"db"` | 	Db       DbConfig       `yaml:"db"` | ||||||
| 	Cache    CacheConfig    `yaml:"cache"` | 	Cache    CacheConfig    `yaml:"cache"` | ||||||
| 	Logging  LogOptions     `yaml:"logging"` | 	Logging  LogOptions     `yaml:"logging"` | ||||||
|  | 	Minio    MinioConfig    `yaml:"minio"` | ||||||
|  | 	MineData MineDataConfig `yaml:"mineData"` | ||||||
| } | } | ||||||
| type ConsulConfig struct { | type ConsulConfig struct { | ||||||
| 	Host       string   `yaml:"host,omitempty"` | 	Host       string   `yaml:"host,omitempty"` | ||||||
|  | @ -55,6 +57,17 @@ type LogOptions struct { | ||||||
| 	Development     bool   `yaml:"development" json:"development" toml:"development"`             // 是否是开发模式
 | 	Development     bool   `yaml:"development" json:"development" toml:"development"`             // 是否是开发模式
 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | type MinioConfig struct { | ||||||
|  | 	Endpoint        string `yaml:"endpoint"` | ||||||
|  | 	AccessKeyId     string `yaml:"accessKeyId"` | ||||||
|  | 	SecretAccessKey string `yaml:"secretAccessKey"` | ||||||
|  | 	Bucket          string `yaml:"bucket"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type MineDataConfig struct { | ||||||
|  | 	AccessKey string `yaml:"accessKey"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func ParseConfigByFile(path string) (cfg *WebConfig, err error) { | func ParseConfigByFile(path string) (cfg *WebConfig, err error) { | ||||||
| 	buffer, err := os.ReadFile(path) | 	buffer, err := os.ReadFile(path) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
|  |  | ||||||
|  | @ -13,6 +13,12 @@ logging: | ||||||
|   maxBackups: 3000 |   maxBackups: 3000 | ||||||
|   maxAge: 30 |   maxAge: 30 | ||||||
|   development: true |   development: true | ||||||
|  | mineData: | ||||||
|  |   accessKey: f0bda738033e47ffbfbd5d3f865c19e1 | ||||||
|  | minio: | ||||||
|  |   endpoint: 127.0.0.1:9000 | ||||||
|  |   accessKeyId: root | ||||||
|  |   secretAccessKey: OIxv7QptYBO3 | ||||||
| consul: | consul: | ||||||
|   host: http://consul.hpds.cc |   host: http://consul.hpds.cc | ||||||
|   port: 80 |   port: 80 | ||||||
|  |  | ||||||
							
								
								
									
										11
									
								
								go.mod
								
								
								
								
							
							
						
						
									
										11
									
								
								go.mod
								
								
								
								
							|  | @ -12,6 +12,7 @@ require ( | ||||||
| 	github.com/go-sql-driver/mysql v1.6.0 | 	github.com/go-sql-driver/mysql v1.6.0 | ||||||
| 	github.com/goccy/go-json v0.9.11 | 	github.com/goccy/go-json v0.9.11 | ||||||
| 	github.com/hashicorp/consul/api v1.15.3 | 	github.com/hashicorp/consul/api v1.15.3 | ||||||
|  | 	github.com/minio/minio-go/v7 v7.0.46 | ||||||
| 	github.com/spf13/cobra v0.0.3 | 	github.com/spf13/cobra v0.0.3 | ||||||
| 	github.com/spf13/viper v1.14.0 | 	github.com/spf13/viper v1.14.0 | ||||||
| 	go.uber.org/zap v1.24.0 | 	go.uber.org/zap v1.24.0 | ||||||
|  | @ -27,6 +28,7 @@ require ( | ||||||
| 	github.com/armon/go-metrics v0.4.0 // indirect | 	github.com/armon/go-metrics v0.4.0 // indirect | ||||||
| 	github.com/coreos/go-semver v0.3.0 // indirect | 	github.com/coreos/go-semver v0.3.0 // indirect | ||||||
| 	github.com/coreos/go-systemd/v22 v22.3.2 // indirect | 	github.com/coreos/go-systemd/v22 v22.3.2 // indirect | ||||||
|  | 	github.com/dustin/go-humanize v1.0.0 // indirect | ||||||
| 	github.com/fatih/color v1.13.0 // indirect | 	github.com/fatih/color v1.13.0 // indirect | ||||||
| 	github.com/fsnotify/fsnotify v1.6.0 // indirect | 	github.com/fsnotify/fsnotify v1.6.0 // indirect | ||||||
| 	github.com/gin-contrib/sse v0.1.0 // indirect | 	github.com/gin-contrib/sse v0.1.0 // indirect | ||||||
|  | @ -38,6 +40,7 @@ require ( | ||||||
| 	github.com/golang/protobuf v1.5.2 // indirect | 	github.com/golang/protobuf v1.5.2 // indirect | ||||||
| 	github.com/golang/snappy v0.0.4 // indirect | 	github.com/golang/snappy v0.0.4 // indirect | ||||||
| 	github.com/google/go-cmp v0.5.9 // indirect | 	github.com/google/go-cmp v0.5.9 // indirect | ||||||
|  | 	github.com/google/uuid v1.3.0 // indirect | ||||||
| 	github.com/googleapis/enterprise-certificate-proxy v0.2.0 // indirect | 	github.com/googleapis/enterprise-certificate-proxy v0.2.0 // indirect | ||||||
| 	github.com/googleapis/gax-go/v2 v2.6.0 // indirect | 	github.com/googleapis/gax-go/v2 v2.6.0 // indirect | ||||||
| 	github.com/hashicorp/go-cleanhttp v0.5.2 // indirect | 	github.com/hashicorp/go-cleanhttp v0.5.2 // indirect | ||||||
|  | @ -49,10 +52,14 @@ require ( | ||||||
| 	github.com/hashicorp/serf v0.9.8 // indirect | 	github.com/hashicorp/serf v0.9.8 // indirect | ||||||
| 	github.com/inconshreveable/mousetrap v1.0.0 // indirect | 	github.com/inconshreveable/mousetrap v1.0.0 // indirect | ||||||
| 	github.com/json-iterator/go v1.1.12 // indirect | 	github.com/json-iterator/go v1.1.12 // indirect | ||||||
|  | 	github.com/klauspost/compress v1.15.9 // indirect | ||||||
|  | 	github.com/klauspost/cpuid/v2 v2.1.0 // indirect | ||||||
| 	github.com/leodido/go-urn v1.2.1 // indirect | 	github.com/leodido/go-urn v1.2.1 // indirect | ||||||
| 	github.com/magiconair/properties v1.8.6 // indirect | 	github.com/magiconair/properties v1.8.6 // indirect | ||||||
| 	github.com/mattn/go-colorable v0.1.12 // indirect | 	github.com/mattn/go-colorable v0.1.12 // indirect | ||||||
| 	github.com/mattn/go-isatty v0.0.16 // indirect | 	github.com/mattn/go-isatty v0.0.16 // indirect | ||||||
|  | 	github.com/minio/md5-simd v1.1.2 // indirect | ||||||
|  | 	github.com/minio/sha256-simd v1.0.0 // indirect | ||||||
| 	github.com/mitchellh/go-homedir v1.1.0 // indirect | 	github.com/mitchellh/go-homedir v1.1.0 // indirect | ||||||
| 	github.com/mitchellh/mapstructure v1.5.0 // indirect | 	github.com/mitchellh/mapstructure v1.5.0 // indirect | ||||||
| 	github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect | 	github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect | ||||||
|  | @ -60,7 +67,9 @@ require ( | ||||||
| 	github.com/pelletier/go-toml v1.9.5 // indirect | 	github.com/pelletier/go-toml v1.9.5 // indirect | ||||||
| 	github.com/pelletier/go-toml/v2 v2.0.6 // indirect | 	github.com/pelletier/go-toml/v2 v2.0.6 // indirect | ||||||
| 	github.com/pkg/errors v0.9.1 // indirect | 	github.com/pkg/errors v0.9.1 // indirect | ||||||
|  | 	github.com/rs/xid v1.4.0 // indirect | ||||||
| 	github.com/sagikazarmark/crypt v0.8.0 // indirect | 	github.com/sagikazarmark/crypt v0.8.0 // indirect | ||||||
|  | 	github.com/sirupsen/logrus v1.9.0 // indirect | ||||||
| 	github.com/spf13/afero v1.9.2 // indirect | 	github.com/spf13/afero v1.9.2 // indirect | ||||||
| 	github.com/spf13/cast v1.5.0 // indirect | 	github.com/spf13/cast v1.5.0 // indirect | ||||||
| 	github.com/spf13/jwalterweatherman v1.1.0 // indirect | 	github.com/spf13/jwalterweatherman v1.1.0 // indirect | ||||||
|  | @ -77,7 +86,7 @@ require ( | ||||||
| 	go.opentelemetry.io/otel/trace v1.10.0 // indirect | 	go.opentelemetry.io/otel/trace v1.10.0 // indirect | ||||||
| 	go.uber.org/atomic v1.9.0 // indirect | 	go.uber.org/atomic v1.9.0 // indirect | ||||||
| 	go.uber.org/multierr v1.8.0 // indirect | 	go.uber.org/multierr v1.8.0 // indirect | ||||||
| 	golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e // indirect | 	golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa // indirect | ||||||
| 	golang.org/x/net v0.4.0 // indirect | 	golang.org/x/net v0.4.0 // indirect | ||||||
| 	golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783 // indirect | 	golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783 // indirect | ||||||
| 	golang.org/x/sync v0.1.0 // indirect | 	golang.org/x/sync v0.1.0 // indirect | ||||||
|  |  | ||||||
|  | @ -0,0 +1,35 @@ | ||||||
|  | package handler | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"fmt" | ||||||
|  | 	"github.com/gin-gonic/gin" | ||||||
|  | 	"hpds-iot-web/internal/proto" | ||||||
|  | 	"hpds-iot-web/internal/service" | ||||||
|  | 	"hpds-iot-web/model" | ||||||
|  | 	e "hpds-iot-web/pkg/err" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | func (s HandlerService) UploadFile(c *gin.Context) (data interface{}, err error) { | ||||||
|  | 	repo := service.NewFileService(s.AppConfig, s.Engine, s.Logger) | ||||||
|  | 	us, _ := c.Get("operatorUser") | ||||||
|  | 	userInfo := us.(*model.SystemUser) | ||||||
|  | 	var req proto.UploadFileRequest | ||||||
|  | 	form, err := c.MultipartForm() | ||||||
|  | 	if err != nil { | ||||||
|  | 		go s.SaveLog("UploadFile", "Manage", "", "", userInfo.ToString(), fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 		return nil, e.NewValidErr(err) | ||||||
|  | 	} | ||||||
|  | 	files := form.File["file"] | ||||||
|  | 	scene := c.GetString("scene") | ||||||
|  | 	if len(scene) < 1 { | ||||||
|  | 		scene = "other" | ||||||
|  | 	} | ||||||
|  | 	req = proto.UploadFileRequest{ | ||||||
|  | 		Creator: userInfo.UserId, | ||||||
|  | 		Scene:   scene, | ||||||
|  | 		Files:   files, | ||||||
|  | 	} | ||||||
|  | 	data, err = repo.UploadFile(c, req) | ||||||
|  | 	go s.SaveLog("文件上传", "Manage", "", "", "", fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | @ -4,18 +4,21 @@ import ( | ||||||
| 	"git.hpds.cc/Component/logging" | 	"git.hpds.cc/Component/logging" | ||||||
| 	"github.com/gin-gonic/gin" | 	"github.com/gin-gonic/gin" | ||||||
| 	"go.uber.org/zap" | 	"go.uber.org/zap" | ||||||
|  | 	"hpds-iot-web/config" | ||||||
| 	"hpds-iot-web/model" | 	"hpds-iot-web/model" | ||||||
| 	"time" | 	"time" | ||||||
| 	"xorm.io/xorm" | 	"xorm.io/xorm" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| type HandlerService struct { | type HandlerService struct { | ||||||
|  | 	AppConfig *config.WebConfig | ||||||
| 	Engine    *xorm.Engine | 	Engine    *xorm.Engine | ||||||
| 	Logger    *logging.Logger | 	Logger    *logging.Logger | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func NewHandlerService(engine *xorm.Engine, logger *logging.Logger) *HandlerService { | func NewHandlerService(cfg *config.WebConfig, engine *xorm.Engine, logger *logging.Logger) *HandlerService { | ||||||
| 	return &HandlerService{ | 	return &HandlerService{ | ||||||
|  | 		AppConfig: cfg, | ||||||
| 		Engine:    engine, | 		Engine:    engine, | ||||||
| 		Logger:    logger, | 		Logger:    logger, | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | @ -646,3 +646,74 @@ func (s HandlerService) DelServiceParams(c *gin.Context) (data interface{}, err | ||||||
| 	go s.SaveLog("删除产品(物模型)服务参数", "Manage", "", "", "", fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | 	go s.SaveLog("删除产品(物模型)服务参数", "Manage", "", "", "", fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
| 	return | 	return | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | func (s HandlerService) DeviceList(c *gin.Context) (data interface{}, err error) { | ||||||
|  | 	repo := service.NewManageService(s.Engine, s.Logger) | ||||||
|  | 	us, _ := c.Get("operatorUser") | ||||||
|  | 	userInfo := us.(*model.SystemUser) | ||||||
|  | 	var req proto.DeviceRequest | ||||||
|  | 	err = c.ShouldBindJSON(&req) | ||||||
|  | 	if err != nil { | ||||||
|  | 		go s.SaveLog("DeviceList", "Manage", "", "", req.ToString(), fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 		return nil, e.NewValidErr(err) | ||||||
|  | 	} | ||||||
|  | 	data, err = repo.DeviceList(c, req) | ||||||
|  | 	go s.SaveLog("查看设备列表", "Manage", "", "", "", fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | func (s HandlerService) DeviceInfo(c *gin.Context) (data interface{}, err error) { | ||||||
|  | 	repo := service.NewManageService(s.Engine, s.Logger) | ||||||
|  | 	us, _ := c.Get("operatorUser") | ||||||
|  | 	userInfo := us.(*model.SystemUser) | ||||||
|  | 	var req proto.DeviceItemRequest | ||||||
|  | 	err = c.ShouldBindJSON(&req) | ||||||
|  | 	if err != nil { | ||||||
|  | 		go s.SaveLog("DeviceInfo", "Manage", "", "", req.ToString(), fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 		return nil, e.NewValidErr(err) | ||||||
|  | 	} | ||||||
|  | 	data, err = repo.DeviceInfo(c, req) | ||||||
|  | 	go s.SaveLog("查看设备列表", "Manage", "", "", "", fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | func (s HandlerService) AddDevice(c *gin.Context) (data interface{}, err error) { | ||||||
|  | 	repo := service.NewManageService(s.Engine, s.Logger) | ||||||
|  | 	us, _ := c.Get("operatorUser") | ||||||
|  | 	userInfo := us.(*model.SystemUser) | ||||||
|  | 	var req proto.DeviceItemRequest | ||||||
|  | 	err = c.ShouldBindJSON(&req) | ||||||
|  | 	if err != nil { | ||||||
|  | 		go s.SaveLog("AddDevice", "Manage", "", "", req.ToString(), fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 		return nil, e.NewValidErr(err) | ||||||
|  | 	} | ||||||
|  | 	data, err = repo.AddDevice(c, req) | ||||||
|  | 	go s.SaveLog("新增设备", "Manage", "", "", "", fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | func (s HandlerService) EditDevice(c *gin.Context) (data interface{}, err error) { | ||||||
|  | 	repo := service.NewManageService(s.Engine, s.Logger) | ||||||
|  | 	us, _ := c.Get("operatorUser") | ||||||
|  | 	userInfo := us.(*model.SystemUser) | ||||||
|  | 	var req proto.DeviceItemRequest | ||||||
|  | 	err = c.ShouldBindJSON(&req) | ||||||
|  | 	if err != nil { | ||||||
|  | 		go s.SaveLog("AddDevice", "Manage", "", "", req.ToString(), fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 		return nil, e.NewValidErr(err) | ||||||
|  | 	} | ||||||
|  | 	data, err = repo.EditDevice(c, req) | ||||||
|  | 	go s.SaveLog("修改设备", "Manage", "", "", "", fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | func (s HandlerService) DeleteDevice(c *gin.Context) (data interface{}, err error) { | ||||||
|  | 	repo := service.NewManageService(s.Engine, s.Logger) | ||||||
|  | 	us, _ := c.Get("operatorUser") | ||||||
|  | 	userInfo := us.(*model.SystemUser) | ||||||
|  | 	var req proto.DeviceItemRequest | ||||||
|  | 	err = c.ShouldBindJSON(&req) | ||||||
|  | 	if err != nil { | ||||||
|  | 		go s.SaveLog("AddDevice", "Manage", "", "", req.ToString(), fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 		return nil, e.NewValidErr(err) | ||||||
|  | 	} | ||||||
|  | 	data, err = repo.DeleteDevice(c, req) | ||||||
|  | 	go s.SaveLog("删除设备", "Manage", "", "", "", fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  |  | ||||||
|  | @ -0,0 +1,94 @@ | ||||||
|  | package handler | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"fmt" | ||||||
|  | 	"github.com/gin-gonic/gin" | ||||||
|  | 	"hpds-iot-web/internal/proto" | ||||||
|  | 	"hpds-iot-web/internal/service" | ||||||
|  | 	"hpds-iot-web/model" | ||||||
|  | 	e "hpds-iot-web/pkg/err" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | func (s HandlerService) BrandList(c *gin.Context) (data interface{}, err error) { | ||||||
|  | 	repo := service.NewSystemService(s.Engine, s.Logger) | ||||||
|  | 	us, _ := c.Get("operatorUser") | ||||||
|  | 	userInfo := us.(*model.SystemUser) | ||||||
|  | 	var req proto.BrandRequest | ||||||
|  | 	err = c.ShouldBindJSON(&req) | ||||||
|  | 	if err != nil { | ||||||
|  | 		go s.SaveLog("BrandList", "Manage", "", "", req.ToString(), fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 		return nil, e.NewValidErr(err) | ||||||
|  | 	} | ||||||
|  | 	if req.Size < 1 { | ||||||
|  | 		req.Size = 20 | ||||||
|  | 	} | ||||||
|  | 	if req.Size > 100 { | ||||||
|  | 		req.Size = 100 | ||||||
|  | 	} | ||||||
|  | 	if req.Page < 1 { | ||||||
|  | 		req.Page = 1 | ||||||
|  | 	} | ||||||
|  | 	data, err = repo.BrandList(c, req) | ||||||
|  | 	go s.SaveLog("获取品牌列表", "Manage", "", "", "", fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (s HandlerService) BrandInfo(c *gin.Context) (data interface{}, err error) { | ||||||
|  | 	repo := service.NewSystemService(s.Engine, s.Logger) | ||||||
|  | 	us, _ := c.Get("operatorUser") | ||||||
|  | 	userInfo := us.(*model.SystemUser) | ||||||
|  | 	var req proto.BrandItemRequest | ||||||
|  | 	err = c.ShouldBindJSON(&req) | ||||||
|  | 	if err != nil { | ||||||
|  | 		go s.SaveLog("BrandInfo", "Manage", "", "", req.ToString(), fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 		return nil, e.NewValidErr(err) | ||||||
|  | 	} | ||||||
|  | 	data, err = repo.BrandInfo(c, req) | ||||||
|  | 	go s.SaveLog("获取品牌信息", "Manage", "", "", "", fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (s HandlerService) AddBrand(c *gin.Context) (data interface{}, err error) { | ||||||
|  | 	repo := service.NewSystemService(s.Engine, s.Logger) | ||||||
|  | 	us, _ := c.Get("operatorUser") | ||||||
|  | 	userInfo := us.(*model.SystemUser) | ||||||
|  | 	var req proto.BrandItemRequest | ||||||
|  | 	err = c.ShouldBindJSON(&req) | ||||||
|  | 	if err != nil { | ||||||
|  | 		go s.SaveLog("AddBrand", "Manage", "", "", req.ToString(), fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 		return nil, e.NewValidErr(err) | ||||||
|  | 	} | ||||||
|  | 	data, err = repo.AddBrand(c, req) | ||||||
|  | 	go s.SaveLog("新增品牌", "Manage", "", "", "", fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (s HandlerService) EditBrand(c *gin.Context) (data interface{}, err error) { | ||||||
|  | 	repo := service.NewSystemService(s.Engine, s.Logger) | ||||||
|  | 	us, _ := c.Get("operatorUser") | ||||||
|  | 	userInfo := us.(*model.SystemUser) | ||||||
|  | 	var req proto.BrandItemRequest | ||||||
|  | 	err = c.ShouldBindJSON(&req) | ||||||
|  | 	if err != nil { | ||||||
|  | 		go s.SaveLog("EditBrand", "Manage", "", "", req.ToString(), fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 		return nil, e.NewValidErr(err) | ||||||
|  | 	} | ||||||
|  | 	data, err = repo.EditBrand(c, req) | ||||||
|  | 	go s.SaveLog("修改品牌", "Manage", "", "", "", fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (s HandlerService) DeleteBrand(c *gin.Context) (data interface{}, err error) { | ||||||
|  | 	repo := service.NewSystemService(s.Engine, s.Logger) | ||||||
|  | 	us, _ := c.Get("operatorUser") | ||||||
|  | 	userInfo := us.(*model.SystemUser) | ||||||
|  | 	var req proto.BrandItemRequest | ||||||
|  | 	err = c.ShouldBindJSON(&req) | ||||||
|  | 	if err != nil { | ||||||
|  | 		go s.SaveLog("DeleteBrand", "Manage", "", "", req.ToString(), fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 		return nil, e.NewValidErr(err) | ||||||
|  | 	} | ||||||
|  | 	data, err = repo.DeleteBrand(c, req) | ||||||
|  | 	go s.SaveLog("删除品牌", "Manage", "", "", "", fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | @ -1,6 +1,9 @@ | ||||||
| package proto | package proto | ||||||
| 
 | 
 | ||||||
| import "encoding/json" | import ( | ||||||
|  | 	"encoding/json" | ||||||
|  | 	"mime/multipart" | ||||||
|  | ) | ||||||
| 
 | 
 | ||||||
| type BasePageList struct { | type BasePageList struct { | ||||||
| 	Page int64 `json:"pageNum,omitempty" form:"page"` | 	Page int64 `json:"pageNum,omitempty" form:"page"` | ||||||
|  | @ -329,3 +332,76 @@ func (p ModelItemRequest) ToString() string { | ||||||
| 	} | 	} | ||||||
| 	return string(data) | 	return string(data) | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | type DeviceRequest struct { | ||||||
|  | 	Key          string `json:"key"` | ||||||
|  | 	ProductId    int64  `json:"productId"` | ||||||
|  | 	DeviceTypeId int    `json:"deviceTypeId"` | ||||||
|  | 	BasePageList | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (p DeviceRequest) ToString() string { | ||||||
|  | 	data, err := json.Marshal(p) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return "" | ||||||
|  | 	} | ||||||
|  | 	return string(data) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type DeviceItemRequest struct { | ||||||
|  | 	DeviceId      int64   `json:"deviceId"` | ||||||
|  | 	DeviceName    string  `json:"deviceName"` | ||||||
|  | 	DeviceBrandId int     `json:"deviceBrandId"` | ||||||
|  | 	DeviceImei    string  `json:"deviceImei"` | ||||||
|  | 	DeviceSn      string  `json:"deviceSn"` | ||||||
|  | 	DeviceTypeId  int     `json:"deviceTypeId"` | ||||||
|  | 	ButtMatterId  int64   `json:"buttMatterId"` | ||||||
|  | 	ButtType      int     `json:"buttType"` | ||||||
|  | 	ButtAddress   string  `json:"buttAddress"` | ||||||
|  | 	ButtPort      int     `json:"buttPort"` | ||||||
|  | 	Longitude     float64 `json:"longitude"` | ||||||
|  | 	Latitude      float64 `json:"latitude"` | ||||||
|  | 	DeviceDesc    string  `json:"deviceDesc"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (p DeviceItemRequest) ToString() string { | ||||||
|  | 	data, err := json.Marshal(p) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return "" | ||||||
|  | 	} | ||||||
|  | 	return string(data) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type UploadFileRequest struct { | ||||||
|  | 	Creator int64                   `json:"creator"` | ||||||
|  | 	Scene   string                  `json:"scene"` | ||||||
|  | 	Files   []*multipart.FileHeader `json:"files"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type BrandRequest struct { | ||||||
|  | 	BrandName string `json:"brandName"` | ||||||
|  | 	BasePageList | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (p BrandRequest) ToString() string { | ||||||
|  | 	data, err := json.Marshal(p) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return "" | ||||||
|  | 	} | ||||||
|  | 	return string(data) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type BrandItemRequest struct { | ||||||
|  | 	BrandId   int64  `json:"brandId"` | ||||||
|  | 	BrandName string `json:"brandName"` | ||||||
|  | 	BrandLogo string `json:"brandLogo"` | ||||||
|  | 	BrandWeb  string `json:"brandWeb"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (p BrandItemRequest) ToString() string { | ||||||
|  | 	data, err := json.Marshal(p) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return "" | ||||||
|  | 	} | ||||||
|  | 	return string(data) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | @ -4,6 +4,7 @@ import ( | ||||||
| 	"git.hpds.cc/Component/logging" | 	"git.hpds.cc/Component/logging" | ||||||
| 	ginzap "github.com/gin-contrib/zap" | 	ginzap "github.com/gin-contrib/zap" | ||||||
| 	"github.com/gin-gonic/gin" | 	"github.com/gin-gonic/gin" | ||||||
|  | 	"hpds-iot-web/config" | ||||||
| 	"hpds-iot-web/internal/handler" | 	"hpds-iot-web/internal/handler" | ||||||
| 	"hpds-iot-web/internal/middleware" | 	"hpds-iot-web/internal/middleware" | ||||||
| 	"xorm.io/xorm" | 	"xorm.io/xorm" | ||||||
|  | @ -11,8 +12,8 @@ import ( | ||||||
| 	e "hpds-iot-web/pkg/err" | 	e "hpds-iot-web/pkg/err" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| func InitRouter(logger *logging.Logger, engine *xorm.Engine) *gin.Engine { | func InitRouter(cfg *config.WebConfig, logger *logging.Logger, engine *xorm.Engine) *gin.Engine { | ||||||
| 	hs := handler.NewHandlerService(engine, logger) | 	hs := handler.NewHandlerService(cfg, engine, logger) | ||||||
| 	gin.SetMode(gin.ReleaseMode) | 	gin.SetMode(gin.ReleaseMode) | ||||||
| 	root := gin.New() | 	root := gin.New() | ||||||
| 	root.Use(ginzap.Ginzap(logger.Logger, "2006-01-02 15:04:05.000", true)) | 	root.Use(ginzap.Ginzap(logger.Logger, "2006-01-02 15:04:05.000", true)) | ||||||
|  | @ -103,6 +104,14 @@ func InitRouter(logger *logging.Logger, engine *xorm.Engine) *gin.Engine { | ||||||
| 						params.POST("/delete", e.ErrorWrapper(hs.DelServiceParams)) | 						params.POST("/delete", e.ErrorWrapper(hs.DelServiceParams)) | ||||||
| 					} | 					} | ||||||
| 				} | 				} | ||||||
|  | 				device := product.Group("/device") | ||||||
|  | 				{ | ||||||
|  | 					device.POST("/list", e.ErrorWrapper(hs.DeviceList)) | ||||||
|  | 					device.POST("/info", e.ErrorWrapper(hs.DeviceInfo)) | ||||||
|  | 					device.POST("/add", e.ErrorWrapper(hs.AddDevice)) | ||||||
|  | 					device.POST("/edit", e.ErrorWrapper(hs.EditDevice)) | ||||||
|  | 					device.POST("/delete", e.ErrorWrapper(hs.DeleteDevice)) | ||||||
|  | 				} | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 		model := r.Group("/model") | 		model := r.Group("/model") | ||||||
|  | @ -113,6 +122,23 @@ func InitRouter(logger *logging.Logger, engine *xorm.Engine) *gin.Engine { | ||||||
| 			model.POST("/edit", e.ErrorWrapper(hs.EditModel)) | 			model.POST("/edit", e.ErrorWrapper(hs.EditModel)) | ||||||
| 			model.POST("/delete", e.ErrorWrapper(hs.DelModel)) | 			model.POST("/delete", e.ErrorWrapper(hs.DelModel)) | ||||||
| 		} | 		} | ||||||
|  | 		file := r.Group("/file") | ||||||
|  | 		{ | ||||||
|  | 			file.Use(middleware.JwtAuthMiddleware(logger.Logger)) | ||||||
|  | 			file.POST("/upload", e.ErrorWrapper(hs.UploadFile)) | ||||||
|  | 		} | ||||||
|  | 		system := r.Group("/system") | ||||||
|  | 		{ | ||||||
|  | 			system.Use(middleware.JwtAuthMiddleware(logger.Logger)) | ||||||
|  | 			brand := system.Group("/brand") | ||||||
|  | 			{ | ||||||
|  | 				brand.POST("/list", e.ErrorWrapper(hs.BrandList)) | ||||||
|  | 				brand.POST("/info", e.ErrorWrapper(hs.BrandInfo)) | ||||||
|  | 				brand.POST("/add", e.ErrorWrapper(hs.AddBrand)) | ||||||
|  | 				brand.POST("/edit", e.ErrorWrapper(hs.EditBrand)) | ||||||
|  | 				brand.POST("/delete", e.ErrorWrapper(hs.DeleteBrand)) | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
| 	} | 	} | ||||||
| 	return root | 	return root | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -0,0 +1,128 @@ | ||||||
|  | package service | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"context" | ||||||
|  | 	"crypto/md5" | ||||||
|  | 	"encoding/hex" | ||||||
|  | 	"fmt" | ||||||
|  | 	"git.hpds.cc/Component/logging" | ||||||
|  | 	"github.com/minio/minio-go/v7/pkg/credentials" | ||||||
|  | 	"hpds-iot-web/config" | ||||||
|  | 	"hpds-iot-web/internal/proto" | ||||||
|  | 	"hpds-iot-web/model" | ||||||
|  | 	"io" | ||||||
|  | 	"mime/multipart" | ||||||
|  | 	"net/http" | ||||||
|  | 	"time" | ||||||
|  | 	"xorm.io/xorm" | ||||||
|  | 
 | ||||||
|  | 	"github.com/minio/minio-go/v7" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type FileService interface { | ||||||
|  | 	UploadFile(ctx context.Context, req proto.UploadFileRequest) (rsp *proto.BaseResponse, err error) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func NewFileService(cfg *config.WebConfig, engine *xorm.Engine, logger *logging.Logger) FileService { | ||||||
|  | 	return &repo{ | ||||||
|  | 		AppConfig: cfg, | ||||||
|  | 		engine:    engine, | ||||||
|  | 		logger:    logger, | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (rp *repo) UploadFile(ctx context.Context, req proto.UploadFileRequest) (rsp *proto.BaseResponse, err error) { | ||||||
|  | 	rsp = new(proto.BaseResponse) | ||||||
|  | 	select { | ||||||
|  | 	case <-ctx.Done(): | ||||||
|  | 		err = fmt.Errorf("超时/取消") | ||||||
|  | 		rsp.Code = http.StatusInternalServerError | ||||||
|  | 		rsp.Status = http.StatusText(http.StatusInternalServerError) | ||||||
|  | 		rsp.Message = "超时/取消" | ||||||
|  | 		rsp.Err = ctx.Err() | ||||||
|  | 		return rsp, ctx.Err() | ||||||
|  | 	default: | ||||||
|  | 		list := make([]*model.FileManager, len(req.Files)) | ||||||
|  | 		for k, _ := range req.Files { | ||||||
|  | 			fileItem, err := rp.UploadFileToMinIo(ctx, req.Files[k], req.Scene, req.Creator) | ||||||
|  | 			if err != nil { | ||||||
|  | 				goto ReturnPoint | ||||||
|  | 			} | ||||||
|  | 			list[k] = fileItem | ||||||
|  | 		} | ||||||
|  | 		_, err = rp.engine.Insert(list) | ||||||
|  | 
 | ||||||
|  | 		rsp.Code = http.StatusOK | ||||||
|  | 		rsp.Status = http.StatusText(http.StatusOK) | ||||||
|  | 		rsp.Message = "成功" | ||||||
|  | 		rsp.Data = list | ||||||
|  | 		rsp.Err = err | ||||||
|  | 		return rsp, err | ||||||
|  | 	} | ||||||
|  | ReturnPoint: | ||||||
|  | 	if err != nil { | ||||||
|  | 		rsp.Code = http.StatusInternalServerError | ||||||
|  | 		rsp.Status = http.StatusText(http.StatusInternalServerError) | ||||||
|  | 		rsp.Err = err | ||||||
|  | 		rsp.Message = "失败" | ||||||
|  | 	} | ||||||
|  | 	return rsp, err | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (rp *repo) UploadFileToMinIo(ctx context.Context, srcFile *multipart.FileHeader, scene string, creator int64) (data *model.FileManager, err error) { | ||||||
|  | 	file, err := srcFile.Open() | ||||||
|  | 	defer file.Close() | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	fileName := srcFile.Filename | ||||||
|  | 
 | ||||||
|  | 	//out, err := os.Create(fileName)
 | ||||||
|  | 	//defer out.Close()
 | ||||||
|  | 	//if err != nil {
 | ||||||
|  | 	//	return nil, err
 | ||||||
|  | 	//}
 | ||||||
|  | 	//
 | ||||||
|  | 	//_, err = io.Copy(out, file)
 | ||||||
|  | 	//if err != nil {
 | ||||||
|  | 	//	return nil, err
 | ||||||
|  | 	//}
 | ||||||
|  | 	//
 | ||||||
|  | 	//fileStat, err := out.Stat()
 | ||||||
|  | 	//if err != nil {
 | ||||||
|  | 	//	return nil, err
 | ||||||
|  | 	//}
 | ||||||
|  | 	opt := &minio.Options{ | ||||||
|  | 		Creds:  credentials.NewStaticV4(rp.AppConfig.Minio.AccessKeyId, rp.AppConfig.Minio.SecretAccessKey, ""), | ||||||
|  | 		Secure: false, | ||||||
|  | 	} | ||||||
|  | 	minioClient, err := minio.New(rp.AppConfig.Minio.Endpoint, opt) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	//bucketName := fmt.Sprintf("jky-data/%s/%s", scene, time.Now().Format("20060102"))
 | ||||||
|  | 	objPath := fmt.Sprintf("%s/%s/%s", scene, time.Now().Format("20060102"), fileName) | ||||||
|  | 	info, err := minioClient.PutObject(ctx, "jky-data", objPath, file, srcFile.Size, minio.PutObjectOptions{ContentType: "application/octet-stream"}) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	fmt.Println("info =====> ", info) | ||||||
|  | 	accessUrl := fmt.Sprintf("%s/jky-data/%s", rp.AppConfig.Minio.Endpoint, objPath) | ||||||
|  | 
 | ||||||
|  | 	md5hash := md5.New() | ||||||
|  | 	if _, err := io.Copy(md5hash, file); err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	data = new(model.FileManager) | ||||||
|  | 	data.FileName = fileName | ||||||
|  | 	data.Scene = scene | ||||||
|  | 	data.AccessUrl = accessUrl | ||||||
|  | 	data.FileSize = srcFile.Size | ||||||
|  | 	data.Creator = creator | ||||||
|  | 	data.FileMd5 = hex.EncodeToString(md5hash.Sum(nil)) | ||||||
|  | 	data.CreateAt = time.Now().Unix() | ||||||
|  | 	data.UpdateAt = time.Now().Unix() | ||||||
|  | 	return data, nil | ||||||
|  | } | ||||||
|  | @ -5,6 +5,7 @@ import ( | ||||||
| 	"encoding/json" | 	"encoding/json" | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"git.hpds.cc/Component/logging" | 	"git.hpds.cc/Component/logging" | ||||||
|  | 	"hpds-iot-web/config" | ||||||
| 	"hpds-iot-web/internal/middleware" | 	"hpds-iot-web/internal/middleware" | ||||||
| 	"hpds-iot-web/internal/proto" | 	"hpds-iot-web/internal/proto" | ||||||
| 	"hpds-iot-web/model" | 	"hpds-iot-web/model" | ||||||
|  | @ -40,6 +41,7 @@ func FillPaging(count int64, pageNum int64, pageSize int64, list interface{}, da | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| type repo struct { | type repo struct { | ||||||
|  | 	AppConfig *config.WebConfig | ||||||
| 	engine    *xorm.Engine | 	engine    *xorm.Engine | ||||||
| 	logger    *logging.Logger | 	logger    *logging.Logger | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -57,6 +57,12 @@ type ManageService interface { | ||||||
| 	AddServiceParams(ctx context.Context, req proto.ServiceParamItem) (rsp *proto.BaseResponse, err error) | 	AddServiceParams(ctx context.Context, req proto.ServiceParamItem) (rsp *proto.BaseResponse, err error) | ||||||
| 	EditServiceParams(ctx context.Context, req proto.ServiceParamItem) (rsp *proto.BaseResponse, err error) | 	EditServiceParams(ctx context.Context, req proto.ServiceParamItem) (rsp *proto.BaseResponse, err error) | ||||||
| 	DelServiceParams(ctx context.Context, req proto.ServiceParamItem) (rsp *proto.BaseResponse, err error) | 	DelServiceParams(ctx context.Context, req proto.ServiceParamItem) (rsp *proto.BaseResponse, err error) | ||||||
|  | 
 | ||||||
|  | 	DeviceList(ctx context.Context, req proto.DeviceRequest) (rsp *proto.BaseResponse, err error) | ||||||
|  | 	DeviceInfo(ctx context.Context, req proto.DeviceItemRequest) (rsp *proto.BaseResponse, err error) | ||||||
|  | 	AddDevice(ctx context.Context, req proto.DeviceItemRequest) (rsp *proto.BaseResponse, err error) | ||||||
|  | 	EditDevice(ctx context.Context, req proto.DeviceItemRequest) (rsp *proto.BaseResponse, err error) | ||||||
|  | 	DeleteDevice(ctx context.Context, req proto.DeviceItemRequest) (rsp *proto.BaseResponse, err error) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func NewManageService(engine *xorm.Engine, logger *logging.Logger) ManageService { | func NewManageService(engine *xorm.Engine, logger *logging.Logger) ManageService { | ||||||
|  | @ -1806,3 +1812,245 @@ ReturnPoint: | ||||||
| 	} | 	} | ||||||
| 	return rsp, err | 	return rsp, err | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | func (rp *repo) DeviceList(ctx context.Context, req proto.DeviceRequest) (rsp *proto.BaseResponse, err error) { | ||||||
|  | 	rsp = new(proto.BaseResponse) | ||||||
|  | 	select { | ||||||
|  | 	case <-ctx.Done(): | ||||||
|  | 		err = fmt.Errorf("超时/取消") | ||||||
|  | 		rsp.Code = http.StatusInternalServerError | ||||||
|  | 		rsp.Status = http.StatusText(http.StatusInternalServerError) | ||||||
|  | 		rsp.Message = "超时/取消" | ||||||
|  | 		rsp.Err = ctx.Err() | ||||||
|  | 		return rsp, ctx.Err() | ||||||
|  | 	default: | ||||||
|  | 		data := make([]model.Device, 0) | ||||||
|  | 		count, err := rp.engine.Where("(? = '' or device_name like ?  or device_imei like ? or device_sn like ?)", | ||||||
|  | 			req.Key, "%"+req.Key+"%", "%"+req.Key+"%", "%"+req.Key+"%"). | ||||||
|  | 			And("(? = 0 or device_type_id = ?)", req.DeviceTypeId, req.DeviceTypeId). | ||||||
|  | 			And("(? = 0 or butt_matter_id = ?)", req.ProductId, req.ProductId). | ||||||
|  | 			And("status = 1"). | ||||||
|  | 			Limit(int(req.Size), int(((req.Page)-1)*req.Size)). | ||||||
|  | 			FindAndCount(&data) | ||||||
|  | 		if err != nil { | ||||||
|  | 			goto ReturnPoint | ||||||
|  | 		} | ||||||
|  | 		rsp.Code = http.StatusOK | ||||||
|  | 		rsp.Status = http.StatusText(http.StatusOK) | ||||||
|  | 		rsp.Message = "成功" | ||||||
|  | 		rsp = FillPaging(count, req.Page, req.Size, data, rsp) | ||||||
|  | 		rsp.Err = err | ||||||
|  | 		return rsp, err | ||||||
|  | 	} | ||||||
|  | ReturnPoint: | ||||||
|  | 	if err != nil { | ||||||
|  | 		rsp.Code = http.StatusInternalServerError | ||||||
|  | 		rsp.Status = http.StatusText(http.StatusInternalServerError) | ||||||
|  | 		rsp.Err = err | ||||||
|  | 		rsp.Message = "失败" | ||||||
|  | 	} | ||||||
|  | 	return rsp, err | ||||||
|  | } | ||||||
|  | func (rp *repo) DeviceInfo(ctx context.Context, req proto.DeviceItemRequest) (rsp *proto.BaseResponse, err error) { | ||||||
|  | 	rsp = new(proto.BaseResponse) | ||||||
|  | 	select { | ||||||
|  | 	case <-ctx.Done(): | ||||||
|  | 		err = fmt.Errorf("超时/取消") | ||||||
|  | 		rsp.Code = http.StatusInternalServerError | ||||||
|  | 		rsp.Status = http.StatusText(http.StatusInternalServerError) | ||||||
|  | 		rsp.Message = "超时/取消" | ||||||
|  | 		rsp.Err = ctx.Err() | ||||||
|  | 		return rsp, ctx.Err() | ||||||
|  | 	default: | ||||||
|  | 		var h bool | ||||||
|  | 		item := new(model.Device) | ||||||
|  | 		h, err = rp.engine.ID(req.DeviceId).Get(item) | ||||||
|  | 		if err != nil { | ||||||
|  | 			goto ReturnPoint | ||||||
|  | 		} | ||||||
|  | 		if !h { | ||||||
|  | 			err = fmt.Errorf("未能找到对应的设备") | ||||||
|  | 			goto ReturnPoint | ||||||
|  | 		} | ||||||
|  | 		rsp.Code = http.StatusOK | ||||||
|  | 		rsp.Status = http.StatusText(http.StatusOK) | ||||||
|  | 		rsp.Message = "成功" | ||||||
|  | 		rsp.Data = item | ||||||
|  | 		rsp.Err = err | ||||||
|  | 		return rsp, err | ||||||
|  | 	} | ||||||
|  | ReturnPoint: | ||||||
|  | 	if err != nil { | ||||||
|  | 		rsp.Code = http.StatusInternalServerError | ||||||
|  | 		rsp.Status = http.StatusText(http.StatusInternalServerError) | ||||||
|  | 		rsp.Err = err | ||||||
|  | 		rsp.Message = "失败" | ||||||
|  | 	} | ||||||
|  | 	return rsp, err | ||||||
|  | } | ||||||
|  | func (rp *repo) AddDevice(ctx context.Context, req proto.DeviceItemRequest) (rsp *proto.BaseResponse, err error) { | ||||||
|  | 	rsp = new(proto.BaseResponse) | ||||||
|  | 	select { | ||||||
|  | 	case <-ctx.Done(): | ||||||
|  | 		err = fmt.Errorf("超时/取消") | ||||||
|  | 		rsp.Code = http.StatusInternalServerError | ||||||
|  | 		rsp.Status = http.StatusText(http.StatusInternalServerError) | ||||||
|  | 		rsp.Message = "超时/取消" | ||||||
|  | 		rsp.Err = ctx.Err() | ||||||
|  | 		return rsp, ctx.Err() | ||||||
|  | 	default: | ||||||
|  | 		item := &model.Device{ | ||||||
|  | 			DeviceName:    req.DeviceName, | ||||||
|  | 			DeviceBrandId: req.DeviceBrandId, | ||||||
|  | 			DeviceImei:    req.DeviceImei, | ||||||
|  | 			DeviceSn:      req.DeviceSn, | ||||||
|  | 			DeviceTypeId:  req.DeviceTypeId, | ||||||
|  | 			ButtMatterId:  req.ButtMatterId, | ||||||
|  | 			ButtType:      req.ButtType, | ||||||
|  | 			ButtAddress:   req.ButtAddress, | ||||||
|  | 			ButtPort:      req.ButtPort, | ||||||
|  | 			Longitude:     req.Longitude, | ||||||
|  | 			Latitude:      req.Latitude, | ||||||
|  | 			DeviceDesc:    req.DeviceDesc, | ||||||
|  | 			Status:        1, | ||||||
|  | 			CreateAt:      time.Now().Unix(), | ||||||
|  | 			UpdateAt:      time.Now().Unix(), | ||||||
|  | 		} | ||||||
|  | 		_, err = rp.engine.Insert(item) | ||||||
|  | 		if err != nil { | ||||||
|  | 			goto ReturnPoint | ||||||
|  | 		} | ||||||
|  | 		rsp.Code = http.StatusOK | ||||||
|  | 		rsp.Status = http.StatusText(http.StatusOK) | ||||||
|  | 		rsp.Message = "成功" | ||||||
|  | 		rsp.Err = err | ||||||
|  | 		return rsp, err | ||||||
|  | 	} | ||||||
|  | ReturnPoint: | ||||||
|  | 	if err != nil { | ||||||
|  | 		rsp.Code = http.StatusInternalServerError | ||||||
|  | 		rsp.Status = http.StatusText(http.StatusInternalServerError) | ||||||
|  | 		rsp.Err = err | ||||||
|  | 		rsp.Message = "失败" | ||||||
|  | 	} | ||||||
|  | 	return rsp, err | ||||||
|  | } | ||||||
|  | func (rp *repo) EditDevice(ctx context.Context, req proto.DeviceItemRequest) (rsp *proto.BaseResponse, err error) { | ||||||
|  | 	rsp = new(proto.BaseResponse) | ||||||
|  | 	select { | ||||||
|  | 	case <-ctx.Done(): | ||||||
|  | 		err = fmt.Errorf("超时/取消") | ||||||
|  | 		rsp.Code = http.StatusInternalServerError | ||||||
|  | 		rsp.Status = http.StatusText(http.StatusInternalServerError) | ||||||
|  | 		rsp.Message = "超时/取消" | ||||||
|  | 		rsp.Err = ctx.Err() | ||||||
|  | 		return rsp, ctx.Err() | ||||||
|  | 	default: | ||||||
|  | 		var h bool | ||||||
|  | 		item := new(model.Device) | ||||||
|  | 		h, err = rp.engine.ID(req.DeviceId).Get(item) | ||||||
|  | 		if err != nil { | ||||||
|  | 			goto ReturnPoint | ||||||
|  | 		} | ||||||
|  | 		if !h { | ||||||
|  | 			err = fmt.Errorf("未能找到对应的设备") | ||||||
|  | 			goto ReturnPoint | ||||||
|  | 		} | ||||||
|  | 		if len(req.DeviceName) > 0 { | ||||||
|  | 			item.DeviceName = req.DeviceName | ||||||
|  | 		} | ||||||
|  | 		if req.DeviceBrandId > 0 { | ||||||
|  | 			item.DeviceBrandId = req.DeviceBrandId | ||||||
|  | 		} | ||||||
|  | 		if len(req.DeviceImei) > 0 { | ||||||
|  | 			item.DeviceImei = req.DeviceImei | ||||||
|  | 		} | ||||||
|  | 		if len(req.DeviceSn) > 0 { | ||||||
|  | 			item.DeviceSn = req.DeviceSn | ||||||
|  | 		} | ||||||
|  | 		if len(req.DeviceDesc) > 0 { | ||||||
|  | 			item.DeviceDesc = req.DeviceDesc | ||||||
|  | 		} | ||||||
|  | 		if req.DeviceTypeId > 0 { | ||||||
|  | 			item.DeviceTypeId = req.DeviceTypeId | ||||||
|  | 		} | ||||||
|  | 		if req.ButtMatterId > 0 { | ||||||
|  | 			item.ButtMatterId = req.ButtMatterId | ||||||
|  | 		} | ||||||
|  | 		if req.ButtType > 0 { | ||||||
|  | 			item.ButtType = req.ButtType | ||||||
|  | 		} | ||||||
|  | 		if len(req.ButtAddress) > 0 { | ||||||
|  | 			item.ButtAddress = req.ButtAddress | ||||||
|  | 		} | ||||||
|  | 		if req.ButtPort > 0 { | ||||||
|  | 			item.ButtPort = req.ButtPort | ||||||
|  | 		} | ||||||
|  | 		if req.Longitude > 0 { | ||||||
|  | 			item.Longitude = req.Longitude | ||||||
|  | 		} | ||||||
|  | 		if req.Latitude > 0 { | ||||||
|  | 			item.Latitude = req.Latitude | ||||||
|  | 		} | ||||||
|  | 		item.UpdateAt = time.Now().Unix() | ||||||
|  | 		_, err = rp.engine.ID(req.DeviceId).AllCols().Update(item) | ||||||
|  | 		if err != nil { | ||||||
|  | 			goto ReturnPoint | ||||||
|  | 		} | ||||||
|  | 		rsp.Code = http.StatusOK | ||||||
|  | 		rsp.Status = http.StatusText(http.StatusOK) | ||||||
|  | 		rsp.Message = "成功" | ||||||
|  | 		rsp.Err = err | ||||||
|  | 		return rsp, err | ||||||
|  | 	} | ||||||
|  | ReturnPoint: | ||||||
|  | 	if err != nil { | ||||||
|  | 		rsp.Code = http.StatusInternalServerError | ||||||
|  | 		rsp.Status = http.StatusText(http.StatusInternalServerError) | ||||||
|  | 		rsp.Err = err | ||||||
|  | 		rsp.Message = "失败" | ||||||
|  | 	} | ||||||
|  | 	return rsp, err | ||||||
|  | } | ||||||
|  | func (rp *repo) DeleteDevice(ctx context.Context, req proto.DeviceItemRequest) (rsp *proto.BaseResponse, err error) { | ||||||
|  | 	rsp = new(proto.BaseResponse) | ||||||
|  | 	select { | ||||||
|  | 	case <-ctx.Done(): | ||||||
|  | 		err = fmt.Errorf("超时/取消") | ||||||
|  | 		rsp.Code = http.StatusInternalServerError | ||||||
|  | 		rsp.Status = http.StatusText(http.StatusInternalServerError) | ||||||
|  | 		rsp.Message = "超时/取消" | ||||||
|  | 		rsp.Err = ctx.Err() | ||||||
|  | 		return rsp, ctx.Err() | ||||||
|  | 	default: | ||||||
|  | 		var h bool | ||||||
|  | 		item := new(model.Device) | ||||||
|  | 		h, err = rp.engine.ID(req.DeviceId).Get(item) | ||||||
|  | 		if err != nil { | ||||||
|  | 			goto ReturnPoint | ||||||
|  | 		} | ||||||
|  | 		if !h { | ||||||
|  | 			err = fmt.Errorf("未能找到对应的设备") | ||||||
|  | 			goto ReturnPoint | ||||||
|  | 		} | ||||||
|  | 		item.Status = 0 | ||||||
|  | 		item.UpdateAt = time.Now().Unix() | ||||||
|  | 		_, err = rp.engine.ID(req.DeviceId).AllCols().Update(item) | ||||||
|  | 		if err != nil { | ||||||
|  | 			goto ReturnPoint | ||||||
|  | 		} | ||||||
|  | 		rsp.Code = http.StatusOK | ||||||
|  | 		rsp.Status = http.StatusText(http.StatusOK) | ||||||
|  | 		rsp.Message = "成功" | ||||||
|  | 		rsp.Err = err | ||||||
|  | 		return rsp, err | ||||||
|  | 	} | ||||||
|  | ReturnPoint: | ||||||
|  | 	if err != nil { | ||||||
|  | 		rsp.Code = http.StatusInternalServerError | ||||||
|  | 		rsp.Status = http.StatusText(http.StatusInternalServerError) | ||||||
|  | 		rsp.Err = err | ||||||
|  | 		rsp.Message = "失败" | ||||||
|  | 	} | ||||||
|  | 	return rsp, err | ||||||
|  | } | ||||||
|  |  | ||||||
|  | @ -0,0 +1,233 @@ | ||||||
|  | package service | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"context" | ||||||
|  | 	"fmt" | ||||||
|  | 	"git.hpds.cc/Component/logging" | ||||||
|  | 	"hpds-iot-web/internal/proto" | ||||||
|  | 	"hpds-iot-web/model" | ||||||
|  | 	"net/http" | ||||||
|  | 	"time" | ||||||
|  | 	"xorm.io/xorm" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type SystemService interface { | ||||||
|  | 	BrandList(ctx context.Context, req proto.BrandRequest) (rsp *proto.BaseResponse, err error) | ||||||
|  | 	BrandInfo(ctx context.Context, req proto.BrandItemRequest) (rsp *proto.BaseResponse, err error) | ||||||
|  | 	AddBrand(ctx context.Context, req proto.BrandItemRequest) (rsp *proto.BaseResponse, err error) | ||||||
|  | 	EditBrand(ctx context.Context, req proto.BrandItemRequest) (rsp *proto.BaseResponse, err error) | ||||||
|  | 	DeleteBrand(ctx context.Context, req proto.BrandItemRequest) (rsp *proto.BaseResponse, err error) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func NewSystemService(engine *xorm.Engine, logger *logging.Logger) SystemService { | ||||||
|  | 	return &repo{ | ||||||
|  | 		engine: engine, | ||||||
|  | 		logger: logger, | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (rp *repo) BrandList(ctx context.Context, req proto.BrandRequest) (rsp *proto.BaseResponse, err error) { | ||||||
|  | 	rsp = new(proto.BaseResponse) | ||||||
|  | 	select { | ||||||
|  | 	case <-ctx.Done(): | ||||||
|  | 		err = fmt.Errorf("超时/取消") | ||||||
|  | 		rsp.Code = http.StatusInternalServerError | ||||||
|  | 		rsp.Status = http.StatusText(http.StatusInternalServerError) | ||||||
|  | 		rsp.Message = "超时/取消" | ||||||
|  | 		rsp.Err = ctx.Err() | ||||||
|  | 		return rsp, ctx.Err() | ||||||
|  | 	default: | ||||||
|  | 		data := make([]model.Brand, 0) | ||||||
|  | 		count, err := rp.engine.Where("(? = '' or brand_name like ?)", req.BrandName, "%"+req.BrandName+"%"). | ||||||
|  | 			And("status = 1").Limit(int(req.Size), int(((req.Page)-1)*req.Size)). | ||||||
|  | 			FindAndCount(&data) | ||||||
|  | 		if err != nil { | ||||||
|  | 			goto ReturnPoint | ||||||
|  | 		} | ||||||
|  | 		rsp.Code = http.StatusOK | ||||||
|  | 		rsp.Status = http.StatusText(http.StatusOK) | ||||||
|  | 		rsp.Message = "成功" | ||||||
|  | 		rsp = FillPaging(count, req.Page, req.Size, data, rsp) | ||||||
|  | 		rsp.Err = err | ||||||
|  | 		return rsp, err | ||||||
|  | 	} | ||||||
|  | ReturnPoint: | ||||||
|  | 	if err != nil { | ||||||
|  | 		rsp.Code = http.StatusInternalServerError | ||||||
|  | 		rsp.Status = http.StatusText(http.StatusInternalServerError) | ||||||
|  | 		rsp.Err = err | ||||||
|  | 		rsp.Message = "失败" | ||||||
|  | 	} | ||||||
|  | 	return rsp, err | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (rp *repo) BrandInfo(ctx context.Context, req proto.BrandItemRequest) (rsp *proto.BaseResponse, err error) { | ||||||
|  | 	rsp = new(proto.BaseResponse) | ||||||
|  | 	select { | ||||||
|  | 	case <-ctx.Done(): | ||||||
|  | 		err = fmt.Errorf("超时/取消") | ||||||
|  | 		rsp.Code = http.StatusInternalServerError | ||||||
|  | 		rsp.Status = http.StatusText(http.StatusInternalServerError) | ||||||
|  | 		rsp.Message = "超时/取消" | ||||||
|  | 		rsp.Err = ctx.Err() | ||||||
|  | 		return rsp, ctx.Err() | ||||||
|  | 	default: | ||||||
|  | 		var h bool | ||||||
|  | 		item := new(model.Brand) | ||||||
|  | 		h, err = rp.engine.ID(req.BrandId).Get(item) | ||||||
|  | 		if err != nil { | ||||||
|  | 			goto ReturnPoint | ||||||
|  | 		} | ||||||
|  | 		if !h { | ||||||
|  | 			err = fmt.Errorf("未能找到对应的品牌") | ||||||
|  | 			goto ReturnPoint | ||||||
|  | 		} | ||||||
|  | 		rsp.Code = http.StatusOK | ||||||
|  | 		rsp.Status = http.StatusText(http.StatusOK) | ||||||
|  | 		rsp.Message = "获取品牌成功" | ||||||
|  | 		rsp.Err = ctx.Err() | ||||||
|  | 		rsp.Data = item | ||||||
|  | 		return rsp, err | ||||||
|  | 	} | ||||||
|  | ReturnPoint: | ||||||
|  | 	if err != nil { | ||||||
|  | 		rsp.Code = http.StatusInternalServerError | ||||||
|  | 		rsp.Status = http.StatusText(http.StatusInternalServerError) | ||||||
|  | 		rsp.Err = err | ||||||
|  | 		rsp.Message = "失败" | ||||||
|  | 	} | ||||||
|  | 	return rsp, err | ||||||
|  | } | ||||||
|  | func (rp *repo) AddBrand(ctx context.Context, req proto.BrandItemRequest) (rsp *proto.BaseResponse, err error) { | ||||||
|  | 	rsp = new(proto.BaseResponse) | ||||||
|  | 	select { | ||||||
|  | 	case <-ctx.Done(): | ||||||
|  | 		err = fmt.Errorf("超时/取消") | ||||||
|  | 		rsp.Code = http.StatusInternalServerError | ||||||
|  | 		rsp.Status = http.StatusText(http.StatusInternalServerError) | ||||||
|  | 		rsp.Message = "超时/取消" | ||||||
|  | 		rsp.Err = ctx.Err() | ||||||
|  | 		return rsp, ctx.Err() | ||||||
|  | 	default: | ||||||
|  | 		item := &model.Brand{ | ||||||
|  | 			BrandName: req.BrandName, | ||||||
|  | 			BrandLogo: req.BrandLogo, | ||||||
|  | 			BrandWeb:  req.BrandWeb, | ||||||
|  | 			Status:    1, | ||||||
|  | 			CreateAt:  time.Now().Unix(), | ||||||
|  | 			UpdateAt:  time.Now().Unix(), | ||||||
|  | 		} | ||||||
|  | 		_, err = rp.engine.Insert(item) | ||||||
|  | 		if err != nil { | ||||||
|  | 			goto ReturnPoint | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		rsp.Code = http.StatusOK | ||||||
|  | 		rsp.Status = http.StatusText(http.StatusOK) | ||||||
|  | 		rsp.Message = "新增品牌成功" | ||||||
|  | 		rsp.Err = ctx.Err() | ||||||
|  | 		rsp.Data = item | ||||||
|  | 		return rsp, err | ||||||
|  | 	} | ||||||
|  | ReturnPoint: | ||||||
|  | 	if err != nil { | ||||||
|  | 		rsp.Code = http.StatusInternalServerError | ||||||
|  | 		rsp.Status = http.StatusText(http.StatusInternalServerError) | ||||||
|  | 		rsp.Err = err | ||||||
|  | 		rsp.Message = "失败" | ||||||
|  | 	} | ||||||
|  | 	return rsp, err | ||||||
|  | } | ||||||
|  | func (rp *repo) EditBrand(ctx context.Context, req proto.BrandItemRequest) (rsp *proto.BaseResponse, err error) { | ||||||
|  | 	rsp = new(proto.BaseResponse) | ||||||
|  | 	select { | ||||||
|  | 	case <-ctx.Done(): | ||||||
|  | 		err = fmt.Errorf("超时/取消") | ||||||
|  | 		rsp.Code = http.StatusInternalServerError | ||||||
|  | 		rsp.Status = http.StatusText(http.StatusInternalServerError) | ||||||
|  | 		rsp.Message = "超时/取消" | ||||||
|  | 		rsp.Err = ctx.Err() | ||||||
|  | 		return rsp, ctx.Err() | ||||||
|  | 	default: | ||||||
|  | 		var h bool | ||||||
|  | 		item := new(model.Brand) | ||||||
|  | 		h, err = rp.engine.ID(req.BrandId).Get(item) | ||||||
|  | 		if err != nil { | ||||||
|  | 			goto ReturnPoint | ||||||
|  | 		} | ||||||
|  | 		if !h { | ||||||
|  | 			err = fmt.Errorf("未能找到对应的品牌") | ||||||
|  | 			goto ReturnPoint | ||||||
|  | 		} | ||||||
|  | 		if len(req.BrandName) > 0 { | ||||||
|  | 			item.BrandName = req.BrandName | ||||||
|  | 		} | ||||||
|  | 		if len(req.BrandLogo) > 0 { | ||||||
|  | 			item.BrandLogo = req.BrandLogo | ||||||
|  | 		} | ||||||
|  | 		if len(req.BrandWeb) > 0 { | ||||||
|  | 			item.BrandWeb = req.BrandWeb | ||||||
|  | 		} | ||||||
|  | 		item.UpdateAt = time.Now().Unix() | ||||||
|  | 		_, err = rp.engine.ID(req.BrandId).AllCols().Update(item) | ||||||
|  | 		if err != nil { | ||||||
|  | 			goto ReturnPoint | ||||||
|  | 		} | ||||||
|  | 		rsp.Code = http.StatusOK | ||||||
|  | 		rsp.Status = http.StatusText(http.StatusOK) | ||||||
|  | 		rsp.Message = "修改品牌成功" | ||||||
|  | 		rsp.Err = ctx.Err() | ||||||
|  | 		rsp.Data = item | ||||||
|  | 		return rsp, err | ||||||
|  | 	} | ||||||
|  | ReturnPoint: | ||||||
|  | 	if err != nil { | ||||||
|  | 		rsp.Code = http.StatusInternalServerError | ||||||
|  | 		rsp.Status = http.StatusText(http.StatusInternalServerError) | ||||||
|  | 		rsp.Err = err | ||||||
|  | 		rsp.Message = "失败" | ||||||
|  | 	} | ||||||
|  | 	return rsp, err | ||||||
|  | } | ||||||
|  | func (rp *repo) DeleteBrand(ctx context.Context, req proto.BrandItemRequest) (rsp *proto.BaseResponse, err error) { | ||||||
|  | 	rsp = new(proto.BaseResponse) | ||||||
|  | 	select { | ||||||
|  | 	case <-ctx.Done(): | ||||||
|  | 		err = fmt.Errorf("超时/取消") | ||||||
|  | 		rsp.Code = http.StatusInternalServerError | ||||||
|  | 		rsp.Status = http.StatusText(http.StatusInternalServerError) | ||||||
|  | 		rsp.Message = "超时/取消" | ||||||
|  | 		rsp.Err = ctx.Err() | ||||||
|  | 		return rsp, ctx.Err() | ||||||
|  | 	default: | ||||||
|  | 		var h bool | ||||||
|  | 		item := new(model.Brand) | ||||||
|  | 		h, err = rp.engine.ID(req.BrandId).Get(item) | ||||||
|  | 		if err != nil { | ||||||
|  | 			goto ReturnPoint | ||||||
|  | 		} | ||||||
|  | 		if !h { | ||||||
|  | 			err = fmt.Errorf("未能找到对应的品牌") | ||||||
|  | 			goto ReturnPoint | ||||||
|  | 		} | ||||||
|  | 		item.Status = 0 | ||||||
|  | 		item.UpdateAt = time.Now().Unix() | ||||||
|  | 		_, err = rp.engine.ID(req.BrandId).AllCols().Update(item) | ||||||
|  | 		if err != nil { | ||||||
|  | 			goto ReturnPoint | ||||||
|  | 		} | ||||||
|  | 		rsp.Code = http.StatusOK | ||||||
|  | 		rsp.Status = http.StatusText(http.StatusOK) | ||||||
|  | 		rsp.Message = "删除品牌成功" | ||||||
|  | 		rsp.Err = ctx.Err() | ||||||
|  | 		return rsp, err | ||||||
|  | 	} | ||||||
|  | ReturnPoint: | ||||||
|  | 	if err != nil { | ||||||
|  | 		rsp.Code = http.StatusInternalServerError | ||||||
|  | 		rsp.Status = http.StatusText(http.StatusInternalServerError) | ||||||
|  | 		rsp.Err = err | ||||||
|  | 		rsp.Message = "失败" | ||||||
|  | 	} | ||||||
|  | 	return rsp, err | ||||||
|  | } | ||||||
|  | @ -5,6 +5,7 @@ type Brand struct { | ||||||
| 	BrandName string `xorm:"varchar(200) not null" json:"brandName"` | 	BrandName string `xorm:"varchar(200) not null" json:"brandName"` | ||||||
| 	BrandLogo string `xorm:"varchar(200) " json:"brandLogo"` | 	BrandLogo string `xorm:"varchar(200) " json:"brandLogo"` | ||||||
| 	BrandWeb  string `xorm:"varchar(200) " json:"brandWeb"` | 	BrandWeb  string `xorm:"varchar(200) " json:"brandWeb"` | ||||||
|  | 	Status    int    `xorm:"not null INT(11) default 0" json:"status"` | ||||||
| 	CreateAt  int64  `xorm:"created" json:"createAt"` | 	CreateAt  int64  `xorm:"created" json:"createAt"` | ||||||
| 	UpdateAt  int64  `xorm:"updated" json:"updateAt"` | 	UpdateAt  int64  `xorm:"updated" json:"updateAt"` | ||||||
| 	DeleteAt  int64  `xorm:"deleted" json:"deleteAt"` | 	DeleteAt  int64  `xorm:"deleted" json:"deleteAt"` | ||||||
|  |  | ||||||
|  | @ -13,6 +13,8 @@ type Device struct { | ||||||
| 	ButtPort      int     `xorm:"INT(11) default 0 not null" json:"buttPort"`     //对接端口
 | 	ButtPort      int     `xorm:"INT(11) default 0 not null" json:"buttPort"`     //对接端口
 | ||||||
| 	Longitude     float64 `xorm:"decimal(18,6)" json:"longitude"`                 //经度
 | 	Longitude     float64 `xorm:"decimal(18,6)" json:"longitude"`                 //经度
 | ||||||
| 	Latitude      float64 `xorm:"decimal(18,6)" json:"latitude"`                  //纬度
 | 	Latitude      float64 `xorm:"decimal(18,6)" json:"latitude"`                  //纬度
 | ||||||
|  | 	DeviceDesc    string  `xorm:"varchar(200)" json:"deviceDesc"`                 //设备描述
 | ||||||
|  | 	Status        int     `xorm:"not null INT(11) default 0" json:"status"` | ||||||
| 	CreateAt      int64   `xorm:"created" json:"createAt"` | 	CreateAt      int64   `xorm:"created" json:"createAt"` | ||||||
| 	UpdateAt      int64   `xorm:"updated" json:"updateAt"` | 	UpdateAt      int64   `xorm:"updated" json:"updateAt"` | ||||||
| 	DeleteAt      int64   `xorm:"deleted" json:"deleteAt"` | 	DeleteAt      int64   `xorm:"deleted" json:"deleteAt"` | ||||||
|  |  | ||||||
|  | @ -0,0 +1,13 @@ | ||||||
|  | package model | ||||||
|  | 
 | ||||||
|  | type FileManager struct { | ||||||
|  | 	FileId    int64  `xorm:"not null pk autoincr INT(11)" json:"fileId"` //文件编号
 | ||||||
|  | 	FileName  string `xorm:"VARCHAR(200)" json:"fileName"`               //文件名
 | ||||||
|  | 	AccessUrl string `xorm:"VARCHAR(400)" json:"url"`                    //访问路径
 | ||||||
|  | 	Scene     string `xorm:"VARCHAR(40)" json:"scene"`                   //应用场景,0 : 其他, 1: 道路; 2: 桥梁; 3:隧道; 4: 边坡
 | ||||||
|  | 	FileSize  int64  `xorm:"BIGINT" json:"fileSize"`                     //文件大小
 | ||||||
|  | 	FileMd5   string `xorm:"VARCHAR(64)" json:"fileMd5"`                 //文件MD5
 | ||||||
|  | 	Creator   int64  `xorm:"INT(11) index" json:"creator"`               //上传人
 | ||||||
|  | 	CreateAt  int64  `xorm:"created" json:"createAt"`                    //上传时间
 | ||||||
|  | 	UpdateAt  int64  `xorm:"updated" json:"updateAt"`                    //更新时间
 | ||||||
|  | } | ||||||
|  | @ -27,6 +27,7 @@ func New(driveName, dsn string) { | ||||||
| 		&Device{}, | 		&Device{}, | ||||||
| 		&DeviceType{}, | 		&DeviceType{}, | ||||||
| 		&Disease{}, | 		&Disease{}, | ||||||
|  | 		&FileManager{}, | ||||||
| 		&MatterAttribute{}, | 		&MatterAttribute{}, | ||||||
| 		&MatterCategory{}, | 		&MatterCategory{}, | ||||||
| 		&MatterEvent{}, | 		&MatterEvent{}, | ||||||
|  |  | ||||||
|  | @ -1,6 +1,9 @@ | ||||||
| package model | package model | ||||||
| 
 | 
 | ||||||
| import "fmt" | import ( | ||||||
|  | 	"encoding/json" | ||||||
|  | 	"fmt" | ||||||
|  | ) | ||||||
| 
 | 
 | ||||||
| type SystemUser struct { | type SystemUser struct { | ||||||
| 	UserId   int64  `xorm:"not null pk autoincr INT(11)" json:"userId"` //用户编号
 | 	UserId   int64  `xorm:"not null pk autoincr INT(11)" json:"userId"` //用户编号
 | ||||||
|  | @ -26,3 +29,11 @@ func GetUserById(userId int64) (*SystemUser, error) { | ||||||
| 	} | 	} | ||||||
| 	return us, err | 	return us, err | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | func (us SystemUser) ToString() string { | ||||||
|  | 	data, err := json.Marshal(us) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return "" | ||||||
|  | 	} | ||||||
|  | 	return string(data) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | @ -0,0 +1,11 @@ | ||||||
|  | package minedata | ||||||
|  | 
 | ||||||
|  | const ( | ||||||
|  | 	GeocodingUrl        = "https://service.minedata.cn/service/lbs/search/v1/geo"    //地理编码
 | ||||||
|  | 	ReverseGeocodingUrl = "https://service.minedata.cn/service/lbs/reverse/v1/regeo" //逆地理编码
 | ||||||
|  | 
 | ||||||
|  | 	MilepostUrl        = "https://service.minedata.cn/service/lbs/kpiles/v1/keywords" // 正里程桩服务
 | ||||||
|  | 	ReverseMilepostUrl = "https://service.minedata.cn/service/lbs/kpiles/v1/location" // 逆里程桩服务
 | ||||||
|  | 
 | ||||||
|  | 	RoadSearchUrl = "https://service.minedata.cn/service/lbs/search/v1/road" // 道路搜索
 | ||||||
|  | ) | ||||||
|  | @ -0,0 +1,40 @@ | ||||||
|  | package minedata | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"fmt" | ||||||
|  | 	"io" | ||||||
|  | 	"net/http" | ||||||
|  | 	"net/url" | ||||||
|  | 	"strings" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | func HttpDo(reqUrl, method string, params map[string]string, header map[string]string) (data []byte, err error) { | ||||||
|  | 	var paramStr = "" | ||||||
|  | 	for k, v := range params { | ||||||
|  | 		if len(paramStr) == 0 { | ||||||
|  | 			paramStr = fmt.Sprintf("%s=%s", k, url.QueryEscape(v)) | ||||||
|  | 		} else { | ||||||
|  | 			paramStr = fmt.Sprintf("%s&%s=%s", paramStr, k, url.QueryEscape(v)) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	client := &http.Client{} | ||||||
|  | 	req, err := http.NewRequest(strings.ToUpper(method), reqUrl, strings.NewReader(paramStr)) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	req.Header.Set("content-type", "X-WWW-FORM-URLENCODED") | ||||||
|  | 	for k, v := range header { | ||||||
|  | 		req.Header.Set(k, v) | ||||||
|  | 	} | ||||||
|  | 	resp, err := client.Do(req) | ||||||
|  | 
 | ||||||
|  | 	defer func() { | ||||||
|  | 		_ = resp.Body.Close() | ||||||
|  | 	}() | ||||||
|  | 
 | ||||||
|  | 	body, err := io.ReadAll(resp.Body) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	return body, nil | ||||||
|  | } | ||||||
|  | @ -0,0 +1,95 @@ | ||||||
|  | package minedata | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"encoding/json" | ||||||
|  | 	"fmt" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type MineDateClient struct { | ||||||
|  | 	AppKey string | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func NewMineData(key string) *MineDateClient { | ||||||
|  | 	return &MineDateClient{ | ||||||
|  | 		AppKey: key, //默认 f0bda738033e47ffbfbd5d3f865c19e1
 | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // ReverseGeocoding 逆地理
 | ||||||
|  | func (client *MineDateClient) ReverseGeocoding(lng, lat float64) (data *ReverseGeocodingResponse, err error) { | ||||||
|  | 	params := make(map[string]string) | ||||||
|  | 	params["location"] = fmt.Sprintf("%.6f, %.6f", lng, lat) | ||||||
|  | 	params["type"] = "道路" | ||||||
|  | 	params["coordtype"] = "02" | ||||||
|  | 	params["radius"] = "100" | ||||||
|  | 	params["extensions"] = "road" | ||||||
|  | 	params["key"] = client.AppKey | ||||||
|  | 	res, err := HttpDo(ReverseGeocodingUrl, "GET", params, make(map[string]string)) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	data = new(ReverseGeocodingResponse) | ||||||
|  | 	err = json.Unmarshal(res, data) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	return data, err | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // MilepostService 正里程桩服务
 | ||||||
|  | func (client *MineDateClient) MilepostService(formatName string) (data *MilepostResponse, err error) { | ||||||
|  | 	params := make(map[string]string) | ||||||
|  | 	params["key"] = client.AppKey | ||||||
|  | 	params["format_name"] = formatName | ||||||
|  | 	res, err := HttpDo(MilepostUrl, "GET", params, make(map[string]string)) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	data = new(MilepostResponse) | ||||||
|  | 	fmt.Println(string(res)) | ||||||
|  | 	err = json.Unmarshal(res, data) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	return data, err | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // ReverseMilepost 逆里程桩
 | ||||||
|  | func (client *MineDateClient) ReverseMilepost(lng, lat float64) (data *ReverseMilepostResponse, err error) { | ||||||
|  | 	params := make(map[string]string) | ||||||
|  | 	params["key"] = client.AppKey | ||||||
|  | 	params["location"] = fmt.Sprintf("%.6f, %.6f", lng, lat) | ||||||
|  | 	res, err := HttpDo(ReverseMilepostUrl, "GET", params, make(map[string]string)) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	data = new(ReverseMilepostResponse) | ||||||
|  | 	fmt.Println(string(res)) | ||||||
|  | 	err = json.Unmarshal(res, data) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	return data, err | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // RoadSearch 道路搜索
 | ||||||
|  | func (client *MineDateClient) RoadSearch(keywords string) (data *RoadSearchResponse, err error) { | ||||||
|  | 	params := make(map[string]string) | ||||||
|  | 	params["key"] = client.AppKey | ||||||
|  | 	params["keywords"] = keywords | ||||||
|  | 	params["city"] = "330000" | ||||||
|  | 	params["page_idx"] = "1" | ||||||
|  | 	params["page_size"] = "20" | ||||||
|  | 	params["extensions"] = "all" | ||||||
|  | 	params["citylimit"] = "true" | ||||||
|  | 	res, err := HttpDo(RoadSearchUrl, "GET", params, make(map[string]string)) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	data = new(RoadSearchResponse) | ||||||
|  | 	err = json.Unmarshal(res, data) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	return data, err | ||||||
|  | } | ||||||
|  | @ -0,0 +1,22 @@ | ||||||
|  | package minedata | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"fmt" | ||||||
|  | 	"testing" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | func TestMineDataService(t *testing.T) { | ||||||
|  | 	mine := NewMineData("f0bda738033e47ffbfbd5d3f865c19e1") | ||||||
|  | 	//正里程桩
 | ||||||
|  | 	res, err := mine.MilepostService("G60+K800+600") | ||||||
|  | 	if err != nil { | ||||||
|  | 		fmt.Println(err) | ||||||
|  | 	} | ||||||
|  | 	fmt.Println(ToString(res)) | ||||||
|  | 	//逆里程桩
 | ||||||
|  | 	res1, err := mine.ReverseMilepost(119.736232, 29.785655) | ||||||
|  | 	if err != nil { | ||||||
|  | 		fmt.Println(err) | ||||||
|  | 	} | ||||||
|  | 	fmt.Println(ToString(res1)) | ||||||
|  | } | ||||||
|  | @ -0,0 +1,101 @@ | ||||||
|  | package minedata | ||||||
|  | 
 | ||||||
|  | import "encoding/json" | ||||||
|  | 
 | ||||||
|  | type MilepostResponse struct { | ||||||
|  | 	Status  int    `json:"status"` | ||||||
|  | 	Message string `json:"message"` | ||||||
|  | 	Count   int    `json:"count"` | ||||||
|  | 	Items   []struct { | ||||||
|  | 		Roadname   string `json:"roadname"` | ||||||
|  | 		Roadid     string `json:"roadid"` | ||||||
|  | 		Roadtype   string `json:"roadtype"` | ||||||
|  | 		Kpileid    string `json:"kpileid"` | ||||||
|  | 		Direction  string `json:"direction"` | ||||||
|  | 		Location   string `json:"location"` | ||||||
|  | 		Offset     int    `json:"offset"` | ||||||
|  | 		Adcode     string `json:"adcode"` | ||||||
|  | 		Province   string `json:"province"` | ||||||
|  | 		City       string `json:"city"` | ||||||
|  | 		Area       string `json:"area"` | ||||||
|  | 		FormatName string `json:"format_name"` | ||||||
|  | 	} `json:"items"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type RoadSearchResponse struct { | ||||||
|  | 	Suggestion interface{} `json:"suggestion"` | ||||||
|  | 	Count      int         `json:"count"` | ||||||
|  | 	Pois       []struct { | ||||||
|  | 		Alias     interface{} `json:"alias"` | ||||||
|  | 		Brandcode string      `json:"brandcode"` | ||||||
|  | 		Brand     string      `json:"brand"` | ||||||
|  | 		Tag       string      `json:"tag"` | ||||||
|  | 		Hit       int         `json:"hit"` | ||||||
|  | 		Tel       string      `json:"tel"` | ||||||
|  | 		Region    struct { | ||||||
|  | 			Adcode   string      `json:"adcode"` | ||||||
|  | 			Province string      `json:"province"` | ||||||
|  | 			City     string      `json:"city"` | ||||||
|  | 			County   string      `json:"county"` | ||||||
|  | 			Town     interface{} `json:"town"` | ||||||
|  | 		} `json:"region"` | ||||||
|  | 		Subpois  interface{} `json:"subpois"` | ||||||
|  | 		Nid      string      `json:"nid"` | ||||||
|  | 		Name     string      `json:"name"` | ||||||
|  | 		Typecode string      `json:"typecode"` | ||||||
|  | 		Type     string      `json:"type"` | ||||||
|  | 		Location string      `json:"location"` | ||||||
|  | 		Address  string      `json:"address"` | ||||||
|  | 		Distance interface{} `json:"distance"` | ||||||
|  | 	} `json:"pois"` | ||||||
|  | 	Status  int    `json:"status"` | ||||||
|  | 	Message string `json:"message"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type ReverseMilepostResponse struct { | ||||||
|  | 	Status  int    `json:"status"` | ||||||
|  | 	Message string `json:"message"` | ||||||
|  | 	Count   int    `json:"count"` | ||||||
|  | 	Items   []struct { | ||||||
|  | 		Roadname   string `json:"roadname"` | ||||||
|  | 		Roadid     string `json:"roadid"` | ||||||
|  | 		Roadtype   string `json:"roadtype"` | ||||||
|  | 		Direction  string `json:"direction"` | ||||||
|  | 		Kpileid    string `json:"kpileid"` | ||||||
|  | 		Location   string `json:"location"` | ||||||
|  | 		Adcode     string `json:"adcode"` | ||||||
|  | 		Province   string `json:"province"` | ||||||
|  | 		City       string `json:"city"` | ||||||
|  | 		Area       string `json:"area"` | ||||||
|  | 		Offset     int    `json:"offset"` | ||||||
|  | 		FormatName string `json:"format_name"` | ||||||
|  | 	} `json:"items"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type ReverseGeocodingResponse struct { | ||||||
|  | 	Status  int    `json:"status"` | ||||||
|  | 	Message string `json:"message"` | ||||||
|  | 	Count   int    `json:"count"` | ||||||
|  | 	Items   []struct { | ||||||
|  | 		Roadname   string `json:"roadname"` | ||||||
|  | 		Roadid     string `json:"roadid"` | ||||||
|  | 		Roadtype   string `json:"roadtype"` | ||||||
|  | 		Direction  string `json:"direction"` | ||||||
|  | 		Kpileid    string `json:"kpileid"` | ||||||
|  | 		Location   string `json:"location"` | ||||||
|  | 		Adcode     string `json:"adcode"` | ||||||
|  | 		Province   string `json:"province"` | ||||||
|  | 		City       string `json:"city"` | ||||||
|  | 		Area       string `json:"area"` | ||||||
|  | 		Offset     int    `json:"offset"` | ||||||
|  | 		FormatName string `json:"format_name"` | ||||||
|  | 	} `json:"items"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func ToString(data interface{}) string { | ||||||
|  | 	b, err := json.Marshal(data) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return "" | ||||||
|  | 	} | ||||||
|  | 	return string(b) | ||||||
|  | } | ||||||
		Loading…
	
		Reference in New Issue