package Dao import ( "dsData/Utils/ConfigUtil" "dsData/Utils/DbUtil" "dsData/Utils/EsUtil" "dsData/Utils/RedisUtil" "fmt" "github.com/oklog/ulid" "github.com/sirupsen/logrus" "math/rand" "strings" "time" ) //一些常量,描述是哪种行为 var TOKEN = "token" //获取授权票据 var SHARE = "share" //获取数据 var COLLECT = "collect" //上报数据 var DATATYPE = "datatype" //获取数据类型 /** 功能:记录第三方系统的使用日志 作者:黄海 时间:2020-03-23 */ func writeLog(clientId string, actionCode string, parameter string, success int) { sql := "insert into t_join_system_access_log(client_id,action_code,parameter,success) values(?,?,?,?)" _, err := DbUtil.Engine.SQL(sql, clientId, actionCode, parameter, success).Execute() if err != nil { l := logrus.WithField("topic", ConfigUtil.KafkaManualLogTopic) l.Info("写入第三方系统的访问日志失败!" + err.Error()) return } } /** 功能:输入第三方接入系统的系统ID和密码,返回是否登录成功,如果成功返回token 作者:黄海 时间:2020-03-23 */ func Token(id string, secret string) (bool, string, string) { //1、去数据库中检查是不是正确 sql := "select system_name from t_join_system where id=? and secret=?" list, err := DbUtil.Engine.QueryString(sql, id, secret) if err != nil { return false, "查询数据库时失败!", "" } if len(list) == 0 { writeLog(id, TOKEN, fmt.Sprintf(`{"id":"%s","secret":"%s","token":"%s"}`, id, secret, ""), 0) return false, "用户名或密码错误!", "" } //第三方系统名称 systemName := list[0]["system_name"] //2、如果正确,生成一个token,并记录到redis中,设置好有效时间 t := time.Now().UTC() entropy := rand.New(rand.NewSource(t.UnixNano())) sk := ulid.MustNew(ulid.Timestamp(t), entropy) token := strings.ToLower(sk.String()) //3、将token保存到redis中 ,以token为 key, hash形式,标识哪个系统,哪个名称 m := make(map[string]interface{}) m["id"] = id m["system_name"] = systemName key := ConfigUtil.SystemTokenPrefix + ":" + token RedisUtil.HMSET(key, m) RedisUtil.EXPIRE(key, 3600*time.Second) //获取1小时后的时间 sth, _ := time.ParseDuration("1h") //4、记录生成token的行为 writeLog(id, TOKEN, fmt.Sprintf(`{"id":"%s","secret":"%s","token":"%s"}`, id, secret, token), 1) //5、返回token return true, token, time.Now().Add(sth).Format("2006-01-02 15:04:05") } /** 功能:获取可以获取的数据类型 作者:黄海 时间:2020-02-23 */ func Datatype(clientId string) []map[string]string { sql := "select datatype_code,datatype_name from t_join_share_type order by system_id,id" list, err := DbUtil.Engine.SQL(sql).QueryString() if err != nil { l := logrus.WithField("topic", ConfigUtil.KafkaManualLogTopic) l.Info("查询数据库失败:" + err.Error()) return nil } //记录访问日志 writeLog(clientId, DATATYPE, `{"type":"datatype"}`, 1) return list } /** 功能:判断输入的token是否正确 作者:黄海 时间:2020-02-23 */ func CheckToken(token string) (bool, string) { key := ConfigUtil.SystemTokenPrefix + ":" + token _map := RedisUtil.HGETALL(key) if len(_map) == 0 { return false, "" } else { return true, _map["id"].(string) } } /** 功能:判断指定的数据类型是否存在 作者:黄海 时间:2020-03-23 */ func DataTypeIsExists(dataType string, clientId string) bool { sql := `select count(1) as c from t_join_share_type where datatype_code=?` list, err := DbUtil.Engine.SQL(sql, dataType).QueryString() if err != nil { l := logrus.WithField("topic", ConfigUtil.KafkaManualLogTopic) l.Info("查询数据库失败:" + err.Error()) return false } if len(list) == 0 { //记录日志 writeLog(clientId, DATATYPE, `{"data_type":"`+dataType+`"}`, 0) return false } return true } /** 功能:获取指定页数的数据 作者:黄海 时间:2020-03-23 */ func Share(clientId string, dataType string, startTime string, pk string) (bool, string, string, string, []map[string]interface{}) { //1、订阅者的数据权限范围有哪些? //TODO //2、根据数据类型公开码,换算出对应的index名称 sql := "select index_name from t_join_share_type where datatype_code=?" list, err := DbUtil.Engine.SQL(sql, dataType).QueryString() if err != nil { l := logrus.WithField("topic", ConfigUtil.KafkaManualLogTopic) l.Info("查询数据库失败:" + err.Error()) return false, err.Error(), "", "", nil } if len(list) == 0 { l := logrus.WithField("topic", ConfigUtil.KafkaManualLogTopic) l.Info("指定的data_type不存在:" + dataType) return false, "指定的data_type不存在:" + dataType, "", "", nil } indexName := list[0]["index_name"] //3、返回在这些数据权限范围内的指定数据类型的数据(查询elasticsearch) var listResult []map[string]interface{} //查询 startTime, pk, listResult = EsUtil.QueryPage(indexName, startTime, pk) //写入日志 writeLog(clientId, SHARE, fmt.Sprintf(`{"start_time":"%s" ,"pk":"%s"}`, startTime, pk), 1) return true, "", startTime, pk, listResult }