浏览代码

智能锁更新

all 4 年之前
父节点
当前提交
cc0ceda320
共有 37 个文件被更改,包括 2244 次插入0 次删除
  1. 43 0
      .gitignore
  2. 3 0
      smartdoorlock_/README.md
  3. 二进制
      smartdoorlock_/go_build_dashoo_cn_generaltriggerservice_api_linux
  4. 3 0
      smartdoorlock_/src/dashoo.cn/smartdoorlock_api/.gitattributes
  5. 45 0
      smartdoorlock_/src/dashoo.cn/smartdoorlock_api/.gitignore
  6. 8 0
      smartdoorlock_/src/dashoo.cn/smartdoorlock_api/README.MD
  7. 183 0
      smartdoorlock_/src/dashoo.cn/smartdoorlock_api/app/api/remote_control/remote_control.go
  8. 0 0
      smartdoorlock_/src/dashoo.cn/smartdoorlock_api/app/model/.gitkeep
  9. 0 0
      smartdoorlock_/src/dashoo.cn/smartdoorlock_api/app/service/.gitkeep
  10. 259 0
      smartdoorlock_/src/dashoo.cn/smartdoorlock_api/app/service/neo/base_neo.go
  11. 198 0
      smartdoorlock_/src/dashoo.cn/smartdoorlock_api/app/service/neo/neo.go
  12. 142 0
      smartdoorlock_/src/dashoo.cn/smartdoorlock_api/app/service/remote_control/base_remote_control.go
  13. 358 0
      smartdoorlock_/src/dashoo.cn/smartdoorlock_api/app/service/remote_control/remote_control.go
  14. 75 0
      smartdoorlock_/src/dashoo.cn/smartdoorlock_api/app/service/role/base_role.go
  15. 13 0
      smartdoorlock_/src/dashoo.cn/smartdoorlock_api/app/service/role/role.go
  16. 121 0
      smartdoorlock_/src/dashoo.cn/smartdoorlock_api/app/service/user/base_user.go
  17. 79 0
      smartdoorlock_/src/dashoo.cn/smartdoorlock_api/app/service/user/user.go
  18. 31 0
      smartdoorlock_/src/dashoo.cn/smartdoorlock_api/app/service/user/user_test.go
  19. 0 0
      smartdoorlock_/src/dashoo.cn/smartdoorlock_api/boot/.gitkeep
  20. 25 0
      smartdoorlock_/src/dashoo.cn/smartdoorlock_api/boot/boot.go
  21. 0 0
      smartdoorlock_/src/dashoo.cn/smartdoorlock_api/config/.gitkeep
  22. 46 0
      smartdoorlock_/src/dashoo.cn/smartdoorlock_api/config/config.toml
  23. 0 0
      smartdoorlock_/src/dashoo.cn/smartdoorlock_api/docfile/.gitkeep
  24. 17 0
      smartdoorlock_/src/dashoo.cn/smartdoorlock_api/go.mod
  25. 0 0
      smartdoorlock_/src/dashoo.cn/smartdoorlock_api/i18n/.gitkeep
  26. 355 0
      smartdoorlock_/src/dashoo.cn/smartdoorlock_api/library/gtoken/gtoken.go
  27. 92 0
      smartdoorlock_/src/dashoo.cn/smartdoorlock_api/library/gtoken/gtoken_resp.go
  28. 56 0
      smartdoorlock_/src/dashoo.cn/smartdoorlock_api/library/gtoken/gtoken_test.go
  29. 12 0
      smartdoorlock_/src/dashoo.cn/smartdoorlock_api/main.go
  30. 0 0
      smartdoorlock_/src/dashoo.cn/smartdoorlock_api/public/html/.gitkeep
  31. 0 0
      smartdoorlock_/src/dashoo.cn/smartdoorlock_api/public/plugin/.gitkeep
  32. 0 0
      smartdoorlock_/src/dashoo.cn/smartdoorlock_api/public/resource/css/.gitkeep
  33. 0 0
      smartdoorlock_/src/dashoo.cn/smartdoorlock_api/public/resource/image/.gitkeep
  34. 0 0
      smartdoorlock_/src/dashoo.cn/smartdoorlock_api/public/resource/js/.gitkeep
  35. 0 0
      smartdoorlock_/src/dashoo.cn/smartdoorlock_api/router/.gitkeep
  36. 80 0
      smartdoorlock_/src/dashoo.cn/smartdoorlock_api/router/router.go
  37. 0 0
      smartdoorlock_/src/dashoo.cn/smartdoorlock_api/template/.gitkeep

+ 43 - 0
.gitignore

@@ -0,0 +1,43 @@
+# Compiled Object files, Static and Dynamic libs (Shared Objects)
+*.o
+*.a
+*.so
+
+# Folders
+_obj
+_test
+
+# Architecture specific extensions/prefixes
+*.[568vq]
+[568vq].out
+
+*.cgo1.go
+*.cgo2.c
+_cgo_defun.c
+_cgo_gotypes.go
+_cgo_export.*
+
+_testmain.go
+
+*.exe
+*.test
+*.prof
+
+# dist目录
+sample/front_end
+dist
+
+# 生成的可执行文件
+sample/sample
+src/dashoo.cn/dqm_api/dqm_api
+src/dashoo.cn/dqm_frontend_server/dqm_frontend_server
+src/dashoo.cn/genepoint_interface/genepoint_interface
+
+pkg
+
+# beego临时文件
+lastupdate.tmp
+commentsRouter_*.go
+
+# Editor directories and files
+.idea

+ 3 - 0
smartdoorlock_/README.md

@@ -0,0 +1,3 @@
+# smart_emt
+
+智能设备管理终端

二进制
smartdoorlock_/go_build_dashoo_cn_generaltriggerservice_api_linux


+ 3 - 0
smartdoorlock_/src/dashoo.cn/smartdoorlock_api/.gitattributes

@@ -0,0 +1,3 @@
+*.js linguist-language=GO
+*.css linguist-language=GO
+*.html linguist-language=GO

+ 45 - 0
smartdoorlock_/src/dashoo.cn/smartdoorlock_api/.gitignore

@@ -0,0 +1,45 @@
+# Compiled Object files, Static and Dynamic libs (Shared Objects)
+*.o
+*.a
+*.so
+
+# Folders
+_obj
+_test
+
+# Architecture specific extensions/prefixes
+*.[568vq]
+[568vq].out
+
+*.cgo1.go
+*.cgo2.c
+_cgo_defun.c
+_cgo_gotypes.go
+_cgo_export.*
+
+_testmain.go
+
+*.exe
+*.test
+*.prof
+
+.buildpath
+.hgignore.swp
+.project
+.orig
+.swp
+.idea/
+.settings/
+.vscode/
+vender/
+vendor/
+log/
+composer.lock
+gitpush.sh
+pkg/
+bin/
+cbuild
+*/.DS_Store
+main
+.vscode
+go.sum

+ 8 - 0
smartdoorlock_/src/dashoo.cn/smartdoorlock_api/README.MD

@@ -0,0 +1,8 @@
+# Modi Project
+
+开发框架文档
+https://goframe.org
+
+
+ORM 生成数据表Model
+`./gf gen model -t base_role -l "mysql:dqmnt_user:Y6Ba64w1Hezo@tcp(39.98.34.197:3307)/dqmnt_db2"`

+ 183 - 0
smartdoorlock_/src/dashoo.cn/smartdoorlock_api/app/api/remote_control/remote_control.go

@@ -0,0 +1,183 @@
+package remote_control
+
+import (
+	"dashoo.cn/micro_libary/request"
+	"dashoo.cn/micro_libary/response"
+	"dashoo.cn/smartdoorlock_api/app/service/remote_control"
+	"encoding/hex"
+	"strings"
+	//"encoding/hex"
+	"fmt"
+	"github.com/gogf/gf/util/gvalid"
+
+	//"github.com/micro/go-micro/v2/client"
+
+	//"fmt"
+	"github.com/gogf/gf/net/ghttp"
+)
+// 角色API管理对象
+type Controller struct {
+}
+
+//RTU反馈 Udate
+func (c *Controller) RtuUdate(r *ghttp.Request) {
+	TopicMessage := new(remote_control.TopicMessage)
+	if err := r.Parse(TopicMessage); err != nil {
+		// 数据验证错误
+		if v, ok := err.(*gvalid.Error); ok {
+			response.Json(r, 1, v.FirstString())
+			r.ExitAll()
+		}
+		// 其他错误
+		response.Json(r, 1, err.Error())
+		r.ExitAll()
+	}
+	//处理设备byte【】
+	command, err := hex.DecodeString(TopicMessage.Payload)
+	if err != nil {
+		fmt.Println("err", err)
+	}
+	//取出设备编号
+	//code := strings.Split(TopicMessage.Topic, "/")
+	fmt.Println("----设备编号------",TopicMessage.Topic)
+	fmt.Println("----command------", command)
+
+	response.Json(r, 0,TopicMessage.Topic)
+}
+
+//RTU下发 CMD
+func (c *Controller) RtuSeedCmd(r *ghttp.Request) {
+	TagCode := r.GetString("code")
+	command := r.GetString("instruction")
+	ygnick := r.GetString("ygnick")
+	ygopenid := r.GetString("ygopenid")
+	seriallist :=  r.GetString("seriallist")
+	if strings.Index(seriallist,TagCode) == -1 {
+		response.Json(r, 4, "用户无权限")
+	}
+	fmt.Println("---111-----")
+	//获取用户名及对应编码
+	var channelslist remote_control.Channels
+	if err := remote_control.GetChannelsname(TagCode,&channelslist); err != nil {
+		fmt.Println("----err---",err)
+		response.Json(r, 3, "无此权限")
+	} else {
+	ccoed := "sg/cmd/" +channelslist.Serial
+	if ygopenid == "" {
+		response.Json(r, 2, "", "生成失败")
+		fmt.Println("---生成失败-----")
+	} else {
+		command = "SHELL:@" + command
+		fmt.Println("-Topic:-", ccoed, command)
+		var userlist remote_control.Base_user
+		if err := remote_control.GetBase_username(ygopenid, &userlist); err != nil {
+			response.Json(r, 1, "请重新登录")
+			fmt.Println("---请重新登录-----")
+		} else {
+			if err := remote_control.SaveTriggerHistory(userlist.DepartmentName,channelslist.Title,channelslist.Serial, command, ygnick, userlist.Realname, userlist.UserName, ygopenid,1); err != nil {
+				response.Json(r, 1, "", "保存历史失败")
+				fmt.Println("---保存历史失败-----")
+			} else {
+				//MQTT发送
+				remote_control.MqttSend(ccoed, command)
+				response.Json(r, 0, "", "")
+			}
+		}
+	}
+	}
+}
+
+//RTU下发 CMD
+func (c *Controller) RtuButtonSeedCmd(r *ghttp.Request) {
+	Code := r.GetString("code")
+	command := r.GetString("instruction")
+	ygnick := r.GetString("ygnick")
+	ygopenid := r.GetString("ygopenid")
+
+	//获取用户名及对应编码
+	var channelslist remote_control.Channels
+	if err := remote_control.GetChannelsnamebycode(Code,&channelslist); err != nil {
+		fmt.Println("----err---",err)
+		response.Json(r, 3, "无此权限")
+	} else {
+		ccoed := "sg/cmd/" +channelslist.Serial
+		if ygopenid == "" {
+			response.Json(r, 2, "", "生成失败")
+			fmt.Println("---生成失败-----")
+		} else {
+			command = "SHELL:@" + command
+			fmt.Println("-Topic:-", ccoed, command)
+			var userlist remote_control.Base_user
+			if err := remote_control.GetBase_username(ygopenid, &userlist); err != nil {
+				response.Json(r, 1, "请重新登录")
+				fmt.Println("---请重新登录-----")
+			} else {
+				//MQTT发送
+				remote_control.MqttSend(ccoed, command)
+				if err := remote_control.SaveTriggerHistory(userlist.DepartmentName,channelslist.Title,channelslist.Serial, command, ygnick, userlist.Realname, userlist.UserName, ygopenid,1); err != nil {
+					response.Json(r, 1, "", "保存历史失败")
+					fmt.Println("---保存历史失败-----")
+				} else {
+					response.Json(r, 0, "", "")
+				}
+			}
+		}
+	}
+}
+
+//获取操作历史
+func (c *Controller) GetTriggerHistory(r *ghttp.Request) {
+	page := request.GetPageInfo(r)
+	code := r.GetString("code")
+	where := " 1 = 1 "
+	if code != ""{
+		where = where + " and  ChannelCode = " + code
+	}
+	var list []remote_control.Record_History
+	if count,err := remote_control.GetTriggerHistory(page.Current, page.Size,&list,where); err != nil {
+		response.Json(r, 1, err.Error())
+	} else {
+		var records response.PagedRecords
+		records.Size = page.Size
+		records.Current = page.Current
+		records.Total = count
+		records.Records = list
+		response.Json(r, 0, "ok", records)
+	}
+}
+
+//面部识别回调
+func (c *Controller) SetIdentifyCallBack(r *ghttp.Request) {
+	//body,_ := ioutil.ReadAll(r.Body)
+	//str := string(body)
+	//fmt.Println("----r.Body--",str)
+	//aa :=ReadImgData("http://47.92.238.200:8081/static/equipmentimg/face/zyw.jpg")
+	//fmt.Println("-====aa==",aa)
+	CallBack := new(remote_control.CallBack)
+	if err := r.Parse(CallBack); err != nil {
+		// 数据验证错误
+		if v, ok := err.(*gvalid.Error); ok {
+			response.Json(r, 1, v.FirstString())
+			r.ExitAll()
+		}
+		// 其他错误
+		response.Json(r, 1, err.Error())
+		r.ExitAll()
+	}
+	r.Response.WriteJson(remote_control.Result{
+		Result: 1,
+		Success:  true,
+	})
+	r.Exit()
+}
+
+//人员注册
+func (c *Controller) PersonCreate(r *ghttp.Request) {
+
+	//人员注册
+	remote_control.PersonCreate("025")
+	// 照片下发
+	remote_control.FaceCreate("025")
+}
+
+

