项目初始化
This commit is contained in:
		
						commit
						71b21f8a7a
					
				|  | @ -0,0 +1,134 @@ | ||||||
|  | package cmd | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"context" | ||||||
|  | 	"fmt" | ||||||
|  | 	"github.com/spf13/cobra" | ||||||
|  | 	"go.uber.org/zap" | ||||||
|  | 	"hpds-iot-web/config" | ||||||
|  | 	router2 "hpds-iot-web/internal/router" | ||||||
|  | 	"hpds-iot-web/model" | ||||||
|  | 	discover "hpds-iot-web/pkg/discover/consul" | ||||||
|  | 	"net/http" | ||||||
|  | 	"os" | ||||||
|  | 	"os/signal" | ||||||
|  | 	"syscall" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | var ( | ||||||
|  | 	//consulConfigs  chan *discover.ConsulConfig
 | ||||||
|  | 	ConfigFileFlag string = "./config/config.yaml" | ||||||
|  | 	ConsulAddress  string = "http://localhost:8500" | ||||||
|  | 	NodeName       string = "main-node" | ||||||
|  | 	Mode           string = "dev" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | func must(err error) { | ||||||
|  | 	if err != nil { | ||||||
|  | 		fmt.Fprint(os.Stderr, err) | ||||||
|  | 		os.Exit(1) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func NewStartCmd() *cobra.Command { | ||||||
|  | 	cmd := &cobra.Command{ | ||||||
|  | 		Use:   "start", | ||||||
|  | 		Short: "Start hpds_web application", | ||||||
|  | 		Run: func(cmd *cobra.Command, args []string) { | ||||||
|  | 			var ( | ||||||
|  | 				cfg *config.WebConfig | ||||||
|  | 				err error | ||||||
|  | 			) | ||||||
|  | 			ctx, cancel := context.WithCancel(context.Background()) | ||||||
|  | 			defer cancel() | ||||||
|  | 			must(err) | ||||||
|  | 			configFileFlag, err := cmd.Flags().GetString("c") | ||||||
|  | 			if err != nil { | ||||||
|  | 				fmt.Println("get local config err: ", err) | ||||||
|  | 				return | ||||||
|  | 			} | ||||||
|  | 			ConsulAddress, err = cmd.Flags().GetString("r") | ||||||
|  | 			if err != nil { | ||||||
|  | 				fmt.Println("get remote config err: ", err) | ||||||
|  | 				return | ||||||
|  | 			} | ||||||
|  | 			NodeName, err = cmd.Flags().GetString("n") | ||||||
|  | 			if err != nil { | ||||||
|  | 				fmt.Println("get remote path config err: ", err) | ||||||
|  | 				return | ||||||
|  | 			} | ||||||
|  | 			Mode, err = cmd.Flags().GetString("m") | ||||||
|  | 			if err != nil { | ||||||
|  | 				fmt.Println("get remote path config err: ", err) | ||||||
|  | 				return | ||||||
|  | 			} | ||||||
|  | 			if len(configFileFlag) > 1 { | ||||||
|  | 				cfg, err = config.ParseConfigByFile(configFileFlag) | ||||||
|  | 				must(err) | ||||||
|  | 				err = config.UpdateRemoteConfig(cfg) | ||||||
|  | 				must(err) | ||||||
|  | 				ConfigFileFlag = configFileFlag | ||||||
|  | 			} else { | ||||||
|  | 				//获取consul注册中心的配置文件
 | ||||||
|  | 				cfg, err = config.GetRemoteConfig(ConsulAddress, fmt.Sprintf("hpds-pavement/hpds_web/%s/%s", Mode, NodeName)) | ||||||
|  | 				must(err) | ||||||
|  | 				err = config.UpdateLocalConfig(cfg, ConfigFileFlag) | ||||||
|  | 			} | ||||||
|  | 			//创建注册对象
 | ||||||
|  | 			tags := make([]string, 1) | ||||||
|  | 			tags[0] = "web" | ||||||
|  | 			consulCfg, err := discover.NewConsulConfig(cfg.Consul.Host, cfg.Name, cfg.Name, cfg.Consul.Host, cfg.Consul.Port, | ||||||
|  | 				tags, 300, 300, 300) | ||||||
|  | 			must(err) | ||||||
|  | 
 | ||||||
|  | 			//连接数据库
 | ||||||
|  | 			model.New(cfg.Db.DriveName, cfg.Db.Conn) | ||||||
|  | 			//连接redis
 | ||||||
|  | 			model.NewCache(cfg.Cache) | ||||||
|  | 
 | ||||||
|  | 			// 退出channel
 | ||||||
|  | 			exitChannel := make(chan os.Signal) | ||||||
|  | 			defer close(exitChannel) | ||||||
|  | 
 | ||||||
|  | 			// 退出信号监听
 | ||||||
|  | 			go func(c chan os.Signal) { | ||||||
|  | 				consulCfg.ServiceDeregister() | ||||||
|  | 				signal.Notify(c, syscall.SIGINT, syscall.SIGTERM) | ||||||
|  | 			}(exitChannel) | ||||||
|  | 			router := router2.InitRouter(zap.L(), model.DB) | ||||||
|  | 			// start http service
 | ||||||
|  | 			go func() { | ||||||
|  | 				fmt.Printf("Http Server start at port %d \n", cfg.Port) | ||||||
|  | 				//启动前执行注册
 | ||||||
|  | 				err = consulCfg.ServiceRegister() | ||||||
|  | 				must(err) | ||||||
|  | 				err = http.ListenAndServe(fmt.Sprintf("%s:%d", cfg.Host, cfg.Port), router) | ||||||
|  | 				must(err) | ||||||
|  | 			}() | ||||||
|  | 			//服务退出取消注册
 | ||||||
|  | 			//err = consulCfg.ServiceDeregister()
 | ||||||
|  | 			//
 | ||||||
|  | 			//must(err)
 | ||||||
|  | 			//zap.L().Error("发生错误", zap.Error(err))
 | ||||||
|  | 			select { | ||||||
|  | 			case <-ctx.Done(): | ||||||
|  | 				consulCfg.ServiceDeregister() | ||||||
|  | 				zap.L().With( | ||||||
|  | 					zap.String("web", "exit"), | ||||||
|  | 				).Error(ctx.Err().Error()) | ||||||
|  | 				return | ||||||
|  | 			case errs := <-exitChannel: | ||||||
|  | 				consulCfg.ServiceDeregister() | ||||||
|  | 				zap.L().With( | ||||||
|  | 					zap.String("web", "exit"), | ||||||
|  | 				).Error(errs.String()) | ||||||
|  | 				return | ||||||
|  | 			} | ||||||
|  | 		}, | ||||||
|  | 	} | ||||||
|  | 	cmd.Flags().StringVar(&ConfigFileFlag, "c", "./config/config.yaml", "The configuration file path") | ||||||
|  | 	cmd.Flags().StringVar(&ConsulAddress, "r", "http://consul.hpds.cc", "The configuration remote consul address") | ||||||
|  | 	cmd.Flags().StringVar(&NodeName, "n", "main-node", "The configuration name") | ||||||
|  | 	cmd.Flags().StringVar(&Mode, "m", "dev", "run mode : dev | test | releases") | ||||||
|  | 	return cmd | ||||||
|  | } | ||||||
|  | @ -0,0 +1,98 @@ | ||||||
|  | package config | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"bytes" | ||||||
|  | 	"fmt" | ||||||
|  | 	"github.com/spf13/viper" | ||||||
|  | 	"os" | ||||||
|  | 
 | ||||||
|  | 	consulapi "github.com/hashicorp/consul/api" | ||||||
|  | 	_ "github.com/spf13/viper/remote" | ||||||
|  | 	"gopkg.in/yaml.v3" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type WebConfig struct { | ||||||
|  | 	Name   string       `yaml:"name,omitempty"` | ||||||
|  | 	Host   string       `yaml:"host,omitempty"` | ||||||
|  | 	Port   int          `yaml:"port,omitempty"` | ||||||
|  | 	Mode   string       `yaml:"mode,omitempty"` | ||||||
|  | 	Consul ConsulConfig `yaml:"consul,omitempty"` | ||||||
|  | 	Db     DbConfig     `yaml:"db"` | ||||||
|  | 	Cache  CacheConfig  `yaml:"cache"` | ||||||
|  | } | ||||||
|  | type ConsulConfig struct { | ||||||
|  | 	Host       string   `yaml:"host,omitempty"` | ||||||
|  | 	Port       int      `yaml:"port,omitempty"` | ||||||
|  | 	Interval   int      `yaml:"interval,omitempty"` | ||||||
|  | 	Timeout    int      `yaml:"timeout,omitempty"` | ||||||
|  | 	Deregister int      `yaml:"deregister,omitempty"` | ||||||
|  | 	Tags       []string `yaml:"tags,omitempty"` | ||||||
|  | } | ||||||
|  | type DbConfig struct { | ||||||
|  | 	Conn      string `yaml:"conn"` | ||||||
|  | 	DriveName string `yaml:"drive_name"` | ||||||
|  | } | ||||||
|  | type CacheConfig struct { | ||||||
|  | 	Host     string `yaml:"host,omitempty"` | ||||||
|  | 	Port     int    `yaml:"port,omitempty"` | ||||||
|  | 	Pass     string `yaml:"pass,omitempty"` | ||||||
|  | 	DB       int    `yaml:"db,omitempty"` | ||||||
|  | 	PoolSize int    `yaml:"pool_size,omitempty"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func ParseConfigByFile(path string) (cfg *WebConfig, err error) { | ||||||
|  | 	buffer, err := os.ReadFile(path) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	return load(buffer) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func load(buf []byte) (cfg *WebConfig, err error) { | ||||||
|  | 	cViper := viper.New() | ||||||
|  | 	cViper.SetConfigType("yaml") | ||||||
|  | 	cfg = new(WebConfig) | ||||||
|  | 	cViper.ReadConfig(bytes.NewBuffer(buf)) | ||||||
|  | 	err = cViper.Unmarshal(cfg) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func UpdateLocalConfig(cfg *WebConfig, fn string) error { | ||||||
|  | 	data, err := yaml.Marshal(cfg) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	err = os.WriteFile(fn, data, 0600) | ||||||
|  | 	return err | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func UpdateRemoteConfig(cfg *WebConfig) error { | ||||||
|  | 	consulClient, err := consulapi.NewClient(&consulapi.Config{Address: fmt.Sprintf("%s:%d", cfg.Consul.Host, cfg.Consul.Port)}) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	val, err := yaml.Marshal(cfg) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	p := &consulapi.KVPair{Key: fmt.Sprintf("hpds-pavement/hpds_web/%s/%s", cfg.Mode, cfg.Name), Value: val} | ||||||
|  | 	if _, err = consulClient.KV().Put(p, nil); err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func GetRemoteConfig(remoteAddr, path string) (cfg *WebConfig, err error) { | ||||||
|  | 	consulClient, err := consulapi.NewClient(&consulapi.Config{Address: remoteAddr}) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	kv, _, err := consulClient.KV().Get(path, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	return load(kv.Value) | ||||||
|  | } | ||||||
|  | @ -0,0 +1,20 @@ | ||||||
|  | name: web | ||||||
|  | host: 0.0.0.0 | ||||||
|  | port: 8088 | ||||||
|  | mode: dev | ||||||
|  | consul: | ||||||
|  |   host: http://consul.hpds.cc | ||||||
|  |   port: 80 | ||||||
|  |   interval: 300 | ||||||
|  |   timeout: 5 | ||||||
|  |   deregister: 1 | ||||||
|  | db: | ||||||
|  |   conn: root:123456@tcp(127.0.0.1:3306)/hpds_jky?charset=utf8mb4 | ||||||
|  |   drive_name: mysql | ||||||
|  | cache: | ||||||
|  |   host: 127.0.0.1 | ||||||
|  |   port: 6379 | ||||||
|  |   db: 0 | ||||||
|  |   pool_size: 10 | ||||||
|  | functions: | ||||||
|  |   - name: web-sf | ||||||
|  | @ -0,0 +1,95 @@ | ||||||
|  | module hpds-iot-web | ||||||
|  | 
 | ||||||
|  | go 1.19 | ||||||
|  | 
 | ||||||
|  | require ( | ||||||
|  | 	git.hpds.cc/Component/gin_valid v0.0.0-20230104142509-f956bce255b6 | ||||||
|  | 	github.com/dgrijalva/jwt-go v3.2.0+incompatible | ||||||
|  | 	github.com/gin-contrib/zap v0.1.0 | ||||||
|  | 	github.com/gin-gonic/gin v1.8.2 | ||||||
|  | 	github.com/go-redis/redis v6.15.9+incompatible | ||||||
|  | 	github.com/go-sql-driver/mysql v1.6.0 | ||||||
|  | 	github.com/goccy/go-json v0.9.11 | ||||||
|  | 	github.com/hashicorp/consul/api v1.15.3 | ||||||
|  | 	github.com/spf13/cobra v0.0.3 | ||||||
|  | 	github.com/spf13/viper v1.14.0 | ||||||
|  | 	go.uber.org/zap v1.24.0 | ||||||
|  | 	gopkg.in/yaml.v3 v3.0.1 | ||||||
|  | 	xorm.io/xorm v1.3.2 | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | require ( | ||||||
|  | 	cloud.google.com/go v0.104.0 // indirect | ||||||
|  | 	cloud.google.com/go/compute v1.12.1 // indirect | ||||||
|  | 	cloud.google.com/go/compute/metadata v0.2.1 // indirect | ||||||
|  | 	cloud.google.com/go/firestore v1.8.0 // indirect | ||||||
|  | 	github.com/armon/go-metrics v0.4.0 // indirect | ||||||
|  | 	github.com/coreos/go-semver v0.3.0 // indirect | ||||||
|  | 	github.com/coreos/go-systemd/v22 v22.3.2 // indirect | ||||||
|  | 	github.com/fatih/color v1.13.0 // indirect | ||||||
|  | 	github.com/fsnotify/fsnotify v1.6.0 // indirect | ||||||
|  | 	github.com/gin-contrib/sse v0.1.0 // indirect | ||||||
|  | 	github.com/go-playground/locales v0.14.0 // indirect | ||||||
|  | 	github.com/go-playground/universal-translator v0.18.0 // indirect | ||||||
|  | 	github.com/go-playground/validator/v10 v10.11.1 // indirect | ||||||
|  | 	github.com/gogo/protobuf v1.3.2 // indirect | ||||||
|  | 	github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect | ||||||
|  | 	github.com/golang/protobuf v1.5.2 // indirect | ||||||
|  | 	github.com/golang/snappy v0.0.4 // indirect | ||||||
|  | 	github.com/google/go-cmp v0.5.9 // indirect | ||||||
|  | 	github.com/googleapis/enterprise-certificate-proxy v0.2.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-hclog v1.2.0 // indirect | ||||||
|  | 	github.com/hashicorp/go-immutable-radix v1.3.1 // indirect | ||||||
|  | 	github.com/hashicorp/go-rootcerts v1.0.2 // indirect | ||||||
|  | 	github.com/hashicorp/golang-lru v0.5.4 // indirect | ||||||
|  | 	github.com/hashicorp/hcl v1.0.0 // indirect | ||||||
|  | 	github.com/hashicorp/serf v0.9.8 // indirect | ||||||
|  | 	github.com/inconshreveable/mousetrap v1.0.0 // indirect | ||||||
|  | 	github.com/json-iterator/go v1.1.12 // indirect | ||||||
|  | 	github.com/leodido/go-urn v1.2.1 // indirect | ||||||
|  | 	github.com/magiconair/properties v1.8.6 // indirect | ||||||
|  | 	github.com/mattn/go-colorable v0.1.12 // indirect | ||||||
|  | 	github.com/mattn/go-isatty v0.0.16 // indirect | ||||||
|  | 	github.com/mitchellh/go-homedir v1.1.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/reflect2 v1.0.2 // indirect | ||||||
|  | 	github.com/pelletier/go-toml v1.9.5 // indirect | ||||||
|  | 	github.com/pelletier/go-toml/v2 v2.0.6 // indirect | ||||||
|  | 	github.com/pkg/errors v0.9.1 // indirect | ||||||
|  | 	github.com/sagikazarmark/crypt v0.8.0 // indirect | ||||||
|  | 	github.com/spf13/afero v1.9.2 // indirect | ||||||
|  | 	github.com/spf13/cast v1.5.0 // indirect | ||||||
|  | 	github.com/spf13/jwalterweatherman v1.1.0 // indirect | ||||||
|  | 	github.com/spf13/pflag v1.0.5 // indirect | ||||||
|  | 	github.com/subosito/gotenv v1.4.1 // indirect | ||||||
|  | 	github.com/syndtr/goleveldb v1.0.0 // indirect | ||||||
|  | 	github.com/ugorji/go/codec v1.2.7 // indirect | ||||||
|  | 	go.etcd.io/etcd/api/v3 v3.5.5 // indirect | ||||||
|  | 	go.etcd.io/etcd/client/pkg/v3 v3.5.5 // indirect | ||||||
|  | 	go.etcd.io/etcd/client/v2 v2.305.5 // indirect | ||||||
|  | 	go.etcd.io/etcd/client/v3 v3.5.5 // indirect | ||||||
|  | 	go.opencensus.io v0.23.0 // indirect | ||||||
|  | 	go.opentelemetry.io/otel v1.10.0 // indirect | ||||||
|  | 	go.opentelemetry.io/otel/trace v1.10.0 // indirect | ||||||
|  | 	go.uber.org/atomic v1.9.0 // indirect | ||||||
|  | 	go.uber.org/multierr v1.8.0 // indirect | ||||||
|  | 	golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e // indirect | ||||||
|  | 	golang.org/x/net v0.4.0 // indirect | ||||||
|  | 	golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783 // indirect | ||||||
|  | 	golang.org/x/sync v0.1.0 // indirect | ||||||
|  | 	golang.org/x/sys v0.3.0 // indirect | ||||||
|  | 	golang.org/x/text v0.5.0 // indirect | ||||||
|  | 	golang.org/x/time v0.0.0-20220609170525-579cf78fd858 // indirect | ||||||
|  | 	golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect | ||||||
|  | 	google.golang.org/api v0.102.0 // indirect | ||||||
|  | 	google.golang.org/appengine v1.6.7 // indirect | ||||||
|  | 	google.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e // indirect | ||||||
|  | 	google.golang.org/grpc v1.50.1 // indirect | ||||||
|  | 	google.golang.org/protobuf v1.28.1 // indirect | ||||||
|  | 	gopkg.in/ini.v1 v1.67.0 // indirect | ||||||
|  | 	gopkg.in/yaml.v2 v2.4.0 // indirect | ||||||
|  | 	xorm.io/builder v0.3.11-0.20220531020008-1bd24a7dc978 // indirect | ||||||
|  | ) | ||||||
|  | @ -0,0 +1,45 @@ | ||||||
|  | package handler | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"github.com/gin-gonic/gin" | ||||||
|  | 	"go.uber.org/zap" | ||||||
|  | 	"hpds-iot-web/model" | ||||||
|  | 	"time" | ||||||
|  | 	"xorm.io/xorm" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type HandlerService struct { | ||||||
|  | 	Engine *xorm.Engine | ||||||
|  | 	Logger *zap.Logger | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func NewHandlerService(engine *xorm.Engine, logger *zap.Logger) *HandlerService { | ||||||
|  | 	return &HandlerService{ | ||||||
|  | 		Engine: engine, | ||||||
|  | 		Logger: logger, | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (s HandlerService) Health(c *gin.Context) (data interface{}, err error) { | ||||||
|  | 	return time.Now().Unix(), nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (s HandlerService) SaveLog(action, category, targetId, oldValue, newValue, operatorId, operatorAddr, operatorDevice string) { | ||||||
|  | 	operationLog := &model.OperationLog{ | ||||||
|  | 		Action:        action, | ||||||
|  | 		Category:      category, | ||||||
|  | 		TargetId:      targetId, | ||||||
|  | 		OldValue:      oldValue, | ||||||
|  | 		NewValue:      newValue, | ||||||
|  | 		Operator:      operatorId, | ||||||
|  | 		OperateAddr:   operatorAddr, | ||||||
|  | 		OperateDevice: operatorDevice, | ||||||
|  | 	} | ||||||
|  | 	_, err := s.Engine.Insert(operationLog) | ||||||
|  | 	if err != nil { | ||||||
|  | 		s.Logger.With(zap.Namespace("DAO"), | ||||||
|  | 			zap.String("method", "SaveLog"), | ||||||
|  | 			zap.Any("operationLog", operationLog), | ||||||
|  | 		).Error(err.Error()) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -0,0 +1,481 @@ | ||||||
|  | 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) OwnerList(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.OwnerRequest | ||||||
|  | 	err = c.ShouldBindJSON(&req) | ||||||
|  | 	if err != nil { | ||||||
|  | 		go s.SaveLog("OwnerList", "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.OwnerList(c, req) | ||||||
|  | 	go s.SaveLog("获取业主列表", "Manage", "", "", "", fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (s HandlerService) AddOwner(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.OwnerItemReq | ||||||
|  | 	err = c.ShouldBindJSON(&req) | ||||||
|  | 	if err != nil { | ||||||
|  | 		go s.SaveLog("AddOwner", "Manage", "", "", req.ToString(), fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 		return nil, e.NewValidErr(err) | ||||||
|  | 	} | ||||||
|  | 	req.Creator = userInfo.UserId | ||||||
|  | 	data, err = repo.AddOwner(c, req) | ||||||
|  | 	go s.SaveLog("新增业主", "Manage", "", "", "", fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (s HandlerService) EditOwner(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.OwnerItemReq | ||||||
|  | 	err = c.ShouldBindJSON(&req) | ||||||
|  | 	if err != nil { | ||||||
|  | 		go s.SaveLog("EditOwner", "Manage", "", "", req.ToString(), fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 		return nil, e.NewValidErr(err) | ||||||
|  | 	} | ||||||
|  | 	req.Creator = userInfo.UserId | ||||||
|  | 	data, err = repo.EditOwner(c, req) | ||||||
|  | 	go s.SaveLog("修改业主", "Manage", "", "", "", fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (s HandlerService) DelOwner(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.OwnerItemReq | ||||||
|  | 	err = c.ShouldBindJSON(&req) | ||||||
|  | 	if err != nil { | ||||||
|  | 		go s.SaveLog("DelOwner", "Manage", "", "", req.ToString(), fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 		return nil, e.NewValidErr(err) | ||||||
|  | 	} | ||||||
|  | 	req.Creator = userInfo.UserId | ||||||
|  | 	data, err = repo.DelOwner(c, req) | ||||||
|  | 	go s.SaveLog("删除业主", "Manage", "", "", "", fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (s HandlerService) ProjectList(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.ProjectRequest | ||||||
|  | 	err = c.ShouldBindJSON(&req) | ||||||
|  | 	if err != nil { | ||||||
|  | 		go s.SaveLog("ProjectList", "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.ProjectList(c, req) | ||||||
|  | 	go s.SaveLog("获取项目列表", "Manage", "", "", "", fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (s HandlerService) AddProject(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.ProjectItemRequest | ||||||
|  | 	err = c.ShouldBindJSON(&req) | ||||||
|  | 	if err != nil { | ||||||
|  | 		go s.SaveLog("AddProject", "Manage", "", "", req.ToString(), fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 		return nil, e.NewValidErr(err) | ||||||
|  | 	} | ||||||
|  | 	req.Creator = userInfo.UserId | ||||||
|  | 	data, err = repo.AddProject(c, req) | ||||||
|  | 	go s.SaveLog("新增项目", "Manage", "", "", "", fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (s HandlerService) EditProject(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.ProjectItemRequest | ||||||
|  | 	err = c.ShouldBindJSON(&req) | ||||||
|  | 	if err != nil { | ||||||
|  | 		go s.SaveLog("EditProject", "Manage", "", "", req.ToString(), fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 		return nil, e.NewValidErr(err) | ||||||
|  | 	} | ||||||
|  | 	req.Creator = userInfo.UserId | ||||||
|  | 	data, err = repo.EditProject(c, req) | ||||||
|  | 	go s.SaveLog("修改项目", "Manage", "", "", "", fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | func (s HandlerService) DelProject(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.ProjectItemRequest | ||||||
|  | 	err = c.ShouldBindJSON(&req) | ||||||
|  | 	if err != nil { | ||||||
|  | 		go s.SaveLog("DelProject", "Manage", "", "", req.ToString(), fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 		return nil, e.NewValidErr(err) | ||||||
|  | 	} | ||||||
|  | 	req.Creator = userInfo.UserId | ||||||
|  | 	data, err = repo.DelProject(c, req) | ||||||
|  | 	go s.SaveLog("删除项目", "Manage", "", "", "", fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (s HandlerService) ProductList(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.ProductRequest | ||||||
|  | 	err = c.ShouldBindJSON(&req) | ||||||
|  | 	if err != nil { | ||||||
|  | 		go s.SaveLog("ProductList", "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.ProductList(c, req) | ||||||
|  | 	go s.SaveLog("产品(物模型)列表", "Manage", "", "", "", fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | func (s HandlerService) AddProduct(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.ProductItemRequest | ||||||
|  | 	err = c.ShouldBindJSON(&req) | ||||||
|  | 	if err != nil { | ||||||
|  | 		go s.SaveLog("AddProduct", "Manage", "", "", req.ToString(), fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 		return nil, e.NewValidErr(err) | ||||||
|  | 	} | ||||||
|  | 	data, err = repo.AddProduct(c, req) | ||||||
|  | 	go s.SaveLog("新增产品(物模型)", "Manage", "", "", "", fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | func (s HandlerService) EditProduct(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.ProductItemRequest | ||||||
|  | 	err = c.ShouldBindJSON(&req) | ||||||
|  | 	if err != nil { | ||||||
|  | 		go s.SaveLog("EditProduct", "Manage", "", "", req.ToString(), fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 		return nil, e.NewValidErr(err) | ||||||
|  | 	} | ||||||
|  | 	data, err = repo.EditProduct(c, req) | ||||||
|  | 	go s.SaveLog("修改产品(物模型)", "Manage", "", "", "", fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | func (s HandlerService) DelProduct(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.ProductItemRequest | ||||||
|  | 	err = c.ShouldBindJSON(&req) | ||||||
|  | 	if err != nil { | ||||||
|  | 		go s.SaveLog("DelProduct", "Manage", "", "", req.ToString(), fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 		return nil, e.NewValidErr(err) | ||||||
|  | 	} | ||||||
|  | 	data, err = repo.EditProduct(c, req) | ||||||
|  | 	go s.SaveLog("删除产品(物模型)", "Manage", "", "", "", fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | func (s HandlerService) CategoryList(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.ProductCategoryRequest | ||||||
|  | 	err = c.ShouldBindJSON(&req) | ||||||
|  | 	if err != nil { | ||||||
|  | 		go s.SaveLog("CategoryList", "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 > 1000 { | ||||||
|  | 		req.Size = 1000 | ||||||
|  | 	} | ||||||
|  | 	if req.Page < 1 { | ||||||
|  | 		req.Page = 1 | ||||||
|  | 	} | ||||||
|  | 	data, err = repo.CategoryList(c, req) | ||||||
|  | 	go s.SaveLog("产品(物模型)类型列表", "Manage", "", "", "", fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | func (s HandlerService) AddCategory(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.ProductCategoryItemRequest | ||||||
|  | 	err = c.ShouldBindJSON(&req) | ||||||
|  | 	if err != nil { | ||||||
|  | 		go s.SaveLog("AddCategory", "Manage", "", "", req.ToString(), fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 		return nil, e.NewValidErr(err) | ||||||
|  | 	} | ||||||
|  | 	data, err = repo.AddCategory(c, req) | ||||||
|  | 	go s.SaveLog("新增产品(物模型)类型", "Manage", "", "", "", fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | func (s HandlerService) EditCategory(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.ProductCategoryItemRequest | ||||||
|  | 	err = c.ShouldBindJSON(&req) | ||||||
|  | 	if err != nil { | ||||||
|  | 		go s.SaveLog("AddCategory", "Manage", "", "", req.ToString(), fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 		return nil, e.NewValidErr(err) | ||||||
|  | 	} | ||||||
|  | 	data, err = repo.EditCategory(c, req) | ||||||
|  | 	go s.SaveLog("修改产品(物模型)类型", "Manage", "", "", "", fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | func (s HandlerService) DelCategory(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.ProductCategoryItemRequest | ||||||
|  | 	err = c.ShouldBindJSON(&req) | ||||||
|  | 	if err != nil { | ||||||
|  | 		go s.SaveLog("DelCategory", "Manage", "", "", req.ToString(), fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 		return nil, e.NewValidErr(err) | ||||||
|  | 	} | ||||||
|  | 	data, err = repo.DelCategory(c, req) | ||||||
|  | 	go s.SaveLog("删除产品(物模型)类型", "Manage", "", "", "", fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (s HandlerService) AttributeList(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.AttributeRequest | ||||||
|  | 	err = c.ShouldBindJSON(&req) | ||||||
|  | 	if err != nil { | ||||||
|  | 		go s.SaveLog("CategoryList", "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 > 1000 { | ||||||
|  | 		req.Size = 1000 | ||||||
|  | 	} | ||||||
|  | 	if req.Page < 1 { | ||||||
|  | 		req.Page = 1 | ||||||
|  | 	} | ||||||
|  | 	data, err = repo.AttributeList(c, req) | ||||||
|  | 	go s.SaveLog("产品(物模型)属性列表", "Manage", "", "", "", fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | func (s HandlerService) AddAttribute(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.AttributeItemRequest | ||||||
|  | 	err = c.ShouldBindJSON(&req) | ||||||
|  | 	if err != nil { | ||||||
|  | 		go s.SaveLog("AddAttribute", "Manage", "", "", req.ToString(), fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 		return nil, e.NewValidErr(err) | ||||||
|  | 	} | ||||||
|  | 	data, err = repo.AddAttribute(c, req) | ||||||
|  | 	go s.SaveLog("增加产品(物模型)属性", "Manage", "", "", "", fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | func (s HandlerService) EditAttribute(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.AttributeItemRequest | ||||||
|  | 	err = c.ShouldBindJSON(&req) | ||||||
|  | 	if err != nil { | ||||||
|  | 		go s.SaveLog("EditAttribute", "Manage", "", "", req.ToString(), fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 		return nil, e.NewValidErr(err) | ||||||
|  | 	} | ||||||
|  | 	data, err = repo.EditAttribute(c, req) | ||||||
|  | 	go s.SaveLog("修改产品(物模型)属性", "Manage", "", "", "", fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | func (s HandlerService) DelAttribute(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.AttributeItemRequest | ||||||
|  | 	err = c.ShouldBindJSON(&req) | ||||||
|  | 	if err != nil { | ||||||
|  | 		go s.SaveLog("DelAttribute", "Manage", "", "", req.ToString(), fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 		return nil, e.NewValidErr(err) | ||||||
|  | 	} | ||||||
|  | 	data, err = repo.DelAttribute(c, req) | ||||||
|  | 	go s.SaveLog("删除产品(物模型)属性", "Manage", "", "", "", fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | func (s HandlerService) EventList(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.AttributeRequest | ||||||
|  | 	err = c.ShouldBindJSON(&req) | ||||||
|  | 	if err != nil { | ||||||
|  | 		go s.SaveLog("EventList", "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 > 1000 { | ||||||
|  | 		req.Size = 1000 | ||||||
|  | 	} | ||||||
|  | 	if req.Page < 1 { | ||||||
|  | 		req.Page = 1 | ||||||
|  | 	} | ||||||
|  | 	data, err = repo.EventList(c, req) | ||||||
|  | 	go s.SaveLog("产品(物模型)事件列表", "Manage", "", "", "", fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | func (s HandlerService) AddEvent(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.EventItemRequest | ||||||
|  | 	err = c.ShouldBindJSON(&req) | ||||||
|  | 	if err != nil { | ||||||
|  | 		go s.SaveLog("AddEvent", "Manage", "", "", req.ToString(), fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 		return nil, e.NewValidErr(err) | ||||||
|  | 	} | ||||||
|  | 	data, err = repo.AddEvent(c, req) | ||||||
|  | 	go s.SaveLog("增加产品(物模型)事件", "Manage", "", "", "", fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | func (s HandlerService) EditEvent(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.EventItemRequest | ||||||
|  | 	err = c.ShouldBindJSON(&req) | ||||||
|  | 	if err != nil { | ||||||
|  | 		go s.SaveLog("EditEvent", "Manage", "", "", req.ToString(), fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 		return nil, e.NewValidErr(err) | ||||||
|  | 	} | ||||||
|  | 	data, err = repo.EditEvent(c, req) | ||||||
|  | 	go s.SaveLog("修改产品(物模型)事件", "Manage", "", "", "", fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | func (s HandlerService) DelEvent(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.EventItemRequest | ||||||
|  | 	err = c.ShouldBindJSON(&req) | ||||||
|  | 	if err != nil { | ||||||
|  | 		go s.SaveLog("DelEvent", "Manage", "", "", req.ToString(), fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 		return nil, e.NewValidErr(err) | ||||||
|  | 	} | ||||||
|  | 	data, err = repo.DelEvent(c, req) | ||||||
|  | 	go s.SaveLog("删除产品(物模型)事件", "Manage", "", "", "", fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (s HandlerService) ServiceList(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.AttributeRequest | ||||||
|  | 	err = c.ShouldBindJSON(&req) | ||||||
|  | 	if err != nil { | ||||||
|  | 		go s.SaveLog("ServiceList", "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 > 1000 { | ||||||
|  | 		req.Size = 1000 | ||||||
|  | 	} | ||||||
|  | 	if req.Page < 1 { | ||||||
|  | 		req.Page = 1 | ||||||
|  | 	} | ||||||
|  | 	data, err = repo.ServiceList(c, req) | ||||||
|  | 	go s.SaveLog("产品(物模型)服务列表", "Manage", "", "", "", fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | func (s HandlerService) AddService(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.ServiceItemRequest | ||||||
|  | 	err = c.ShouldBindJSON(&req) | ||||||
|  | 	if err != nil { | ||||||
|  | 		go s.SaveLog("AddService", "Manage", "", "", req.ToString(), fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 		return nil, e.NewValidErr(err) | ||||||
|  | 	} | ||||||
|  | 	data, err = repo.AddService(c, req) | ||||||
|  | 	go s.SaveLog("增加产品(物模型)服务", "Manage", "", "", "", fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | func (s HandlerService) EditService(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.ServiceItemRequest | ||||||
|  | 	err = c.ShouldBindJSON(&req) | ||||||
|  | 	if err != nil { | ||||||
|  | 		go s.SaveLog("AddService", "Manage", "", "", req.ToString(), fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 		return nil, e.NewValidErr(err) | ||||||
|  | 	} | ||||||
|  | 	data, err = repo.EditService(c, req) | ||||||
|  | 	go s.SaveLog("修改产品(物模型)服务", "Manage", "", "", "", fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | func (s HandlerService) DelService(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.ServiceItemRequest | ||||||
|  | 	err = c.ShouldBindJSON(&req) | ||||||
|  | 	if err != nil { | ||||||
|  | 		go s.SaveLog("DelService", "Manage", "", "", req.ToString(), fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 		return nil, e.NewValidErr(err) | ||||||
|  | 	} | ||||||
|  | 	data, err = repo.DelService(c, req) | ||||||
|  | 	go s.SaveLog("删除产品(物模型)服务", "Manage", "", "", "", fmt.Sprintf("%d", userInfo.UserId), c.Request.RemoteAddr, "") | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | @ -0,0 +1,29 @@ | ||||||
|  | package handler | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"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) Login(c *gin.Context) (data interface{}, err error) { | ||||||
|  | 	repo := service.NewUserService(s.Engine, s.Logger) | ||||||
|  | 	var req proto.UserLogin | ||||||
|  | 	err = c.ShouldBindJSON(&req) | ||||||
|  | 	if err != nil { | ||||||
|  | 		go s.SaveLog("UserLogin", "System", "", "", req.ToString(), "", c.Request.RemoteAddr, "") | ||||||
|  | 		return nil, e.NewValidErr(err) | ||||||
|  | 	} | ||||||
|  | 	data, err = repo.Login(c, req.UserName, req.UserPass) | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (s HandlerService) GetUserInfo(c *gin.Context) (data interface{}, err error) { | ||||||
|  | 	repo := service.NewUserService(s.Engine, s.Logger) | ||||||
|  | 	us, _ := c.Get("operatorUser") | ||||||
|  | 	userinfo := us.(*model.SystemUser) | ||||||
|  | 	data, err = repo.GetUserInfo(c, userinfo.UserId) | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | @ -0,0 +1,24 @@ | ||||||
|  | package middleware | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"net/http" | ||||||
|  | 
 | ||||||
|  | 	"github.com/gin-gonic/gin" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | func Cors() gin.HandlerFunc { | ||||||
|  | 	return func(c *gin.Context) { | ||||||
|  | 		method := c.Request.Method | ||||||
|  | 		c.Header("Access-Control-Allow-Origin", "*") | ||||||
|  | 		c.Header("Access-Control-Allow-Headers", "Content-Type,AccessToken,X-CSRF-Token, Authorization, Token") | ||||||
|  | 		c.Header("Access-Control-Allow-Methods", "POST, GET,DELETE,PUT,OPTIONS") | ||||||
|  | 		c.Header("Access-Control-Expose-Headers", "Content-Length, Access-Control-Allow-Origin, Access-Control-Allow-Headers, Content-Type") | ||||||
|  | 		c.Header("Access-Control-Allow-Credentials", "true") | ||||||
|  | 		// 放行所有OPTIONS方法
 | ||||||
|  | 		if method == "OPTIONS" { | ||||||
|  | 			c.AbortWithStatus(http.StatusNoContent) | ||||||
|  | 		} | ||||||
|  | 		// 处理请求
 | ||||||
|  | 		c.Next() | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -0,0 +1,149 @@ | ||||||
|  | package middleware | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"encoding/json" | ||||||
|  | 	"fmt" | ||||||
|  | 	"hpds-iot-web/model" | ||||||
|  | 	e "hpds-iot-web/pkg/err" | ||||||
|  | 	"net/http" | ||||||
|  | 	"time" | ||||||
|  | 
 | ||||||
|  | 	"github.com/dgrijalva/jwt-go" | ||||||
|  | 	"github.com/gin-gonic/gin" | ||||||
|  | 	"go.uber.org/zap" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | var secretKey = []byte("17715d3df8712f0a3b31cfed384f668e95822de4e4a371e4ceaa6f1b279e482a0af32b4615d39f8857d0a1d99d2787f773147a9ed7587b243e0fe1b04076e307") | ||||||
|  | 
 | ||||||
|  | // 验签使用
 | ||||||
|  | var AuthKey = "auth-key" | ||||||
|  | var AuthSignature = "auth-signature" | ||||||
|  | 
 | ||||||
|  | // Claims 自定义声明
 | ||||||
|  | type Claims struct { | ||||||
|  | 	Avatar   string             `json:"avatar"` | ||||||
|  | 	Desc     string             `json:"desc"` | ||||||
|  | 	HomePath string             `json:"homePath"` | ||||||
|  | 	RealName string             `json:"realName"` | ||||||
|  | 	Roles    []model.SystemRole `json:"roles"` | ||||||
|  | 	UserId   int64              `json:"userId"` | ||||||
|  | 	Token    string             `json:"token,omitempty"` | ||||||
|  | 	Phone    string             `json:"phone"` | ||||||
|  | 	jwt.StandardClaims | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Sign 生成token
 | ||||||
|  | func Sign(user *model.SystemUser, expires int) (string, error) { | ||||||
|  | 	// 过期时间为秒
 | ||||||
|  | 	expAt := time.Now().Add(time.Duration(expires) * time.Second).Unix() | ||||||
|  | 	// 创建声明
 | ||||||
|  | 	claims := Claims{ | ||||||
|  | 		Avatar:   user.Avatar, | ||||||
|  | 		Desc:     user.Desc, | ||||||
|  | 		HomePath: user.HomePath, | ||||||
|  | 		RealName: user.RealName, | ||||||
|  | 		Roles:    model.GetRolesByUserId(user.UserId), | ||||||
|  | 		UserId:   user.UserId, | ||||||
|  | 		Phone:    user.Phone, | ||||||
|  | 		StandardClaims: jwt.StandardClaims{ | ||||||
|  | 			ExpiresAt: expAt, | ||||||
|  | 			Issuer:    "交科院", | ||||||
|  | 		}, | ||||||
|  | 	} | ||||||
|  | 	var err error | ||||||
|  | 	//创建token,指定加密算法为HS256
 | ||||||
|  | 	token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) | ||||||
|  | 	claims.Token, err = token.SignedString(secretKey) | ||||||
|  | 	//生成token
 | ||||||
|  | 	return claims.Token, err | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // JwtAuthMiddleware JWT处理中间件
 | ||||||
|  | func JwtAuthMiddleware(logger *zap.Logger) gin.HandlerFunc { | ||||||
|  | 	return func(c *gin.Context) { | ||||||
|  | 		path := c.Request.URL.Path | ||||||
|  | 		var ( | ||||||
|  | 			err      error | ||||||
|  | 			Cookie   *http.Cookie | ||||||
|  | 			usClaims *Claims | ||||||
|  | 			user     *model.SystemUser | ||||||
|  | 		) | ||||||
|  | 		token := c.GetHeader("token") | ||||||
|  | 		// 这里可以过滤不需要进行验证的接口
 | ||||||
|  | 		if path == "/user/login" || path == "/health" { | ||||||
|  | 			goto Return | ||||||
|  | 		} | ||||||
|  | 		if len(token) == 0 { | ||||||
|  | 			Cookie, err = c.Request.Cookie("token") | ||||||
|  | 			if err != nil { | ||||||
|  | 				logger.With( | ||||||
|  | 					zap.String("method", c.Request.Method), | ||||||
|  | 					zap.String("path", path), | ||||||
|  | 					zap.Any("request", c.Params), | ||||||
|  | 				).Error(err.Error()) | ||||||
|  | 				goto Return | ||||||
|  | 			} | ||||||
|  | 			token = Cookie.Value | ||||||
|  | 		} | ||||||
|  | 		if len(token) <= 0 { | ||||||
|  | 			logger.With( | ||||||
|  | 				zap.String("method", c.Request.Method), | ||||||
|  | 				zap.String("path", path), | ||||||
|  | 				zap.Any("request", c.Params), | ||||||
|  | 			).Error("缺少token") | ||||||
|  | 			goto Return | ||||||
|  | 		} | ||||||
|  | 		usClaims, err = GetUserInfoByToken(c, token, logger) | ||||||
|  | 		if err != nil { | ||||||
|  | 			c.JSON(e.NoAuth, gin.H{"code": e.NoAuth, "msg": "未登录的用户请求"}) | ||||||
|  | 			c.Abort() | ||||||
|  | 			return | ||||||
|  | 		} | ||||||
|  | 		if err != nil { | ||||||
|  | 			logger.With( | ||||||
|  | 				zap.String("method", c.Request.Method), | ||||||
|  | 				zap.String("path", path), | ||||||
|  | 				zap.Any("request", c.Params), | ||||||
|  | 			).Error(err.Error()) | ||||||
|  | 			goto Return | ||||||
|  | 		} | ||||||
|  | 		user, err = model.GetUserById(usClaims.UserId) | ||||||
|  | 		if err != nil { | ||||||
|  | 			logger.With( | ||||||
|  | 				zap.String("method", c.Request.Method), | ||||||
|  | 				zap.String("path", path), | ||||||
|  | 				zap.Any("request", c.Params), | ||||||
|  | 			).Error(err.Error()) | ||||||
|  | 			goto Return | ||||||
|  | 		} | ||||||
|  | 		c.Set("operatorUser", user) | ||||||
|  | 	Return: | ||||||
|  | 		if err != nil { | ||||||
|  | 			c.Header("Content-Type", "application/json") | ||||||
|  | 			c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{ | ||||||
|  | 				"code":    http.StatusBadRequest, | ||||||
|  | 				"status":  http.StatusText(http.StatusBadRequest), | ||||||
|  | 				"path":    path, | ||||||
|  | 				"message": "失败", | ||||||
|  | 				"error":   "token过期/失效,请登录后重试", | ||||||
|  | 				"data":    nil, | ||||||
|  | 			}) | ||||||
|  | 			return | ||||||
|  | 		} | ||||||
|  | 		c.Next() | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func GetUserInfoByToken(ctx *gin.Context, token string, logger *zap.Logger) (data *Claims, err error) { | ||||||
|  | 	nosql := NewNoSql(logger) | ||||||
|  | 	su, err := nosql.Get(ctx, token) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	data = new(Claims) | ||||||
|  | 	err = json.Unmarshal([]byte(fmt.Sprintf("%s", su)), data) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	return data, nil | ||||||
|  | } | ||||||
|  | @ -0,0 +1,42 @@ | ||||||
|  | package middleware | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"context" | ||||||
|  | 	"errors" | ||||||
|  | 	"github.com/go-redis/redis" | ||||||
|  | 	"hpds-iot-web/model" | ||||||
|  | 	"time" | ||||||
|  | 
 | ||||||
|  | 	"go.uber.org/zap" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type NoSql interface { | ||||||
|  | 	Save(ctx context.Context, key string, value []byte, expires time.Duration) (err error) | ||||||
|  | 	Get(ctx context.Context, key string) (data interface{}, err error) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // noSql 接口实现类
 | ||||||
|  | type noSql struct { | ||||||
|  | 	rdb    *redis.Client | ||||||
|  | 	logger *zap.Logger | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func NewNoSql(logger *zap.Logger) NoSql { | ||||||
|  | 	return &noSql{ | ||||||
|  | 		rdb:    model.Redis, | ||||||
|  | 		logger: logger, | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | func (ns *noSql) Save(ctx context.Context, key string, value []byte, expires time.Duration) (err error) { | ||||||
|  | 	return ns.rdb.Set(key, value, expires).Err() | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | func (ns *noSql) Get(ctx context.Context, key string) (data interface{}, err error) { | ||||||
|  | 	data, err = ns.rdb.Get(key).Result() | ||||||
|  | 	if err == redis.Nil { | ||||||
|  | 		return nil, errors.New("键" + key + "不存在") | ||||||
|  | 	} else if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	return data, nil | ||||||
|  | } | ||||||
|  | @ -0,0 +1,219 @@ | ||||||
|  | package proto | ||||||
|  | 
 | ||||||
|  | import "encoding/json" | ||||||
|  | 
 | ||||||
|  | type BasePageList struct { | ||||||
|  | 	Page int64 `json:"pageNum,omitempty" form:"page"` | ||||||
|  | 	Size int64 `json:"pageSize,omitempty" form:"pageSize"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type UserLogin struct { | ||||||
|  | 	UserName string `json:"username"` | ||||||
|  | 	UserPass string `json:"password"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (us UserLogin) ToString() string { | ||||||
|  | 	data, err := json.Marshal(us) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return "" | ||||||
|  | 	} | ||||||
|  | 	return string(data) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type OwnerRequest struct { | ||||||
|  | 	OwnerName string `json:"ownerName"` | ||||||
|  | 	BasePageList | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (r OwnerRequest) ToString() string { | ||||||
|  | 	data, err := json.Marshal(r) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return "" | ||||||
|  | 	} | ||||||
|  | 	return string(data) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type OwnerItemReq struct { | ||||||
|  | 	OwnerId    int64  `json:"ownerId"` | ||||||
|  | 	OwnerName  string `json:"ownerName"` | ||||||
|  | 	ChargeUser string `json:"chargeUser"` | ||||||
|  | 	Phone      string `json:"phone"` | ||||||
|  | 	Creator    int64  `json:"creator"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (r OwnerItemReq) ToString() string { | ||||||
|  | 	data, err := json.Marshal(r) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return "" | ||||||
|  | 	} | ||||||
|  | 	return string(data) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type ProjectRequest struct { | ||||||
|  | 	LineName    string `json:"lineName"` | ||||||
|  | 	ProjectName string `json:"projectName"` | ||||||
|  | 	BasePageList | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (p ProjectRequest) ToString() string { | ||||||
|  | 	data, err := json.Marshal(p) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return "" | ||||||
|  | 	} | ||||||
|  | 	return string(data) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type ProjectItemRequest struct { | ||||||
|  | 	ProjectId      int     `json:"projectId"` | ||||||
|  | 	ProjectName    string  `json:"projectName"` | ||||||
|  | 	OwnerId        int     `json:"ownerId"` | ||||||
|  | 	LineName       string  `json:"lineName"` | ||||||
|  | 	StartName      string  `json:"startName"` | ||||||
|  | 	EndName        string  `json:"endName"` | ||||||
|  | 	FixedDeviceNum int     `json:"fixedDeviceNum"` | ||||||
|  | 	Direction      string  `json:"direction"` | ||||||
|  | 	LaneNum        int     `json:"laneNum"` | ||||||
|  | 	Lng            float64 `json:"lng"` | ||||||
|  | 	Lat            float64 `json:"lat"` | ||||||
|  | 	Creator        int64   `json:"creator"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (p ProjectItemRequest) ToString() string { | ||||||
|  | 	data, err := json.Marshal(p) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return "" | ||||||
|  | 	} | ||||||
|  | 	return string(data) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type ProductRequest struct { | ||||||
|  | 	CategoryId  int64  `json:"categoryId"` | ||||||
|  | 	ProductName string `json:"productName"` | ||||||
|  | 	Protocol    int64  `json:"protocol"` | ||||||
|  | 	BasePageList | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (p ProductRequest) ToString() string { | ||||||
|  | 	data, err := json.Marshal(p) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return "" | ||||||
|  | 	} | ||||||
|  | 	return string(data) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type ProductItemRequest struct { | ||||||
|  | 	MatterId    int64  `json:"matterId"` | ||||||
|  | 	MatterName  string `json:"matterName"` | ||||||
|  | 	CategoryId  int64  `json:"categoryId"` | ||||||
|  | 	Protocol    int    `json:"protocol"` | ||||||
|  | 	UserVersion int64  `json:"userVersion"` | ||||||
|  | 	Status      int    `json:"status"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (p ProductItemRequest) ToString() string { | ||||||
|  | 	data, err := json.Marshal(p) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return "" | ||||||
|  | 	} | ||||||
|  | 	return string(data) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type ProductCategoryRequest struct { | ||||||
|  | 	CategoryName string `json:"categoryName"` | ||||||
|  | 	BasePageList | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (p ProductCategoryRequest) ToString() string { | ||||||
|  | 	data, err := json.Marshal(p) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return "" | ||||||
|  | 	} | ||||||
|  | 	return string(data) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type ProductCategoryItemRequest struct { | ||||||
|  | 	CategoryId   int64  `json:"categoryId"` | ||||||
|  | 	CategoryName string `json:"categoryName"` | ||||||
|  | 	CategoryDesc string `json:"categoryDesc"` | ||||||
|  | 	Status       int    `json:"status"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (p ProductCategoryItemRequest) ToString() string { | ||||||
|  | 	data, err := json.Marshal(p) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return "" | ||||||
|  | 	} | ||||||
|  | 	return string(data) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type AttributeRequest struct { | ||||||
|  | 	MatterId  int64 `json:"matterId"` | ||||||
|  | 	VersionId int64 `json:"versionId"` | ||||||
|  | 	BasePageList | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (p AttributeRequest) ToString() string { | ||||||
|  | 	data, err := json.Marshal(p) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return "" | ||||||
|  | 	} | ||||||
|  | 	return string(data) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type AttributeItemRequest struct { | ||||||
|  | 	AttributeId   int64  `json:"attributeId"` | ||||||
|  | 	MatterId      int64  `json:"matterId"` | ||||||
|  | 	VersionId     int64  `json:"versionId"` | ||||||
|  | 	AttributeName string `json:"attributeName"` | ||||||
|  | 	AttributeKey  string `json:"attributeKey"` | ||||||
|  | 	AttributeDesc string `json:"attributeDesc"` | ||||||
|  | 	DataType      int    `json:"dataType"` | ||||||
|  | 	MaxValue      string `json:"maxValue"` | ||||||
|  | 	MinValue      string `json:"minValue"` | ||||||
|  | 	StepValue     string `json:"stepValue"` | ||||||
|  | 	Unit          string `json:"unit"` | ||||||
|  | 	IsOnlyRead    int    `json:"isOnlyRead"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (p AttributeItemRequest) ToString() string { | ||||||
|  | 	data, err := json.Marshal(p) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return "" | ||||||
|  | 	} | ||||||
|  | 	return string(data) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type EventItemRequest struct { | ||||||
|  | 	EventId         int64  `json:"eventId"` | ||||||
|  | 	MatterId        int64  `json:"matterId"` | ||||||
|  | 	VersionId       int64  `json:"versionId"` | ||||||
|  | 	EventIdentifier string `json:"eventIdentifier"` | ||||||
|  | 	EventType       string `json:"eventType"` | ||||||
|  | 	EventDesc       string `json:"eventDesc"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (p EventItemRequest) ToString() string { | ||||||
|  | 	data, err := json.Marshal(p) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return "" | ||||||
|  | 	} | ||||||
|  | 	return string(data) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type ServiceItemRequest struct { | ||||||
|  | 	ServiceId         int64  `json:"serviceId"` | ||||||
|  | 	MatterId          int64  `json:"matterId"` | ||||||
|  | 	VersionId         int64  `json:"versionId"` | ||||||
|  | 	ServiceName       string `json:"serviceName"` | ||||||
|  | 	ServiceIdentifier string `json:"serviceIdentifier"` | ||||||
|  | 	Calling           int    `json:"calling"` | ||||||
|  | 	ServiceDesc       string `json:"serviceDesc"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (p ServiceItemRequest) ToString() string { | ||||||
|  | 	data, err := json.Marshal(p) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return "" | ||||||
|  | 	} | ||||||
|  | 	return string(data) | ||||||
|  | } | ||||||
|  | @ -0,0 +1,38 @@ | ||||||
|  | package proto | ||||||
|  | 
 | ||||||
|  | // BaseResponse 基础返回结构
 | ||||||
|  | type BaseResponse struct { | ||||||
|  | 	Code      int         `json:"code"` | ||||||
|  | 	Message   string      `json:"message"` | ||||||
|  | 	Data      interface{} `json:"result,omitempty"` | ||||||
|  | 	Status    string      `json:"type,omitempty"` | ||||||
|  | 	Err       error       `json:"error,omitempty"`     // 错误堆栈
 | ||||||
|  | 	Page      int64       `json:"page,omitempty"`      //当前页码
 | ||||||
|  | 	PageSize  int64       `json:"pageSize,omitempty"`  // 单页显示记录数--前端参数2
 | ||||||
|  | 	PageCount int64       `json:"totalPage,omitempty"` // 总页数
 | ||||||
|  | 	TotalSize int64       `json:"totalRow,omitempty"`  // 总记录数
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type UserLoginResponse struct { | ||||||
|  | 	UserId   int64      `json:"userId"` | ||||||
|  | 	Token    string     `json:"token"` | ||||||
|  | 	RealName string     `json:"realName"` | ||||||
|  | 	UserName string     `json:"userName"` | ||||||
|  | 	Roles    []RoleItem `json:"roles"` | ||||||
|  | 	Avatar   string     `json:"avatar"` | ||||||
|  | 	Desc     string     `json:"desc"` | ||||||
|  | 	HomePath string     `json:"homePath"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type RoleItem struct { | ||||||
|  | 	RoleId   int64  `json:"roleId"` | ||||||
|  | 	RoleName string `json:"roleName"` | ||||||
|  | 	Value    string `json:"value"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type OwnerItem struct { | ||||||
|  | 	OwnerId    int    `json:"ownerId"` | ||||||
|  | 	OwnerName  string `json:"ownerName"` | ||||||
|  | 	ChargeUser string `json:"chargeUser"` | ||||||
|  | 	Phone      string `json:"phone"` | ||||||
|  | } | ||||||
|  | @ -0,0 +1,89 @@ | ||||||
|  | package router | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	ginzap "github.com/gin-contrib/zap" | ||||||
|  | 	"github.com/gin-gonic/gin" | ||||||
|  | 	"go.uber.org/zap" | ||||||
|  | 	"hpds-iot-web/internal/handler" | ||||||
|  | 	"hpds-iot-web/internal/middleware" | ||||||
|  | 	"xorm.io/xorm" | ||||||
|  | 
 | ||||||
|  | 	e "hpds-iot-web/pkg/err" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | func InitRouter(logger *zap.Logger, engine *xorm.Engine) *gin.Engine { | ||||||
|  | 	hs := handler.NewHandlerService(engine, logger) | ||||||
|  | 	gin.SetMode(gin.ReleaseMode) | ||||||
|  | 	r := gin.New() | ||||||
|  | 	r.Use(ginzap.Ginzap(logger, "2006-01-02 15:04:05.000", true)) | ||||||
|  | 	r.Use(middleware.Cors()) | ||||||
|  | 
 | ||||||
|  | 	user := r.Group("/user") | ||||||
|  | 	{ | ||||||
|  | 		user.Use(middleware.JwtAuthMiddleware(logger)) | ||||||
|  | 		user.POST("/login", e.ErrorWrapper(hs.Login)) | ||||||
|  | 		user.GET("/getUserInfo", e.ErrorWrapper(hs.GetUserInfo)) | ||||||
|  | 	} | ||||||
|  | 	manage := r.Group("/manage") | ||||||
|  | 	{ | ||||||
|  | 		owner := manage.Group("/owner") | ||||||
|  | 		{ | ||||||
|  | 			owner.Use(middleware.JwtAuthMiddleware(logger)) | ||||||
|  | 			owner.POST("/list", e.ErrorWrapper(hs.OwnerList)) | ||||||
|  | 			owner.POST("/add", e.ErrorWrapper(hs.AddOwner)) | ||||||
|  | 			owner.POST("/edit", e.ErrorWrapper(hs.EditOwner)) | ||||||
|  | 			owner.POST("/delete", e.ErrorWrapper(hs.DelOwner)) | ||||||
|  | 		} | ||||||
|  | 		project := manage.Group("/project") | ||||||
|  | 		{ | ||||||
|  | 			project.Use(middleware.JwtAuthMiddleware(logger)) | ||||||
|  | 			project.POST("/list", e.ErrorWrapper(hs.ProjectList)) | ||||||
|  | 			project.POST("/add", e.ErrorWrapper(hs.AddProject)) | ||||||
|  | 			project.POST("/edit", e.ErrorWrapper(hs.EditProject)) | ||||||
|  | 			project.POST("/delete", e.ErrorWrapper(hs.DelProject)) | ||||||
|  | 
 | ||||||
|  | 		} | ||||||
|  | 		product := manage.Group("/product") | ||||||
|  | 		{ | ||||||
|  | 			product.Use(middleware.JwtAuthMiddleware(logger)) | ||||||
|  | 			product.POST("/list", e.ErrorWrapper(hs.ProductList)) | ||||||
|  | 			product.POST("/add", e.ErrorWrapper(hs.AddProduct)) | ||||||
|  | 			product.POST("/edit", e.ErrorWrapper(hs.EditProduct)) | ||||||
|  | 			product.POST("/delete", e.ErrorWrapper(hs.DelProduct)) | ||||||
|  | 
 | ||||||
|  | 			category := product.Group("/category") | ||||||
|  | 			{ | ||||||
|  | 				category.Use(middleware.JwtAuthMiddleware(logger)) | ||||||
|  | 				category.POST("/list", e.ErrorWrapper(hs.CategoryList)) | ||||||
|  | 				category.POST("/add", e.ErrorWrapper(hs.AddCategory)) | ||||||
|  | 				category.POST("/edit", e.ErrorWrapper(hs.EditCategory)) | ||||||
|  | 				category.POST("/delete", e.ErrorWrapper(hs.DelCategory)) | ||||||
|  | 			} | ||||||
|  | 			attribute := product.Group("/attribute") | ||||||
|  | 			{ | ||||||
|  | 				attribute.Use(middleware.JwtAuthMiddleware(logger)) | ||||||
|  | 				attribute.POST("/list", e.ErrorWrapper(hs.AttributeList)) | ||||||
|  | 				attribute.POST("/add", e.ErrorWrapper(hs.AddAttribute)) | ||||||
|  | 				attribute.POST("/edit", e.ErrorWrapper(hs.EditAttribute)) | ||||||
|  | 				attribute.POST("/delete", e.ErrorWrapper(hs.DelAttribute)) | ||||||
|  | 			} | ||||||
|  | 			event := product.Group("/event") | ||||||
|  | 			{ | ||||||
|  | 				event.Use(middleware.JwtAuthMiddleware(logger)) | ||||||
|  | 				event.POST("/list", e.ErrorWrapper(hs.EventList)) | ||||||
|  | 				event.POST("/add", e.ErrorWrapper(hs.AddEvent)) | ||||||
|  | 				event.POST("/edit", e.ErrorWrapper(hs.EditEvent)) | ||||||
|  | 				event.POST("/delete", e.ErrorWrapper(hs.DelEvent)) | ||||||
|  | 			} | ||||||
|  | 			service := product.Group("/service") | ||||||
|  | 			{ | ||||||
|  | 				service.Use(middleware.JwtAuthMiddleware(logger)) | ||||||
|  | 				service.POST("/list", e.ErrorWrapper(hs.ServiceList)) | ||||||
|  | 				service.POST("/add", e.ErrorWrapper(hs.AddService)) | ||||||
|  | 				service.POST("/edit", e.ErrorWrapper(hs.EditService)) | ||||||
|  | 				service.POST("/delete", e.ErrorWrapper(hs.DelService)) | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return r | ||||||
|  | } | ||||||
|  | @ -0,0 +1,183 @@ | ||||||
|  | package service | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"context" | ||||||
|  | 	"encoding/json" | ||||||
|  | 	"fmt" | ||||||
|  | 	"go.uber.org/zap" | ||||||
|  | 	"hpds-iot-web/internal/middleware" | ||||||
|  | 	"hpds-iot-web/internal/proto" | ||||||
|  | 	"hpds-iot-web/model" | ||||||
|  | 	"hpds-iot-web/pkg/utils" | ||||||
|  | 	"net/http" | ||||||
|  | 	"time" | ||||||
|  | 	"xorm.io/xorm" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // FillPaging 填充分页数据
 | ||||||
|  | func FillPaging(count int64, pageNum int64, pageSize int64, list interface{}, data *proto.BaseResponse) *proto.BaseResponse { | ||||||
|  | 	var tp int64 | ||||||
|  | 	if count%pageSize > 0 { | ||||||
|  | 		tp = count/pageSize + 1 | ||||||
|  | 	} else { | ||||||
|  | 		tp = count / pageSize | ||||||
|  | 	} | ||||||
|  | 	data.PageSize = pageSize | ||||||
|  | 	data.Data = list | ||||||
|  | 	data.Page = pageNum | ||||||
|  | 	data.PageCount = tp | ||||||
|  | 	data.TotalSize = count | ||||||
|  | 	return data | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type repo struct { | ||||||
|  | 	engine *xorm.Engine | ||||||
|  | 	logger *zap.Logger | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type UserService interface { | ||||||
|  | 	Login(ctx context.Context, userName, pass string) (rsp *proto.BaseResponse, err error) | ||||||
|  | 	GetUserInfo(ctx context.Context, userId int64) (rsp *proto.BaseResponse, err error) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func NewUserService(engine *xorm.Engine, logger *zap.Logger) UserService { | ||||||
|  | 	return &repo{ | ||||||
|  | 		engine: engine, | ||||||
|  | 		logger: logger, | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (rp *repo) Login(ctx context.Context, userName, pass string) (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: | ||||||
|  | 		//获取用户
 | ||||||
|  | 		us := new(model.SystemUser) | ||||||
|  | 		h, err := rp.engine.Where("phone=?", userName).Get(us) | ||||||
|  | 		if err != nil { | ||||||
|  | 			goto ReturnPoint | ||||||
|  | 		} | ||||||
|  | 		if !h { | ||||||
|  | 			err = fmt.Errorf("未能找到对应的用户") | ||||||
|  | 			goto ReturnPoint | ||||||
|  | 		} | ||||||
|  | 		vPass := utils.GetUserSha1Pass(pass, us.Salt) | ||||||
|  | 		if vPass != us.Pass { | ||||||
|  | 			err = fmt.Errorf("用户名或者密码不正确") | ||||||
|  | 			goto ReturnPoint | ||||||
|  | 		} | ||||||
|  | 		data := new(proto.UserLoginResponse) | ||||||
|  | 		data.UserName = us.Phone | ||||||
|  | 		data.RealName = us.RealName | ||||||
|  | 		data.UserId = us.UserId | ||||||
|  | 		data.Avatar = us.Avatar | ||||||
|  | 		data.Desc = us.Desc | ||||||
|  | 		data.HomePath = us.HomePath | ||||||
|  | 		//生成JWT token
 | ||||||
|  | 		data.Token, err = middleware.Sign(us, 86400) | ||||||
|  | 		if err != nil { | ||||||
|  | 			goto ReturnPoint | ||||||
|  | 		} | ||||||
|  | 		body, _ := json.Marshal(us) | ||||||
|  | 		err = model.Redis.Set(data.Token, string(body), time.Duration(24)*time.Hour).Err() | ||||||
|  | 		if err != nil { | ||||||
|  | 			goto ReturnPoint | ||||||
|  | 		} | ||||||
|  | 		roleList := model.GetRolesByUserId(us.UserId) | ||||||
|  | 		data.Roles = make([]proto.RoleItem, len(roleList)) | ||||||
|  | 		for k, v := range roleList { | ||||||
|  | 			data.Roles[k] = proto.RoleItem{ | ||||||
|  | 				RoleId:   v.RoleId, | ||||||
|  | 				RoleName: v.RoleName, | ||||||
|  | 				Value:    v.RoleValue, | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		rsp.Code = http.StatusOK | ||||||
|  | 		rsp.Status = http.StatusText(http.StatusOK) | ||||||
|  | 		rsp.Message = "成功" | ||||||
|  | 		rsp.Data = data | ||||||
|  | 		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) GetUserInfo(ctx context.Context, userId int64) (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: | ||||||
|  | 		//获取用户
 | ||||||
|  | 		us := new(model.SystemUser) | ||||||
|  | 		h, err := rp.engine.ID(userId).Get(us) | ||||||
|  | 		if err != nil { | ||||||
|  | 			goto ReturnPoint | ||||||
|  | 		} | ||||||
|  | 		if !h { | ||||||
|  | 			err = fmt.Errorf("未能找到对应的用户") | ||||||
|  | 			goto ReturnPoint | ||||||
|  | 		} | ||||||
|  | 		data := new(proto.UserLoginResponse) | ||||||
|  | 		data.UserName = us.Phone | ||||||
|  | 		data.RealName = us.RealName | ||||||
|  | 		data.UserId = us.UserId | ||||||
|  | 		data.Avatar = us.Avatar | ||||||
|  | 		data.Desc = us.Desc | ||||||
|  | 		data.HomePath = us.HomePath | ||||||
|  | 		//生成JWT token
 | ||||||
|  | 		data.Token, err = middleware.Sign(us, 86400) | ||||||
|  | 		if err != nil { | ||||||
|  | 			goto ReturnPoint | ||||||
|  | 		} | ||||||
|  | 		body, _ := json.Marshal(us) | ||||||
|  | 		err = model.Redis.Set(data.Token, string(body), time.Duration(24)*time.Hour).Err() | ||||||
|  | 		if err != nil { | ||||||
|  | 			goto ReturnPoint | ||||||
|  | 		} | ||||||
|  | 		roleList := model.GetRolesByUserId(us.UserId) | ||||||
|  | 		data.Roles = make([]proto.RoleItem, len(roleList)) | ||||||
|  | 		for k, v := range roleList { | ||||||
|  | 			data.Roles[k] = proto.RoleItem{ | ||||||
|  | 				RoleId:   v.RoleId, | ||||||
|  | 				RoleName: v.RoleName, | ||||||
|  | 				Value:    v.RoleValue, | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		rsp.Code = http.StatusOK | ||||||
|  | 		rsp.Status = http.StatusText(http.StatusOK) | ||||||
|  | 		rsp.Message = "成功" | ||||||
|  | 		rsp.Data = data | ||||||
|  | 		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 | ||||||
|  | } | ||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							|  | @ -0,0 +1,27 @@ | ||||||
|  | package main | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"fmt" | ||||||
|  | 	"github.com/spf13/cobra" | ||||||
|  | 	"hpds-iot-web/cmd" | ||||||
|  | 	"os" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | var ( | ||||||
|  | 	rootCmd = &cobra.Command{ | ||||||
|  | 		Use:     "hpds_web", | ||||||
|  | 		Long:    "hpds_web is a IoT WEB UI", | ||||||
|  | 		Version: "0.1", | ||||||
|  | 	} | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | func init() { | ||||||
|  | 	rootCmd.AddCommand(cmd.NewStartCmd()) | ||||||
|  | } | ||||||
|  | func main() { | ||||||
|  | 
 | ||||||
|  | 	if err := rootCmd.Execute(); err != nil { | ||||||
|  | 		fmt.Fprint(os.Stderr, err.Error()) | ||||||
|  | 		os.Exit(1) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -0,0 +1,11 @@ | ||||||
|  | package model | ||||||
|  | 
 | ||||||
|  | type Brand struct { | ||||||
|  | 	BrandId   int64  `xorm:"not null pk autoincr INT(11)" json:"brandId"` | ||||||
|  | 	BrandName string `xorm:"varchar(200) not null" json:"brandName"` | ||||||
|  | 	BrandLogo string `xorm:"varchar(200) " json:"brandLogo"` | ||||||
|  | 	BrandWeb  string `xorm:"varchar(200) " json:"brandWeb"` | ||||||
|  | 	CreateAt  int64  `xorm:"created" json:"createAt"` | ||||||
|  | 	UpdateAt  int64  `xorm:"updated" json:"updateAt"` | ||||||
|  | 	DeleteAt  int64  `xorm:"deleted" json:"deleteAt"` | ||||||
|  | } | ||||||
|  | @ -0,0 +1,12 @@ | ||||||
|  | package model | ||||||
|  | 
 | ||||||
|  | type DetectionTask struct { | ||||||
|  | 	TaskId          int64  `json:"taskId" xorm:"not null pk autoincr INT(11)"` | ||||||
|  | 	TaskCode        string `json:"taskCode" xorm:"varchar(64) not null "` | ||||||
|  | 	TaskName        string `json:"taskName" xorm:"varchar(200) not null "` | ||||||
|  | 	ParentTaskId    int64  `json:"parentTaskId" xorm:"INT(11) default 0 not null"`    //上级任务编号,默认为0
 | ||||||
|  | 	TaskStatus      int    `json:"taskStatus" xorm:"INT(11) default 0 not null"`      //任务状态
 | ||||||
|  | 	InitiatorUserId int64  `json:"initiatorUserId" xorm:"INT(11) default 0 not null"` //任务发起人
 | ||||||
|  | 	InitiatorTime   int64  `json:"initiatorTime" xorm:"created"`                      //任务发起时间
 | ||||||
|  | 	CompletionTime  int64  `json:"completionTime" xorm:"DATETIME"`                    //任务完成时间
 | ||||||
|  | } | ||||||
|  | @ -0,0 +1,19 @@ | ||||||
|  | package model | ||||||
|  | 
 | ||||||
|  | type Device struct { | ||||||
|  | 	DeviceId      int64   `xorm:"not null pk autoincr INT(11)" json:"deviceId"` | ||||||
|  | 	DeviceName    string  `xorm:"varchar(64) not null" json:"deviceName"` | ||||||
|  | 	DeviceBrandId int     `xorm:"INT(11) default 0 not null" json:"deviceBrandId"` | ||||||
|  | 	DeviceImei    string  `xorm:"varchar(64) not null" json:"deviceImei"`         //设备imei
 | ||||||
|  | 	DeviceSn      string  `xorm:"varchar(64) not null" json:"deviceSn"`           //设备序列号
 | ||||||
|  | 	DeviceTypeId  int     `xorm:"INT(11) default 0 not null" json:"deviceTypeId"` //设备类型
 | ||||||
|  | 	ButtMatterId  int64   `xorm:"INT(11) default 0 not null" json:"buttMatterId"` //对接物模型编号
 | ||||||
|  | 	ButtType      int     `xorm:"INT(11) default 0 not null" json:"buttType"`     //对接类型;1:直连服务;2:平台对接
 | ||||||
|  | 	ButtAddress   string  `xorm:"varchar(200) not null" json:"buttAddress"`       //对接地址
 | ||||||
|  | 	ButtPort      int     `xorm:"INT(11) default 0 not null" json:"buttPort"`     //对接端口
 | ||||||
|  | 	Longitude     float64 `xorm:"decimal(18,6)" json:"longitude"`                 //经度
 | ||||||
|  | 	Latitude      float64 `xorm:"decimal(18,6)" json:"latitude"`                  //纬度
 | ||||||
|  | 	CreateAt      int64   `xorm:"created" json:"createAt"` | ||||||
|  | 	UpdateAt      int64   `xorm:"updated" json:"updateAt"` | ||||||
|  | 	DeleteAt      int64   `xorm:"deleted" json:"deleteAt"` | ||||||
|  | } | ||||||
|  | @ -0,0 +1,11 @@ | ||||||
|  | package model | ||||||
|  | 
 | ||||||
|  | type DeviceType struct { | ||||||
|  | 	TypeId   int64  `xorm:"not null pk autoincr INT(11)" json:"typeId"` | ||||||
|  | 	TypeName string `xorm:"varchar(200) not null" json:"typeName"` | ||||||
|  | 	TypeDesc string `xorm:"TEXT" json:"typeDesc"` | ||||||
|  | 	BizType  string `xorm:"varchar(200) not null" json:"bizType"` | ||||||
|  | 	CreateAt int64  `xorm:"created" json:"createAt"` | ||||||
|  | 	UpdateAt int64  `xorm:"updated" json:"updateAt"` | ||||||
|  | 	DeleteAt int64  `xorm:"deleted" json:"deleteAt"` | ||||||
|  | } | ||||||
|  | @ -0,0 +1,14 @@ | ||||||
|  | package model | ||||||
|  | 
 | ||||||
|  | // Disease 病害库
 | ||||||
|  | type Disease struct { | ||||||
|  | 	DiseaseId       int64  `xorm:"not null pk autoincr INT(11)" json:"diseaseId"` | ||||||
|  | 	DiseaseName     string `xorm:"varchar(200) not null " json:"diseaseName"` | ||||||
|  | 	DiseaseType     int    `xorm:"not null SMALLINT default 0" json:"diseaseType"` | ||||||
|  | 	DiseaseLevel    string `xorm:"varchar(20) not null" json:"diseaseLevel"` | ||||||
|  | 	DetectionMethod string `xorm:"varchar(200) not null " json:"detectionMethod"` | ||||||
|  | 	DiseaseDesc     string `xorm:"TEXT" json:"diseaseDesc"` | ||||||
|  | 	Reference       string `xorm:"varchar(200) not null " json:"reference"` //参照标准
 | ||||||
|  | 	CreateAt        int64  `xorm:"created" json:"createAt"` | ||||||
|  | 	UpdateAt        int64  `xorm:"updated" json:"updateAt"` | ||||||
|  | } | ||||||
|  | @ -0,0 +1,82 @@ | ||||||
|  | package model | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"fmt" | ||||||
|  | 	"github.com/go-redis/redis" | ||||||
|  | 	_ "github.com/go-sql-driver/mysql" | ||||||
|  | 	"go.uber.org/zap" | ||||||
|  | 	"hpds-iot-web/config" | ||||||
|  | 	"os" | ||||||
|  | 	"time" | ||||||
|  | 	"xorm.io/xorm" | ||||||
|  | 	"xorm.io/xorm/dialects" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | var ( | ||||||
|  | 	DB    *xorm.Engine | ||||||
|  | 	Redis *redis.Client | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | func New(driveName, dsn string) { | ||||||
|  | 	DB, _ = NewDbConnection(dsn) | ||||||
|  | 	DB.ShowSQL(true) | ||||||
|  | 	DB.Dialect().SetQuotePolicy(dialects.QuotePolicyReserved) | ||||||
|  | 	err := DB.Sync2( | ||||||
|  | 		&Brand{}, | ||||||
|  | 		&DetectionTask{}, | ||||||
|  | 		&Device{}, | ||||||
|  | 		&DeviceType{}, | ||||||
|  | 		&Disease{}, | ||||||
|  | 		&MatterAttribute{}, | ||||||
|  | 		&MatterCategory{}, | ||||||
|  | 		&MatterEvent{}, | ||||||
|  | 		&MatterEventParams{}, | ||||||
|  | 		&MatterModel{}, | ||||||
|  | 		&MatterService{}, | ||||||
|  | 		&MatterServiceParams{}, | ||||||
|  | 		&MatterVersion{}, | ||||||
|  | 		&Node{}, | ||||||
|  | 		&OriginalData{}, | ||||||
|  | 		&Owner{}, | ||||||
|  | 		&Project{}, | ||||||
|  | 		&SystemMenu{}, | ||||||
|  | 		&OperationLog{}, | ||||||
|  | 		&SystemRoleMenu{}, | ||||||
|  | 		&SystemRoleRoute{}, | ||||||
|  | 		&SystemRole{}, | ||||||
|  | 		&SystemUser{}, | ||||||
|  | 	) | ||||||
|  | 	if err != nil { | ||||||
|  | 		zap.L().Error("同步数据库表结构", zap.Error(err)) | ||||||
|  | 		os.Exit(1) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func NewDbConnection(dsn string) (db *xorm.Engine, err error) { | ||||||
|  | 	db, err = xorm.NewEngine("mysql", dsn) | ||||||
|  | 	if err != nil { | ||||||
|  | 		zap.L().Error("创建数据库连接", zap.Error(err)) | ||||||
|  | 		os.Exit(-1) | ||||||
|  | 	} | ||||||
|  | 	db.SetMaxOpenConns(300) | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func NewCache(c config.CacheConfig) { | ||||||
|  | 	Redis = redis.NewClient(&redis.Options{ | ||||||
|  | 		Addr:        fmt.Sprintf("%s:%d", c.Host, c.Port), | ||||||
|  | 		Password:    c.Pass,           // no password set
 | ||||||
|  | 		DB:          c.DB,             // use default DB
 | ||||||
|  | 		PoolSize:    c.PoolSize,       // Redis连接池大小
 | ||||||
|  | 		MaxRetries:  3,                // 最大重试次数
 | ||||||
|  | 		IdleTimeout: 10 * time.Second, // 空闲链接超时时间
 | ||||||
|  | 	}) | ||||||
|  | 	pong, err := Redis.Ping().Result() | ||||||
|  | 	if err == redis.Nil { | ||||||
|  | 		zap.L().Error("访问Redis异常", zap.Error(fmt.Errorf("redis.Nil"))) | ||||||
|  | 	} else if err != nil { | ||||||
|  | 		zap.L().Error("访问Redis异常", zap.Error(err)) | ||||||
|  | 	} else { | ||||||
|  | 		zap.L().Info("Redis连接成功", zap.String("pong", pong)) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -0,0 +1,20 @@ | ||||||
|  | package model | ||||||
|  | 
 | ||||||
|  | // MatterAttribute 物模型属性
 | ||||||
|  | type MatterAttribute struct { | ||||||
|  | 	AttributeId   int64  `xorm:"not null pk autoincr INT(11)" json:"attributeId"` | ||||||
|  | 	MatterId      int64  `xorm:"not null INT(11) index" json:"matterId"` | ||||||
|  | 	VersionId     int64  `xorm:"not null INT(11) default 0" json:"versionId"` | ||||||
|  | 	AttributeName string `xorm:"varchar(200) not null" json:"attributeName"` | ||||||
|  | 	AttributeKey  string `xorm:"varchar(200) not null" json:"attributeKey"` | ||||||
|  | 	AttributeDesc string `xorm:"varchar(200) not null" json:"attributeDesc"` | ||||||
|  | 	DataType      int    `xorm:"not null INT(11) default 0" json:"dataType"` | ||||||
|  | 	MaxValue      string `xorm:"varchar(200) " json:"maxValue"` | ||||||
|  | 	MinValue      string `xorm:"varchar(200)" json:"minValue"` | ||||||
|  | 	StepValue     string `xorm:"varchar(200) " json:"stepValue"` | ||||||
|  | 	Unit          string `xorm:"varchar(200) " json:"unit"` | ||||||
|  | 	IsOnlyRead    int    `xorm:"not null SMALLINT default 0" json:"isOnlyRead"` | ||||||
|  | 	Status        int    `xorm:"not null SMALLINT default 0" json:"status"` | ||||||
|  | 	CreateAt      int64  `xorm:"created" json:"createAt"` | ||||||
|  | 	UpdateAt      int64  `xorm:"updated" json:"updateAt"` | ||||||
|  | } | ||||||
|  | @ -0,0 +1,10 @@ | ||||||
|  | package model | ||||||
|  | 
 | ||||||
|  | type MatterCategory struct { | ||||||
|  | 	CategoryId   int64  `xorm:"not null pk autoincr INT(11)" json:"categoryId"` //
 | ||||||
|  | 	CategoryName string `xorm:"VARCHAR(40) not null" json:"categoryName"`       //
 | ||||||
|  | 	CategoryDesc string `xorm:"VARCHAR(200)" json:"categoryDesc"`               //
 | ||||||
|  | 	Status       int    `xorm:"SMALLINT not null default 0" json:"status"`      //
 | ||||||
|  | 	CreateAt     int64  `xorm:"created" json:"createAt"`                        //
 | ||||||
|  | 	UpdateAt     int64  `xorm:"updated" json:"updateAt"`                        //
 | ||||||
|  | } | ||||||
|  | @ -0,0 +1,13 @@ | ||||||
|  | package model | ||||||
|  | 
 | ||||||
|  | type MatterEvent struct { | ||||||
|  | 	EventId         int64  `xorm:"not null pk autoincr INT(11)" json:"eventId"` | ||||||
|  | 	MatterId        int64  `xorm:"not null INT(11) index" json:"matterId"` | ||||||
|  | 	VersionId       int64  `xorm:"not null INT(11)" json:"versionId"` | ||||||
|  | 	EventIdentifier string `xorm:"varchar(64) not null" json:"eventIdentifier"` //事件标识
 | ||||||
|  | 	EventType       string `xorm:"varchar(200) not null" json:"eventType"`      //事件类型
 | ||||||
|  | 	EventDesc       string `xorm:"varchar(200) not null" json:"eventDesc"`      //事件描述
 | ||||||
|  | 	Status          int    `xorm:"not null SMALLINT default 0" json:"status"` | ||||||
|  | 	CreateAt        int64  `xorm:"created" json:"createAt"` | ||||||
|  | 	UpdateAt        int64  `xorm:"updated" json:"updateAt"` | ||||||
|  | } | ||||||
|  | @ -0,0 +1,17 @@ | ||||||
|  | package model | ||||||
|  | 
 | ||||||
|  | type MatterEventParams struct { | ||||||
|  | 	ParamsId        int64  `xorm:"not null pk autoincr INT(11)" json:"paramsId"` | ||||||
|  | 	MatterId        int64  `xorm:"not null INT(11) default 0" json:"matterId"` | ||||||
|  | 	VersionId       int64  `xorm:"not null INT(11) default 0" json:"versionId"` | ||||||
|  | 	EventId         int64  `xorm:"not null INT(11) default 0" json:"eventId"` | ||||||
|  | 	ParamName       string `xorm:"varchar(200) not null" json:"paramName"`      //参数名称
 | ||||||
|  | 	ParamIdentifier string `xorm:"varchar(64) not null" json:"paramIdentifier"` //参数标识符
 | ||||||
|  | 	DataType        int    `xorm:"not null INT(11) default 0" json:"dataType"`  //数据类型
 | ||||||
|  | 	MaxValue        string `xorm:"varchar(200) " json:"maxValue"` | ||||||
|  | 	MinValue        string `xorm:"varchar(200)" json:"minValue"` | ||||||
|  | 	StepValue       string `xorm:"varchar(200) " json:"stepValue"` | ||||||
|  | 	Unit            string `xorm:"varchar(200) " json:"unit"` | ||||||
|  | 	CreateAt        int64  `xorm:"created" json:"createAt"` | ||||||
|  | 	UpdateAt        int64  `xorm:"updated" json:"updateAt"` | ||||||
|  | } | ||||||
|  | @ -0,0 +1,13 @@ | ||||||
|  | package model | ||||||
|  | 
 | ||||||
|  | // MatterModel 物模型
 | ||||||
|  | type MatterModel struct { | ||||||
|  | 	MatterId    int64  `xorm:"not null pk autoincr INT(11)" json:"matterId"` | ||||||
|  | 	MatterName  string `xorm:"varchar(200) not null" json:"matterName"` | ||||||
|  | 	CategoryId  int64  `xorm:"not null INT(11) default 0 index" json:"categoryId"` | ||||||
|  | 	Protocol    int    `xorm:"not null INT(11) default 0" json:"protocol"` | ||||||
|  | 	UserVersion int64  `xorm:"not null INT(11) default 0" json:"userVersion"` | ||||||
|  | 	Status      int    `xorm:"not null INT(11) default 0" json:"status"` | ||||||
|  | 	CreateAt    int64  `xorm:"created" json:"createAt"` | ||||||
|  | 	UpdateAt    int64  `xorm:"updated" json:"updateAt"` | ||||||
|  | } | ||||||
|  | @ -0,0 +1,14 @@ | ||||||
|  | package model | ||||||
|  | 
 | ||||||
|  | type MatterService struct { | ||||||
|  | 	ServiceId         int64  `xorm:"not null pk autoincr INT(11)" json:"serviceId"` | ||||||
|  | 	MatterId          int64  `xorm:"not null INT(11) index" json:"matterId"` | ||||||
|  | 	VersionId         int64  `xorm:"not null INT(11) default 0" json:"versionId"` | ||||||
|  | 	ServiceName       string `xorm:"varchar(200) not null" json:"serviceName"` | ||||||
|  | 	ServiceIdentifier string `xorm:"varchar(64) not null" json:"serviceIdentifier"` | ||||||
|  | 	Calling           int    `xorm:"not null SMALLINT default 0" json:"calling"` //调用方式, 同步、异步
 | ||||||
|  | 	ServiceDesc       string `xorm:"varchar(200) not null" json:"serviceDesc"`   //服务描述
 | ||||||
|  | 	Status            int    `xorm:"not null SMALLINT default 0" json:"status"` | ||||||
|  | 	CreateAt          int64  `xorm:"created" json:"createAt"` | ||||||
|  | 	UpdateAt          int64  `xorm:"updated" json:"updateAt"` | ||||||
|  | } | ||||||
|  | @ -0,0 +1,18 @@ | ||||||
|  | package model | ||||||
|  | 
 | ||||||
|  | type MatterServiceParams struct { | ||||||
|  | 	ParamsId        int64  `xorm:"not null pk autoincr INT(11)" json:"paramsId"` | ||||||
|  | 	MatterId        int64  `xorm:"not null INT(11) default 0" json:"matterId"` | ||||||
|  | 	VersionId       int64  `xorm:"not null INT(11) default 0" json:"versionId"` | ||||||
|  | 	ServiceId       int64  `xorm:"not null INT(11) default 0" json:"serviceId"` | ||||||
|  | 	ParamsOwnerType int    `xorm:"not null SMALLINT default 0" json:"paramsOwnerType"` //参数的所属类型,1:服务入参; 2:服务出参
 | ||||||
|  | 	ParamName       string `xorm:"varchar(200) not null" json:"paramName"`             //参数名称
 | ||||||
|  | 	ParamIdentifier string `xorm:"varchar(64) not null" json:"paramIdentifier"`        //参数标识符
 | ||||||
|  | 	DataType        int    `xorm:"not null INT(11) default 0" json:"dataType"`         //数据类型
 | ||||||
|  | 	MaxValue        string `xorm:"varchar(200) " json:"maxValue"` | ||||||
|  | 	MinValue        string `xorm:"varchar(200)" json:"minValue"` | ||||||
|  | 	StepValue       string `xorm:"varchar(200) " json:"stepValue"` | ||||||
|  | 	Unit            string `xorm:"varchar(200) " json:"unit"` | ||||||
|  | 	CreateAt        int64  `xorm:"created" json:"createAt"` | ||||||
|  | 	UpdateAt        int64  `xorm:"updated" json:"updateAt"` | ||||||
|  | } | ||||||
|  | @ -0,0 +1,11 @@ | ||||||
|  | package model | ||||||
|  | 
 | ||||||
|  | type MatterVersion struct { | ||||||
|  | 	VersionId   int64  `xorm:"not null pk autoincr INT(11)" json:"versionId"` | ||||||
|  | 	MatterId    int64  `xorm:"not null INT(11) default 0" json:"matterId"` | ||||||
|  | 	Version     string `xorm:"varchar(50) not null" json:"version"` | ||||||
|  | 	VersionDesc string `xorm:"varchar(200) not null" json:"versionDesc"` | ||||||
|  | 	Status      int    `xorm:"not null SMALLINT default 0" json:"status"` | ||||||
|  | 	CreateAt    int64  `xorm:"created" json:"createAt"` | ||||||
|  | 	UpdateAt    int64  `xorm:"updated" json:"updateAt"` | ||||||
|  | } | ||||||
|  | @ -0,0 +1,10 @@ | ||||||
|  | package model | ||||||
|  | 
 | ||||||
|  | type Model struct { | ||||||
|  | 	ModelId      int    `xorm:"not null pk autoincr INT(11)" json:"modelId"` | ||||||
|  | 	ModelName    string `xorm:"varchar(200) not null" json:"modelName"` | ||||||
|  | 	ModelVersion string `xorm:"varchar(50) not null" json:"modelVersion"` | ||||||
|  | 	ModelDesc    string `xorm:"varchar(200) not null" json:"modelDesc"` | ||||||
|  | 	CreateAt     int64  `xorm:"created" json:"createAt"` | ||||||
|  | 	UpdateAt     int64  `xorm:"updated" json:"updateAt"` | ||||||
|  | } | ||||||
|  | @ -0,0 +1,12 @@ | ||||||
|  | package model | ||||||
|  | 
 | ||||||
|  | type ModelVersion struct { | ||||||
|  | 	ModelId    int    `xorm:"not null pk autoincr INT(11)" json:"modelId"` | ||||||
|  | 	VersionId  int    `xorm:"not null INT(11) default 0" json:"versionId"` | ||||||
|  | 	Version    string `xorm:"varchar(50) not null" json:"version"` | ||||||
|  | 	ModelDesc  string `xorm:"varchar(200) not null" json:"modelDesc"` | ||||||
|  | 	UpdateDesc string `xorm:"varchar(200) not null" json:"updateDesc"` | ||||||
|  | 	Status     int    `xorm:"not null SMALLINT default 0" json:"status"` | ||||||
|  | 	CreateAt   int64  `xorm:"created" json:"createAt"` | ||||||
|  | 	UpdateAt   int64  `xorm:"updated" json:"updateAt"` | ||||||
|  | } | ||||||
|  | @ -0,0 +1,10 @@ | ||||||
|  | package model | ||||||
|  | 
 | ||||||
|  | type Node struct { | ||||||
|  | 	NodeId     int    `xorm:"not null pk autoincr INT(11)" json:"nodeId"` | ||||||
|  | 	NodeName   string `xorm:"varchar(50) not null" json:"nodeName"` | ||||||
|  | 	NodeType   int    `xorm:"not null SMALLINT default 0" json:"nodeType"` | ||||||
|  | 	NodeStatus int    `xorm:"not null SMALLINT default 0" json:"nodeStatus"` | ||||||
|  | 	CreateAt   int64  `xorm:"created" json:"createAt"` | ||||||
|  | 	UpdateAt   int64  `xorm:"updated" json:"updateAt"` | ||||||
|  | } | ||||||
|  | @ -0,0 +1,12 @@ | ||||||
|  | package model | ||||||
|  | 
 | ||||||
|  | // OriginalData 原始数据表
 | ||||||
|  | type OriginalData struct { | ||||||
|  | 	Id              int64  `xorm:"not null pk autoincr INT(11)" json:"id"` | ||||||
|  | 	EquipmentIp     string `xorm:"varchar(50)" json:"equipmentIp"`     //来源地址
 | ||||||
|  | 	ReceiptTime     int64  `xorm:"varchar(50)" json:"receiptTime"`     //接收时间
 | ||||||
|  | 	ReceiptNodeId   int64  `xorm:"varchar(50)" json:"receiptNodeId"`   //接收节点
 | ||||||
|  | 	ReceiptProtocol int64  `xorm:"varchar(50)" json:"receiptProtocol"` //接收协议
 | ||||||
|  | 	OriginalContent string `xorm:"TEXT" json:"originalContent"`        //原始内容
 | ||||||
|  | 	CreateAt        int64  `xorm:"created" json:"createAt"`            //入库时间
 | ||||||
|  | } | ||||||
|  | @ -0,0 +1,13 @@ | ||||||
|  | package model | ||||||
|  | 
 | ||||||
|  | type Owner struct { | ||||||
|  | 	OwnerId    int    `xorm:"not null pk autoincr INT(11)" json:"ownerId"` | ||||||
|  | 	OwnerName  string `xorm:"varchar(200) not null " json:"ownerName"` | ||||||
|  | 	ChargeUser string `xorm:"varchar(200) not null " json:"chargeUser"` | ||||||
|  | 	Phone      string `xorm:"varchar(100) not null " json:"phone"` | ||||||
|  | 	Creator    int64  `xorm:"INT(11) default 0" json:"creator"` | ||||||
|  | 	Modifier   int64  `xorm:"INT(11) default 0" json:"modifier"` | ||||||
|  | 	Status     int    `xorm:"SMALLINT default 1" json:"status"` | ||||||
|  | 	CreateAt   int64  `xorm:"created" json:"createAt"` | ||||||
|  | 	UpdateAt   int64  `xorm:"updated" json:"updateAt"` | ||||||
|  | } | ||||||
|  | @ -0,0 +1,20 @@ | ||||||
|  | package model | ||||||
|  | 
 | ||||||
|  | type Project struct { | ||||||
|  | 	ProjectId      int     `xorm:"not null pk autoincr INT(11)" json:"projectId"` | ||||||
|  | 	ProjectName    string  `xorm:"varchar(200) not null " json:"projectName"` | ||||||
|  | 	OwnerId        int     `xorm:"not null INT(11) default 0" json:"ownerId"` | ||||||
|  | 	LineName       string  `xorm:"varchar(200) not null " json:"lineName"` | ||||||
|  | 	StartName      string  `xorm:"varchar(200) not null " json:"startName"` | ||||||
|  | 	EndName        string  `xorm:"varchar(200) not null " json:"endName"` | ||||||
|  | 	FixedDeviceNum int     `xorm:"not null INT(11) default 0" json:"fixedDeviceNum"` | ||||||
|  | 	Direction      string  `xorm:"varchar(200) not null " json:"direction"` | ||||||
|  | 	LaneNum        int     `xorm:"not null INT(4) default 0" json:"laneNum"` | ||||||
|  | 	Lng            float64 `xorm:"decimal(18,6)" json:"lng"` | ||||||
|  | 	Lat            float64 `xorm:"decimal(18,6)" json:"lat"` | ||||||
|  | 	Status         int     `xorm:"SMALLINT default 1" json:"status"` | ||||||
|  | 	Creator        int64   `xorm:"INT(11) default 0" json:"creator"` | ||||||
|  | 	Modifier       int64   `xorm:"INT(11) default 0" json:"modifier"` | ||||||
|  | 	CreateAt       int64   `xorm:"created" json:"createAt"` | ||||||
|  | 	UpdateAt       int64   `xorm:"updated" json:"updateAt"` | ||||||
|  | } | ||||||
|  | @ -0,0 +1,24 @@ | ||||||
|  | package model | ||||||
|  | 
 | ||||||
|  | // SystemMenu 系统菜单
 | ||||||
|  | type SystemMenu struct { | ||||||
|  | 	MenuId         int64  `xorm:"not null pk autoincr INT(11)" json:"menuId"`       //路由ID
 | ||||||
|  | 	MenuName       string `xorm:"varchar(64) " json:"menuName"`                     //路由名
 | ||||||
|  | 	MenuPath       string `xorm:"varchar(200) " json:"menuPath"`                    //路由路径
 | ||||||
|  | 	Component      string `xorm:"varchar(64) " json:"component"`                    //组件名
 | ||||||
|  | 	Redirect       string `xorm:"varchar(200) not null default ''" json:"redirect"` //重定向地址
 | ||||||
|  | 	MenuUrl        string `xorm:"varchar(200) not null default ''" json:"menuUrl"`  //路由地址
 | ||||||
|  | 	MetaTitle      string `xorm:"varchar(128) " json:"metaTitle"`                   //标题
 | ||||||
|  | 	MetaIcon       string `xorm:"varchar(200) " json:"metaIcon"`                    //图标
 | ||||||
|  | 	AlwaysShow     int    `xorm:"not null INT default 1" json:"alwaysShow"`         //状态  0禁用 1启用
 | ||||||
|  | 	MetaAffix      int    `xorm:"not null INT default 0" json:"metaAffix"`          //meta属性  0禁用 1启用
 | ||||||
|  | 	Type           int    `xorm:"not null INT default 1" json:"type"`               //状态  0禁用 1启用
 | ||||||
|  | 	Hidden         int    `xorm:"not null INT default 0" json:"hidden"`             //是否隐藏  0不隐藏 1隐藏
 | ||||||
|  | 	Pid            int64  `xorm:"not null INT(11) default 0" json:"pid"`            //父节点ID
 | ||||||
|  | 	Sort           int    `xorm:"not null INT default 0" json:"sort"`               //排序
 | ||||||
|  | 	Level          int    `xorm:"not null INT(4) default 0" json:"level"`           //等级
 | ||||||
|  | 	Status         int    `xorm:"not null SMALLINT default 1" json:"status"`        //状态  0禁用 1启用
 | ||||||
|  | 	MetaBreadcrumb int    `xorm:"not null INT default 0" json:"metaBreadcrumb"`     //隐藏面包屑 0:不隐藏 1:隐藏
 | ||||||
|  | 	CreateAt       int64  `xorm:"created" json:"createAt"`                          //创建时间
 | ||||||
|  | 	UpdateAt       int64  `xorm:"updated" json:"updateAt"`                          //更新时间
 | ||||||
|  | } | ||||||
|  | @ -0,0 +1,15 @@ | ||||||
|  | package model | ||||||
|  | 
 | ||||||
|  | // OperationLog 操作行为日志表
 | ||||||
|  | type OperationLog struct { | ||||||
|  | 	Id            string `xorm:"not null pk autoincr INT(11)" json:"id"`                // 主键
 | ||||||
|  | 	Action        string `xorm:"VARCHAR(40) DEFAULT '' NOT NULL" json:"action"`         // 操作动作(新增,修改,删除)
 | ||||||
|  | 	Category      string `xorm:"VARCHAR(40) DEFAULT '' NOT NULL" json:"category"`       // 操作类型(用户/部门/角色/项目……)
 | ||||||
|  | 	TargetId      string `xorm:"VARCHAR(40) DEFAULT '' NOT NULL" json:"targetId"`       // 操作目标,用户/部门/角色/项目……
 | ||||||
|  | 	OldValue      string `xorm:"TEXT NOT NULL" json:"oldValue"`                         // 操作前旧值
 | ||||||
|  | 	NewValue      string `xorm:"TEXT NOT NULL" json:"newValue"`                         // 操作后新值
 | ||||||
|  | 	Operator      string `xorm:"VARCHAR(40) DEFAULT 'SYSDBA' NOT NULL" json:"operator"` // 操作者,默认为系统数据库管理员
 | ||||||
|  | 	OperateAddr   string `xorm:"VARCHAR(100) DEFAULT '' NOT NULL" json:"operateIP"`     // 操作者IP+端口信息
 | ||||||
|  | 	OperateDevice string `xorm:"VARCHAR(160) DEFAULT '' NOT NULL" json:"operateDevice"` // 操作设备类型
 | ||||||
|  | 	OperateTime   int64  `xorm:"created" json:"operateTime"`                            // 操作时间
 | ||||||
|  | } | ||||||
|  | @ -0,0 +1,11 @@ | ||||||
|  | package model | ||||||
|  | 
 | ||||||
|  | // SystemRoleMenu 角色菜单关联表
 | ||||||
|  | type SystemRoleMenu struct { | ||||||
|  | 	RoleMenuId int64 `xorm:"not null pk autoincr INT(11)" json:"roleMenuId"` //角色菜单ID
 | ||||||
|  | 	RoleId     int64 `xorm:"INT(11) default 1" json:"roleId"`                //角色ID
 | ||||||
|  | 	MenuId     int64 `xorm:"INT(11) default 1" json:"menuId"`                //菜单ID
 | ||||||
|  | 	Status     int   `xorm:"INT default 1" json:"status"`                    //状态  0禁用 1启用
 | ||||||
|  | 	CreateAt   int64 `xorm:"created" json:"createAt"`                        //创建时间
 | ||||||
|  | 	UpdateAt   int64 `xorm:"updated" json:"updateAt"`                        //更新时间
 | ||||||
|  | } | ||||||
|  | @ -0,0 +1,10 @@ | ||||||
|  | package model | ||||||
|  | 
 | ||||||
|  | // SystemRoleRoute 系统角色路由表
 | ||||||
|  | type SystemRoleRoute struct { | ||||||
|  | 	RoleId   int64 `xorm:"INT(11) default 1 pk" json:"roleId"`  //角色ID
 | ||||||
|  | 	RouteId  int64 `xorm:"INT(11) default 1 pk" json:"routeId"` //路由ID
 | ||||||
|  | 	Status   int   `xorm:"INT default 1" json:"status"`         //状态  0禁用 1启用
 | ||||||
|  | 	CreateAt int64 `xorm:"created" json:"createAt"`             //创建时间
 | ||||||
|  | 	UpdateAt int64 `xorm:"updated" json:"updateAt"`             //更新时间
 | ||||||
|  | } | ||||||
|  | @ -0,0 +1,13 @@ | ||||||
|  | package model | ||||||
|  | 
 | ||||||
|  | // SystemRole 系统角色表
 | ||||||
|  | type SystemRole struct { | ||||||
|  | 	RoleId      int64  `xorm:"not null pk autoincr INT(11)" json:"roleId"` //角色ID
 | ||||||
|  | 	RoleName    string `xorm:"VARCHAR(32)" json:"roleName"`                //角色名
 | ||||||
|  | 	RoleValue   string `xorm:"VARCHAR(32)" json:"roleValue"`               //角色值
 | ||||||
|  | 	AliasName   string `xorm:"VARCHAR(32)" json:"aliasName"`               //简称
 | ||||||
|  | 	Description string `xorm:"VARCHAR(32)" json:"description"`             //说明
 | ||||||
|  | 	Status      int    `xorm:"int not null default 1" json:"status"`       //状态  0禁用 1启用
 | ||||||
|  | 	CreateAt    int64  `xorm:"created" json:"createAt"`                    //创建时间
 | ||||||
|  | 	UpdateAt    int64  `xorm:"updated" json:"updateAt"`                    //更新时间
 | ||||||
|  | } | ||||||
|  | @ -0,0 +1,28 @@ | ||||||
|  | package model | ||||||
|  | 
 | ||||||
|  | import "fmt" | ||||||
|  | 
 | ||||||
|  | type SystemUser struct { | ||||||
|  | 	UserId   int64  `xorm:"not null pk autoincr INT(11)" json:"userId"` //用户编号
 | ||||||
|  | 	Phone    string `xorm:"VARCHAR(16)" json:"phone"`                   //手机号码
 | ||||||
|  | 	Avatar   string `xorm:"VARCHAR(200)" json:"avatar"`                 //头像
 | ||||||
|  | 	Desc     string `xorm:"VARCHAR(200)" json:"desc"`                   //用户描述
 | ||||||
|  | 	HomePath string `xorm:"VARCHAR(200)" json:"homePath"`               //进入的首页
 | ||||||
|  | 	Pass     string `xorm:"VARCHAR(128) not null" json:"pass"`          //密码
 | ||||||
|  | 	Salt     string `xorm:"VARCHAR(32) not null" json:"salt"`           //盐
 | ||||||
|  | 	RealName string `xorm:"VARCHAR(50)" json:"realName"`                //真实姓名
 | ||||||
|  | 	CreateAt int64  `xorm:"created" json:"createAt"`                    //创建时间
 | ||||||
|  | 	UpdateAt int64  `xorm:"updated" json:"updateAt"`                    //更新时间
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func GetUserById(userId int64) (*SystemUser, error) { | ||||||
|  | 	us := new(SystemUser) | ||||||
|  | 	h, err := DB.ID(userId).Get(us) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	if !h { | ||||||
|  | 		return nil, fmt.Errorf("未知用户") | ||||||
|  | 	} | ||||||
|  | 	return us, err | ||||||
|  | } | ||||||
|  | @ -0,0 +1,33 @@ | ||||||
|  | package model | ||||||
|  | 
 | ||||||
|  | type SystemUserRole struct { | ||||||
|  | 	UserRoleId int64 `xorm:"not null pk autoincr INT(11)" json:"userRoleId"` //用户编号
 | ||||||
|  | 	UserId     int64 `xorm:"INT(11)" json:"userId"`                          //用户ID
 | ||||||
|  | 	RoleId     int64 `xorm:"INT(11)" json:"roleId"`                          //角色ID
 | ||||||
|  | 	Status     int   `xorm:"SMALLINT default 0" json:"status"`               //状态  0禁用 1启用
 | ||||||
|  | 	CreateAt   int64 `xorm:"created" json:"createAt"`                        //创建时间
 | ||||||
|  | 	UpdateAt   int64 `xorm:"updated" json:"updateAt"`                        //更新时间
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func GetRolesByUserId(userId int64) []SystemRole { | ||||||
|  | 	us := new(SystemUser) | ||||||
|  | 	h, err := DB.ID(userId).Get(us) | ||||||
|  | 	if err != nil || !h { | ||||||
|  | 		return nil | ||||||
|  | 	} | ||||||
|  | 	roleList := make([]SystemUserRole, 0) | ||||||
|  | 	err = DB.Where("user_id = ? and status = 1", us.UserId).Find(&roleList) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil | ||||||
|  | 	} | ||||||
|  | 	roleIdList := make([]int64, len(roleList)) | ||||||
|  | 	for k, v := range roleList { | ||||||
|  | 		roleIdList[k] = v.RoleId | ||||||
|  | 	} | ||||||
|  | 	list := make([]SystemRole, 0) | ||||||
|  | 	err = DB.In("role_id", roleIdList).Find(&list) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil | ||||||
|  | 	} | ||||||
|  | 	return list | ||||||
|  | } | ||||||
|  | @ -0,0 +1,87 @@ | ||||||
|  | package discover | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"fmt" | ||||||
|  | 
 | ||||||
|  | 	"github.com/hashicorp/consul/api" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type ConsulConfig struct { | ||||||
|  | 	Client                         *api.Client `json:"client"`                         // consul client
 | ||||||
|  | 	ConsulAddress                  string      `json:"consulAddress"`                  // consul 服务地址:IP+port
 | ||||||
|  | 	ServiceId                      string      `json:"serviceId"`                      // 服务ID
 | ||||||
|  | 	ServiceName                    string      `json:"serviceName"`                    // 服务名称
 | ||||||
|  | 	ServiceIP                      string      `json:"serviceIP"`                      // 服务IP
 | ||||||
|  | 	ServicePort                    int         `json:"servicePort"`                    // 服务端口
 | ||||||
|  | 	Tags                           []string    `json:"tags"`                           // 服务标签列表
 | ||||||
|  | 	DeregisterCriticalServiceAfter int         `json:"deregisterCriticalServiceAfter"` // 指定与服务关联的检查应在此时间之后注销
 | ||||||
|  | 	Interval                       int         `json:"interval"`                       // 指定运行此检查的频率
 | ||||||
|  | 	Timeout                        int         `json:"timeout"`                        // 在脚本、HTTP、TCP 或 gRPC 检查的情况下指定传出连接的超时时间
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func NewConsulConfig(consulAddress string, | ||||||
|  | 	serviceId string, | ||||||
|  | 	serviceName string, | ||||||
|  | 	serviceIP string, | ||||||
|  | 	servicePort int, | ||||||
|  | 	tags []string, | ||||||
|  | 	deregisterCriticalServiceAfter int, | ||||||
|  | 	interval int, | ||||||
|  | 	timeout int) (*ConsulConfig, error) { | ||||||
|  | 	// 1.consul配置
 | ||||||
|  | 	config := api.DefaultConfig() | ||||||
|  | 	config.Address = consulAddress | ||||||
|  | 	// 2.client
 | ||||||
|  | 	client, err := api.NewClient(config) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	return &ConsulConfig{ | ||||||
|  | 		Client:                         client, | ||||||
|  | 		ConsulAddress:                  consulAddress, | ||||||
|  | 		ServiceId:                      serviceId, | ||||||
|  | 		ServiceName:                    serviceName, | ||||||
|  | 		ServiceIP:                      serviceIP, | ||||||
|  | 		ServicePort:                    servicePort, | ||||||
|  | 		Tags:                           tags, | ||||||
|  | 		DeregisterCriticalServiceAfter: deregisterCriticalServiceAfter, | ||||||
|  | 		Interval:                       interval, | ||||||
|  | 		Timeout:                        timeout, | ||||||
|  | 	}, nil | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // ServiceRegister 服务注册
 | ||||||
|  | func (cf *ConsulConfig) ServiceRegister() (err error) { | ||||||
|  | 	// 注册器
 | ||||||
|  | 	reg := &api.AgentServiceRegistration{ | ||||||
|  | 		ID:      cf.ServiceId, | ||||||
|  | 		Name:    cf.ServiceName, | ||||||
|  | 		Address: cf.ServiceIP, | ||||||
|  | 		Port:    cf.ServicePort, | ||||||
|  | 		Tags:    cf.Tags, | ||||||
|  | 		Check: &api.AgentServiceCheck{ | ||||||
|  | 			Interval:                       fmt.Sprintf("%vs", cf.Interval),                                  // 健康检查间隔
 | ||||||
|  | 			HTTP:                           fmt.Sprintf("http://%v:%v/health", cf.ServiceIP, cf.ServicePort), // HTTP 支持,执行健康检查的地址,service 会传到 Health.Check 函数中
 | ||||||
|  | 			Timeout:                        fmt.Sprintf("%vs", cf.Timeout),                                   // 健康检查超时时间
 | ||||||
|  | 			DeregisterCriticalServiceAfter: fmt.Sprintf("%vs", cf.DeregisterCriticalServiceAfter),            // 注销时间,相当于过期时间
 | ||||||
|  | 			Notes:                          "Consul check service health status.", | ||||||
|  | 		}, | ||||||
|  | 	} | ||||||
|  | 	// 注册服务
 | ||||||
|  | 	err = cf.Client.Agent().ServiceRegister(reg) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // ServiceDeregister 服务注销
 | ||||||
|  | func (cf *ConsulConfig) ServiceDeregister() error { | ||||||
|  | 	return cf.Client.Agent().ServiceDeregister(cf.ServiceId) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // ServiceDiscover 服务发现
 | ||||||
|  | func (cf *ConsulConfig) ServiceDiscover(service string, tags []string, q *api.QueryOptions) ([]*api.CatalogService, *api.QueryMeta, error) { | ||||||
|  | 	return cf.Client.Catalog().ServiceMultipleTags(service, tags, q) | ||||||
|  | } | ||||||
|  | @ -0,0 +1,83 @@ | ||||||
|  | package e | ||||||
|  | 
 | ||||||
|  | import "github.com/goccy/go-json" | ||||||
|  | 
 | ||||||
|  | const ( | ||||||
|  | 	UnKnow           = 1 | ||||||
|  | 	ValidErr         = 1000 | ||||||
|  | 	DbErr            = 2020 | ||||||
|  | 	IllegalPhone     = 2001 | ||||||
|  | 	NoAuth           = 401 | ||||||
|  | 	NoUser           = 2003 | ||||||
|  | 	ExistingUserName = 2004 | ||||||
|  | 	UnmarshalReqErr  = 3000 | ||||||
|  | 	Ordinary         = 6666 | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | func init() { | ||||||
|  | 	m := map[int]string{ | ||||||
|  | 		UnKnow:           "未定义错误", | ||||||
|  | 		ValidErr:         "无效的请求参数", | ||||||
|  | 		DbErr:            "数据库错误", | ||||||
|  | 		IllegalPhone:     "请输入正确的手机号码", | ||||||
|  | 		NoAuth:           "未授权", | ||||||
|  | 		NoUser:           "未找到对应用户", | ||||||
|  | 		ExistingUserName: "已经存在的用户", | ||||||
|  | 		UnmarshalReqErr:  "参数类型错误", | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	errMap[UnKnow] = &ApiError{ | ||||||
|  | 		Status:  500, | ||||||
|  | 		Code:    UnKnow, | ||||||
|  | 		Message: "未定义错误", | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	for k, v := range m { | ||||||
|  | 		errMap[k] = &ApiError{ | ||||||
|  | 			Status:  200, | ||||||
|  | 			Code:    k, | ||||||
|  | 			Message: v, | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | var errMap = map[int]*ApiError{} | ||||||
|  | 
 | ||||||
|  | func NewCode(code int) *ApiError { | ||||||
|  | 	if e, ok := errMap[code]; ok { | ||||||
|  | 		return e | ||||||
|  | 	} | ||||||
|  | 	return errMap[UnKnow] | ||||||
|  | } | ||||||
|  | func NewString(msg string) *ApiError { | ||||||
|  | 	return &ApiError{ | ||||||
|  | 		Status:  200, | ||||||
|  | 		Code:    Ordinary, | ||||||
|  | 		Message: msg, | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | func newErr(err *ApiError) *ApiError { | ||||||
|  | 	return &(*err) | ||||||
|  | } | ||||||
|  | func NewValidErr(err error) error { | ||||||
|  | 	if _, ok := err.(*json.UnmarshalTypeError); ok { | ||||||
|  | 		return newErr(errMap[UnmarshalReqErr]) | ||||||
|  | 	} | ||||||
|  | 	return err | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (e *ApiError) Set(msg string) *ApiError { | ||||||
|  | 	r := *e | ||||||
|  | 	r.Message = msg | ||||||
|  | 	return &r | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type ApiError struct { | ||||||
|  | 	Status  int    `json:"-"` | ||||||
|  | 	Code    int    `json:"code"` | ||||||
|  | 	Message string `json:"msg"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (e *ApiError) Error() string { | ||||||
|  | 	return e.Message | ||||||
|  | } | ||||||
|  | @ -0,0 +1,58 @@ | ||||||
|  | package e | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"git.hpds.cc/Component/gin_valid/gin/binding" | ||||||
|  | 	validator "git.hpds.cc/Component/gin_valid/go-playground/validator/v10" | ||||||
|  | 	"github.com/gin-gonic/gin" | ||||||
|  | 	"net/http" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type WrapperHandle func(c *gin.Context) (interface{}, error) | ||||||
|  | 
 | ||||||
|  | func ErrorWrapper(handle WrapperHandle) gin.HandlerFunc { | ||||||
|  | 	return func(c *gin.Context) { | ||||||
|  | 		data, err := handle(c) | ||||||
|  | 		if err != nil { | ||||||
|  | 			switch r := err.(type) { | ||||||
|  | 			case *ApiError: | ||||||
|  | 				c.JSON(r.Status, r) | ||||||
|  | 			case validator.ValidationErrors: | ||||||
|  | 				msg := r.Translate(binding.ValidTrans).Error() | ||||||
|  | 				c.JSON(http.StatusOK, gin.H{"code": "", "msg": msg}) | ||||||
|  | 			default: | ||||||
|  | 				er := NewValidErr(err) | ||||||
|  | 				c.JSON(http.StatusOK, gin.H{"code": 500, "msg": er.Error()}) | ||||||
|  | 			} | ||||||
|  | 			return | ||||||
|  | 		} | ||||||
|  | 		if data != nil { | ||||||
|  | 			c.JSON(http.StatusOK, data) | ||||||
|  | 		} else { | ||||||
|  | 			c.JSON(http.StatusOK, gin.H{"code": 200, "data": data}) | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | func ErrorWeChatWrapper(handle WrapperHandle) gin.HandlerFunc { | ||||||
|  | 	return func(c *gin.Context) { | ||||||
|  | 		data, err := handle(c) | ||||||
|  | 		if err != nil { | ||||||
|  | 			switch r := err.(type) { | ||||||
|  | 			case *ApiError: | ||||||
|  | 				c.JSON(r.Status, r) | ||||||
|  | 			case validator.ValidationErrors: | ||||||
|  | 				msg := r.Translate(binding.ValidTrans).Error() | ||||||
|  | 				c.JSON(http.StatusOK, gin.H{"code": "", "msg": msg}) | ||||||
|  | 			default: | ||||||
|  | 				er := NewValidErr(err) | ||||||
|  | 				c.JSON(http.StatusOK, gin.H{"code": 500, "msg": er.Error()}) | ||||||
|  | 			} | ||||||
|  | 			return | ||||||
|  | 		} | ||||||
|  | 		if data != nil { | ||||||
|  | 			c.JSON(http.StatusOK, gin.H{"code": "SUCCESS", "data": data}) | ||||||
|  | 		} else { | ||||||
|  | 			c.JSON(http.StatusOK, gin.H{"code": "SUCCESS", "message": "成功"}) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -0,0 +1,40 @@ | ||||||
|  | package utils | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"crypto/hmac" | ||||||
|  | 	"crypto/sha1" | ||||||
|  | 	"encoding/base64" | ||||||
|  | 	"math/rand" | ||||||
|  | 	"time" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | /* | ||||||
|  | 		RandomString 产生随机数 | ||||||
|  | 	  - size 随机码的位数 | ||||||
|  | 	  - kind 0    // 纯数字
 | ||||||
|  | 	    1    // 小写字母
 | ||||||
|  | 	    2    // 大写字母
 | ||||||
|  | 	    3    // 数字、大小写字母
 | ||||||
|  | */ | ||||||
|  | func RandomString(size int, kind int) string { | ||||||
|  | 	iKind, kinds, rsBytes := kind, [][]int{[]int{10, 48}, []int{26, 97}, []int{26, 65}}, make([]byte, size) | ||||||
|  | 	isAll := kind > 2 || kind < 0 | ||||||
|  | 	rand.Seed(time.Now().UnixNano()) | ||||||
|  | 	for i := 0; i < size; i++ { | ||||||
|  | 		if isAll { // random iKind
 | ||||||
|  | 			iKind = rand.Intn(3) | ||||||
|  | 		} | ||||||
|  | 		scope, base := kinds[iKind][0], kinds[iKind][1] | ||||||
|  | 		rsBytes[i] = uint8(base + rand.Intn(scope)) | ||||||
|  | 	} | ||||||
|  | 	return string(rsBytes) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func GetUserSha1Pass(pass, salt string) string { | ||||||
|  | 	key := []byte(salt) | ||||||
|  | 	mac := hmac.New(sha1.New, key) | ||||||
|  | 	mac.Write([]byte(pass)) | ||||||
|  | 	//进行base64编码
 | ||||||
|  | 	res := base64.StdEncoding.EncodeToString(mac.Sum(nil)) | ||||||
|  | 	return res | ||||||
|  | } | ||||||
|  | @ -0,0 +1,34 @@ | ||||||
|  | ### 业主列表 | ||||||
|  | 
 | ||||||
|  | POST http://localhost:8088/manage/owner/list | ||||||
|  | Content-Type: application/json | ||||||
|  | Cookie: token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdmF0YXIiOiIiLCJkZXNjIjoiIiwiaG9tZVBhdGgiOiIiLCJyZWFsTmFtZSI6IueOi-WJkSIsInJvbGVzIjpudWxsLCJ1c2VySWQiOjEsInBob25lIjoiMTg5MDY1MTc3ODgiLCJleHAiOjE2NzI5NzczODQsImlzcyI6IuS6pOenkemZoiJ9.8Zzp7efRlapptYYpvbc3hpHrKaAov0AJ7gYD8w9BZ2c | ||||||
|  | 
 | ||||||
|  | {"page": 1,"pageSize": 20} | ||||||
|  | 
 | ||||||
|  | ### 新增业主 | ||||||
|  | POST http://localhost:8088/manage/owner/add | ||||||
|  | Content-Type: application/json | ||||||
|  | Cookie: token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdmF0YXIiOiIiLCJkZXNjIjoiIiwiaG9tZVBhdGgiOiIiLCJyZWFsTmFtZSI6IueOi-WJkSIsInJvbGVzIjpudWxsLCJ1c2VySWQiOjEsInBob25lIjoiMTg5MDY1MTc3ODgiLCJleHAiOjE2NzI5NzczODQsImlzcyI6IuS6pOenkemZoiJ9.8Zzp7efRlapptYYpvbc3hpHrKaAov0AJ7gYD8w9BZ2c | ||||||
|  | 
 | ||||||
|  | {"ownerName": "浙大网新科技", | ||||||
|  | "chargeUser": "王剑", | ||||||
|  | "phone": "18906517788"} | ||||||
|  | 
 | ||||||
|  | ### 修改业主 | ||||||
|  | POST http://localhost:8088/manage/owner/edit | ||||||
|  | Content-Type: application/json | ||||||
|  | Cookie: token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdmF0YXIiOiIiLCJkZXNjIjoiIiwiaG9tZVBhdGgiOiIiLCJyZWFsTmFtZSI6IueOi-WJkSIsInJvbGVzIjpudWxsLCJ1c2VySWQiOjEsInBob25lIjoiMTg5MDY1MTc3ODgiLCJleHAiOjE2NzI5NzczODQsImlzcyI6IuS6pOenkemZoiJ9.8Zzp7efRlapptYYpvbc3hpHrKaAov0AJ7gYD8w9BZ2c | ||||||
|  | 
 | ||||||
|  | {"ownerId": 1, | ||||||
|  |   "ownerName": "浙大网新科技有限公司", | ||||||
|  | "chargeUser": "王剑", | ||||||
|  | "phone": "13033603311"} | ||||||
|  | 
 | ||||||
|  | ### 删除业主 | ||||||
|  | 
 | ||||||
|  | POST http://localhost:8088/manage/owner/delete | ||||||
|  | Content-Type: application/json | ||||||
|  | Cookie: token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdmF0YXIiOiIiLCJkZXNjIjoiIiwiaG9tZVBhdGgiOiIiLCJyZWFsTmFtZSI6IueOi-WJkSIsInJvbGVzIjpudWxsLCJ1c2VySWQiOjEsInBob25lIjoiMTg5MDY1MTc3ODgiLCJleHAiOjE2NzI5NzczODQsImlzcyI6IuS6pOenkemZoiJ9.8Zzp7efRlapptYYpvbc3hpHrKaAov0AJ7gYD8w9BZ2c | ||||||
|  | 
 | ||||||
|  | {"ownerId": 1} | ||||||
|  | @ -0,0 +1,11 @@ | ||||||
|  | ### 登录 | ||||||
|  | POST http://localhost:8088/user/login | ||||||
|  | Content-Type: application/json | ||||||
|  | 
 | ||||||
|  | {"username": "18906517788", "password": "123456"} | ||||||
|  | 
 | ||||||
|  | ### 获取用户信息 | ||||||
|  | GET http://localhost:8088/user/getUserInfo | ||||||
|  | Content-Type: application/json | ||||||
|  | Cookie: token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdmF0YXIiOiIiLCJkZXNjIjoiIiwiaG9tZVBhdGgiOiIiLCJyZWFsTmFtZSI6IueOi-WJkSIsInJvbGVzIjpudWxsLCJ1c2VySWQiOjEsInBob25lIjoiMTg5MDY1MTc3ODgiLCJleHAiOjE2NzI5NzczODQsImlzcyI6IuS6pOenkemZoiJ9.8Zzp7efRlapptYYpvbc3hpHrKaAov0AJ7gYD8w9BZ2c | ||||||
|  | 
 | ||||||
		Loading…
	
		Reference in New Issue