|
|
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
|
|
|
}
|