+ 0 - 0
smartdoorlock_/src/dashoo.cn/smartdoorlock_api/app/model/.gitkeep


+ 0 - 0
smartdoorlock_/src/dashoo.cn/smartdoorlock_api/app/service/.gitkeep


+ 259 - 0
smartdoorlock_/src/dashoo.cn/smartdoorlock_api/app/service/neo/base_neo.go

@@ -0,0 +1,259 @@
+// ==========================================================================
+// This is auto-generated by gf cli tool. You may not really want to edit it.
+// ==========================================================================
+
+package neo
+
+import (
+	"database/sql"
+	"github.com/gogf/gf/database/gdb"
+	"github.com/gogf/gf/frame/g"
+	"github.com/gogf/gf/os/gtime"
+	"time"
+)
+
+// Entity is the golang structure for table neo_test.
+type BaseNeo struct {
+	Id          int    `orm:"id,primary"  json:"id"`          //
+	Cid         int    `orm:"cid"  json:"cid"`                //
+	Name        string `orm:"name"        json:"name"`        //
+	Description string `orm:"description" json:"description"` //
+	CreateTime  int    `orm:"create_time" json:"create_time"` //
+	CeshiDesc   int    `orm:"ceshi_desc" json:"ceshi_desc"`   //
+	CreateOn    string `orm:"create_on" json:"create_on"`     //
+}
+type BaseNeoClass struct {
+	BaseNeo
+	Stclass string `orm:"st_class" json:"st_class"` //
+}
+
+type BaseTable struct {
+	Id  int    `orm:"id,primary"  json:"id"`
+	K   string `orm:"k"  json:"k"`
+	K1  string `orm:"k1" json:"k1"`
+	K2  string `orm:"k2" json:"k2"`
+	K3  string `orm:"k3" json:"k3"`
+	K4  string `orm:"k4" json:"k4"`
+	K5  string `orm:"k5" json:"k5"`
+	K6  string `orm:"k6" json:"k6"`
+	K7  string `orm:"k7" json:"k7"`
+	K8  string `orm:"k8" json:"k8"`
+	K9  string `orm:"k9" json:"k9"`
+	K10 string `orm:"k10" json:"k10"`
+	K11 string `orm:"k11" json:"k11"`
+	K12 string `orm:"k12" json:"k12"`
+}
+
+type GeneBoardTable struct {
+	Id            int         `orm:"Id,primary"    json:"id"`              //
+	BoardNum      string      `orm:"BoardNum"      json:"board_num"`       // 板号
+	BoardDay      string      `orm:"BoardDay"      json:"board_day"`       // 年月日
+	LNum          int         `orm:"LNum"          json:"l_num"`           // 剩余孔
+	BoardTestType string      `orm:"BoardTestType" json:"board_test_type"` // 测序类型
+	CreateOn      *gtime.Time `orm:"CreateOn"      json:"create_on"`       //
+	IsNew         string      `orm:"IsNew"      json:"is_new"`             //
+}
+
+type GeneBoardTableInfo struct {
+	Id      int    `orm:"id,primary"  json:"id"`
+	K       string `orm:"k"  json:"k"`
+	K1      string `orm:"k1" json:"k1"`
+	K2      string `orm:"k2" json:"k2"`
+	K3      string `orm:"k3" json:"k3"`
+	K4      string `orm:"k4" json:"k4"`
+	K5      string `orm:"k5" json:"k5"`
+	K6      string `orm:"k6" json:"k6"`
+	K7      string `orm:"k7" json:"k7"`
+	K8      string `orm:"k8" json:"k8"`
+	K9      string `orm:"k9" json:"k9"`
+	K10     string `orm:"k10" json:"k10"`
+	K11     string `orm:"k11" json:"k11"`
+	K12     string `orm:"k12" json:"k12"`
+	BoardId int    `orm:"BoardId" json:"board_id"`
+}
+
+type Instrument struct {
+	Id                      int       `xorm:"not null pk autoincr INT(10)"`
+	Code                    string    `xorm:"VARCHAR(50)"`      //设备编码
+	Name                    string    `xorm:"VARCHAR(255)"`     //设备名称
+	SupplierId              int       `xorm:"INT(10)"`          //供应商Id
+	Supplier                string    `xorm:"VARCHAR(255)"`     //供应商
+	FactoryNum 				string    `xorm:"VARCHAR(255)"` 	//出厂编号
+	Model                   string    `xorm:"VARCHAR(255)"`     //型号
+	Brand                   string    `xorm:"VARCHAR(255)"`     //设备品牌
+	Classification          string    `xorm:"VARCHAR(255)"`     //设备大类
+	Location                string    `xorm:"VARCHAR(50)"`      //设备所在位置
+	Remarks                 string    `xorm:"VARCHAR(255)"`     //备注
+	State                   int       `xorm:"INT(10)"`          //设备状态 1正常 2异常
+	CalibrationTime         time.Time `xorm:"DATETIME"`         //校准时间
+	CalibrationDeadline     int       `xorm:"INT(10)"`          //校准使用期限
+	CalibrationDeadlineType int       `xorm:"INT(10)"`          //期限类型:1:天 2:周 3:月 4:年
+	MaintenCycle            int       `xorm:"INT(10)"`          //维护周期数
+	CycleType               int       `xorm:"INT(10)"`          //维护周期类型
+	FileUrl                 string    `xorm:"VARCHAR(50)"`      //操作规程文件路径
+	FileName                string    `xorm:"VARCHAR(50)"`      //操作规程文件名称
+	HeartbeatTime           time.Time `xorm:"DATETIME created"` //心跳时间 对应服务器时间
+	IsFixedPoint            int       `xorm:"INT(2)"`
+	CreateOn                time.Time `xorm:"DATETIME created"`
+	CreateUserId            int       `xorm:"INT(10)"`
+	CreateBy                string    `xorm:"VARCHAR(50)"`
+	ModifiedOn              time.Time `xorm:"DATETIME updated"`
+	ModifiedUserId          int       `xorm:"INT(10)"`
+	ModifiedBy              string    `xorm:"VARCHAR(50)"`
+	Remark                  string    `xorm:"VARCHAR(50)"`
+	TimeNotification        int       `xorm:"INT(10)"`
+	Sharable                int       `xorm:"TINYINT"`
+	Responsible             string    `xorm:"VARCHAR(50)"` //责任人
+	EndTime                 time.Time `xorm:"DATETIME"`    //截止日期
+	Purchasedate            time.Time `xorm:"DATETIME"`    //采购日期
+	MaintenTime             time.Time `xorm:"DATE"`        //维护日期
+	JoinPlan                bool      `xorm:"TINYINT"`     //是否参与点检计划
+}
+//入库表
+type Bank_Apply_Main struct {
+	Id             int       `xorm:"not null pk autoincr INT(10)"`
+	EntryNo        string    `xorm:"VARCHAR(50)"`
+	ApplyType      int       `xorm:"int(10)"`
+	ApplyStatus    int       `xorm:"int(10)"`
+	OperationBy    string    `xorm:"VARCHAR(50)"`
+	Section        string    `xorm:"VARCHAR(50)"`
+	EntryTime      time.Time `xorm:"DATETIME"`
+	ConUserId      int       `xorm:"int(10)"`
+	ConUserBy      string    `xorm:"VARCHAR(50)"`
+	ConTime        time.Time `xorm:"DATETIME"`
+	Remark         string    `xorm:"VARCHAR(255)"`
+	Exception 	   string	 `xorm:"VARCHAR(512)"`
+	AuditorRemark  string    `xorm:"VARCHAR(255)"`
+	CreateOn       time.Time `xorm:"DATETIME created"` //创建时间
+	CreateUserId   int       `xorm:"INT(10)"`
+	CreateBy       string    `xorm:"VARCHAR(50)"` //创建人
+	ModifiedOn     time.Time `xorm:"DATETIME updated"`
+	ModifiedUserId int       `xorm:"INT(10)"`
+	ModifiedBy     string    `xorm:"VARCHAR(50)"`
+	TaskStatus	   int		 `xorm:"INT(10)"`
+	Reason         int		 `xorm:"INT(10)"`
+	ApplyCount     string    `xorm:"VARCHAR(50)"`
+}
+//入库子表
+type Bank_Apply_Detail struct {
+	Id             int       `xorm:"not null pk autoincr INT(10)"`
+	ParentId       int       `xorm:"int(10)"` //父类id
+	BarCode        string    `xorm:"VARCHAR(50)"`
+	SampleCode     string    `xorm:"VARCHAR(50)"`
+	SampleType     int       `xorm:"INT(10)"`
+	SampleTypeName string    `xorm:"VARCHAR(50)"` //样本类型
+	InitCapacity   float32   `xorm:"FLOAT"`
+	Capacity       float32   `xorm:"FLOAT"`
+	TaskStatus	   int		 `xorm:"INT(4)"`
+	Unit           string    `xorm:"VARCHAR(50)"`
+	GroupID		   string    `xorm:"VARCHAR(50)"`
+	EquipmentId    int       `xorm:"INT(10)"`
+	ShelfId        int       `xorm:"INT(10)"`
+	BoxId          int       `xorm:"INT(10)"`
+	Position       string    `xorm:"VARCHAR(50)"` //位置 冻存盒的 X代表第几列 Y代表第几行  X;
+	PositionInfo      string    `xorm:"VARCHAR(100)"` //列表中显示的位置信息(容器+层+盒+position)
+	CHUserId       int       `xorm:"INT(10)"`
+	CHUserBy       string    `xorm:"VARCHAR(50)"`
+	CancelId       int       `xorm:"INT(10)"`
+	CancelBy       string    `xorm:"VARCHAR(50)"`
+	DetailStatus   int       `xorm:"int(10)"`
+	CreateOn       time.Time `xorm:"DATETIME created"` //创建时间
+	CreateUserId   int       `xorm:"INT(10)"`
+	CreateBy       string    `xorm:"VARCHAR(50)"` //创建人
+	ModifiedOn     time.Time `xorm:"DATETIME updated"`
+	ModifiedUserId int       `xorm:"INT(10)"`
+	ModifiedBy     string    `xorm:"VARCHAR(50)"`
+	RecoveryId     int       `xorm:INT(10)`
+	DetailId       int       `xorm:INT(10)`
+	IsLocked       int        `xorm:INT(10)`
+	Reason         int       `xorm:INT(10)`
+
+}
+//维修保养
+type InstrumenMaintainLog struct {
+	Id             int       `xorm:"not null pk autoincr INT(10)"`
+	InstrumenId    int       `xorm:"INT(10)"`      //设备id
+	InstrumenName  string    `xorm:"VARCHAR(50)"`  //设备名称
+	InstrumenCode  string    `xorm:"VARCHAR(50)"`  //设备编号
+	OperaRemark    string    `xorm:"VARCHAR(500)"` //操作说明
+	OperaTpye      string    `xorm:"VARCHAR(50)"`  //操作类型
+	TypeCode       int       `xorm:"INT(2)"`       //操作类型编号
+	OperaUser      string    `xorm:"VARCHAR(50)"`  //操作人
+	OperaOn        time.Time `xorm:"DATETIME"`     //操作日期
+	CreateOn       time.Time `xorm:"DATETIME created"`
+	CreateUserId   int       `xorm:"INT(10)"`
+	CreateBy       string    `xorm:"VARCHAR(50)"`
+	ModifiedOn     time.Time `xorm:"DATETIME updated"`
+	ModifiedUserId int       `xorm:"INT(10)"`
+	ModifiedBy     string    `xorm:"VARCHAR(50)"`
+}
+//曲线报表
+type AutoGenerated struct {
+	Results []Results `json:"results"`
+}
+type Series struct {
+	Name string `json:"name"`
+	Columns []string `json:"columns"`
+	Values []interface{} `json:"values"`
+}
+type Results struct {
+	Series []Series `json:"series"`
+}
+
+type GeneBoardTableEmpty struct {
+	Id  int    `orm:"id,primary"  json:"id"`
+	K   string `orm:"k"  json:"k"`
+	K1  string `orm:"k1" json:"k1"`
+	K2  string `orm:"k2" json:"k2"`
+	K3  string `orm:"k3" json:"k3"`
+	K4  string `orm:"k4" json:"k4"`
+	K5  string `orm:"k5" json:"k5"`
+	K6  string `orm:"k6" json:"k6"`
+	K7  string `orm:"k7" json:"k7"`
+	K8  string `orm:"k8" json:"k8"`
+	K9  string `orm:"k9" json:"k9"`
+	K10 string `orm:"k10" json:"k10"`
+	K11 string `orm:"k11" json:"k11"`
+	K12 string `orm:"k12" json:"k12"`
+}
+
+var (
+	TableBaseNeo = "neo_test"
+	ModelBaseNeo = g.DB("default").Table(TableBaseNeo).Safe()
+)
+
+var (
+	Tablebank_apply_detail = "bank_apply_detail"
+	Modelbank_apply = g.DB("default").Table(Tablebank_apply_detail).Safe()
+)
+
+// Inserts does "INSERT...INTO..." statement for inserting current object into table.
+func (r *BaseNeo) Insert() (result sql.Result, err error) {
+	return ModelBaseNeo.Data(r).Insert()
+}
+
+// Replace does "REPLACE...INTO..." statement for inserting current object into table.
+// If there's already another same record in the table (it checks using primary key or unique index),
+// it deletes it and insert this one.
+func (r *BaseNeo) Replace() (result sql.Result, err error) {
+	return ModelBaseNeo.Data(r).Replace()
+}
+
+// Save does "INSERT...INTO..." statement for inserting/updating current object into table.
+// It updates the record if there's already another same record in the table
+// (it checks using primary key or unique index).
+func (r *BaseNeo) Save() (result sql.Result, err error) {
+	return ModelBaseNeo.Data(r).Save()
+}
+
+// Update does "UPDATE...WHERE..." statement for updating current object from table.
+// It updates the record if there's already another same record in the table
+// (it checks using primary key or unique index).
+func (r *BaseNeo) Update() (result sql.Result, err error) {
+	return ModelBaseNeo.Data(r).Where(gdb.GetWhereConditionOfStruct(r)).Update()
+}
+
+// Delete does "DELETE FROM...WHERE..." statement for deleting current object from table.
+func (r *BaseNeo) Delete() (result sql.Result, err error) {
+	return ModelBaseNeo.Where(gdb.GetWhereConditionOfStruct(r)).Delete()
+}

