You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

160 lines
5.0 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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
}