项目初始化
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