+ 198 - 0
smartdoorlock_/src/dashoo.cn/smartdoorlock_api/app/service/neo/neo.go

@@ -0,0 +1,198 @@
+package neo
+
+import (
+	"database/sql"
+	"encoding/json"
+	"fmt"
+	"github.com/gogf/gf/database/gdb"
+	"github.com/gogf/gf/frame/g"
+	"github.com/gogf/gf/os/gtime"
+	"io/ioutil"
+	"net/http"
+	"strconv"
+	"time"
+)
+
+var (
+	// 表对象
+	table = g.DB().Table("neo_test t").Safe()
+	//设备管理表
+	table2 = g.DB().Table("instrument").Safe()
+	//入库表
+	table3 = g.DB().Table("bank_apply_detail b").Safe()
+	//维修保养表
+	table4 = g.DB().Table("instrumenmaintainlog").Safe()
+
+	table5 = g.DB().Table("gene_board_table_info").Safe()
+
+	table6 = g.DB().Table("gene_board_table_empty").Safe()
+)
+
+func GetList(where, order string, curPage, pageSize int, listPtr *[]BaseNeoClass) (total int, err error) {
+	err = table.LeftJoin("neo_class c", "t.cid=c.id").Fields("t.*,c.st_class").Where(where).OrderBy(order).Limit((curPage-1)*pageSize, pageSize).Scan(listPtr)
+	if err != nil {
+		return 0, err
+	}
+	total, err = ModelBaseNeo.Where(where).Count()
+	if err != nil {
+		return 0, err
+	}
+	return total, nil
+}
+
+func UpdateNeo(id int, theNeo *BaseNeoClass) error {
+	record := gdb.Map{
+		"Name":        theNeo.Name,
+		"Description": theNeo.Description,
+		"ceshi_desc":  theNeo.CeshiDesc,
+		"cid":         theNeo.Stclass,
+	}
+	_, err := ModelBaseNeo.Data(record).Where("Id", id).Update()
+	return err
+}
+
+func SaveNeo(theNeo *BaseNeoClass) error {
+	record := gdb.Map{
+		"Name":        theNeo.Name,
+		"Description": theNeo.Description,
+		"ceshi_desc":  theNeo.CeshiDesc,
+		"create_on":   gtime.Now(),
+		"cid":         theNeo.Stclass,
+	}
+
+	_, err := table2.Data(record).Save()
+	return err
+}
+
+func GetStById(id int, listPtr *BaseNeoClass) (err error) {
+	err = table.LeftJoin("neo_class c", "t.cid=c.id").Fields("t.*,c.st_class").Where("t.id=?", id).Scan(listPtr)
+
+	if err != nil && err != sql.ErrNoRows {
+		return err
+	}
+	return nil
+}
+
+//获取单个设备
+func GetIntById(id int, listPtr *Instrument) (err error) {
+	err = table2.Where("Id =" + strconv.Itoa(id)).Scan(listPtr)
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
+//获取入库单
+func GetSampleRKbyEquipmentId(id int, order string, curPage, pageSize int,listPtr *[]Bank_Apply_Main) (err error) {
+	err = table3.LeftJoin("bank_apply_main a", "a.Id = b.ParentId").Fields("a.*").Where("b.EquipmentId = ? and b.DetailStatus = 2", id).OrderBy(order).Limit((curPage-1)*pageSize, pageSize).Group("(a.EntryNo)").Scan(listPtr)
+	if err != nil {
+		return  err
+	}
+	return  nil
+}
+
+
+//获取维修保养
+func GetmaintainlogbyInstrumenId(id int, order string, curPage, pageSize int,listPtr *[]InstrumenMaintainLog) (err error) {
+	err = table4.Where("InstrumenId =" + strconv.Itoa(id)).OrderBy(order).Limit((curPage-1)*pageSize, pageSize).Scan(listPtr)
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
+//获取设备管理曲线报表
+func GetbyCode(id string,listPtr *AutoGenerated) (err error) {
+	client := &http.Client{}
+	nowtm := time.Now().Unix()
+	beforetime := strconv.FormatInt(nowtm - 3*24*60*60,10)
+	nowtime := strconv.FormatInt(nowtm,10)
+	strUrl := "http://47.92.238.200:18010/v1/channels/c"+ id +"/datapoints?start="+ beforetime +"&end=" + nowtime
+
+	req, err := http.NewRequest("GET", strUrl,nil)
+	req.Header.Add("Content-Type", "application/json")
+	req.Header.Add("apikey", "301c6bbe78b07cfd07376794f64c6bf6")
+	resp, err := client.Do(req)
+
+	fmt.Println("resp= ", resp)
+	if resp != nil {
+		defer resp.Body.Close()
+	}
+	jsonBlob, _ := ioutil.ReadAll(resp.Body)
+	json.Unmarshal(jsonBlob, &listPtr)
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
+func DeleteNeo(where string) error {
+	_, err := ModelBaseNeo.Delete(where)
+	return err
+}
+
+func GetTable(listPtr *[]BaseTable) (err error) {
+	err = table3.Scan(listPtr)
+	if err != nil {
+		return err
+	}
+
+	return nil
+}
+
+//查询有没有符合条件的Table,有就返还数据,没有就新建60条数据
+func GetBoardTable(where, typeName, nowTime string, listPtr *[]GeneBoardTable) (total int, err error) {
+	total, err = table4.Where(where).Count()
+	if err != nil {
+		return 0, err
+	}
+	//如果库里没当天 当测序类型的数据,则新建60条数据
+	if total == 0 {
+		for i := 1; i <= 8; i++ {
+			record := gdb.Map{
+				"BoardNum":      nowTime + "-" + typeName + fmt.Sprintf("%02d", i),
+				"BoardDay":      nowTime,
+				"LNum":          96,
+				"BoardTestType": typeName,
+				"CreateOn":      gtime.Now(),
+				"IsNew":         "(新板)",
+			}
+			_, errs := table4.Data(record).Save()
+			if errs != nil {
+				return 0, errs
+			}
+		}
+	}
+	where += fmt.Sprintf(" and LNum> '%d'", 0)
+	err = table4.Where(where).Scan(listPtr)
+	if err != nil {
+		return 0, err
+	}
+	return total, nil
+
+}
+
+//根据板号获取板的孔号详情
+func GetTableInfo(where string, listPtr *[]GeneBoardTableInfo) (err error) {
+	total := 0
+	total, err = table5.Where(where).Count()
+	if err != nil {
+		return err
+	}
+	//如果没有查到数据则返回一个全新的孔板
+	if total == 0 {
+		err = table6.Scan(listPtr)
+		if err != nil {
+			return err
+		}
+	} else {
+		//如果有数据则返回板数据
+		err = table5.Where(where).Scan(listPtr)
+		if err != nil {
+			return err
+		}
+
+	}
+
+	return nil
+}

+ 142 - 0
smartdoorlock_/src/dashoo.cn/smartdoorlock_api/app/service/remote_control/base_remote_control.go

@@ -0,0 +1,142 @@
+// ==========================================================================
+// This is auto-generated by gf cli tool. You may not really want to edit it.
+// ==========================================================================
+
+package remote_control
+
+import (
+
+	//"github.com/gogf/gf/os/gtime"
+	"time"
+)
+
+// Entity is the golang structure for table neo_test.
+
+//报警待发送
+type Trigger_ToSend struct {
+	Id                 int     `orm:"Id,primary"    json:"id"`
+	ProjectSourse      string  `orm:"ProjectSourse" json:"ProjectSourse"`
+	ProjectAccount     string  `orm:"ProjectSourse" json:"ProjectAccount"`
+	ProjectAccountName string  `orm:"ProjectAccountName" json:"ProjectAccountName"`
+	SendTo             string  `orm:"SendTo" json:"SendTo"`
+	ActionType         string
+	Message            string  `orm:"Message" json:"Message"`
+	DeviceId           string  `orm:"DeviceId" json:"DeviceId"`
+	DeviceName         string  `orm:"DeviceName" json:"DeviceName"`
+	ChannelCode        string  `orm:"ChannelCode" json:"ChannelCode"`
+	ChannelName        string  `orm:"ChannelName" json:"ChannelName"`
+	TriggerType        int     `orm:"TriggerType" json:"TriggerType"`
+	TriggerId          int     `orm:"TriggerId" json:"TriggerId"`
+	CreateUserId       int     `orm:"CreateUserId" json:"CreateUserId"`
+	CreateBy           string  `orm:"CreateBy" json:"CreateBy"`
+	Value              float64
+	EventFiled         string
+	AId                string
+	AName              string
+	AlarmOn            time.Time
+	Lang               string
+	CreateOn           time.Time  `orm:"CreateOn" json:"CreateOn"`
+}
+
+type TopicMessage struct {
+	Topic   string ` json:"topic"`
+	Payload  string ` json:"payload"`
+
+}
+
+//报警历史
+type Record_History struct {
+	Id                 int       `orm:"Id,primary"    json:"id"`
+	ProjectSourse      string    `orm:"ProjectSourse" json:"ProjectSourse"`
+	ProjectAccount     string    `orm:"ProjectAccount" json:"ProjectAccount"`
+	ProjectAccountName string   `orm:"ProjectAccountName" json:"ProjectAccountName"`
+	SendTo             string    `orm:"SendTo" json:"SendTo"`
+	ActionType         string   `orm:"ActionType" json:"ActionType"`
+	Message            string    `orm:"Message" json:"Message"`
+	IsRead             int       `orm:"IsRead" json:"IsRead"`
+	IsSend             int       `orm:"IsSend" json:"IsSend"`
+	SendErrorMsg       string    `orm:"SendErrorMsg" json:"SendErrorMsg"`
+	DeviceId           string    `orm:"DeviceId" json:"DeviceId"`
+	DeviceName         string    `orm:"DeviceName" json:"DeviceName"`
+	ChannelCode        string    `orm:"ChannelCode" json:"ChannelCode"`
+	ChannelName        string    `orm:"ChannelName" json:"ChannelName"`
+	CreateOn           time.Time `orm:"CreateOn" json:"CreateOn"`
+	CreateUserId       int       `orm:"CreateUserId" json:"CreateUserId"`
+	CreateBy           string    `orm:"CreateBy" json:"CreateBy"`
+	ModifiedOn         time.Time `orm:"ModifiedOn" json:"ModifiedOn"`
+	ModifiedUserId     int       `orm:"ModifiedUserId" json:"ModifiedUserId"`
+	ModifiedBy         string    `orm:"ModifiedBy" json:"ModifiedBy"`
+}
+type Personcreate struct {
+	Pass string `json:"pass"`
+	Person Person `json:"person"`
+}
+type Face struct {
+	Pass string `json:"pass"`
+	PersonId string `json:"personId"`
+	FaceId string `json:"faceId"`
+	Url string `json:"url"`
+}
+type Person struct {
+	ID string `json:"id"`
+	Name string `json:"name"`
+	IdcardNum string `json:"idcardNum"`
+	IDNumber string `json:"iDNumber"`
+	FacePermission int `json:"facePermission"`
+	IDCardPermission int `json:"idCardPermission"`
+	FaceAndCardPermission int `json:"faceAndCardPermission"`
+	IDPermission int `json:"iDPermission"`
+	Tag string `json:"tag"`
+	Phone string `json:"phone"`
+	Password string `json:"password"`
+	PasswordPermission int `json:"passwordPermission"`
+}
+//回调接收
+type CallBack struct {
+	AliveType string `json:"aliveType"`
+	Base64 string `json:"base64"`
+	Data string `json:"data"`
+	DeviceKey string `json:"deviceKey"`
+	IdcardNum string `json:"idcardNum"`
+	IdentifyType string `json:"identifyType"`
+	IP string `json:"ip"`
+	Model string `json:"model"`
+	PassTimeType string `json:"passTimeType"`
+	Path string `json:"path"`
+	PermissionTimeType string `json:"permissionTimeType"`
+	PersonID string `json:"personId"`
+	RecModeType string `json:"recModeType"`
+	RecType int `json:"recType"`
+	Time string `json:"time"`
+	Type string `json:"type"`
+}
+//返回回调
+type Result struct {
+	Result int `json:"result"`
+	Success bool `json:"success"`
+}
+//报警历史
+type Base_user struct {
+	UserName      string    `orm:"UserName" json:"UserName"`
+	Realname      string    `orm:"Realname" json:"Realname"`
+	DepartmentName string    `orm:"DepartmentName" json:"DepartmentName"`
+}
+
+type Channels struct {
+	Title               string    `orm:"Title" json:"Title"`
+	Serial              string    `orm:"Serial" json:"Serial"`
+	TagCode             string    `orm:"TagCode" json:"TagCode"`
+	Tags                string    `orm:"Tags" json:"Tags"`
+}
+
+//短信返回参数
+type ReturnSMS struct {
+	Success bool `json:"success"`
+	Info string `json:"info"`
+}
+//报警传递参数
+type TriggerSMS struct {
+	Service string `json:"service"`
+	Mobile  string `json:"mobile"`
+	Msg     string `json:"code"`
+}

+ 358 - 0
smartdoorlock_/src/dashoo.cn/smartdoorlock_api/app/service/remote_control/remote_control.go

@@ -0,0 +1,358 @@
+package remote_control
+
+import (
+	"bytes"
+	"encoding/base64"
+	"fmt"
+	mqtt "github.com/eclipse/paho.mqtt.golang"
+	"github.com/gogf/gf/os/gtime"
+	"os"
+
+	//"github.com/gogf/gf/os/gtime"
+	"io/ioutil"
+	"net/http"
+	"time"
+	//"time"
+
+	//"database/sql"
+	"encoding/json"
+	//"fmt"
+	"github.com/gogf/gf/database/gdb"
+	"github.com/gogf/gf/frame/g"
+	//"time"
+)
+
+var (
+	//报警表
+	trigger_tosend = g.DB().Table("trigger_tosend").Safe()
+	//报警历史表
+	record_history = g.DB().Table("record_history").Safe()
+	//微信用户
+	base_userweixin = g.DB().Table("base_userweixin b").Safe()
+	//用户
+	base_user = g.DB().Table("base_user").Safe()
+	//设备
+	channels = g.DB().Table("channels").Safe()
+
+)
+//创建全局mqtt publish消息处理 handler
+var messagePubHandler mqtt.MessageHandler = func(client mqtt.Client, msg mqtt.Message) {
+	fmt.Printf("Pub Client Topic : %s \n", msg.Topic())
+	fmt.Printf("Pub Client msg : %s \n", msg.Payload())
+}
+
+//连接失败数
+var failNums = 0
+func MqttSend(topic, text string)  {
+	//设置连接参数
+	clinetOptions := mqtt.NewClientOptions().AddBroker("tcp://39.98.34.197:1883").SetUsername("sg1").SetPassword("dashoopwd")
+	//设置客户端ID
+	clinetOptions.SetClientID("seedhandle0005")
+	//设置handler
+	clinetOptions.SetDefaultPublishHandler(messagePubHandler)
+	//设置连接超时
+	clinetOptions.SetConnectTimeout(time.Duration(60) * time.Second)
+	//创建客户端连接
+	client := mqtt.NewClient(clinetOptions)
+
+	if token := client.Connect(); token.WaitTimeout(time.Duration(60)*time.Second) && token.Wait() && token.Error() != nil {
+		failNums++
+		fmt.Printf("[Pub] mqtt connect error, fail_nums: %d, error: %s \n", failNums, token.Error())
+		return
+	}
+
+	//发布消息
+	token := client.Publish(topic, 0, false, "SHELL:@DO1=1@D=1@DO1=0@D=1@DI1=?")
+	fmt.Println("---token----",token)
+	token.Wait()
+	client.Disconnect(250)
+}
+
+////发送报警
+//func SmsSend(Mobile,Msg string) (body ReturnSMS) {
+//	var triggeraction TriggerSMS
+//	triggeraction.Mobile = Mobile
+//	triggeraction.Msg = Msg
+//	triggeraction.Service = "notice"
+//
+//	SmsActionUrl := "http://47.92.238.200:16082/api/sms/sendnotice"
+//	body = ApiPost(SmsActionUrl, "POST", triggeraction)
+//	return
+//}
+
+//保存报警历史
+func SaveTriggerHistory(channelcode,title,code,command,wxopenid,realname,userName,ygopenid string,issend int) error {
+
+	record := gdb.Map{
+		"ProjectSourse": "biobank",
+		"ProjectAccount": userName,
+		"ProjectAccountName": "智能锁",
+		"DataItem": 31,
+		"ChannelCode":  code,
+		"ChannelName":  channelcode,
+		"DeviceName":  title,
+		"Message":command,
+		"CreateOn": gtime.Now(),
+		"SendTo":realname,
+		"Remark": ygopenid,
+		"CausePerson": wxopenid,
+		"IsSend": issend,
+	}
+	_, err := record_history.Data(record).Save()
+	return err
+}
+
+
+//人员注册
+func PersonCreate(id string)  {
+	var person Personcreate
+	person.Pass = "12345678"
+	person.Person.ID = id
+	person.Person.Name = "臧凯1"
+	person.Person.FacePermission = 2
+	person.Person.IDCardPermission = 2
+	person.Person.FaceAndCardPermission = 2
+	person.Person.IDPermission = 2
+	person.Person.Password = "147258"
+	person.Person.PasswordPermission = 2
+	personUrl := "http://192.168.0.136:8090/person/create"
+	body := ApiPost(personUrl, "POST", person)
+	fmt.Println("_-----注册信息--",string(body))
+
+
+	return
+}
+//照片下发
+func FaceCreate(id string)  {
+	var face Face
+	face.Pass ="12345678"
+	face.PersonId = id
+	face.FaceId = "37"
+	face.Url = "http://47.92.238.200:8081/static/equipmentimg/face/zk.jpg"
+	faceUrl := "http://192.168.0.136:8090/face"
+	bodys := ApiPost(faceUrl, "POST", face)
+	fmt.Println("_-----照片下发--",string(bodys))
+	return
+}
+
+
+//访问接口
+func ApiPost(strUrl, method string, postDict interface{}) (body []byte) {
+
+	httpClient := &http.Client{
+		//Transport:nil,
+		//CheckRedirect: nil,
+		Timeout: 6 * time.Second,
+	}
+
+	var httpReq *http.Request
+
+	b, _ := json.Marshal(postDict)
+	postBytesReader := bytes.NewReader(b)
+	httpReq, _ = http.NewRequest(method, strUrl, postBytesReader)
+	httpReq.Header.Add("Content-Type", "application/json")
+	response, _ := httpClient.Do(httpReq)
+	if response != nil {
+		body, _ = ioutil.ReadAll(response.Body)
+		//json.Unmarshal(body, &listPtr)
+	}
+	return body
+}
+//获取C的图片数据
+func ReadImgData(url string) []byte {
+	resp, err := http.Get(url)
+	if err != nil {
+		panic(err)
+	}
+	defer resp.Body.Close()
+	pix, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		panic(err)
+	}
+	return pix
+}
+func ImagesToBase64(str_images string) []byte {
+	//读原图片
+	ff, _ := os.Open(str_images)
+	defer ff.Close()
+	sourcebuffer := make([]byte, 500000)
+	n, _ := ff.Read(sourcebuffer)
+	//base64压缩
+	sourcestring := base64.StdEncoding.EncodeToString(sourcebuffer[:n])
+	return []byte(sourcestring)
+}
+//获取报警历史
+func GetTriggerHistory(curPage, pageSize int,listPtr *[]Record_History,where string) ( pagecount int,err error) {
+	err = record_history.OrderBy("Id desc").Limit((curPage-1)*pageSize, pageSize).Where(where).Scan(listPtr)
+	pagecount, _= record_history.Where(where).Count()
+	if err != nil {
+		return  0,err
+	}
+	return  pagecount,nil
+}
+
+//获取用户名
+func GetBase_username(id string, listPtr *Base_user) (err error) {
+	err = base_userweixin.InnerJoin("base_user a", "a.Id = b.UserId").Fields("a.UserName,a.Realname,a.DepartmentName").Where("b.WeixinCode = ?", id).Scan(listPtr)
+	if err != nil {
+		return  err
+	}
+	return  nil
+}
+//获取设备名称
+func GetChannelsname(code string, listPtr *Channels) (err error) {
+
+	err = channels.Fields("Title,Serial,TagCode,Tags").Where("Serial = ?", code).Scan(listPtr)
+	if err != nil {
+		return  err
+	}
+	return  nil
+}
+
+//获取设备名称
+func GetChannelsnamebycode(code string, listPtr *Channels) (err error) {
+
+	err = channels.Fields("Title,Serial,TagCode,Tags").Where("Serial = ?", code).Scan(listPtr)
+	if err != nil {
+		return  err
+	}
+	return  nil
+}
+////查询未发送
+//func GetTriggerToSend(Id int,listPtr *Trigger_ToSend) (err error) {
+//	err = bank_box.Where("ShelfId =" + strconv.Itoa(Id) + " and YStation =" + strconv.Itoa(YStation) + " and XStation =" + strconv.Itoa(XStation) ).Scan(listPtr)
+//	if err != nil {
+//		return err
+//	}
+//	return nil
+//}
+
+////获取单个设备
+//func GetIntById(id int, listPtr *Trigger_History) (err error) {
+//	err = table_instrument.Where("Id =" + strconv.Itoa(id)).Scan(listPtr)
+//	if err != nil {
+//		return err
+//	}
+//	return nil
+//}
+
+
+
+
+//
+////获取入库详情样本信息
+//func GetbankApplyDetailbyMainId(ids string, order string, curPage, pageSize int,listPtr *[]Bank_Apply_Detail) (err error) {
+//	where := "b.ParentId in ( "+ ids +")"
+//	err = table_bank_apply_detail.InnerJoin("bank_apply_main a", "a.Id = b.ParentId").Fields("a.EntryNo,b.*,c.SourceName, c.Name").LeftJoin("Bank_Sample c", "c.BarCode = b.BarCode").Where(where).OrderBy(order).Limit((curPage-1)*pageSize, pageSize).Scan(listPtr)
+//	if err != nil {
+//		return  err
+//	}
+//	return  nil
+//}
+//
+//
+////获取维修保养
+//func GetmaintainlogbyInstrumenId(id,TypeCode int, order string, curPage, pageSize int,listPtr *[]InstrumenMaintainLog) (err error) {
+//	err = table_instrumenmaintainlog.Where("InstrumenId =" + strconv.Itoa(id) + " and TypeCode =" + strconv.Itoa(TypeCode)).OrderBy(order).Limit((curPage-1)*pageSize, pageSize).Scan(listPtr)
+//	if err != nil {
+//		return err
+//	}
+//	return nil
+//}
+//
+////获取设备管理曲线报表
+//func GetbyCode(id string,listPtr *AutoGenerated) (err error) {
+//	client := &http.Client{}
+//	nowtm := time.Now().Unix()
+//	beforetime := strconv.FormatInt(nowtm - 3*24*60*60,10)
+//	nowtime := strconv.FormatInt(nowtm,10)
+//	strUrl := "http://47.92.238.200:18010/v1/channels/c"+ id +"/datapoints?start="+ beforetime +"&end=" + nowtime
+//
+//	req, err := http.NewRequest("GET", strUrl,nil)
+//	req.Header.Add("Content-Type", "application/json")
+//	req.Header.Add("apikey", "301c6bbe78b07cfd07376794f64c6bf6")
+//	resp, err := client.Do(req)
+//
+//	fmt.Println("resp= ", resp)
+//	if resp != nil {
+//		defer resp.Body.Close()
+//	}
+//	jsonBlob, _ := ioutil.ReadAll(resp.Body)
+//	json.Unmarshal(jsonBlob, &listPtr)
+//	if err != nil {
+//		return err
+//	}
+//	return nil
+//}
+//
+////获取历史数据
+//func GetTriggerHistory(listPtr *TriggerhistoryData) (err error) {
+//	client := &http.Client{}
+//	nowtm := time.Now().Unix()
+//	beforetime := strconv.FormatInt(nowtm - 30*24*60*60,10)
+//	nowtime := strconv.FormatInt(nowtm,10)
+//	strUrl := "http://47.92.238.200:10015/v1/triggerhistorys?u=seedplatform&p=seed@platformDASHOO.cn&source=coldchain&account=1368&ccode=-1,c52002839&start="+beforetime+"&end="+nowtime+"&page=1&itemsPerPage=10"
+//
+//	req, err := http.NewRequest("GET", strUrl,nil)
+//	req.Header.Add("Content-Type", "application/json")
+//	resp, err := client.Do(req)
+//
+//	fmt.Println("resp= ", resp)
+//	if resp != nil {
+//		defer resp.Body.Close()
+//	}
+//	jsonBlob, _ := ioutil.ReadAll(resp.Body)
+//	json.Unmarshal(jsonBlob, &listPtr)
+//
+//	if err != nil {
+//		return err
+//	}
+//	return nil
+//}
+//
+//
+////获取冻存架信息
+//func GetbankEquipmentlist(id int,listPtr *Bank_Equipment) (err error) {
+//	err = bank_equipment.Where("Id =" + strconv.Itoa(id)).Scan(listPtr)
+//	if err != nil {
+//		return err
+//	}
+//	return nil
+//}
+//
+////获取冻存盒
+//func GetbanksShelf(id int,listPtr *[]Bank_Shelf) (err error) {
+//	err = bank_shelf.Where("EquipmentId =" + strconv.Itoa(id)).Scan(listPtr)
+//	if err != nil {
+//		return err
+//	}
+//	return nil
+//}
+//
+////获取样本占用情况
+//func GetbankSample(id int,listPtr *[]Bank_Sample) (err error) {
+//	err = bank_sample.Where("EquipmentId =" + strconv.Itoa(id)).Scan(listPtr)
+//	if err != nil {
+//		return err
+//	}
+//	return nil
+//}
+//
+//
+////获取整盘扫描位置
+//func Getbankbankbox(Id,YStation,XStation int,listPtr *Bank_Box) (err error) {
+//	err = bank_box.Where("ShelfId =" + strconv.Itoa(Id) + " and YStation =" + strconv.Itoa(YStation) + " and XStation =" + strconv.Itoa(XStation) ).Scan(listPtr)
+//	if err != nil {
+//		return err
+//	}
+//	return nil
+//}
+//
+////获取冻存盒
+//func GetbankshelfColumnNum(id ,XStation,YStation int,listPtr *Bank_Shelf) (err error) {
+//	err = bank_shelf.Where("EquipmentId =" + strconv.Itoa(id) + " and XStation = "+ strconv.Itoa(XStation) + " and YStation = "+ strconv.Itoa(YStation) ).Scan(listPtr)
+//	if err != nil {
+//		return err
+//	}
+//	return nil
+//}

+ 75 - 0
smartdoorlock_/src/dashoo.cn/smartdoorlock_api/app/service/role/base_role.go

@@ -0,0 +1,75 @@
+// This is auto-generated by gf cli tool. You may not really want to edit it.
+
+package role
+
+import (
+	"database/sql"
+	"github.com/gogf/gf/database/gdb"
+	"github.com/gogf/gf/frame/g"
+)
+
+import (
+	"github.com/gogf/gf/os/gtime"
+)
+
+// BaseRole is the golang structure for table base_role.
+type BaseRole struct {
+	Id                int         `orm:"Id,primary"        json:"id"`
+	AccCode           string      `orm:"AccCode"           json:"acc_code"`
+	SystemId          string      `orm:"SystemId"          json:"system_id"`
+	OrganizeId        int         `orm:"OrganizeId"        json:"organize_id"`
+	Code              string      `orm:"Code"              json:"code"`
+	Realname          string      `orm:"Realname"          json:"realname"`
+	Category          string      `orm:"Category"          json:"category"`
+	AllowEdit         int         `orm:"AllowEdit"         json:"allow_edit"`
+	AllowDelete       int         `orm:"AllowDelete"       json:"allow_delete"`
+	SortCode          int         `orm:"SortCode"          json:"sort_code"`
+	DeletionStateCode int         `orm:"DeletionStateCode" json:"deletion_state_code"`
+	Enabled           int         `orm:"Enabled"           json:"enabled"`
+	IsVisible         int         `orm:"IsVisible"         json:"is_visible"`
+	Description       string      `orm:"Description"       json:"description"`
+	CreateOn          *gtime.Time `orm:"CreateOn"          json:"create_on"`
+	CreateUserId      string      `orm:"CreateUserId"      json:"create_user_id"`
+	CreateBy          string      `orm:"CreateBy"          json:"create_by"`
+	ModifiedOn        *gtime.Time `orm:"ModifiedOn"        json:"modified_on"`
+	ModifiedUserId    string      `orm:"ModifiedUserId"    json:"modified_user_id"`
+	ModifiedBy        string      `orm:"ModifiedBy"        json:"modified_by"`
+}
+
+var (
+	// TableBaseRole is the table name of base_role.
+	TableBaseRole = "base_role"
+	// ModelBaseRole is the model object of base_role.
+	ModelBaseRole = g.DB("default").Table(TableBaseRole).Safe()
+)
+
+// Inserts does "INSERT...INTO..." statement for inserting current object into table.
+func (r *BaseRole) Insert() (result sql.Result, err error) {
+	return ModelBaseRole.Data(r).Insert()
+}
+
+// Replace does "REPLACE...INTO..." statement for inserting current object into table.
+// If there's already another same record in the table (it checks using primary key or unique index),
+// it deletes it and insert this one.
+func (r *BaseRole) Replace() (result sql.Result, err error) {
+	return ModelBaseRole.Data(r).Replace()
+}
+
+// Save does "INSERT...INTO..." statement for inserting/updating current object into table.
+// It updates the record if there's already another same record in the table
+// (it checks using primary key or unique index).
+func (r *BaseRole) Save() (result sql.Result, err error) {
+	return ModelBaseRole.Data(r).Save()
+}
+
+// Update does "UPDATE...WHERE..." statement for updating current object from table.
+// It updates the record if there's already another same record in the table
+// (it checks using primary key or unique index).
+func (r *BaseRole) Update() (result sql.Result, err error) {
+	return ModelBaseRole.Data(r).Where(gdb.GetWhereConditionOfStruct(r)).Update()
+}
+
+// Delete does "DELETE FROM...WHERE..." statement for deleting current object from table.
+func (r *BaseRole) Delete() (result sql.Result, err error) {
+	return ModelBaseRole.Where(gdb.GetWhereConditionOfStruct(r)).Delete()
+}

+ 13 - 0
smartdoorlock_/src/dashoo.cn/smartdoorlock_api/app/service/role/role.go

@@ -0,0 +1,13 @@
+package role
+
+func GetList(where, order string, curPage, pageSize int, listPtr *[]BaseRole) (total int, err error) {
+	err = ModelBaseRole.Where(where).OrderBy(order).Limit((curPage-1)*pageSize, pageSize).Scan(listPtr)
+	if err != nil {
+		return 0, err
+	}
+	total, err = ModelBaseRole.Where(where).Count()
+	if err != nil {
+		return 0, err
+	}
+	return total, nil
+}

+ 121 - 0
smartdoorlock_/src/dashoo.cn/smartdoorlock_api/app/service/user/base_user.go

@@ -0,0 +1,121 @@
+// This is auto-generated by gf cli tool. You may not really want to edit it.
+
+package user
+
+import (
+	"database/sql"
+	"github.com/gogf/gf/database/gdb"
+	"github.com/gogf/gf/frame/g"
+)
+
+import (
+	"github.com/gogf/gf/os/gtime"
+)
+
+// BaseUser is the golang structure for table base_user.
+type BaseUser struct {
+	Id                    int         `orm:"Id,primary"            json:"id"`
+	AccCode               string      `orm:"AccCode"               json:"acc_code"`
+	Code                  string      `orm:"Code"                  json:"code"`
+	UserName              string      `orm:"UserName"              json:"user_name"`
+	Realname              string      `orm:"Realname"              json:"realname"`
+	RoleId                int         `orm:"RoleId"                json:"role_id"`
+	SecurityLevel         int         `orm:"SecurityLevel"         json:"security_level"`
+	UserFrom              string      `orm:"UserFrom"              json:"user_from"`
+	CompanyId             string      `orm:"CompanyId"             json:"company_id"`
+	CompanyName           string      `orm:"CompanyName"           json:"company_name"`
+	DepartmentId          string      `orm:"DepartmentId"          json:"department_id"`
+	DepartmentName        string      `orm:"DepartmentName"        json:"department_name"`
+	WorkgroupId           string      `orm:"WorkgroupId"           json:"workgroup_id"`
+	WorkgroupName         string      `orm:"WorkgroupName"         json:"workgroup_name"`
+	WorkCategory          string      `orm:"WorkCategory"          json:"work_category"`
+	Duty                  string      `orm:"Duty"                  json:"duty"`
+	Title                 string      `orm:"Title"                 json:"title"`
+	Gender                string      `orm:"Gender"                json:"gender"`
+	Birthday              string      `orm:"Birthday"              json:"birthday"`
+	Mobile                string      `orm:"Mobile"                json:"mobile"`
+	Telephone             string      `orm:"Telephone"             json:"telephone"`
+	Email                 string      `orm:"Email"                 json:"email"`
+	OICQ                  string      `orm:"OICQ"                  json:"oicq"`
+	HomeAddress           string      `orm:"HomeAddress"           json:"home_address"`
+	UserPassword          string      `orm:"UserPassword"          json:"user_password"`
+	ChangePasswordDate    *gtime.Time `orm:"ChangePasswordDate"    json:"change_password_date"`
+	CommunicationPassword string      `orm:"CommunicationPassword" json:"communication_password"`
+	PublicKey             string      `orm:"PublicKey"             json:"public_key"`
+	SignedPassword        string      `orm:"SignedPassword"        json:"signed_password"`
+	Lang                  string      `orm:"Lang"                  json:"lang"`
+	Theme                 string      `orm:"Theme"                 json:"theme"`
+	AllowStartTime        *gtime.Time `orm:"AllowStartTime"        json:"allow_start_time"`
+	AllowEndTime          *gtime.Time `orm:"AllowEndTime"          json:"allow_end_time"`
+	LockStartDate         *gtime.Time `orm:"LockStartDate"         json:"lock_start_date"`
+	LockEndDate           *gtime.Time `orm:"LockEndDate"           json:"lock_end_date"`
+	FirstVisit            *gtime.Time `orm:"FirstVisit"            json:"first_visit"`
+	PreviousVisit         *gtime.Time `orm:"PreviousVisit"         json:"previous_visit"`
+	LastVisit             *gtime.Time `orm:"LastVisit"             json:"last_visit"`
+	LogOnCount            int         `orm:"LogOnCount"            json:"log_on_count"`
+	IsStaff               int         `orm:"IsStaff"               json:"is_staff"`
+	UserOnLine            int         `orm:"UserOnLine"            json:"user_on_line"`
+	IsVisible             int         `orm:"IsVisible"             json:"is_visible"`
+	OpenId                string      `orm:"OpenId"                json:"open_id"`
+	IPAddress             string      `orm:"IPAddress"             json:"ip_address"`
+	MACAddress            string      `orm:"MACAddress"            json:"mac_address"`
+	Question              string      `orm:"Question"              json:"question"`
+	AnswerQuestion        string      `orm:"AnswerQuestion"        json:"answer_question"`
+	UserAddressId         int         `orm:"UserAddressId"         json:"user_address_id"`
+	Enabled               int         `orm:"Enabled"               json:"enabled"`
+	AuditStatus           int         `orm:"AuditStatus"           json:"audit_status"`
+	DeletionStateCode     int         `orm:"DeletionStateCode"     json:"deletion_state_code"`
+	SortCode              int         `orm:"SortCode"              json:"sort_code"`
+	Description           string      `orm:"Description"           json:"description"`
+	CreateOn              *gtime.Time `orm:"CreateOn"              json:"create_on"`
+	CreateUserId          string      `orm:"CreateUserId"          json:"create_user_id"`
+	CreateBy              string      `orm:"CreateBy"              json:"create_by"`
+	ModifiedOn            *gtime.Time `orm:"ModifiedOn"            json:"modified_on"`
+	ModifiedUserId        string      `orm:"ModifiedUserId"        json:"modified_user_id"`
+	ModifiedBy            string      `orm:"ModifiedBy"            json:"modified_by"`
+	Photo                 string      `orm:"Photo"                 json:"photo"`
+	QRCode                string      `orm:"QRCode"                json:"qr_code"`
+	//QRCodeImage           []byte      `orm:"QRCodeImage"           json:"qr_code_image"`
+	IsCompanyUser int    `orm:"IsCompanyUser"         json:"is_company_user"`
+	Superior      string `orm:"Superior"              json:"superior"`
+	UnitId        int    `orm:"UnitId"                json:"unit_id"`
+	Unit          string `orm:"Unit"                  json:"unit"`
+}
+
+var (
+	// TableBaseUser is the table name of base_user.
+	TableBaseUser = "base_user"
+	// ModelBaseUser is the model object of base_user.
+	ModelBaseUser = g.DB("default").Table(TableBaseUser).Safe()
+)
+
+// Inserts does "INSERT...INTO..." statement for inserting current object into table.
+func (r *BaseUser) Insert() (result sql.Result, err error) {
+	return ModelBaseUser.Data(r).Insert()
+}
+
+// Replace does "REPLACE...INTO..." statement for inserting current object into table.
+// If there's already another same record in the table (it checks using primary key or unique index),
+// it deletes it and insert this one.
+func (r *BaseUser) Replace() (result sql.Result, err error) {
+	return ModelBaseUser.Data(r).Replace()
+}
+
+// Save does "INSERT...INTO..." statement for inserting/updating current object into table.
+// It updates the record if there's already another same record in the table
+// (it checks using primary key or unique index).
+func (r *BaseUser) Save() (result sql.Result, err error) {
+	return ModelBaseUser.Data(r).Save()
+}
+
+// Update does "UPDATE...WHERE..." statement for updating current object from table.
+// It updates the record if there's already another same record in the table
+// (it checks using primary key or unique index).
+func (r *BaseUser) Update() (result sql.Result, err error) {
+	return ModelBaseUser.Data(r).Where(gdb.GetWhereConditionOfStruct(r)).Update()
+}
+
+// Delete does "DELETE FROM...WHERE..." statement for deleting current object from table.
+func (r *BaseUser) Delete() (result sql.Result, err error) {
+	return ModelBaseUser.Where(gdb.GetWhereConditionOfStruct(r)).Delete()
+}

+ 79 - 0
smartdoorlock_/src/dashoo.cn/smartdoorlock_api/app/service/user/user.go

@@ -0,0 +1,79 @@
+package user
+
+import (
+	"dashoo.cn/micro_libary/utils"
+	"database/sql"
+	"errors"
+	"github.com/gogf/gf/database/gdb"
+	"github.com/gogf/gf/frame/g"
+	"github.com/gogf/gf/os/glog"
+)
+
+const (
+	USER_SESSION_MARK = "user_info"
+)
+
+var (
+	// 表对象
+	table = g.DB().Table("base_user").Safe()
+)
+
+func SiTest(username, password string) error {
+	glog.Info("567")
+	return nil
+}
+
+// 用户登录,成功返回用户信息,否则返回nil;
+func SignIn(username, password string) (string, error) {
+
+	record, err := table.Where("username=?", username).One()
+
+	if err != nil && err != sql.ErrNoRows {
+		return "", err
+	}
+	if record == nil {
+		return "", errors.New("账号或密码错误")
+	}
+	g.Dump(record)
+
+	encodedPwd := record["UserPassword"].String()
+
+	pubKey := record["PublicKey"].String()
+
+	p, err := utils.TripleDesDecrypt(encodedPwd, pubKey)
+	if err != nil {
+		return "", err
+	}
+
+	if password == p {
+		return record["Uuid"].String(), nil
+	} else {
+		return "", errors.New("账号或密码错误")
+	}
+
+	//session.Set(USER_SESSION_MARK, record)
+	//return nil
+}
+
+func GetUserByUserName(username string, theUser *BaseUser) error {
+	err := table.Where("username=?", username).Scan(theUser)
+	//g.Dump(theUser)
+	if err != nil && err != sql.ErrNoRows {
+		return err
+	}
+	return nil
+}
+
+func UpdateUser(id int, theUser *BaseUser) error {
+	record := gdb.Map{
+		"CompanyName": theUser.CompanyName,
+		"Realname":    theUser.Realname,
+		"Email":       theUser.Email,
+		"Mobile":      theUser.Mobile,
+		"Telephone":   theUser.Telephone,
+		"Description": theUser.Description,
+	}
+
+	_, err := table.Data(record).Where("Id", id).Update()
+	return err
+}

+ 31 - 0
smartdoorlock_/src/dashoo.cn/smartdoorlock_api/app/service/user/user_test.go

@@ -0,0 +1,31 @@
+package user
+
+import (
+	"database/sql"
+	"fmt"
+	"testing"
+
+	"github.com/gogf/gf/frame/g"
+)
+
+func init() {
+	//g.DB()
+}
+
+func Test_Trim(t *testing.T) {
+	//theUser := (*User)(nil)
+	theUser := (*BaseUser)(nil)
+	err := g.DB().Table("base_user").Where("username=?", "demo08").Scan(&theUser)
+	if err != nil && err != sql.ErrNoRows {
+		fmt.Println(err)
+	}
+	if theUser != nil {
+		fmt.Println("name:", theUser.UserName)
+		fmt.Println("ID:", theUser.Id)
+	}
+
+	//Case(t, func() {
+	//	Assert(gstr.Trim(" 123456\n "), "123456")
+	//	Assert(gstr.Trim("#123456#;", "#;"), "123456")
+	//})
+}

+ 0 - 0
smartdoorlock_/src/dashoo.cn/smartdoorlock_api/boot/.gitkeep


+ 25 - 0
smartdoorlock_/src/dashoo.cn/smartdoorlock_api/boot/boot.go

@@ -0,0 +1,25 @@
+package boot
+
+import (
+    "github.com/gogf/gf/frame/g"
+    "github.com/gogf/gf/net/ghttp"
+    "github.com/gogf/gf/os/glog"
+)
+
+func init() {
+    c := g.Config()
+    s := g.Server()
+    s.SetNameToUriType(ghttp.URI_TYPE_ALLLOWER) //URI全部小写
+
+    // 日志模块配置
+    logpath := c.GetString("setting.logpath")
+    glog.SetPath(logpath)
+    glog.SetStdoutPrint(true)
+
+    // Web Server配置
+    s.SetLogPath(logpath)
+    s.SetErrorLogEnabled(true)
+    s.SetAccessLogEnabled(true)
+    s.SetPort(c.GetInt("setting.http-port"))
+}
+

+ 0 - 0
smartdoorlock_/src/dashoo.cn/smartdoorlock_api/config/.gitkeep


+ 46 - 0
smartdoorlock_/src/dashoo.cn/smartdoorlock_api/config/config.toml

@@ -0,0 +1,46 @@
+# 应用系统设置
+[setting]
+    http-port   = 12001
+    logpath = "/tmp/log/smart_emt"
+
+[service_registry]
+    registry = "etcd"
+    server = "39.98.34.197"
+    port = "12379"
+
+# token认证设置
+[gtoken]
+    # 缓存模式 1 gcache 2 gredis
+    cache-mode = 1
+    # 是否支持多端登录
+    multi-login = true
+    # 必须16,24或32个字母
+    encrypt-key = "jwtdashoo-191225"
+
+# 数据库连接
+[database]
+    [[database.default]]
+        Debug = true
+        link = "mysql:mcs_user:X6T1pa5o1AgO@tcp(rm-8vbk16zx2rbfu6jt6uo.mysql.zhangbei.rds.aliyuncs.com)/mcs_db"
+#link = "mysql:mcs_user:X6T1pa5o1AgO@tcp(47.92.249.239:3306)/mcs_db"
+# Redis数据库配置
+[redis]
+    default = "127.0.0.1:16379,0,soccer"
+    cache   = "127.0.0.1:16379,1,soccer?idleTimeout=600"
+
+[micro_srv]
+    auth = "dashoo.labsop.srv.auth-prod-1.0"
+    admin = "dashoo.labsop.srv.admin-prod-1.0"
+
+[owner]
+    name = "Tom Preston-Werner"
+    organization = "GitHub"
+    bio = "GitHub Cofounder & CEO\nLikes tater tots and beer."
+    dob = 1979-05-27T07:32:00Z # First class dates? Why not?
+
+[mqttconfig]
+    clientid = "seedhandle003"
+    username = "sg1"
+    password = "dashoopwd"
+    serveraddr = "tcp://39.98.34.197:1883"
+    topic = "seed/sg04"

+ 0 - 0
smartdoorlock_/src/dashoo.cn/smartdoorlock_api/docfile/.gitkeep


+ 17 - 0
smartdoorlock_/src/dashoo.cn/smartdoorlock_api/go.mod

@@ -0,0 +1,17 @@
+module dashoo.cn/smartdoorlock_api
+
+go 1.12
+
+require (
+	dashoo.cn/common_proto v0.0.0
+	dashoo.cn/micro_libary v0.0.0
+	github.com/BurntSushi/toml v0.3.1
+	github.com/eclipse/paho.mqtt.golang v1.2.0
+	github.com/gogf/gf v1.14.2
+	github.com/micro/go-micro/v2 v2.5.1-0.20200417165434-16db76bee2fb
+	golang.org/x/sys v0.0.0-20200331124033-c3d80250170d // indirect
+)
+
+replace dashoo.cn/micro_libary => ../../../../micro_libary
+
+replace dashoo.cn/common_proto => ../../../../micro_common_proto/src

+ 0 - 0
smartdoorlock_/src/dashoo.cn/smartdoorlock_api/i18n/.gitkeep


+ 355 - 0
smartdoorlock_/src/dashoo.cn/smartdoorlock_api/library/gtoken/gtoken.go

@@ -0,0 +1,355 @@
+package gtoken
+
+import (
+	"context"
+	"dashoo.cn/micro_libary/microsrv"
+	"fmt"
+	"strings"
+
+	auth "dashoo.cn/common_proto/auth"
+	"dashoo.cn/smartdoorlock_api/app/service/user"
+	"github.com/gogf/gf/encoding/gjson"
+	"github.com/gogf/gf/frame/g"
+	"github.com/gogf/gf/net/ghttp"
+	"github.com/gogf/gf/os/glog"
+	"github.com/gogf/gf/os/gtime"
+	"github.com/gogf/gf/util/gconv"
+)
+
+var authClient auth.AuthService
+
+func init() {
+	authSvrName, theClient := microsrv.GetMicroConfig("micro_srv.auth")
+	authClient = auth.NewAuthService(authSvrName, theClient)
+}
+
+// GfToken gtoken结构体
+type GfToken struct {
+	// 认证失败中文提示
+	AuthFailMsg string
+
+	// 登录路径
+	LoginPath string
+	// 登录验证方法 return userKey 用户标识 如果userKey为空,结束执行
+	LoginBeforeFunc func(r *ghttp.Request) (string, string, interface{})
+	// 登录返回方法
+	LoginAfterFunc func(r *ghttp.Request, respData Resp)
+	// 登出地址
+	LogoutPath string
+	// 登出验证方法 return true 继续执行,否则结束执行
+	LogoutBeforeFunc func(r *ghttp.Request) bool
+	// 登出返回方法
+	LogoutAfterFunc func(r *ghttp.Request, respData Resp)
+
+	// 拦截地址
+	AuthPaths g.SliceStr
+	// 认证验证方法 return true 继续执行,否则结束执行
+	AuthBeforeFunc func(r *ghttp.Request) bool
+	// 认证返回方法
+	AuthAfterFunc func(r *ghttp.Request, respData Resp)
+}
+
+// Init 初始化
+func (m *GfToken) Init() bool {
+	if m.AuthFailMsg == "" {
+		m.AuthFailMsg = "请求错误或登录超时"
+	}
+
+	if m.LoginAfterFunc == nil {
+		m.LoginAfterFunc = func(r *ghttp.Request, respData Resp) {
+			if !respData.Success() {
+				r.Response.WriteJson(respData)
+			} else {
+				json, err := gjson.DecodeToJson(respData.Data)
+				if err != nil {
+					r.Response.WriteJson(Unauthorized("sys fail", ""))
+					return
+				}
+				r.Response.WriteJson(Succ(json))
+			}
+		}
+	}
+
+	if m.LogoutBeforeFunc == nil {
+		m.LogoutBeforeFunc = func(r *ghttp.Request) bool {
+			return true
+		}
+	}
+
+	if m.LogoutAfterFunc == nil {
+		m.LogoutAfterFunc = func(r *ghttp.Request, respData Resp) {
+			if respData.Success() {
+				r.Response.WriteJson(Succ("Logout success"))
+			} else {
+				r.Response.WriteJson(respData)
+			}
+		}
+	}
+
+	if m.AuthBeforeFunc == nil {
+		m.AuthBeforeFunc = func(r *ghttp.Request) bool {
+			// 静态页面不拦截
+			if r.IsFileRequest() {
+				return false
+			}
+
+			return true
+		}
+	}
+	if m.AuthAfterFunc == nil {
+		m.AuthAfterFunc = func(r *ghttp.Request, respData Resp) {
+			if respData.Success() {
+				r.Middleware.Next()
+			} else {
+				var params map[string]interface{}
+				if r.Method == "GET" {
+					params = r.GetMap()
+				} else if r.Method == "POST" {
+					params = r.GetMap()
+				} else {
+					r.Response.Writeln("Request Method is ERROR! ")
+					return
+				}
+
+				no := gconv.String(gtime.TimestampMilli())
+
+				glog.Info(fmt.Sprintf("[AUTH_%s][url:%s][params:%s][data:%s]",
+					no, r.URL.Path, params, respData.Json()))
+				respData.Msg = m.AuthFailMsg
+				r.Response.WriteStatus(401)
+				r.Response.WriteJson(respData)
+				r.ExitAll()
+			}
+		}
+	}
+
+	return true
+}
+
+// Start 启动
+func (m *GfToken) Start() bool {
+	if !m.Init() {
+		return false
+	}
+	glog.Info("[GToken][params:" + m.String() + "]start... ")
+
+	s := g.Server()
+
+	// 认证拦截器
+	if m.AuthPaths == nil {
+		glog.Error("[GToken]HookPathList not set")
+		return false
+	}
+	for _, authPath := range m.AuthPaths {
+		if strings.HasSuffix(authPath, "/*") {
+			s.BindMiddleware(authPath, m.AuthMiddleware)
+		} else {
+			s.BindMiddleware(authPath+"/*", m.AuthMiddleware)
+		}
+	}
+
+	// 登录
+	if m.LoginPath == "" || m.LoginBeforeFunc == nil {
+		glog.Error("[GToken]LoginPath or LoginBeforeFunc not set")
+		return false
+	}
+	s.BindHandler(m.LoginPath, m.Login)
+
+	// 登出
+	if m.LogoutPath == "" {
+		glog.Error("[GToken]LogoutPath or LogoutFunc not set")
+		return false
+	}
+	s.BindHandler(m.LogoutPath, m.Logout)
+
+	return true
+}
+
+// Start 结束
+func (m *GfToken) Stop() bool {
+	glog.Info("[GToken]stop. ")
+	return true
+}
+
+//// GetTokenData 通过token获取对象
+//func (m *GfToken) GetTokenData(r *ghttp.Request) Resp {
+//	respData := m.getRequestToken(r)
+//	if respData.Success() {
+//		// 验证token
+//		respData = m.ValidToken(respData.DataString())
+//	}
+//
+//	return respData
+//}
+
+// 获取或建立Token
+func (m *GfToken) GetOrGenToken(tenant, userKey, uuid string, resp *Resp) error {
+	rsp, err := authClient.GetToken(context.TODO(), &auth.Request{
+		Tenant:  tenant,
+		UserKey: userKey,
+		Uuid:    uuid,
+		Data:    "",
+	})
+	if err != nil {
+		glog.Error(err)
+		return err
+	}
+
+	if err := gconv.Struct(rsp, resp); err != nil {
+		glog.Error(err)
+		return err
+	}
+	return nil
+}
+
+// 删除Token
+func (m *GfToken) RemoveToken(token string, resp *Resp) error {
+	rsp, err := authClient.RemoveToken(context.TODO(), &auth.ReqToken{
+		Token: token,
+	})
+	if err != nil {
+		return err
+	}
+	if err := gconv.Struct(rsp, resp); err != nil {
+		return err
+	}
+	return nil
+}
+
+// Login 登录
+func (m *GfToken) Login(r *ghttp.Request) {
+	//userKey, data := m.LoginBeforeFunc(r)
+	// todo 暂时不考虑data
+	userKey, uuid, _ := m.LoginBeforeFunc(r)
+	tenant := r.Header.Get("Tenant")
+	//tenant := g.Config().GetString("gtoken.tenant")
+	if userKey == "" {
+		glog.Error("[GToken]Login userKey is empty")
+		return
+	}
+	if tenant == "" {
+		glog.Error("[GToken]Login tenant is empty")
+		return
+	}
+	if uuid == "" {
+		glog.Error("[GToken]Login uuid is empty")
+		return
+	}
+	respToken := new(Resp)
+	err := m.GetOrGenToken(tenant, userKey, uuid, respToken)
+	if err != nil {
+		return
+	}
+
+	m.LoginAfterFunc(r, *respToken)
+}
+
+// Logout 登出
+func (m *GfToken) Logout(r *ghttp.Request) {
+	if m.LogoutBeforeFunc(r) {
+		// 获取请求token
+		respData := m.getRequestToken(r)
+		if respData.Success() {
+			// 删除token
+			respToken := new(Resp)
+			err := m.RemoveToken(respData.DataString(), respToken)
+			if err != nil {
+				glog.Error(err)
+				return
+			}
+		}
+
+		m.LogoutAfterFunc(r, respData)
+	}
+}
+
+// AuthMiddleware 认证拦截
+func (m *GfToken) AuthMiddleware(r *ghttp.Request) {
+	// 不需要认证,直接下一步
+	if !m.AuthBeforeFunc(r) {
+		r.Middleware.Next()
+		return
+	}
+
+	// 获取请求token
+	tokenResp := m.getRequestToken(r)
+	if tokenResp.Success() {
+		// 验证token
+		tokenResp = m.ValidToken(tokenResp.DataString())
+		// 查询user信息并放入r中
+		theuser := new(user.BaseUser)
+		username := ""
+		if j, err := gjson.DecodeToJson([]byte(tokenResp.DataString())); err != nil {
+			glog.Error(err)
+		} else {
+			j.SetViolenceCheck(true)
+			username = j.GetString("userKey")
+		}
+		user.GetUserByUserName(username, theuser)
+		r.SetParam("username", theuser.UserName)
+		r.SetParam("userid", theuser.Id)
+		r.SetParam("realname", theuser.Realname)
+	}
+	m.AuthAfterFunc(r, tokenResp)
+
+}
+
+// getRequestToken 返回请求Token
+func (m *GfToken) getRequestToken(r *ghttp.Request) Resp {
+	authHeader := r.Header.Get("Authorization")
+	if authHeader != "" {
+		parts := strings.SplitN(authHeader, " ", 2)
+		if !(len(parts) == 2 && parts[0] == "Bearer") {
+			glog.Warning("[GToken]authHeader:" + authHeader + " get token key fail")
+			return Unauthorized("get token key fail", "")
+		} else if parts[1] == "" {
+			glog.Warning("[GToken]authHeader:" + authHeader + " get token fail")
+			return Unauthorized("get token fail", "")
+		}
+
+		return Succ(parts[1])
+	}
+
+	authHeader = r.GetString("token")
+	if authHeader == "" {
+		return Unauthorized("query token fail", "")
+	}
+	return Succ(authHeader)
+}
+
+// validToken 验证Token
+func (m *GfToken) ValidToken(token string) Resp {
+	if token == "" {
+		return Unauthorized("valid token empty", "")
+	}
+
+	respToken := new(Resp)
+	rsp, err := authClient.ValidToken(context.TODO(), &auth.ReqToken{
+		Token: token,
+	})
+	if err != nil {
+		glog.Error(err)
+		return Unauthorized("auth service error", "")
+	}
+
+	if err := gconv.Struct(rsp, respToken); err != nil {
+		glog.Error(err)
+		return Unauthorized("auth service error", "")
+	}
+	return *respToken
+}
+
+// String token解密方法
+func (m *GfToken) String() string {
+	return gconv.String(g.Map{
+		// 缓存模式 1 gcache 2 gredis 默认1
+		//"CacheMode":      m.CacheMode,
+		//"CacheKey":       m.CacheKey,
+		//"Timeout":        m.Timeout,
+		//"TokenDelimiter": m.TokenDelimiter,
+		//"EncryptKey":     string(m.EncryptKey),
+		"LoginPath":  m.LoginPath,
+		"LogoutPath": m.LogoutPath,
+		"AuthPaths":  gconv.String(m.AuthPaths),
+	})
+}

+ 92 - 0
smartdoorlock_/src/dashoo.cn/smartdoorlock_api/library/gtoken/gtoken_resp.go

@@ -0,0 +1,92 @@
+package gtoken
+
+import (
+	"encoding/json"
+	"github.com/gogf/gf/util/gconv"
+)
+
+const (
+	SUCCESS      = 0
+	FAIL         = -1
+	ERROR        = -99
+	UNAUTHORIZED = -401
+	//配置
+	TypeConfig = 1
+	//  字典
+	TypeDict = 2
+)
+
+type Resp struct {
+	Code int         `json:"code"`
+	Msg  string      `json:"msg"`
+	Data interface{} `json:"data"`
+}
+
+// 获取Data值转字符串
+func (resp Resp) Success() bool {
+	return resp.Code == SUCCESS
+}
+
+// 获取Data转字符串
+func (resp Resp) DataString() string {
+	return gconv.String(resp.Data)
+}
+
+// 获取Data转Int
+func (resp Resp) DataInt() int {
+	return gconv.Int(resp.Data)
+}
+
+// 获取Data值转字符串
+func (resp Resp) GetString(key string) string {
+	return gconv.String(resp.Get(key))
+}
+
+// 获取Data值转Int
+func (resp Resp) GetInt(key string) int {
+	return gconv.Int(resp.Get(key))
+}
+
+// 获取Data值
+func (resp Resp) Get(key string) interface{} {
+	m := gconv.Map(resp.Data)
+	if m == nil {
+		return ""
+	}
+	return m[key]
+}
+
+func (resp Resp) Json() string {
+	str, _ := json.Marshal(resp)
+	return string(str)
+}
+
+// 成功
+func Succ(data interface{}) Resp {
+	return Resp{SUCCESS, "success", data}
+}
+
+// 失败
+func Fail(msg string) Resp {
+	return Resp{FAIL, msg, ""}
+}
+
+// 失败设置Data
+func FailData(msg string, data interface{}) Resp {
+	return Resp{FAIL, msg, data}
+}
+
+// 错误
+func Error(msg string) Resp {
+	return Resp{ERROR, msg, ""}
+}
+
+// 错误设置Data
+func ErrorData(msg string, data interface{}) Resp {
+	return Resp{ERROR, msg, data}
+}
+
+// 认证失败
+func Unauthorized(msg string, data interface{}) Resp {
+	return Resp{UNAUTHORIZED, msg, data}
+}

+ 56 - 0
smartdoorlock_/src/dashoo.cn/smartdoorlock_api/library/gtoken/gtoken_test.go

@@ -0,0 +1,56 @@
+package gtoken_test
+
+import (
+	"dashoo.cn/smartdoorlock_api/library/gtoken"
+	"github.com/gogf/gf/encoding/gjson"
+	"testing"
+)
+
+func TestEncryptDecryptToken(t *testing.T) {
+	t.Log("encrypt and decrypt token test ")
+	gfToken := gtoken.GfToken{}
+	gfToken.Init()
+
+	userKey := "123123"
+
+	respToken := new(gtoken.Resp)
+	err := gfToken.GetOrGenToken(userKey, respToken)
+	if err != nil {
+		t.Log(err)
+	}
+	t.Log(respToken)
+
+	j, err := gjson.DecodeToJson(respToken.Data)
+	if err != nil {
+		t.Error(err)
+	}
+
+	//token := respToken.GetString("token")
+	token := j.GetString("token")
+	t.Log(token)
+
+	//s, _:=gbase64.Decode([]byte(token))
+	//token = string(s)
+	//t.Log(token)
+	resp := gfToken.ValidToken(token)
+	t.Log(resp)
+
+	//token := gfToken.EncryptToken(userKey, "")
+	//if !token.Success() {
+	//	t.Error(token.Json())
+	//}
+	//t.Log(token.DataString())
+	//
+	//token2 := gfToken.DecryptToken(token.GetString("token"))
+	//if !token2.Success() {
+	//	t.Error(token2.Json())
+	//}
+	//t.Log(token2.DataString())
+	//if userKey != token2.GetString("userKey") {
+	//	t.Error("token decrypt userKey error")
+	//}
+	//if token.GetString("uuid") != token2.GetString("uuid") {
+	//	t.Error("token decrypt uuid error")
+	//}
+
+}

+ 12 - 0
smartdoorlock_/src/dashoo.cn/smartdoorlock_api/main.go

@@ -0,0 +1,12 @@
+package main
+
+import (
+	"github.com/gogf/gf/frame/g"
+
+	_ "dashoo.cn/smartdoorlock_api/boot"
+	_ "dashoo.cn/smartdoorlock_api/router"
+)
+
+func main() {
+	g.Server().Run()
+}

+ 0 - 0
smartdoorlock_/src/dashoo.cn/smartdoorlock_api/public/html/.gitkeep


+ 0 - 0
smartdoorlock_/src/dashoo.cn/smartdoorlock_api/public/plugin/.gitkeep


+ 0 - 0
smartdoorlock_/src/dashoo.cn/smartdoorlock_api/public/resource/css/.gitkeep


+ 0 - 0
smartdoorlock_/src/dashoo.cn/smartdoorlock_api/public/resource/image/.gitkeep


+ 0 - 0
smartdoorlock_/src/dashoo.cn/smartdoorlock_api/public/resource/js/.gitkeep


+ 0 - 0
smartdoorlock_/src/dashoo.cn/smartdoorlock_api/router/.gitkeep


+ 80 - 0
smartdoorlock_/src/dashoo.cn/smartdoorlock_api/router/router.go

@@ -0,0 +1,80 @@
+package router
+
+import (
+	"dashoo.cn/smartdoorlock_api/app/api/remote_control"
+	"github.com/gogf/gf/frame/g"
+	"github.com/gogf/gf/net/ghttp"
+)
+
+// 测试用
+type Task struct{}
+
+func (c *Task) Add(r *ghttp.Request) {
+	r.Response.Writeln("Add")
+}
+
+func (c *Task) Task(r *ghttp.Request) {
+	r.Response.Writeln("Task")
+}
+
+// 统一路由注册.
+func init() {
+	s := g.Server()
+	//s.BindHookHandler("/login", ghttp.HOOK_BEFORE_SERVE, CorsHookHandler)
+	//s.BindHookHandler("/logout", ghttp.HOOK_BEFORE_SERVE, CorsHookHandler)
+
+	//s.BindHandler("ALL:/login", auth.GfJWTMiddleware.LoginHandler)
+	s.Group("/api").Bind([]ghttp.GroupItem{
+		{"ALL", "*", CorsHookHandler, ghttp.HOOK_BEFORE_SERVE},
+		//{"MIDDLEWARE", "*", MiddlewareCORS},
+		//{"ALL", "/user", new(user.Controller)},
+		//{"ALL", "/role", new(role.Controller)},
+		//{"ALL", "/neo", new(neo.Controller)},
+		{"ALL", "/remote_control", new(remote_control.Controller)},
+		//{"ALL", "/task", new(Task)},
+		//{"ALL", "/permission", new(permission.Controller)},
+		//{"ALL", "/organize", new(organize.Controller)},
+		//{"ALL", "/menu", new(menu.Controller)},
+	})
+
+	//var u user.Controller
+
+	// 开启全局soken服务
+	//loginFunc := user.SiTest
+
+	//loginFunc := user.SignIn
+	//
+	//gfToken := &gtoken.GfToken{
+	//	LoginPath:       "/login",
+	//	LoginBeforeFunc: loginFunc,
+	//	LogoutPath:      "/logout",
+	//	AuthPaths:       g.SliceStr{"/api"},
+	//}
+	//gfToken.Start()
+}
+
+// 实现权限校验
+// 通过事件回调,类似于中间件机制,但是可控制的粒度更细,可以精准注册到路由规则
+func AuthHookHandler(r *ghttp.Request) {
+	r.Response.CORSDefault() // 处理跨域
+	//auth.GfJWTMiddleware.MiddlewareFunc()(r) // 认证
+	// 如果权限校验失败,调用 r.ExitAll() 退出执行流程
+}
+
+func CorsHookHandler(r *ghttp.Request) {
+	//r.Response.CORSDefault()
+	var CORSOptions = ghttp.CORSOptions{
+		AllowOrigin:      "*",
+		AllowMethods:     ghttp.HTTP_METHODS,
+		AllowCredentials: "true",
+		AllowHeaders:     "Origin,Content-Type,Accept,User-Agent,Cookie,Authorization,X-Auth-Token,X-Requested-With,Tenant",
+		MaxAge:           3628800,
+	}
+	r.Response.CORS(CORSOptions) // 处理跨域
+}
+
+// CORS跨域请求的处理
+func MiddlewareCORS(r *ghttp.Request) {
+	r.Response.CORSDefault()
+	r.Middleware.Next()
+}

+ 0 - 0
smartdoorlock_/src/dashoo.cn/smartdoorlock_api/template/.gitkeep